in TrivialDriveJava/app/src/main/java/com/sample/android/trivialdrivesample/billing/BillingDataSource.java [591:661]
private void processPurchaseList(List<Purchase> purchases, List<String> skusToUpdate) {
HashSet<String> updatedSkus = new HashSet<>();
if (null != purchases) {
for (final Purchase purchase : purchases) {
for (String sku : purchase.getSkus()) {
final MutableLiveData<SkuState> skuStateLiveData = skuStateMap.get(sku);
if (null == skuStateLiveData) {
Log.e(TAG, "Unknown SKU " + sku + ". Check to make " +
"sure SKU matches SKUS in the Play developer console.");
continue;
}
updatedSkus.add(sku);
}
// Global check to make sure all purchases are signed correctly.
// This check is best performed on your server.
int purchaseState = purchase.getPurchaseState();
if (purchaseState == Purchase.PurchaseState.PURCHASED) {
if (!isSignatureValid(purchase)) {
Log.e(TAG, "Invalid signature on purchase. Check to make " +
"sure your public key is correct.");
continue;
}
// only set the purchased state after we've validated the signature.
setSkuStateFromPurchase(purchase);
boolean isConsumable = false;
for (String sku : purchase.getSkus()) {
if (knownAutoConsumeSKUs.contains(sku)) {
isConsumable = true;
} else {
if (isConsumable) {
Log.e(TAG, "Purchase cannot contain a mixture of consumable" +
"and non-consumable items: " + purchase.getSkus().toString());
isConsumable = false;
break;
}
}
}
if ( isConsumable ) {
consumePurchase(purchase);
} else if (!purchase.isAcknowledged()) {
billingClient.acknowledgePurchase(AcknowledgePurchaseParams.newBuilder()
.setPurchaseToken(purchase.getPurchaseToken())
.build(), billingResult -> {
if (billingResult.getResponseCode()
== BillingClient.BillingResponseCode.OK) {
// purchase acknowledged
for ( String sku : purchase.getSkus() ) {
setSkuState(sku, SkuState.SKU_STATE_PURCHASED_AND_ACKNOWLEDGED);
}
newPurchase.postValue(purchase.getSkus());
}
});
}
} else {
// make sure the state is set
setSkuStateFromPurchase(purchase);
}
}
} else{
Log.d(TAG, "Empty purchase list.");
}
// Clear purchase state of anything that didn't come with this purchase list if this is
// part of a refresh.
if (null != skusToUpdate) {
for (String sku : skusToUpdate) {
if (!updatedSkus.contains(sku)) {
setSkuState(sku, SkuState.SKU_STATE_UNPURCHASED);
}
}
}
}