diff options
| author | 2025-03-04 03:32:36 -0800 | |
|---|---|---|
| committer | 2025-03-04 03:32:36 -0800 | |
| commit | 2257c467b02845e0b0d34278c93f0b74e50f87ec (patch) | |
| tree | b7da122077af596d35371c2bf7426650769c4bd8 | |
| parent | 083631bfe0ca09573b74c07c7110dc741fb0296a (diff) | |
Notify DisplayTopology when shouldShowSystemDecors changes
Bug: 384013689
Bug: 397586907
Test: adb shell settings put secure mirror_built_in_display {1|0}
Flag: com.android.server.display.feature.flags.enable_display_content_mode_management
Change-Id: Idbb9ccc87c37e3a54203eb4880ac34628efa1ebb
4 files changed, 57 insertions, 12 deletions
diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index 85036986a404..65efa310658f 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -3262,12 +3262,11 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp Slog.e(TAG, "ShouldShowSystemDecors shouldn't be updated when the flag is off."); } - final boolean shouldShowContent; if (!allowContentModeSwitch()) { return; } - shouldShowContent = mDisplay.canHostTasks(); + final boolean shouldShowContent = mDisplay.canHostTasks(); if (shouldShowContent == mWmService.mDisplayWindowSettings .shouldShowSystemDecorsLocked(this)) { return; @@ -3277,6 +3276,11 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp if (!shouldShowContent) { clearAllTasksOnDisplay(null /* clearTasksCallback */, false /* isRemovingDisplay */); } + + // If the display is allowed to show content, then it belongs to the display topology; + // vice versa. + mWmService.mDisplayManagerInternal.onDisplayBelongToTopologyChanged(mDisplayId, + /* inTopology= */ shouldShowContent); } /** @@ -3295,6 +3299,10 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp return false; } + if (shouldNeverShowSystemDecorations()) { + return false; + } + // TODO(b/391965805): Remove this after introducing FLAG_ALLOW_CONTENT_MODE_SWITCH. if ((mDisplay.getFlags() & Display.FLAG_REAR) != 0) { return false; @@ -5659,16 +5667,23 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp return type == TRANSIT_OPEN || type == TRANSIT_TO_FRONT; } - /** - * @see Display#FLAG_SHOULD_SHOW_SYSTEM_DECORATIONS - */ - boolean isSystemDecorationsSupported() { + private boolean shouldNeverShowSystemDecorations() { if (mDisplayId == mWmService.mVr2dDisplayId) { // VR virtual display will be used to run and render 2D app within a VR experience. - return false; + return true; } if (!isTrusted()) { // Do not show system decorations on untrusted virtual display. + return true; + } + return false; + } + + /** + * @see Display#FLAG_SHOULD_SHOW_SYSTEM_DECORATIONS + */ + boolean isSystemDecorationsSupported() { + if (shouldNeverShowSystemDecorations()) { return false; } if (mWmService.mDisplayWindowSettings.shouldShowSystemDecorsLocked(this) diff --git a/services/core/java/com/android/server/wm/DisplayWindowSettings.java b/services/core/java/com/android/server/wm/DisplayWindowSettings.java index 48ffccbca935..56579206566f 100644 --- a/services/core/java/com/android/server/wm/DisplayWindowSettings.java +++ b/services/core/java/com/android/server/wm/DisplayWindowSettings.java @@ -240,6 +240,11 @@ class DisplayWindowSettings { mSettingsProvider.updateOverrideSettings(displayInfo, overrideSettings); } + /** + * Returns {@code true} if either the display is the default display, or the display is allowed + * to dynamically add/remove system decorations and the system decorations should be shown on it + * currently. + */ boolean shouldShowSystemDecorsLocked(@NonNull DisplayContent dc) { if (dc.getDisplayId() == Display.DEFAULT_DISPLAY) { // Default display should show system decors. diff --git a/services/core/java/com/android/server/wm/RootWindowContainer.java b/services/core/java/com/android/server/wm/RootWindowContainer.java index 394fe6f0e8ed..cf201c9f34f0 100644 --- a/services/core/java/com/android/server/wm/RootWindowContainer.java +++ b/services/core/java/com/android/server/wm/RootWindowContainer.java @@ -2772,11 +2772,17 @@ class RootWindowContainer extends WindowContainer<DisplayContent> return; } - if (ENABLE_DISPLAY_CONTENT_MODE_MANAGEMENT.isTrue() - && display.allowContentModeSwitch()) { - mWindowManager.mDisplayWindowSettings - .setShouldShowSystemDecorsInternalLocked(display, - display.mDisplay.canHostTasks()); + if (ENABLE_DISPLAY_CONTENT_MODE_MANAGEMENT.isTrue()) { + if (display.allowContentModeSwitch()) { + mWindowManager.mDisplayWindowSettings + .setShouldShowSystemDecorsInternalLocked(display, + display.mDisplay.canHostTasks()); + } + + final boolean inTopology = mWindowManager.mDisplayWindowSettings + .shouldShowSystemDecorsLocked(display); + mWmService.mDisplayManagerInternal.onDisplayBelongToTopologyChanged(displayId, + inTopology); } startSystemDecorations(display, "displayAdded"); diff --git a/services/tests/wmtests/src/com/android/server/wm/RootWindowContainerTests.java b/services/tests/wmtests/src/com/android/server/wm/RootWindowContainerTests.java index e4a1bf603cf0..34e9bed8463a 100644 --- a/services/tests/wmtests/src/com/android/server/wm/RootWindowContainerTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/RootWindowContainerTests.java @@ -31,6 +31,7 @@ import static android.window.DisplayAreaOrganizer.FEATURE_VENDOR_FIRST; import static com.android.dx.mockito.inline.extended.ExtendedMockito.doNothing; import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn; import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn; +import static com.android.server.display.feature.flags.Flags.FLAG_ENABLE_DISPLAY_CONTENT_MODE_MANAGEMENT; import static com.android.server.wm.ActivityRecord.State.FINISHING; import static com.android.server.wm.ActivityRecord.State.PAUSED; import static com.android.server.wm.ActivityRecord.State.PAUSING; @@ -82,6 +83,7 @@ import android.os.UserHandle; import android.platform.test.annotations.EnableFlags; import android.platform.test.annotations.Presubmit; import android.util.Pair; +import android.view.DisplayInfo; import androidx.test.filters.MediumTest; @@ -1379,6 +1381,23 @@ public class RootWindowContainerTests extends WindowTestsBase { verify(controller, never()).notifyTaskProfileLocked(any(), anyInt()); } + @EnableFlags(FLAG_ENABLE_DISPLAY_CONTENT_MODE_MANAGEMENT) + @Test + public void testOnDisplayBelongToTopologyChanged() { + final DisplayInfo displayInfo = new DisplayInfo(); + displayInfo.copyFrom(mDisplayInfo); + displayInfo.displayId = DEFAULT_DISPLAY + 1; + final DisplayContent dc = createNewDisplay(displayInfo); + final int displayId = dc.getDisplayId(); + + doReturn(dc).when(mRootWindowContainer).getDisplayContentOrCreate(displayId); + doReturn(true).when(mWm.mDisplayWindowSettings).shouldShowSystemDecorsLocked(dc); + + mRootWindowContainer.onDisplayAdded(displayId); + verify(mWm.mDisplayManagerInternal, times(1)).onDisplayBelongToTopologyChanged(anyInt(), + anyBoolean()); + } + /** * Mock {@link RootWindowContainer#resolveHomeActivity} for returning consistent activity * info for test cases. |