From d4d7bf54518477ad59889f121ae912a8e94d4497 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B0=D0=BD=D0=B4=D1=80=20?= =?UTF-8?q?=D0=97=D0=B0=D1=86=D0=B5=D0=BF=D0=B8=D0=BD?= Date: Tue, 18 Dec 2018 15:43:52 +0300 Subject: [PATCH] [android] Implemented subscription for starting transaction listening --- .../com/mapswithme/maps/MwmApplication.java | 10 +- .../maps/PurchaseOperationObservable.java | 96 +++++++++++++++++++ .../maps/PurchaseValidationObservable.java | 69 ------------- .../purchase/BookmarkPaymentFragment.java | 9 +- .../CoreStartTransactionObserver.java | 8 ++ .../purchase/DefaultPurchaseValidator.java | 12 +-- .../maps/purchase/PurchaseFactory.java | 8 +- 7 files changed, 125 insertions(+), 87 deletions(-) create mode 100644 android/src/com/mapswithme/maps/PurchaseOperationObservable.java delete mode 100644 android/src/com/mapswithme/maps/PurchaseValidationObservable.java create mode 100644 android/src/com/mapswithme/maps/purchase/CoreStartTransactionObserver.java diff --git a/android/src/com/mapswithme/maps/MwmApplication.java b/android/src/com/mapswithme/maps/MwmApplication.java index 1f1ab384e2..78f82a08dc 100644 --- a/android/src/com/mapswithme/maps/MwmApplication.java +++ b/android/src/com/mapswithme/maps/MwmApplication.java @@ -77,7 +77,7 @@ public class MwmApplication extends Application private ExternalLibrariesMediator mMediator; @SuppressWarnings("NullableProblems") @NonNull - private PurchaseValidationObservable mPurchaseValidationObservable; + private PurchaseOperationObservable mPurchaseOperationObservable; @SuppressWarnings("NullableProblems") @NonNull private MediaPlayerWrapper mPlayer; @@ -170,7 +170,7 @@ public class MwmApplication extends Application mConnectivityListener = new ConnectivityJobScheduler(this); mConnectivityListener.listen(); - mPurchaseValidationObservable = new PurchaseValidationObservable(); + mPurchaseOperationObservable = new PurchaseOperationObservable(); mPlayer = new MediaPlayerWrapper(this); mGeofenceRegistry = new GeofenceRegistryImpl(this); } @@ -266,7 +266,7 @@ public class MwmApplication extends Application RoutingController.get().initialize(); TrafficManager.INSTANCE.initialize(); SubwayManager.from(this).initialize(); - mPurchaseValidationObservable.initialize(); + mPurchaseOperationObservable.initialize(); mFrameworkInitialized = true; } @@ -318,9 +318,9 @@ public class MwmApplication extends Application } @NonNull - PurchaseValidationObservable getPurchaseValidationObservable() + PurchaseOperationObservable getPurchaseOperationObservable() { - return mPurchaseValidationObservable; + return mPurchaseOperationObservable; } public static void onUpgrade() diff --git a/android/src/com/mapswithme/maps/PurchaseOperationObservable.java b/android/src/com/mapswithme/maps/PurchaseOperationObservable.java new file mode 100644 index 0000000000..332c2beea5 --- /dev/null +++ b/android/src/com/mapswithme/maps/PurchaseOperationObservable.java @@ -0,0 +1,96 @@ +package com.mapswithme.maps; + +import android.content.Context; +import android.support.annotation.NonNull; +import android.util.Base64; + +import com.mapswithme.maps.purchase.CoreStartTransactionObserver; +import com.mapswithme.maps.purchase.CoreValidationObserver; +import com.mapswithme.maps.purchase.PurchaseUtils; +import com.mapswithme.maps.purchase.ValidationStatus; +import com.mapswithme.util.log.Logger; +import com.mapswithme.util.log.LoggerFactory; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class PurchaseOperationObservable implements Framework.PurchaseValidationListener, + Framework.StartTransactionListener +{ + private static final String TAG = PurchaseOperationObservable.class.getSimpleName(); + @NonNull + private final Map mValidationObservers = new HashMap<>(); + @NonNull + private final List mTransactionObservers = new ArrayList<>(); + @SuppressWarnings("NullableProblems") + @NonNull + private Logger mLogger; + + PurchaseOperationObservable() + { + // Do nothing by default. + } + + @NonNull + public static PurchaseOperationObservable from(@NonNull Context context) + { + MwmApplication application = (MwmApplication) context.getApplicationContext(); + return application.getPurchaseOperationObservable(); + } + + public void initialize() + { + mLogger = LoggerFactory.INSTANCE.getLogger(LoggerFactory.Type.BILLING); + mLogger.i(TAG, "Initializing purchase operation observable..."); + Framework.nativeSetPurchaseValidationListener(this); + Framework.nativeStartPurchaseTransactionListener(this); + } + + @Override + public void onValidatePurchase(int code, @NonNull String serverId, @NonNull String vendorId, + @NonNull String encodedPurchaseData) + { + byte[] tokenBytes = Base64.decode(encodedPurchaseData, Base64.DEFAULT); + String purchaseData = new String(tokenBytes); + String orderId = PurchaseUtils.parseOrderId(purchaseData); + CoreValidationObserver observer = mValidationObservers.get(orderId); + if (observer == null) + return; + + observer.onValidatePurchase(ValidationStatus.values()[code], serverId, vendorId, purchaseData); + } + + @Override + public void onStartTransaction(boolean success, @NonNull String serverId, @NonNull String + vendorId) + { + for(CoreStartTransactionObserver observer: mTransactionObservers) + observer.onStartTransaction(success, serverId, vendorId); + } + + public void addValidationObserver(@NonNull String orderId, @NonNull CoreValidationObserver observer) + { + mLogger.d(TAG, "Add validation observer '" + observer + "' for '" + orderId + "'"); + mValidationObservers.put(orderId, observer); + } + + public void removeValidationObserver(@NonNull String orderId) + { + mLogger.d(TAG, "Remove validation observer for '" + orderId + "'"); + mValidationObservers.remove(orderId); + } + + public void addTransactionObserver(@NonNull CoreStartTransactionObserver observer) + { + mLogger.d(TAG, "Add transaction observer '" + observer + "'"); + mTransactionObservers.add(observer); + } + + public void removeTransactionObserver(@NonNull CoreStartTransactionObserver observer) + { + mLogger.d(TAG, "Remove transaction observer '" + observer + "'"); + mTransactionObservers.remove(observer); + } +} diff --git a/android/src/com/mapswithme/maps/PurchaseValidationObservable.java b/android/src/com/mapswithme/maps/PurchaseValidationObservable.java deleted file mode 100644 index a1856f2a40..0000000000 --- a/android/src/com/mapswithme/maps/PurchaseValidationObservable.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.mapswithme.maps; - -import android.content.Context; -import android.support.annotation.NonNull; -import android.util.Base64; - -import com.mapswithme.maps.purchase.CoreValidationObserver; -import com.mapswithme.maps.purchase.PurchaseUtils; -import com.mapswithme.maps.purchase.ValidationStatus; -import com.mapswithme.util.log.Logger; -import com.mapswithme.util.log.LoggerFactory; - -import java.util.HashMap; -import java.util.Map; - -public class PurchaseValidationObservable implements Framework.PurchaseValidationListener -{ - private static final String TAG = PurchaseValidationObservable.class.getSimpleName(); - @NonNull - private final Map mObservers = new HashMap<>(); - @SuppressWarnings("NullableProblems") - @NonNull - private Logger mLogger; - - PurchaseValidationObservable() - { - // Do nothing by default. - } - - @NonNull - public static PurchaseValidationObservable from(@NonNull Context context) - { - MwmApplication application = (MwmApplication) context.getApplicationContext(); - return application.getPurchaseValidationObservable(); - } - - public void initialize() - { - mLogger = LoggerFactory.INSTANCE.getLogger(LoggerFactory.Type.BILLING); - mLogger.i(TAG, "Initializing purchase validation observable..."); - Framework.nativeSetPurchaseValidationListener(this); - } - - @Override - public void onValidatePurchase(int code, @NonNull String serverId, @NonNull String vendorId, - @NonNull String encodedPurchaseData) - { - byte[] tokenBytes = Base64.decode(encodedPurchaseData, Base64.DEFAULT); - String purchaseData = new String(tokenBytes); - String orderId = PurchaseUtils.parseOrderId(purchaseData); - CoreValidationObserver observer = mObservers.get(orderId); - if (observer == null) - return; - - observer.onValidatePurchase(ValidationStatus.values()[code], serverId, vendorId, purchaseData); - } - - public void addObserver(@NonNull String orderId, @NonNull CoreValidationObserver observer) - { - mLogger.d(TAG, "Add validation observer '" + observer + "' for '" + orderId + "'"); - mObservers.put(orderId, observer); - } - - public void removeObserver(@NonNull String orderId) - { - mLogger.d(TAG, "Remove validation observer for '" + orderId + "'"); - mObservers.remove(orderId); - } -} diff --git a/android/src/com/mapswithme/maps/purchase/BookmarkPaymentFragment.java b/android/src/com/mapswithme/maps/purchase/BookmarkPaymentFragment.java index e7e25a859b..7377083c90 100644 --- a/android/src/com/mapswithme/maps/purchase/BookmarkPaymentFragment.java +++ b/android/src/com/mapswithme/maps/purchase/BookmarkPaymentFragment.java @@ -16,6 +16,7 @@ import com.android.billingclient.api.SkuDetails; import com.bumptech.glide.Glide; import com.mapswithme.maps.Framework; import com.mapswithme.maps.PrivateVariables; +import com.mapswithme.maps.PurchaseOperationObservable; import com.mapswithme.maps.R; import com.mapswithme.maps.base.BaseMwmFragment; import com.mapswithme.maps.base.Detachable; @@ -165,7 +166,8 @@ public class BookmarkPaymentFragment extends BaseMwmFragment public void onStart() { super.onStart(); - Framework.nativeStartPurchaseTransactionListener(mPurchaseCallback); + PurchaseOperationObservable observable = PurchaseOperationObservable.from(getContext()); + observable.addTransactionObserver(mPurchaseCallback); mPurchaseController.addCallback(mPurchaseCallback); mPurchaseCallback.attach(this); } @@ -174,7 +176,8 @@ public class BookmarkPaymentFragment extends BaseMwmFragment public void onStop() { super.onStop(); - Framework.nativeStartPurchaseTransactionListener(null); + PurchaseOperationObservable observable = PurchaseOperationObservable.from(getContext()); + observable.removeTransactionObserver(mPurchaseCallback); mPurchaseController.removeCallback(); mPurchaseCallback.detach(); } @@ -286,7 +289,7 @@ public class BookmarkPaymentFragment extends BaseMwmFragment private static class BookmarkPurchaseCallback extends StatefulPurchaseCallback - implements PurchaseCallback, Detachable, Framework.StartTransactionListener + implements PurchaseCallback, Detachable, CoreStartTransactionObserver { @Nullable private List mPendingDetails; diff --git a/android/src/com/mapswithme/maps/purchase/CoreStartTransactionObserver.java b/android/src/com/mapswithme/maps/purchase/CoreStartTransactionObserver.java new file mode 100644 index 0000000000..f00d57e6d4 --- /dev/null +++ b/android/src/com/mapswithme/maps/purchase/CoreStartTransactionObserver.java @@ -0,0 +1,8 @@ +package com.mapswithme.maps.purchase; + +import android.support.annotation.NonNull; + +public interface CoreStartTransactionObserver +{ + void onStartTransaction(boolean success, @NonNull String serverId, @NonNull String vendorId); +} diff --git a/android/src/com/mapswithme/maps/purchase/DefaultPurchaseValidator.java b/android/src/com/mapswithme/maps/purchase/DefaultPurchaseValidator.java index e829bf6ba7..dba4cf8658 100644 --- a/android/src/com/mapswithme/maps/purchase/DefaultPurchaseValidator.java +++ b/android/src/com/mapswithme/maps/purchase/DefaultPurchaseValidator.java @@ -5,7 +5,7 @@ import android.support.annotation.Nullable; import android.util.Base64; import com.mapswithme.maps.Framework; -import com.mapswithme.maps.PurchaseValidationObservable; +import com.mapswithme.maps.PurchaseOperationObservable; import com.mapswithme.util.log.Logger; import com.mapswithme.util.log.LoggerFactory; @@ -17,11 +17,11 @@ class DefaultPurchaseValidator implements PurchaseValidator, @Nullable private ValidationCallback mCallback; @NonNull - private final PurchaseValidationObservable mValidationObservable; + private final PurchaseOperationObservable mOperationObservable; - DefaultPurchaseValidator(@NonNull PurchaseValidationObservable validationObservable) + DefaultPurchaseValidator(@NonNull PurchaseOperationObservable validationObservable) { - mValidationObservable = validationObservable; + mOperationObservable = validationObservable; } @Override @@ -29,7 +29,7 @@ class DefaultPurchaseValidator implements PurchaseValidator, @NonNull String purchaseData) { String orderId = PurchaseUtils.parseOrderId(purchaseData); - mValidationObservable.addObserver(orderId, this); + mOperationObservable.addValidationObserver(orderId, this); String encodedPurchaseData = Base64.encodeToString(purchaseData.getBytes(), Base64.DEFAULT); Framework.nativeValidatePurchase(serverId == null ? "" : serverId, vendor, encodedPurchaseData); } @@ -52,7 +52,7 @@ class DefaultPurchaseValidator implements PurchaseValidator, { LOGGER.i(TAG, "Validation code: " + status); String orderId = PurchaseUtils.parseOrderId(purchaseData); - mValidationObservable.removeObserver(orderId); + mOperationObservable.removeValidationObserver(orderId); if (mCallback != null) mCallback.onValidate(purchaseData, status); } diff --git a/android/src/com/mapswithme/maps/purchase/PurchaseFactory.java b/android/src/com/mapswithme/maps/purchase/PurchaseFactory.java index 63eb2d46bd..4bcf67a8cc 100644 --- a/android/src/com/mapswithme/maps/purchase/PurchaseFactory.java +++ b/android/src/com/mapswithme/maps/purchase/PurchaseFactory.java @@ -6,7 +6,7 @@ import android.support.annotation.Nullable; import com.android.billingclient.api.BillingClient; import com.mapswithme.maps.PrivateVariables; -import com.mapswithme.maps.PurchaseValidationObservable; +import com.mapswithme.maps.PurchaseOperationObservable; import com.mapswithme.util.Utils; public class PurchaseFactory @@ -22,7 +22,7 @@ public class PurchaseFactory { BillingManager billingManager = new PlayStoreBillingManager(BillingClient.SkuType.SUBS); - PurchaseValidationObservable observable = PurchaseValidationObservable.from(context); + PurchaseOperationObservable observable = PurchaseOperationObservable.from(context); PurchaseValidator validator = new DefaultPurchaseValidator(observable); String yearlyProduct = PrivateVariables.adsRemovalYearlyProductId(); String monthlyProduct = PrivateVariables.adsRemovalMonthlyProductId(); @@ -38,7 +38,7 @@ public class PurchaseFactory { BillingManager billingManager = new PlayStoreBillingManager(BillingClient.SkuType.INAPP); - PurchaseValidationObservable observable = PurchaseValidationObservable.from(context); + PurchaseOperationObservable observable = PurchaseOperationObservable.from(context); PurchaseValidator validator = new DefaultPurchaseValidator(observable); return new BookmarkPurchaseController(validator, billingManager, productId, serverId); } @@ -56,7 +56,7 @@ public class PurchaseFactory { BillingManager billingManager = new PlayStoreBillingManager(BillingClient.SkuType.INAPP); - PurchaseValidationObservable observable = PurchaseValidationObservable.from(context); + PurchaseOperationObservable observable = PurchaseOperationObservable.from(context); PurchaseValidator validator = new DefaultPurchaseValidator(observable); return new FailedBookmarkPurchaseController(validator, billingManager); }