Replaced BuyDialog with PurchaseActivity
This commit is contained in:
parent
344404c03f
commit
035792b3d0
16 changed files with 349 additions and 215 deletions
|
|
@ -49,7 +49,7 @@ public class App extends Application {
|
|||
|
||||
@Override
|
||||
public void onPurchaseHistoryRestored() {
|
||||
Toast.makeText(App.this, R.string.restored_previous_purchases_please_restart, Toast.LENGTH_LONG).show();
|
||||
Toast.makeText(App.this, R.string.restored_previous_purchase_please_restart, Toast.LENGTH_LONG).show();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
@ -63,7 +63,7 @@ public class App extends Application {
|
|||
}
|
||||
|
||||
public static boolean isProVersion() {
|
||||
return BuildConfig.DEBUG || app.billingProcessor.isPurchased(PRO_VERSION_PRODUCT_ID);
|
||||
return app.billingProcessor.isPurchased(PRO_VERSION_PRODUCT_ID);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
|||
|
|
@ -1,135 +0,0 @@
|
|||
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));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -21,6 +21,7 @@ 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.ui.activities.PurchaseActivity;
|
||||
import com.kabouzeid.gramophone.util.MusicUtil;
|
||||
import com.kabouzeid.gramophone.util.PreferenceUtil;
|
||||
import com.triggertrap.seekarc.SeekArc;
|
||||
|
|
@ -62,8 +63,7 @@ public class SleepTimerDialog extends DialogFragment {
|
|||
}
|
||||
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();
|
||||
startActivity(new Intent(getContext(), PurchaseActivity.class));
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -30,7 +30,6 @@ import com.kabouzeid.appthemehelper.util.ATHUtil;
|
|||
import com.kabouzeid.appthemehelper.util.NavigationViewUtil;
|
||||
import com.kabouzeid.gramophone.App;
|
||||
import com.kabouzeid.gramophone.R;
|
||||
import com.kabouzeid.gramophone.dialogs.BuyDialog;
|
||||
import com.kabouzeid.gramophone.dialogs.ChangelogDialog;
|
||||
import com.kabouzeid.gramophone.glide.SongGlideRequest;
|
||||
import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
|
||||
|
|
@ -57,6 +56,7 @@ public class MainActivity extends AbsSlidingMusicPanelActivity {
|
|||
|
||||
public static final String TAG = MainActivity.class.getSimpleName();
|
||||
public static final int APP_INTRO_REQUEST = 100;
|
||||
public static final int PURCHASE_REQUEST = 101;
|
||||
|
||||
private static final int LIBRARY = 0;
|
||||
private static final int FOLDERS = 1;
|
||||
|
|
@ -112,7 +112,7 @@ public class MainActivity extends AbsSlidingMusicPanelActivity {
|
|||
private void setMusicChooser(int key) {
|
||||
if (!App.isProVersion() && key == FOLDERS) {
|
||||
Toast.makeText(this, R.string.folder_view_is_a_pro_feature, Toast.LENGTH_LONG).show();
|
||||
BuyDialog.create().show(getSupportFragmentManager(), "BUY_DIALOG");
|
||||
startActivityForResult(new Intent(this, PurchaseActivity.class), PURCHASE_REQUEST);
|
||||
key = LIBRARY;
|
||||
}
|
||||
|
||||
|
|
@ -146,6 +146,12 @@ public class MainActivity extends AbsSlidingMusicPanelActivity {
|
|||
if (!hasPermissions()) {
|
||||
requestPermissions();
|
||||
}
|
||||
} else if (requestCode == PURCHASE_REQUEST) {
|
||||
if (resultCode == RESULT_OK) {
|
||||
if (App.isProVersion()) {
|
||||
setUpPro();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -169,7 +175,7 @@ public class MainActivity extends AbsSlidingMusicPanelActivity {
|
|||
NavigationViewUtil.setItemTextColors(navigationView, ThemeStore.textColorPrimary(this), accentColor);
|
||||
|
||||
if (App.isProVersion()) {
|
||||
navigationView.getMenu().removeGroup(R.id.navigation_drawer_menu_category_buy_pro);
|
||||
setUpPro();
|
||||
}
|
||||
navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
|
||||
@Override
|
||||
|
|
@ -196,7 +202,7 @@ public class MainActivity extends AbsSlidingMusicPanelActivity {
|
|||
new Handler().postDelayed(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
BuyDialog.create().show(getSupportFragmentManager(), "BUY_DIALOG");
|
||||
startActivityForResult(new Intent(MainActivity.this, PurchaseActivity.class), PURCHASE_REQUEST);
|
||||
}
|
||||
}, 200);
|
||||
break;
|
||||
|
|
@ -222,6 +228,10 @@ public class MainActivity extends AbsSlidingMusicPanelActivity {
|
|||
});
|
||||
}
|
||||
|
||||
private void setUpPro() {
|
||||
navigationView.getMenu().removeGroup(R.id.navigation_drawer_menu_category_buy_pro);
|
||||
}
|
||||
|
||||
private void setUpDrawerLayout() {
|
||||
setUpNavigationView();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,172 @@
|
|||
package com.kabouzeid.gramophone.ui.activities;
|
||||
|
||||
import android.content.Intent;
|
||||
import android.os.AsyncTask;
|
||||
import android.os.Bundle;
|
||||
import android.support.annotation.NonNull;
|
||||
import android.support.annotation.Nullable;
|
||||
import android.support.v7.widget.Toolbar;
|
||||
import android.util.Log;
|
||||
import android.view.View;
|
||||
import android.widget.Button;
|
||||
import android.widget.Toast;
|
||||
|
||||
import com.anjlab.android.iab.v3.BillingProcessor;
|
||||
import com.anjlab.android.iab.v3.TransactionDetails;
|
||||
import com.kabouzeid.appthemehelper.color.MaterialColor;
|
||||
import com.kabouzeid.gramophone.App;
|
||||
import com.kabouzeid.gramophone.R;
|
||||
import com.kabouzeid.gramophone.ui.activities.base.AbsBaseActivity;
|
||||
|
||||
import java.lang.ref.WeakReference;
|
||||
|
||||
import butterknife.BindView;
|
||||
import butterknife.ButterKnife;
|
||||
|
||||
public class PurchaseActivity extends AbsBaseActivity implements BillingProcessor.IBillingHandler {
|
||||
|
||||
public static final String TAG = PurchaseActivity.class.getSimpleName();
|
||||
|
||||
private static final int ACTIVITY_COLOR = MaterialColor.Green._500.getAsColor();
|
||||
|
||||
@BindView(R.id.toolbar)
|
||||
Toolbar toolbar;
|
||||
@BindView(R.id.restore_button)
|
||||
Button restoreButton;
|
||||
@BindView(R.id.purchase_button)
|
||||
Button purchaseButton;
|
||||
|
||||
private BillingProcessor billingProcessor;
|
||||
private AsyncTask restorePurchaseAsyncTask;
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
setContentView(R.layout.activity_purchase);
|
||||
setDrawUnderStatusbar(true);
|
||||
ButterKnife.bind(this);
|
||||
|
||||
setStatusbarColor(ACTIVITY_COLOR);
|
||||
setNavigationbarColor(ACTIVITY_COLOR);
|
||||
setTaskDescriptionColor(ACTIVITY_COLOR);
|
||||
|
||||
setSupportActionBar(toolbar);
|
||||
//noinspection ConstantConditions
|
||||
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
|
||||
getSupportActionBar().setTitle(getString(R.string.purchase) + " Phonograph Pro");
|
||||
|
||||
restoreButton.setEnabled(false);
|
||||
purchaseButton.setEnabled(false);
|
||||
|
||||
restoreButton.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
if (restorePurchaseAsyncTask == null || restorePurchaseAsyncTask.getStatus() != AsyncTask.Status.RUNNING) {
|
||||
restorePurchase();
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
purchaseButton.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
billingProcessor.purchase(PurchaseActivity.this, App.PRO_VERSION_PRODUCT_ID);
|
||||
}
|
||||
});
|
||||
|
||||
billingProcessor = new BillingProcessor(this, App.GOOGLE_PLAY_LICENSE_KEY, this);
|
||||
|
||||
|
||||
}
|
||||
|
||||
private void restorePurchase() {
|
||||
if (restorePurchaseAsyncTask != null) {
|
||||
restorePurchaseAsyncTask.cancel(false);
|
||||
}
|
||||
restorePurchaseAsyncTask = new RestorePurchaseAsyncTask(this).execute();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onProductPurchased(@NonNull String productId, @Nullable TransactionDetails details) {
|
||||
Toast.makeText(this, R.string.thank_you, Toast.LENGTH_SHORT).show();
|
||||
setResult(RESULT_OK);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPurchaseHistoryRestored() {
|
||||
if (App.isProVersion()) {
|
||||
Toast.makeText(this, R.string.restored_previous_purchase_please_restart, Toast.LENGTH_LONG).show();
|
||||
setResult(RESULT_OK);
|
||||
} else {
|
||||
Toast.makeText(this, R.string.no_purchase_found, Toast.LENGTH_SHORT).show();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBillingError(int errorCode, @Nullable Throwable error) {
|
||||
Log.e(TAG, "Billing error: code = " + errorCode, error);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBillingInitialized() {
|
||||
restoreButton.setEnabled(true);
|
||||
purchaseButton.setEnabled(true);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onActivityResult(int requestCode, int resultCode, Intent data) {
|
||||
if (!billingProcessor.handleActivityResult(requestCode, resultCode, data)) {
|
||||
super.onActivityResult(requestCode, resultCode, data);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDestroy() {
|
||||
if (billingProcessor != null) {
|
||||
billingProcessor.release();
|
||||
}
|
||||
super.onDestroy();
|
||||
}
|
||||
|
||||
private static class RestorePurchaseAsyncTask extends AsyncTask<Void, Void, Boolean> {
|
||||
private final WeakReference<PurchaseActivity> buyActivityWeakReference;
|
||||
|
||||
public RestorePurchaseAsyncTask(PurchaseActivity purchaseActivity) {
|
||||
this.buyActivityWeakReference = new WeakReference<>(purchaseActivity);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onPreExecute() {
|
||||
super.onPreExecute();
|
||||
PurchaseActivity purchaseActivity = buyActivityWeakReference.get();
|
||||
if (purchaseActivity != null) {
|
||||
Toast.makeText(purchaseActivity, R.string.restoring_purchase, Toast.LENGTH_SHORT).show();
|
||||
} else {
|
||||
cancel(false);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Boolean doInBackground(Void... params) {
|
||||
PurchaseActivity purchaseActivity = buyActivityWeakReference.get();
|
||||
if (purchaseActivity != null) {
|
||||
return purchaseActivity.billingProcessor.loadOwnedPurchasesFromGoogle();
|
||||
}
|
||||
cancel(false);
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onPostExecute(Boolean b) {
|
||||
super.onPostExecute(b);
|
||||
PurchaseActivity purchaseActivity = buyActivityWeakReference.get();
|
||||
if (purchaseActivity == null || b == null) return;
|
||||
|
||||
if (b) {
|
||||
purchaseActivity.onPurchaseHistoryRestored();
|
||||
} else {
|
||||
Toast.makeText(purchaseActivity, R.string.could_not_restore_purchase, Toast.LENGTH_SHORT).show();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -28,12 +28,9 @@ import com.kabouzeid.appthemehelper.util.ColorUtil;
|
|||
import com.kabouzeid.gramophone.App;
|
||||
import com.kabouzeid.gramophone.R;
|
||||
import com.kabouzeid.gramophone.appshortcuts.DynamicShortcutManager;
|
||||
import com.kabouzeid.gramophone.dialogs.BuyDialog;
|
||||
import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
|
||||
import com.kabouzeid.gramophone.misc.NonProAllowedColors;
|
||||
import com.kabouzeid.gramophone.preferences.NowPlayingScreenPreference;
|
||||
import com.kabouzeid.gramophone.preferences.NowPlayingScreenPreferenceDialog;
|
||||
import com.kabouzeid.gramophone.service.MusicService;
|
||||
import com.kabouzeid.gramophone.ui.activities.base.AbsBaseActivity;
|
||||
import com.kabouzeid.gramophone.util.NavigationUtil;
|
||||
import com.kabouzeid.gramophone.util.PreferenceUtil;
|
||||
|
|
@ -82,7 +79,7 @@ public class SettingsActivity extends AbsBaseActivity implements ColorChooserDia
|
|||
if (Arrays.binarySearch(NonProAllowedColors.PRIMARY_COLORS, selectedColor) < 0) {
|
||||
// color wasn't found
|
||||
Toast.makeText(this, R.string.only_the_first_5_colors_available, Toast.LENGTH_LONG).show();
|
||||
BuyDialog.create().show(getSupportFragmentManager(), "BUY_DIALOG");
|
||||
startActivity(new Intent(this, PurchaseActivity.class));
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
|
@ -96,7 +93,7 @@ public class SettingsActivity extends AbsBaseActivity implements ColorChooserDia
|
|||
if (Arrays.binarySearch(NonProAllowedColors.ACCENT_COLORS, selectedColor) < 0) {
|
||||
// color wasn't found
|
||||
Toast.makeText(this, R.string.only_the_first_5_colors_available, Toast.LENGTH_LONG).show();
|
||||
BuyDialog.create().show(getSupportFragmentManager(), "BUY_DIALOG");
|
||||
startActivity(new Intent(this, PurchaseActivity.class));
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
|
@ -202,7 +199,7 @@ public class SettingsActivity extends AbsBaseActivity implements ColorChooserDia
|
|||
String themeName = (String) o;
|
||||
if (themeName.equals("black") && !App.isProVersion()) {
|
||||
Toast.makeText(getActivity(), R.string.black_theme_is_a_pro_feature, Toast.LENGTH_LONG).show();
|
||||
BuyDialog.create().show(getFragmentManager(), "BUY_DIALOG");
|
||||
startActivity(new Intent(getContext(), PurchaseActivity.class));
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue