[android] Implemented subscription for starting transaction listening

This commit is contained in:
Александр Зацепин 2018-12-18 15:43:52 +03:00 committed by Vladimir Byko-Ianko
parent 7ca5d2a992
commit d4d7bf5451
7 changed files with 125 additions and 87 deletions

View file

@ -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()

View file

@ -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);
}
}

View file

@ -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);
}
}

View file

@ -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;

View file

@ -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);
}

View file

@ -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);
}

View file

@ -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);
}