diff --git a/android/src/com/mapswithme/maps/PurchaseValidationObservable.java b/android/src/com/mapswithme/maps/PurchaseValidationObservable.java index ccf518b4bb..a1856f2a40 100644 --- a/android/src/com/mapswithme/maps/PurchaseValidationObservable.java +++ b/android/src/com/mapswithme/maps/PurchaseValidationObservable.java @@ -2,8 +2,10 @@ 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; @@ -43,22 +45,25 @@ public class PurchaseValidationObservable implements Framework.PurchaseValidatio public void onValidatePurchase(int code, @NonNull String serverId, @NonNull String vendorId, @NonNull String encodedPurchaseData) { - CoreValidationObserver observer = mObservers.get(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, encodedPurchaseData); + observer.onValidatePurchase(ValidationStatus.values()[code], serverId, vendorId, purchaseData); } - public void addObserver(@NonNull String encodedPurchaseData, @NonNull CoreValidationObserver observer) + public void addObserver(@NonNull String orderId, @NonNull CoreValidationObserver observer) { - mLogger.d(TAG, "Add validation observer: " + observer); - mObservers.put(encodedPurchaseData, observer); + mLogger.d(TAG, "Add validation observer '" + observer + "' for '" + orderId + "'"); + mObservers.put(orderId, observer); } - public void removeObserver(@NonNull String encodedPurchaseData, @NonNull CoreValidationObserver observer) + public void removeObserver(@NonNull String orderId) { - mLogger.d(TAG, "Remove validation observer: " + observer); - mObservers.remove(encodedPurchaseData); + mLogger.d(TAG, "Remove validation observer for '" + orderId + "'"); + mObservers.remove(orderId); } } diff --git a/android/src/com/mapswithme/maps/purchase/DefaultPurchaseValidator.java b/android/src/com/mapswithme/maps/purchase/DefaultPurchaseValidator.java index fb70f724fd..e829bf6ba7 100644 --- a/android/src/com/mapswithme/maps/purchase/DefaultPurchaseValidator.java +++ b/android/src/com/mapswithme/maps/purchase/DefaultPurchaseValidator.java @@ -28,8 +28,9 @@ class DefaultPurchaseValidator implements PurchaseValidator, public void validate(@Nullable String serverId, @NonNull String vendor, @NonNull String purchaseData) { + String orderId = PurchaseUtils.parseOrderId(purchaseData); + mValidationObservable.addObserver(orderId, this); String encodedPurchaseData = Base64.encodeToString(purchaseData.getBytes(), Base64.DEFAULT); - mValidationObservable.addObserver(encodedPurchaseData, this); Framework.nativeValidatePurchase(serverId == null ? "" : serverId, vendor, encodedPurchaseData); } @@ -47,14 +48,12 @@ class DefaultPurchaseValidator implements PurchaseValidator, @Override public void onValidatePurchase(@NonNull ValidationStatus status, @NonNull String serverId, - @NonNull String vendorId, @NonNull String encodedPurchaseData) + @NonNull String vendorId, @NonNull String purchaseData) { LOGGER.i(TAG, "Validation code: " + status); - mValidationObservable.removeObserver(encodedPurchaseData, this); + String orderId = PurchaseUtils.parseOrderId(purchaseData); + mValidationObservable.removeObserver(orderId); if (mCallback != null) - { - byte[] tokenBytes = Base64.decode(encodedPurchaseData, Base64.DEFAULT); - mCallback.onValidate(new String(tokenBytes), status); - } + mCallback.onValidate(purchaseData, status); } } diff --git a/android/src/com/mapswithme/maps/purchase/PurchaseUtils.java b/android/src/com/mapswithme/maps/purchase/PurchaseUtils.java index 4cc8eaf786..f164aa483c 100644 --- a/android/src/com/mapswithme/maps/purchase/PurchaseUtils.java +++ b/android/src/com/mapswithme/maps/purchase/PurchaseUtils.java @@ -6,7 +6,7 @@ import com.android.billingclient.api.Purchase; import com.android.billingclient.api.SkuDetails; import org.json.JSONException; -class PurchaseUtils +public class PurchaseUtils { private PurchaseUtils() { @@ -26,6 +26,19 @@ class PurchaseUtils } } + @NonNull + public static String parseOrderId(@NonNull String purchaseData) + { + try + { + return new Purchase(purchaseData, null).getOrderId(); + } + catch (JSONException e) + { + throw new IllegalArgumentException("Failed to parse purchase order id!"); + } + } + @NonNull static ProductDetails toProductDetails(@NonNull SkuDetails skuDetails) {