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

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

Merge "Fix unexpected IME visibility restores" into sc-dev

parents 4c5101bb 739a6809
Loading
Loading
Loading
Loading
+23 −9
Original line number Diff line number Diff line
@@ -3541,15 +3541,16 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
        InputBindResult res = null;
        // We shows the IME when the system allows the IME focused target window to restore the
        // IME visibility (e.g. switching to the app task when last time the IME is visible).
        if (isTextEditor && mWindowManagerInternal.shouldRestoreImeVisibility(windowToken)) {
            if (attribute != null) {
                res = startInputUncheckedLocked(cs, inputContext, missingMethods,
                        attribute, startInputFlags, startInputReason);
        // Note that we don't restore IME visibility for some cases (e.g. when the soft input
        // state is ALWAYS_HIDDEN or STATE_HIDDEN with forward navigation).
        // Because the app might leverage these flags to hide soft-keyboard with showing their own
        // UI for input.
        if (isTextEditor && attribute != null
                && shouldRestoreImeVisibility(windowToken, softInputMode)) {
            res = startInputUncheckedLocked(cs, inputContext, missingMethods, attribute,
                    startInputFlags, startInputReason);
            showCurrentInputLocked(windowToken, InputMethodManager.SHOW_IMPLICIT, null,
                    SoftInputShowHideReason.SHOW_RESTORE_IME_VISIBILITY);
            } else {
                res = InputBindResult.NULL_EDITOR_INFO;
            }
            return res;
        }

@@ -3673,6 +3674,19 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
        return res;
    }

    private boolean shouldRestoreImeVisibility(IBinder windowToken,
            @SoftInputModeFlags int softInputMode) {
        switch (softInputMode & LayoutParams.SOFT_INPUT_MASK_STATE) {
            case LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN:
                return false;
            case LayoutParams.SOFT_INPUT_STATE_HIDDEN:
                if ((softInputMode & LayoutParams.SOFT_INPUT_IS_FORWARD_NAVIGATION) != 0) {
                    return false;
                }
        }
        return mWindowManagerInternal.shouldRestoreImeVisibility(windowToken);
    }

    private boolean isImeVisible() {
        return (mImeWindowVis & InputMethodService.IME_VISIBLE) != 0;
    }