mirror of
https://github.com/viq/NewsBlur.git
synced 2025-09-18 21:43:31 +00:00
#1343 Billing client
This commit is contained in:
parent
37064eafa2
commit
e296d66fd2
5 changed files with 98 additions and 10 deletions
|
@ -30,6 +30,7 @@ dependencies {
|
||||||
implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0'
|
implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0'
|
||||||
implementation 'com.squareup.okhttp3:okhttp:3.12.12'
|
implementation 'com.squareup.okhttp3:okhttp:3.12.12'
|
||||||
implementation 'com.google.code.gson:gson:2.8.6'
|
implementation 'com.google.code.gson:gson:2.8.6'
|
||||||
|
implementation 'com.android.billingclient:billing:3.0.0'
|
||||||
}
|
}
|
||||||
|
|
||||||
android {
|
android {
|
||||||
|
|
|
@ -24,7 +24,6 @@ import com.newsblur.service.NBSyncService;
|
||||||
import com.newsblur.util.AppConstants;
|
import com.newsblur.util.AppConstants;
|
||||||
import com.newsblur.util.FeedSet;
|
import com.newsblur.util.FeedSet;
|
||||||
import com.newsblur.util.FeedUtils;
|
import com.newsblur.util.FeedUtils;
|
||||||
import com.newsblur.util.Log;
|
|
||||||
import com.newsblur.util.PrefConstants.ThemeValue;
|
import com.newsblur.util.PrefConstants.ThemeValue;
|
||||||
import com.newsblur.util.PrefsUtils;
|
import com.newsblur.util.PrefsUtils;
|
||||||
import com.newsblur.util.ReadFilter;
|
import com.newsblur.util.ReadFilter;
|
||||||
|
@ -354,7 +353,8 @@ public abstract class ItemsList extends NbActivity implements StoryOrderChangedL
|
||||||
if (q.length() < 1) {
|
if (q.length() < 1) {
|
||||||
updateFleuron(false);
|
updateFleuron(false);
|
||||||
q = null;
|
q = null;
|
||||||
} else if (!PrefsUtils.isPremium(this)) {
|
//TODO: change flag
|
||||||
|
} else if (PrefsUtils.isPremium(this)) {
|
||||||
updateFleuron(true);
|
updateFleuron(true);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -380,9 +380,7 @@ public abstract class ItemsList extends NbActivity implements StoryOrderChangedL
|
||||||
binding.footerFleuron.textSubscription.setText(R.string.premium_subscribers_search);
|
binding.footerFleuron.textSubscription.setText(R.string.premium_subscribers_search);
|
||||||
binding.footerFleuron.containerSubscribe.setVisibility(View.VISIBLE);
|
binding.footerFleuron.containerSubscribe.setVisibility(View.VISIBLE);
|
||||||
binding.footerFleuron.getRoot().setVisibility(View.VISIBLE);
|
binding.footerFleuron.getRoot().setVisibility(View.VISIBLE);
|
||||||
binding.footerFleuron.containerSubscribe.setOnClickListener(view -> {
|
binding.footerFleuron.containerSubscribe.setOnClickListener(view -> UIUtils.startPremiumActivity(this));
|
||||||
// Log.d(this, "Open subscription page");
|
|
||||||
});
|
|
||||||
} else {
|
} else {
|
||||||
transaction.show(itemSetFragment);
|
transaction.show(itemSetFragment);
|
||||||
binding.footerFleuron.containerSubscribe.setVisibility(View.GONE);
|
binding.footerFleuron.containerSubscribe.setVisibility(View.GONE);
|
||||||
|
|
|
@ -4,7 +4,18 @@ import android.graphics.Paint;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.text.util.Linkify;
|
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.R;
|
||||||
import com.newsblur.databinding.ActivityPremiumBinding;
|
import com.newsblur.databinding.ActivityPremiumBinding;
|
||||||
import com.newsblur.util.AppConstants;
|
import com.newsblur.util.AppConstants;
|
||||||
|
@ -12,9 +23,13 @@ import com.newsblur.util.BetterLinkMovementMethod;
|
||||||
import com.newsblur.util.FeedUtils;
|
import com.newsblur.util.FeedUtils;
|
||||||
import com.newsblur.util.UIUtils;
|
import com.newsblur.util.UIUtils;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
public class Premium extends NbActivity {
|
public class Premium extends NbActivity {
|
||||||
|
|
||||||
private ActivityPremiumBinding binding;
|
private ActivityPremiumBinding binding;
|
||||||
|
private BillingClient billingClient;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onCreate(Bundle bundle) {
|
protected void onCreate(Bundle bundle) {
|
||||||
|
@ -22,6 +37,11 @@ public class Premium extends NbActivity {
|
||||||
binding = ActivityPremiumBinding.inflate(getLayoutInflater());
|
binding = ActivityPremiumBinding.inflate(getLayoutInflater());
|
||||||
setContentView(binding.getRoot());
|
setContentView(binding.getRoot());
|
||||||
|
|
||||||
|
setupUI();
|
||||||
|
setupBillingClient();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setupUI() {
|
||||||
UIUtils.setCustomActionBar(this, R.drawable.logo, getString(R.string.premium_toolbar_title));
|
UIUtils.setCustomActionBar(this, R.drawable.logo, getString(R.string.premium_toolbar_title));
|
||||||
|
|
||||||
// linkify before setting the string resource
|
// 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);
|
binding.textSubscriptionTitle.setPaintFlags(binding.textSubscriptionTitle.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);
|
||||||
FeedUtils.iconLoader.displayImage(AppConstants.SHILOH_PHOTO_URL, binding.imgShiloh, 0, false);
|
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.
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,7 +27,6 @@ import com.newsblur.domain.Story;
|
||||||
import com.newsblur.service.NBSyncService;
|
import com.newsblur.service.NBSyncService;
|
||||||
import com.newsblur.util.FeedSet;
|
import com.newsblur.util.FeedSet;
|
||||||
import com.newsblur.util.FeedUtils;
|
import com.newsblur.util.FeedUtils;
|
||||||
import com.newsblur.util.Log;
|
|
||||||
import com.newsblur.util.PrefsUtils;
|
import com.newsblur.util.PrefsUtils;
|
||||||
import com.newsblur.util.ReadFilter;
|
import com.newsblur.util.ReadFilter;
|
||||||
import com.newsblur.util.StoryListStyle;
|
import com.newsblur.util.StoryListStyle;
|
||||||
|
@ -141,9 +140,7 @@ public class ItemSetFragment extends NbFragment implements LoaderManager.LoaderC
|
||||||
UIUtils.getColor(getActivity(), R.color.refresh_4));
|
UIUtils.getColor(getActivity(), R.color.refresh_4));
|
||||||
|
|
||||||
fleuronBinding.getRoot().setVisibility(View.INVISIBLE);
|
fleuronBinding.getRoot().setVisibility(View.INVISIBLE);
|
||||||
fleuronBinding.containerSubscribe.setOnClickListener(view -> {
|
fleuronBinding.containerSubscribe.setOnClickListener(view -> UIUtils.startPremiumActivity(requireContext()));
|
||||||
// Log.d(this, "Show subscribe page");
|
|
||||||
});
|
|
||||||
|
|
||||||
binding.itemgridfragmentGrid.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
|
binding.itemgridfragmentGrid.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -586,6 +586,12 @@ public class UIUtils {
|
||||||
boolean isPremium = PrefsUtils.isPremium(context);
|
boolean isPremium = PrefsUtils.isPremium(context);
|
||||||
boolean requiresPremium = feedSet.isFolder() || feedSet.isInfrequent() ||
|
boolean requiresPremium = feedSet.isFolder() || feedSet.isInfrequent() ||
|
||||||
feedSet.isAllNormal() || feedSet.isGlobalShared() || feedSet.isSingleSavedTag();
|
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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue