Fix preferences

This commit is contained in:
serso 2016-02-14 00:10:09 +01:00
parent e917e7f955
commit b7d5ea03ce
6 changed files with 81 additions and 220 deletions

View File

@ -22,15 +22,6 @@
package org.solovyev.android.calculator; package org.solovyev.android.calculator;
import static android.os.Build.VERSION_CODES.GINGERBREAD_MR1;
import static android.os.Build.VERSION_CODES.ICE_CREAM_SANDWICH;
import static android.view.WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON;
import static org.solovyev.android.calculator.Preferences.Gui.preventScreenFromFading;
import static org.solovyev.android.calculator.release.ReleaseNotes.hasReleaseNotes;
import static org.solovyev.android.wizard.WizardUi.continueWizard;
import static org.solovyev.android.wizard.WizardUi.createLaunchIntent;
import static org.solovyev.android.wizard.WizardUi.startWizard;
import android.annotation.TargetApi; import android.annotation.TargetApi;
import android.content.Context; import android.content.Context;
import android.content.SharedPreferences; import android.content.SharedPreferences;
@ -41,13 +32,10 @@ import android.preference.PreferenceManager;
import android.support.v7.app.ActionBar; import android.support.v7.app.ActionBar;
import android.support.v7.app.AlertDialog; import android.support.v7.app.AlertDialog;
import android.text.method.LinkMovementMethod; import android.text.method.LinkMovementMethod;
import android.view.KeyEvent; import android.view.*;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewConfiguration;
import android.view.Window;
import android.widget.TextView; import android.widget.TextView;
import butterknife.Bind;
import butterknife.ButterKnife;
import org.solovyev.android.Activities; import org.solovyev.android.Activities;
import org.solovyev.android.Android; import org.solovyev.android.Android;
import org.solovyev.android.calculator.history.History; import org.solovyev.android.calculator.history.History;
@ -59,13 +47,17 @@ import org.solovyev.android.wizard.Wizard;
import org.solovyev.android.wizard.Wizards; import org.solovyev.android.wizard.Wizards;
import org.solovyev.common.Objects; import org.solovyev.common.Objects;
import butterknife.Bind;
import butterknife.ButterKnife;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import javax.inject.Inject; import javax.inject.Inject;
import static android.os.Build.VERSION_CODES.GINGERBREAD_MR1;
import static android.os.Build.VERSION_CODES.ICE_CREAM_SANDWICH;
import static android.view.WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON;
import static org.solovyev.android.calculator.Preferences.Gui.preventScreenFromFading;
import static org.solovyev.android.calculator.release.ReleaseNotes.hasReleaseNotes;
import static org.solovyev.android.wizard.WizardUi.*;
public class CalculatorActivity extends BaseActivity implements SharedPreferences.OnSharedPreferenceChangeListener { public class CalculatorActivity extends BaseActivity implements SharedPreferences.OnSharedPreferenceChangeListener {
@Nonnull @Nonnull
@ -92,16 +84,16 @@ public class CalculatorActivity extends BaseActivity implements SharedPreference
} }
private static void firstTimeInit(@Nonnull SharedPreferences preferences, @Nonnull Context context) { private static void firstTimeInit(@Nonnull SharedPreferences preferences, @Nonnull Context context) {
final SharedPreferences.Editor editor = preferences.edit();
final Integer appOpenedCounter = Preferences.appOpenedCounter.getPreference(preferences); final Integer appOpenedCounter = Preferences.appOpenedCounter.getPreference(preferences);
if (appOpenedCounter != null) { Preferences.appOpenedCounter.putPreference(editor, appOpenedCounter == null ? 1 : appOpenedCounter + 1);
Preferences.appOpenedCounter.putPreference(preferences, appOpenedCounter + 1);
}
final Integer savedVersion = Preferences.appVersion.getPreference(preferences); final Integer savedVersion = Preferences.appVersion.getPreference(preferences);
final int appVersion = Android.getAppVersionCode(context); final int appVersion = Android.getAppVersionCode(context);
Preferences.appVersion.putPreference(preferences, appVersion); Preferences.appVersion.putPreference(editor, appVersion);
editor.apply();
if (!App.isMonkeyRunner(context)) { if (!App.isMonkeyRunner(context)) {

View File

@ -175,7 +175,7 @@ public class Engine implements SharedPreferences.OnSharedPreferenceChangeListene
migratePreference(preferences, Preferences.Output.scientificNotation, "calculation.output.science_notation", editor); migratePreference(preferences, Preferences.Output.scientificNotation, "calculation.output.science_notation", editor);
migratePreference(preferences, Preferences.Output.round, "org.solovyev.android.calculator.CalculatorModel_round_result", editor); migratePreference(preferences, Preferences.Output.round, "org.solovyev.android.calculator.CalculatorModel_round_result", editor);
} }
Preferences.version.putDefault(preferences); Preferences.version.putDefault(editor);
editor.apply(); editor.apply();
} }

View File

@ -60,17 +60,19 @@ public final class Preferences {
} }
static void setDefaultValues(@Nonnull SharedPreferences preferences) { static void setDefaultValues(@Nonnull SharedPreferences preferences) {
SharedPreferences.Editor editor = preferences.edit();
// renew value after each application start // renew value after each application start
Gui.showFixableErrorDialog.putDefault(preferences); Gui.showFixableErrorDialog.putDefault(editor);
Gui.lastPreferredPreferencesCheck.putDefault(preferences); Gui.lastPreferredPreferencesCheck.putDefault(editor);
final Integer version = Preferences.appVersion.getPreference(preferences); final Integer version = Preferences.appVersion.getPreference(preferences);
if (version == null) { if (version == null) {
setInitialDefaultValues(preferences); setInitialDefaultValues(preferences, editor);
} }
editor.apply();
} }
private static void setInitialDefaultValues(@Nonnull SharedPreferences preferences) { private static void setInitialDefaultValues(@Nonnull SharedPreferences preferences, @Nonnull SharedPreferences.Editor editor) {
if (!Engine.Preferences.groupingSeparator.isSet(preferences)) { if (!Engine.Preferences.groupingSeparator.isSet(preferences)) {
final Locale locale = Locale.getDefault(); final Locale locale = Locale.getDefault();
if (locale != null) { if (locale != null) {
@ -83,44 +85,44 @@ public final class Preferences {
groupingSeparator = " "; groupingSeparator = " ";
} }
Engine.Preferences.groupingSeparator.putPreference(preferences, groupingSeparator); Engine.Preferences.groupingSeparator.putPreference(editor, groupingSeparator);
} }
} }
Engine.Preferences.angleUnit.tryPutDefault(preferences); Engine.Preferences.angleUnit.tryPutDefault(preferences, editor);
Engine.Preferences.numeralBase.tryPutDefault(preferences); Engine.Preferences.numeralBase.tryPutDefault(preferences, editor);
if (!Engine.Preferences.multiplicationSign.isSet(preferences)) { if (!Engine.Preferences.multiplicationSign.isSet(preferences)) {
if (isPhoneModel(samsung_galaxy_s) || isPhoneModel(samsung_galaxy_s_2)) { if (isPhoneModel(samsung_galaxy_s) || isPhoneModel(samsung_galaxy_s_2)) {
// workaround ofr samsung galaxy s phones // workaround ofr samsung galaxy s phones
Engine.Preferences.multiplicationSign.putPreference(preferences, "*"); Engine.Preferences.multiplicationSign.putPreference(editor, "*");
} }
} }
Gui.theme.tryPutDefault(preferences); Gui.theme.tryPutDefault(preferences, editor);
Gui.layout.tryPutDefault(preferences); Gui.layout.tryPutDefault(preferences, editor);
if (Gui.layout.getPreference(preferences) == Gui.Layout.main_cellphone) { if (Gui.layout.getPreference(preferences) == Gui.Layout.main_cellphone) {
Gui.layout.putDefault(preferences); Gui.layout.putDefault(editor);
} }
Gui.feedbackWindowShown.tryPutDefault(preferences); Gui.feedbackWindowShown.tryPutDefault(preferences, editor);
Gui.showReleaseNotes.tryPutDefault(preferences); Gui.showReleaseNotes.tryPutDefault(preferences, editor);
Gui.usePrevAsBack.tryPutDefault(preferences); Gui.usePrevAsBack.tryPutDefault(preferences, editor);
Gui.showEqualsButton.tryPutDefault(preferences); Gui.showEqualsButton.tryPutDefault(preferences, editor);
Gui.autoOrientation.tryPutDefault(preferences); Gui.autoOrientation.tryPutDefault(preferences, editor);
Gui.hideNumeralBaseDigits.tryPutDefault(preferences); Gui.hideNumeralBaseDigits.tryPutDefault(preferences, editor);
Gui.preventScreenFromFading.tryPutDefault(preferences); Gui.preventScreenFromFading.tryPutDefault(preferences, editor);
Gui.language.tryPutDefault(preferences); Gui.language.tryPutDefault(preferences, editor);
Graph.plotImag.tryPutDefault(preferences); Graph.plotImag.tryPutDefault(preferences, editor);
Calculations.calculateOnFly.tryPutDefault(preferences); Calculations.calculateOnFly.tryPutDefault(preferences, editor);
Calculations.preferredAngleUnits.tryPutDefault(preferences); Calculations.preferredAngleUnits.tryPutDefault(preferences, editor);
Calculations.preferredNumeralBase.tryPutDefault(preferences); Calculations.preferredNumeralBase.tryPutDefault(preferences, editor);
Onscreen.showAppIcon.tryPutDefault(preferences); Onscreen.showAppIcon.tryPutDefault(preferences, editor);
Onscreen.startOnBoot.tryPutDefault(preferences); Onscreen.startOnBoot.tryPutDefault(preferences, editor);
Onscreen.theme.tryPutDefault(preferences); Onscreen.theme.tryPutDefault(preferences, editor);
Widget.theme.tryPutDefault(preferences); Widget.theme.tryPutDefault(preferences, editor);
} }
public enum SimpleTheme { public enum SimpleTheme {

View File

@ -74,18 +74,32 @@ public abstract class AbstractPreference<T> implements Preference<T> {
} }
} }
@Override
public void putDefault(@Nonnull SharedPreferences.Editor editor) {
putPreference(editor, this.defaultValue);
}
@Override @Override
public void putDefault(@Nonnull SharedPreferences preferences) { public void putDefault(@Nonnull SharedPreferences preferences) {
putPreference(preferences, this.defaultValue); putPreference(preferences, this.defaultValue);
} }
@Override @Override
public void putPreference(@Nonnull SharedPreferences preferences, @Nullable T value) { public void putPreference(@Nonnull SharedPreferences.Editor editor, @Nullable T value) {
if (value != null) { if (value == null) {
final SharedPreferences.Editor editor = preferences.edit(); return;
putPersistedValue(editor, value);
editor.commit();
} }
putPersistedValue(editor, value);
}
@Override
public void putPreference(@Nonnull SharedPreferences preferences, @Nullable T value) {
if (value == null) {
return;
}
final SharedPreferences.Editor editor = preferences.edit();
putPersistedValue(editor, value);
editor.apply();
} }
@Override @Override
@ -95,16 +109,20 @@ public abstract class AbstractPreference<T> implements Preference<T> {
@Override @Override
public final boolean tryPutDefault(@Nonnull SharedPreferences preferences) { public final boolean tryPutDefault(@Nonnull SharedPreferences preferences) {
final boolean result; final SharedPreferences.Editor editor = preferences.edit();
final boolean changed = tryPutDefault(preferences, editor);
editor.apply();
return changed;
}
@Override
public final boolean tryPutDefault(@Nonnull SharedPreferences preferences, @Nonnull SharedPreferences.Editor editor) {
if (isSet(preferences)) { if (isSet(preferences)) {
result = false; return false;
} else {
putDefault(preferences);
result = true;
} }
return result; putDefault(editor);
return true;
} }
@Override @Override

View File

@ -1,155 +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.prefs;
import android.content.SharedPreferences;
import org.solovyev.common.text.Mapper;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import java.util.Locale;
import java.util.StringTokenizer;
public class LocalePreference implements Preference<Locale> {
@Nonnull
private final StringPreference<Locale> stringPreference;
private LocalePreference(@Nonnull String id, @Nullable Locale defaultValue, @Nonnull Mapper<Locale> localeMapper) {
this.stringPreference = new StringPreference<Locale>(id, defaultValue, localeMapper);
}
private LocalePreference(@Nonnull String id, @Nullable Locale defaultValue) {
this.stringPreference = new StringPreference<Locale>(id, defaultValue, DefaultLocaleMapper.getInstance());
}
@Nonnull
public static LocalePreference of(@Nonnull String id, @Nullable Locale defaultValue, @Nonnull Mapper<Locale> localeMapper) {
return new LocalePreference(id, defaultValue, localeMapper);
}
@Nonnull
public static LocalePreference of(@Nonnull String id, @Nullable Locale defaultValue) {
return new LocalePreference(id, defaultValue);
}
@Override
@Nonnull
public String getKey() {
return stringPreference.getKey();
}
@Override
public Locale getDefaultValue() {
return stringPreference.getDefaultValue();
}
@Override
public Locale getPreference(@Nonnull SharedPreferences preferences) {
return stringPreference.getPreference(preferences);
}
@Override
public Locale getPreferenceNoError(@Nonnull SharedPreferences preferences) {
return stringPreference.getPreferenceNoError(preferences);
}
@Override
public void putDefault(@Nonnull SharedPreferences preferences) {
stringPreference.putDefault(preferences);
}
@Override
public void putPreference(@Nonnull SharedPreferences preferences, @Nullable Locale value) {
stringPreference.putPreference(preferences, value);
}
@Override
public boolean isSet(@Nonnull SharedPreferences preferences) {
return stringPreference.isSet(preferences);
}
@Override
public boolean tryPutDefault(@Nonnull SharedPreferences preferences) {
return stringPreference.tryPutDefault(preferences);
}
@Override
public boolean isSameKey(@Nonnull String key) {
return stringPreference.isSameKey(key);
}
/*
**********************************************************************
*
* STATIC
*
**********************************************************************
*/
private static final class DefaultLocaleMapper implements Mapper<Locale> {
@Nonnull
private static final String delimiter = ";";
@Nonnull
private static Mapper<Locale> instance = new DefaultLocaleMapper();
private DefaultLocaleMapper() {
}
@Nonnull
public static Mapper<Locale> getInstance() {
return instance;
}
@Override
public String formatValue(@Nullable Locale locale) throws IllegalArgumentException {
assert locale != null;
return locale.getLanguage() + delimiter + locale.getCountry() + delimiter + locale.getVariant();
}
@Override
public Locale parseValue(@Nullable String s) throws IllegalArgumentException {
final StringTokenizer st = new StringTokenizer(s, delimiter, false);
final String language = st.nextToken();
final String country;
if (st.hasMoreTokens()) {
country = st.nextToken();
} else {
country = "";
}
final String variant;
if (st.hasMoreTokens()) {
variant = st.nextToken();
} else {
variant = "";
}
return new Locale(language, country, variant);
}
}
}

View File

@ -66,18 +66,19 @@ public interface Preference<T> {
/** /**
* Method puts (saves) preference represented by <code>value</code> in <code>preferences</code> container * Method puts (saves) preference represented by <code>value</code> in <code>preferences</code> container
* * @param editor preferences container
* @param preferences preferences container
* @param value value to be saved * @param value value to be saved
*/ */
void putPreference(@Nonnull SharedPreferences.Editor editor, @Nullable T value);
void putPreference(@Nonnull SharedPreferences preferences, @Nullable T value); void putPreference(@Nonnull SharedPreferences preferences, @Nullable T value);
/** /**
* Method saves default value in <code>preferences</code> container. * Method saves default value in <code>preferences</code> container.
* Should behave exactly as <code>p.putPreference(preferences, p.getDefaultValue())</code> * Should behave exactly as <code>p.putPreference(preferences, p.getDefaultValue())</code>
* *
* @param preferences preferences container * @param editor preferences editor
*/ */
void putDefault(@Nonnull SharedPreferences.Editor editor);
void putDefault(@Nonnull SharedPreferences preferences); void putDefault(@Nonnull SharedPreferences preferences);
/** /**
@ -89,9 +90,12 @@ public interface Preference<T> {
/** /**
* Method applies default value to preference only if explicit value is not set * Method applies default value to preference only if explicit value is not set
* *
* @param preferences preferences container *
* @param preferences preferences
* @param editor preferences editor
* @return true if default values have been applied, false otherwise * @return true if default values have been applied, false otherwise
*/ */
boolean tryPutDefault(@Nonnull SharedPreferences preferences, @Nonnull SharedPreferences.Editor editor);
boolean tryPutDefault(@Nonnull SharedPreferences preferences); boolean tryPutDefault(@Nonnull SharedPreferences preferences);
/** /**