Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8c5ad556 authored by Louis Chang's avatar Louis Chang
Browse files

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
parent 04f59c26
Loading
Loading
Loading
Loading
+8 −0
Original line number Original line Diff line number Diff line
@@ -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;
    }
    }
+8 −0
Original line number Original line Diff line number Diff line
@@ -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);
+15 −0
Original line number Original line Diff line number Diff line
@@ -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();
+0 −2
Original line number Original line Diff line number Diff line
@@ -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(