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

Commit 792faa2c authored by satok's avatar satok
Browse files

Reduce window resizing during IME transition

Bug: 5137498
Change-Id: I5723f627ce323b0d12bd7b93f5b35fc4d342b50c
parent 0e0d7a74
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -1073,6 +1073,13 @@ public interface WindowManagerPolicy {
     */
    public void stopScreenSaver();

    /**
     * Set the last used input method window state. This state is used to make IME transition
     * smooth.
     * @hide
     */
    public void setLastInputMethodWindowLw(WindowState ime, WindowState target);

    /**
     * Print the WindowManagerPolicy's state into the given stream.
     *
+34 −13
Original line number Diff line number Diff line
@@ -323,6 +323,8 @@ public class PhoneWindowManager implements WindowManagerPolicy {
    volatile boolean mPowerKeyHandled; // accessed from input reader and handler thread
    boolean mPendingPowerKeyUpCanceled;
    Handler mHandler;
    WindowState mLastInputMethodWindow = null;
    WindowState mLastInputMethodTargetWindow = null;

    static final int RECENT_APPS_BEHAVIOR_SHOW_OR_DISMISS = 0;
    static final int RECENT_APPS_BEHAVIOR_EXIT_TOUCH_MODE_AND_SHOW = 1;
@@ -2356,6 +2358,14 @@ public class PhoneWindowManager implements WindowManagerPolicy {
        if (win == mStatusBar || win == mNavigationBar) {
            return;
        }
        final boolean needsToOffsetInputMethodTarget =
                (win == mLastInputMethodTargetWindow && mLastInputMethodWindow != null);
        if (needsToOffsetInputMethodTarget) {
            if (DEBUG_LAYOUT) {
                Slog.i(TAG, "Offset ime target window by the last ime window state");
            }
            offsetInputMethodWindowLw(mLastInputMethodWindow);
        }

        final int fl = attrs.flags;
        final int sim = attrs.softInputMode;
@@ -2618,6 +2628,12 @@ public class PhoneWindowManager implements WindowManagerPolicy {
        // Dock windows carve out the bottom of the screen, so normal windows
        // can't appear underneath them.
        if (attrs.type == TYPE_INPUT_METHOD && !win.getGivenInsetsPendingLw()) {
            setLastInputMethodWindowLw(null, null);
            offsetInputMethodWindowLw(win);
        }
    }

    private void offsetInputMethodWindowLw(WindowState win) {
        int top = win.getContentFrameLw().top;
        top += win.getGivenContentInsetsLw().top;
        if (mContentBottom > top) {
@@ -2632,7 +2648,6 @@ public class PhoneWindowManager implements WindowManagerPolicy {
                + mDockBottom + " mContentBottom="
                + mContentBottom + " mCurBottom=" + mCurBottom);
    }
    }

    /** {@inheritDoc} */
    @Override
@@ -4135,6 +4150,12 @@ public class PhoneWindowManager implements WindowManagerPolicy {
        return mHasNavigationBar;
    }

    @Override
    public void setLastInputMethodWindowLw(WindowState ime, WindowState target) {
        mLastInputMethodWindow = ime;
        mLastInputMethodTargetWindow = target;
    }

    public void dump(String prefix, FileDescriptor fd, PrintWriter pw, String[] args) {
        pw.print(prefix); pw.print("mSafeMode="); pw.print(mSafeMode);
                pw.print(" mSystemReady="); pw.print(mSystemReady);
+4 −0
Original line number Diff line number Diff line
@@ -2256,6 +2256,7 @@ public class WindowManagerService extends IWindowManager.Stub
            boolean imMayMove = true;

            if (attrs.type == TYPE_INPUT_METHOD) {
                win.mGivenInsetsPending = true;
                mInputMethodWindow = win;
                addInputMethodWindowToListLocked(win);
                imMayMove = false;
@@ -3409,6 +3410,9 @@ public class WindowManagerService extends IWindowManager.Stub
        synchronized(mWindowMap) {
            WindowToken wtoken = mTokenMap.remove(token);
            if (wtoken != null) {
                if (wtoken.windowType == TYPE_INPUT_METHOD && mInputMethodWindow != null) {
                    mPolicy.setLastInputMethodWindowLw(mInputMethodWindow, mInputMethodTarget);
                }
                boolean delayed = false;
                if (!wtoken.hidden) {
                    wtoken.hidden = true;