in TrivialDriveJava/app/src/main/java/com/sample/android/trivialdrivesample/billing/BillingDataSource.java [706:773]
public void launchBillingFlow(Activity activity, @NonNull String sku,
String... upgradeSkus) {
LiveData<SkuDetails> skuDetailsLiveData = skuDetailsLiveDataMap.get(sku);
assert skuDetailsLiveData != null;
SkuDetails skuDetails = skuDetailsLiveData.getValue();
if (null != skuDetails) {
if (null != upgradeSkus && upgradeSkus.length > 0) {
billingClient.queryPurchasesAsync(BillingClient.SkuType.SUBS,
(br, purchasesList) -> {
List<Purchase> heldSubscriptions = new LinkedList<>();
if (br.getResponseCode() != BillingClient.BillingResponseCode.OK) {
Log.e(TAG, "Problem getting purchases: " + br.getDebugMessage());
} else {
if (null != purchasesList) {
for (Purchase purchase : purchasesList) {
for (String upgradeSku : upgradeSkus) {
for (String purchaseSku : purchase.getSkus()) {
if (purchaseSku.equals(upgradeSku)) {
if ( !heldSubscriptions.contains(purchase) ) {
heldSubscriptions.add(purchase);
}
}
}
}
}
}
}
BillingFlowParams.Builder billingFlowParamsBuilder = BillingFlowParams.newBuilder();
billingFlowParamsBuilder.setSkuDetails(skuDetails);
switch (heldSubscriptions.size()) {
case 1: // Upgrade flow!
Purchase purchase = heldSubscriptions.get(0);
billingFlowParamsBuilder.setSubscriptionUpdateParams(
BillingFlowParams.SubscriptionUpdateParams.newBuilder()
.setOldSkuPurchaseToken(heldSubscriptions.get(0)
.getPurchaseToken())
.build()
);
br = billingClient.launchBillingFlow(activity,
billingFlowParamsBuilder.build());
if (br.getResponseCode() == BillingClient.BillingResponseCode.OK) {
billingFlowInProcess.postValue(true);
} else {
Log.e(TAG, "Billing failed: + " + br.getDebugMessage());
}
break;
case 0:
break;
default:
Log.e(TAG, heldSubscriptions.size() +
" subscriptions subscribed to. Upgrade not possible.");
}
});
} else {
BillingFlowParams.Builder billingFlowParamsBuilder = BillingFlowParams.newBuilder();
billingFlowParamsBuilder.setSkuDetails(skuDetails);
BillingResult br = billingClient.launchBillingFlow(activity,
billingFlowParamsBuilder.build());
if (br.getResponseCode() == BillingClient.BillingResponseCode.OK) {
billingFlowInProcess.postValue(true);
} else {
Log.e(TAG, "Billing failed: + " + br.getDebugMessage());
}
}
} else {
Log.e(TAG, "SkuDetails not found for: " + sku);
}
}