/* * Copyright (C) 2017 Vasily Styagov. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package io.octo.bear.pago; import android.content.Context; import java.util.List; import io.octo.bear.pago.model.entity.Inventory; import io.octo.bear.pago.model.entity.Order; import io.octo.bear.pago.model.entity.PurchaseType; import rx.Completable; import rx.Single; /** * Created by shc on 14.07.16. * <p> * This class is entry point to the wonderful world of Play Store in-app purchases. <br/> * There's couple of wrapped in Rx methods for each purchase-related action (for products and subscriptions). <br/> * <b>Note</b>: presented observables don't have default scheduler, so it would work on thread where they were called. * Applying any schedulers stays up to you. * </p> */ public class Pago { static final int BILLING_API_VERSION = 3; private final Context context; /** * @param context * the context is needed to start IAB-related services */ public Pago(Context context) { this.context = context; } /** * Check if target version of billing API supports <i>in-app purchases</i>. * * @return single that emits {@code true} value if supported and Exception otherwise */ public Single<Boolean> checkPurchasesAvailability() { return new BillingAvailabilitySingle(context, PurchaseType.INAPP); } /** * Check if target version of billing API supports <i>subscriptions</i>. * * @return single that emits {@code true} value if supported and Exception otherwise */ public Single<Boolean> checkSubscriptionAvailability() { return new BillingAvailabilitySingle(context, PurchaseType.SUBSCRIPTION); } /** * Use this method to query details about desired <i>products</i> (title, price, descriptions etc). * * @param skus * list of desired items' product IDs * @return {@link Inventory}, that represents collection of described products */ public Single<Inventory> obtainProductsDetails(final List<String> skus) { return new ProductDetailsSingle(context, PurchaseType.INAPP, skus); } /** * Use this method to query details about desired <i>subscriptions</i> (title, price, descriptions etc). * * @param skus * list of desired items' product IDs * @return {@link Inventory}, that represents collection of described products */ public Single<Inventory> obtainSubscriptionsDetails(final List<String> skus) { return new ProductDetailsSingle(context, PurchaseType.SUBSCRIPTION, skus); } /** * Here you can start to spend your money. This method starts <i>product</i> purchase flow and performs purchase. * * @param sku * product id of desired product * @param payload * some arbitrary data, that purchased item info will contain * @return {@link Single} emits {@link Order} containing purchased item info and signature */ public Single<Order> purchaseProduct(final String sku, final String payload) { return new PerformPurchaseSingle(context, PurchaseType.INAPP, sku, payload); } /** * Here you can start to spend your money. This method starts <i>subscription</i> purchase flow and performs purchase. * * @param sku * product id of desired product * @param payload * some arbitrary data, that purchased item info will contain * @return {@link Single} that emits {@link Order} containing purchased item info and signature */ public Single<Order> purchaseSubscription(final String sku, final String payload) { return new PerformPurchaseSingle(context, PurchaseType.SUBSCRIPTION, sku, payload); } /** * Use this method to check <i>products</i>, that user has already bought. * * @return {@link Single} that emits {@link Order} containing purchased products data */ public Single<List<Order>> obtainPurchasedProducts() { return new PurchasedItemsSingle(context, PurchaseType.INAPP); } /** * Use this method to check <i>subscription</i>, that user has already bought. * * @return {@link Single} that emits {@link Order} containing purchased subscriptions data */ public Single<List<Order>> obtainPurchasedSubscriptions() { return new PurchasedItemsSingle(context, PurchaseType.SUBSCRIPTION); } /** * If user already owns some product, Google Play would prevent user from purchasing another product with the same * product id. You have to consume this purchase and make the product available again. * And yes, you can do it with this method. <br/> * <b>Note:</b> subscriptions cannot be consumed. * * @param purchaseToken * token of purchased product, can be taken from {@link Order} * @return {@link Completable} that notifies you about either successful consumption, or error */ public Completable consumeProduct(final String purchaseToken) { return new ConsumePurchaseCompletable(context, purchaseToken); } }