summaryrefslogtreecommitdiffstats
path: root/src/com/android/launcher3/config/FlagTogglerPrefUi.java
diff options
context:
space:
mode:
authorSunny Goyal <sunnygoyal@google.com>2018-10-24 16:20:37 -0700
committerSunny Goyal <sunnygoyal@google.com>2018-10-25 13:07:42 -0700
commiteae0514f1a8bcb9d498e146e7de78ddc187cbb17 (patch)
treef61aac6d7bc4871e7c6523a82bc594099023ec4a /src/com/android/launcher3/config/FlagTogglerPrefUi.java
parent0d9275deba38a5f650b2323513bbdd5a5a823055 (diff)
downloadandroid_packages_apps_Trebuchet-eae0514f1a8bcb9d498e146e7de78ddc187cbb17.tar.gz
android_packages_apps_Trebuchet-eae0514f1a8bcb9d498e146e7de78ddc187cbb17.tar.bz2
android_packages_apps_Trebuchet-eae0514f1a8bcb9d498e146e7de78ddc187cbb17.zip
Moving Plugin and feature flags UI to androidX
> Combining both preference into a single screen > Adding plugin preference screen so quickstep build Change-Id: I3d2ff3ebdac3c774659e79ecb81be6f75f765eb0
Diffstat (limited to 'src/com/android/launcher3/config/FlagTogglerPrefUi.java')
-rw-r--r--src/com/android/launcher3/config/FlagTogglerPrefUi.java134
1 files changed, 134 insertions, 0 deletions
diff --git a/src/com/android/launcher3/config/FlagTogglerPrefUi.java b/src/com/android/launcher3/config/FlagTogglerPrefUi.java
new file mode 100644
index 000000000..d3be51dda
--- /dev/null
+++ b/src/com/android/launcher3/config/FlagTogglerPrefUi.java
@@ -0,0 +1,134 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * 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.
+ */
+
+package com.android.launcher3.config;
+
+import android.content.Context;
+import android.content.SharedPreferences;
+import android.os.Process;
+import android.util.Log;
+import android.view.Menu;
+import android.view.MenuItem;
+import android.widget.Toast;
+
+import com.android.launcher3.R;
+import com.android.launcher3.config.BaseFlags.TogglableFlag;
+
+import androidx.preference.PreferenceDataStore;
+import androidx.preference.PreferenceFragment;
+import androidx.preference.PreferenceGroup;
+import androidx.preference.SwitchPreference;
+
+/**
+ * Dev-build only UI allowing developers to toggle flag settings. See {@link FeatureFlags}.
+ */
+public final class FlagTogglerPrefUi {
+
+ private static final String TAG = "FlagTogglerPrefFrag";
+
+ private final PreferenceFragment mFragment;
+ private final Context mContext;
+ private final SharedPreferences mSharedPreferences;
+
+ private final PreferenceDataStore mDataStore = new PreferenceDataStore() {
+
+ @Override
+ 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();
+ }
+ updateMenu();
+ }
+ }
+ }
+
+ @Override
+ public boolean getBoolean(String key, boolean defValue) {
+ return mSharedPreferences.getBoolean(key, defValue);
+ }
+ };
+
+ public FlagTogglerPrefUi(PreferenceFragment fragment) {
+ mFragment = fragment;
+ mContext = fragment.getActivity();
+ mSharedPreferences = mContext.getSharedPreferences(
+ FeatureFlags.FLAGS_PREF_NAME, Context.MODE_PRIVATE);
+ }
+
+ public void applyTo(PreferenceGroup parent) {
+ // For flag overrides we only want to store when the engineer chose to override the
+ // flag with a different value than the default. That way, when we flip flags in
+ // future, engineers will pick up the new value immediately. To accomplish this, we use a
+ // custom preference data store.
+ for (TogglableFlag flag : FeatureFlags.getTogglableFlags()) {
+ SwitchPreference switchPreference = new SwitchPreference(mContext);
+ switchPreference.setKey(flag.getKey());
+ switchPreference.setDefaultValue(flag.getDefaultValue());
+ switchPreference.setChecked(getFlagStateFromSharedPrefs(flag));
+ switchPreference.setTitle(flag.getKey());
+ switchPreference.setSummaryOn(flag.getDefaultValue() ? "" : "overridden");
+ switchPreference.setSummaryOff(flag.getDefaultValue() ? "overridden" : "");
+ switchPreference.setPreferenceDataStore(mDataStore);
+ parent.addPreference(switchPreference);
+ }
+ updateMenu();
+ }
+
+ private void updateMenu() {
+ mFragment.setHasOptionsMenu(anyChanged());
+ mFragment.getActivity().invalidateOptionsMenu();
+ }
+
+ public void onCreateOptionsMenu(Menu menu) {
+ if (anyChanged()) {
+ menu.add(0, R.id.menu_apply_flags, 0, "Apply")
+ .setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
+ }
+ }
+
+ public void onOptionsItemSelected(MenuItem item) {
+ if (item.getItemId() == R.id.menu_apply_flags) {
+ mSharedPreferences.edit().commit();
+ Log.e(TAG,
+ "Killing launcher process " + Process.myPid() + " to apply new flag values");
+ System.exit(0);
+ }
+ }
+
+ public void onStop() {
+ if (anyChanged()) {
+ Toast.makeText(mContext, "Flag won't be applied until you restart launcher",
+ Toast.LENGTH_LONG).show();
+ }
+ }
+
+ private boolean getFlagStateFromSharedPrefs(TogglableFlag flag) {
+ return mDataStore.getBoolean(flag.getKey(), flag.getDefaultValue());
+ }
+
+ private boolean anyChanged() {
+ for (TogglableFlag flag : FeatureFlags.getTogglableFlags()) {
+ if (getFlagStateFromSharedPrefs(flag) != flag.get()) {
+ return true;
+ }
+ }
+ return false;
+ }
+} \ No newline at end of file