diff --git a/android/src/com/mapswithme/maps/purchase/DefaultSkuDetailsValidationStrategy.java b/android/src/com/mapswithme/maps/purchase/DefaultSkuDetailsValidationStrategy.java new file mode 100644 index 0000000000..89aec10ab3 --- /dev/null +++ b/android/src/com/mapswithme/maps/purchase/DefaultSkuDetailsValidationStrategy.java @@ -0,0 +1,16 @@ +package com.mapswithme.maps.purchase; + +import android.support.annotation.Nullable; + +import com.android.billingclient.api.SkuDetails; + +import java.util.List; + +public class DefaultSkuDetailsValidationStrategy implements SkuDetailsValidationStrategy +{ + @Override + public boolean isValid(@Nullable List skuDetails) + { + return skuDetails != null && !skuDetails.isEmpty(); + } +} diff --git a/android/src/com/mapswithme/maps/purchase/PlayStoreBillingManager.java b/android/src/com/mapswithme/maps/purchase/PlayStoreBillingManager.java index f04d02420b..49bfc79de6 100644 --- a/android/src/com/mapswithme/maps/purchase/PlayStoreBillingManager.java +++ b/android/src/com/mapswithme/maps/purchase/PlayStoreBillingManager.java @@ -29,15 +29,19 @@ class PlayStoreBillingManager implements BillingManager mPendingRequests = new ArrayList<>(); - PlayStoreBillingManager(@NonNull @BillingClient.SkuType String productType) + PlayStoreBillingManager(@NonNull @BillingClient.SkuType String productType, + @NonNull SkuDetailsValidationStrategy strategy) { mProductType = productType; + mSkuDetailsValidationStrategy = strategy; } @Override @@ -62,7 +66,8 @@ class PlayStoreBillingManager implements BillingManager productIds) { executeBillingRequest(new QueryProductDetailsRequest(getClientOrThrow(), mProductType, - mCallback, productIds)); + mCallback, productIds, + mSkuDetailsValidationStrategy)); } @Override diff --git a/android/src/com/mapswithme/maps/purchase/PurchaseFactory.java b/android/src/com/mapswithme/maps/purchase/PurchaseFactory.java index 63eb2d46bd..8b79f01e0d 100644 --- a/android/src/com/mapswithme/maps/purchase/PurchaseFactory.java +++ b/android/src/com/mapswithme/maps/purchase/PurchaseFactory.java @@ -21,7 +21,8 @@ public class PurchaseFactory @NonNull Context context) { BillingManager billingManager - = new PlayStoreBillingManager(BillingClient.SkuType.SUBS); + = new PlayStoreBillingManager(BillingClient.SkuType.SUBS, + new SubscriptionSkuDetailsValidationStrategy()); PurchaseValidationObservable observable = PurchaseValidationObservable.from(context); PurchaseValidator validator = new DefaultPurchaseValidator(observable); String yearlyProduct = PrivateVariables.adsRemovalYearlyProductId(); @@ -37,7 +38,8 @@ public class PurchaseFactory @NonNull Context context, @Nullable String productId, @Nullable String serverId) { BillingManager billingManager - = new PlayStoreBillingManager(BillingClient.SkuType.INAPP); + = new PlayStoreBillingManager(BillingClient.SkuType.INAPP, + new DefaultSkuDetailsValidationStrategy()); PurchaseValidationObservable observable = PurchaseValidationObservable.from(context); PurchaseValidator validator = new DefaultPurchaseValidator(observable); return new BookmarkPurchaseController(validator, billingManager, productId, serverId); @@ -55,7 +57,8 @@ public class PurchaseFactory @NonNull Context context) { BillingManager billingManager - = new PlayStoreBillingManager(BillingClient.SkuType.INAPP); + = new PlayStoreBillingManager(BillingClient.SkuType.INAPP, + new DefaultSkuDetailsValidationStrategy()); PurchaseValidationObservable observable = PurchaseValidationObservable.from(context); PurchaseValidator validator = new DefaultPurchaseValidator(observable); return new FailedBookmarkPurchaseController(validator, billingManager); diff --git a/android/src/com/mapswithme/maps/purchase/SkuDetailsValidationStrategy.java b/android/src/com/mapswithme/maps/purchase/SkuDetailsValidationStrategy.java new file mode 100644 index 0000000000..22de967c82 --- /dev/null +++ b/android/src/com/mapswithme/maps/purchase/SkuDetailsValidationStrategy.java @@ -0,0 +1,12 @@ +package com.mapswithme.maps.purchase; + +import android.support.annotation.Nullable; + +import com.android.billingclient.api.SkuDetails; + +import java.util.List; + +public interface SkuDetailsValidationStrategy +{ + boolean isValid(@Nullable List skuDetails); +} diff --git a/android/src/com/mapswithme/maps/purchase/SubscriptionSkuDetailsValidationStrategy.java b/android/src/com/mapswithme/maps/purchase/SubscriptionSkuDetailsValidationStrategy.java new file mode 100644 index 0000000000..69ef53e00f --- /dev/null +++ b/android/src/com/mapswithme/maps/purchase/SubscriptionSkuDetailsValidationStrategy.java @@ -0,0 +1,39 @@ +package com.mapswithme.maps.purchase; + +import android.support.annotation.Nullable; + +import com.android.billingclient.api.SkuDetails; +import com.mapswithme.util.CrashlyticsUtils; + +import java.util.List; + +import static com.mapswithme.maps.purchase.PlayStoreBillingManager.LOGGER; +import static com.mapswithme.maps.purchase.PlayStoreBillingManager.TAG; + +public class SubscriptionSkuDetailsValidationStrategy extends DefaultSkuDetailsValidationStrategy +{ + @Override + public boolean isValid(@Nullable List skuDetails) + { + boolean hasDetails = super.isValid(skuDetails); + return hasDetails && !hasIncorrectSkuDetails(skuDetails) ; + } + + private static boolean hasIncorrectSkuDetails(@Nullable List skuDetails) + { + if (skuDetails == null) + return true; + + for (SkuDetails each : skuDetails) + { + if (AdsRemovalPurchaseDialog.Period.getInstance(each.getSubscriptionPeriod()) == null) + { + String msg = "Unsupported subscription period: '" + each.getSubscriptionPeriod() + "'"; + CrashlyticsUtils.logException(new IllegalStateException(msg)); + LOGGER.e(TAG, msg); + return true; + } + } + return false; + } +}