Loading services/core/java/com/android/server/wm/DesktopModeLaunchParamsModifier.java +17 −0 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package com.android.server.wm; import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD; import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM; import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN; import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED; Loading Loading @@ -416,6 +417,22 @@ class DesktopModeLaunchParamsModifier implements LaunchParamsModifier { return WINDOWING_MODE_FULLSCREEN; } if (DesktopExperienceFlags.ENABLE_DESKTOP_FIRST_TOP_FULLSCREEN_BUGFIX.isTrue()) { final Task launchRootCandidate = taskDisplayArea.getLaunchRootTask( WINDOWING_MODE_FREEFORM, ACTIVITY_TYPE_STANDARD, /* options= */ null, /* sourceTask= */ null, /* launchFlags= */ 0 ); final boolean isAnyDeskActive = launchRootCandidate != null && launchRootCandidate.mCreatedByOrganizer && launchRootCandidate.getWindowingMode() == WINDOWING_MODE_FREEFORM; final boolean isHomeVisible = taskDisplayArea.getDisplayContent() .getTask(t -> t.isActivityTypeHome() && t.isVisibleRequested()) != null; if (!isAnyDeskActive && !isHomeVisible) { appendLog("desktop-first-but-fullscreen-visible"); return WINDOWING_MODE_FULLSCREEN; } } appendLog("forced-freeform-in-desktop-first"); return WINDOWING_MODE_FREEFORM; } Loading services/tests/wmtests/src/com/android/server/wm/DesktopModeLaunchParamsModifierTests.java +99 −2 Original line number Diff line number Diff line Loading @@ -17,6 +17,7 @@ package com.android.server.wm; import static android.app.WindowConfiguration.ACTIVITY_TYPE_ASSISTANT; import static android.app.WindowConfiguration.ACTIVITY_TYPE_HOME; import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD; import static android.app.WindowConfiguration.ACTIVITY_TYPE_UNDEFINED; import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM; Loading Loading @@ -1991,6 +1992,11 @@ public class DesktopModeLaunchParamsModifierTests extends final DisplayContent dc = createDisplayContent(ORIENTATION_LANDSCAPE, LANDSCAPE_DISPLAY_BOUNDS, WINDOWING_MODE_FREEFORM); // Make home visible to trigger desktop-first policy. final Task homeTask = new TaskBuilder(mSupervisor).setActivityType( ACTIVITY_TYPE_HOME).setWindowingMode(WINDOWING_MODE_FULLSCREEN).setDisplay( dc).build(); homeTask.setVisibleRequested(true); final Task launchingTask = new TaskBuilder(mSupervisor) .setWindowingMode(WINDOWING_MODE_FULLSCREEN) .setDisplay(dc) Loading @@ -2004,6 +2010,7 @@ public class DesktopModeLaunchParamsModifierTests extends @Test @EnableFlags({Flags.FLAG_ENABLE_DESKTOP_FIRST_POLICY_IN_LPM, Flags.FLAG_ENABLE_FREEFORM_DISPLAY_LAUNCH_PARAMS}) @DisableFlags(Flags.FLAG_ENABLE_DESKTOP_FIRST_TOP_FULLSCREEN_BUGFIX) public void testCalculate_desktopFirstPolicy_taskNull_forcesFreeform() { setupDesktopModeLaunchParamsModifier(); Loading @@ -2020,6 +2027,95 @@ public class DesktopModeLaunchParamsModifierTests extends assertEquals(WINDOWING_MODE_FREEFORM, mResult.mWindowingMode); } @Test @EnableFlags({Flags.FLAG_ENABLE_DESKTOP_FIRST_POLICY_IN_LPM, Flags.FLAG_ENABLE_FREEFORM_DISPLAY_LAUNCH_PARAMS, Flags.FLAG_ENABLE_DESKTOP_FIRST_TOP_FULLSCREEN_BUGFIX}) public void testCalculate_desktopFirstPolicy_taskNull_activeDeskInvisibleHome_forceFreeform() { setupDesktopModeLaunchParamsModifier(); when(mTarget.isEnteringDesktopMode(any(), any(), any(), any(), any())).thenCallRealMethod(); final DisplayContent dc = createDisplayContent(ORIENTATION_LANDSCAPE, LANDSCAPE_DISPLAY_BOUNDS, WINDOWING_MODE_FREEFORM); final Task deskRoot = new TaskBuilder(mSupervisor).setActivityType(ACTIVITY_TYPE_STANDARD) .setWindowingMode(WINDOWING_MODE_FREEFORM).setDisplay(dc) .setCreatedByOrganizer(true).build(); // Activate a desk. dc.getDefaultTaskDisplayArea().setLaunchRootTask(deskRoot, new int[]{WINDOWING_MODE_FREEFORM}, new int[]{ACTIVITY_TYPE_STANDARD}); assertEquals(RESULT_DONE, new CalculateRequestBuilder().setTask(null).setOptions( ActivityOptions.makeBasic().setLaunchDisplayId( dc.getDisplayId())).calculate()); assertEquals(WINDOWING_MODE_FREEFORM, mResult.mWindowingMode); } @Test @EnableFlags({Flags.FLAG_ENABLE_DESKTOP_FIRST_POLICY_IN_LPM, Flags.FLAG_ENABLE_FREEFORM_DISPLAY_LAUNCH_PARAMS, Flags.FLAG_ENABLE_DESKTOP_FIRST_TOP_FULLSCREEN_BUGFIX}) public void testCalculate_desktopFirstPolicy_taskNull_activeDeskVisibleHome_forceFreeform() { setupDesktopModeLaunchParamsModifier(); when(mTarget.isEnteringDesktopMode(any(), any(), any(), any(), any())).thenCallRealMethod(); final DisplayContent dc = createDisplayContent(ORIENTATION_LANDSCAPE, LANDSCAPE_DISPLAY_BOUNDS, WINDOWING_MODE_FREEFORM); final Task deskRoot = new TaskBuilder(mSupervisor).setActivityType(ACTIVITY_TYPE_STANDARD) .setWindowingMode(WINDOWING_MODE_FREEFORM).setDisplay(dc) .setCreatedByOrganizer(true).build(); final Task homeTask = new TaskBuilder(mSupervisor).setActivityType( ACTIVITY_TYPE_HOME).setWindowingMode(WINDOWING_MODE_FULLSCREEN).setDisplay( dc).build(); homeTask.setVisibleRequested(true); // Activate a desk. dc.getDefaultTaskDisplayArea().setLaunchRootTask(deskRoot, new int[]{WINDOWING_MODE_FREEFORM}, new int[]{ACTIVITY_TYPE_STANDARD}); assertEquals(RESULT_DONE, new CalculateRequestBuilder().setTask(null).setOptions( ActivityOptions.makeBasic().setLaunchDisplayId( dc.getDisplayId())).calculate()); assertEquals(WINDOWING_MODE_FREEFORM, mResult.mWindowingMode); } @Test @EnableFlags({Flags.FLAG_ENABLE_DESKTOP_FIRST_POLICY_IN_LPM, Flags.FLAG_ENABLE_FREEFORM_DISPLAY_LAUNCH_PARAMS, Flags.FLAG_ENABLE_DESKTOP_FIRST_TOP_FULLSCREEN_BUGFIX}) public void testCalculate_desktopFirstPolicy_taskNull_inactiveDeskVisibleHome_forceFreeform() { setupDesktopModeLaunchParamsModifier(); when(mTarget.isEnteringDesktopMode(any(), any(), any(), any(), any())).thenCallRealMethod(); final DisplayContent dc = createDisplayContent(ORIENTATION_LANDSCAPE, LANDSCAPE_DISPLAY_BOUNDS, WINDOWING_MODE_FREEFORM); final Task homeTask = new TaskBuilder(mSupervisor).setActivityType(ACTIVITY_TYPE_HOME) .setWindowingMode(WINDOWING_MODE_FULLSCREEN).setDisplay(dc).build(); homeTask.setVisibleRequested(true); assertEquals(RESULT_DONE, new CalculateRequestBuilder().setTask(null).setOptions( ActivityOptions.makeBasic().setLaunchDisplayId( dc.getDisplayId())).calculate()); assertEquals(WINDOWING_MODE_FREEFORM, mResult.mWindowingMode); } @Test @EnableFlags({Flags.FLAG_ENABLE_DESKTOP_FIRST_POLICY_IN_LPM, Flags.FLAG_ENABLE_FREEFORM_DISPLAY_LAUNCH_PARAMS, Flags.FLAG_ENABLE_DESKTOP_FIRST_TOP_FULLSCREEN_BUGFIX}) public void testCalculate_desktopFirstPolicy_taskNull_inactiveDeskInvisibleHome_fullscreen() { setupDesktopModeLaunchParamsModifier(); when(mTarget.isEnteringDesktopMode(any(), any(), any(), any(), any())).thenCallRealMethod(); final DisplayContent dc = createDisplayContent(ORIENTATION_LANDSCAPE, LANDSCAPE_DISPLAY_BOUNDS, WINDOWING_MODE_FREEFORM); assertEquals(RESULT_DONE, new CalculateRequestBuilder().setTask(null).setOptions( ActivityOptions.makeBasic().setLaunchDisplayId( dc.getDisplayId())).calculate()); assertEquals(WINDOWING_MODE_FULLSCREEN, mResult.mWindowingMode); } @Test @EnableFlags({Flags.FLAG_ENABLE_DESKTOP_FIRST_POLICY_IN_LPM, Flags.FLAG_ENABLE_FREEFORM_DISPLAY_LAUNCH_PARAMS}) Loading @@ -2043,6 +2139,7 @@ public class DesktopModeLaunchParamsModifierTests extends @Test @EnableFlags({Flags.FLAG_ENABLE_DESKTOP_FIRST_POLICY_IN_LPM, Flags.FLAG_ENABLE_FREEFORM_DISPLAY_LAUNCH_PARAMS}) @DisableFlags(Flags.FLAG_ENABLE_DESKTOP_FIRST_TOP_FULLSCREEN_BUGFIX) public void testCalculate_desktopFirstPolicy_fullscreenSourceTask_forcesFreeform() { setupDesktopModeLaunchParamsModifier(); when(mTarget.isEnteringDesktopMode(any(), any(), any(), any(), any())).thenCallRealMethod(); Loading Loading
services/core/java/com/android/server/wm/DesktopModeLaunchParamsModifier.java +17 −0 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package com.android.server.wm; import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD; import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM; import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN; import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED; Loading Loading @@ -416,6 +417,22 @@ class DesktopModeLaunchParamsModifier implements LaunchParamsModifier { return WINDOWING_MODE_FULLSCREEN; } if (DesktopExperienceFlags.ENABLE_DESKTOP_FIRST_TOP_FULLSCREEN_BUGFIX.isTrue()) { final Task launchRootCandidate = taskDisplayArea.getLaunchRootTask( WINDOWING_MODE_FREEFORM, ACTIVITY_TYPE_STANDARD, /* options= */ null, /* sourceTask= */ null, /* launchFlags= */ 0 ); final boolean isAnyDeskActive = launchRootCandidate != null && launchRootCandidate.mCreatedByOrganizer && launchRootCandidate.getWindowingMode() == WINDOWING_MODE_FREEFORM; final boolean isHomeVisible = taskDisplayArea.getDisplayContent() .getTask(t -> t.isActivityTypeHome() && t.isVisibleRequested()) != null; if (!isAnyDeskActive && !isHomeVisible) { appendLog("desktop-first-but-fullscreen-visible"); return WINDOWING_MODE_FULLSCREEN; } } appendLog("forced-freeform-in-desktop-first"); return WINDOWING_MODE_FREEFORM; } Loading
services/tests/wmtests/src/com/android/server/wm/DesktopModeLaunchParamsModifierTests.java +99 −2 Original line number Diff line number Diff line Loading @@ -17,6 +17,7 @@ package com.android.server.wm; import static android.app.WindowConfiguration.ACTIVITY_TYPE_ASSISTANT; import static android.app.WindowConfiguration.ACTIVITY_TYPE_HOME; import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD; import static android.app.WindowConfiguration.ACTIVITY_TYPE_UNDEFINED; import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM; Loading Loading @@ -1991,6 +1992,11 @@ public class DesktopModeLaunchParamsModifierTests extends final DisplayContent dc = createDisplayContent(ORIENTATION_LANDSCAPE, LANDSCAPE_DISPLAY_BOUNDS, WINDOWING_MODE_FREEFORM); // Make home visible to trigger desktop-first policy. final Task homeTask = new TaskBuilder(mSupervisor).setActivityType( ACTIVITY_TYPE_HOME).setWindowingMode(WINDOWING_MODE_FULLSCREEN).setDisplay( dc).build(); homeTask.setVisibleRequested(true); final Task launchingTask = new TaskBuilder(mSupervisor) .setWindowingMode(WINDOWING_MODE_FULLSCREEN) .setDisplay(dc) Loading @@ -2004,6 +2010,7 @@ public class DesktopModeLaunchParamsModifierTests extends @Test @EnableFlags({Flags.FLAG_ENABLE_DESKTOP_FIRST_POLICY_IN_LPM, Flags.FLAG_ENABLE_FREEFORM_DISPLAY_LAUNCH_PARAMS}) @DisableFlags(Flags.FLAG_ENABLE_DESKTOP_FIRST_TOP_FULLSCREEN_BUGFIX) public void testCalculate_desktopFirstPolicy_taskNull_forcesFreeform() { setupDesktopModeLaunchParamsModifier(); Loading @@ -2020,6 +2027,95 @@ public class DesktopModeLaunchParamsModifierTests extends assertEquals(WINDOWING_MODE_FREEFORM, mResult.mWindowingMode); } @Test @EnableFlags({Flags.FLAG_ENABLE_DESKTOP_FIRST_POLICY_IN_LPM, Flags.FLAG_ENABLE_FREEFORM_DISPLAY_LAUNCH_PARAMS, Flags.FLAG_ENABLE_DESKTOP_FIRST_TOP_FULLSCREEN_BUGFIX}) public void testCalculate_desktopFirstPolicy_taskNull_activeDeskInvisibleHome_forceFreeform() { setupDesktopModeLaunchParamsModifier(); when(mTarget.isEnteringDesktopMode(any(), any(), any(), any(), any())).thenCallRealMethod(); final DisplayContent dc = createDisplayContent(ORIENTATION_LANDSCAPE, LANDSCAPE_DISPLAY_BOUNDS, WINDOWING_MODE_FREEFORM); final Task deskRoot = new TaskBuilder(mSupervisor).setActivityType(ACTIVITY_TYPE_STANDARD) .setWindowingMode(WINDOWING_MODE_FREEFORM).setDisplay(dc) .setCreatedByOrganizer(true).build(); // Activate a desk. dc.getDefaultTaskDisplayArea().setLaunchRootTask(deskRoot, new int[]{WINDOWING_MODE_FREEFORM}, new int[]{ACTIVITY_TYPE_STANDARD}); assertEquals(RESULT_DONE, new CalculateRequestBuilder().setTask(null).setOptions( ActivityOptions.makeBasic().setLaunchDisplayId( dc.getDisplayId())).calculate()); assertEquals(WINDOWING_MODE_FREEFORM, mResult.mWindowingMode); } @Test @EnableFlags({Flags.FLAG_ENABLE_DESKTOP_FIRST_POLICY_IN_LPM, Flags.FLAG_ENABLE_FREEFORM_DISPLAY_LAUNCH_PARAMS, Flags.FLAG_ENABLE_DESKTOP_FIRST_TOP_FULLSCREEN_BUGFIX}) public void testCalculate_desktopFirstPolicy_taskNull_activeDeskVisibleHome_forceFreeform() { setupDesktopModeLaunchParamsModifier(); when(mTarget.isEnteringDesktopMode(any(), any(), any(), any(), any())).thenCallRealMethod(); final DisplayContent dc = createDisplayContent(ORIENTATION_LANDSCAPE, LANDSCAPE_DISPLAY_BOUNDS, WINDOWING_MODE_FREEFORM); final Task deskRoot = new TaskBuilder(mSupervisor).setActivityType(ACTIVITY_TYPE_STANDARD) .setWindowingMode(WINDOWING_MODE_FREEFORM).setDisplay(dc) .setCreatedByOrganizer(true).build(); final Task homeTask = new TaskBuilder(mSupervisor).setActivityType( ACTIVITY_TYPE_HOME).setWindowingMode(WINDOWING_MODE_FULLSCREEN).setDisplay( dc).build(); homeTask.setVisibleRequested(true); // Activate a desk. dc.getDefaultTaskDisplayArea().setLaunchRootTask(deskRoot, new int[]{WINDOWING_MODE_FREEFORM}, new int[]{ACTIVITY_TYPE_STANDARD}); assertEquals(RESULT_DONE, new CalculateRequestBuilder().setTask(null).setOptions( ActivityOptions.makeBasic().setLaunchDisplayId( dc.getDisplayId())).calculate()); assertEquals(WINDOWING_MODE_FREEFORM, mResult.mWindowingMode); } @Test @EnableFlags({Flags.FLAG_ENABLE_DESKTOP_FIRST_POLICY_IN_LPM, Flags.FLAG_ENABLE_FREEFORM_DISPLAY_LAUNCH_PARAMS, Flags.FLAG_ENABLE_DESKTOP_FIRST_TOP_FULLSCREEN_BUGFIX}) public void testCalculate_desktopFirstPolicy_taskNull_inactiveDeskVisibleHome_forceFreeform() { setupDesktopModeLaunchParamsModifier(); when(mTarget.isEnteringDesktopMode(any(), any(), any(), any(), any())).thenCallRealMethod(); final DisplayContent dc = createDisplayContent(ORIENTATION_LANDSCAPE, LANDSCAPE_DISPLAY_BOUNDS, WINDOWING_MODE_FREEFORM); final Task homeTask = new TaskBuilder(mSupervisor).setActivityType(ACTIVITY_TYPE_HOME) .setWindowingMode(WINDOWING_MODE_FULLSCREEN).setDisplay(dc).build(); homeTask.setVisibleRequested(true); assertEquals(RESULT_DONE, new CalculateRequestBuilder().setTask(null).setOptions( ActivityOptions.makeBasic().setLaunchDisplayId( dc.getDisplayId())).calculate()); assertEquals(WINDOWING_MODE_FREEFORM, mResult.mWindowingMode); } @Test @EnableFlags({Flags.FLAG_ENABLE_DESKTOP_FIRST_POLICY_IN_LPM, Flags.FLAG_ENABLE_FREEFORM_DISPLAY_LAUNCH_PARAMS, Flags.FLAG_ENABLE_DESKTOP_FIRST_TOP_FULLSCREEN_BUGFIX}) public void testCalculate_desktopFirstPolicy_taskNull_inactiveDeskInvisibleHome_fullscreen() { setupDesktopModeLaunchParamsModifier(); when(mTarget.isEnteringDesktopMode(any(), any(), any(), any(), any())).thenCallRealMethod(); final DisplayContent dc = createDisplayContent(ORIENTATION_LANDSCAPE, LANDSCAPE_DISPLAY_BOUNDS, WINDOWING_MODE_FREEFORM); assertEquals(RESULT_DONE, new CalculateRequestBuilder().setTask(null).setOptions( ActivityOptions.makeBasic().setLaunchDisplayId( dc.getDisplayId())).calculate()); assertEquals(WINDOWING_MODE_FULLSCREEN, mResult.mWindowingMode); } @Test @EnableFlags({Flags.FLAG_ENABLE_DESKTOP_FIRST_POLICY_IN_LPM, Flags.FLAG_ENABLE_FREEFORM_DISPLAY_LAUNCH_PARAMS}) Loading @@ -2043,6 +2139,7 @@ public class DesktopModeLaunchParamsModifierTests extends @Test @EnableFlags({Flags.FLAG_ENABLE_DESKTOP_FIRST_POLICY_IN_LPM, Flags.FLAG_ENABLE_FREEFORM_DISPLAY_LAUNCH_PARAMS}) @DisableFlags(Flags.FLAG_ENABLE_DESKTOP_FIRST_TOP_FULLSCREEN_BUGFIX) public void testCalculate_desktopFirstPolicy_fullscreenSourceTask_forcesFreeform() { setupDesktopModeLaunchParamsModifier(); when(mTarget.isEnteringDesktopMode(any(), any(), any(), any(), any())).thenCallRealMethod(); Loading