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

Commit b1215125 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Report WINDOW_FOCUS_GAIN_REPORT_ONLY when the served connection remains" into rvc-dev

parents 30c894d5 6ecbf087
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -125,6 +125,13 @@ public final class ImeFocusController {
        final View viewForWindowFocus = focusedView != null ? focusedView : mViewRootImpl.mView;
        onViewFocusChanged(viewForWindowFocus, true);

        // Skip starting input when the next focused view is same as served view and the served
        // input connection still exists.
        final boolean nextFocusIsServedView = mServedView != null && mServedView == focusedView;
        if (nextFocusIsServedView && immDelegate.isAcceptingText()) {
            forceFocus = false;
        }

        immDelegate.startInputAsyncOnWindowFocusGain(viewForWindowFocus,
                windowAttribute.softInputMode, windowAttribute.flags, forceFocus);
    }
@@ -247,6 +254,7 @@ public final class ImeFocusController {
        void setCurrentRootView(ViewRootImpl rootView);
        boolean isCurrentRootView(ViewRootImpl rootView);
        boolean isRestartOnNextWindowFocus(boolean reset);
        boolean isAcceptingText();
    }

    public View getServedView() {
+22 −4
Original line number Diff line number Diff line
@@ -616,12 +616,19 @@ public final class InputMethodManager {
                // For some reason we didn't do a startInput + windowFocusGain, so
                // we'll just do a window focus gain and call it a day.
                try {
                    if (DEBUG) Log.v(TAG, "Reporting focus gain, without startInput");
                    View servedView = controller.getServedView();
                    boolean nextFocusIsServedView = servedView != null && servedView == focusedView;
                    if (DEBUG) {
                        Log.v(TAG, "Reporting focus gain, without startInput"
                                + ", nextFocusIsServedView=" + nextFocusIsServedView);
                    }
                    mService.startInputOrWindowGainedFocus(
                            StartInputReason.WINDOW_FOCUS_GAIN_REPORT_ONLY, mClient,
                            focusedView.getWindowToken(), startInputFlags, softInputMode,
                            windowFlags,
                            null, null, 0 /* missingMethodFlags */,
                            nextFocusIsServedView ? mCurrentTextBoxAttribute : null,
                            nextFocusIsServedView ? mServedInputConnectionWrapper : null,
                            0 /* missingMethodFlags */,
                            mCurRootView.mContext.getApplicationInfo().targetSdkVersion);
                } catch (RemoteException e) {
                    throw e.rethrowFromSystemServer();
@@ -646,8 +653,7 @@ public final class InputMethodManager {
        public void setCurrentRootView(ViewRootImpl rootView) {
            synchronized (mH) {
                if (mCurRootView != null) {
                    // Reset the last served view and restart window focus state of the root view.
                    mCurRootView.getImeFocusController().setServedView(null);
                    // Restart the input when the next window focus state of the root view changed.
                    mRestartOnNextWindowFocus = true;
                }
                mCurRootView = rootView;
@@ -677,6 +683,18 @@ public final class InputMethodManager {
            }
            return result;
        }

        /**
         * For {@link ImeFocusController} to check if the currently served view is accepting full
         * text edits.
         */
        @Override
        public boolean isAcceptingText() {
            synchronized (mH) {
                return mServedInputConnectionWrapper != null
                        && mServedInputConnectionWrapper.getInputConnection() != null;
            }
        }
    }

    /** @hide */
+3 −2
Original line number Diff line number Diff line
@@ -50,8 +50,9 @@ public @interface StartInputReason {
    int WINDOW_FOCUS_GAIN = 1;
    /**
     * {@link android.view.Window} gained focus but there is no {@link android.view.View} that is
     * eligible to have IME focus. {@link android.view.inputmethod.InputMethodManager} just reports
     * this window focus change event.
     * eligible to have IME focus, or the focused view is same as current served view and its
     * input connection remains. {@link android.view.inputmethod.InputMethodManager} just reports
     * this window focus change event to sync IME input target for system.
     */
    int WINDOW_FOCUS_GAIN_REPORT_ONLY = 2;
    /**