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

Commit 30dd63d1 authored by Pierre Barbier de Reuille's avatar Pierre Barbier de Reuille
Browse files

Name flags to be able to edit them with adb

The adb command will be:

```
adb shell setprop persist.wm.debug.desktop_experience.add_dev_option.BASENAME
```

Where `BASENAME` is the last part of the flag (after the last dot), for
example the base name of
`com.android.window.flags.enable_connected_displays_dnd` is
`enable_connected_displays_dnd`.

Test: atest DesktopExperienceFlagsTest
Fix: 408432634
Flag: com.android.window.flags.show_desktop_experience_dev_option
Change-Id: I61352bf14a31e505c0536381711a2e70a63752df
parent ca2c173f
Loading
Loading
Loading
Loading
+87 −39
Original line number Diff line number Diff line
@@ -16,6 +16,9 @@

package android.window;

import static com.android.server.display.feature.flags.Flags.FLAG_ENABLE_DISPLAY_CONTENT_MODE_MANAGEMENT;

import android.annotation.NonNull;
import android.annotation.Nullable;
import android.os.SystemProperties;
import android.util.Log;
@@ -42,50 +45,79 @@ import java.util.function.BooleanSupplier;
public enum DesktopExperienceFlags {
    // go/keep-sorted start
    ACTIVITY_EMBEDDING_SUPPORT_FOR_CONNECTED_DISPLAYS(
            Flags::activityEmbeddingSupportForConnectedDisplays, true),
            Flags::activityEmbeddingSupportForConnectedDisplays, true,
            Flags.FLAG_ACTIVITY_EMBEDDING_SUPPORT_FOR_CONNECTED_DISPLAYS),
    BASE_DENSITY_FOR_EXTERNAL_DISPLAYS(
            com.android.server.display.feature.flags.Flags::baseDensityForExternalDisplays, true),
    CONNECTED_DISPLAYS_CURSOR(com.android.input.flags.Flags::connectedDisplaysCursor, true),
    DISPLAY_TOPOLOGY(com.android.server.display.feature.flags.Flags::displayTopology, true),
    ENABLE_BUG_FIXES_FOR_SECONDARY_DISPLAY(Flags::enableBugFixesForSecondaryDisplay, true),
    ENABLE_CONNECTED_DISPLAYS_DND(Flags::enableConnectedDisplaysDnd, true),
    ENABLE_CONNECTED_DISPLAYS_PIP(Flags::enableConnectedDisplaysPip, false),
    ENABLE_CONNECTED_DISPLAYS_WALLPAPER(
            android.app.Flags::enableConnectedDisplaysWallpaper, true),
    ENABLE_CONNECTED_DISPLAYS_WINDOW_DRAG(Flags::enableConnectedDisplaysWindowDrag, true),
            com.android.server.display.feature.flags.Flags::baseDensityForExternalDisplays, true,
            com.android.server.display.feature.flags.Flags.FLAG_BASE_DENSITY_FOR_EXTERNAL_DISPLAYS),
    CONNECTED_DISPLAYS_CURSOR(com.android.input.flags.Flags::connectedDisplaysCursor, true,
            com.android.input.flags.Flags.FLAG_CONNECTED_DISPLAYS_CURSOR),
    DISPLAY_TOPOLOGY(com.android.server.display.feature.flags.Flags::displayTopology, true,
            com.android.server.display.feature.flags.Flags.FLAG_DISPLAY_TOPOLOGY),
    ENABLE_BUG_FIXES_FOR_SECONDARY_DISPLAY(Flags::enableBugFixesForSecondaryDisplay, true,
            Flags.FLAG_ENABLE_BUG_FIXES_FOR_SECONDARY_DISPLAY),
    ENABLE_CONNECTED_DISPLAYS_DND(Flags::enableConnectedDisplaysDnd, true,
            Flags.FLAG_ENABLE_CONNECTED_DISPLAYS_DND),
    ENABLE_CONNECTED_DISPLAYS_PIP(Flags::enableConnectedDisplaysPip, false,
            Flags.FLAG_ENABLE_CONNECTED_DISPLAYS_PIP),
    ENABLE_CONNECTED_DISPLAYS_WALLPAPER(android.app.Flags::enableConnectedDisplaysWallpaper, true,
            android.app.Flags.FLAG_ENABLE_CONNECTED_DISPLAYS_WALLPAPER),
    ENABLE_CONNECTED_DISPLAYS_WINDOW_DRAG(Flags::enableConnectedDisplaysWindowDrag, true,
            Flags.FLAG_ENABLE_CONNECTED_DISPLAYS_WINDOW_DRAG),
    ENABLE_DESKTOP_CLOSE_TASK_ANIMATION_IN_DTC_BUGFIX(
            Flags::enableDesktopCloseTaskAnimationInDtcBugfix, false),
            Flags::enableDesktopCloseTaskAnimationInDtcBugfix, false,
            Flags.FLAG_ENABLE_DESKTOP_CLOSE_TASK_ANIMATION_IN_DTC_BUGFIX),
    ENABLE_DESKTOP_FIRST_BASED_DEFAULT_TO_DESKTOP_BUGFIX(
            Flags::enableDesktopFirstBasedDefaultToDesktopBugfix,false),
    ENABLE_DESKTOP_FIRST_BASED_DRAG_TO_MAXIMIZE(Flags::enableDesktopFirstBasedDragToMaximize,false),
            Flags::enableDesktopFirstBasedDefaultToDesktopBugfix, false,
            Flags.FLAG_ENABLE_DESKTOP_FIRST_BASED_DEFAULT_TO_DESKTOP_BUGFIX),
    ENABLE_DESKTOP_FIRST_BASED_DRAG_TO_MAXIMIZE(Flags::enableDesktopFirstBasedDragToMaximize, false,
            Flags.FLAG_ENABLE_DESKTOP_FIRST_BASED_DRAG_TO_MAXIMIZE),
    ENABLE_DESKTOP_SWIPE_BACK_MINIMIZE_ANIMATION_BUGFIX(
            Flags::enableDesktopSwipeBackMinimizeAnimationBugfix, false),
            Flags::enableDesktopSwipeBackMinimizeAnimationBugfix, false,
            Flags.FLAG_ENABLE_DESKTOP_SWIPE_BACK_MINIMIZE_ANIMATION_BUGFIX),
    ENABLE_DISPLAY_CONTENT_MODE_MANAGEMENT(
            com.android.server.display.feature.flags.Flags::enableDisplayContentModeManagement,
            true),
    ENABLE_DISPLAY_DISCONNECT_INTERACTION(Flags::enableDisplayDisconnectInteraction, false),
    ENABLE_DISPLAY_FOCUS_IN_SHELL_TRANSITIONS(Flags::enableDisplayFocusInShellTransitions, true),
    ENABLE_DISPLAY_RECONNECT_INTERACTION(Flags::enableDisplayReconnectInteraction, false),
    ENABLE_DISPLAY_WINDOWING_MODE_SWITCHING(Flags::enableDisplayWindowingModeSwitching, true),
    ENABLE_DRAGGING_PIP_ACROSS_DISPLAYS(Flags::enableDraggingPipAcrossDisplays, false),
    ENABLE_DRAG_TO_MAXIMIZE(Flags::enableDragToMaximize, true),
    ENABLE_DYNAMIC_RADIUS_COMPUTATION_BUGFIX(Flags::enableDynamicRadiusComputationBugfix, true),
    ENABLE_FREEFORM_BOX_SHADOWS(Flags::enableFreeformBoxShadows, false),
    ENABLE_KEYBOARD_SHORTCUTS_TO_SWITCH_DESKS(Flags::keyboardShortcutsToSwitchDesks, false),
    ENABLE_MOVE_TO_NEXT_DISPLAY_SHORTCUT(Flags::enableMoveToNextDisplayShortcut, true),
    ENABLE_MULTIDISPLAY_TRACKPAD_BACK_GESTURE(Flags::enableMultidisplayTrackpadBackGesture, false),
    ENABLE_MULTIPLE_DESKTOPS_BACKEND(Flags::enableMultipleDesktopsBackend, false),
    ENABLE_MULTIPLE_DESKTOPS_FRONTEND(Flags::enableMultipleDesktopsFrontend, false),
            true, FLAG_ENABLE_DISPLAY_CONTENT_MODE_MANAGEMENT),
    ENABLE_DISPLAY_DISCONNECT_INTERACTION(Flags::enableDisplayDisconnectInteraction, false,
            Flags.FLAG_ENABLE_DISPLAY_DISCONNECT_INTERACTION),
    ENABLE_DISPLAY_FOCUS_IN_SHELL_TRANSITIONS(Flags::enableDisplayFocusInShellTransitions, true,
            Flags.FLAG_ENABLE_DISPLAY_FOCUS_IN_SHELL_TRANSITIONS),
    ENABLE_DISPLAY_RECONNECT_INTERACTION(Flags::enableDisplayReconnectInteraction, false,
            Flags.FLAG_ENABLE_DISPLAY_RECONNECT_INTERACTION),
    ENABLE_DISPLAY_WINDOWING_MODE_SWITCHING(Flags::enableDisplayWindowingModeSwitching, true,
            Flags.FLAG_ENABLE_DISPLAY_WINDOWING_MODE_SWITCHING),
    ENABLE_DRAGGING_PIP_ACROSS_DISPLAYS(Flags::enableDraggingPipAcrossDisplays, false,
            Flags.FLAG_ENABLE_DRAGGING_PIP_ACROSS_DISPLAYS),
    ENABLE_DRAG_TO_MAXIMIZE(Flags::enableDragToMaximize, true, Flags.FLAG_ENABLE_DRAG_TO_MAXIMIZE),
    ENABLE_DYNAMIC_RADIUS_COMPUTATION_BUGFIX(Flags::enableDynamicRadiusComputationBugfix, true,
            Flags.FLAG_ENABLE_DYNAMIC_RADIUS_COMPUTATION_BUGFIX),
    ENABLE_FREEFORM_BOX_SHADOWS(Flags::enableFreeformBoxShadows, false,
            Flags.FLAG_ENABLE_FREEFORM_BOX_SHADOWS),
    ENABLE_KEYBOARD_SHORTCUTS_TO_SWITCH_DESKS(Flags::keyboardShortcutsToSwitchDesks, false,
            Flags.FLAG_KEYBOARD_SHORTCUTS_TO_SWITCH_DESKS),
    ENABLE_MOVE_TO_NEXT_DISPLAY_SHORTCUT(Flags::enableMoveToNextDisplayShortcut, true,
            Flags.FLAG_ENABLE_MOVE_TO_NEXT_DISPLAY_SHORTCUT),
    ENABLE_MULTIDISPLAY_TRACKPAD_BACK_GESTURE(Flags::enableMultidisplayTrackpadBackGesture, false,
            Flags.FLAG_ENABLE_MULTIDISPLAY_TRACKPAD_BACK_GESTURE),
    ENABLE_MULTIPLE_DESKTOPS_BACKEND(Flags::enableMultipleDesktopsBackend, false,
            Flags.FLAG_ENABLE_MULTIPLE_DESKTOPS_BACKEND),
    ENABLE_MULTIPLE_DESKTOPS_FRONTEND(Flags::enableMultipleDesktopsFrontend, false,
            Flags.FLAG_ENABLE_MULTIPLE_DESKTOPS_FRONTEND),
    ENABLE_PERSISTING_DISPLAY_SIZE_FOR_CONNECTED_DISPLAYS(
            Flags::enablePersistingDisplaySizeForConnectedDisplays, false),
            Flags::enablePersistingDisplaySizeForConnectedDisplays, false,
            Flags.FLAG_ENABLE_PERSISTING_DISPLAY_SIZE_FOR_CONNECTED_DISPLAYS),
    ENABLE_PER_DISPLAY_DESKTOP_WALLPAPER_ACTIVITY(Flags::enablePerDisplayDesktopWallpaperActivity,
            false),
    ENABLE_PROJECTED_DISPLAY_DESKTOP_MODE(Flags::enableProjectedDisplayDesktopMode, false),
    ENABLE_TASKBAR_CONNECTED_DISPLAYS(Flags::enableTaskbarConnectedDisplays, true),
            false, Flags.FLAG_ENABLE_PER_DISPLAY_DESKTOP_WALLPAPER_ACTIVITY),
    ENABLE_PROJECTED_DISPLAY_DESKTOP_MODE(Flags::enableProjectedDisplayDesktopMode, false,
            Flags.FLAG_ENABLE_PROJECTED_DISPLAY_DESKTOP_MODE),
    ENABLE_TASKBAR_CONNECTED_DISPLAYS(Flags::enableTaskbarConnectedDisplays, true,
            Flags.FLAG_ENABLE_TASKBAR_CONNECTED_DISPLAYS),
    ENTER_DESKTOP_BY_DEFAULT_ON_FREEFORM_DISPLAYS(Flags::enterDesktopByDefaultOnFreeformDisplays,
            true),
    FORM_FACTOR_BASED_DESKTOP_FIRST_SWITCH(Flags::formFactorBasedDesktopFirstSwitch, false),
    REPARENT_WINDOW_TOKEN_API(Flags::reparentWindowTokenApi, true)
            true, Flags.FLAG_ENTER_DESKTOP_BY_DEFAULT_ON_FREEFORM_DISPLAYS),
    FORM_FACTOR_BASED_DESKTOP_FIRST_SWITCH(Flags::formFactorBasedDesktopFirstSwitch, false,
            Flags.FLAG_FORM_FACTOR_BASED_DESKTOP_FIRST_SWITCH),
    REPARENT_WINDOW_TOKEN_API(Flags::reparentWindowTokenApi, true,
            Flags.FLAG_REPARENT_WINDOW_TOKEN_API)
    // go/keep-sorted end
    ;

@@ -101,9 +133,11 @@ public enum DesktopExperienceFlags {
        private final boolean mShouldOverrideByDevOption;

        public DesktopExperienceFlag(BooleanSupplier flagFunction,
                boolean shouldOverrideByDevOption) {
                boolean shouldOverrideByDevOption,
                @Nullable String flagName) {
            this.mFlagFunction = flagFunction;
            this.mShouldOverrideByDevOption = shouldOverrideByDevOption;
            this.mShouldOverrideByDevOption = checkIfFlagShouldBeOverridden(flagName,
                    shouldOverrideByDevOption);
        }

        /**
@@ -127,10 +161,14 @@ public enum DesktopExperienceFlags {
    private static Boolean sCachedToggleOverride;

    public static final String SYSTEM_PROPERTY_NAME = "persist.wm.debug.desktop_experience_devopts";
    public static final String SYSTEM_PROPERTY_OVERRIDE_PREFIX =
            "persist.wm.debug.desktop_experience.add_dev_option.";

    DesktopExperienceFlags(BooleanSupplier flagFunction, boolean shouldOverrideByDevOption) {
    DesktopExperienceFlags(BooleanSupplier flagFunction, boolean shouldOverrideByDevOption,
            @NonNull String flagName) {
        this.mFlagFunction = flagFunction;
        this.mShouldOverrideByDevOption = shouldOverrideByDevOption;
        this.mShouldOverrideByDevOption = checkIfFlagShouldBeOverridden(flagName,
                shouldOverrideByDevOption);
    }

    /**
@@ -151,6 +189,16 @@ public enum DesktopExperienceFlags {
        return flagFunction.getAsBoolean();
    }

    private static boolean checkIfFlagShouldBeOverridden(@Nullable String flagName,
            boolean defaultValue) {
        if (!Flags.showDesktopWindowingDevOption()) return false;
        if (flagName == null || flagName.isEmpty()) return defaultValue;
        int lastDot = flagName.lastIndexOf('.');
        String baseName = lastDot >= 0 ? flagName.substring(lastDot + 1) : flagName;
        return SystemProperties.getBoolean(SYSTEM_PROPERTY_OVERRIDE_PREFIX + baseName,
                defaultValue);
    }

    private static boolean getToggleOverride() {
        // If cached, return it
        if (sCachedToggleOverride != null) {
+104 −24
Original line number Diff line number Diff line
@@ -20,12 +20,9 @@ import static com.android.window.flags.Flags.FLAG_SHOW_DESKTOP_EXPERIENCE_DEV_OP

import static com.google.common.truth.Truth.assertThat;

import static org.junit.Assume.assumeTrue;
import static org.junit.Assume.assumeFalse;
import static org.junit.Assume.assumeTrue;

import android.content.Context;
import android.platform.test.annotations.DisableFlags;
import android.platform.test.annotations.EnableFlags;
import android.platform.test.annotations.Presubmit;
import android.platform.test.flag.junit.FlagsParameterization;
import android.platform.test.flag.junit.SetFlagsRule;
@@ -47,7 +44,10 @@ import platform.test.runner.parameterized.ParameterizedAndroidJunit4;
import platform.test.runner.parameterized.Parameters;

import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;

/**
 * Test class for {@link android.window.DesktopExperienceFlags}
@@ -64,19 +64,19 @@ public class DesktopExperienceFlagsTest {
        return FlagsParameterization.allCombinationsOf(FLAG_SHOW_DESKTOP_EXPERIENCE_DEV_OPTION);
    }

    @Rule public SetFlagsRule mSetFlagsRule;
    @Rule
    public SetFlagsRule mSetFlagsRule;

    private UiDevice mUiDevice;
    private Context mContext;
    private boolean mLocalFlagValue = false;
    private final DesktopExperienceFlag mOverriddenLocalFlag =
            new DesktopExperienceFlag(() -> mLocalFlagValue, true);
            new DesktopExperienceFlag(() -> mLocalFlagValue, true, "OverriddenFlag");
    private final DesktopExperienceFlag mNotOverriddenLocalFlag =
            new DesktopExperienceFlag(() -> mLocalFlagValue, false);
            new DesktopExperienceFlag(() -> mLocalFlagValue, false, "NotOverriddenFlag");

    private static final String OVERRIDE_OFF_SETTING = "0";
    private static final String OVERRIDE_ON_SETTING = "1";
    private static final String OVERRIDE_INVALID_SETTING = "garbage";
    private Map<String, String> mInitialSyspropValues = null;

    public DesktopExperienceFlagsTest(FlagsParameterization flags) {
        mSetFlagsRule = new SetFlagsRule(flags);
@@ -84,21 +84,21 @@ public class DesktopExperienceFlagsTest {

    @Before
    public void setUp() throws Exception {
        mContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
        mInitialSyspropValues = new HashMap<>();
        mUiDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation());
        setSysProp(null);
        setSysProp(DesktopExperienceFlags.SYSTEM_PROPERTY_NAME, null);
    }

    @After
    public void tearDown() throws Exception {
        resetCache();
        setSysProp(null);
        resetSysProps();
    }

    @Test
    public void isTrue_overrideOff_featureFlagOn_returnsTrue() throws Exception {
        mLocalFlagValue = true;
        setSysProp(OVERRIDE_OFF_SETTING);
        setSysProp(DesktopExperienceFlags.SYSTEM_PROPERTY_NAME, OVERRIDE_OFF_SETTING);

        assertThat(mOverriddenLocalFlag.isTrue()).isTrue();
        assertThat(mNotOverriddenLocalFlag.isTrue()).isTrue();
@@ -107,7 +107,7 @@ public class DesktopExperienceFlagsTest {
    @Test
    public void isTrue_overrideOn_featureFlagOn_returnsTrue() throws Exception {
        mLocalFlagValue = true;
        setSysProp(OVERRIDE_ON_SETTING);
        setSysProp(DesktopExperienceFlags.SYSTEM_PROPERTY_NAME, OVERRIDE_ON_SETTING);

        assertThat(mOverriddenLocalFlag.isTrue()).isTrue();
        assertThat(mNotOverriddenLocalFlag.isTrue()).isTrue();
@@ -116,7 +116,7 @@ public class DesktopExperienceFlagsTest {
    @Test
    public void isTrue_overrideOff_featureFlagOff_returnsFalse() throws Exception {
        mLocalFlagValue = false;
        setSysProp(OVERRIDE_OFF_SETTING);
        setSysProp(DesktopExperienceFlags.SYSTEM_PROPERTY_NAME, OVERRIDE_OFF_SETTING);

        assertThat(mOverriddenLocalFlag.isTrue()).isFalse();
        assertThat(mNotOverriddenLocalFlag.isTrue()).isFalse();
@@ -126,7 +126,7 @@ public class DesktopExperienceFlagsTest {
    public void isTrue_devOptionEnabled_overrideOn_featureFlagOff() throws Exception {
        assumeTrue(Flags.showDesktopExperienceDevOption());
        mLocalFlagValue = false;
        setSysProp(OVERRIDE_ON_SETTING);
        setSysProp(DesktopExperienceFlags.SYSTEM_PROPERTY_NAME, OVERRIDE_ON_SETTING);

        assertThat(mOverriddenLocalFlag.isTrue()).isTrue();
        assertThat(mNotOverriddenLocalFlag.isTrue()).isFalse();
@@ -136,23 +136,103 @@ public class DesktopExperienceFlagsTest {
    public void isTrue_devOptionDisabled_overrideOn_featureFlagOff_returnsFalse() throws Exception {
        assumeFalse(Flags.showDesktopExperienceDevOption());
        mLocalFlagValue = false;
        setSysProp(OVERRIDE_ON_SETTING);
        setSysProp(DesktopExperienceFlags.SYSTEM_PROPERTY_NAME, OVERRIDE_ON_SETTING);

        assertThat(mOverriddenLocalFlag.isTrue()).isFalse();
        assertThat(mNotOverriddenLocalFlag.isTrue()).isFalse();
    }

    private void setSysProp(String value) throws Exception {
        if (value == null) {
            resetSysProp();
    @Test
    public void isTrue_flagHasDotAndNotOverridden_withSysPropOverride_returnAsDevOptionEnabled()
            throws Exception {
        setSysProp(DesktopExperienceFlags.SYSTEM_PROPERTY_NAME, OVERRIDE_ON_SETTING);
        setSysProp(DesktopExperienceFlags.SYSTEM_PROPERTY_OVERRIDE_PREFIX + "baseName", "true");
        DesktopExperienceFlag flag = new DesktopExperienceFlag(() -> false, false,
                "test.flag.baseName");

        if (Flags.showDesktopExperienceDevOption()) {
            assertThat(flag.isTrue()).isTrue();
        } else {
            assertThat(flag.isTrue()).isFalse();
        }
    }

    @Test
    public void isTrue_flagHasNoDotAndNotOverridden_withSysPropOverride_returnAsDevOptionEnabled()
            throws Exception {
        setSysProp(DesktopExperienceFlags.SYSTEM_PROPERTY_NAME, OVERRIDE_ON_SETTING);
        setSysProp(DesktopExperienceFlags.SYSTEM_PROPERTY_OVERRIDE_PREFIX + "fullName", "true");
        DesktopExperienceFlag flag = new DesktopExperienceFlag(() -> false, false, "fullName");

        if (Flags.showDesktopExperienceDevOption()) {
            assertThat(flag.isTrue()).isTrue();
        } else {
            assertThat(flag.isTrue()).isFalse();
        }
    }

    @Test
    public void isTrue_flagHasNoNameAndNotOverridden_withSysPropOverride_returnAsDevOptionEnabled()
            throws Exception {
        setSysProp(DesktopExperienceFlags.SYSTEM_PROPERTY_NAME, OVERRIDE_ON_SETTING);
        setSysProp(DesktopExperienceFlags.SYSTEM_PROPERTY_OVERRIDE_PREFIX, "true");
        DesktopExperienceFlag flag = new DesktopExperienceFlag(() -> false, false, "");

        assertThat(flag.isTrue()).isFalse();
    }

    @Test
    public void isTrue_flagHasDot_devOptionEnabled_flagOverridden_withSysPropOverride_returnFalse()
            throws Exception {
        setSysProp(DesktopExperienceFlags.SYSTEM_PROPERTY_NAME, OVERRIDE_ON_SETTING);
        setSysProp(DesktopExperienceFlags.SYSTEM_PROPERTY_OVERRIDE_PREFIX + "baseName", "false");
        DesktopExperienceFlag flag = new DesktopExperienceFlag(() -> false, true,
                "test.flag.baseName");

        assertThat(flag.isTrue()).isFalse();
    }

    @Test
    public void isTrue_flagHasNoDot_devOptionEnabled_flagOverridden_withOverride_returnFalse()
            throws Exception {
        setSysProp(DesktopExperienceFlags.SYSTEM_PROPERTY_NAME, OVERRIDE_ON_SETTING);
        setSysProp(DesktopExperienceFlags.SYSTEM_PROPERTY_OVERRIDE_PREFIX + "fullName", "false");
        DesktopExperienceFlag flag = new DesktopExperienceFlag(() -> false, true, "fullName");

        assertThat(flag.isTrue()).isFalse();
    }

    @Test
    public void isTrue_flagHasNoName_devOptionEnabled_flagOverridden_withOverride()
            throws Exception {
        setSysProp(DesktopExperienceFlags.SYSTEM_PROPERTY_NAME, OVERRIDE_ON_SETTING);
        setSysProp(DesktopExperienceFlags.SYSTEM_PROPERTY_OVERRIDE_PREFIX, "false");
        DesktopExperienceFlag flag = new DesktopExperienceFlag(() -> false, true, "");

        if (Flags.showDesktopExperienceDevOption()) {
            assertThat(flag.isTrue()).isTrue();
        } else {
            mUiDevice.executeShellCommand(
                    "setprop " + DesktopModeFlags.SYSTEM_PROPERTY_NAME + " " + value);
            assertThat(flag.isTrue()).isFalse();
        }
    }

    private void setSysProp(String name, String value) throws Exception {
        if (!mInitialSyspropValues.containsKey(name)) {
            String initialValue = mUiDevice.executeShellCommand("getprop " + name).trim();
            mInitialSyspropValues.put(name, initialValue);
        }
        setSysPropUnchecked(name, Objects.requireNonNullElse(value, "''"));
    }

    private void resetSysProp() throws Exception {
        mUiDevice.executeShellCommand("setprop " + DesktopModeFlags.SYSTEM_PROPERTY_NAME + " ''");
    private void setSysPropUnchecked(String name, String value) throws Exception {
        mUiDevice.executeShellCommand("setprop " + name + " " + value);
    }

    private void resetSysProps() throws Exception {
        for (Map.Entry<String, String> entry : mInitialSyspropValues.entrySet()) {
            setSysPropUnchecked(entry.getKey(), entry.getValue());
        }
        mInitialSyspropValues.clear();
    }

    private void resetCache() throws Exception {
+2 −1
Original line number Diff line number Diff line
@@ -68,7 +68,8 @@ public class ShellController {
    private static final String TAG = ShellController.class.getSimpleName();

    public static final DesktopExperienceFlag FIX_MISSING_USER_CHANGE_CALLBACKS_FLAG =
            new DesktopExperienceFlag(Flags::fixMissingUserChangeCallbacks, false);
            new DesktopExperienceFlag(Flags::fixMissingUserChangeCallbacks, false,
                    Flags.FLAG_FIX_MISSING_USER_CHANGE_CALLBACKS);

    private final Context mContext;
    private final ShellInit mShellInit;
+1 −0
Original line number Diff line number Diff line
@@ -45,6 +45,7 @@ object ShadeWindowGoesAround {
        DesktopExperienceFlags.DesktopExperienceFlag(
            Flags::shadeWindowGoesAround,
            /* shouldOverrideByDevOption= */ true,
            Flags.FLAG_SHADE_WINDOW_GOES_AROUND,
        )

    /** Is the refactor enabled */