diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/PurchaseHandler.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/PurchaseHandler.kt index 2fc9b26ed..e1a080cf6 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/PurchaseHandler.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/PurchaseHandler.kt @@ -70,7 +70,17 @@ class PurchaseHandler( private fun processPurchases(result: BillingResult, purchases: MutableList) { when (result.responseCode) { BillingClient.BillingResponseCode.OK -> { + val mostRecentSub = findMostRecentSubscription(purchases) + val plan = userViewModel.user.value?.purchased?.plan for (purchase in purchases) { + if (plan?.isActive == true) { + if ((plan.additionalData?.data?.orderId == purchase.orderId && + ((plan.dateTerminated != null) == purchase.isAutoRenewing)) || + mostRecentSub?.orderId != purchase.orderId + ) { + return + } + } handle(purchase) } } @@ -231,14 +241,6 @@ class PurchaseHandler( } } PurchaseTypes.allSubscriptionTypes.contains(sku) -> { - val plan = userViewModel.user.value?.purchased?.plan - if (plan?.isActive == true) { - if (plan.additionalData?.data?.orderId == purchase.orderId && - ((plan.dateTerminated != null) == purchase.isAutoRenewing) - ) { - return - } - } val validationRequest = buildValidationRequest(purchase) apiClient.validateSubscription(validationRequest).subscribe({ processedPurchase(purchase) @@ -310,14 +312,20 @@ class PurchaseHandler( } var fallback: Purchase? = null if (result.billingResult.responseCode == BillingClient.BillingResponseCode.OK) { - val purchases = result.purchasesList.filter { it.isAcknowledged }.sortedByDescending { it.purchaseTime } - // If there is a subscription that is still active, prioritise that. Otherwise return the most recent one. - for (purchase in purchases) { - if (purchase.isAutoRenewing) { - return purchase - } else if (!purchase.isAutoRenewing && fallback == null) { - fallback = purchase - } + return findMostRecentSubscription(result.purchasesList) + } + return fallback + } + + private fun findMostRecentSubscription(purchasesList: List): Purchase? { + val purchases = purchasesList.filter { it.isAcknowledged }.sortedByDescending { it.purchaseTime } + var fallback: Purchase? = null + // If there is a subscription that is still active, prioritise that. Otherwise return the most recent one. + for (purchase in purchases) { + if (purchase.isAutoRenewing) { + return purchase + } else if (!purchase.isAutoRenewing && fallback == null) { + fallback = purchase } } return fallback diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/purchases/SubscriptionFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/purchases/SubscriptionFragment.kt index 98bcfa448..e330d57ce 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/purchases/SubscriptionFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/purchases/SubscriptionFragment.kt @@ -29,11 +29,11 @@ import com.habitrpg.android.habitica.ui.fragments.PromoInfoFragment import com.habitrpg.common.habitica.extensions.loadImage import com.habitrpg.android.habitica.ui.views.dialogs.HabiticaAlertDialog import com.habitrpg.android.habitica.ui.views.subscriptions.SubscriptionOptionView -import javax.inject.Inject import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext +import javax.inject.Inject class SubscriptionFragment : BaseFragment() { @@ -232,7 +232,7 @@ class SubscriptionFragment : BaseFragment() { if (user?.purchased?.plan?.paymentMethod == "Google" && user?.purchased?.plan?.isActive == true && user?.purchased?.plan?.dateTerminated == null && - (newestSubscription?.isAutoRenewing == false) + (newestSubscription?.isAutoRenewing != true) ) { compositeSubscription.add( purchaseHandler.cancelSubscription()