9
9
import com .android .billingclient .api .BillingClientStateListener ;
10
10
import com .android .billingclient .api .BillingFlowParams ;
11
11
import com .android .billingclient .api .BillingResult ;
12
- import com .android .billingclient .api .SkuDetails ;
13
- import com .android .billingclient .api .SkuDetailsParams ;
12
+ import com .android .billingclient .api .PendingPurchasesParams ;
13
+ import com .android .billingclient .api .ProductDetails ;
14
+ import com .android .billingclient .api .QueryProductDetailsParams ;
14
15
import com .d4rk .androidtutorials .java .databinding .ActivitySupportBinding ;
15
16
import com .google .android .gms .ads .AdRequest ;
16
17
import com .google .android .gms .ads .MobileAds ;
17
18
19
+ import java .util .ArrayList ;
18
20
import java .util .HashMap ;
19
21
import java .util .List ;
20
22
import java .util .Map ;
25
27
public class SupportRepository {
26
28
27
29
private final Context context ;
28
- private final Map <String , SkuDetails > skuDetailsMap = new HashMap <>();
30
+ private final Map <String , ProductDetails > productDetailsMap = new HashMap <>();
29
31
private BillingClient billingClient ;
30
32
31
33
public SupportRepository (Context context ) {
@@ -41,7 +43,10 @@ public void initBillingClient(Runnable onConnected) {
41
43
billingClient = BillingClient .newBuilder (context )
42
44
.setListener ((billingResult , purchases ) -> {
43
45
})
44
- .enablePendingPurchases ()
46
+ .enablePendingPurchases (
47
+ PendingPurchasesParams .newBuilder ()
48
+ .enableOneTimeProducts ()
49
+ .build ())
45
50
.build ();
46
51
47
52
billingClient .startConnection (new BillingClientStateListener () {
@@ -63,40 +68,52 @@ public void onBillingServiceDisconnected() {
63
68
}
64
69
65
70
/**
66
- * Query your SKU details for in-app items.
71
+ * Query your product details for in-app items.
67
72
* Typically called after billing client is connected.
68
73
*/
69
- public void querySkuDetails (List <String > skuList , OnSkuDetailsListener listener ) {
74
+ public void queryProductDetails (List <String > productIds , OnProductDetailsListener listener ) {
70
75
if (billingClient == null || !billingClient .isReady ()) {
71
76
return ;
72
77
}
73
- SkuDetailsParams params = SkuDetailsParams .newBuilder ()
74
- .setSkusList (skuList )
75
- .setType (BillingClient .SkuType .INAPP )
78
+
79
+ List <QueryProductDetailsParams .Product > products = new ArrayList <>();
80
+ for (String id : productIds ) {
81
+ products .add (QueryProductDetailsParams .Product .newBuilder ()
82
+ .setProductId (id )
83
+ .setProductType (BillingClient .ProductType .INAPP )
84
+ .build ());
85
+ }
86
+
87
+ QueryProductDetailsParams params = QueryProductDetailsParams .newBuilder ()
88
+ .setProductList (products )
76
89
.build ();
77
90
78
- billingClient .querySkuDetailsAsync (params , (billingResult , skuDetailsList ) -> {
91
+ billingClient .queryProductDetailsAsync (params , (billingResult , productDetailsList ) -> {
79
92
if (billingResult .getResponseCode () == BillingClient .BillingResponseCode .OK
80
- && skuDetailsList != null ) {
81
- for (SkuDetails skuDetails : skuDetailsList ) {
82
- skuDetailsMap .put (skuDetails . getSku (), skuDetails );
93
+ && productDetailsList != null ) {
94
+ for (ProductDetails productDetails : productDetailsList ) {
95
+ productDetailsMap .put (productDetails . getProductId (), productDetails );
83
96
}
84
97
if (listener != null ) {
85
- listener .onSkuDetailsRetrieved ( skuDetailsList );
98
+ listener .onProductDetailsRetrieved ( productDetailsList );
86
99
}
87
100
}
88
101
});
89
102
}
90
103
91
104
/**
92
- * Launch the billing flow for a particular SKU .
105
+ * Launch the billing flow for a particular product .
93
106
*/
94
- public void initiatePurchase (Activity activity , String sku ) {
95
- if (skuDetailsMap .containsKey (sku )) {
96
- SkuDetails skuDetails = skuDetailsMap .get (sku );
97
- if (skuDetails != null ) {
107
+ public void initiatePurchase (Activity activity , String productId ) {
108
+ if (productDetailsMap .containsKey (productId )) {
109
+ ProductDetails details = productDetailsMap .get (productId );
110
+ if (details != null ) {
111
+ BillingFlowParams .ProductDetailsParams productParams =
112
+ BillingFlowParams .ProductDetailsParams .newBuilder ()
113
+ .setProductDetails (details )
114
+ .build ();
98
115
BillingFlowParams flowParams = BillingFlowParams .newBuilder ()
99
- .setSkuDetails ( skuDetails )
116
+ .setProductDetailsParamsList ( List . of ( productParams ) )
100
117
.build ();
101
118
billingClient .launchBillingFlow (activity , flowParams );
102
119
}
@@ -113,10 +130,10 @@ public void initMobileAds(ActivitySupportBinding binding) {
113
130
}
114
131
115
132
/**
116
- * Callback interface for when SKU details are fetched.
133
+ * Callback interface for when product details are fetched.
117
134
*/
118
- public interface OnSkuDetailsListener {
119
- void onSkuDetailsRetrieved (List <SkuDetails > skuDetailsList );
135
+ public interface OnProductDetailsListener {
136
+ void onProductDetailsRetrieved (List <ProductDetails > productDetailsList );
120
137
}
121
138
122
139
}
0 commit comments