Skip to content

Commit 44e7666

Browse files
Merge pull request #46 from MihaiCristianCondrea/codex/fix-ci-compilation-errors-in-supportrepository
Fix billing API usage
2 parents 8c17aba + d5511e6 commit 44e7666

File tree

3 files changed

+61
-44
lines changed

3 files changed

+61
-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: 40 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,14 @@
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;
1718

19+
import java.util.ArrayList;
1820
import java.util.HashMap;
1921
import java.util.List;
2022
import java.util.Map;
@@ -25,7 +27,7 @@
2527
public class SupportRepository {
2628

2729
private final Context context;
28-
private final Map<String, SkuDetails> skuDetailsMap = new HashMap<>();
30+
private final Map<String, ProductDetails> productDetailsMap = new HashMap<>();
2931
private BillingClient billingClient;
3032

3133
public SupportRepository(Context context) {
@@ -41,7 +43,10 @@ public void initBillingClient(Runnable onConnected) {
4143
billingClient = BillingClient.newBuilder(context)
4244
.setListener((billingResult, purchases) -> {
4345
})
44-
.enablePendingPurchases()
46+
.enablePendingPurchases(
47+
PendingPurchasesParams.newBuilder()
48+
.enableOneTimeProducts()
49+
.build())
4550
.build();
4651

4752
billingClient.startConnection(new BillingClientStateListener() {
@@ -63,40 +68,52 @@ public void onBillingServiceDisconnected() {
6368
}
6469

6570
/**
66-
* Query your SKU details for in-app items.
71+
* Query your product details for in-app items.
6772
* Typically called after billing client is connected.
6873
*/
69-
public void querySkuDetails(List<String> skuList, OnSkuDetailsListener listener) {
74+
public void queryProductDetails(List<String> productIds, OnProductDetailsListener listener) {
7075
if (billingClient == null || !billingClient.isReady()) {
7176
return;
7277
}
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)
7689
.build();
7790

78-
billingClient.querySkuDetailsAsync(params, (billingResult, skuDetailsList) -> {
91+
billingClient.queryProductDetailsAsync(params, (billingResult, productDetailsList) -> {
7992
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);
8396
}
8497
if (listener != null) {
85-
listener.onSkuDetailsRetrieved(skuDetailsList);
98+
listener.onProductDetailsRetrieved(productDetailsList);
8699
}
87100
}
88101
});
89102
}
90103

91104
/**
92-
* Launch the billing flow for a particular SKU.
105+
* Launch the billing flow for a particular product.
93106
*/
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();
98115
BillingFlowParams flowParams = BillingFlowParams.newBuilder()
99-
.setSkuDetails(skuDetails)
116+
.setProductDetailsParamsList(List.of(productParams))
100117
.build();
101118
billingClient.launchBillingFlow(activity, flowParams);
102119
}
@@ -113,10 +130,10 @@ public void initMobileAds(ActivitySupportBinding binding) {
113130
}
114131

115132
/**
116-
* Callback interface for when SKU details are fetched.
133+
* Callback interface for when product details are fetched.
117134
*/
118-
public interface OnSkuDetailsListener {
119-
void onSkuDetailsRetrieved(List<SkuDetails> skuDetailsList);
135+
public interface OnProductDetailsListener {
136+
void onProductDetailsRetrieved(List<ProductDetails> productDetailsList);
120137
}
121138

122139
}

0 commit comments

Comments
 (0)