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

Commit 85bd04b1 authored by Riddle Hsu's avatar Riddle Hsu
Browse files

Clear last focus of previous display when reparenting

Assume 2 displays:
 D0 contains activities A, X
 D1 contains an activity B

The update order of focus is from top to bottom. When reparenting
X from D0 to D1, and D1 becomes the top display:
 1) D1: X gains focus, B loses focus
 2) D0: A gains focus, X loses focus
That results the top activity X on top display 0 does not have focus
(the state in client side view root).

Bug: 119664976
Test: atest DisplayContentTests#testClearLastFocusWhenReparentingFocusedWindow
Test: atest WindowFocusTests
Change-Id: I5bf3546cde3ac6d4be45d1a971cda033663cc919
parent 627ffa90
Loading
Loading
Loading
Loading
+11 −5
Original line number Diff line number Diff line
@@ -980,12 +980,18 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo
        if (prevDc == this) {
            return;
        }
        if (prevDc != null && prevDc.mTokenMap.remove(token.token) != null
                && token.asAppWindowToken() == null) {
            // Removed the token from the map, but made sure it's not an app token before removing
            // from parent.
        if (prevDc != null) {
            if (prevDc.mTokenMap.remove(token.token) != null && token.asAppWindowToken() == null) {
                // Removed the token from the map, but made sure it's not an app token before
                // removing from parent.
                token.getParent().removeChild(token);
            }
            if (prevDc.mLastFocus == mCurrentFocus) {
                // The window has become the focus of this display, so it should not be notified
                // that it lost focus from the previous display.
                prevDc.mLastFocus = null;
            }
        }

        addWindowToken(token.token, token);
    }
+12 −0
Original line number Diff line number Diff line
@@ -548,6 +548,18 @@ public class DisplayContentTests extends WindowTestsBase {
                .setDisplayInfoOverrideFromWindowManager(dc.getDisplayId(), null);
    }

    @Test
    public void testClearLastFocusWhenReparentingFocusedWindow() {
        final DisplayContent defaultDisplay = mWm.getDefaultDisplayContentLocked();
        final WindowState window = createWindow(null /* parent */, TYPE_BASE_APPLICATION,
                defaultDisplay, "window");
        defaultDisplay.mLastFocus = window;
        mDisplayContent.mCurrentFocus = window;
        mDisplayContent.reParentWindowToken(window.mToken);

        assertNull(defaultDisplay.mLastFocus);
    }

    @Test
    public void testGetPreferredOptionsPanelGravityFromDifferentDisplays() {
        final DisplayContent portraitDisplay = createNewDisplay();