Skip to content

Commit

Permalink
Merge pull request #15 from qonversion/release/2.1.3
Browse files Browse the repository at this point in the history
Release/2.1.3
  • Loading branch information
suriksarkisyan committed May 3, 2021
2 parents 87a725f + d826419 commit aabe332
Show file tree
Hide file tree
Showing 20 changed files with 316 additions and 32 deletions.
2 changes: 1 addition & 1 deletion Editor/QonversionDependencies.xml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<dependencies>
<androidPackages>
<androidPackage spec="com.qonversion.android.sdk:sdk:2.7.3" />
<androidPackage spec="io.qonversion.android.sdk:sdk:2.7.6" />
<androidPackage spec="com.fasterxml.jackson.core:jackson-databind:2.11.1" />
<androidPackage spec="org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.2.61" />
</androidPackages>
Expand Down
21 changes: 19 additions & 2 deletions Runtime/Android/Plugins/com/qonversion/unitywrapper/Mapper.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
import com.android.billingclient.api.SkuDetails;

import com.qonversion.android.sdk.dto.QPermission;
import com.qonversion.android.sdk.dto.eligibility.QEligibility;
import com.qonversion.android.sdk.dto.eligibility.QIntroEligibilityStatus;
import com.qonversion.android.sdk.dto.offerings.QOffering;
import com.qonversion.android.sdk.dto.offerings.QOfferings;
import com.qonversion.android.sdk.dto.products.QProduct;
Expand All @@ -17,7 +19,7 @@

public final class Mapper {

public static List<Map<String, Object>> mapPermissions(Map<String, QPermission> permissions) {
static List<Map<String, Object>> mapPermissions(Map<String, QPermission> permissions) {
List<Map<String, Object>> result = new ArrayList<>();

for (Map.Entry<String, QPermission> entry : permissions.entrySet()) {
Expand Down Expand Up @@ -124,7 +126,7 @@ static Map<String, Object> mapOfferings(QOfferings offerings) {
return result;
}

static Map<String, Object> mapOffering(QOffering offering) {
private static Map<String, Object> mapOffering(QOffering offering) {
Map<String, Object> result = new HashMap<>();
result.put("id", offering.getOfferingID());

Expand All @@ -144,4 +146,19 @@ static Map<String, Object> mapOffering(QOffering offering) {

return result;
}

static List<Map<String, Object>> mapEligibilities(Map<String, QEligibility> map) {
List<Map<String, Object>> result = new ArrayList<>();

for (Map.Entry<String, QEligibility> entry : map.entrySet()) {
Map<String, Object> mappedEligibility = new HashMap<>();
QEligibility eligibility = entry.getValue();
mappedEligibility.put("productId", entry.getKey());
mappedEligibility.put("status", eligibility.getStatus().getType());

result.add(mappedEligibility);
}

return result;
}
}
Original file line number Diff line number Diff line change
@@ -1,15 +1,19 @@
package com.qonversion.unitywrapper;

import android.app.Activity;
import android.os.AsyncTask;
import android.content.Context;
import android.content.SharedPreferences;
import android.util.Log;

import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.qonversion.android.sdk.QUserProperties;

import com.qonversion.android.sdk.QonversionEligibilityCallback;
import com.qonversion.android.sdk.QonversionOfferingsCallback;
import com.qonversion.android.sdk.QonversionProductsCallback;
import com.qonversion.android.sdk.dto.eligibility.QEligibility;
import com.qonversion.android.sdk.dto.offerings.QOfferings;
import com.qonversion.android.sdk.dto.products.QProduct;
import com.unity3d.player.UnityPlayer;
Expand All @@ -18,7 +22,6 @@

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.Executor;
import java.util.List;

import com.fasterxml.jackson.core.type.TypeReference;
Expand All @@ -32,18 +35,21 @@
import com.qonversion.android.sdk.dto.QLaunchResult;
import com.qonversion.android.sdk.dto.QPermission;

import android.os.Handler;
import androidx.preference.PreferenceManager;

public class QonversionWrapper {
public static String TAG = "QonversionWrapper";

private static String unityListenerName;

private static Executor executor;
public static synchronized void storeSdkInfo(String version, String versionKey, String source, String sourceKey) {
Context context = UnityPlayer.currentActivity.getApplicationContext();

private static final Object LOCK = new Object();

private static Handler mUnityMainThreadHandler;
SharedPreferences.Editor editor = PreferenceManager.getDefaultSharedPreferences(context).edit();
editor.putString(versionKey, version);
editor.putString(sourceKey, source);
editor.apply();
}

public static synchronized void launch(String unityListener, String projectKey, boolean observerMode) {
Log.d(TAG, "Qonversion Launch starting. Project key: " + projectKey);
Expand Down Expand Up @@ -198,6 +204,29 @@ public void onError(@NotNull QonversionError error) {
});
}

public static synchronized void checkTrialIntroEligibilityForProductIds(String productIds, String unityCallbackName) {
try {
ObjectMapper mapper = new ObjectMapper();
TypeReference<List<String>> typeRef = new TypeReference<List<String>>() {};
List<String> productIdsList = mapper.readValue(productIds, typeRef);

Qonversion.checkTrialIntroEligibilityForProductIds(productIdsList, new QonversionEligibilityCallback() {
@Override
public void onSuccess(@NotNull Map<String, QEligibility> eligibilities) {
List<Map<String, Object>> mappedEligibilities = Mapper.mapEligibilities(eligibilities);
sendMessageToUnity(mappedEligibilities, unityCallbackName);
}

@Override
public void onError(@NotNull QonversionError error) {
handleErrorResponse(error, unityCallbackName);
}
});
} catch (JsonProcessingException e) {
handleJsonProcessingException(e);
}
}

private static void handlePermissionsResponse(@NotNull Map<String, QPermission> permissions, @NotNull String methodName) {
List<Map<String, Object>> mappedPermissions = Mapper.mapPermissions(permissions);
sendMessageToUnity(mappedPermissions, methodName);
Expand Down Expand Up @@ -230,19 +259,4 @@ private static void sendMessageToUnity(@NotNull Object objectToConvert, @NotNull
private static void handleJsonProcessingException(JsonProcessingException e) {
Log.e(TAG, "An error occurred while serializing data: " + e.getLocalizedMessage());
}

private void runOnUnityThread(Runnable runnable) {
if (mUnityMainThreadHandler != null && runnable != null) {
mUnityMainThreadHandler.post(runnable);
}
}

private static Executor getExecutor() {
synchronized (LOCK) {
if (QonversionWrapper.executor == null) {
QonversionWrapper.executor = AsyncTask.THREAD_POOL_EXECUTOR;
}
}
return QonversionWrapper.executor;
}
}
10 changes: 10 additions & 0 deletions Runtime/Android/QonversionWrapperAndroid.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,11 @@ namespace QonversionUnity
{
internal class QonversionWrapperAndroid : IQonversionWrapper
{
public void StoreSdkInfo(string version, string versionKey, string source, string sourceKey)
{
CallQonversion("storeSdkInfo", version, versionKey, source, sourceKey);
}

public void Launch(string gameObjectName, string projectKey, bool observerMode)
{
CallQonversion("launch", gameObjectName, projectKey, observerMode);
Expand Down Expand Up @@ -106,6 +111,11 @@ public void Offerings(string callbackName)
CallQonversion("offerings", callbackName);
}

public void CheckTrialIntroEligibilityForProductIds(string productIdsJson, string callbackName)
{
CallQonversion("checkTrialIntroEligibilityForProductIds", productIdsJson, callbackName);
}

private const string QonversionWrapper = "com.qonversion.unitywrapper.QonversionWrapper";

private static void CallQonversion(string methodName, params object[] args)
Expand Down
9 changes: 9 additions & 0 deletions Runtime/Scripts/Constants.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
namespace QonversionUnity
{
static class Constants
{
public const string KeyPrefix = "com.qonversion.keys";
public const string SourceKey = KeyPrefix + ".source";
public const string VersionKey = KeyPrefix + ".sourceVersion";
}
}
11 changes: 11 additions & 0 deletions Runtime/Scripts/Constants.cs.meta

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions Runtime/Scripts/IQonversionWrapper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
{
internal interface IQonversionWrapper
{
void StoreSdkInfo(string version, string versionKey, string source, string sourceKey);
void SetDebugMode();
void SetAdvertisingID();
void Launch(string gameObjectName, string projectKey, bool observerMode);
Expand All @@ -16,5 +17,6 @@ internal interface IQonversionWrapper
void UpdatePurchase(string productId, string oldProductId, ProrationMode prorationMode, string callbackName);
void Products(string callbackName);
void Offerings(string callbackName);
void CheckTrialIntroEligibilityForProductIds(string productIdsJson, string callbackName);
}
}
25 changes: 23 additions & 2 deletions Runtime/Scripts/Mapper.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
using System;
using System;
using System.Collections.Generic;
using QonversionUnity.MiniJSON;
using UnityEngine;
Expand Down Expand Up @@ -55,7 +55,28 @@ internal static Offerings OfferingsFromJson(string jsonStr)

return new Offerings(offerings);
}


internal static Dictionary<string, Eligibility> EligibilitiesFromJson(string jsonStr)
{
var result = new Dictionary<string, Eligibility>();

if (!(Json.Deserialize(jsonStr) is List<object> elibilities))
{
Debug.LogError("Could not parse Eligibilities");
return result;
}

foreach (Dictionary<string, object> eligibilityDict in elibilities)
{
if (eligibilityDict.TryGetValue("productId", out object value))
{
Eligibility eligibility = new Eligibility(eligibilityDict);
result.Add(value as string, eligibility);
}
}

return result;
}

internal static QonversionError ErrorFromJson(string jsonStr)
{
Expand Down
41 changes: 41 additions & 0 deletions Runtime/Scripts/Models/Eligibility.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
using System.Collections.Generic;

namespace QonversionUnity
{
public class Eligibility
{
public readonly EligibilityStatus Status;

public Eligibility(Dictionary<string, object> dict)
{
if (dict.TryGetValue("status", out object value)) Status = FormatEligibilityStatus(value);
}

public override string ToString()
{
return $"{nameof(Status)}: {Status}";
}

private EligibilityStatus FormatEligibilityStatus(object status) {
string value = status as string;
EligibilityStatus result;
switch (value)
{
case "non_intro_or_trial_product":
result = EligibilityStatus.NonIntroProduct;
break;
case "intro_or_trial_eligible":
result = EligibilityStatus.Eligible;
break;
case "intro_or_trial_ineligible":
result = EligibilityStatus.Ineligible;
break;
default:
result = EligibilityStatus.Unknown;
break;
}

return result;
}
}
}
11 changes: 11 additions & 0 deletions Runtime/Scripts/Models/Eligibility.cs.meta

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

10 changes: 10 additions & 0 deletions Runtime/Scripts/Models/EligibilityStatus.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
namespace QonversionUnity
{
public enum EligibilityStatus
{
Unknown,
NonIntroProduct,
Ineligible,
Eligible
}
}
11 changes: 11 additions & 0 deletions Runtime/Scripts/Models/EligibilityStatus.cs.meta

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 2 additions & 3 deletions Runtime/Scripts/Models/Product.cs
Original file line number Diff line number Diff line change
Expand Up @@ -77,9 +77,8 @@ public override string ToString()

private QProductDuration FormatDuration(object duration)
{
Int32 value = Convert.ToInt32(duration);
var result = QProductDuration.Unknown;

int value = Convert.ToInt32(duration);
QProductDuration result;
switch (value)
{
case 0:
Expand Down
Loading

0 comments on commit aabe332

Please sign in to comment.