Loading src/com/android/launcher3/config/BaseFlags.java +59 −11 Original line number Diff line number Diff line Loading @@ -17,11 +17,13 @@ package com.android.launcher3.config; import static androidx.core.util.Preconditions.checkNotNull; import android.content.ContentResolver; import android.content.Context; import android.content.SharedPreferences; import android.provider.Settings; import androidx.annotation.GuardedBy; import androidx.annotation.Keep; import androidx.annotation.VisibleForTesting; import com.android.launcher3.Utilities; import java.util.ArrayList; Loading @@ -29,10 +31,6 @@ import java.util.List; import java.util.SortedMap; import java.util.TreeMap; import androidx.annotation.GuardedBy; import androidx.annotation.Keep; import androidx.annotation.VisibleForTesting; /** * Defines a set of flags used to control various launcher behaviors. * Loading Loading @@ -88,7 +86,8 @@ abstract class BaseFlags { // trying to make them fit the orientation the device is in. public static final boolean OVERVIEW_USE_SCREENSHOT_ORIENTATION = true; public static final TogglableFlag QUICK_SWITCH = new TogglableFlag("QUICK_SWITCH", false, public static final ToggleableGlobalSettingsFlag QUICK_SWITCH = new ToggleableGlobalSettingsFlag("navbar_quick_switch_enabled", false, "Swiping right on the nav bar while in an app switches to the previous app"); /** Loading @@ -100,11 +99,9 @@ abstract class BaseFlags { public static void initialize(Context context) { // Avoid the disk read for user builds if (Utilities.IS_DEBUG_DEVICE) { SharedPreferences sharedPreferences = context.getSharedPreferences(FLAGS_PREF_NAME, Context.MODE_PRIVATE); synchronized (sLock) { for (TogglableFlag flag : sFlags) { flag.currentValue = sharedPreferences.getBoolean(flag.key, flag.defaultValue); flag.initialize(context); } } } else { Loading @@ -131,7 +128,7 @@ abstract class BaseFlags { return new ArrayList<>(flagsByKey.values()); } public static final class TogglableFlag { public static class TogglableFlag { private final String key; private final boolean defaultValue; private final String description; Loading Loading @@ -159,6 +156,24 @@ abstract class BaseFlags { public String getKey() { return key; } void initialize(Context context) { currentValue = getFromStorage(context, defaultValue); } void updateStorage(Context context, boolean value) { SharedPreferences.Editor editor = context.getSharedPreferences(FLAGS_PREF_NAME, Context.MODE_PRIVATE).edit(); if (value == defaultValue) { editor.remove(key).apply(); } else { editor.putBoolean(key, value).apply(); } } boolean getFromStorage(Context context, boolean defaultValue) { return context.getSharedPreferences(FLAGS_PREF_NAME, Context.MODE_PRIVATE) .getBoolean(key, defaultValue); } boolean getDefaultValue() { return defaultValue; Loading Loading @@ -208,4 +223,37 @@ abstract class BaseFlags { return h$; } } /** * Stores the FeatureFlag's value in Settings.Global instead of our SharedPrefs. * This is useful if we want to be able to control this flag from another process. */ public static final class ToggleableGlobalSettingsFlag extends TogglableFlag { private ContentResolver contentResolver; ToggleableGlobalSettingsFlag(String key, boolean defaultValue, String description) { super(key, defaultValue, description); } @Override public void initialize(Context context) { contentResolver = context.getContentResolver(); super.initialize(context); } @Override void updateStorage(Context context, boolean value) { Settings.Global.putInt(contentResolver, getKey(), value ? 1 : 0); } @Override boolean getFromStorage(Context context, boolean defaultValue) { return Settings.Global.getInt(contentResolver, getKey(), defaultValue ? 1 : 0) == 1; } @Override public boolean get() { return getFromStorage(null, getDefaultValue()); } } } src/com/android/launcher3/config/FlagTogglerPrefUi.java +24 −9 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ package com.android.launcher3.config; import android.content.Context; import android.content.SharedPreferences; import android.os.Process; import android.text.Html; import android.util.Log; import android.view.Menu; import android.view.MenuItem; Loading Loading @@ -49,19 +50,24 @@ public final class FlagTogglerPrefUi { public void putBoolean(String key, boolean value) { for (TogglableFlag flag : FeatureFlags.getTogglableFlags()) { if (flag.getKey().equals(key)) { if (value == flag.getDefaultValue()) { mSharedPreferences.edit().remove(key).apply(); } else { mSharedPreferences.edit().putBoolean(key, value).apply(); } boolean prevValue = flag.get(); flag.updateStorage(mContext, value); updateMenu(); if (flag.get() != prevValue) { Toast.makeText(mContext, "Flag applied", Toast.LENGTH_SHORT).show(); } } } } @Override public boolean getBoolean(String key, boolean defValue) { return mSharedPreferences.getBoolean(key, defValue); public boolean getBoolean(String key, boolean defaultValue) { for (TogglableFlag flag : FeatureFlags.getTogglableFlags()) { if (flag.getKey().equals(key)) { return flag.getFromStorage(mContext, defaultValue); } } return defaultValue; } }; Loading @@ -83,14 +89,23 @@ public final class FlagTogglerPrefUi { switchPreference.setDefaultValue(flag.getDefaultValue()); switchPreference.setChecked(getFlagStateFromSharedPrefs(flag)); switchPreference.setTitle(flag.getKey()); switchPreference.setSummaryOn(flag.getDefaultValue() ? "" : "overridden"); switchPreference.setSummaryOff(flag.getDefaultValue() ? "overridden" : ""); updateSummary(switchPreference, flag); switchPreference.setPreferenceDataStore(mDataStore); parent.addPreference(switchPreference); } updateMenu(); } /** * Updates the summary to show the description and whether the flag overrides the default value. */ private void updateSummary(SwitchPreference switchPreference, TogglableFlag flag) { String onWarning = flag.getDefaultValue() ? "" : "<b>OVERRIDDEN</b><br>"; String offWarning = flag.getDefaultValue() ? "<b>OVERRIDDEN</b><br>" : ""; switchPreference.setSummaryOn(Html.fromHtml(onWarning + flag.getDescription())); switchPreference.setSummaryOff(Html.fromHtml(offWarning + flag.getDescription())); } private void updateMenu() { mFragment.setHasOptionsMenu(anyChanged()); mFragment.getActivity().invalidateOptionsMenu(); Loading Loading
src/com/android/launcher3/config/BaseFlags.java +59 −11 Original line number Diff line number Diff line Loading @@ -17,11 +17,13 @@ package com.android.launcher3.config; import static androidx.core.util.Preconditions.checkNotNull; import android.content.ContentResolver; import android.content.Context; import android.content.SharedPreferences; import android.provider.Settings; import androidx.annotation.GuardedBy; import androidx.annotation.Keep; import androidx.annotation.VisibleForTesting; import com.android.launcher3.Utilities; import java.util.ArrayList; Loading @@ -29,10 +31,6 @@ import java.util.List; import java.util.SortedMap; import java.util.TreeMap; import androidx.annotation.GuardedBy; import androidx.annotation.Keep; import androidx.annotation.VisibleForTesting; /** * Defines a set of flags used to control various launcher behaviors. * Loading Loading @@ -88,7 +86,8 @@ abstract class BaseFlags { // trying to make them fit the orientation the device is in. public static final boolean OVERVIEW_USE_SCREENSHOT_ORIENTATION = true; public static final TogglableFlag QUICK_SWITCH = new TogglableFlag("QUICK_SWITCH", false, public static final ToggleableGlobalSettingsFlag QUICK_SWITCH = new ToggleableGlobalSettingsFlag("navbar_quick_switch_enabled", false, "Swiping right on the nav bar while in an app switches to the previous app"); /** Loading @@ -100,11 +99,9 @@ abstract class BaseFlags { public static void initialize(Context context) { // Avoid the disk read for user builds if (Utilities.IS_DEBUG_DEVICE) { SharedPreferences sharedPreferences = context.getSharedPreferences(FLAGS_PREF_NAME, Context.MODE_PRIVATE); synchronized (sLock) { for (TogglableFlag flag : sFlags) { flag.currentValue = sharedPreferences.getBoolean(flag.key, flag.defaultValue); flag.initialize(context); } } } else { Loading @@ -131,7 +128,7 @@ abstract class BaseFlags { return new ArrayList<>(flagsByKey.values()); } public static final class TogglableFlag { public static class TogglableFlag { private final String key; private final boolean defaultValue; private final String description; Loading Loading @@ -159,6 +156,24 @@ abstract class BaseFlags { public String getKey() { return key; } void initialize(Context context) { currentValue = getFromStorage(context, defaultValue); } void updateStorage(Context context, boolean value) { SharedPreferences.Editor editor = context.getSharedPreferences(FLAGS_PREF_NAME, Context.MODE_PRIVATE).edit(); if (value == defaultValue) { editor.remove(key).apply(); } else { editor.putBoolean(key, value).apply(); } } boolean getFromStorage(Context context, boolean defaultValue) { return context.getSharedPreferences(FLAGS_PREF_NAME, Context.MODE_PRIVATE) .getBoolean(key, defaultValue); } boolean getDefaultValue() { return defaultValue; Loading Loading @@ -208,4 +223,37 @@ abstract class BaseFlags { return h$; } } /** * Stores the FeatureFlag's value in Settings.Global instead of our SharedPrefs. * This is useful if we want to be able to control this flag from another process. */ public static final class ToggleableGlobalSettingsFlag extends TogglableFlag { private ContentResolver contentResolver; ToggleableGlobalSettingsFlag(String key, boolean defaultValue, String description) { super(key, defaultValue, description); } @Override public void initialize(Context context) { contentResolver = context.getContentResolver(); super.initialize(context); } @Override void updateStorage(Context context, boolean value) { Settings.Global.putInt(contentResolver, getKey(), value ? 1 : 0); } @Override boolean getFromStorage(Context context, boolean defaultValue) { return Settings.Global.getInt(contentResolver, getKey(), defaultValue ? 1 : 0) == 1; } @Override public boolean get() { return getFromStorage(null, getDefaultValue()); } } }
src/com/android/launcher3/config/FlagTogglerPrefUi.java +24 −9 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ package com.android.launcher3.config; import android.content.Context; import android.content.SharedPreferences; import android.os.Process; import android.text.Html; import android.util.Log; import android.view.Menu; import android.view.MenuItem; Loading Loading @@ -49,19 +50,24 @@ public final class FlagTogglerPrefUi { public void putBoolean(String key, boolean value) { for (TogglableFlag flag : FeatureFlags.getTogglableFlags()) { if (flag.getKey().equals(key)) { if (value == flag.getDefaultValue()) { mSharedPreferences.edit().remove(key).apply(); } else { mSharedPreferences.edit().putBoolean(key, value).apply(); } boolean prevValue = flag.get(); flag.updateStorage(mContext, value); updateMenu(); if (flag.get() != prevValue) { Toast.makeText(mContext, "Flag applied", Toast.LENGTH_SHORT).show(); } } } } @Override public boolean getBoolean(String key, boolean defValue) { return mSharedPreferences.getBoolean(key, defValue); public boolean getBoolean(String key, boolean defaultValue) { for (TogglableFlag flag : FeatureFlags.getTogglableFlags()) { if (flag.getKey().equals(key)) { return flag.getFromStorage(mContext, defaultValue); } } return defaultValue; } }; Loading @@ -83,14 +89,23 @@ public final class FlagTogglerPrefUi { switchPreference.setDefaultValue(flag.getDefaultValue()); switchPreference.setChecked(getFlagStateFromSharedPrefs(flag)); switchPreference.setTitle(flag.getKey()); switchPreference.setSummaryOn(flag.getDefaultValue() ? "" : "overridden"); switchPreference.setSummaryOff(flag.getDefaultValue() ? "overridden" : ""); updateSummary(switchPreference, flag); switchPreference.setPreferenceDataStore(mDataStore); parent.addPreference(switchPreference); } updateMenu(); } /** * Updates the summary to show the description and whether the flag overrides the default value. */ private void updateSummary(SwitchPreference switchPreference, TogglableFlag flag) { String onWarning = flag.getDefaultValue() ? "" : "<b>OVERRIDDEN</b><br>"; String offWarning = flag.getDefaultValue() ? "<b>OVERRIDDEN</b><br>" : ""; switchPreference.setSummaryOn(Html.fromHtml(onWarning + flag.getDescription())); switchPreference.setSummaryOff(Html.fromHtml(offWarning + flag.getDescription())); } private void updateMenu() { mFragment.setHasOptionsMenu(anyChanged()); mFragment.getActivity().invalidateOptionsMenu(); Loading