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

Commit 66dc0f32 authored by Ming-Shin Lu's avatar Ming-Shin Lu Committed by Android (Google) Code Review
Browse files

Merge "Fix some IME transition issues" into sc-dev

parents 7078fbe4 a49ea6f2
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -6865,7 +6865,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
        }
        // An activity in size compatibility mode may have override bounds which equals to its
        // parent bounds, so the exact bounds should also be checked to allow IME window to attach
        // to the activity. See {@link DisplayContent#isImeAttachedToApp}.
        // to the activity. See {@link DisplayContent#shouldImeAttachedToApp}.
        final WindowContainer parent = getParent();
        return parent == null || parent.getBounds().equals(overrideBounds);
    }
+20 −4
Original line number Diff line number Diff line
@@ -1539,7 +1539,9 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
            // to cover the activity configuration change.
            return false;
        }
        if (r.mStartingData != null && r.mStartingData.hasImeSurface()) {
        if ((r.mStartingData != null && r.mStartingData.hasImeSurface())
                || (mInsetsStateController.getImeSourceProvider()
                        .getSource().getVisibleFrame() != null)) {
            // Currently it is unknown that when will IME window be ready. Reject the case to
            // avoid flickering by showing IME in inconsistent orientation.
            return false;
@@ -3633,7 +3635,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
        return mImeInputTarget != null && !mImeInputTarget.inMultiWindowMode();
    }

    boolean isImeAttachedToApp() {
    boolean shouldImeAttachedToApp() {
        return isImeControlledByApp()
                && mImeLayeringTarget != null
                && mImeLayeringTarget.mActivityRecord != null
@@ -3646,6 +3648,20 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
                && mImeLayeringTarget.matchesDisplayAreaBounds();
    }

    /**
     * Unlike {@link #shouldImeAttachedToApp()}, this method returns {@code @true} only when both
     * the IME layering target is valid to attach the IME surface to the app, and the
     * {@link #mInputMethodSurfaceParent} of the {@link ImeContainer} has actually attached to
     * the app. (i.e. Even if {@link #shouldImeAttachedToApp()} returns {@code true}, calling this
     * method will return {@code false} if the IME surface doesn't actually attach to the app.)
     */
    boolean isImeAttachedToApp() {
        return shouldImeAttachedToApp()
                && mInputMethodSurfaceParent != null
                && mInputMethodSurfaceParent.isSameSurface(
                        mImeLayeringTarget.mActivityRecord.getSurfaceControl());
    }

    /**
     * Finds the window which can host IME if IME target cannot host it.
     * e.g. IME target cannot host IME when it's display has a parent display OR when display
@@ -3774,7 +3790,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
    @VisibleForTesting
    void attachAndShowImeScreenshotOnTarget() {
        // No need to attach screenshot if the IME target not exists or screen is off.
        if (!isImeAttachedToApp() || !mWmService.mPolicy.isScreenOn()) {
        if (!shouldImeAttachedToApp() || !mWmService.mPolicy.isScreenOn()) {
            return;
        }

@@ -3942,7 +3958,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
        // Attach it to app if the target is part of an app and such app is covering the entire
        // screen. If it's not covering the entire screen the IME might extend beyond the apps
        // bounds.
        if (allowAttachToApp && isImeAttachedToApp()) {
        if (allowAttachToApp && shouldImeAttachedToApp()) {
            return mImeLayeringTarget.mActivityRecord.getSurfaceControl();
        }

+1 −1
Original line number Diff line number Diff line
@@ -425,7 +425,7 @@ class TaskSnapshotController {
        final WindowState imeWindow = task.getDisplayContent().mInputMethodWindow;
        // Exclude IME window snapshot when IME isn't proper to attach to app.
        final boolean excludeIme = imeWindow != null && imeWindow.getSurfaceControl() != null
                && !task.getDisplayContent().isImeAttachedToApp();
                && !task.getDisplayContent().shouldImeAttachedToApp();
        final WindowState navWindow =
                task.getDisplayContent().getDisplayPolicy().getNavigationBar();
        // If config_attachNavBarToAppDuringTransition is true, the nav bar will be reparent to the
+1 −1
Original line number Diff line number Diff line
@@ -2309,7 +2309,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
        // When the window configuration changed, we need to update the IME control target in
        // case the app may lose the IME inets control when exiting from split-screen mode, or the
        // IME parent may failed to attach to the app during rotating the screen.
        // See DisplayContent#isImeAttachedToApp, DisplayContent#isImeControlledByApp
        // See DisplayContent#shouldImeAttachedToApp, DisplayContent#isImeControlledByApp
        if (windowConfigChanged) {
            getDisplayContent().updateImeControlTarget();
        }
+1 −1
Original line number Diff line number Diff line
@@ -1904,7 +1904,7 @@ public class DisplayContentTests extends WindowTestsBase {
        mDisplayContent.setImeInputTarget(appWin2);
        mDisplayContent.computeImeTarget(true);
        assertEquals(appWin2, mDisplayContent.getImeTarget(IME_TARGET_LAYERING));
        assertTrue(mDisplayContent.isImeAttachedToApp());
        assertTrue(mDisplayContent.shouldImeAttachedToApp());

        verify(mDisplayContent, atLeast(1)).attachAndShowImeScreenshotOnTarget();
        verify(mWm.mTaskSnapshotController).snapshotImeFromAttachedTask(appWin1.getTask());
Loading