forked from organicmaps/organicmaps
[android] Implemented subscription for starting transaction listening
This commit is contained in:
parent
7ca5d2a992
commit
d4d7bf5451
7 changed files with 125 additions and 87 deletions
|
@ -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()
|
||||
|
|
|
@ -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<String, CoreValidationObserver> mValidationObservers = new HashMap<>();
|
||||
@NonNull
|
||||
private final List<CoreStartTransactionObserver> 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);
|
||||
}
|
||||
}
|
|
@ -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<String, CoreValidationObserver> 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);
|
||||
}
|
||||
}
|
|
@ -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<BookmarkPaymentState, BookmarkPaymentFragment>
|
||||
implements PurchaseCallback, Detachable<BookmarkPaymentFragment>, Framework.StartTransactionListener
|
||||
implements PurchaseCallback, Detachable<BookmarkPaymentFragment>, CoreStartTransactionObserver
|
||||
{
|
||||
@Nullable
|
||||
private List<SkuDetails> mPendingDetails;
|
||||
|
|
|
@ -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);
|
||||
}
|
|
@ -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<ValidationCallback>,
|
|||
@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<ValidationCallback>,
|
|||
@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<ValidationCallback>,
|
|||
{
|
||||
LOGGER.i(TAG, "Validation code: " + status);
|
||||
String orderId = PurchaseUtils.parseOrderId(purchaseData);
|
||||
mValidationObservable.removeObserver(orderId);
|
||||
mOperationObservable.removeValidationObserver(orderId);
|
||||
if (mCallback != null)
|
||||
mCallback.onValidate(purchaseData, status);
|
||||
}
|
||||
|
|
|
@ -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<PlayStoreBillingCallback> billingManager
|
||||
= new PlayStoreBillingManager(BillingClient.SkuType.SUBS);
|
||||
PurchaseValidationObservable observable = PurchaseValidationObservable.from(context);
|
||||
PurchaseOperationObservable observable = PurchaseOperationObservable.from(context);
|
||||
PurchaseValidator<ValidationCallback> validator = new DefaultPurchaseValidator(observable);
|
||||
String yearlyProduct = PrivateVariables.adsRemovalYearlyProductId();
|
||||
String monthlyProduct = PrivateVariables.adsRemovalMonthlyProductId();
|
||||
|
@ -38,7 +38,7 @@ public class PurchaseFactory
|
|||
{
|
||||
BillingManager<PlayStoreBillingCallback> billingManager
|
||||
= new PlayStoreBillingManager(BillingClient.SkuType.INAPP);
|
||||
PurchaseValidationObservable observable = PurchaseValidationObservable.from(context);
|
||||
PurchaseOperationObservable observable = PurchaseOperationObservable.from(context);
|
||||
PurchaseValidator<ValidationCallback> validator = new DefaultPurchaseValidator(observable);
|
||||
return new BookmarkPurchaseController(validator, billingManager, productId, serverId);
|
||||
}
|
||||
|
@ -56,7 +56,7 @@ public class PurchaseFactory
|
|||
{
|
||||
BillingManager<PlayStoreBillingCallback> billingManager
|
||||
= new PlayStoreBillingManager(BillingClient.SkuType.INAPP);
|
||||
PurchaseValidationObservable observable = PurchaseValidationObservable.from(context);
|
||||
PurchaseOperationObservable observable = PurchaseOperationObservable.from(context);
|
||||
PurchaseValidator<ValidationCallback> validator = new DefaultPurchaseValidator(observable);
|
||||
return new FailedBookmarkPurchaseController(validator, billingManager);
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue