Loading core/java/android/window/DesktopExperienceFlags.java +87 −39 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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 ; Loading @@ -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); } /** Loading @@ -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); } /** Loading @@ -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) { Loading core/tests/coretests/src/android/window/DesktopExperienceFlagsTest.java +104 −24 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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} Loading @@ -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); Loading @@ -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(); Loading @@ -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(); Loading @@ -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(); Loading @@ -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(); Loading @@ -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 { Loading libs/WindowManager/Shell/src/com/android/wm/shell/sysui/ShellController.java +2 −1 Original line number Diff line number Diff line Loading @@ -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; Loading packages/SystemUI/src/com/android/systemui/shade/shared/flag/ShadeWindowGoesAround.kt +1 −0 Original line number Diff line number Diff line Loading @@ -45,6 +45,7 @@ object ShadeWindowGoesAround { DesktopExperienceFlags.DesktopExperienceFlag( Flags::shadeWindowGoesAround, /* shouldOverrideByDevOption= */ true, Flags.FLAG_SHADE_WINDOW_GOES_AROUND, ) /** Is the refactor enabled */ Loading Loading
core/java/android/window/DesktopExperienceFlags.java +87 −39 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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 ; Loading @@ -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); } /** Loading @@ -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); } /** Loading @@ -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) { Loading
core/tests/coretests/src/android/window/DesktopExperienceFlagsTest.java +104 −24 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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} Loading @@ -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); Loading @@ -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(); Loading @@ -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(); Loading @@ -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(); Loading @@ -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(); Loading @@ -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 { Loading
libs/WindowManager/Shell/src/com/android/wm/shell/sysui/ShellController.java +2 −1 Original line number Diff line number Diff line Loading @@ -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; Loading
packages/SystemUI/src/com/android/systemui/shade/shared/flag/ShadeWindowGoesAround.kt +1 −0 Original line number Diff line number Diff line Loading @@ -45,6 +45,7 @@ object ShadeWindowGoesAround { DesktopExperienceFlags.DesktopExperienceFlag( Flags::shadeWindowGoesAround, /* shouldOverrideByDevOption= */ true, Flags.FLAG_SHADE_WINDOW_GOES_AROUND, ) /** Is the refactor enabled */ Loading