/** * @param context application or activity context. Needed to bind to the in-app billing * service. * @param configuration billing configuration */ public Billing(@Nonnull Context context, @Nonnull Handler handler, @Nonnull Configuration configuration) { if (context instanceof Application) { // mContext.getApplicationContext() might return null for applications as we allow create Billing before // Application#onCreate is called mContext = context; } else { mContext = context.getApplicationContext(); } mMainThread = new MainThread(handler); mConfiguration = new StaticConfiguration(configuration); Check.isNotEmpty(mConfiguration.getPublicKey()); final Cache cache = configuration.getCache(); mCache = new ConcurrentCache(cache == null ? null : new SafeCache(cache)); mPlayStoreBroadcastReceiver = new PlayStoreBroadcastReceiver(mContext, mLock); }
@Override public int getPurchases(@Nonnull final String product, @Nullable final String continuationToken, @Nonnull RequestListener<Purchases> listener) { Check.isNotEmpty(product); return runWhenConnected(new GetPurchasesRequest(product, continuationToken, mConfiguration.getPurchaseVerifier()), wrapListener(listener), mTag); }
void setPurchaseVerifier(@Nonnull PurchaseVerifier purchaseVerifier) { mConfiguration.setPurchaseVerifier(purchaseVerifier); }
/** * Connects to the Billing service. Called automatically when first request is done, * Use {@link #disconnect()} to disconnect. * It's allowed to call this method several times, if service is already connected nothing will * happen. */ public void connect() { synchronized (mLock) { if (mState == State.CONNECTED) { executePendingRequests(); return; } if (mState == State.CONNECTING) { return; } if (mConfiguration.isAutoConnect() && mCheckoutCount <= 0) { warning("Auto connection feature is turned on. There is no need in calling Billing.connect() manually. See Billing.Configuration.isAutoConnect"); } setState(State.CONNECTING); mMainThread.execute(new Runnable() { @Override public void run() { connectOnMainThread(); } }); } }
void onCheckoutStopped() { Check.isMainThread(); synchronized (mLock) { mCheckoutCount--; if (mCheckoutCount < 0) { mCheckoutCount = 0; warning("Billing#onCheckoutStopped is called more than Billing#onCheckoutStarted"); } if (mCheckoutCount == 0 && mConfiguration.isAutoConnect()) { disconnect(); } } }
public void onCheckoutStarted() { Check.isMainThread(); synchronized (mLock) { mCheckoutCount++; if (mCheckoutCount > 0 && mConfiguration.isAutoConnect()) { connect(); } } }
@Override public int getAllPurchases(@Nonnull String product, @Nonnull RequestListener<Purchases> listener) { Check.isNotEmpty(product); final GetPurchasesRequest request = new GetPurchasesRequest(product, null, mConfiguration.getPurchaseVerifier()); return runWhenConnected(request, wrapListener(new GetAllPurchasesListener(request, listener)), mTag); }
@Override public int isPurchased(@Nonnull final String product, @Nonnull final String sku, @Nonnull final RequestListener<Boolean> listener) { Check.isNotEmpty(sku); final IsPurchasedListener isPurchasedListener = new IsPurchasedListener(sku, listener); final GetPurchasesRequest request = new GetPurchasesRequest(product, null, mConfiguration.getPurchaseVerifier()); isPurchasedListener.mRequest = request; return runWhenConnected(request, wrapListener(isPurchasedListener), mTag); }
@Nonnull PurchaseFlow createPurchaseFlow(@Nonnull IntentStarter intentStarter, int requestCode, @Nonnull RequestListener<Purchase> listener) { if (mCache.hasCache()) { listener = new RequestListenerWrapper<Purchase>(listener) { @Override public void onSuccess(@Nonnull Purchase result) { mCache.removeAll(RequestType.GET_PURCHASES.getCacheKeyType()); super.onSuccess(result); } }; } return new PurchaseFlow(intentStarter, requestCode, listener, mConfiguration.getPurchaseVerifier()); }