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(