Loading services/core/java/com/android/server/wm/DisplayContent.java +43 −6 Original line number Diff line number Diff line Loading @@ -100,6 +100,7 @@ import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_SCREEN_ON; import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_WALLPAPER; import static com.android.internal.protolog.WmProtoLogGroups.WM_SHOW_TRANSACTIONS; import static com.android.internal.util.LatencyTracker.ACTION_ROTATE_SCREEN; import static com.android.server.display.feature.flags.Flags.enableDisplayContentModeManagement; import static com.android.server.policy.WindowManagerPolicy.FINISH_LAYOUT_REDO_ANIM; import static com.android.server.policy.WindowManagerPolicy.FINISH_LAYOUT_REDO_CONFIG; import static com.android.server.policy.WindowManagerPolicy.FINISH_LAYOUT_REDO_LAYOUT; Loading Loading @@ -3288,6 +3289,32 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp return new Point(w, h); } void onDisplayInfoChangeApplied() { if (!enableDisplayContentModeManagement()) { Slog.e(TAG, "ShouldShowSystemDecors shouldn't be updated when the flag is off."); } final boolean shouldShow; if (isDefaultDisplay) { shouldShow = true; } else if (isPrivate()) { shouldShow = false; } else { shouldShow = mDisplay.canHostTasks(); } if (shouldShow == mWmService.mDisplayWindowSettings.shouldShowSystemDecorsLocked(this)) { return; } mWmService.mDisplayWindowSettings.setShouldShowSystemDecorsLocked(this, shouldShow); if (shouldShow) { mRootWindowContainer.startSystemDecorations(this, "onDisplayInfoChangeApplied"); } else { clearAllTasksOnDisplay(null); } } DisplayCutout loadDisplayCutout(int displayWidth, int displayHeight) { if (mDisplayPolicy == null || mInitialDisplayCutout == null) { return null; Loading Loading @@ -6522,10 +6549,8 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp return mRemoving; } void remove() { mRemoving = true; private void clearAllTasksOnDisplay(@Nullable Runnable clearTasksCallback) { Task lastReparentedRootTask; mRootWindowContainer.mTaskSupervisor.beginDeferResume(); try { lastReparentedRootTask = reduceOnAllTaskDisplayAreas((taskDisplayArea, rootTask) -> { Loading @@ -6538,10 +6563,9 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp } finally { mRootWindowContainer.mTaskSupervisor.endDeferResume(); } mRemoved = true; if (mContentRecorder != null) { mContentRecorder.stopRecording(); if (clearTasksCallback != null) { clearTasksCallback.run(); } // Only update focus/visibility for the last one because there may be many root tasks are Loading @@ -6549,6 +6573,19 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp if (lastReparentedRootTask != null) { lastReparentedRootTask.resumeNextFocusAfterReparent(); } } void remove() { mRemoving = true; clearAllTasksOnDisplay(() -> { mRemoved = true; if (mContentRecorder != null) { mContentRecorder.stopRecording(); } }); releaseSelfIfNeeded(); mDisplayPolicy.release(); Loading services/core/java/com/android/server/wm/RootWindowContainer.java +28 −9 Original line number Diff line number Diff line Loading @@ -46,6 +46,7 @@ import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_STATES; import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_TASKS; import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_WALLPAPER; import static com.android.internal.protolog.WmProtoLogGroups.WM_SHOW_SURFACE_ALLOC; import static com.android.server.display.feature.flags.Flags.enableDisplayContentModeManagement; import static com.android.server.policy.PhoneWindowManager.SYSTEM_DIALOG_REASON_ASSIST; import static com.android.server.policy.WindowManagerPolicy.FINISH_LAYOUT_REDO_LAYOUT; import static com.android.server.policy.WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER; Loading Loading @@ -151,6 +152,7 @@ import com.android.server.LocalServices; import com.android.server.am.ActivityManagerService; import com.android.server.am.AppTimeTracker; import com.android.server.am.UserState; import com.android.server.display.feature.DisplayManagerFlags; import com.android.server.pm.UserManagerInternal; import com.android.server.policy.PermissionPolicyInternal; import com.android.server.policy.WindowManagerPolicy; Loading Loading @@ -1438,6 +1440,13 @@ class RootWindowContainer extends WindowContainer<DisplayContent> : getDefaultTaskDisplayArea(); } // When display content mode management flag is enabled, the task display area is marked as // removed when switching from extended display to mirroring display. We need to restart the // task display area before starting the home. if (enableDisplayContentModeManagement() && taskDisplayArea.isRemoved()) { taskDisplayArea.restart(); } Intent homeIntent = null; ActivityInfo aInfo = null; if (taskDisplayArea == getDefaultTaskDisplayArea() Loading Loading @@ -2856,20 +2865,24 @@ class RootWindowContainer extends WindowContainer<DisplayContent> if (display == null) { return; } // Do not start home before booting, or it may accidentally finish booting before it // starts. Instead, we expect home activities to be launched when the system is ready // (ActivityManagerService#systemReady). if (mService.isBooted() || mService.isBooting()) { startSystemDecorations(display); } startSystemDecorations(display, "displayAdded"); // Drop any cached DisplayInfos associated with this display id - the values are now // out of date given this display added event. mWmService.mPossibleDisplayInfoMapper.removePossibleDisplayInfos(displayId); } } private void startSystemDecorations(final DisplayContent displayContent) { startHomeOnDisplay(mCurrentUser, "displayAdded", displayContent.getDisplayId()); void startSystemDecorations(final DisplayContent displayContent, String reason) { // Do not start home before booting, or it may accidentally finish booting before it // starts. Instead, we expect home activities to be launched when the system is ready // (ActivityManagerService#systemReady). if (!mService.isBooted() && !mService.isBooting()) { return; } startHomeOnDisplay(mCurrentUser, reason, displayContent.getDisplayId()); displayContent.getDisplayPolicy().notifyDisplayReady(); } Loading @@ -2896,7 +2909,13 @@ class RootWindowContainer extends WindowContainer<DisplayContent> synchronized (mService.mGlobalLock) { final DisplayContent displayContent = getDisplayContent(displayId); if (displayContent != null) { displayContent.requestDisplayUpdate(() -> clearDisplayInfoCaches(displayId)); displayContent.requestDisplayUpdate( () -> { clearDisplayInfoCaches(displayId); if (enableDisplayContentModeManagement()) { displayContent.onDisplayInfoChangeApplied(); } }); } else { clearDisplayInfoCaches(displayId); } Loading services/core/java/com/android/server/wm/TaskDisplayArea.java +5 −0 Original line number Diff line number Diff line Loading @@ -1887,6 +1887,11 @@ final class TaskDisplayArea extends DisplayArea<WindowContainer> { return lastReparentedRootTask; } // TODO(b/385263090): Remove this method void restart() { mRemoved = false; } /** * Returns the {@link TaskDisplayArea} to which root tasks should be reparented. * Loading services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java +38 −0 Original line number Diff line number Diff line Loading @@ -85,6 +85,7 @@ import static com.android.server.wm.WindowContainer.POSITION_TOP; import static com.android.server.wm.WindowManagerService.UPDATE_FOCUS_NORMAL; import static com.android.window.flags.Flags.FLAG_ENABLE_CAMERA_COMPAT_FOR_DESKTOP_WINDOWING; import static com.android.window.flags.Flags.FLAG_ENABLE_DESKTOP_WINDOWING_MODE; import static com.android.server.display.feature.flags.Flags.FLAG_ENABLE_DISPLAY_CONTENT_MODE_MANAGEMENT; import static com.google.common.truth.Truth.assertThat; Loading Loading @@ -2879,6 +2880,43 @@ public class DisplayContentTests extends WindowTestsBase { assertFalse(createNewDisplay().mAppCompatCameraPolicy.hasCameraCompatFreeformPolicy()); } @EnableFlags(FLAG_ENABLE_DISPLAY_CONTENT_MODE_MANAGEMENT) @Test public void testSetShouldShowSystemDecorations_defaultDisplay() { DisplayContent dc = mWm.mRoot.getDisplayContent(DEFAULT_DISPLAY); dc.onDisplayInfoChangeApplied(); assertTrue(dc.mWmService.mDisplayWindowSettings.shouldShowSystemDecorsLocked(dc)); } @EnableFlags(FLAG_ENABLE_DISPLAY_CONTENT_MODE_MANAGEMENT) @Test public void testSetShouldShowSystemDecorations_privateDisplay() { final DisplayInfo displayInfo = new DisplayInfo(mDisplayInfo); displayInfo.flags = FLAG_PRIVATE; final DisplayContent dc = createNewDisplay(displayInfo); dc.onDisplayInfoChangeApplied(); assertFalse(dc.mWmService.mDisplayWindowSettings.shouldShowSystemDecorsLocked(dc)); } @EnableFlags(FLAG_ENABLE_DISPLAY_CONTENT_MODE_MANAGEMENT) @Test public void testSetShouldShowSystemDecorations_nonDefaultNonPrivateDisplay() { final DisplayInfo displayInfo = new DisplayInfo(mDisplayInfo); displayInfo.displayId = DEFAULT_DISPLAY + 1; final DisplayContent dc = createNewDisplay(displayInfo); spyOn(dc.mDisplay); doReturn(false).when(dc.mDisplay).canHostTasks(); dc.onDisplayInfoChangeApplied(); assertFalse(dc.mWmService.mDisplayWindowSettings.shouldShowSystemDecorsLocked(dc)); doReturn(true).when(dc.mDisplay).canHostTasks(); dc.onDisplayInfoChangeApplied(); assertTrue(dc.mWmService.mDisplayWindowSettings.shouldShowSystemDecorsLocked(dc)); } private void removeRootTaskTests(Runnable runnable) { final TaskDisplayArea taskDisplayArea = mRootWindowContainer.getDefaultTaskDisplayArea(); final Task rootTask1 = taskDisplayArea.createRootTask(WINDOWING_MODE_FULLSCREEN, Loading Loading
services/core/java/com/android/server/wm/DisplayContent.java +43 −6 Original line number Diff line number Diff line Loading @@ -100,6 +100,7 @@ import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_SCREEN_ON; import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_WALLPAPER; import static com.android.internal.protolog.WmProtoLogGroups.WM_SHOW_TRANSACTIONS; import static com.android.internal.util.LatencyTracker.ACTION_ROTATE_SCREEN; import static com.android.server.display.feature.flags.Flags.enableDisplayContentModeManagement; import static com.android.server.policy.WindowManagerPolicy.FINISH_LAYOUT_REDO_ANIM; import static com.android.server.policy.WindowManagerPolicy.FINISH_LAYOUT_REDO_CONFIG; import static com.android.server.policy.WindowManagerPolicy.FINISH_LAYOUT_REDO_LAYOUT; Loading Loading @@ -3288,6 +3289,32 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp return new Point(w, h); } void onDisplayInfoChangeApplied() { if (!enableDisplayContentModeManagement()) { Slog.e(TAG, "ShouldShowSystemDecors shouldn't be updated when the flag is off."); } final boolean shouldShow; if (isDefaultDisplay) { shouldShow = true; } else if (isPrivate()) { shouldShow = false; } else { shouldShow = mDisplay.canHostTasks(); } if (shouldShow == mWmService.mDisplayWindowSettings.shouldShowSystemDecorsLocked(this)) { return; } mWmService.mDisplayWindowSettings.setShouldShowSystemDecorsLocked(this, shouldShow); if (shouldShow) { mRootWindowContainer.startSystemDecorations(this, "onDisplayInfoChangeApplied"); } else { clearAllTasksOnDisplay(null); } } DisplayCutout loadDisplayCutout(int displayWidth, int displayHeight) { if (mDisplayPolicy == null || mInitialDisplayCutout == null) { return null; Loading Loading @@ -6522,10 +6549,8 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp return mRemoving; } void remove() { mRemoving = true; private void clearAllTasksOnDisplay(@Nullable Runnable clearTasksCallback) { Task lastReparentedRootTask; mRootWindowContainer.mTaskSupervisor.beginDeferResume(); try { lastReparentedRootTask = reduceOnAllTaskDisplayAreas((taskDisplayArea, rootTask) -> { Loading @@ -6538,10 +6563,9 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp } finally { mRootWindowContainer.mTaskSupervisor.endDeferResume(); } mRemoved = true; if (mContentRecorder != null) { mContentRecorder.stopRecording(); if (clearTasksCallback != null) { clearTasksCallback.run(); } // Only update focus/visibility for the last one because there may be many root tasks are Loading @@ -6549,6 +6573,19 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp if (lastReparentedRootTask != null) { lastReparentedRootTask.resumeNextFocusAfterReparent(); } } void remove() { mRemoving = true; clearAllTasksOnDisplay(() -> { mRemoved = true; if (mContentRecorder != null) { mContentRecorder.stopRecording(); } }); releaseSelfIfNeeded(); mDisplayPolicy.release(); Loading
services/core/java/com/android/server/wm/RootWindowContainer.java +28 −9 Original line number Diff line number Diff line Loading @@ -46,6 +46,7 @@ import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_STATES; import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_TASKS; import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_WALLPAPER; import static com.android.internal.protolog.WmProtoLogGroups.WM_SHOW_SURFACE_ALLOC; import static com.android.server.display.feature.flags.Flags.enableDisplayContentModeManagement; import static com.android.server.policy.PhoneWindowManager.SYSTEM_DIALOG_REASON_ASSIST; import static com.android.server.policy.WindowManagerPolicy.FINISH_LAYOUT_REDO_LAYOUT; import static com.android.server.policy.WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER; Loading Loading @@ -151,6 +152,7 @@ import com.android.server.LocalServices; import com.android.server.am.ActivityManagerService; import com.android.server.am.AppTimeTracker; import com.android.server.am.UserState; import com.android.server.display.feature.DisplayManagerFlags; import com.android.server.pm.UserManagerInternal; import com.android.server.policy.PermissionPolicyInternal; import com.android.server.policy.WindowManagerPolicy; Loading Loading @@ -1438,6 +1440,13 @@ class RootWindowContainer extends WindowContainer<DisplayContent> : getDefaultTaskDisplayArea(); } // When display content mode management flag is enabled, the task display area is marked as // removed when switching from extended display to mirroring display. We need to restart the // task display area before starting the home. if (enableDisplayContentModeManagement() && taskDisplayArea.isRemoved()) { taskDisplayArea.restart(); } Intent homeIntent = null; ActivityInfo aInfo = null; if (taskDisplayArea == getDefaultTaskDisplayArea() Loading Loading @@ -2856,20 +2865,24 @@ class RootWindowContainer extends WindowContainer<DisplayContent> if (display == null) { return; } // Do not start home before booting, or it may accidentally finish booting before it // starts. Instead, we expect home activities to be launched when the system is ready // (ActivityManagerService#systemReady). if (mService.isBooted() || mService.isBooting()) { startSystemDecorations(display); } startSystemDecorations(display, "displayAdded"); // Drop any cached DisplayInfos associated with this display id - the values are now // out of date given this display added event. mWmService.mPossibleDisplayInfoMapper.removePossibleDisplayInfos(displayId); } } private void startSystemDecorations(final DisplayContent displayContent) { startHomeOnDisplay(mCurrentUser, "displayAdded", displayContent.getDisplayId()); void startSystemDecorations(final DisplayContent displayContent, String reason) { // Do not start home before booting, or it may accidentally finish booting before it // starts. Instead, we expect home activities to be launched when the system is ready // (ActivityManagerService#systemReady). if (!mService.isBooted() && !mService.isBooting()) { return; } startHomeOnDisplay(mCurrentUser, reason, displayContent.getDisplayId()); displayContent.getDisplayPolicy().notifyDisplayReady(); } Loading @@ -2896,7 +2909,13 @@ class RootWindowContainer extends WindowContainer<DisplayContent> synchronized (mService.mGlobalLock) { final DisplayContent displayContent = getDisplayContent(displayId); if (displayContent != null) { displayContent.requestDisplayUpdate(() -> clearDisplayInfoCaches(displayId)); displayContent.requestDisplayUpdate( () -> { clearDisplayInfoCaches(displayId); if (enableDisplayContentModeManagement()) { displayContent.onDisplayInfoChangeApplied(); } }); } else { clearDisplayInfoCaches(displayId); } Loading
services/core/java/com/android/server/wm/TaskDisplayArea.java +5 −0 Original line number Diff line number Diff line Loading @@ -1887,6 +1887,11 @@ final class TaskDisplayArea extends DisplayArea<WindowContainer> { return lastReparentedRootTask; } // TODO(b/385263090): Remove this method void restart() { mRemoved = false; } /** * Returns the {@link TaskDisplayArea} to which root tasks should be reparented. * Loading
services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java +38 −0 Original line number Diff line number Diff line Loading @@ -85,6 +85,7 @@ import static com.android.server.wm.WindowContainer.POSITION_TOP; import static com.android.server.wm.WindowManagerService.UPDATE_FOCUS_NORMAL; import static com.android.window.flags.Flags.FLAG_ENABLE_CAMERA_COMPAT_FOR_DESKTOP_WINDOWING; import static com.android.window.flags.Flags.FLAG_ENABLE_DESKTOP_WINDOWING_MODE; import static com.android.server.display.feature.flags.Flags.FLAG_ENABLE_DISPLAY_CONTENT_MODE_MANAGEMENT; import static com.google.common.truth.Truth.assertThat; Loading Loading @@ -2879,6 +2880,43 @@ public class DisplayContentTests extends WindowTestsBase { assertFalse(createNewDisplay().mAppCompatCameraPolicy.hasCameraCompatFreeformPolicy()); } @EnableFlags(FLAG_ENABLE_DISPLAY_CONTENT_MODE_MANAGEMENT) @Test public void testSetShouldShowSystemDecorations_defaultDisplay() { DisplayContent dc = mWm.mRoot.getDisplayContent(DEFAULT_DISPLAY); dc.onDisplayInfoChangeApplied(); assertTrue(dc.mWmService.mDisplayWindowSettings.shouldShowSystemDecorsLocked(dc)); } @EnableFlags(FLAG_ENABLE_DISPLAY_CONTENT_MODE_MANAGEMENT) @Test public void testSetShouldShowSystemDecorations_privateDisplay() { final DisplayInfo displayInfo = new DisplayInfo(mDisplayInfo); displayInfo.flags = FLAG_PRIVATE; final DisplayContent dc = createNewDisplay(displayInfo); dc.onDisplayInfoChangeApplied(); assertFalse(dc.mWmService.mDisplayWindowSettings.shouldShowSystemDecorsLocked(dc)); } @EnableFlags(FLAG_ENABLE_DISPLAY_CONTENT_MODE_MANAGEMENT) @Test public void testSetShouldShowSystemDecorations_nonDefaultNonPrivateDisplay() { final DisplayInfo displayInfo = new DisplayInfo(mDisplayInfo); displayInfo.displayId = DEFAULT_DISPLAY + 1; final DisplayContent dc = createNewDisplay(displayInfo); spyOn(dc.mDisplay); doReturn(false).when(dc.mDisplay).canHostTasks(); dc.onDisplayInfoChangeApplied(); assertFalse(dc.mWmService.mDisplayWindowSettings.shouldShowSystemDecorsLocked(dc)); doReturn(true).when(dc.mDisplay).canHostTasks(); dc.onDisplayInfoChangeApplied(); assertTrue(dc.mWmService.mDisplayWindowSettings.shouldShowSystemDecorsLocked(dc)); } private void removeRootTaskTests(Runnable runnable) { final TaskDisplayArea taskDisplayArea = mRootWindowContainer.getDefaultTaskDisplayArea(); final Task rootTask1 = taskDisplayArea.createRootTask(WINDOWING_MODE_FULLSCREEN, Loading