Не правильно обновляется подписка

У меня в приложении две подписки, каждая из них по отдельности работает правильно. Но когда пытаюсь сделать Update/Downgrade, возникают проблемы:

  1. При попытке сменить одну подписку на другую, у меня высвечивается правильное окошко с изменением подписки и показывает что новая подписка куплена успешно, но когда проверяю в Google Play, показывает только ту что я купил первой, спустя время пробую ещё раз, в этот раз не появляется окошко замены, только стандартное окно покупки, без проблем покупается вторая и в Store видно обе. Может у меня какой-то не правильный подход к обновлению, вроде всё на своих местах иначе, не высвечивалось бы правильно окно с заменой.
  2. Мой метод setSuccessfulScreen(), в onPurchasesUpdated(), отрабатывает правильно при первой покупке, но при попытке обновить подписку крашится с ошибкой:
Fatal Exception: java.lang.RuntimeException: Error receiving broadcast Intent { act=com.android.vending.billing.PURCHASES_UPDATED

Думал может дело в Binding заменил на findViewById(), не помогает, без этого метода краша нету.

Мой код с подпиской:

    private fun buySubscription() {
        val skuList = ArrayList<String>()
        skuList.add("")
        skuList.add("")
        val params = SkuDetailsParams.newBuilder()
        params.setSkusList(skuList).setType(BillingClient.SkuType.SUBS)
        billingClient!!.querySkuDetailsAsync(params.build()) { billingResult, skuDetailsList ->
            if (billingResult.responseCode == BillingClient.BillingResponseCode.OK && skuDetailsList != null) {
                when (subsFlag) {
                    MONTH -> {
                        if (!ProviderPreferences.isSubscribed()) {
                            billingClient!!.launchBillingFlow(requireActivity(), BillingFlowParams.newBuilder().setSkuDetails(skuDetailsList[1]!!).build())
                        } else {
                            if (ProviderPreferences.getSubscribedType() == MONTH) {
                                billingClient!!.launchBillingFlow(requireActivity(), BillingFlowParams.newBuilder().setSkuDetails(skuDetailsList[1]!!).build())
                            } else {
                                val updateParams = BillingFlowParams.SubscriptionUpdateParams.newBuilder().setOldSkuPurchaseToken(ProviderPreferences.getPurchaseToken()!!).setReplaceSkusProrationMode(BillingFlowParams.ProrationMode.DEFERRED).build()

                                billingClient!!.launchBillingFlow(requireActivity(), BillingFlowParams.newBuilder().setSkuDetails(skuDetailsList[1]!!).setSubscriptionUpdateParams(updateParams).build())
                            }
                        }
                    }
                    YEAR -> {
                        if (!ProviderPreferences.isSubscribed()) {
                            billingClient!!.launchBillingFlow(requireActivity(), BillingFlowParams.newBuilder().setSkuDetails(skuDetailsList[0]!!).build())
                        } else {
                            if (ProviderPreferences.getSubscribedType() == YEAR) {
                                billingClient!!.launchBillingFlow(requireActivity(), BillingFlowParams.newBuilder().setSkuDetails(skuDetailsList[0]!!).build())
                            } else {
                                val updateParams = BillingFlowParams.SubscriptionUpdateParams.newBuilder().setOldSkuPurchaseToken(ProviderPreferences.getPurchaseToken()!!).setReplaceSkusProrationMode(BillingFlowParams.ProrationMode.DEFERRED).build()

                                billingClient!!.launchBillingFlow(requireActivity(), BillingFlowParams.newBuilder().setSkuDetails(skuDetailsList[0]!!).setSubscriptionUpdateParams(updateParams).build())
                            }
                        }
                    }
                }
            }
        }
    }

    private fun purchases() {
        val acknowledgePurchaseResponseListener = AcknowledgePurchaseResponseListener { billingResult -> }
        billingClient = BillingClient.newBuilder(App.getInstance()).enablePendingPurchases().setListener { billingResult: BillingResult, list: List<Purchase>? ->
            if (billingResult.responseCode == BillingClient.BillingResponseCode.OK) {
                val purchase = list!![0]
                handlePurchases(acknowledgePurchaseResponseListener, purchase)
                ProviderPreferences.saveSubscriptionType(subsFlag)
                ProviderPreferences.savePurchaseToken(list[0].purchaseToken)
                setSuccessfulScreen()
            }
        }.build()
        connectToGooglePlayBilling()
    }

    private fun handlePurchases(acknowledgePurchaseResponseListener: AcknowledgePurchaseResponseListener?, purchase: Purchase) {
        if (purchase.purchaseState == Purchase.PurchaseState.PURCHASED) {
            ProviderPreferences.saveSubscription(true)
            if (!purchase.isAcknowledged) {
                val acknowledgePurchaseParams = AcknowledgePurchaseParams.newBuilder().setPurchaseToken(purchase.purchaseToken).build()
                billingClient!!.acknowledgePurchase(acknowledgePurchaseParams, acknowledgePurchaseResponseListener!!)
            }
        }
    }

    private fun connectToGooglePlayBilling() {
        billingClient!!.startConnection(object : BillingClientStateListener {
            override fun onBillingSetupFinished(billingResult: BillingResult) {
                billingClient!!.queryPurchasesAsync(BillingClient.SkuType.SUBS) { billingResult, list ->
                    if (billingResult.responseCode == BillingClient.BillingResponseCode.OK && list != null) {
                        
                    }
                }
            }

            override fun onBillingServiceDisconnected() {
                connectToGooglePlayBilling()
            }
        })
    }

    private fun setSuccessfulScreen() {
        group!!.visibility = View.GONE
        group2!!.visibility = View.VISIBLE
        subscribeBtn!!.visibility = View.GONE
        lottieAnimation!!.playAnimation()
    }

Использую библиотеку billing v4. Подскажите пожалуйста в чём может быть причина, может что-то не так с кодом смены подписки, раньше обновление подписки не делал. И в чём может быть причина краша. Заранее благодарю.


Ответы (0 шт):