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

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

Merge "Fix showing keyboard without editor focused in some cases (1/2)"

parents 99a44d85 1ef07dff
Loading
Loading
Loading
Loading
+28 −11
Original line number Diff line number Diff line
@@ -3274,6 +3274,9 @@ public class InputMethodManagerService extends IInputMethodManager.Stub

    boolean hideCurrentInputLocked(IBinder windowToken, int flags, ResultReceiver resultReceiver,
            @SoftInputShowHideReason int reason) {
        if (mCurClient == null || mCurClient.curSession == null) {
            return false;
        }
        if ((flags&InputMethodManager.HIDE_IMPLICIT_ONLY) != 0
                && (mShowExplicitlyRequested || mShowForced)) {
            if (DEBUG) Slog.v(TAG, "Not hiding: explicit show not cancelled by non-explicit hide");
@@ -3458,7 +3461,9 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
        // pre-rendering not supported on low-ram devices.
        cs.shouldPreRenderIme = DebugFlags.FLAG_PRE_RENDER_IME_VIEWS.value() && !mIsLowRam;

        if (mCurFocusedWindow == windowToken) {
        final boolean sameWindowFocused = mCurFocusedWindow == windowToken;
        final boolean isTextEditor = (startInputFlags & StartInputFlags.IS_TEXT_EDITOR) != 0;
        if (sameWindowFocused && isTextEditor) {
            if (DEBUG) {
                Slog.w(TAG, "Window already focused, ignoring focus gain of: " + client
                        + " attribute=" + attribute + ", token = " + windowToken
@@ -3473,6 +3478,7 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
                    InputBindResult.ResultCode.SUCCESS_REPORT_WINDOW_FOCUS_ONLY,
                    null, null, null, -1, null);
        }

        mCurFocusedWindow = windowToken;
        mCurFocusedWindowSoftInputMode = softInputMode;
        mCurFocusedWindowClient = cs;
@@ -3490,7 +3496,6 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
                        == LayoutParams.SOFT_INPUT_ADJUST_RESIZE
                || mRes.getConfiguration().isLayoutSizeAtLeast(
                        Configuration.SCREENLAYOUT_SIZE_LARGE);
        final boolean isTextEditor = (startInputFlags & StartInputFlags.IS_TEXT_EDITOR) != 0;

        // We want to start input before showing the IME, but after closing
        // it.  We want to do this after closing it to help the IME disappear
@@ -3550,9 +3555,11 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
                }
                break;
            case LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN:
                if (isImeVisible()) {
                    if (DEBUG) Slog.v(TAG, "Window asks to hide input");
                    hideCurrentInputLocked(mCurFocusedWindow, 0, null,
                            SoftInputShowHideReason.HIDE_ALWAYS_HIDDEN_STATE);
                }
                break;
            case LayoutParams.SOFT_INPUT_STATE_VISIBLE:
                if ((softInputMode & LayoutParams.SOFT_INPUT_IS_FORWARD_NAVIGATION) != 0) {
@@ -3577,6 +3584,7 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
                if (DEBUG) Slog.v(TAG, "Window asks to always show input");
                if (InputMethodUtils.isSoftInputModeStateVisibleAllowed(
                        unverifiedTargetSdkVersion, startInputFlags)) {
                    if (!isImeVisible()) {
                        if (attribute != null) {
                            res = startInputUncheckedLocked(cs, inputContext, missingMethods,
                                    attribute, startInputFlags, startInputReason);
@@ -3584,6 +3592,7 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
                        }
                        showCurrentInputLocked(windowToken, InputMethodManager.SHOW_IMPLICIT, null,
                                SoftInputShowHideReason.SHOW_STATE_ALWAYS_VISIBLE);
                    }
                } else {
                    Slog.e(TAG, "SOFT_INPUT_STATE_ALWAYS_VISIBLE is ignored because"
                            + " there is no focused view that also returns true from"
@@ -3601,6 +3610,10 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
                } else {
                    res = InputBindResult.NO_EDITOR;
                }
            } else if (sameWindowFocused) {
                return new InputBindResult(
                        InputBindResult.ResultCode.SUCCESS_REPORT_WINDOW_FOCUS_ONLY,
                        null, null, null, -1, null);
            } else {
                res = InputBindResult.NULL_EDITOR_INFO;
            }
@@ -3608,6 +3621,10 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
        return res;
    }

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

    private boolean canShowInputMethodPickerLocked(IInputMethodClient client) {
        // TODO(yukawa): multi-display support.
        final int uid = Binder.getCallingUid();