From f2a9e3daa7a5b1d676cf491c2c7c6bb10187b9d5 Mon Sep 17 00:00:00 2001 From: Tretzi Date: Wed, 15 Apr 2026 22:36:13 -0500 Subject: [PATCH] Fix the purchase and subscribe functionality --- app/build.gradle.kts | 4 +- .../mindmachine/mvp/billing/BillingManager.kt | 78 ++++++++++--------- 2 files changed, 43 insertions(+), 39 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index cc95807..3db4827 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -15,8 +15,8 @@ android { applicationId = "solutions.tretter.mindmachine" minSdk = 26 targetSdk = 35 - versionCode = 11 - versionName = "1.0.6" + versionCode = 14 + versionName = "1.0.9" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } diff --git a/app/src/main/java/com/mindmachine/mvp/billing/BillingManager.kt b/app/src/main/java/com/mindmachine/mvp/billing/BillingManager.kt index 91606b9..9d62979 100644 --- a/app/src/main/java/com/mindmachine/mvp/billing/BillingManager.kt +++ b/app/src/main/java/com/mindmachine/mvp/billing/BillingManager.kt @@ -18,8 +18,6 @@ import com.android.billingclient.api.QueryPurchasesParams import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow -import android.os.Handler -import android.os.Looper class BillingManager( context: Context, @@ -80,9 +78,7 @@ class BillingManager( log("Billing setup finished: ${result.responseCode} ${result.debugMessage}") if (result.responseCode == BillingClient.BillingResponseCode.OK) { - Handler(Looper.getMainLooper()).post { - refresh() - } + refresh() } else { logError("Billing setup failed: ${result.responseCode} ${result.debugMessage}") } @@ -162,44 +158,52 @@ class BillingManager( return } - val requestedProducts = listOf( - BillingProducts.SUB_REMOVE_ADS_MONTHLY to BillingClient.ProductType.SUBS, - BillingProducts.INAPP_REMOVE_ADS_FOREVER to BillingClient.ProductType.INAPP, + queryProductDetailsForType( + productType = BillingClient.ProductType.SUBS, + productIds = listOf(BillingProducts.SUB_REMOVE_ADS_MONTHLY) ) - - log("Querying product details for: $requestedProducts") - - val products = requestedProducts.map { (id, type) -> - QueryProductDetailsParams.Product.newBuilder() - .setProductId(id) - .setProductType(type) - .build() - } - log( - "Querying product details for: " + - "${BillingProducts.SUB_REMOVE_ADS_MONTHLY}:${BillingClient.ProductType.SUBS}, " + - "${BillingProducts.INAPP_REMOVE_ADS_FOREVER}:${BillingClient.ProductType.INAPP}" + queryProductDetailsForType( + productType = BillingClient.ProductType.INAPP, + productIds = listOf(BillingProducts.INAPP_REMOVE_ADS_FOREVER) ) - - val params = QueryProductDetailsParams.newBuilder() - .setProductList(products) - .build() + } - log("Calling queryProductDetailsAsync now") + private fun queryProductDetailsForType( + productType: String, + productIds: List + ) { + try { + log("Querying $productType product details for $productIds") - billingClient.queryProductDetailsAsync(params) { result, queryResult -> - log("queryProductDetails result: ${result.responseCode} ${result.debugMessage}") - - val detailsList = queryResult.productDetailsList - log("Fetched products: ${detailsList.map { it.productId }}") - - val unfetched = queryResult.unfetchedProductList - log("Unfetched products: ${unfetched.map { "${it.productId}:${it.statusCode}" }}") - - if (result.responseCode == BillingClient.BillingResponseCode.OK) { - _productDetails.value = detailsList.associateBy { it.productId } + val products = productIds.map { productId -> + QueryProductDetailsParams.Product.newBuilder() + .setProductId(productId) + .setProductType(productType) + .build() } + + val params = QueryProductDetailsParams.newBuilder() + .setProductList(products) + .build() + + billingClient.queryProductDetailsAsync(params) { result, queryResult -> + log("queryProductDetailsAsync($productType) result: ${result.responseCode} ${result.debugMessage}") + + val detailsList = queryResult.productDetailsList + log("Fetched $productType products: ${detailsList.map { it.productId }}") + + if (queryResult.unfetchedProductList.isNotEmpty()) { + logError("Unfetched $productType products: ${queryResult.unfetchedProductList}") + } + + if (result.responseCode == BillingClient.BillingResponseCode.OK) { + _productDetails.value = _productDetails.value + detailsList.associateBy { it.productId } + log("Product details cache now has: ${_productDetails.value.keys}") + } + } + } catch (t: Throwable) { + Log.e("MindMachineBilling", "Exception querying $productType product details", t) } }