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

Commit 81ad33cf authored by Cosmin Băieș's avatar Cosmin Băieș
Browse files

Store and check IME window vis value before update

This stores the last reported value of IME window vis (similar to the
IME back disposition), to be checked against the new value in avoiding
duplicate updates.

Flag: EXEMPT refactor
Bug: 364270925
Test: presubmit
Change-Id: I72e81f259b33eecfc956c78fa0da3209b492d99c
parent 5ff76a1a
Loading
Loading
Loading
Loading
+28 −16
Original line number Diff line number Diff line
@@ -664,9 +664,14 @@ public class InputMethodService extends AbstractInputMethodService {
    
    int mStatusIcon;

    /** Latest reported value of back disposition mode. */
    @BackDispositionMode
    int mBackDisposition;

    /** Latest reported value of IME window visibility state. */
    @ImeWindowVisibility
    private int mImeWindowVisibility;

    private Object mLock = new Object();
    @GuardedBy("mLock")
    private boolean mNotifyUserActionSent;
@@ -1047,7 +1052,7 @@ public class InputMethodService extends AbstractInputMethodService {
                ImeTracker.forLogging().onFailed(statsToken,
                        ImeTracker.PHASE_IME_ON_SHOW_SOFT_INPUT_TRUE);
            }
            setImeWindowStatus(mapToImeWindowStatus(), mBackDisposition);
            setImeWindowVisibility(computeImeWindowVis());

            final boolean isVisible = isInputViewShown();
            final boolean visibilityChanged = isVisible != wasVisible;
@@ -1357,9 +1362,22 @@ public class InputMethodService extends AbstractInputMethodService {
        mImeSurfaceRemoverRunnable = null;
    }

    private void setImeWindowStatus(@ImeWindowVisibility int visibilityFlags,
    /**
     * Sets the IME window visibility state.
     *
     * @param vis the IME window visibility state to be set.
     */
    private void setImeWindowVisibility(@ImeWindowVisibility int vis) {
        if (vis == mImeWindowVisibility) {
            return;
        }
        mImeWindowVisibility = vis;
        setImeWindowStatus(mImeWindowVisibility, mBackDisposition);
    }

    private void setImeWindowStatus(@ImeWindowVisibility int vis,
            @BackDispositionMode int backDisposition) {
        mPrivOps.setImeWindowStatusAsync(visibilityFlags, backDisposition);
        mPrivOps.setImeWindowStatusAsync(vis, backDisposition);
    }

    /** Set region of the keyboard to be avoided from back gesture */
@@ -1986,7 +2004,7 @@ public class InputMethodService extends AbstractInputMethodService {
            }
            // If user uses hard keyboard, IME button should always be shown.
            boolean showing = onEvaluateInputViewShown();
            setImeWindowStatus(IME_ACTIVE | (showing ? IME_VISIBLE : 0), mBackDisposition);
            setImeWindowVisibility(IME_ACTIVE | (showing ? IME_VISIBLE : 0));
        }
        Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER);
    }
@@ -2053,7 +2071,7 @@ public class InputMethodService extends AbstractInputMethodService {
            return;
        }
        mBackDisposition = disposition;
        setImeWindowStatus(mapToImeWindowStatus(), mBackDisposition);
        setImeWindowStatus(mImeWindowVisibility, mBackDisposition);
    }

    /**
@@ -3132,14 +3150,8 @@ public class InputMethodService extends AbstractInputMethodService {
        Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "IMS.showWindow");
        mDecorViewWasVisible = mDecorViewVisible;
        mInShowWindow = true;
        final int previousImeWindowStatus =
                (mDecorViewVisible ? IME_ACTIVE : 0) | (isInputViewShown()
                        ? (!mWindowVisible ? -1 : IME_VISIBLE) : 0);
        startViews(prepareWindow(showInput));
        final int nextImeWindowStatus = mapToImeWindowStatus();
        if (previousImeWindowStatus != nextImeWindowStatus) {
            setImeWindowStatus(nextImeWindowStatus, mBackDisposition);
        }
        setImeWindowVisibility(computeImeWindowVis());

        mNavigationBarController.onWindowShown();
        // compute visibility
@@ -3317,7 +3329,7 @@ public class InputMethodService extends AbstractInputMethodService {
        ImeTracker.forLogging().onProgress(statsToken, ImeTracker.PHASE_IME_HIDE_WINDOW);
        ImeTracing.getInstance().triggerServiceDump("InputMethodService#hideWindow", mDumper,
                null /* icProto */);
        setImeWindowStatus(0 /* visibilityFlags */, mBackDisposition);
        setImeWindowVisibility(0 /* vis */);
        if (android.view.inputmethod.Flags.refactorInsetsController()) {
            // The ImeInsetsSourceProvider need the statsToken when dispatching the control. We
            // send the token here, so that another request in the provider can be cancelled.
@@ -4492,10 +4504,10 @@ public class InputMethodService extends AbstractInputMethodService {
        };
    }

    /** Computes the IME window visibility state. */
    @ImeWindowVisibility
    private int mapToImeWindowStatus() {
        return IME_ACTIVE
                | (isInputViewShown() ? IME_VISIBLE : 0);
    private int computeImeWindowVis() {
        return IME_ACTIVE | (isInputViewShown() ? IME_VISIBLE : 0);
    }

    /**