Merge "Do not propagate always-on-top config to child containers" into tm-dev am: 0e52eb3aa7

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/18492569

Change-Id: Ia5ecab69d7040152e664a8e9ac6405a676e5e8e8
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
Louis Chang
2022-05-23 05:18:44 +00:00
committed by Automerger Merge Worker
4 changed files with 31 additions and 2 deletions

View File

@@ -345,6 +345,14 @@ public class WindowConfiguration implements Parcelable, Comparable<WindowConfigu
mAlwaysOnTop = alwaysOnTop ? ALWAYS_ON_TOP_ON : ALWAYS_ON_TOP_OFF; mAlwaysOnTop = alwaysOnTop ? ALWAYS_ON_TOP_ON : ALWAYS_ON_TOP_OFF;
} }
/**
* Unsets always-on-top to undefined.
* @hide
*/
public void unsetAlwaysOnTop() {
mAlwaysOnTop = ALWAYS_ON_TOP_UNDEFINED;
}
private void setAlwaysOnTop(@AlwaysOnTop int alwaysOnTop) { private void setAlwaysOnTop(@AlwaysOnTop int alwaysOnTop) {
mAlwaysOnTop = alwaysOnTop; mAlwaysOnTop = alwaysOnTop;
} }

View File

@@ -126,6 +126,10 @@ public abstract class ConfigurationContainer<E extends ConfigurationContainer> {
mResolvedTmpConfig.setTo(mResolvedOverrideConfiguration); mResolvedTmpConfig.setTo(mResolvedOverrideConfiguration);
resolveOverrideConfiguration(newParentConfig); resolveOverrideConfiguration(newParentConfig);
mFullConfiguration.setTo(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); mFullConfiguration.updateFrom(mResolvedOverrideConfiguration);
onMergedOverrideConfigurationChanged(); onMergedOverrideConfigurationChanged();
if (!mResolvedTmpConfig.equals(mResolvedOverrideConfiguration)) { if (!mResolvedTmpConfig.equals(mResolvedOverrideConfiguration)) {
@@ -228,6 +232,10 @@ public abstract class ConfigurationContainer<E extends ConfigurationContainer> {
final ConfigurationContainer parent = getParent(); final ConfigurationContainer parent = getParent();
if (parent != null) { if (parent != null) {
mMergedOverrideConfiguration.setTo(parent.getMergedOverrideConfiguration()); 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); mMergedOverrideConfiguration.updateFrom(mResolvedOverrideConfiguration);
} else { } else {
mMergedOverrideConfiguration.setTo(mResolvedOverrideConfiguration); mMergedOverrideConfiguration.setTo(mResolvedOverrideConfiguration);

View File

@@ -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.ACTIVITY_TYPE_UNDEFINED;
import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM; import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM;
import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN; 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.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED;
import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE; import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_PORTRAIT; import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
@@ -209,6 +210,20 @@ public class ConfigurationContainerTests {
assertEquals(mergedConfig2, child2.getConfiguration()); 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 @Test
public void testSetWindowingMode() { public void testSetWindowingMode() {
final TestConfigurationContainer root = new TestConfigurationContainer(); final TestConfigurationContainer root = new TestConfigurationContainer();

View File

@@ -674,8 +674,6 @@ public class TaskDisplayAreaTests extends WindowTestsBase {
taskDisplayArea.positionChildAt(POSITION_TOP, alwaysOnTopRootTask, taskDisplayArea.positionChildAt(POSITION_TOP, alwaysOnTopRootTask,
false /* includingParents */); false /* includingParents */);
assertTrue(alwaysOnTopRootTask.isAlwaysOnTop()); 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()); assertEquals(alwaysOnTopRootTask, taskDisplayArea.getTopRootTask());
final Task pinnedRootTask = taskDisplayArea.createRootTask( final Task pinnedRootTask = taskDisplayArea.createRootTask(