diff --git a/app/build.gradle b/app/build.gradle index 52953b0..6530752 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -203,8 +203,8 @@ dependencies { implementation 'com.squareup.okhttp3:okhttp-tls:4.9.0' implementation 'com.squareup.okhttp3:logging-interceptor:3.8.1' - googleApiImplementation "com.android.billingclient:billing:3.0.3" - googleApiImplementation "com.android.billingclient:billing-ktx:3.0.3" + googleApiImplementation "com.android.billingclient:billing:4.0.0" + googleApiImplementation "com.android.billingclient:billing-ktx:4.0.0" implementation('io.socket:socket.io-client:1.0.0') { exclude group: 'org.json', module: 'json' diff --git a/app/src/main/java/io/timelimit/android/ui/payment/ActivityPurchaseModel.kt b/app/src/main/java/io/timelimit/android/ui/payment/ActivityPurchaseModel.kt index b3effd2..c6c64eb 100644 --- a/app/src/main/java/io/timelimit/android/ui/payment/ActivityPurchaseModel.kt +++ b/app/src/main/java/io/timelimit/android/ui/payment/ActivityPurchaseModel.kt @@ -137,11 +137,11 @@ class ActivityPurchaseModel(application: Application): AndroidViewModel(applicat } suspend fun queryPurchases() = initAndUseClient { client -> - val response = client.queryPurchases(BillingClient.SkuType.INAPP) + val response = client.queryPurchasesAsync(BillingClient.SkuType.INAPP) response.billingResult.assertSuccess() - response.purchasesList!!.filter { + response.purchasesList.filter { it.purchaseState == Purchase.PurchaseState.PURCHASED } } @@ -151,11 +151,11 @@ class ActivityPurchaseModel(application: Application): AndroidViewModel(applicat isWorkingInternal.setTemporarily(true).use { try { initAndUseClient { client -> - val result = client.queryPurchases(BillingClient.SkuType.INAPP) + val result = client.queryPurchasesAsync(BillingClient.SkuType.INAPP) result.billingResult.assertSuccess() - for (purchase in result.purchasesList!!) { + for (purchase in result.purchasesList) { handlePurchase(purchase, client) } } @@ -219,7 +219,9 @@ class ActivityPurchaseModel(application: Application): AndroidViewModel(applicat Log.d(LOG_TAG, "handlePurchase($purchase)") } - if (PurchaseIds.SAL_SKUS.contains(purchase.sku)) { + val sku = purchase.skus.single() + + if (PurchaseIds.SAL_SKUS.contains(sku)) { // just acknowledge billingClient.acknowledgePurchase( @@ -227,7 +229,7 @@ class ActivityPurchaseModel(application: Application): AndroidViewModel(applicat .setPurchaseToken(purchase.purchaseToken) .build() ).assertSuccess() - } else if (PurchaseIds.BUY_SKUS.contains(purchase.sku)) { + } else if (PurchaseIds.BUY_SKUS.contains(sku)) { // send and consume val server = logic.serverLogic.getServerConfigCoroutine() @@ -251,7 +253,7 @@ class ActivityPurchaseModel(application: Application): AndroidViewModel(applicat } } else { if (BuildConfig.DEBUG) { - Log.d(LOG_TAG, "don't know how to handle ${purchase.sku}") + Log.d(LOG_TAG, "don't know how to handle $sku") } } } diff --git a/app/src/main/java/io/timelimit/android/ui/payment/StayAwesomeModel.kt b/app/src/main/java/io/timelimit/android/ui/payment/StayAwesomeModel.kt index 754db3f..3cb2396 100644 --- a/app/src/main/java/io/timelimit/android/ui/payment/StayAwesomeModel.kt +++ b/app/src/main/java/io/timelimit/android/ui/payment/StayAwesomeModel.kt @@ -48,7 +48,7 @@ class StayAwesomeModel(application: Application): AndroidViewModel(application) id = skuId, title = sku?.description ?: skuId, price = sku?.price ?: "???", - bought = purchases.find { it.sku == skuId } != null + bought = purchases.find { purchase -> purchase.skus.find { sku -> sku == skuId } != null } != null ) } ) diff --git a/app/src/noGoogleApi/java/com/android/billingclient/api/Mocks.kt b/app/src/noGoogleApi/java/com/android/billingclient/api/Mocks.kt index 35465a7..aba32d8 100644 --- a/app/src/noGoogleApi/java/com/android/billingclient/api/Mocks.kt +++ b/app/src/noGoogleApi/java/com/android/billingclient/api/Mocks.kt @@ -32,7 +32,7 @@ object BillingClient { fun launchBillingFlow(activity: Activity, params: BillingFlowParams) = BillingResult fun acknowledgePurchase(params: AcknowledgePurchaseParams) = BillingResult fun consumePurchase(params: ConsumeParams) = BillingResult - fun queryPurchases(type: String) = QueryPurchasesResult + suspend fun queryPurchasesAsync(type: String) = QueryPurchasesResult object BillingResponseCode { const val OK = 0 @@ -74,7 +74,7 @@ object SkuDetailsParams { object Purchase { const val purchaseState = PurchaseState.PURCHASED const val isAcknowledged = true - const val sku = "" + val skus = listOf("") const val purchaseToken = "" const val originalJson = "" const val signature = "" @@ -113,7 +113,7 @@ object BillingFlowParams { object QueryPurchasesResult { val billingResult = BillingResult - val purchasesList: List? = emptyList() + val purchasesList: List = emptyList() } data class QuerySkuDetailsResult(val billingResult: BillingResult, val details: List?) {