From 8c5ad556c658e946939796c9e7267b878a01fe00 Mon Sep 17 00:00:00 2001 From: Louis Chang Date: Fri, 20 May 2022 10:31:49 +0800 Subject: [PATCH] Do not propagate always-on-top config to child containers Doesn't make sense to propagate the always-on-top config to child containers. It also prevents positioning a newly added child WC to top. Bug: 230008268 Test: atest ConfigurationContainerTests Change-Id: I981636f3297e5c77393320d052a7f1b4e5c5e97b --- core/java/android/app/WindowConfiguration.java | 8 ++++++++ .../android/server/wm/ConfigurationContainer.java | 8 ++++++++ .../server/wm/ConfigurationContainerTests.java | 15 +++++++++++++++ .../android/server/wm/TaskDisplayAreaTests.java | 2 -- 4 files changed, 31 insertions(+), 2 deletions(-) diff --git a/core/java/android/app/WindowConfiguration.java b/core/java/android/app/WindowConfiguration.java index 5ef3fc05130c0..e96a986971846 100644 --- a/core/java/android/app/WindowConfiguration.java +++ b/core/java/android/app/WindowConfiguration.java @@ -345,6 +345,14 @@ public class WindowConfiguration implements Parcelable, Comparable { mResolvedTmpConfig.setTo(mResolvedOverrideConfiguration); resolveOverrideConfiguration(newParentConfig); mFullConfiguration.setTo(newParentConfig); + // Do not inherit always-on-top property from parent, otherwise the always-on-top + // property is propagated to all children. In that case, newly added child is + // always being positioned at bottom (behind the always-on-top siblings). + mFullConfiguration.windowConfiguration.unsetAlwaysOnTop(); mFullConfiguration.updateFrom(mResolvedOverrideConfiguration); onMergedOverrideConfigurationChanged(); if (!mResolvedTmpConfig.equals(mResolvedOverrideConfiguration)) { @@ -228,6 +232,10 @@ public abstract class ConfigurationContainer { final ConfigurationContainer parent = getParent(); if (parent != null) { mMergedOverrideConfiguration.setTo(parent.getMergedOverrideConfiguration()); + // Do not inherit always-on-top property from parent, otherwise the always-on-top + // property is propagated to all children. In that case, newly added child is + // always being positioned at bottom (behind the always-on-top siblings). + mMergedOverrideConfiguration.windowConfiguration.unsetAlwaysOnTop(); mMergedOverrideConfiguration.updateFrom(mResolvedOverrideConfiguration); } else { mMergedOverrideConfiguration.setTo(mResolvedOverrideConfiguration); diff --git a/services/tests/wmtests/src/com/android/server/wm/ConfigurationContainerTests.java b/services/tests/wmtests/src/com/android/server/wm/ConfigurationContainerTests.java index 59b12e406d70c..5d824e9204db0 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ConfigurationContainerTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/ConfigurationContainerTests.java @@ -21,6 +21,7 @@ import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD; import static android.app.WindowConfiguration.ACTIVITY_TYPE_UNDEFINED; import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM; import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN; +import static android.app.WindowConfiguration.WINDOWING_MODE_MULTI_WINDOW; import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED; import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE; import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_PORTRAIT; @@ -209,6 +210,20 @@ public class ConfigurationContainerTests { assertEquals(mergedConfig2, child2.getConfiguration()); } + @Test + public void testSetAlwaysOnTop() { + final TestConfigurationContainer root = new TestConfigurationContainer(); + final TestConfigurationContainer child1 = root.addChild(); + final TestConfigurationContainer child2 = root.addChild(); + root.setWindowingMode(WINDOWING_MODE_MULTI_WINDOW); + root.setAlwaysOnTop(true); + final TestConfigurationContainer child3 = root.addChild(); + assertEquals(true, root.isAlwaysOnTop()); + assertEquals(false, child1.isAlwaysOnTop()); + assertEquals(false, child2.isAlwaysOnTop()); + assertEquals(false, child3.isAlwaysOnTop()); + } + @Test public void testSetWindowingMode() { final TestConfigurationContainer root = new TestConfigurationContainer(); diff --git a/services/tests/wmtests/src/com/android/server/wm/TaskDisplayAreaTests.java b/services/tests/wmtests/src/com/android/server/wm/TaskDisplayAreaTests.java index e5e0145095c1a..e8f1d2390c341 100644 --- a/services/tests/wmtests/src/com/android/server/wm/TaskDisplayAreaTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/TaskDisplayAreaTests.java @@ -674,8 +674,6 @@ public class TaskDisplayAreaTests extends WindowTestsBase { taskDisplayArea.positionChildAt(POSITION_TOP, alwaysOnTopRootTask, false /* includingParents */); assertTrue(alwaysOnTopRootTask.isAlwaysOnTop()); - // Ensure always on top state is synced to the children of the root task. - assertTrue(alwaysOnTopRootTask.getTopNonFinishingActivity().isAlwaysOnTop()); assertEquals(alwaysOnTopRootTask, taskDisplayArea.getTopRootTask()); final Task pinnedRootTask = taskDisplayArea.createRootTask(