[android] separate skudetails validation between subs type and in-app type

This commit is contained in:
Dmitry Donskoy 2018-12-12 18:51:57 +03:00 committed by Vladimir Byko-Ianko
parent 0182e3134d
commit 30da8376ee
5 changed files with 80 additions and 5 deletions

View file

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

View file

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

View file

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

View file

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

View file

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