use of com.android.billingclient.api.BillingResult in project Android-InAppBilling by LiteKite.
the class BillingManager method querySkuDetailsAsync.
/**
* Queries SKU Details from Google Play Remote Server of SKU Types (InApp and Subscription).
*
* @param skuResultLMap contains SKU ID and Price Details returned by the sku details query.
* @param params contains list of SKU IDs and SKU Type (InApp or Subscription).
* @param billingType InApp or Subscription.
* @param executeWhenFinished contains query for InApp SKU Details that will be run after
*/
private void querySkuDetailsAsync(Map<String, SkuDetails> skuResultLMap, SkuDetailsParams.Builder params, @SkuType String billingType, Runnable executeWhenFinished) {
final SkuDetailsResponseListener listener = (billingResult, skuDetailsList) -> {
// Process the result.
if (billingResult.getResponseCode() != BillingResponseCode.OK) {
MonetizeApp.printLog(TAG, "Unsuccessful query for type: " + billingType + ". Error code: " + billingResult.getResponseCode());
} else if (skuDetailsList != null && skuDetailsList.size() > 0) {
for (SkuDetails skuDetails : skuDetailsList) {
skuResultLMap.put(skuDetails.getSku(), skuDetails);
}
}
if (executeWhenFinished != null) {
executeWhenFinished.run();
return;
}
if (skuResultLMap.size() == 0) {
MonetizeApp.printLog(TAG, "sku error: " + context.getString(R.string.err_no_sku));
} else {
MonetizeApp.printLog(TAG, "storing sku list locally");
storeSkuDetailsLocally(skuResultLMap);
}
};
// Creating a runnable from the request to use it inside our connection retry policy below
executeServiceRequest(() -> myBillingClient.querySkuDetailsAsync(params.build(), listener));
}
use of com.android.billingclient.api.BillingResult in project Android-InAppBilling by LiteKite.
the class BillingManager method acknowledgeNonConsumablePurchasesAsync.
/**
* If you do not acknowledge a purchase, the Google Play Store will provide a refund to the
* users within a few days of the transaction. Therefore you have to implement
* [BillingClient.acknowledgePurchaseAsync] inside your app.
*
* @param purchase list of Purchase Details returned from the queries.
*/
private void acknowledgeNonConsumablePurchasesAsync(Purchase purchase) {
final AcknowledgePurchaseParams params = AcknowledgePurchaseParams.newBuilder().setPurchaseToken(purchase.getPurchaseToken()).build();
final AcknowledgePurchaseResponseListener listener = billingResult -> {
if (billingResult.getResponseCode() == BillingResponseCode.OK) {
MonetizeApp.printLog(TAG, "onAcknowledgePurchaseResponse: " + BillingResponseCode.OK);
} else {
MonetizeApp.printLog(TAG, "onAcknowledgePurchaseResponse: " + billingResult.getDebugMessage());
}
};
executeServiceRequest(() -> myBillingClient.acknowledgePurchase(params, listener));
}
use of com.android.billingclient.api.BillingResult in project Android-InAppBilling by LiteKite.
the class BillingManager method queryPurchaseHistoryAsync.
/**
* Queries InApp and Subscribed purchase results from Google Play Remote Server.
*
* @param purchases this list contains all the product purchases made, has InApp and
* Subscription purchased results.
* @param skuType InApp or Subscription.
* @param executeWhenFinished Once the InApp product purchase results are given, then
* subscription based purchase results are queried and results are placed into the {@link
* #myPurchasesResultList}
*/
private void queryPurchaseHistoryAsync(final List<PurchaseHistoryRecord> purchases, @SkuType final String skuType, final Runnable executeWhenFinished) {
PurchaseHistoryResponseListener listener = (billingResult, list) -> {
if (billingResult.getResponseCode() == BillingResponseCode.OK && list != null) {
purchases.addAll(list);
if (executeWhenFinished != null) {
executeWhenFinished.run();
}
} else {
MonetizeApp.printLog(TAG, "queryPurchaseHistoryAsync() got an error response code: " + billingResult.getResponseCode());
logErrorType(billingResult);
}
if (executeWhenFinished == null) {
storePurchaseHistoryRecordsLocally(purchases);
}
};
executeServiceRequest(() -> myBillingClient.queryPurchaseHistoryAsync(skuType, listener));
}
use of com.android.billingclient.api.BillingResult in project CodenameOne by codenameone.
the class BillingSupport method _purchase.
public void _purchase(final String item, final String type) {
if (!areSubscriptionsSupported() && type.equals(BillingClient.SkuType.SUBS)) {
final PurchaseCallback pc = getPurchaseCallback();
if (pc == null) {
return;
}
CN.callSerially(new Runnable() {
@Override
public void run() {
pc.itemPurchaseError(item, "Subscriptions are not supported on this device");
}
});
return;
}
runWithConnection(new Runnable() {
public void run() {
billingClient.querySkuDetailsAsync(SkuDetailsParams.newBuilder().setType(type).setSkusList((List<String>) Arrays.asList(item)).build(), new SkuDetailsResponseListener() {
@Override
public void onSkuDetailsResponse(final BillingResult billingResult, final List<SkuDetails> list) {
if (isFailure(billingResult)) {
final PurchaseCallback pc = getPurchaseCallback();
if (pc == null) {
return;
}
CN.callSerially(new Runnable() {
@Override
public void run() {
pc.itemPurchaseError(item, billingResult.getDebugMessage());
}
});
return;
}
if (list == null || list.isEmpty()) {
final PurchaseCallback pc = getPurchaseCallback();
if (pc == null) {
return;
}
CN.callSerially(new Runnable() {
@Override
public void run() {
pc.itemPurchaseError(item, "No item could be found in the Playstore with sku " + item);
}
});
return;
}
for (SkuDetails details : list) {
inventory.add(details, type.equals(BillingClient.SkuType.SUBS));
}
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
billingClient.launchBillingFlow(activity, BillingFlowParams.newBuilder().setSkuDetails(list.iterator().next()).build());
}
});
}
});
}
});
}
use of com.android.billingclient.api.BillingResult in project CodenameOne by codenameone.
the class BillingSupport method getProducts.
@Override
public Product[] getProducts(String[] skus, boolean fromCacheOnly) {
if (inventory != null) {
final ArrayList pList = new ArrayList<Product>();
final ArrayList moreskusList = new ArrayList<Product>();
for (int i = 0; i < skus.length; i++) {
String sku = skus[i];
if (inventory.hasDetails(sku)) {
pList.add(inventory.getProduct(sku));
} else {
moreskusList.add(sku);
}
}
// if the inventory does not all the requestes sku make an update.
if (moreskusList.size() > 0 && !fromCacheOnly) {
final int[] complete = new int[1];
final Object lock = new Object();
runWithConnection(new Runnable() {
public void run() {
billingClient.querySkuDetailsAsync(SkuDetailsParams.newBuilder().setType(BillingClient.SkuType.INAPP).setSkusList((List<String>) moreskusList).build(), new SkuDetailsResponseListener() {
@Override
public void onSkuDetailsResponse(BillingResult billingResult, List<SkuDetails> list) {
synchronized (lock) {
if (isFailure(billingResult)) {
complete[0]++;
lock.notifyAll();
return;
}
for (SkuDetails details : list) {
inventory.add(details);
}
complete[0]++;
lock.notifyAll();
}
}
});
}
}).except(new SuccessCallback<Throwable>() {
public void onSucess(Throwable t) {
synchronized (lock) {
complete[0]++;
lock.notifyAll();
}
}
});
if (areSubscriptionsSupported()) {
runWithConnection(new Runnable() {
public void run() {
billingClient.querySkuDetailsAsync(SkuDetailsParams.newBuilder().setType(BillingClient.SkuType.SUBS).setSkusList((List<String>) moreskusList).build(), new SkuDetailsResponseListener() {
@Override
public void onSkuDetailsResponse(BillingResult billingResult, List<SkuDetails> list) {
synchronized (lock) {
if (isFailure(billingResult)) {
complete[0]++;
lock.notifyAll();
return;
}
for (SkuDetails details : list) {
inventory.add(details, true);
}
complete[0]++;
lock.notifyAll();
}
}
});
}
}).except(new SuccessCallback<Throwable>() {
public void onSucess(Throwable t) {
synchronized (lock) {
complete[0]++;
lock.notifyAll();
}
}
});
} else {
synchronized (lock) {
complete[0]++;
lock.notifyAll();
}
}
while (complete[0] < 2) {
CN.invokeAndBlock(new Runnable() {
@Override
public void run() {
synchronized (lock) {
while (complete[0] < 2) {
try {
lock.wait(1000);
} catch (InterruptedException ex) {
}
}
}
}
});
}
// inventory = mHelper.queryInventory(true, moreskusList);
return getProducts(skus, true);
}
Product[] productsOut = new Product[pList.size()];
productsOut = (Product[]) pList.toArray(productsOut);
return productsOut;
}
return null;
}
Aggregations