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

@ -2,7 +2,10 @@ package com.kabouzeid.gramophone;
import android.app.Application; import android.app.Application;
import android.os.Build; import android.os.Build;
import android.widget.Toast;
import com.anjlab.android.iab.v3.BillingProcessor;
import com.anjlab.android.iab.v3.TransactionDetails;
import com.crashlytics.android.Crashlytics; import com.crashlytics.android.Crashlytics;
import com.crashlytics.android.core.CrashlyticsCore; import com.crashlytics.android.core.CrashlyticsCore;
import com.kabouzeid.gramophone.appshortcuts.DynamicShortcutManager; import com.kabouzeid.gramophone.appshortcuts.DynamicShortcutManager;
@ -13,11 +16,19 @@ import io.fabric.sdk.android.Fabric;
* @author Karim Abou Zeid (kabouzeid) * @author Karim Abou Zeid (kabouzeid)
*/ */
public class App extends Application { public class App extends Application {
public static final String TAG = App.class.getSimpleName();
public static final String GOOGLE_PLAY_LICENSE_KEY = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAjMeADN5Ffnt/ml5SYxNPCn8kGcOYGpHEfNSCts99vVxqmCn6C01E94c17j7rUK2aeHur5uxphZylzopPlQ8P8l1fqty0GPUNRSo18FCJzfGH8HZAwZYOcnRFPaXdaq3InyFJhBiODh2oeAcVK/idH6QraQ4r9HIlzigAg6lgwzxl2wJKDh7X/GMdDntCyzDh8xDQ0wIawFgvgojHwqh2Ci8Gnq6EYRwPA9yHiIIksT8Q30QyM5ewl5QcnWepsls7enNqeHarhpmSibRUDgCsxHoOpny7SyuvZvUI3wuLckDR0ds9hrt614scHHqDOBp/qWCZiAgOPVAEQcURbV09qQIDAQAB"; public static final String GOOGLE_PLAY_LICENSE_KEY = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAjMeADN5Ffnt/ml5SYxNPCn8kGcOYGpHEfNSCts99vVxqmCn6C01E94c17j7rUK2aeHur5uxphZylzopPlQ8P8l1fqty0GPUNRSo18FCJzfGH8HZAwZYOcnRFPaXdaq3InyFJhBiODh2oeAcVK/idH6QraQ4r9HIlzigAg6lgwzxl2wJKDh7X/GMdDntCyzDh8xDQ0wIawFgvgojHwqh2Ci8Gnq6EYRwPA9yHiIIksT8Q30QyM5ewl5QcnWepsls7enNqeHarhpmSibRUDgCsxHoOpny7SyuvZvUI3wuLckDR0ds9hrt614scHHqDOBp/qWCZiAgOPVAEQcURbV09qQIDAQAB";
public static final String PRO_VERSION_PRODUCT_ID = "pro_version";
public static App app;
private BillingProcessor billingProcessor;
@Override @Override
public void onCreate() { public void onCreate() {
super.onCreate(); super.onCreate();
app = this;
// Set up Crashlytics, disabled for debug builds // Set up Crashlytics, disabled for debug builds
Crashlytics crashlyticsKit = new Crashlytics.Builder() Crashlytics crashlyticsKit = new Crashlytics.Builder()
@ -29,5 +40,35 @@ public class App extends Application {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1) {
new DynamicShortcutManager(this).initDynamicShortcuts(); new DynamicShortcutManager(this).initDynamicShortcuts();
} }
// automatically restores purchases
billingProcessor = new BillingProcessor(this, App.GOOGLE_PLAY_LICENSE_KEY, new BillingProcessor.IBillingHandler() {
@Override
public void onProductPurchased(String productId, TransactionDetails details) {
}
@Override
public void onPurchaseHistoryRestored() {
Toast.makeText(App.this, R.string.restored_previous_purchases_please_restart, Toast.LENGTH_LONG).show();
}
@Override
public void onBillingError(int errorCode, Throwable error) {
}
@Override
public void onBillingInitialized() {
}
});
}
public static boolean isProVersion() {
return false; //BuildConfig.DEBUG || app.billingProcessor.isPurchased(PRO_VERSION_PRODUCT_ID);
}
@Override
public void onTerminate() {
super.onTerminate();
billingProcessor.release();
} }
} }

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 @Override
public void onPurchaseHistoryRestored() { public void onPurchaseHistoryRestored() {
loadSkuDetails(); loadSkuDetails();
Toast.makeText(getContext(), R.string.restored_previous_purchases, Toast.LENGTH_SHORT).show();
} }
@Override @Override

View file

@ -18,6 +18,7 @@ import android.widget.Toast;
import com.afollestad.materialdialogs.DialogAction; import com.afollestad.materialdialogs.DialogAction;
import com.afollestad.materialdialogs.MaterialDialog; import com.afollestad.materialdialogs.MaterialDialog;
import com.afollestad.materialdialogs.internal.ThemeSingleton; import com.afollestad.materialdialogs.internal.ThemeSingleton;
import com.kabouzeid.gramophone.App;
import com.kabouzeid.gramophone.R; import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.service.MusicService; import com.kabouzeid.gramophone.service.MusicService;
import com.kabouzeid.gramophone.util.MusicUtil; import com.kabouzeid.gramophone.util.MusicUtil;
@ -59,6 +60,13 @@ public class SleepTimerDialog extends DialogFragment {
if (getActivity() == null) { if (getActivity() == null) {
return; 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; final int minutes = seekArcProgress;
PendingIntent pi = makeTimerPendingIntent(PendingIntent.FLAG_CANCEL_CURRENT); PendingIntent pi = makeTimerPendingIntent(PendingIntent.FLAG_CANCEL_CURRENT);

View file

@ -0,0 +1,98 @@
package com.kabouzeid.gramophone.misc;
import android.graphics.Color;
/**
* @author Karim Abou Zeid (kabouzeid)
*/
public interface NonProAllowedColors {
int[] PRIMARY_COLORS =
new int[]{
// Red
Color.parseColor("#FFEBEE"),
Color.parseColor("#FFCDD2"),
Color.parseColor("#EF9A9A"),
Color.parseColor("#E57373"),
Color.parseColor("#EF5350"),
Color.parseColor("#F44336"),
Color.parseColor("#E53935"),
Color.parseColor("#D32F2F"),
Color.parseColor("#C62828"),
Color.parseColor("#B71C1C"),
// Pink
Color.parseColor("#FCE4EC"),
Color.parseColor("#F8BBD0"),
Color.parseColor("#F48FB1"),
Color.parseColor("#F06292"),
Color.parseColor("#EC407A"),
Color.parseColor("#E91E63"),
Color.parseColor("#D81B60"),
Color.parseColor("#C2185B"),
Color.parseColor("#AD1457"),
Color.parseColor("#880E4F"),
// Purple
Color.parseColor("#F3E5F5"),
Color.parseColor("#E1BEE7"),
Color.parseColor("#CE93D8"),
Color.parseColor("#BA68C8"),
Color.parseColor("#AB47BC"),
Color.parseColor("#9C27B0"),
Color.parseColor("#8E24AA"),
Color.parseColor("#7B1FA2"),
Color.parseColor("#6A1B9A"),
Color.parseColor("#4A148C"),
// Deep Purple
Color.parseColor("#EDE7F6"),
Color.parseColor("#D1C4E9"),
Color.parseColor("#B39DDB"),
Color.parseColor("#9575CD"),
Color.parseColor("#7E57C2"),
Color.parseColor("#673AB7"),
Color.parseColor("#5E35B1"),
Color.parseColor("#512DA8"),
Color.parseColor("#4527A0"),
Color.parseColor("#311B92"),
// Indigo
Color.parseColor("#E8EAF6"),
Color.parseColor("#C5CAE9"),
Color.parseColor("#9FA8DA"),
Color.parseColor("#7986CB"),
Color.parseColor("#5C6BC0"),
Color.parseColor("#3F51B5"),
Color.parseColor("#3949AB"),
Color.parseColor("#303F9F"),
Color.parseColor("#283593"),
Color.parseColor("#1A237E")
};
int[] ACCENT_COLORS =
new int[]{
// Red
Color.parseColor("#FF8A80"),
Color.parseColor("#FF5252"),
Color.parseColor("#FF1744"),
Color.parseColor("#D50000"),
// Pink
Color.parseColor("#FF80AB"),
Color.parseColor("#FF4081"),
Color.parseColor("#F50057"),
Color.parseColor("#C51162"),
// Purple
Color.parseColor("#EA80FC"),
Color.parseColor("#E040FB"),
Color.parseColor("#D500F9"),
Color.parseColor("#AA00FF"),
// Deep Purple
Color.parseColor("#B388FF"),
Color.parseColor("#7C4DFF"),
Color.parseColor("#651FFF"),
Color.parseColor("#6200EA"),
// Indigo
Color.parseColor("#8C9EFF"),
Color.parseColor("#536DFE"),
Color.parseColor("#3D5AFE"),
Color.parseColor("#304FFE")
};
}

View file

@ -15,6 +15,7 @@ import android.widget.TextView;
import com.afollestad.materialdialogs.internal.ThemeSingleton; import com.afollestad.materialdialogs.internal.ThemeSingleton;
import com.kabouzeid.appthemehelper.ThemeStore; import com.kabouzeid.appthemehelper.ThemeStore;
import com.kabouzeid.gramophone.App;
import com.kabouzeid.gramophone.R; import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.dialogs.ChangelogDialog; import com.kabouzeid.gramophone.dialogs.ChangelogDialog;
import com.kabouzeid.gramophone.dialogs.DonationsDialog; import com.kabouzeid.gramophone.dialogs.DonationsDialog;
@ -159,11 +160,11 @@ public class AboutActivity extends AbsBaseActivity implements View.OnClickListen
private static String getCurrentVersionName(@NonNull final Context context) { private static String getCurrentVersionName(@NonNull final Context context) {
try { try {
return context.getPackageManager().getPackageInfo(context.getPackageName(), 0).versionName; return context.getPackageManager().getPackageInfo(context.getPackageName(), 0).versionName + (App.isProVersion() ? " Pro" : "");
} catch (PackageManager.NameNotFoundException e) { } catch (PackageManager.NameNotFoundException e) {
e.printStackTrace(); e.printStackTrace();
} }
return "0.0.0"; return "Unkown";
} }
@Override @Override

View file

@ -22,14 +22,16 @@ import android.view.ViewGroup;
import android.view.WindowInsets; import android.view.WindowInsets;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.TextView; import android.widget.TextView;
import android.widget.Toast;
import com.bumptech.glide.Glide; import com.bumptech.glide.Glide;
import com.kabouzeid.appthemehelper.ThemeStore; import com.kabouzeid.appthemehelper.ThemeStore;
import com.kabouzeid.appthemehelper.util.ATHUtil; import com.kabouzeid.appthemehelper.util.ATHUtil;
import com.kabouzeid.appthemehelper.util.NavigationViewUtil; import com.kabouzeid.appthemehelper.util.NavigationViewUtil;
import com.kabouzeid.gramophone.App;
import com.kabouzeid.gramophone.R; import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.dialogs.BuyDialog;
import com.kabouzeid.gramophone.dialogs.ChangelogDialog; import com.kabouzeid.gramophone.dialogs.ChangelogDialog;
import com.kabouzeid.gramophone.dialogs.DonationsDialog;
import com.kabouzeid.gramophone.glide.SongGlideRequest; import com.kabouzeid.gramophone.glide.SongGlideRequest;
import com.kabouzeid.gramophone.helper.MusicPlayerRemote; import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
import com.kabouzeid.gramophone.helper.SearchQueryHelper; import com.kabouzeid.gramophone.helper.SearchQueryHelper;
@ -108,6 +110,12 @@ public class MainActivity extends AbsSlidingMusicPanelActivity {
} }
private void setMusicChooser(int key) { 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");
key = LIBRARY;
}
PreferenceUtil.getInstance(this).setLastMusicChooser(key); PreferenceUtil.getInstance(this).setLastMusicChooser(key);
switch (key) { switch (key) {
case LIBRARY: case LIBRARY:
@ -160,6 +168,9 @@ public class MainActivity extends AbsSlidingMusicPanelActivity {
NavigationViewUtil.setItemIconColors(navigationView, ATHUtil.resolveColor(this, R.attr.iconColor, ThemeStore.textColorSecondary(this)), accentColor); NavigationViewUtil.setItemIconColors(navigationView, ATHUtil.resolveColor(this, R.attr.iconColor, ThemeStore.textColorSecondary(this)), accentColor);
NavigationViewUtil.setItemTextColors(navigationView, ThemeStore.textColorPrimary(this), accentColor); NavigationViewUtil.setItemTextColors(navigationView, ThemeStore.textColorPrimary(this), accentColor);
if (App.isProVersion()) {
navigationView.getMenu().removeGroup(R.id.navigation_drawer_menu_category_buy_pro);
}
navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() { navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
@Override @Override
public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) { public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {
@ -181,11 +192,11 @@ public class MainActivity extends AbsSlidingMusicPanelActivity {
} }
}, 200); }, 200);
break; break;
case R.id.support_development: case R.id.buy_pro:
new Handler().postDelayed(new Runnable() { new Handler().postDelayed(new Runnable() {
@Override @Override
public void run() { public void run() {
DonationsDialog.create().show(getSupportFragmentManager(), "DONATION_DIALOG"); BuyDialog.create().show(getSupportFragmentManager(), "BUY_DIALOG");
} }
}, 200); }, 200);
break; break;

View file

@ -18,15 +18,19 @@ import android.support.v7.preference.TwoStatePreference;
import android.support.v7.widget.Toolbar; import android.support.v7.widget.Toolbar;
import android.view.MenuItem; import android.view.MenuItem;
import android.view.View; import android.view.View;
import android.widget.Toast;
import com.afollestad.materialdialogs.color.ColorChooserDialog; import com.afollestad.materialdialogs.color.ColorChooserDialog;
import com.kabouzeid.appthemehelper.ThemeStore; import com.kabouzeid.appthemehelper.ThemeStore;
import com.kabouzeid.appthemehelper.common.prefs.supportv7.ATEColorPreference; import com.kabouzeid.appthemehelper.common.prefs.supportv7.ATEColorPreference;
import com.kabouzeid.appthemehelper.common.prefs.supportv7.ATEPreferenceFragmentCompat; import com.kabouzeid.appthemehelper.common.prefs.supportv7.ATEPreferenceFragmentCompat;
import com.kabouzeid.appthemehelper.util.ColorUtil; import com.kabouzeid.appthemehelper.util.ColorUtil;
import com.kabouzeid.gramophone.App;
import com.kabouzeid.gramophone.R; import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.appshortcuts.DynamicShortcutManager; import com.kabouzeid.gramophone.appshortcuts.DynamicShortcutManager;
import com.kabouzeid.gramophone.dialogs.BuyDialog;
import com.kabouzeid.gramophone.helper.MusicPlayerRemote; import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
import com.kabouzeid.gramophone.misc.NonProAllowedColors;
import com.kabouzeid.gramophone.preferences.NowPlayingScreenPreference; import com.kabouzeid.gramophone.preferences.NowPlayingScreenPreference;
import com.kabouzeid.gramophone.preferences.NowPlayingScreenPreferenceDialog; import com.kabouzeid.gramophone.preferences.NowPlayingScreenPreferenceDialog;
import com.kabouzeid.gramophone.service.MusicService; import com.kabouzeid.gramophone.service.MusicService;
@ -34,6 +38,8 @@ import com.kabouzeid.gramophone.ui.activities.base.AbsBaseActivity;
import com.kabouzeid.gramophone.util.NavigationUtil; import com.kabouzeid.gramophone.util.NavigationUtil;
import com.kabouzeid.gramophone.util.PreferenceUtil; import com.kabouzeid.gramophone.util.PreferenceUtil;
import java.util.Arrays;
import butterknife.BindView; import butterknife.BindView;
import butterknife.ButterKnife; import butterknife.ButterKnife;
@ -71,11 +77,29 @@ public class SettingsActivity extends AbsBaseActivity implements ColorChooserDia
public void onColorSelection(@NonNull ColorChooserDialog dialog, @ColorInt int selectedColor) { public void onColorSelection(@NonNull ColorChooserDialog dialog, @ColorInt int selectedColor) {
switch (dialog.getTitle()) { switch (dialog.getTitle()) {
case R.string.primary_color: case R.string.primary_color:
if (!App.isProVersion()) {
Arrays.sort(NonProAllowedColors.PRIMARY_COLORS);
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");
return;
}
}
ThemeStore.editTheme(this) ThemeStore.editTheme(this)
.primaryColor(selectedColor) .primaryColor(selectedColor)
.commit(); .commit();
break; break;
case R.string.accent_color: case R.string.accent_color:
if (!App.isProVersion()) {
Arrays.sort(NonProAllowedColors.ACCENT_COLORS);
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");
return;
}
}
ThemeStore.editTheme(this) ThemeStore.editTheme(this)
.accentColor(selectedColor) .accentColor(selectedColor)
.commit(); .commit();
@ -175,9 +199,17 @@ public class SettingsActivity extends AbsBaseActivity implements ColorChooserDia
generalTheme.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { generalTheme.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@Override @Override
public boolean onPreferenceChange(Preference preference, @NonNull Object o) { public boolean onPreferenceChange(Preference preference, @NonNull Object o) {
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");
return false;
}
int theme = PreferenceUtil.getThemeResFromPrefValue(themeName);
setSummary(generalTheme, o); setSummary(generalTheme, o);
ThemeStore.editTheme(getActivity()) ThemeStore.editTheme(getActivity())
.activityTheme(PreferenceUtil.getThemeResFromPrefValue((String) o)) .activityTheme(theme)
.commit(); .commit();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1) {

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" android:viewportHeight="24.0" android:viewportWidth="24.0" android:width="24dp">
<path android:fillColor="#FFFFFF" android:pathData="M20,12c0,-1.1 0.9,-2 2,-2L22,6c0,-1.1 -0.9,-2 -2,-2L4,4c-1.1,0 -1.99,0.9 -1.99,2v4c1.1,0 1.99,0.9 1.99,2s-0.89,2 -2,2v4c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2v-4c-1.1,0 -2,-0.9 -2,-2zM15.58,16.8L12,14.5l-3.58,2.3 1.08,-4.12 -3.29,-2.69 4.24,-0.25L12,5.8l1.54,3.95 4.24,0.25 -3.29,2.69 1.09,4.11z"/>
</vector>

View file

@ -17,10 +17,6 @@
<group <group
android:id="@+id/navigation_drawer_menu_category_other" android:id="@+id/navigation_drawer_menu_category_other"
android:checkableBehavior="none"> android:checkableBehavior="none">
<item
android:id="@+id/support_development"
android:icon="@drawable/ic_favorite_white_24dp"
android:title="@string/support_development" />
<item <item
android:id="@+id/nav_settings" android:id="@+id/nav_settings"
android:icon="@drawable/ic_settings_white_24dp" android:icon="@drawable/ic_settings_white_24dp"
@ -31,4 +27,13 @@
android:title="@string/action_about" /> android:title="@string/action_about" />
</group> </group>
<group
android:id="@+id/navigation_drawer_menu_category_buy_pro"
android:checkableBehavior="none">
<item
android:id="@+id/buy_pro"
android:icon="@drawable/ic_local_play_white_24dp"
android:title="@string/buy_pro" />
</group>
</menu> </menu>

View file

@ -222,8 +222,10 @@
<string name="permission_external_storage_denied">Permission to access external storage denied.</string> <string name="permission_external_storage_denied">Permission to access external storage denied.</string>
<string name="back">back</string> <string name="back">back</string>
<string name="support_development">Support development</string> <string name="support_development">Support development</string>
<string name="buy_pro">Buy Phonograph Pro</string>
<string name="thank_you">Thank you!</string> <string name="thank_you">Thank you!</string>
<string name="restored_previous_purchases">Restored previous purchases.</string> <string name="thanks_for_purchasing_phonograph_please_restart">Thanks for purchasing Phonograph Pro! Please restart the app to make use of the new features.</string>
<string name="restored_previous_purchases_please_restart">Restored previous purchases. Please restart the app to make use of all features.</string>
<string name="play_store_illustration_by">Play Store illustration by</string> <string name="play_store_illustration_by">Play Store illustration by</string>
<string name="version">Version</string> <string name="version">Version</string>
<string name="application">Application</string> <string name="application">Application</string>
@ -249,6 +251,7 @@
<string name="aleksandar_tesic_summary">For helping me with the design.</string> <string name="aleksandar_tesic_summary">For helping me with the design.</string>
<string name="website">Website</string> <string name="website">Website</string>
<string name="loading_products">Loading products…</string> <string name="loading_products">Loading products…</string>
<string name="loading_price">Loading price…</string>
<string name="up_next">Up next</string> <string name="up_next">Up next</string>
<string name="pref_title_now_playing_screen_appearance">Appearance</string> <string name="pref_title_now_playing_screen_appearance">Appearance</string>
<string name="intro_label">Introduction</string> <string name="intro_label">Introduction</string>
@ -303,4 +306,9 @@
<string name="playlist_is_empty">Playlist is empty</string> <string name="playlist_is_empty">Playlist is empty</string>
<string name="playing_notification_description">The playing notification provides actions for play/pause etc.</string> <string name="playing_notification_description">The playing notification provides actions for play/pause etc.</string>
<string name="playing_notification_name">Playing notification</string> <string name="playing_notification_name">Playing notification</string>
<string name="buy">Buy</string>
<string name="only_the_first_5_colors_available">Only the first 5 colors are available in the free version.</string>
<string name="black_theme_is_a_pro_feature">The black theme is Phonograph Pro feature.</string>
<string name="sleep_timer_is_a_pro_feature">Sleep timer is a Phonograph Pro feature</string>
<string name="folder_view_is_a_pro_feature">Folder view is a Phonograph Pro feature.</string>
</resources> </resources>