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

Commit ab616d9a authored by Antonio Kantek's avatar Antonio Kantek
Browse files

Introduce Display `dontMoveToTop` property

If `dontMoveToTop` property is set to true, then Displays won't be
allowed to top when its root task moves to top.

Note: This CL fixes the IME/CarBoard bug with activities on cluster display.

Activities started on cluster display will move to the top of the task
activity stack and will break IME/CarBoard connectivity. This CL
introduces a new flag in order to disable activities started on cluster
display to move to the top, avoiding IME connection to break.

Manual test script:
1. Build and start emulator;
2. Start maps app;
3. Enter some text on top/right search text field and don't press ENTER
(just enter the text);
4. Start some activity on cluster display:
  `adb shell dumpsys car_service start-fixed-activity-mode 1 com.android.car com.android.car.am.ContinuousBlankActivity`
5. CarBoard should not disappear.

Bug: 169598740
Test: manual (see manual test script above)
Test: atest WmTests:TaskDisplayAreaTests
Test: atest DisplayContentTests
Test: atest DisplayWindowSettingsProviderTests

Change-Id: I7e5f067634a70df2093f20aa3077e0242fa817d5
parent 0e917e1f
Loading
Loading
Loading
Loading
+4 −0
Original line number Original line Diff line number Diff line
@@ -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;
+32 −5
Original line number Original line Diff line number Diff line
@@ -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;
@@ -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.
@@ -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;
    }
    }


    /**
    /**
@@ -358,6 +370,8 @@ class DisplayWindowSettings {
            Boolean mIgnoreOrientationRequest;
            Boolean mIgnoreOrientationRequest;
            @Nullable
            @Nullable
            Boolean mIgnoreDisplayCutout;
            Boolean mIgnoreDisplayCutout;
            @Nullable
            Boolean mDontMoveToTop;


            SettingsEntry() {}
            SettingsEntry() {}


@@ -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;
            }
            }


@@ -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;
            }
            }


@@ -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
@@ -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
@@ -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
@@ -581,6 +607,7 @@ class DisplayWindowSettings {
                        + ", mFixedToUserRotation=" + mFixedToUserRotation
                        + ", mFixedToUserRotation=" + mFixedToUserRotation
                        + ", mIgnoreOrientationRequest=" + mIgnoreOrientationRequest
                        + ", mIgnoreOrientationRequest=" + mIgnoreOrientationRequest
                        + ", mIgnoreDisplayCutout=" + mIgnoreDisplayCutout
                        + ", mIgnoreDisplayCutout=" + mIgnoreDisplayCutout
                        + ", mDontMoveToTop=" + mDontMoveToTop
                        + '}';
                        + '}';
            }
            }
        }
        }
+7 −0
Original line number Original line Diff line number Diff line
@@ -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);
@@ -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");
            }
            }


+5 −1
Original line number Original line Diff line number Diff line
@@ -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 */);
+10 −0
Original line number Original line Diff line number Diff line
@@ -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