Skip to content

Commit 16f07c1

Browse files
Update billing API to v8
1 parent 8c17aba commit 16f07c1

File tree

3 files changed

+59
-44
lines changed

3 files changed

+59
-44
lines changed

app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/support/SupportActivity.java

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
import androidx.appcompat.app.AppCompatActivity;
1111
import androidx.lifecycle.ViewModelProvider;
1212

13-
import com.android.billingclient.api.SkuDetails;
13+
import com.android.billingclient.api.ProductDetails;
1414
import com.d4rk.androidtutorials.java.databinding.ActivitySupportBinding;
1515
import com.d4rk.androidtutorials.java.utils.EdgeToEdgeDelegate;
1616

@@ -43,33 +43,33 @@ protected void onCreate(Bundle savedInstanceState) {
4343
binding.buttonWebAd.setOnClickListener(v ->
4444
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("https://bit.ly/3p8bpjj"))));
4545

46-
supportViewModel.initBillingClient(this::querySkuDetails);
46+
supportViewModel.initBillingClient(this::queryProductDetails);
4747

4848
binding.buttonLowDonation.setOnClickListener(v -> initiatePurchase("low_donation"));
4949
binding.buttonNormalDonation.setOnClickListener(v -> initiatePurchase("normal_donation"));
5050
binding.buttonHighDonation.setOnClickListener(v -> initiatePurchase("high_donation"));
5151
binding.buttonExtremeDonation.setOnClickListener(v -> initiatePurchase("extreme_donation"));
5252
}
5353

54-
private void querySkuDetails() {
55-
List<String> skuList = List.of("low_donation", "normal_donation", "high_donation", "extreme_donation");
56-
supportViewModel.querySkuDetails(skuList, skuDetailsList -> {
57-
for (SkuDetails skuDetails : skuDetailsList) {
58-
switch (skuDetails.getSku()) {
59-
case "low_donation" -> binding.buttonLowDonation.setText(skuDetails.getPrice());
60-
case "normal_donation" ->
61-
binding.buttonNormalDonation.setText(skuDetails.getPrice());
62-
case "high_donation" ->
63-
binding.buttonHighDonation.setText(skuDetails.getPrice());
64-
case "extreme_donation" ->
65-
binding.buttonExtremeDonation.setText(skuDetails.getPrice());
54+
private void queryProductDetails() {
55+
List<String> productIds = List.of("low_donation", "normal_donation", "high_donation", "extreme_donation");
56+
supportViewModel.queryProductDetails(productIds, productDetailsList -> {
57+
for (ProductDetails productDetails : productDetailsList) {
58+
String price = productDetails.getOneTimePurchaseOfferDetails() != null
59+
? productDetails.getOneTimePurchaseOfferDetails().getFormattedPrice()
60+
: "";
61+
switch (productDetails.getProductId()) {
62+
case "low_donation" -> binding.buttonLowDonation.setText(price);
63+
case "normal_donation" -> binding.buttonNormalDonation.setText(price);
64+
case "high_donation" -> binding.buttonHighDonation.setText(price);
65+
case "extreme_donation" -> binding.buttonExtremeDonation.setText(price);
6666
}
6767
}
6868
});
6969
}
7070

71-
private void initiatePurchase(String sku) {
72-
supportViewModel.initiatePurchase(this, sku);
71+
private void initiatePurchase(String productId) {
72+
supportViewModel.initiatePurchase(this, productId);
7373
}
7474

7575
@Override

app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/support/SupportViewModel.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,13 @@ public void initBillingClient(Runnable onConnected) {
2424
repository.initBillingClient(onConnected);
2525
}
2626

27-
public void querySkuDetails(List<String> skuList,
28-
SupportRepository.OnSkuDetailsListener listener) {
29-
repository.querySkuDetails(skuList, listener);
27+
public void queryProductDetails(List<String> productIds,
28+
SupportRepository.OnProductDetailsListener listener) {
29+
repository.queryProductDetails(productIds, listener);
3030
}
3131

32-
public void initiatePurchase(Activity activity, String sku) {
33-
repository.initiatePurchase(activity, sku);
32+
public void initiatePurchase(Activity activity, String productId) {
33+
repository.initiatePurchase(activity, productId);
3434
}
3535

3636
public void initMobileAds(ActivitySupportBinding binding) {

app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/support/repository/SupportRepository.java

Lines changed: 38 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,9 @@
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.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;
1415
import com.d4rk.androidtutorials.java.databinding.ActivitySupportBinding;
1516
import com.google.android.gms.ads.AdRequest;
1617
import com.google.android.gms.ads.MobileAds;
@@ -25,7 +26,7 @@
2526
public class SupportRepository {
2627

2728
private final Context context;
28-
private final Map<String, SkuDetails> skuDetailsMap = new HashMap<>();
29+
private final Map<String, ProductDetails> productDetailsMap = new HashMap<>();
2930
private BillingClient billingClient;
3031

3132
public SupportRepository(Context context) {
@@ -41,7 +42,10 @@ public void initBillingClient(Runnable onConnected) {
4142
billingClient = BillingClient.newBuilder(context)
4243
.setListener((billingResult, purchases) -> {
4344
})
44-
.enablePendingPurchases()
45+
.enablePendingPurchases(
46+
PendingPurchasesParams.newBuilder()
47+
.enableOneTimeProducts()
48+
.build())
4549
.build();
4650

4751
billingClient.startConnection(new BillingClientStateListener() {
@@ -63,40 +67,51 @@ public void onBillingServiceDisconnected() {
6367
}
6468

6569
/**
66-
* Query your SKU details for in-app items.
70+
* Query your product details for in-app items.
6771
* Typically called after billing client is connected.
6872
*/
69-
public void querySkuDetails(List<String> skuList, OnSkuDetailsListener listener) {
73+
public void queryProductDetails(List<String> productIds, OnProductDetailsListener listener) {
7074
if (billingClient == null || !billingClient.isReady()) {
7175
return;
7276
}
73-
SkuDetailsParams params = SkuDetailsParams.newBuilder()
74-
.setSkusList(skuList)
75-
.setType(BillingClient.SkuType.INAPP)
77+
78+
List<QueryProductDetailsParams.Product> products = productIds.stream()
79+
.map(id -> QueryProductDetailsParams.Product.newBuilder()
80+
.setProductId(id)
81+
.setProductType(BillingClient.ProductType.INAPP)
82+
.build())
83+
.toList();
84+
85+
QueryProductDetailsParams params = QueryProductDetailsParams.newBuilder()
86+
.setProductList(products)
7687
.build();
7788

78-
billingClient.querySkuDetailsAsync(params, (billingResult, skuDetailsList) -> {
89+
billingClient.queryProductDetailsAsync(params, (billingResult, productDetailsList) -> {
7990
if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK
80-
&& skuDetailsList != null) {
81-
for (SkuDetails skuDetails : skuDetailsList) {
82-
skuDetailsMap.put(skuDetails.getSku(), skuDetails);
91+
&& productDetailsList != null) {
92+
for (ProductDetails productDetails : productDetailsList) {
93+
productDetailsMap.put(productDetails.getProductId(), productDetails);
8394
}
8495
if (listener != null) {
85-
listener.onSkuDetailsRetrieved(skuDetailsList);
96+
listener.onProductDetailsRetrieved(productDetailsList);
8697
}
8798
}
8899
});
89100
}
90101

91102
/**
92-
* Launch the billing flow for a particular SKU.
103+
* Launch the billing flow for a particular product.
93104
*/
94-
public void initiatePurchase(Activity activity, String sku) {
95-
if (skuDetailsMap.containsKey(sku)) {
96-
SkuDetails skuDetails = skuDetailsMap.get(sku);
97-
if (skuDetails != null) {
105+
public void initiatePurchase(Activity activity, String productId) {
106+
if (productDetailsMap.containsKey(productId)) {
107+
ProductDetails details = productDetailsMap.get(productId);
108+
if (details != null) {
109+
BillingFlowParams.ProductDetailsParams productParams =
110+
BillingFlowParams.ProductDetailsParams.newBuilder()
111+
.setProductDetails(details)
112+
.build();
98113
BillingFlowParams flowParams = BillingFlowParams.newBuilder()
99-
.setSkuDetails(skuDetails)
114+
.setProductDetailsParamsList(List.of(productParams))
100115
.build();
101116
billingClient.launchBillingFlow(activity, flowParams);
102117
}
@@ -113,10 +128,10 @@ public void initMobileAds(ActivitySupportBinding binding) {
113128
}
114129

115130
/**
116-
* Callback interface for when SKU details are fetched.
131+
* Callback interface for when product details are fetched.
117132
*/
118-
public interface OnSkuDetailsListener {
119-
void onSkuDetailsRetrieved(List<SkuDetails> skuDetailsList);
133+
public interface OnProductDetailsListener {
134+
void onProductDetailsRetrieved(List<ProductDetails> productDetailsList);
120135
}
121136

122137
}

0 commit comments

Comments
 (0)