Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4cdf0bd4 authored by Tony Wickham's avatar Tony Wickham Committed by Android (Google) Code Review
Browse files

Merge "Add ToggleableGlobalSettingsFlag for QUICK_SWITCH" into ub-launcher3-master

parents 202fabfe 94c5b83a
Loading
Loading
Loading
Loading
+59 −11
Original line number Diff line number Diff line
@@ -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;
@@ -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.
 *
@@ -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");

    /**
@@ -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 {
@@ -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;
@@ -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;
@@ -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());
        }
    }
}
+24 −9
Original line number Diff line number Diff line
@@ -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;
@@ -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;
        }
    };

@@ -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();