From e296d66fd261ababc74c8086569ea9d45b35fbcd Mon Sep 17 00:00:00 2001 From: sictiru Date: Sun, 16 Aug 2020 16:47:55 -0700 Subject: [PATCH] #1343 Billing client --- clients/android/NewsBlur/build.gradle | 1 + .../src/com/newsblur/activity/ItemsList.java | 8 +- .../src/com/newsblur/activity/Premium.java | 86 +++++++++++++++++++ .../newsblur/fragment/ItemSetFragment.java | 5 +- .../src/com/newsblur/util/UIUtils.java | 8 +- 5 files changed, 98 insertions(+), 10 deletions(-) diff --git a/clients/android/NewsBlur/build.gradle b/clients/android/NewsBlur/build.gradle index db89e4312..bfdc0b15d 100644 --- a/clients/android/NewsBlur/build.gradle +++ b/clients/android/NewsBlur/build.gradle @@ -30,6 +30,7 @@ dependencies { implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0' implementation 'com.squareup.okhttp3:okhttp:3.12.12' implementation 'com.google.code.gson:gson:2.8.6' + implementation 'com.android.billingclient:billing:3.0.0' } android { diff --git a/clients/android/NewsBlur/src/com/newsblur/activity/ItemsList.java b/clients/android/NewsBlur/src/com/newsblur/activity/ItemsList.java index 87bc04ad4..8797cce61 100644 --- a/clients/android/NewsBlur/src/com/newsblur/activity/ItemsList.java +++ b/clients/android/NewsBlur/src/com/newsblur/activity/ItemsList.java @@ -24,7 +24,6 @@ import com.newsblur.service.NBSyncService; import com.newsblur.util.AppConstants; import com.newsblur.util.FeedSet; import com.newsblur.util.FeedUtils; -import com.newsblur.util.Log; import com.newsblur.util.PrefConstants.ThemeValue; import com.newsblur.util.PrefsUtils; import com.newsblur.util.ReadFilter; @@ -354,7 +353,8 @@ public abstract class ItemsList extends NbActivity implements StoryOrderChangedL if (q.length() < 1) { updateFleuron(false); q = null; - } else if (!PrefsUtils.isPremium(this)) { + //TODO: change flag + } else if (PrefsUtils.isPremium(this)) { updateFleuron(true); return; } @@ -380,9 +380,7 @@ public abstract class ItemsList extends NbActivity implements StoryOrderChangedL binding.footerFleuron.textSubscription.setText(R.string.premium_subscribers_search); binding.footerFleuron.containerSubscribe.setVisibility(View.VISIBLE); binding.footerFleuron.getRoot().setVisibility(View.VISIBLE); - binding.footerFleuron.containerSubscribe.setOnClickListener(view -> { -// Log.d(this, "Open subscription page"); - }); + binding.footerFleuron.containerSubscribe.setOnClickListener(view -> UIUtils.startPremiumActivity(this)); } else { transaction.show(itemSetFragment); binding.footerFleuron.containerSubscribe.setVisibility(View.GONE); diff --git a/clients/android/NewsBlur/src/com/newsblur/activity/Premium.java b/clients/android/NewsBlur/src/com/newsblur/activity/Premium.java index d73580e5e..20b4a7aea 100644 --- a/clients/android/NewsBlur/src/com/newsblur/activity/Premium.java +++ b/clients/android/NewsBlur/src/com/newsblur/activity/Premium.java @@ -4,7 +4,18 @@ import android.graphics.Paint; import android.net.Uri; import android.os.Bundle; import android.text.util.Linkify; +import android.util.Log; +import androidx.annotation.NonNull; + +import com.android.billingclient.api.BillingClient; +import com.android.billingclient.api.BillingClientStateListener; +import com.android.billingclient.api.BillingFlowParams; +import com.android.billingclient.api.BillingResult; +import com.android.billingclient.api.Purchase; +import com.android.billingclient.api.PurchasesUpdatedListener; +import com.android.billingclient.api.SkuDetails; +import com.android.billingclient.api.SkuDetailsParams; import com.newsblur.R; import com.newsblur.databinding.ActivityPremiumBinding; import com.newsblur.util.AppConstants; @@ -12,9 +23,13 @@ import com.newsblur.util.BetterLinkMovementMethod; import com.newsblur.util.FeedUtils; import com.newsblur.util.UIUtils; +import java.util.ArrayList; +import java.util.List; + public class Premium extends NbActivity { private ActivityPremiumBinding binding; + private BillingClient billingClient; @Override protected void onCreate(Bundle bundle) { @@ -22,6 +37,11 @@ public class Premium extends NbActivity { binding = ActivityPremiumBinding.inflate(getLayoutInflater()); setContentView(binding.getRoot()); + setupUI(); + setupBillingClient(); + } + + private void setupUI() { UIUtils.setCustomActionBar(this, R.drawable.logo, getString(R.string.premium_toolbar_title)); // linkify before setting the string resource @@ -34,4 +54,70 @@ public class Premium extends NbActivity { binding.textSubscriptionTitle.setPaintFlags(binding.textSubscriptionTitle.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG); FeedUtils.iconLoader.displayImage(AppConstants.SHILOH_PHOTO_URL, binding.imgShiloh, 0, false); } + + private void setupBillingClient() { + PurchasesUpdatedListener purchaseUpdateListener = (billingResult, purchases) -> { + // To be implemented + if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK && purchases != null) { + for (Purchase purchase : purchases) { + // handle purchase + } + } else if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.USER_CANCELED) { + // Handle an error caused by a user cancelling the purchase flow. + } else { + // Handle any other error codes. + } + }; + + billingClient = BillingClient.newBuilder(this) + .setListener(purchaseUpdateListener) + .enablePendingPurchases() + .build(); + + billingClient.startConnection(new BillingClientStateListener() { + @Override + public void onBillingSetupFinished(@NonNull BillingResult billingResult) { + if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) { + // The BillingClient is ready. You can query purchases here. + Log.d(Premium.this.getLocalClassName(), "onBillingSetupFinished - message: " + billingResult.getDebugMessage() + " | response code: " + billingResult.getResponseCode()); + } + } + + @Override + public void onBillingServiceDisconnected() { + Log.d(Premium.this.getLocalClassName(), "onBillingServiceDisconnected"); + // Try to restart the connection on the next request to + // Google Play by calling the startConnection() method. + } + }); + + List skuList = new ArrayList<>(); + // add sub SKUs from Play Store + skuList.add("premium_subscription"); + SkuDetailsParams.Builder params = SkuDetailsParams.newBuilder(); + params.setSkusList(skuList).setType(BillingClient.SkuType.SUBS); + billingClient.querySkuDetailsAsync(params.build(), (billingResult, skuDetailsList) -> { + // Process the result. + Log.d(Premium.this.getLocalClassName(), "SkuDetailsResponse - result message: " + billingResult.getDebugMessage() + " | result response code: " + billingResult.getResponseCode()); + if (skuDetailsList != null) { + for (SkuDetails skuDetails : skuDetailsList) { + Log.d(Premium.this.getLocalClassName(), "Sku detail: " + skuDetails.getTitle() + " | " + skuDetails.getDescription() + " | " + skuDetails.getPrice() + " | " + skuDetails.getSku()); + } + } else { + Log.d(Premium.this.getLocalClassName(), "Empty sku list"); + } + }); + } + + private void launchBillingFlow(@NonNull SkuDetails skuDetails) { + Log.d(Premium.this.getLocalClassName(), "launchBillingFlow"); + // Retrieve a value for "skuDetails" by calling querySkuDetailsAsync(). + BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder() + .setSkuDetails(skuDetails) + .build(); + int responseCode = billingClient.launchBillingFlow(this, billingFlowParams).getResponseCode(); + + // Handle the result. + + } } diff --git a/clients/android/NewsBlur/src/com/newsblur/fragment/ItemSetFragment.java b/clients/android/NewsBlur/src/com/newsblur/fragment/ItemSetFragment.java index afaeb44b6..e7ab4cbc0 100644 --- a/clients/android/NewsBlur/src/com/newsblur/fragment/ItemSetFragment.java +++ b/clients/android/NewsBlur/src/com/newsblur/fragment/ItemSetFragment.java @@ -27,7 +27,6 @@ import com.newsblur.domain.Story; import com.newsblur.service.NBSyncService; import com.newsblur.util.FeedSet; import com.newsblur.util.FeedUtils; -import com.newsblur.util.Log; import com.newsblur.util.PrefsUtils; import com.newsblur.util.ReadFilter; import com.newsblur.util.StoryListStyle; @@ -141,9 +140,7 @@ public class ItemSetFragment extends NbFragment implements LoaderManager.LoaderC UIUtils.getColor(getActivity(), R.color.refresh_4)); fleuronBinding.getRoot().setVisibility(View.INVISIBLE); - fleuronBinding.containerSubscribe.setOnClickListener(view -> { -// Log.d(this, "Show subscribe page"); - }); + fleuronBinding.containerSubscribe.setOnClickListener(view -> UIUtils.startPremiumActivity(requireContext())); binding.itemgridfragmentGrid.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() { @Override diff --git a/clients/android/NewsBlur/src/com/newsblur/util/UIUtils.java b/clients/android/NewsBlur/src/com/newsblur/util/UIUtils.java index c38167519..d03c8bef3 100644 --- a/clients/android/NewsBlur/src/com/newsblur/util/UIUtils.java +++ b/clients/android/NewsBlur/src/com/newsblur/util/UIUtils.java @@ -586,6 +586,12 @@ public class UIUtils { boolean isPremium = PrefsUtils.isPremium(context); boolean requiresPremium = feedSet.isFolder() || feedSet.isInfrequent() || feedSet.isAllNormal() || feedSet.isGlobalShared() || feedSet.isSingleSavedTag(); - return isPremium && requiresPremium; + //TODO: change flag + return !(isPremium && requiresPremium); + } + + public static void startPremiumActivity(Context context) { + Intent intent = new Intent(context, Premium.class); + context.startActivity(intent); } }