Skip to content

Commit 8145232

Browse files
aaudin90claude
andauthored
Billing8 (#144)
* Billing8: Migrate SDK to Play Billing Library 8.3.0 Bump billing version from 7.1.1 to 8.3.0. Replace deprecated PurchaseHistoryRecord with Purchase in restore flow. Remove PurchaseHistoryCallbackStatus and queryPurchaseHistory methods. Update ProductDetailsWrapper to use QueryProductDetailsResult API. Add enableAutoServiceReconnection() and enableOneTimeProducts(). Refactor BillingWrapper: replace Thread.sleep with delay, merge duplicate billingFlowParamsBuilder overloads, restrict connect() visibility to private, remove redundant KDoc on private methods. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * Billing8: Clean up demo_old BillingClientWrapper Fix queryProductDetails() bug: move queryProductDetailsAsync call outside the loop to make a single request with all products instead of N incremental requests. Add enableAutoServiceReconnection() and enableOneTimeProducts(). Add early return in queryPurchases() when BillingClient is not ready. Remove dead copy at ui/utils/BillingClientWrapper.kt. Remove obvious comments throughout the file. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 173a9a5 commit 8145232

File tree

10 files changed

+122
-487
lines changed

10 files changed

+122
-487
lines changed

demo_old/src/main/java/com/apphud/demo/ui/billing/BillingClientWrapper.kt

Lines changed: 20 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,13 @@ import com.android.billingclient.api.BillingClient
99
import com.android.billingclient.api.BillingClientStateListener
1010
import com.android.billingclient.api.BillingFlowParams
1111
import com.android.billingclient.api.BillingResult
12+
import com.android.billingclient.api.PendingPurchasesParams
1213
import com.android.billingclient.api.ProductDetails
1314
import com.android.billingclient.api.ProductDetailsResponseListener
1415
import com.android.billingclient.api.Purchase
1516
import com.android.billingclient.api.PurchasesUpdatedListener
1617
import com.android.billingclient.api.QueryProductDetailsParams
18+
import com.android.billingclient.api.QueryProductDetailsResult
1719
import com.android.billingclient.api.QueryPurchasesParams
1820
import org.greenrobot.eventbus.EventBus
1921

@@ -23,7 +25,6 @@ class BillingClientWrapper(
2325
companion object {
2426
private const val TAG = "ApphudLogs"
2527

26-
// List of subscription product offerings
2728
private const val PEACH = "com.apphud.demo.consumable.peach"
2829
private const val APPLE = "com.apphud.demo.consumable.apple1"
2930
private const val SUBS_1 = "com.apphud.demo.subscriptions.s1"
@@ -37,21 +38,23 @@ class BillingClientWrapper(
3738
var purchasesList = mutableListOf<Purchase>()
3839
var purchaseSuccessListener: ((purchase: Purchase?, billingResult: BillingResult) -> Unit)? = null
3940

40-
// Initialize the BillingClient.
4141
private val billingClient =
4242
BillingClient.newBuilder(context)
4343
.setListener(this)
44-
.enablePendingPurchases()
44+
.enablePendingPurchases(
45+
PendingPurchasesParams.newBuilder()
46+
.enableOneTimeProducts()
47+
.build()
48+
)
49+
.enableAutoServiceReconnection()
4550
.build()
4651

47-
// Establish a connection to Google Play.
4852
fun startBillingConnection(billingConnectionState: MutableLiveData<Boolean>) {
4953
billingClient.startConnection(
5054
object : BillingClientStateListener {
5155
override fun onBillingSetupFinished(billingResult: BillingResult) {
5256
if (billingResult.responseCode == BillingClient.BillingResponseCode.OK) {
5357
Log.d(TAG, "Billing response OK")
54-
// The BillingClient is ready. You can query purchases and product details here
5558
queryPurchases()
5659
queryProductDetails()
5760
billingConnectionState.postValue(true)
@@ -68,13 +71,11 @@ class BillingClientWrapper(
6871
)
6972
}
7073

71-
// Query Google Play Billing for existing purchases.
72-
// New purchases will be provided to PurchasesUpdatedListener.onPurchasesUpdated().
7374
fun queryPurchases() {
7475
if (!billingClient.isReady) {
7576
Log.e(TAG, "queryPurchases: BillingClient is not ready")
77+
return
7678
}
77-
// Query for existing subscription products that have been purchased.
7879
billingClient.queryPurchasesAsync(
7980
QueryPurchasesParams.newBuilder().setProductType(BillingClient.ProductType.SUBS).build(),
8081
) { billingResult, purchaseList ->
@@ -90,32 +91,24 @@ class BillingClientWrapper(
9091
}
9192
}
9293

93-
// Query Google Play Billing for products available to sell and present them in the UI
9494
fun queryProductDetails() {
95-
val params = QueryProductDetailsParams.newBuilder()
96-
val productList = mutableListOf<QueryProductDetailsParams.Product>()
97-
for (product in LIST_OF_PRODUCTS) {
98-
productList.add(
99-
QueryProductDetailsParams.Product.newBuilder()
100-
.setProductId(product)
101-
.setProductType(BillingClient.ProductType.SUBS)
102-
.build(),
103-
)
104-
105-
params.setProductList(productList).let { productDetailsParams ->
106-
Log.i(TAG, "queryProductDetailsAsync")
107-
billingClient.queryProductDetailsAsync(productDetailsParams.build(), this)
108-
}
95+
val productList = LIST_OF_PRODUCTS.map { product ->
96+
QueryProductDetailsParams.Product.newBuilder()
97+
.setProductId(product)
98+
.setProductType(BillingClient.ProductType.SUBS)
99+
.build()
109100
}
101+
val params = QueryProductDetailsParams.newBuilder()
102+
.setProductList(productList)
103+
.build()
104+
billingClient.queryProductDetailsAsync(params, this)
110105
}
111106

112-
// [ProductDetailsResponseListener] implementation
113-
// Listen to response back from [queryProductDetails] and emits the results
114-
// to [_productWithProductDetails].
115107
override fun onProductDetailsResponse(
116108
billingResult: BillingResult,
117-
productDetailsList: MutableList<ProductDetails>,
109+
queryResult: QueryProductDetailsResult,
118110
) {
111+
val productDetailsList = queryResult.productDetailsList
119112
val responseCode = billingResult.responseCode
120113
val debugMessage = billingResult.debugMessage
121114
when (responseCode) {
@@ -144,7 +137,6 @@ class BillingClientWrapper(
144137
}
145138
}
146139

147-
// Launch Purchase flow
148140
fun launchBillingFlow(
149141
activity: Activity,
150142
params: BillingFlowParams,
@@ -155,7 +147,6 @@ class BillingClientWrapper(
155147
billingClient.launchBillingFlow(activity, params)
156148
}
157149

158-
// PurchasesUpdatedListener that helps handle new purchases returned from the API
159150
override fun onPurchasesUpdated(
160151
billingResult: BillingResult,
161152
purchases: List<Purchase>?,
@@ -181,7 +172,6 @@ class BillingClientWrapper(
181172
}
182173
}
183174

184-
// Perform new subscription purchases' acknowledgement client side.
185175
private fun acknowledgePurchases(purchase: Purchase?) {
186176
purchase?.let {
187177
if (!it.isAcknowledged) {
@@ -203,7 +193,6 @@ class BillingClientWrapper(
203193
}
204194
}
205195

206-
// End Billing connection.
207196
fun terminateBillingConnection() {
208197
Log.i(TAG, "Terminating connection")
209198
billingClient.endConnection()

demo_old/src/main/java/com/apphud/demo/ui/utils/BillingClientWrapper.kt

Lines changed: 0 additions & 203 deletions
This file was deleted.

gradle/libs.versions.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
[versions]
2-
billing_ver = "7.1.1"
2+
billing_ver = "8.3.0"
33
espresso_ver = "3.6.0"
44
gson_ver = "2.10.1"
55
junit_ver = "4.13.2"

0 commit comments

Comments
 (0)