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

Commit 0638a9f9 authored by Ming-Shin Lu's avatar Ming-Shin Lu
Browse files

Fix Keyboard covered input box after leaving split screen

When leaving split-screen, task organizer will trigger transaction to
reparent task and then invoking updateAboveInsetsState for all windows
when updating the IME layering target through the below call path:

InsetsStateController.updateAboveInsetsState
   DisplayContent.setImeLayeringTargetInner
     DisplayContent.computeImeTarget
       DisplayContent.updateFocusedWindowLocked
         ..
           DisplayContent.layoutAndAssignWindowLayersIfNeeded
             Task.reparent
               ..
                WindowOrganizerController.applyTransaction

However, DC#forAllWindows will skip IME windows in
WindowState#applyImeWindowsIfNeeded since split-screen mode not yet be
changed. that caused the application will get mAboveInsetsState when
dispatching to the client because system thought the app window is above
IME.

Use isSplitScreenModeActivated() to consolide the split-screen check in
case misjudge for this issue.

Fix: 186746922
Test: atest InsetsStateControllerTest
Test: manual as issue steps
Change-Id: I47bcb1234a49ea35c5e0d7281973fb3237e420eb
parent f53378bd
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -2456,6 +2456,10 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
        setWindowingMode(windowingMode);
    }

    /**
     * See {@code WindowState#applyImeWindowsIfNeeded} for the details that we won't traverse the
     * IME window in some cases.
     */
    boolean forAllImeWindows(ToBooleanFunction<WindowState> callback, boolean traverseTopToBottom) {
        return mImeWindowsContainer.forAllWindowForce(callback, traverseTopToBottom);
    }
@@ -4573,6 +4577,8 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
        private boolean skipImeWindowsDuringTraversal(DisplayContent dc) {
            // We skip IME windows so they're processed just above their target, except
            // in split-screen mode where we process the IME containers above the docked divider.
            // Note that this method check should align with {@link
            // WindowState#applyImeWindowsIfNeeded} in case of any state mismatch.
            return dc.getImeTarget(IME_TARGET_LAYERING) != null
                    && !dc.getDefaultTaskDisplayArea().isSplitScreenModeActivated();
        }
+4 −1
Original line number Diff line number Diff line
@@ -4829,7 +4829,10 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
        // directly above it. The exception is if we are in split screen
        // in which case we process the IME at the DisplayContent level to
        // ensure it is above the docked divider.
        if (isImeLayeringTarget() && !inSplitScreenWindowingMode()) {
        // (i.e. Like {@link DisplayContent.ImeContainer#skipImeWindowsDuringTraversal}, the IME
        // window will be ignored to traverse when the IME target is still in split-screen mode).
        if (isImeLayeringTarget()
                && !getDisplayContent().getDefaultTaskDisplayArea().isSplitScreenModeActivated()) {
            if (getDisplayContent().forAllImeWindows(callback, traverseTopToBottom)) {
                return true;
            }