diff options
author | Sunny Goyal <sunnygoyal@google.com> | 2018-10-24 16:20:37 -0700 |
---|---|---|
committer | Sunny Goyal <sunnygoyal@google.com> | 2018-10-25 13:07:42 -0700 |
commit | eae0514f1a8bcb9d498e146e7de78ddc187cbb17 (patch) | |
tree | f61aac6d7bc4871e7c6523a82bc594099023ec4a /src/com/android/launcher3/config/FlagTogglerPrefUi.java | |
parent | 0d9275deba38a5f650b2323513bbdd5a5a823055 (diff) | |
download | android_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.java | 134 |
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 |