use of com.soomla.store.billing.IabPurchase in project android-store by soomla.
the class SoomlaStore method handleVerificationStarted.
/**
* Posts an event about the start of verification for the purchase, or an unexpected
* error event if the item was not found.
*
* @param purchases List of purchases to handle.
*/
private void handleVerificationStarted(List<IabPurchase> purchases) {
for (IabPurchase purchase : purchases) {
String sku = purchase.getSku();
try {
PurchasableVirtualItem v = StoreInfo.getPurchasableItem(sku);
BusProvider.getInstance().post(new VerificationStartedEvent(v));
} catch (VirtualItemNotFoundException e) {
SoomlaUtils.LogError(TAG, "(purchaseActionResultCancelled) ERROR : Couldn't find the " + "VirtualCurrencyPack OR MarketItem with productId: " + sku + ". It's unexpected so an unexpected error is being emitted.");
BusProvider.getInstance().post(new UnexpectedStoreErrorEvent());
}
}
}
use of com.soomla.store.billing.IabPurchase in project android-store by soomla.
the class SoomlaStore method buyWithMarket.
/**
* Starts a purchase process in the market.
*
* @param marketItem The item to purchase - this item has to be defined EXACTLY the same in
* the market
* @param isSubscription determines if subscription is purchasing
* @param payload A payload to get back when this purchase is finished.
* @throws IllegalStateException
*/
public void buyWithMarket(final MarketItem marketItem, final boolean isSubscription, final String payload) throws IllegalStateException {
if (mInAppBillingService == null) {
SoomlaUtils.LogError(TAG, "Billing service is not loaded. Can't invoke buyWithMarket.");
return;
}
final PurchasableVirtualItem pvi;
try {
pvi = StoreInfo.getPurchasableItem(marketItem.getProductId());
} catch (VirtualItemNotFoundException e) {
SoomlaUtils.LogError(TAG, "Couldn't find a purchasable item associated with: " + marketItem.getProductId());
BusProvider.getInstance().post(new UnexpectedStoreErrorEvent(UnexpectedStoreErrorEvent.ErrorCode.PURCHASE_FAIL));
return;
}
mInAppBillingService.initializeBillingService(new IabCallbacks.IabInitListener() {
@Override
public void success(boolean alreadyInBg) {
if (!alreadyInBg) {
notifyIabServiceStarted();
}
IabCallbacks.OnPurchaseListener purchaseListener = new IabCallbacks.OnPurchaseListener() {
@Override
public void success(IabPurchase purchase) {
handleSuccessfulPurchase(purchase, false);
}
@Override
public void cancelled(IabPurchase purchase) {
handleCancelledPurchase(purchase);
}
@Override
public void alreadyOwned(IabPurchase purchase) {
String sku = purchase.getSku();
SoomlaUtils.LogDebug(TAG, "Tried to buy an item that was not" + " consumed (maybe it's an already owned " + "non-consumable). productId: " + sku);
try {
PurchasableVirtualItem pvi = StoreInfo.getPurchasableItem(sku);
consumeIfConsumable(purchase, pvi);
if (StoreInfo.isItemNonConsumable(pvi)) {
SoomlaUtils.LogDebug(TAG, "(alreadyOwned) the user tried to " + "buy a non-consumable that was already " + "owned. itemId: " + pvi.getItemId() + " productId: " + sku);
BusProvider.getInstance().post(new UnexpectedStoreErrorEvent(UnexpectedStoreErrorEvent.ErrorCode.PURCHASE_FAIL));
}
} catch (VirtualItemNotFoundException e) {
SoomlaUtils.LogError(TAG, "(alreadyOwned) ERROR : Couldn't find the " + "VirtualCurrencyPack with productId: " + sku + ". It's unexpected so an unexpected error is being emitted.");
BusProvider.getInstance().post(new UnexpectedStoreErrorEvent(UnexpectedStoreErrorEvent.ErrorCode.PURCHASE_FAIL));
}
}
@Override
public void fail(String message) {
handleErrorResult(UnexpectedStoreErrorEvent.ErrorCode.PURCHASE_FAIL, message);
}
@Override
public void verificationStarted(List<IabPurchase> purchases) {
handleVerificationStarted(purchases);
}
};
BusProvider.getInstance().post(new MarketPurchaseStartedEvent(pvi, getInAppBillingService().shouldVerifyPurchases()));
try {
if (isSubscription) {
mInAppBillingService.launchPurchaseFlow(IabHelper.ITEM_TYPE_SUBS, marketItem.getProductId(), purchaseListener, payload);
} else {
mInAppBillingService.launchPurchaseFlow(IabHelper.ITEM_TYPE_INAPP, marketItem.getProductId(), purchaseListener, payload);
}
} catch (IllegalStateException ex) {
SoomlaUtils.LogError(TAG, "Can't proceed with launchPurchaseFlow. error: " + ex.getMessage());
purchaseListener.fail("Can't proceed with launchPurchaseFlow. error: " + ex.getMessage());
}
}
@Override
public void fail(String message) {
reportIabInitFailure(message);
}
});
}
use of com.soomla.store.billing.IabPurchase in project android-store by soomla.
the class SoomlaStore method restoreTransactions.
/**
* Restoring old purchases for the current user (device).
*/
public void restoreTransactions() {
if (mInAppBillingService == null) {
SoomlaUtils.LogError(TAG, "Billing service is not loaded. Can't invoke restoreTransactions.");
return;
}
mInAppBillingService.initializeBillingService(new IabCallbacks.IabInitListener() {
@Override
public void success(boolean alreadyInBg) {
if (!alreadyInBg) {
notifyIabServiceStarted();
}
SoomlaUtils.LogDebug(TAG, "Setup successful, restoring purchases");
IabCallbacks.OnRestorePurchasesListener restorePurchasesListener = new IabCallbacks.OnRestorePurchasesListener() {
@Override
public void success(List<IabPurchase> purchases) {
SoomlaUtils.LogDebug(TAG, "Transactions restored");
if (purchases.size() > 0) {
if (SoomlaConfig.logDebug) {
String ownedSkus = "";
for (IabPurchase purchase : purchases) {
ownedSkus += purchase.getSku() + " / ";
}
SoomlaUtils.LogDebug(TAG, "Got owned items: " + ownedSkus);
}
handleSuccessfulPurchases(purchases, true, new HandleSuccessfulPurchasesFinishedHandler() {
@Override
public void onFinished() {
// Restore transactions always finished successfully even if
// something wrong happened when handling a specific item.
BusProvider.getInstance().post(new RestoreTransactionsFinishedEvent(true));
}
});
} else {
BusProvider.getInstance().post(new RestoreTransactionsFinishedEvent(true));
}
}
@Override
public void fail(String message) {
BusProvider.getInstance().post(new RestoreTransactionsFinishedEvent(false));
handleErrorResult(UnexpectedStoreErrorEvent.ErrorCode.GENERAL, message);
}
@Override
public void verificationStarted(List<IabPurchase> purchases) {
handleVerificationStarted(purchases);
}
};
IabCallbacks.OnRestorePurchasesListener restoreSubscriptionsListener = new IabCallbacks.OnRestorePurchasesListener() {
@Override
public void success(List<IabPurchase> purchases) {
// collect subscription ids list
List<String> subscriptionIds = new ArrayList<String>();
for (IabPurchase purchase : purchases) {
subscriptionIds.add(purchase.getSku());
}
// collect subscriptionVG list
List<VirtualGood> subscriptions = new ArrayList<VirtualGood>();
for (VirtualGood good : StoreInfo.getGoods()) {
if ((good.getPurchaseType() instanceof PurchaseWithMarket) && ((PurchaseWithMarket) good.getPurchaseType()).isSubscription()) {
subscriptions.add(good);
}
}
// give unset subscriptions and take expired
for (VirtualGood subscription : subscriptions) {
String productId = ((PurchaseWithMarket) subscription.getPurchaseType()).getMarketItem().getProductId();
if (subscriptionIds.contains(productId)) {
// TODO: is here should be 1 to give? Maybe current item has not only just 0/1 state
subscription.give(1, false);
} else {
try {
subscription.take(StoreInventory.getVirtualItemBalance(subscription.getItemId()), false);
} catch (VirtualItemNotFoundException ex) {
// possibly unreachable block
}
}
}
// TODO: Should we notify user about repaired or expired subscriptions?
}
@Override
public void fail(String message) {
SoomlaUtils.LogDebug(TAG, "Subscriptions restoring failed: " + message);
}
@Override
public void verificationStarted(List<IabPurchase> purchases) {
// should we do it in subscription restoring? possibly it should be empty
}
};
try {
mInAppBillingService.restorePurchasesAsync(restorePurchasesListener);
} catch (IllegalStateException ex) {
SoomlaUtils.LogError(TAG, "Can't proceed with restorePurchases. error: " + ex.getMessage());
restorePurchasesListener.fail("Can't proceed with restorePurchases. error: " + ex.getMessage());
}
}
@Override
public void fail(String message) {
reportIabInitFailure(message);
}
});
}
Aggregations