Search in sources :

Example 1 with BillingManager

use of net.osmand.plus.inapp.util.BillingManager in project Osmand by osmandapp.

the class InAppPurchaseHelperImpl method execImpl.

@Override
protected void execImpl(@NonNull final InAppPurchaseTaskType taskType, @NonNull final InAppCommand runnable) {
    billingManager = new BillingManager(ctx, BASE64_ENCODED_PUBLIC_KEY, new BillingManager.BillingUpdatesListener() {

        @Override
        public void onBillingClientSetupFinished() {
            logDebug("Setup finished.");
            BillingManager billingManager = getBillingManager();
            // Have we been disposed of in the meantime? If so, quit.
            if (billingManager == null) {
                stop(true);
                return;
            }
            if (!billingManager.isServiceConnected()) {
                // Oh noes, there was a problem.
                // complain("Problem setting up in-app billing: " + result);
                notifyError(taskType, billingManager.getBillingClientResponseMessage());
                stop(true);
                return;
            }
            runnable.run(InAppPurchaseHelperImpl.this);
        }

        @Override
        public void onConsumeFinished(String token, BillingResult billingResult) {
        }

        @Override
        public void onPurchasesUpdated(final List<Purchase> purchases) {
            BillingManager billingManager = getBillingManager();
            // Have we been disposed of in the meantime? If so, quit.
            if (billingManager == null) {
                stop(true);
                return;
            }
            if (activeTask == InAppPurchaseTaskType.REQUEST_INVENTORY) {
                List<String> skuInApps = new ArrayList<>();
                for (InAppPurchase purchase : getInAppPurchases().getAllInAppPurchases(false)) {
                    skuInApps.add(purchase.getSku());
                }
                for (Purchase p : purchases) {
                    skuInApps.add(p.getSku());
                }
                billingManager.querySkuDetailsAsync(BillingClient.SkuType.INAPP, skuInApps, new SkuDetailsResponseListener() {

                    @Override
                    public void onSkuDetailsResponse(@NonNull BillingResult billingResult, final List<SkuDetails> skuDetailsListInApps) {
                        // Is it a failure?
                        if (billingResult.getResponseCode() != BillingClient.BillingResponseCode.OK) {
                            logError("Failed to query inapps sku details: " + billingResult.getResponseCode());
                            notifyError(InAppPurchaseTaskType.REQUEST_INVENTORY, billingResult.getDebugMessage());
                            stop(true);
                            return;
                        }
                        List<String> skuSubscriptions = new ArrayList<>();
                        for (InAppSubscription subscription : getInAppPurchases().getAllInAppSubscriptions()) {
                            skuSubscriptions.add(subscription.getSku());
                        }
                        for (Purchase p : purchases) {
                            skuSubscriptions.add(p.getSku());
                        }
                        skuSubscriptions.addAll(subscriptionStateMap.keySet());
                        BillingManager billingManager = getBillingManager();
                        // Have we been disposed of in the meantime? If so, quit.
                        if (billingManager == null) {
                            stop(true);
                            return;
                        }
                        billingManager.querySkuDetailsAsync(BillingClient.SkuType.SUBS, skuSubscriptions, new SkuDetailsResponseListener() {

                            @Override
                            public void onSkuDetailsResponse(@NonNull BillingResult billingResult, final List<SkuDetails> skuDetailsListSubscriptions) {
                                // Is it a failure?
                                if (billingResult.getResponseCode() != BillingClient.BillingResponseCode.OK) {
                                    logError("Failed to query subscriptipons sku details: " + billingResult.getResponseCode());
                                    notifyError(InAppPurchaseTaskType.REQUEST_INVENTORY, billingResult.getDebugMessage());
                                    stop(true);
                                    return;
                                }
                                List<SkuDetails> skuDetailsList = new ArrayList<>(skuDetailsListInApps);
                                skuDetailsList.addAll(skuDetailsListSubscriptions);
                                InAppPurchaseHelperImpl.this.skuDetailsList = skuDetailsList;
                                getSkuDetailsResponseListener(runnable.userRequested()).onSkuDetailsResponse(billingResult, skuDetailsList);
                            }
                        });
                    }
                });
            }
            for (Purchase purchase : purchases) {
                InAppSubscription subscription = getSubscriptions().getSubscriptionBySku(purchase.getSku());
                if (!purchase.isAcknowledged() || (subscription != null && !subscription.isPurchased())) {
                    onPurchaseFinished(purchase);
                }
            }
        }

        @Override
        public void onPurchaseCanceled() {
            stop(true);
        }
    });
}
Also used : SkuDetails(com.android.billingclient.api.SkuDetails) InAppPurchase(net.osmand.plus.inapp.InAppPurchases.InAppPurchase) Purchase(com.android.billingclient.api.Purchase) InAppPurchase(net.osmand.plus.inapp.InAppPurchases.InAppPurchase) BillingManager(net.osmand.plus.inapp.util.BillingManager) ArrayList(java.util.ArrayList) InAppSubscription(net.osmand.plus.inapp.InAppPurchases.InAppSubscription) SkuDetailsResponseListener(com.android.billingclient.api.SkuDetailsResponseListener) NonNull(androidx.annotation.NonNull) BillingResult(com.android.billingclient.api.BillingResult) ArrayList(java.util.ArrayList) List(java.util.List)

Example 2 with BillingManager

use of net.osmand.plus.inapp.util.BillingManager in project Osmand by osmandapp.

the class InAppPurchaseHelperImpl method destroyBillingManager.

@Override
protected void destroyBillingManager() {
    BillingManager billingManager = getBillingManager();
    if (billingManager != null) {
        billingManager.destroy();
        this.billingManager = null;
    }
}
Also used : BillingManager(net.osmand.plus.inapp.util.BillingManager)

Example 3 with BillingManager

use of net.osmand.plus.inapp.util.BillingManager in project Osmand by osmandapp.

the class InAppPurchaseHelperImpl method getSkuDetailsResponseListener.

// Listener that's called when we finish querying the items and subscriptions we own
private SkuDetailsResponseListener getSkuDetailsResponseListener(boolean userRequested) {
    return new SkuDetailsResponseListener() {

        @NonNull
        private List<String> getAllOwnedSubscriptionSkus() {
            List<String> result = new ArrayList<>();
            BillingManager billingManager = getBillingManager();
            if (billingManager != null) {
                for (Purchase p : billingManager.getPurchases()) {
                    if (getInAppPurchases().getInAppSubscriptionBySku(p.getSku()) != null) {
                        result.add(p.getSku());
                    }
                }
            }
            for (Entry<String, SubscriptionStateHolder> entry : subscriptionStateMap.entrySet()) {
                SubscriptionState state = entry.getValue().state;
                if (state == SubscriptionState.PAUSED || state == SubscriptionState.ON_HOLD) {
                    String sku = entry.getKey();
                    if (!result.contains(sku)) {
                        result.add(sku);
                    }
                }
            }
            return result;
        }

        @Override
        public void onSkuDetailsResponse(@NonNull BillingResult billingResult, List<SkuDetails> skuDetailsList) {
            logDebug("Query sku details finished.");
            // Have we been disposed of in the meantime? If so, quit.
            if (getBillingManager() == null) {
                stop(true);
                return;
            }
            // Is it a failure?
            if (billingResult.getResponseCode() != BillingClient.BillingResponseCode.OK) {
                logError("Failed to query inventory: " + billingResult.getResponseCode());
                notifyError(InAppPurchaseTaskType.REQUEST_INVENTORY, billingResult.getDebugMessage());
                stop(true);
                return;
            }
            logDebug("Query sku details was successful.");
            /*
				 * Check for items we own. Notice that for each purchase, we check
				 * the developer payload to see if it's correct! See
				 * verifyDeveloperPayload().
				 */
            List<String> allOwnedSubscriptionSkus = getAllOwnedSubscriptionSkus();
            for (InAppSubscription s : getSubscriptions().getAllSubscriptions()) {
                if (hasDetails(s.getSku())) {
                    Purchase purchase = getPurchase(s.getSku());
                    SkuDetails liveUpdatesDetails = getSkuDetails(s.getSku());
                    if (liveUpdatesDetails != null) {
                        fetchInAppPurchase(s, liveUpdatesDetails, purchase);
                    }
                    allOwnedSubscriptionSkus.remove(s.getSku());
                }
            }
            for (String sku : allOwnedSubscriptionSkus) {
                Purchase purchase = getPurchase(sku);
                SkuDetails liveUpdatesDetails = getSkuDetails(sku);
                if (liveUpdatesDetails != null) {
                    InAppSubscription s = getSubscriptions().upgradeSubscription(sku);
                    if (s == null) {
                        s = new InAppPurchaseLiveUpdatesOldSubscription(liveUpdatesDetails);
                    }
                    fetchInAppPurchase(s, liveUpdatesDetails, purchase);
                }
            }
            InAppPurchase fullVersion = getFullVersion();
            if (hasDetails(fullVersion.getSku())) {
                Purchase purchase = getPurchase(fullVersion.getSku());
                SkuDetails fullPriceDetails = getSkuDetails(fullVersion.getSku());
                if (fullPriceDetails != null) {
                    fetchInAppPurchase(fullVersion, fullPriceDetails, purchase);
                }
            }
            InAppPurchase depthContours = getDepthContours();
            if (hasDetails(depthContours.getSku())) {
                Purchase purchase = getPurchase(depthContours.getSku());
                SkuDetails depthContoursDetails = getSkuDetails(depthContours.getSku());
                if (depthContoursDetails != null) {
                    fetchInAppPurchase(depthContours, depthContoursDetails, purchase);
                }
            }
            InAppPurchase contourLines = getContourLines();
            if (hasDetails(contourLines.getSku())) {
                Purchase purchase = getPurchase(contourLines.getSku());
                SkuDetails contourLinesDetails = getSkuDetails(contourLines.getSku());
                if (contourLinesDetails != null) {
                    fetchInAppPurchase(contourLines, contourLinesDetails, purchase);
                }
            }
            Purchase fullVersionPurchase = getPurchase(fullVersion.getSku());
            boolean fullVersionPurchased = fullVersionPurchase != null;
            if (fullVersionPurchased) {
                ctx.getSettings().FULL_VERSION_PURCHASED.set(true);
            }
            Purchase depthContoursPurchase = getPurchase(depthContours.getSku());
            boolean depthContoursPurchased = depthContoursPurchase != null;
            if (depthContoursPurchased) {
                ctx.getSettings().DEPTH_CONTOURS_PURCHASED.set(true);
            }
            // Do we have the live updates?
            boolean subscribedToLiveUpdates = false;
            boolean subscribedToOsmAndPro = false;
            boolean subscribedToMaps = false;
            List<Purchase> subscriptionPurchases = new ArrayList<>();
            for (InAppSubscription s : getSubscriptions().getAllSubscriptions()) {
                Purchase purchase = getPurchase(s.getSku());
                if (purchase != null || s.getState().isActive()) {
                    if (purchase != null) {
                        subscriptionPurchases.add(purchase);
                    }
                    if (!subscribedToLiveUpdates && purchases.isLiveUpdatesSubscription(s)) {
                        subscribedToLiveUpdates = true;
                    }
                    if (!subscribedToOsmAndPro && purchases.isOsmAndProSubscription(s)) {
                        subscribedToOsmAndPro = true;
                    }
                    if (!subscribedToMaps && purchases.isMapsSubscription(s)) {
                        subscribedToMaps = true;
                    }
                }
            }
            if (!subscribedToLiveUpdates && ctx.getSettings().LIVE_UPDATES_PURCHASED.get()) {
                ctx.getSettings().LIVE_UPDATES_PURCHASED.set(false);
            } else if (subscribedToLiveUpdates) {
                ctx.getSettings().LIVE_UPDATES_PURCHASED.set(true);
            }
            if (!subscribedToOsmAndPro && ctx.getSettings().OSMAND_PRO_PURCHASED.get()) {
                ctx.getSettings().OSMAND_PRO_PURCHASED.set(false);
            } else if (subscribedToOsmAndPro) {
                ctx.getSettings().OSMAND_PRO_PURCHASED.set(true);
            }
            if (!subscribedToMaps && ctx.getSettings().OSMAND_MAPS_PURCHASED.get()) {
                ctx.getSettings().OSMAND_MAPS_PURCHASED.set(false);
            } else if (subscribedToMaps) {
                ctx.getSettings().OSMAND_MAPS_PURCHASED.set(true);
            }
            if (!subscribedToLiveUpdates && !subscribedToOsmAndPro && !subscribedToMaps) {
                onSubscriptionExpired();
            }
            lastValidationCheckTime = System.currentTimeMillis();
            logDebug("User " + (subscribedToLiveUpdates ? "HAS" : "DOES NOT HAVE") + " live updates purchased.");
            logDebug("User " + (subscribedToOsmAndPro ? "HAS" : "DOES NOT HAVE") + " OsmAnd Pro purchased.");
            logDebug("User " + (subscribedToMaps ? "HAS" : "DOES NOT HAVE") + " Maps purchased.");
            OsmandSettings settings = ctx.getSettings();
            settings.INAPPS_READ.set(true);
            List<Purchase> tokensToSend = new ArrayList<>();
            if (subscriptionPurchases.size() > 0) {
                List<String> tokensSent = Arrays.asList(settings.BILLING_PURCHASE_TOKENS_SENT.get().split(";"));
                for (Purchase purchase : subscriptionPurchases) {
                    if (needRestoreUserInfo()) {
                        restoreUserInfo(purchase);
                    }
                    if (!tokensSent.contains(purchase.getSku())) {
                        tokensToSend.add(purchase);
                    }
                }
            }
            List<PurchaseInfo> purchaseInfoList = new ArrayList<>();
            for (Purchase purchase : tokensToSend) {
                purchaseInfoList.add(getPurchaseInfo(purchase));
            }
            onSkuDetailsResponseDone(purchaseInfoList, userRequested);
        }

        private void onSubscriptionExpired() {
            if (!isDepthContoursPurchased(ctx)) {
                ctx.getSettings().getCustomRenderBooleanProperty("depthContours").set(false);
            }
        }
    };
}
Also used : SkuDetails(com.android.billingclient.api.SkuDetails) InAppPurchase(net.osmand.plus.inapp.InAppPurchases.InAppPurchase) Purchase(com.android.billingclient.api.Purchase) InAppPurchaseLiveUpdatesOldSubscription(net.osmand.plus.inapp.InAppPurchasesImpl.InAppPurchaseLiveUpdatesOldSubscription) InAppPurchase(net.osmand.plus.inapp.InAppPurchases.InAppPurchase) ArrayList(java.util.ArrayList) BillingManager(net.osmand.plus.inapp.util.BillingManager) InAppSubscription(net.osmand.plus.inapp.InAppPurchases.InAppSubscription) OsmandSettings(net.osmand.plus.settings.backend.OsmandSettings) SkuDetailsResponseListener(com.android.billingclient.api.SkuDetailsResponseListener) SubscriptionState(net.osmand.plus.inapp.InAppPurchases.InAppSubscription.SubscriptionState) PurchaseInfo(net.osmand.plus.inapp.InAppPurchases.PurchaseInfo) NonNull(androidx.annotation.NonNull) BillingResult(com.android.billingclient.api.BillingResult) ArrayList(java.util.ArrayList) List(java.util.List)

Aggregations

BillingManager (net.osmand.plus.inapp.util.BillingManager)3 NonNull (androidx.annotation.NonNull)2 BillingResult (com.android.billingclient.api.BillingResult)2 Purchase (com.android.billingclient.api.Purchase)2 SkuDetails (com.android.billingclient.api.SkuDetails)2 SkuDetailsResponseListener (com.android.billingclient.api.SkuDetailsResponseListener)2 ArrayList (java.util.ArrayList)2 List (java.util.List)2 InAppPurchase (net.osmand.plus.inapp.InAppPurchases.InAppPurchase)2 InAppSubscription (net.osmand.plus.inapp.InAppPurchases.InAppSubscription)2 SubscriptionState (net.osmand.plus.inapp.InAppPurchases.InAppSubscription.SubscriptionState)1 PurchaseInfo (net.osmand.plus.inapp.InAppPurchases.PurchaseInfo)1 InAppPurchaseLiveUpdatesOldSubscription (net.osmand.plus.inapp.InAppPurchasesImpl.InAppPurchaseLiveUpdatesOldSubscription)1 OsmandSettings (net.osmand.plus.settings.backend.OsmandSettings)1