diff options
author | Dmitry Donskoy <donskdmitry@mail.ru> | 2018-12-12 18:51:57 +0300 |
---|---|---|
committer | Dmitry Donskoy <donskdmitry@mail.ru> | 2018-12-12 18:51:57 +0300 |
commit | 6ba2eefce2465f3028c3223161d34e89b4cccbc7 (patch) | |
tree | 37b3db922c7e4427114980ea206354ba815dad32 | |
parent | d7a198aedfcaeac8f4761841bb91b55e5f1b78fd (diff) |
[android] separate skudetails validation between subs type and in-app typeMAPSME-9242-fix-sku-details-validation
6 files changed, 90 insertions, 36 deletions
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> 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<PlayStoreBillingCallback @NonNull @BillingClient.SkuType private final String mProductType; + @NonNull + private final SkuDetailsValidationStrategy mSkuDetailsValidationStrategy; @SuppressWarnings({ "NullableProblems" }) @NonNull private BillingConnection mConnection; @NonNull private final List<BillingRequest> 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<PlayStoreBillingCallback public void queryProductDetails(@NonNull List<String> 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<PlayStoreBillingCallback> billingManager - = new PlayStoreBillingManager(BillingClient.SkuType.SUBS); + = new PlayStoreBillingManager(BillingClient.SkuType.SUBS, + new SubscriptionSkuDetailsValidationStrategy()); PurchaseValidationObservable observable = PurchaseValidationObservable.from(context); PurchaseValidator<ValidationCallback> 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<PlayStoreBillingCallback> billingManager - = new PlayStoreBillingManager(BillingClient.SkuType.INAPP); + = new PlayStoreBillingManager(BillingClient.SkuType.INAPP, + new DefaultSkuDetailsValidationStrategy()); PurchaseValidationObservable observable = PurchaseValidationObservable.from(context); PurchaseValidator<ValidationCallback> validator = new DefaultPurchaseValidator(observable); return new BookmarkPurchaseController(validator, billingManager, productId, serverId); @@ -55,7 +57,8 @@ public class PurchaseFactory @NonNull Context context) { BillingManager<PlayStoreBillingCallback> billingManager - = new PlayStoreBillingManager(BillingClient.SkuType.INAPP); + = new PlayStoreBillingManager(BillingClient.SkuType.INAPP, + new DefaultSkuDetailsValidationStrategy()); PurchaseValidationObservable observable = PurchaseValidationObservable.from(context); PurchaseValidator<ValidationCallback> validator = new DefaultPurchaseValidator(observable); return new FailedBookmarkPurchaseController(validator, billingManager); diff --git a/android/src/com/mapswithme/maps/purchase/QueryProductDetailsRequest.java b/android/src/com/mapswithme/maps/purchase/QueryProductDetailsRequest.java index c0c7dce823..1af8751409 100644 --- a/android/src/com/mapswithme/maps/purchase/QueryProductDetailsRequest.java +++ b/android/src/com/mapswithme/maps/purchase/QueryProductDetailsRequest.java @@ -18,13 +18,17 @@ class QueryProductDetailsRequest extends PlayStoreBillingRequest<PlayStoreBillin { @NonNull private final List<String> mProductIds; + @NonNull + private final SkuDetailsValidationStrategy mSkuDetailsValidationStrategy; QueryProductDetailsRequest(@NonNull BillingClient client, @NonNull String productType, @Nullable PlayStoreBillingCallback callback, - @NonNull List<String> productIds) + @NonNull List<String> productIds, + @NonNull SkuDetailsValidationStrategy strategy) { super(client, productType, callback); mProductIds = Collections.unmodifiableList(productIds); + mSkuDetailsValidationStrategy = strategy; } @Override @@ -49,39 +53,14 @@ class QueryProductDetailsRequest extends PlayStoreBillingRequest<PlayStoreBillin return; } - if (skuDetails == null || skuDetails.isEmpty()) - { - LOGGER.w(TAG, "Purchase details not found"); - if (getCallback() != null) - getCallback().onPurchaseDetailsFailure(); + if (getCallback() == null) return; - } - if (hasIncorrectSkuDetails(skuDetails)) - { - LOGGER.w(TAG, "Purchase details incorrect"); - if (getCallback() != null) - getCallback().onPurchaseDetailsFailure(); - return; - } + boolean isSkuValid = mSkuDetailsValidationStrategy.isValid(skuDetails); - LOGGER.i(TAG, "Purchase details obtained: " + skuDetails); - if (getCallback() != null) + if (isSkuValid) getCallback().onPurchaseDetailsLoaded(skuDetails); - } - - private static boolean hasIncorrectSkuDetails(@NonNull List<SkuDetails> skuDetails) - { - 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; + else + getCallback().onPurchaseDetailsFailure(); } } 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> 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> skuDetails) + { + boolean hasDetails = super.isValid(skuDetails); + return hasDetails && !hasIncorrectSkuDetails(skuDetails) ; + } + + private static boolean hasIncorrectSkuDetails(@Nullable List<SkuDetails> 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; + } +} |