Query for purchases in background

pull/795/head
Alex Baker 6 years ago
parent 8debdfac91
commit 5b929086f8

@ -1,6 +1,7 @@
package org.tasks.billing;
import static com.google.common.collect.Iterables.transform;
import static com.todoroo.andlib.utility.AndroidUtilities.assertMainThread;
import android.app.Activity;
import android.content.Context;
@ -16,6 +17,9 @@ import com.android.billingclient.api.SkuDetailsParams;
import com.android.billingclient.api.SkuDetailsParams.Builder;
import com.android.billingclient.api.SkuDetailsResponseListener;
import com.google.common.base.Joiner;
import io.reactivex.Single;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.schedulers.Schedulers;
import java.util.List;
import javax.inject.Inject;
import org.tasks.BuildConfig;
@ -88,31 +92,24 @@ public class BillingClient implements PurchasesUpdatedListener {
public void queryPurchases() {
Runnable queryToExecute =
() -> {
long time = System.currentTimeMillis();
PurchasesResult purchasesResult = billingClient.queryPurchases(SkuType.INAPP);
Timber.i("Querying purchases elapsed time: %sms", System.currentTimeMillis() - time);
// If there are subscriptions supported, we add subscription rows as well
Single<PurchasesResult> purchases =
Single.fromCallable(() -> billingClient.queryPurchases(SkuType.INAPP));
if (areSubscriptionsSupported()) {
PurchasesResult subscriptionResult = billingClient.queryPurchases(SkuType.SUBS);
Timber.i(
"Querying purchases and subscriptions elapsed time: %sms",
System.currentTimeMillis() - time);
Timber.i(
"Querying subscriptions result code: %s res: %s",
subscriptionResult.getResponseCode(), subscriptionResult.getPurchasesList());
if (subscriptionResult.getResponseCode() == BillingResponse.OK) {
purchasesResult.getPurchasesList().addAll(subscriptionResult.getPurchasesList());
} else {
Timber.e("Got an error response trying to query subscription purchases");
}
} else if (purchasesResult.getResponseCode() == BillingResponse.OK) {
Timber.i("Skipped subscription purchases query since they are not supported");
} else {
Timber.w(
"queryPurchases() got an error response code: %s",
purchasesResult.getResponseCode());
purchases =
Single.zip(
purchases,
Single.fromCallable(() -> billingClient.queryPurchases(SkuType.SUBS)),
(iaps, subs) -> {
if (subs.getResponseCode() == BillingResponse.OK) {
iaps.getPurchasesList().addAll(subs.getPurchasesList());
}
return iaps;
});
}
onQueryPurchasesFinished(purchasesResult);
purchases
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(this::onQueryPurchasesFinished);
};
executeServiceRequest(queryToExecute);
@ -120,6 +117,8 @@ public class BillingClient implements PurchasesUpdatedListener {
/** Handle a result from querying of purchases and report an updated list to the listener */
private void onQueryPurchasesFinished(PurchasesResult result) {
assertMainThread();
// Have we been disposed of in the meantime? If so, or bad result code, then quit
if (billingClient == null || result.getResponseCode() != BillingResponse.OK) {
Timber.w(

Loading…
Cancel
Save