Add pro version

This commit is contained in:
Karim Abou Zeid 2017-08-30 20:52:01 +02:00
commit 1b85252f92
11 changed files with 354 additions and 12 deletions

View file

@ -0,0 +1,135 @@
package com.kabouzeid.gramophone.dialogs;
import android.app.Dialog;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.DialogFragment;
import android.util.Log;
import android.widget.Toast;
import com.afollestad.materialdialogs.DialogAction;
import com.afollestad.materialdialogs.MaterialDialog;
import com.afollestad.materialdialogs.internal.MDButton;
import com.anjlab.android.iab.v3.BillingProcessor;
import com.anjlab.android.iab.v3.SkuDetails;
import com.anjlab.android.iab.v3.TransactionDetails;
import com.kabouzeid.gramophone.App;
import com.kabouzeid.gramophone.BuildConfig;
import com.kabouzeid.gramophone.R;
import java.lang.ref.WeakReference;
/**
* @author Karim Abou Zeid (kabouzeid)
*/
public class BuyDialog extends DialogFragment implements BillingProcessor.IBillingHandler {
public static final String TAG = BuyDialog.class.getSimpleName();
private BillingProcessor billingProcessor;
private AsyncTask skuDetailsLoadAsyncTask;
public static BuyDialog create() {
return new BuyDialog();
}
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
billingProcessor = new BillingProcessor(getContext(), App.GOOGLE_PLAY_LICENSE_KEY, this);
return new MaterialDialog.Builder(getContext())
.title(R.string.buy_pro)
.content("Unlock all features, such as:\n• Folder view\n• All theme colors\n• Black theme\n• Sleep timer")
.positiveText(R.string.buy)
.onPositive(new MaterialDialog.SingleButtonCallback() {
@Override
public void onClick(@NonNull MaterialDialog materialDialog, @NonNull DialogAction dialogAction) {
billingProcessor.purchase(getActivity(), App.PRO_VERSION_PRODUCT_ID);
}
})
.build();
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (!billingProcessor.handleActivityResult(requestCode, resultCode, data)) {
super.onActivityResult(requestCode, resultCode, data);
}
}
@Override
public void onProductPurchased(String productId, TransactionDetails details) {
loadSkuDetails();
Toast.makeText(getContext(), R.string.thank_you, Toast.LENGTH_SHORT).show();
}
@Override
public void onPurchaseHistoryRestored() {
loadSkuDetails();
Toast.makeText(getContext(), R.string.restored_previous_purchases_please_restart, Toast.LENGTH_LONG).show();
}
@Override
public void onBillingError(int errorCode, Throwable error) {
Log.e(TAG, "Billing error: code = " + errorCode, error);
}
@Override
public void onBillingInitialized() {
loadSkuDetails();
}
@Override
public void onDestroy() {
if (billingProcessor != null) {
billingProcessor.release();
}
if (skuDetailsLoadAsyncTask != null) {
skuDetailsLoadAsyncTask.cancel(true);
}
super.onDestroy();
}
private void loadSkuDetails() {
if (skuDetailsLoadAsyncTask != null) {
skuDetailsLoadAsyncTask.cancel(false);
}
skuDetailsLoadAsyncTask = new SkuDetailsLoadAsyncTask(this).execute();
}
private static class SkuDetailsLoadAsyncTask extends AsyncTask<Void, Void, SkuDetails> {
private final WeakReference<BuyDialog> donationDialogWeakReference;
public SkuDetailsLoadAsyncTask(BuyDialog donationsDialog) {
this.donationDialogWeakReference = new WeakReference<>(donationsDialog);
}
@Override
protected SkuDetails doInBackground(Void... params) {
BuyDialog dialog = donationDialogWeakReference.get();
if (dialog != null) {
return dialog.billingProcessor.getPurchaseListingDetails(App.PRO_VERSION_PRODUCT_ID);
}
cancel(false);
return null;
}
@Override
protected void onPostExecute(SkuDetails skuDetails) {
super.onPostExecute(skuDetails);
BuyDialog dialog = donationDialogWeakReference.get();
if (dialog == null) return;
if (skuDetails == null) {
if (!BuildConfig.DEBUG) dialog.dismiss();
return;
}
MDButton positiveButton = ((MaterialDialog) dialog.getDialog()).getActionButton(DialogAction.POSITIVE);
positiveButton.setText(String.format("%s %s", dialog.getString(R.string.buy), skuDetails.priceText));
}
}
}

View file

@ -92,7 +92,6 @@ public class DonationsDialog extends DialogFragment implements BillingProcessor.
@Override
public void onPurchaseHistoryRestored() {
loadSkuDetails();
Toast.makeText(getContext(), R.string.restored_previous_purchases, Toast.LENGTH_SHORT).show();
}
@Override

View file

@ -18,6 +18,7 @@ import android.widget.Toast;
import com.afollestad.materialdialogs.DialogAction;
import com.afollestad.materialdialogs.MaterialDialog;
import com.afollestad.materialdialogs.internal.ThemeSingleton;
import com.kabouzeid.gramophone.App;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.service.MusicService;
import com.kabouzeid.gramophone.util.MusicUtil;
@ -59,6 +60,13 @@ public class SleepTimerDialog extends DialogFragment {
if (getActivity() == null) {
return;
}
if (!App.isProVersion()) {
Toast.makeText(getActivity(), getString(R.string.sleep_timer_is_a_pro_feature), Toast.LENGTH_LONG).show();
BuyDialog.create().show(getFragmentManager(), "BUY_DIALOG");
dismiss();
return;
}
final int minutes = seekArcProgress;
PendingIntent pi = makeTimerPendingIntent(PendingIntent.FLAG_CANCEL_CURRENT);