#1343 Billing client

This commit is contained in:
sictiru 2020-08-16 16:47:55 -07:00
parent 37064eafa2
commit e296d66fd2
5 changed files with 98 additions and 10 deletions

View file

@ -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 {

View file

@ -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);

View file

@ -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<String> 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.
}
}

View file

@ -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

View file

@ -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);
}
}