Loading services/core/java/com/android/server/wm/DisplayContent.java +4 −0 Original line number Original line Diff line number Diff line Loading @@ -685,6 +685,10 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp */ */ private boolean mInEnsureActivitiesVisible = false; private boolean mInEnsureActivitiesVisible = false; // Used to indicate that the movement of child tasks to top will not move the display to top as // well and thus won't change the top resumed / focused record boolean mDontMoveToTop; private final Consumer<WindowState> mUpdateWindowsForAnimator = w -> { private final Consumer<WindowState> mUpdateWindowsForAnimator = w -> { WindowStateAnimator winAnimator = w.mWinAnimator; WindowStateAnimator winAnimator = w.mWinAnimator; final ActivityRecord activity = w.mActivityRecord; final ActivityRecord activity = w.mActivityRecord; Loading services/core/java/com/android/server/wm/DisplayWindowSettings.java +32 −5 Original line number Original line Diff line number Diff line Loading @@ -16,11 +16,11 @@ package com.android.server.wm; package com.android.server.wm; import static android.view.WindowManager.DISPLAY_IME_POLICY_FALLBACK_DISPLAY; import static android.view.WindowManager.DISPLAY_IME_POLICY_LOCAL; import static android.view.WindowManager.REMOVE_CONTENT_MODE_DESTROY; import static android.view.WindowManager.REMOVE_CONTENT_MODE_DESTROY; import static android.view.WindowManager.REMOVE_CONTENT_MODE_MOVE_TO_PRIMARY; import static android.view.WindowManager.REMOVE_CONTENT_MODE_MOVE_TO_PRIMARY; import static android.view.WindowManager.REMOVE_CONTENT_MODE_UNDEFINED; import static android.view.WindowManager.REMOVE_CONTENT_MODE_UNDEFINED; import static android.view.WindowManager.DISPLAY_IME_POLICY_LOCAL; import static android.view.WindowManager.DISPLAY_IME_POLICY_FALLBACK_DISPLAY; import static com.android.server.wm.DisplayContent.FORCE_SCALING_MODE_AUTO; import static com.android.server.wm.DisplayContent.FORCE_SCALING_MODE_AUTO; import static com.android.server.wm.DisplayContent.FORCE_SCALING_MODE_DISABLED; import static com.android.server.wm.DisplayContent.FORCE_SCALING_MODE_DISABLED; Loading Loading @@ -196,6 +196,14 @@ class DisplayWindowSettings { mSettingsProvider.updateOverrideSettings(displayInfo, overrideSettings); mSettingsProvider.updateOverrideSettings(displayInfo, overrideSettings); } } void setDontMoveToTop(DisplayContent dc, boolean dontMoveToTop) { DisplayInfo displayInfo = dc.getDisplayInfo(); SettingsProvider.SettingsEntry overrideSettings = mSettingsProvider.getSettings(displayInfo); overrideSettings.mDontMoveToTop = dontMoveToTop; mSettingsProvider.updateOverrideSettings(displayInfo, overrideSettings); } boolean shouldShowSystemDecorsLocked(DisplayContent dc) { boolean shouldShowSystemDecorsLocked(DisplayContent dc) { if (dc.getDisplayId() == Display.DEFAULT_DISPLAY) { if (dc.getDisplayId() == Display.DEFAULT_DISPLAY) { // Default display should show system decors. // Default display should show system decors. Loading Loading @@ -274,6 +282,10 @@ class DisplayWindowSettings { final int forcedScalingMode = settings.mForcedScalingMode != null final int forcedScalingMode = settings.mForcedScalingMode != null ? settings.mForcedScalingMode : FORCE_SCALING_MODE_AUTO; ? settings.mForcedScalingMode : FORCE_SCALING_MODE_AUTO; dc.mDisplayScalingDisabled = forcedScalingMode == FORCE_SCALING_MODE_DISABLED; dc.mDisplayScalingDisabled = forcedScalingMode == FORCE_SCALING_MODE_DISABLED; boolean dontMoveToTop = settings.mDontMoveToTop != null ? settings.mDontMoveToTop : false; dc.mDontMoveToTop = dontMoveToTop; } } /** /** Loading Loading @@ -358,6 +370,8 @@ class DisplayWindowSettings { Boolean mIgnoreOrientationRequest; Boolean mIgnoreOrientationRequest; @Nullable @Nullable Boolean mIgnoreDisplayCutout; Boolean mIgnoreDisplayCutout; @Nullable Boolean mDontMoveToTop; SettingsEntry() {} SettingsEntry() {} Loading Loading @@ -432,6 +446,10 @@ class DisplayWindowSettings { mIgnoreDisplayCutout = other.mIgnoreDisplayCutout; mIgnoreDisplayCutout = other.mIgnoreDisplayCutout; changed = true; changed = true; } } if (other.mDontMoveToTop != mDontMoveToTop) { mDontMoveToTop = other.mDontMoveToTop; changed = true; } return changed; return changed; } } Loading Loading @@ -515,6 +533,11 @@ class DisplayWindowSettings { mIgnoreDisplayCutout = delta.mIgnoreDisplayCutout; mIgnoreDisplayCutout = delta.mIgnoreDisplayCutout; changed = true; changed = true; } } if (delta.mDontMoveToTop != null && delta.mDontMoveToTop != mDontMoveToTop) { mDontMoveToTop = delta.mDontMoveToTop; changed = true; } return changed; return changed; } } Loading @@ -531,7 +554,8 @@ class DisplayWindowSettings { && mImePolicy == null && mImePolicy == null && mFixedToUserRotation == null && mFixedToUserRotation == null && mIgnoreOrientationRequest == null && mIgnoreOrientationRequest == null && mIgnoreDisplayCutout == null; && mIgnoreDisplayCutout == null && mDontMoveToTop == null; } } @Override @Override Loading @@ -553,7 +577,8 @@ class DisplayWindowSettings { && Objects.equals(mImePolicy, that.mImePolicy) && Objects.equals(mImePolicy, that.mImePolicy) && Objects.equals(mFixedToUserRotation, that.mFixedToUserRotation) && Objects.equals(mFixedToUserRotation, that.mFixedToUserRotation) && Objects.equals(mIgnoreOrientationRequest, that.mIgnoreOrientationRequest) && Objects.equals(mIgnoreOrientationRequest, that.mIgnoreOrientationRequest) && Objects.equals(mIgnoreDisplayCutout, that.mIgnoreDisplayCutout); && Objects.equals(mIgnoreDisplayCutout, that.mIgnoreDisplayCutout) && Objects.equals(mDontMoveToTop, that.mDontMoveToTop); } } @Override @Override Loading @@ -561,7 +586,8 @@ class DisplayWindowSettings { return Objects.hash(mWindowingMode, mUserRotationMode, mUserRotation, mForcedWidth, return Objects.hash(mWindowingMode, mUserRotationMode, mUserRotation, mForcedWidth, mForcedHeight, mForcedDensity, mForcedScalingMode, mRemoveContentMode, mForcedHeight, mForcedDensity, mForcedScalingMode, mRemoveContentMode, mShouldShowWithInsecureKeyguard, mShouldShowSystemDecors, mImePolicy, mShouldShowWithInsecureKeyguard, mShouldShowSystemDecors, mImePolicy, mFixedToUserRotation, mIgnoreOrientationRequest, mIgnoreDisplayCutout); mFixedToUserRotation, mIgnoreOrientationRequest, mIgnoreDisplayCutout, mDontMoveToTop); } } @Override @Override Loading @@ -581,6 +607,7 @@ class DisplayWindowSettings { + ", mFixedToUserRotation=" + mFixedToUserRotation + ", mFixedToUserRotation=" + mFixedToUserRotation + ", mIgnoreOrientationRequest=" + mIgnoreOrientationRequest + ", mIgnoreOrientationRequest=" + mIgnoreOrientationRequest + ", mIgnoreDisplayCutout=" + mIgnoreDisplayCutout + ", mIgnoreDisplayCutout=" + mIgnoreDisplayCutout + ", mDontMoveToTop=" + mDontMoveToTop + '}'; + '}'; } } } } Loading services/core/java/com/android/server/wm/DisplayWindowSettingsProvider.java +7 −0 Original line number Original line Diff line number Diff line Loading @@ -405,6 +405,9 @@ class DisplayWindowSettingsProvider implements SettingsProvider { "ignoreOrientationRequest", null /* defaultValue */); "ignoreOrientationRequest", null /* defaultValue */); settingsEntry.mIgnoreDisplayCutout = getBooleanAttribute(parser, settingsEntry.mIgnoreDisplayCutout = getBooleanAttribute(parser, "ignoreDisplayCutout", null /* defaultValue */); "ignoreDisplayCutout", null /* defaultValue */); settingsEntry.mDontMoveToTop = getBooleanAttribute(parser, "dontMoveToTop", null /* defaultValue */); fileData.mSettings.put(name, settingsEntry); fileData.mSettings.put(name, settingsEntry); } } XmlUtils.skipCurrentTag(parser); XmlUtils.skipCurrentTag(parser); Loading Loading @@ -496,6 +499,10 @@ class DisplayWindowSettingsProvider implements SettingsProvider { out.attributeBoolean(null, "ignoreDisplayCutout", out.attributeBoolean(null, "ignoreDisplayCutout", settingsEntry.mIgnoreDisplayCutout); settingsEntry.mIgnoreDisplayCutout); } } if (settingsEntry.mDontMoveToTop != null) { out.attributeBoolean(null, "dontMoveToTop", settingsEntry.mDontMoveToTop); } out.endTag(null, "display"); out.endTag(null, "display"); } } Loading services/core/java/com/android/server/wm/TaskDisplayArea.java +5 −1 Original line number Original line Diff line number Diff line Loading @@ -404,7 +404,11 @@ final class TaskDisplayArea extends DisplayArea<WindowContainer> { } } // We don't allow untrusted display to top when root task moves to top, // We don't allow untrusted display to top when root task moves to top, // until user tapping this display to change display position as top intentionally. // until user tapping this display to change display position as top intentionally. if (!mDisplayContent.isTrusted() && !getParent().isOnTop()) { // // Displays with {@code mDontMoveToTop} property set to {@code true} won't be // allowed to top neither. if ((!mDisplayContent.isTrusted() || mDisplayContent.mDontMoveToTop) && !getParent().isOnTop()) { includingParents = false; includingParents = false; } } final int targetPosition = findPositionForRootTask(position, child, false /* adding */); final int targetPosition = findPositionForRootTask(position, child, false /* adding */); Loading services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java +10 −0 Original line number Original line Diff line number Diff line Loading @@ -1607,6 +1607,16 @@ public class DisplayContentTests extends WindowTestsBase { assertNull(taskDisplayArea.getOrCreateRootHomeTask()); assertNull(taskDisplayArea.getOrCreateRootHomeTask()); } } @Test public void testGetOrCreateRootHomeTask_dontMoveToTop() { DisplayContent display = createNewDisplay(); display.mDontMoveToTop = true; TaskDisplayArea taskDisplayArea = display.getDefaultTaskDisplayArea(); assertNull(taskDisplayArea.getRootHomeTask()); assertNull(taskDisplayArea.getOrCreateRootHomeTask()); } @Test @Test public void testValidWindowingLayer() { public void testValidWindowingLayer() { final SurfaceControl windowingLayer = mDisplayContent.getWindowingLayer(); final SurfaceControl windowingLayer = mDisplayContent.getWindowingLayer(); Loading Loading
services/core/java/com/android/server/wm/DisplayContent.java +4 −0 Original line number Original line Diff line number Diff line Loading @@ -685,6 +685,10 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp */ */ private boolean mInEnsureActivitiesVisible = false; private boolean mInEnsureActivitiesVisible = false; // Used to indicate that the movement of child tasks to top will not move the display to top as // well and thus won't change the top resumed / focused record boolean mDontMoveToTop; private final Consumer<WindowState> mUpdateWindowsForAnimator = w -> { private final Consumer<WindowState> mUpdateWindowsForAnimator = w -> { WindowStateAnimator winAnimator = w.mWinAnimator; WindowStateAnimator winAnimator = w.mWinAnimator; final ActivityRecord activity = w.mActivityRecord; final ActivityRecord activity = w.mActivityRecord; Loading
services/core/java/com/android/server/wm/DisplayWindowSettings.java +32 −5 Original line number Original line Diff line number Diff line Loading @@ -16,11 +16,11 @@ package com.android.server.wm; package com.android.server.wm; import static android.view.WindowManager.DISPLAY_IME_POLICY_FALLBACK_DISPLAY; import static android.view.WindowManager.DISPLAY_IME_POLICY_LOCAL; import static android.view.WindowManager.REMOVE_CONTENT_MODE_DESTROY; import static android.view.WindowManager.REMOVE_CONTENT_MODE_DESTROY; import static android.view.WindowManager.REMOVE_CONTENT_MODE_MOVE_TO_PRIMARY; import static android.view.WindowManager.REMOVE_CONTENT_MODE_MOVE_TO_PRIMARY; import static android.view.WindowManager.REMOVE_CONTENT_MODE_UNDEFINED; import static android.view.WindowManager.REMOVE_CONTENT_MODE_UNDEFINED; import static android.view.WindowManager.DISPLAY_IME_POLICY_LOCAL; import static android.view.WindowManager.DISPLAY_IME_POLICY_FALLBACK_DISPLAY; import static com.android.server.wm.DisplayContent.FORCE_SCALING_MODE_AUTO; import static com.android.server.wm.DisplayContent.FORCE_SCALING_MODE_AUTO; import static com.android.server.wm.DisplayContent.FORCE_SCALING_MODE_DISABLED; import static com.android.server.wm.DisplayContent.FORCE_SCALING_MODE_DISABLED; Loading Loading @@ -196,6 +196,14 @@ class DisplayWindowSettings { mSettingsProvider.updateOverrideSettings(displayInfo, overrideSettings); mSettingsProvider.updateOverrideSettings(displayInfo, overrideSettings); } } void setDontMoveToTop(DisplayContent dc, boolean dontMoveToTop) { DisplayInfo displayInfo = dc.getDisplayInfo(); SettingsProvider.SettingsEntry overrideSettings = mSettingsProvider.getSettings(displayInfo); overrideSettings.mDontMoveToTop = dontMoveToTop; mSettingsProvider.updateOverrideSettings(displayInfo, overrideSettings); } boolean shouldShowSystemDecorsLocked(DisplayContent dc) { boolean shouldShowSystemDecorsLocked(DisplayContent dc) { if (dc.getDisplayId() == Display.DEFAULT_DISPLAY) { if (dc.getDisplayId() == Display.DEFAULT_DISPLAY) { // Default display should show system decors. // Default display should show system decors. Loading Loading @@ -274,6 +282,10 @@ class DisplayWindowSettings { final int forcedScalingMode = settings.mForcedScalingMode != null final int forcedScalingMode = settings.mForcedScalingMode != null ? settings.mForcedScalingMode : FORCE_SCALING_MODE_AUTO; ? settings.mForcedScalingMode : FORCE_SCALING_MODE_AUTO; dc.mDisplayScalingDisabled = forcedScalingMode == FORCE_SCALING_MODE_DISABLED; dc.mDisplayScalingDisabled = forcedScalingMode == FORCE_SCALING_MODE_DISABLED; boolean dontMoveToTop = settings.mDontMoveToTop != null ? settings.mDontMoveToTop : false; dc.mDontMoveToTop = dontMoveToTop; } } /** /** Loading Loading @@ -358,6 +370,8 @@ class DisplayWindowSettings { Boolean mIgnoreOrientationRequest; Boolean mIgnoreOrientationRequest; @Nullable @Nullable Boolean mIgnoreDisplayCutout; Boolean mIgnoreDisplayCutout; @Nullable Boolean mDontMoveToTop; SettingsEntry() {} SettingsEntry() {} Loading Loading @@ -432,6 +446,10 @@ class DisplayWindowSettings { mIgnoreDisplayCutout = other.mIgnoreDisplayCutout; mIgnoreDisplayCutout = other.mIgnoreDisplayCutout; changed = true; changed = true; } } if (other.mDontMoveToTop != mDontMoveToTop) { mDontMoveToTop = other.mDontMoveToTop; changed = true; } return changed; return changed; } } Loading Loading @@ -515,6 +533,11 @@ class DisplayWindowSettings { mIgnoreDisplayCutout = delta.mIgnoreDisplayCutout; mIgnoreDisplayCutout = delta.mIgnoreDisplayCutout; changed = true; changed = true; } } if (delta.mDontMoveToTop != null && delta.mDontMoveToTop != mDontMoveToTop) { mDontMoveToTop = delta.mDontMoveToTop; changed = true; } return changed; return changed; } } Loading @@ -531,7 +554,8 @@ class DisplayWindowSettings { && mImePolicy == null && mImePolicy == null && mFixedToUserRotation == null && mFixedToUserRotation == null && mIgnoreOrientationRequest == null && mIgnoreOrientationRequest == null && mIgnoreDisplayCutout == null; && mIgnoreDisplayCutout == null && mDontMoveToTop == null; } } @Override @Override Loading @@ -553,7 +577,8 @@ class DisplayWindowSettings { && Objects.equals(mImePolicy, that.mImePolicy) && Objects.equals(mImePolicy, that.mImePolicy) && Objects.equals(mFixedToUserRotation, that.mFixedToUserRotation) && Objects.equals(mFixedToUserRotation, that.mFixedToUserRotation) && Objects.equals(mIgnoreOrientationRequest, that.mIgnoreOrientationRequest) && Objects.equals(mIgnoreOrientationRequest, that.mIgnoreOrientationRequest) && Objects.equals(mIgnoreDisplayCutout, that.mIgnoreDisplayCutout); && Objects.equals(mIgnoreDisplayCutout, that.mIgnoreDisplayCutout) && Objects.equals(mDontMoveToTop, that.mDontMoveToTop); } } @Override @Override Loading @@ -561,7 +586,8 @@ class DisplayWindowSettings { return Objects.hash(mWindowingMode, mUserRotationMode, mUserRotation, mForcedWidth, return Objects.hash(mWindowingMode, mUserRotationMode, mUserRotation, mForcedWidth, mForcedHeight, mForcedDensity, mForcedScalingMode, mRemoveContentMode, mForcedHeight, mForcedDensity, mForcedScalingMode, mRemoveContentMode, mShouldShowWithInsecureKeyguard, mShouldShowSystemDecors, mImePolicy, mShouldShowWithInsecureKeyguard, mShouldShowSystemDecors, mImePolicy, mFixedToUserRotation, mIgnoreOrientationRequest, mIgnoreDisplayCutout); mFixedToUserRotation, mIgnoreOrientationRequest, mIgnoreDisplayCutout, mDontMoveToTop); } } @Override @Override Loading @@ -581,6 +607,7 @@ class DisplayWindowSettings { + ", mFixedToUserRotation=" + mFixedToUserRotation + ", mFixedToUserRotation=" + mFixedToUserRotation + ", mIgnoreOrientationRequest=" + mIgnoreOrientationRequest + ", mIgnoreOrientationRequest=" + mIgnoreOrientationRequest + ", mIgnoreDisplayCutout=" + mIgnoreDisplayCutout + ", mIgnoreDisplayCutout=" + mIgnoreDisplayCutout + ", mDontMoveToTop=" + mDontMoveToTop + '}'; + '}'; } } } } Loading
services/core/java/com/android/server/wm/DisplayWindowSettingsProvider.java +7 −0 Original line number Original line Diff line number Diff line Loading @@ -405,6 +405,9 @@ class DisplayWindowSettingsProvider implements SettingsProvider { "ignoreOrientationRequest", null /* defaultValue */); "ignoreOrientationRequest", null /* defaultValue */); settingsEntry.mIgnoreDisplayCutout = getBooleanAttribute(parser, settingsEntry.mIgnoreDisplayCutout = getBooleanAttribute(parser, "ignoreDisplayCutout", null /* defaultValue */); "ignoreDisplayCutout", null /* defaultValue */); settingsEntry.mDontMoveToTop = getBooleanAttribute(parser, "dontMoveToTop", null /* defaultValue */); fileData.mSettings.put(name, settingsEntry); fileData.mSettings.put(name, settingsEntry); } } XmlUtils.skipCurrentTag(parser); XmlUtils.skipCurrentTag(parser); Loading Loading @@ -496,6 +499,10 @@ class DisplayWindowSettingsProvider implements SettingsProvider { out.attributeBoolean(null, "ignoreDisplayCutout", out.attributeBoolean(null, "ignoreDisplayCutout", settingsEntry.mIgnoreDisplayCutout); settingsEntry.mIgnoreDisplayCutout); } } if (settingsEntry.mDontMoveToTop != null) { out.attributeBoolean(null, "dontMoveToTop", settingsEntry.mDontMoveToTop); } out.endTag(null, "display"); out.endTag(null, "display"); } } Loading
services/core/java/com/android/server/wm/TaskDisplayArea.java +5 −1 Original line number Original line Diff line number Diff line Loading @@ -404,7 +404,11 @@ final class TaskDisplayArea extends DisplayArea<WindowContainer> { } } // We don't allow untrusted display to top when root task moves to top, // We don't allow untrusted display to top when root task moves to top, // until user tapping this display to change display position as top intentionally. // until user tapping this display to change display position as top intentionally. if (!mDisplayContent.isTrusted() && !getParent().isOnTop()) { // // Displays with {@code mDontMoveToTop} property set to {@code true} won't be // allowed to top neither. if ((!mDisplayContent.isTrusted() || mDisplayContent.mDontMoveToTop) && !getParent().isOnTop()) { includingParents = false; includingParents = false; } } final int targetPosition = findPositionForRootTask(position, child, false /* adding */); final int targetPosition = findPositionForRootTask(position, child, false /* adding */); Loading
services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java +10 −0 Original line number Original line Diff line number Diff line Loading @@ -1607,6 +1607,16 @@ public class DisplayContentTests extends WindowTestsBase { assertNull(taskDisplayArea.getOrCreateRootHomeTask()); assertNull(taskDisplayArea.getOrCreateRootHomeTask()); } } @Test public void testGetOrCreateRootHomeTask_dontMoveToTop() { DisplayContent display = createNewDisplay(); display.mDontMoveToTop = true; TaskDisplayArea taskDisplayArea = display.getDefaultTaskDisplayArea(); assertNull(taskDisplayArea.getRootHomeTask()); assertNull(taskDisplayArea.getOrCreateRootHomeTask()); } @Test @Test public void testValidWindowingLayer() { public void testValidWindowingLayer() { final SurfaceControl windowingLayer = mDisplayContent.getWindowingLayer(); final SurfaceControl windowingLayer = mDisplayContent.getWindowingLayer(); Loading