use of com.codename1.payment.PendingPurchaseCallback 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());
}
}
Aggregations