From 8e9301832fb4d763b88900e49526ea189efaa809 Mon Sep 17 00:00:00 2001 From: serso Date: Thu, 12 Feb 2015 20:45:38 +0100 Subject: [PATCH] cpp-113: Checkbox is black on some devices with Material Dark theme Fixes #113 --- android-app/src/main/AndroidManifest.xml | 4 +- .../android/calculator/Preferences.java | 17 +- .../plot/AbstractCalculatorPlotFragment.java | 3 +- .../plot/PlotPreferenceActivity.java | 38 ---- .../preferences/BasePreferencesActivity.java | 185 ----------------- .../preferences/PreferencesActivity.java | 176 ++++++++--------- .../preferences/PreferencesFragment.java | 187 ++++++++++++++++++ .../main/res/layout/cpp_activity_settings.xml | 21 -- .../main/res/layout/fragment_preferences.xml | 8 + .../src/main/res/values/attributes.xml | 1 - .../src/main/res/values/preferences.xml | 1 - android-app/src/main/res/values/styles.xml | 21 -- android-app/src/main/res/values/theme.xml | 23 --- android-app/src/main/res/xml/preferences.xml | 2 +- 14 files changed, 279 insertions(+), 408 deletions(-) delete mode 100644 android-app/src/main/java/org/solovyev/android/calculator/plot/PlotPreferenceActivity.java delete mode 100644 android-app/src/main/java/org/solovyev/android/calculator/preferences/BasePreferencesActivity.java create mode 100644 android-app/src/main/java/org/solovyev/android/calculator/preferences/PreferencesFragment.java delete mode 100644 android-app/src/main/res/layout/cpp_activity_settings.xml create mode 100644 android-app/src/main/res/layout/fragment_preferences.xml diff --git a/android-app/src/main/AndroidManifest.xml b/android-app/src/main/AndroidManifest.xml index 4a81e4f0..f7bfe50c 100644 --- a/android-app/src/main/AndroidManifest.xml +++ b/android-app/src/main/AndroidManifest.xml @@ -45,7 +45,7 @@ - + @@ -87,8 +87,6 @@ - - diff --git a/android-app/src/main/java/org/solovyev/android/calculator/Preferences.java b/android-app/src/main/java/org/solovyev/android/calculator/Preferences.java index e6090643..3632c58f 100644 --- a/android-app/src/main/java/org/solovyev/android/calculator/Preferences.java +++ b/android-app/src/main/java/org/solovyev/android/calculator/Preferences.java @@ -33,7 +33,6 @@ import jscl.AngleUnit; import jscl.NumeralBase; import org.solovyev.android.calculator.math.MathType; import org.solovyev.android.calculator.model.AndroidCalculatorEngine; -import org.solovyev.android.calculator.preferences.BasePreferencesActivity; import org.solovyev.android.calculator.preferences.PurchaseDialogActivity; import org.solovyev.android.calculator.wizard.WizardActivity; import org.solovyev.android.prefs.*; @@ -48,11 +47,6 @@ import static org.solovyev.android.Android.isPhoneModel; import static org.solovyev.android.DeviceModel.samsung_galaxy_s; import static org.solovyev.android.DeviceModel.samsung_galaxy_s_2; -/** - * User: serso - * Date: 4/20/12 - * Time: 12:42 PM - */ public final class Preferences { private Preferences() { @@ -115,24 +109,22 @@ public final class Preferences { metro_purple_theme(R.style.cpp_metro_purple_theme), metro_green_theme(R.style.cpp_metro_green_theme), material_theme(R.style.Cpp_Theme_Material), - material_light_theme(R.style.Cpp_Theme_Material_Light, R.style.Cpp_Theme_Wizard_Light, R.style.Cpp_Theme_Settings_Light, R.style.Cpp_Theme_Dialog_Material_Light), + material_light_theme(R.style.Cpp_Theme_Material_Light, R.style.Cpp_Theme_Wizard_Light, R.style.Cpp_Theme_Dialog_Material_Light), ; private static final SparseArray textColors = new SparseArray<>(); private final int themeId; private final int wizardThemeId; - private final int settingsThemeId; private final int dialogThemeId; Theme(@StyleRes int themeId) { - this(themeId, R.style.Cpp_Theme_Wizard, R.style.Cpp_Theme_Settings, R.style.Cpp_Theme_Dialog_Material); + this(themeId, R.style.Cpp_Theme_Wizard, R.style.Cpp_Theme_Dialog_Material); } - Theme(@StyleRes int themeId, @StyleRes int wizardThemeId, @StyleRes int settingsThemeId, int dialogThemeId) { + Theme(@StyleRes int themeId, @StyleRes int wizardThemeId, int dialogThemeId) { this.themeId = themeId; this.wizardThemeId = wizardThemeId; - this.settingsThemeId = settingsThemeId; this.dialogThemeId = dialogThemeId; } @@ -144,9 +136,6 @@ public final class Preferences { if (context instanceof WizardActivity) { return wizardThemeId; } - if (context instanceof BasePreferencesActivity) { - return settingsThemeId; - } if (context instanceof PurchaseDialogActivity) { return dialogThemeId; } diff --git a/android-app/src/main/java/org/solovyev/android/calculator/plot/AbstractCalculatorPlotFragment.java b/android-app/src/main/java/org/solovyev/android/calculator/plot/AbstractCalculatorPlotFragment.java index cce737de..3f0e462e 100644 --- a/android-app/src/main/java/org/solovyev/android/calculator/plot/AbstractCalculatorPlotFragment.java +++ b/android-app/src/main/java/org/solovyev/android/calculator/plot/AbstractCalculatorPlotFragment.java @@ -42,6 +42,7 @@ import org.solovyev.android.Android; import org.solovyev.android.Threads; import org.solovyev.android.calculator.*; import org.solovyev.android.calculator.R; +import org.solovyev.android.calculator.preferences.PreferencesActivity; import org.solovyev.android.menu.*; import org.solovyev.common.JPredicate; import org.solovyev.common.msg.MessageType; @@ -411,7 +412,7 @@ public abstract class AbstractCalculatorPlotFragment extends CalculatorFragment preferences(R.id.menu_plot_settings) { @Override public void onClick(@Nonnull MenuItem data, @Nonnull Context context) { - context.startActivity(new Intent(context, PlotPreferenceActivity.class)); + PreferencesActivity.start(context, R.xml.preferences_plot, R.string.prefs_graph_screen_title); } }; diff --git a/android-app/src/main/java/org/solovyev/android/calculator/plot/PlotPreferenceActivity.java b/android-app/src/main/java/org/solovyev/android/calculator/plot/PlotPreferenceActivity.java deleted file mode 100644 index f72b94fb..00000000 --- a/android-app/src/main/java/org/solovyev/android/calculator/plot/PlotPreferenceActivity.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright 2013 serso aka se.solovyev - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - * Contact details - * - * Email: se.solovyev@gmail.com - * Site: http://se.solovyev.org - */ - -package org.solovyev.android.calculator.plot; - -import android.os.Bundle; -import org.solovyev.android.calculator.R; -import org.solovyev.android.calculator.preferences.BasePreferencesActivity; - -public class PlotPreferenceActivity extends BasePreferencesActivity { - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - //noinspection deprecation - addPreferencesFromResource(R.xml.preferences_plot); - } -} diff --git a/android-app/src/main/java/org/solovyev/android/calculator/preferences/BasePreferencesActivity.java b/android-app/src/main/java/org/solovyev/android/calculator/preferences/BasePreferencesActivity.java deleted file mode 100644 index bbba8ac7..00000000 --- a/android-app/src/main/java/org/solovyev/android/calculator/preferences/BasePreferencesActivity.java +++ /dev/null @@ -1,185 +0,0 @@ -package org.solovyev.android.calculator.preferences; - -import android.content.Intent; -import android.content.SharedPreferences; -import android.os.Build; -import android.os.Bundle; -import android.preference.PreferenceActivity; -import android.support.v7.widget.Toolbar; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.LinearLayout; -import android.widget.ListView; -import org.solovyev.android.Activities; -import org.solovyev.android.Views; -import org.solovyev.android.calculator.*; -import org.solovyev.android.checkout.ActivityCheckout; -import org.solovyev.android.checkout.Checkout; -import org.solovyev.android.checkout.Inventory; -import org.solovyev.android.checkout.ProductTypes; - -import javax.annotation.Nonnull; - -public abstract class BasePreferencesActivity extends PreferenceActivity implements SharedPreferences.OnSharedPreferenceChangeListener { - - private static boolean SUPPORT_HEADERS = Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB; - private final ActivityCheckout checkout = Checkout.forActivity(this, App.getBilling(), App.getProducts()); - private Inventory inventory; - private AdView adView; - private Toolbar actionBar; - private Preferences.Gui.Theme theme; - private boolean paused = true; - - @Override - protected void onCreate(Bundle savedInstanceState) { - final SharedPreferences preferences = App.getPreferences(); - preferences.registerOnSharedPreferenceChangeListener(this); - theme = Preferences.Gui.getTheme(preferences); - setTheme(theme.getThemeId(this)); - - super.onCreate(savedInstanceState); - - actionBar.setTitle(getTitle()); - - checkout.start(); - inventory = checkout.loadInventory(); - } - - @Override - public void setContentView(int layout) { - final LayoutInflater inflater = LayoutInflater.from(this); - final ViewGroup contentView = (ViewGroup) inflater.inflate(R.layout.cpp_activity_settings, new LinearLayout(this), true); - - actionBar = (Toolbar) contentView.findViewById(R.id.action_bar); - actionBar.setNavigationOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - finish(); - } - }); - - final ViewGroup contentWrapper = (ViewGroup) contentView.findViewById(R.id.content_wrapper); - inflater.inflate(layout, contentWrapper, true); - - // let's fix padding for parent view of list view - Views.processViewsOfType(contentWrapper, ViewGroup.class, new Views.ViewProcessor() { - @Override - public void process(@Nonnull ViewGroup view) { - for (int i = 0; i < view.getChildCount(); i++) { - final View child = view.getChildAt(i); - if (child.getId() == android.R.id.list) { - view.setPadding(0, 0, 0, 0); - } - } - } - }); - - getWindow().setContentView(contentView); - } - - @Override - public void onSharedPreferenceChanged(SharedPreferences preferences, String key) { - if (!paused && Preferences.Gui.theme.isSameKey(key)) { - ActivityUi.restartIfThemeChanged(this, theme); - } - } - - private class InventoryListener implements Inventory.Listener { - @Override - public void onLoaded(@Nonnull Inventory.Products products) { - final Inventory.Product product = products.get(ProductTypes.IN_APP); - final boolean adFree = product.isPurchased("ad_free"); - onShowAd(!adFree); - } - } - - protected void onShowAd(boolean show) { - if (!supportsHeaders()) { - return; - } - - final ListView listView = getListView(); - if (show) { - if (adView != null) { - return; - } - adView = (AdView) LayoutInflater.from(this).inflate(R.layout.ad, null); - adView.show(); - try { - listView.addHeaderView(adView); - } catch (IllegalStateException e) { - // doesn't support header views - SUPPORT_HEADERS = false; - adView.hide(); - adView = null; - } - } else { - if (adView == null) { - return; - } - listView.removeHeaderView(adView); - adView.hide(); - adView = null; - } - } - - private boolean supportsHeaders() { - return SUPPORT_HEADERS; - } - - @Override - protected void onActivityResult(int requestCode, int resultCode, Intent data) { - if (checkout.onActivityResult(requestCode, resultCode, data)) { - return; - } - - super.onActivityResult(requestCode, resultCode, data); - } - - @Override - protected void onResume() { - super.onResume(); - paused = false; - if (adView != null) { - adView.resume(); - } - inventory.whenLoaded(new InventoryListener()); - - final Preferences.Gui.Theme newTheme = Preferences.Gui.theme.getPreference(App.getPreferences()); - if (!theme.equals(newTheme)) { - Activities.restartActivity(this); - } - } - - @Override - protected void onStart() { - super.onStart(); - ActivityUi.reportActivityStart(this); - } - - @Override - protected void onStop() { - ActivityUi.reportActivityStop(this); - super.onStop(); - } - - @Override - protected void onPause() { - if (adView != null) { - adView.pause(); - } - paused = true; - super.onPause(); - } - - @Override - protected void onDestroy() { - if (adView != null) { - adView.destroy(); - } - checkout.stop(); - App.getPreferences().unregisterOnSharedPreferenceChangeListener(this); - super.onDestroy(); - } -} diff --git a/android-app/src/main/java/org/solovyev/android/calculator/preferences/PreferencesActivity.java b/android-app/src/main/java/org/solovyev/android/calculator/preferences/PreferencesActivity.java index 3d89b413..84d3fbab 100644 --- a/android-app/src/main/java/org/solovyev/android/calculator/preferences/PreferencesActivity.java +++ b/android-app/src/main/java/org/solovyev/android/calculator/preferences/PreferencesActivity.java @@ -1,51 +1,33 @@ -/* - * Copyright 2013 serso aka se.solovyev - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - * Contact details - * - * Email: se.solovyev@gmail.com - * Site: http://se.solovyev.org - */ - package org.solovyev.android.calculator.preferences; +import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.os.Bundle; -import android.preference.Preference; +import android.support.annotation.StringRes; +import android.support.annotation.XmlRes; +import android.text.TextUtils; import android.util.SparseArray; + +import org.solovyev.android.calculator.ActivityUi; import org.solovyev.android.calculator.App; -import org.solovyev.android.calculator.CalculatorApplication; +import org.solovyev.android.calculator.BaseActivity; +import org.solovyev.android.calculator.Preferences; import org.solovyev.android.calculator.R; +import org.solovyev.android.checkout.ActivityCheckout; +import org.solovyev.android.checkout.Checkout; import javax.annotation.Nonnull; -import static org.solovyev.android.calculator.CalculatorApplication.AD_FREE_P_KEY; -import static org.solovyev.android.calculator.model.AndroidCalculatorEngine.Preferences.precision; -import static org.solovyev.android.calculator.model.AndroidCalculatorEngine.Preferences.roundResult; -import static org.solovyev.android.calculator.wizard.CalculatorWizards.DEFAULT_WIZARD_FLOW; -import static org.solovyev.android.view.VibratorContainer.Preferences.hapticFeedbackDuration; -import static org.solovyev.android.view.VibratorContainer.Preferences.hapticFeedbackEnabled; -import static org.solovyev.android.wizard.WizardUi.startWizard; +import static android.support.v7.app.ActionBar.NAVIGATION_MODE_STANDARD; -@SuppressWarnings("deprecation") -public class PreferencesActivity extends BasePreferencesActivity { +public class PreferencesActivity extends BaseActivity implements SharedPreferences.OnSharedPreferenceChangeListener { + + static final String EXTRA_PREFERENCE = "preference"; + static final String EXTRA_PREFERENCE_TITLE = "preference-title"; @Nonnull - private static final SparseArray preferences = new SparseArray(); + private static final SparseArray preferences = new SparseArray<>(); static { preferences.append(R.xml.preferences, "screen-main"); @@ -56,90 +38,86 @@ public class PreferencesActivity extends BasePreferencesActivity { preferences.append(R.xml.preferences_onscreen, "screen-onscreen"); } - private Preference adFreePreference; + @Nonnull + private final ActivityCheckout checkout = Checkout.forActivity(this, App.getBilling(), App.getProducts()); - @Override - protected void onNewIntent(Intent intent) { - super.onNewIntent(intent); + private boolean paused = true; + + public PreferencesActivity() { + super(R.layout.main_empty); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + App.getPreferences().registerOnSharedPreferenceChangeListener(this); final Intent intent = getIntent(); - final int preference = intent.getIntExtra("preference", R.xml.preferences); - final String title = intent.getStringExtra("preference-title"); - setPreference(preference, preferences.get(preference)); - if (preference == R.xml.preferences) { - for (int i = 0; i < preferences.size(); i++) { - final int xml = preferences.keyAt(i); - final String name = preferences.valueAt(i); - setPreferenceIntent(xml, name); - } - final Preference restartWizardPreference = findPreference("restart_wizard"); - restartWizardPreference.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { - @Override - public boolean onPreferenceClick(Preference preference) { - startWizard(CalculatorApplication.getInstance().getWizards(), DEFAULT_WIZARD_FLOW, PreferencesActivity.this); - return true; - } - }); - - adFreePreference = findPreference(AD_FREE_P_KEY); - adFreePreference.setEnabled(false); - adFreePreference.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { - @Override - public boolean onPreferenceClick(Preference preference) { - startActivity(new Intent(PreferencesActivity.this, PurchaseDialogActivity.class)); - return true; - } - }); - } - if (title != null) { - setTitle(title); + final String preferenceTitle = intent.getStringExtra(EXTRA_PREFERENCE_TITLE); + if (!TextUtils.isEmpty(preferenceTitle)) { + setTitle(preferenceTitle); } - final SharedPreferences preferences = App.getPreferences(); - onSharedPreferenceChanged(preferences, roundResult.getKey()); - onSharedPreferenceChanged(preferences, hapticFeedbackEnabled.getKey()); + if (savedInstanceState == null) { + final int preference = intent.getIntExtra(EXTRA_PREFERENCE, R.xml.preferences); + getSupportFragmentManager().beginTransaction() + .add(R.id.main_layout, PreferencesFragment.create(preference, R.layout.fragment_preferences)) + .commit(); + } + + getSupportActionBar().setNavigationMode(NAVIGATION_MODE_STANDARD); + + checkout.start(); } - private void setPreference(int xml, @Nonnull String name) { - addPreferencesFromResource(xml); - } - - private void setPreferenceIntent(int xml, @Nonnull String name) { - final Preference preference = findPreference(name); - if (preference != null) { - final Intent intent = new Intent(getApplicationContext(), PreferencesActivity.class); - intent.putExtra("preference", xml); - intent.putExtra("preference-title", preference.getTitle()); - preference.setIntent(intent); + @Override + public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { + if (!paused && Preferences.Gui.theme.isSameKey(key)) { + ActivityUi.restartIfThemeChanged(this, ui.getTheme()); } } @Override - public void onSharedPreferenceChanged(SharedPreferences preferences, String key) { - super.onSharedPreferenceChanged(preferences, key); - if (roundResult.getKey().equals(key)) { - final Preference preference = findPreference(precision.getKey()); - if (preference != null) { - preference.setEnabled(preferences.getBoolean(key, roundResult.getDefaultValue())); - } - } else if (hapticFeedbackEnabled.getKey().equals(key)) { - final Preference preference = findPreference(hapticFeedbackDuration.getKey()); - if (preference != null) { - preference.setEnabled(hapticFeedbackEnabled.getPreference(preferences)); - } - } + protected void onResume() { + super.onResume(); + paused = false; } @Override - protected void onShowAd(boolean show) { - super.onShowAd(show); - if (adFreePreference != null) { - adFreePreference.setEnabled(show); + protected void onPause() { + paused = true; + super.onPause(); + } + + @Override + protected void onDestroy() { + checkout.stop(); + App.getPreferences().unregisterOnSharedPreferenceChangeListener(this); + super.onDestroy(); + } + + @Nonnull + static SparseArray getPreferences() { + return preferences; + } + + public static void start(@Nonnull Context context, @XmlRes int preference, @StringRes int title) { + final Intent intent = makeIntent(context, preference, title); + context.startActivity(intent); + } + + @Nonnull + static Intent makeIntent(@Nonnull Context context, int preference, int title) { + final Intent intent = new Intent(context, PreferencesActivity.class); + intent.putExtra(EXTRA_PREFERENCE, preference); + if (title != 0) { + intent.putExtra(EXTRA_PREFERENCE_TITLE, context.getString(title)); } + return intent; + } + + @Nonnull + ActivityCheckout getCheckout() { + return checkout; } } diff --git a/android-app/src/main/java/org/solovyev/android/calculator/preferences/PreferencesFragment.java b/android-app/src/main/java/org/solovyev/android/calculator/preferences/PreferencesFragment.java new file mode 100644 index 00000000..8348ff6b --- /dev/null +++ b/android-app/src/main/java/org/solovyev/android/calculator/preferences/PreferencesFragment.java @@ -0,0 +1,187 @@ +package org.solovyev.android.calculator.preferences; + +import android.content.Intent; +import android.content.SharedPreferences; +import android.os.Build; +import android.os.Bundle; +import android.preference.Preference; +import android.util.SparseArray; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.ListView; + +import org.solovyev.android.calculator.AdView; +import org.solovyev.android.calculator.App; +import org.solovyev.android.calculator.CalculatorApplication; +import org.solovyev.android.calculator.R; +import org.solovyev.android.checkout.BillingRequests; +import org.solovyev.android.checkout.Checkout; +import org.solovyev.android.checkout.ProductTypes; +import org.solovyev.android.checkout.RequestListener; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + +import static org.solovyev.android.calculator.model.AndroidCalculatorEngine.Preferences.precision; +import static org.solovyev.android.calculator.model.AndroidCalculatorEngine.Preferences.roundResult; +import static org.solovyev.android.calculator.wizard.CalculatorWizards.DEFAULT_WIZARD_FLOW; +import static org.solovyev.android.view.VibratorContainer.Preferences.hapticFeedbackDuration; +import static org.solovyev.android.view.VibratorContainer.Preferences.hapticFeedbackEnabled; +import static org.solovyev.android.wizard.WizardUi.startWizard; + +public class PreferencesFragment extends org.solovyev.android.material.preferences.PreferencesFragment implements SharedPreferences.OnSharedPreferenceChangeListener { + + private static boolean SUPPORT_HEADERS = Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB; + + @Nonnull + public static PreferencesFragment create(int preferencesResId, int layoutResId) { + final PreferencesFragment fragment = new PreferencesFragment(); + fragment.setArguments(createArguments(preferencesResId, layoutResId, NO_THEME)); + return fragment; + } + + @Nullable + private Preference buyPremiumPreference; + + @Nullable + private AdView adView; + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + App.getPreferences().registerOnSharedPreferenceChangeListener(this); + } + + private void setPreferenceIntent(int xml, @Nonnull String name) { + final Preference preference = findPreference(name); + if (preference != null) { + final Intent intent = new Intent(getActivity(), PreferencesActivity.class); + intent.putExtra(PreferencesActivity.EXTRA_PREFERENCE, xml); + intent.putExtra(PreferencesActivity.EXTRA_PREFERENCE_TITLE, preference.getTitle()); + preference.setIntent(intent); + } + } + + @Override + public void onViewCreated(View view, Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + + final int preference = getPreferencesResId(); + if (preference == R.xml.preferences) { + final SparseArray preferences = PreferencesActivity.getPreferences(); + for (int i = 0; i < preferences.size(); i++) { + final int xml = preferences.keyAt(i); + final String name = preferences.valueAt(i); + setPreferenceIntent(xml, name); + } + final Preference restartWizardPreference = findPreference("restart_wizard"); + restartWizardPreference.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { + @Override + public boolean onPreferenceClick(Preference preference) { + startWizard(CalculatorApplication.getInstance().getWizards(), DEFAULT_WIZARD_FLOW, getActivity()); + return true; + } + }); + + buyPremiumPreference = findPreference("buy_premium"); + if (buyPremiumPreference != null) { + buyPremiumPreference.setEnabled(false); + buyPremiumPreference.setSelectable(false); + buyPremiumPreference.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { + @Override + public boolean onPreferenceClick(Preference preference) { + startActivity(new Intent(getActivity(), PurchaseDialogActivity.class)); + return true; + } + }); + } + } + + getCheckout().whenReady(new Checkout.ListenerAdapter() { + @Override + public void onReady(@Nonnull BillingRequests requests) { + requests.isPurchased(ProductTypes.IN_APP, CalculatorApplication.AD_FREE_PRODUCT_ID, new RequestListener() { + @Override + public void onSuccess(@Nonnull Boolean purchased) { + if (buyPremiumPreference != null) { + buyPremiumPreference.setEnabled(!purchased); + buyPremiumPreference.setSelectable(!purchased); + } + onShowAd(!purchased); + } + + @Override + public void onError(int i, @Nonnull Exception e) { + onShowAd(false); + } + }); + } + }); + + final SharedPreferences preferences = App.getPreferences(); + onSharedPreferenceChanged(preferences, roundResult.getKey()); + onSharedPreferenceChanged(preferences, hapticFeedbackEnabled.getKey()); + } + + @Nonnull + private Checkout getCheckout() { + return ((PreferencesActivity) getActivity()).getCheckout(); + } + + @Override + public void onSharedPreferenceChanged(SharedPreferences preferences, String key) { + if (roundResult.getKey().equals(key)) { + final Preference preference = findPreference(precision.getKey()); + if (preference != null) { + preference.setEnabled(preferences.getBoolean(key, roundResult.getDefaultValue())); + } + } else if (hapticFeedbackEnabled.getKey().equals(key)) { + final Preference preference = findPreference(hapticFeedbackDuration.getKey()); + if (preference != null) { + preference.setEnabled(hapticFeedbackEnabled.getPreference(preferences)); + } + } + } + + @Override + public void onDestroy() { + App.getPreferences().unregisterOnSharedPreferenceChangeListener(this); + super.onDestroy(); + } + + private boolean supportsHeaders() { + return SUPPORT_HEADERS; + } + + protected void onShowAd(boolean show) { + if (!supportsHeaders()) { + return; + } + + final ListView listView = getListView(); + if (show) { + if (adView != null) { + return; + } + adView = (AdView) LayoutInflater.from(getActivity()).inflate(R.layout.ad, null); + adView.show(); + try { + listView.addHeaderView(adView); + } catch (IllegalStateException e) { + // doesn't support header views + SUPPORT_HEADERS = false; + adView.hide(); + adView = null; + } + } else { + if (adView == null) { + return; + } + listView.removeHeaderView(adView); + adView.hide(); + adView = null; + } + } + +} diff --git a/android-app/src/main/res/layout/cpp_activity_settings.xml b/android-app/src/main/res/layout/cpp_activity_settings.xml deleted file mode 100644 index 500591c2..00000000 --- a/android-app/src/main/res/layout/cpp_activity_settings.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/android-app/src/main/res/layout/fragment_preferences.xml b/android-app/src/main/res/layout/fragment_preferences.xml new file mode 100644 index 00000000..e5a642ca --- /dev/null +++ b/android-app/src/main/res/layout/fragment_preferences.xml @@ -0,0 +1,8 @@ + + + \ No newline at end of file diff --git a/android-app/src/main/res/values/attributes.xml b/android-app/src/main/res/values/attributes.xml index 4375e397..4830b914 100644 --- a/android-app/src/main/res/values/attributes.xml +++ b/android-app/src/main/res/values/attributes.xml @@ -30,7 +30,6 @@ - diff --git a/android-app/src/main/res/values/preferences.xml b/android-app/src/main/res/values/preferences.xml index cb7f5bd9..02a14348 100644 --- a/android-app/src/main/res/values/preferences.xml +++ b/android-app/src/main/res/values/preferences.xml @@ -88,7 +88,6 @@ " " - org.solovyev.android.calculator_ad_free false \ No newline at end of file diff --git a/android-app/src/main/res/values/styles.xml b/android-app/src/main/res/values/styles.xml index b4647bf4..c6235d9e 100644 --- a/android-app/src/main/res/values/styles.xml +++ b/android-app/src/main/res/values/styles.xml @@ -293,25 +293,4 @@ @color/cpp_material_actionbar_light - - - - \ No newline at end of file diff --git a/android-app/src/main/res/values/theme.xml b/android-app/src/main/res/values/theme.xml index 6d0a5aa1..76ade755 100644 --- a/android-app/src/main/res/values/theme.xml +++ b/android-app/src/main/res/values/theme.xml @@ -114,27 +114,4 @@ @color/cpp_wizard_button_selector_light - - - - - - - - - \ No newline at end of file diff --git a/android-app/src/main/res/xml/preferences.xml b/android-app/src/main/res/xml/preferences.xml index 8cdb40f8..518cf49b 100644 --- a/android-app/src/main/res/xml/preferences.xml +++ b/android-app/src/main/res/xml/preferences.xml @@ -26,7 +26,7 @@ a:key="screen-main">