use of com.android.billingclient.api.ConsumeResponseListener in project PhoneProfilesPlus by henrichg.
the class BillingManager method consumePurchase.
private void consumePurchase(final Purchase purchase) {
// Specify a runnable to start when connection to Billing client is established
Runnable executeOnConnectedService = new Runnable() {
@Override
public void run() {
mBillingClient.consumeAsync(purchase.getPurchaseToken(), new ConsumeResponseListener() {
@Override
public void onConsumeResponse(@BillingClient.BillingResponse int responseCode, String outToken) {
PPApplication.logE(TAG, "onConsumeResponse() response: " + responseCode);
/*if (responseCode == BillingClient.BillingResponse.OK) {
// Handle the success of the consume operation.
// For example, increase the number of player's coins,
// that provide temporary benefits
}*/
}
});
}
};
// If Billing client was disconnected, we retry 1 time and if success, execute the query
startServiceConnectionIfNeeded(executeOnConnectedService);
}
use of com.android.billingclient.api.ConsumeResponseListener in project Android-InAppBilling by LiteKite.
the class BillingManager method handleConsumablePurchasesAsync.
/**
* Consumes InApp Product Purchase after successful purchase of InApp Product Purchase. InApp
* Products cannot be bought after a purchase was made. We need to consume it after a successful
* purchase, so that we can purchase again and it will become available for the next time we
* make purchase of the same product that was bought before.
*
* @param purchase the purchase result contains Purchase Details.
*/
private void handleConsumablePurchasesAsync(Purchase purchase) {
// onActivityResult()
if (tokensToBeConsumed.contains(purchase.getPurchaseToken())) {
MonetizeApp.printLog(TAG, "Token was already scheduled to be consumed - skipping...");
return;
}
tokensToBeConsumed.add(purchase.getPurchaseToken());
// Generating Consume Response listener
final ConsumeResponseListener listener = (billingResult, purchaseToken) -> {
// (feel free to introduce your retry policy here).
if (billingResult.getResponseCode() == BillingResponseCode.OK) {
MonetizeApp.printLog(TAG, "onConsumeResponse, Purchase Token: " + purchaseToken);
} else {
MonetizeApp.printLog(TAG, "onConsumeResponse: " + billingResult.getDebugMessage());
}
};
// Consume the purchase async
final ConsumeParams consumeParams = ConsumeParams.newBuilder().setPurchaseToken(purchase.getPurchaseToken()).build();
// Creating a runnable from the request to use it inside our connection retry policy below
executeServiceRequest(() -> myBillingClient.consumeAsync(consumeParams, listener));
}
use of com.android.billingclient.api.ConsumeResponseListener in project CodenameOne by codenameone.
the class BillingSupport method handlePurchase.
private void handlePurchase(final Purchase purchase) {
if (handlingPurchase.contains(purchase.getPurchaseToken())) {
return;
}
handlingPurchase.add(purchase.getPurchaseToken());
final PurchaseCallback pc = getPurchaseCallback();
if (!verifyDeveloperPayload(purchase)) {
if (pc != null && pc instanceof PendingPurchaseCallback) {
final PendingPurchaseCallback ppc = (PendingPurchaseCallback) pc;
CN.callSerially(new Runnable() {
public void run() {
for (String sku : purchase.getSkus()) {
ppc.itemPurchaseError(sku, "Invalid developer payload");
}
}
});
}
handlingPurchase.remove(purchase.getPurchaseToken());
return;
}
if (purchase.getPurchaseState() != Purchase.PurchaseState.PURCHASED) {
// This will be called again when the purchase completes.
if (purchase.getPurchaseState() == Purchase.PurchaseState.PENDING && pc != null && pc instanceof PendingPurchaseCallback) {
final PendingPurchaseCallback ppc = (PendingPurchaseCallback) pc;
CN.callSerially(new Runnable() {
@Override
public void run() {
ppc.itemPurchasePending(purchase.getSkus().iterator().next());
}
});
}
handlingPurchase.remove(purchase.getPurchaseToken());
return;
}
final String sku = purchase.getSkus().iterator().next();
final Runnable onPurchaseAcknowledged = new Runnable() {
public void run() {
if (pc != null) {
Display.getInstance().callSerially(new Runnable() {
@Override
public void run() {
// Sandbox transactions have no order ID, so we'll make a dummy transaction ID
// in this case.
String transactionId = (purchase.getOrderId() == null || purchase.getOrderId().isEmpty()) ? "play-sandbox-" + UUID.randomUUID().toString() : purchase.getOrderId();
String purchaseJsonStr = purchase.getOriginalJson();
try {
// In order to verify receipts, we'll need both the order data and the signature
// so we'll pack it all into a single JSON string.
JSONObject purchaseJson = new JSONObject(purchaseJsonStr);
JSONObject rootJson = new JSONObject();
rootJson.put("data", purchaseJson);
rootJson.put("signature", purchase.getSignature());
purchaseJsonStr = rootJson.toString();
} catch (JSONException ex) {
Logger.getLogger(CodenameOneActivity.class.getName()).log(Level.SEVERE, null, ex);
}
com.codename1.payment.Purchase.postReceipt(Receipt.STORE_CODE_PLAY, sku, transactionId, purchase.getPurchaseTime(), purchaseJsonStr);
pc.itemPurchased(sku);
}
});
inventory.add(sku, purchase);
// This is a temp hack to get the last purchase raw data
// The IAP API needs to be modified to support this on all platforms
Display.getInstance().setProperty("lastPurchaseData", purchase.getOriginalJson());
}
}
};
if (!isConsumable(sku)) {
if (!purchase.isAcknowledged()) {
runWithConnection(new Runnable() {
public void run() {
billingClient.acknowledgePurchase(AcknowledgePurchaseParams.newBuilder().setPurchaseToken(purchase.getPurchaseToken()).build(), new AcknowledgePurchaseResponseListener() {
@Override
public void onAcknowledgePurchaseResponse(final BillingResult billingResult) {
handlingPurchase.remove(purchase.getPurchaseToken());
if (isFailure(billingResult)) {
final PurchaseCallback pc = getPurchaseCallback();
if (pc != null) {
Display.getInstance().callSerially(new Runnable() {
@Override
public void run() {
pc.itemPurchaseError(sku, billingResult.getDebugMessage());
}
});
}
} else {
onPurchaseAcknowledged.run();
}
}
});
}
});
} else {
handlingPurchase.remove(purchase.getPurchaseToken());
}
return;
}
final ConsumeParams consumeParams = ConsumeParams.newBuilder().setPurchaseToken(purchase.getPurchaseToken()).build();
final ConsumeResponseListener listener = new ConsumeResponseListener() {
@Override
public void onConsumeResponse(final BillingResult billingResult, String purchaseToken) {
if (purchase != null)
handlingPurchase.remove(purchase.getPurchaseToken());
if (isFailure(billingResult)) {
final PurchaseCallback pc = getPurchaseCallback();
if (pc != null) {
Display.getInstance().callSerially(new Runnable() {
@Override
public void run() {
pc.itemPurchaseError(sku, billingResult.getDebugMessage());
}
});
}
} else {
onPurchaseAcknowledged.run();
}
if (purchase != null) {
inventory.erasePurchase(sku);
}
}
};
if (!purchase.isAcknowledged()) {
runWithConnection(new Runnable() {
public void run() {
billingClient.consumeAsync(consumeParams, listener);
}
}).except(new SuccessCallback<Throwable>() {
public void onSucess(final Throwable t) {
if (purchase != null)
handlingPurchase.remove(purchase.getPurchaseToken());
final PurchaseCallback pc = getPurchaseCallback();
if (pc != null) {
Display.getInstance().callSerially(new Runnable() {
@Override
public void run() {
pc.itemPurchaseError(sku, t.getMessage());
}
});
}
if (purchase != null) {
inventory.erasePurchase(sku);
}
}
});
} else {
handlingPurchase.remove(purchase.getPurchaseToken());
}
}
use of com.android.billingclient.api.ConsumeResponseListener in project Osmand by osmandapp.
the class BillingManager method consumeAsync.
public void consumeAsync(final ConsumeParams consumeParams) {
// If we've already scheduled to consume this token - no action is needed (this could happen
// if you received the token when querying purchases inside onReceive() and later from
// onActivityResult()
final String purchaseToken = consumeParams.getPurchaseToken();
if (mTokensToBeConsumed == null) {
mTokensToBeConsumed = new HashSet<>();
} else if (mTokensToBeConsumed.contains(purchaseToken)) {
LOG.info("Token was already scheduled to be consumed - skipping...");
return;
}
mTokensToBeConsumed.add(purchaseToken);
// Generating Consume Response listener
final ConsumeResponseListener onConsumeListener = new ConsumeResponseListener() {
@Override
public void onConsumeResponse(BillingResult billingResult, String purchaseToken) {
// If billing service was disconnected, we try to reconnect 1 time
// (feel free to introduce your retry policy here).
mBillingUpdatesListener.onConsumeFinished(purchaseToken, billingResult);
}
};
// Creating a runnable from the request to use it inside our connection retry policy below
Runnable consumeRequest = new Runnable() {
@Override
public void run() {
// Consume the purchase async
mBillingClient.consumeAsync(consumeParams, onConsumeListener);
}
};
executeServiceRequest(consumeRequest);
}
use of com.android.billingclient.api.ConsumeResponseListener in project PhoneProfiles by henrichg.
the class BillingManager method consumePurchase.
/*
public void startPurchaseFlow(final String skuId, final String billingType) {
// Specify a runnable to start when connection to Billing client is established
Runnable executeOnConnectedService = new Runnable() {
@Override
public void run() {
BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder()
.setType(billingType)
.setSku(skuId)
.build();
int responseCode = mBillingClient.launchBillingFlow(mActivity, billingFlowParams);
PPApplication.logE(TAG, "startPurchaseFlow responseCode="+responseCode);
getFragment().displayAnErrorIfNeeded(responseCode);
}
};
// If Billing client was disconnected, we retry 1 time and if success, execute the query
startServiceConnectionIfNeeded(executeOnConnectedService);
}
*/
private void consumePurchase(final Purchase purchase) {
// Specify a runnable to start when connection to Billing client is established
Runnable executeOnConnectedService = new Runnable() {
@Override
public void run() {
ConsumeParams consumeParams = ConsumeParams.newBuilder().setPurchaseToken(purchase.getPurchaseToken()).build();
mBillingClient.consumeAsync(consumeParams, new ConsumeResponseListener() {
@Override
public void onConsumeResponse(@NonNull BillingResult billingResult, @NonNull String purchaseToken) {
// PPApplication.logE(TAG, "onConsumeResponse() response: " + billingResult.getResponseCode());
/*if (responseCode == BillingClient.BillingResponse.OK) {
// Handle the success of the consume operation.
// For example, increase the number of player's coins,
// that provide temporary benefits
}*/
}
});
}
};
// If Billing client was disconnected, we retry 1 time and if success, execute the query
startServiceConnectionIfNeeded(executeOnConnectedService);
}
Aggregations