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

Commit bd70cc82 authored by Cosmin Băieș's avatar Cosmin Băieș Committed by Android (Google) Code Review
Browse files

Merge "Optimize IME Input Target Update" into main

parents 5ff6e9bb a3015cb3
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -825,7 +825,9 @@ public class InputMethodService extends AbstractInputMethodService {
        @Override
        public final void dispatchStartInput(@Nullable InputConnection inputConnection,
                @NonNull IInputMethod.StartInputParams params) {
            if (!Flags.optimizeImeInputTargetUpdate()) {
                mPrivOps.reportStartInputAsync(params.startInputToken);
            }
            onNavButtonFlagsChanged(params.navigationBarFlags);
            if (params.restarting) {
                restartInput(inputConnection, params.editorInfo);
+7 −0
Original line number Diff line number Diff line
@@ -204,3 +204,10 @@ flag {
  description: "Disables restoring the IME visibility after activity recreation (e.g. rotation), without an explicit show request."
  bug: "391859600"
}

flag {
  name: "optimize_ime_input_target_update"
  namespace: "input_method"
  description: "Optimizes the IME Input Target update flow by bypassing the InputMethodService, as there are no checks done there"
  bug: "427397699"
}
+14 −5
Original line number Diff line number Diff line
@@ -1883,15 +1883,16 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl.
            userData.mBoundToMethod = true;
        }

        final var focusedWindow = userData.mImeBindingState.mFocusedWindow;
        final Binder startInputToken = new Binder();
        mImeTargetWindowMap.put(startInputToken, userData.mImeBindingState.mFocusedWindow);
        mImeTargetWindowMap.put(startInputToken, focusedWindow);
        final boolean restarting = !initial;
        final StartInputInfo info = new StartInputInfo(userId,
                bindingController.getCurToken(), bindingController.getCurTokenDisplayId(),
                bindingController.getCurId(), startInputReason,
                restarting, UserHandle.getUserId(userData.mCurClient.mUid),
                userData.mCurClient.mSelfReportedDisplayId,
                userData.mImeBindingState.mFocusedWindow, userData.mCurEditorInfo,
                focusedWindow, userData.mCurEditorInfo,
                userData.mImeBindingState.mFocusedWindowSoftInputMode,
                bindingController.getSequenceNumber());
        mStartInputHistory.addEntry(info);
@@ -1913,15 +1914,20 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl.
        setEnabledSessionLocked(session, userData);
        session.mMethod.startInput(startInputToken, userData.mCurInputConnection,
                userData.mCurEditorInfo, restarting, navButtonFlags, userData.mCurImeDispatcher);
        if (isShowRequestedForCurrentWindow(userId)
                && userData.mImeBindingState.mFocusedWindow != null) {
        if (Flags.optimizeImeInputTargetUpdate()) {
            if (focusedWindow != null) {
                mWindowManagerInternal.updateImeTargetWindow(focusedWindow);
            }
            userData.mVisibilityStateComputer.setLastImeTargetWindow(focusedWindow);
        }
        if (isShowRequestedForCurrentWindow(userId) && focusedWindow != null) {
            ProtoLog.v(IMMS_DEBUG, "Attach new input asks to show input");
            // Re-use current statsToken, if it exists.
            final var statsToken = userData.mCurStatsToken != null ? userData.mCurStatsToken
                    : createStatsTokenForFocusedClient(true /* show */,
                            SoftInputShowHideReason.ATTACH_NEW_INPUT, userId);
            userData.mCurStatsToken = null;
            showCurrentInputInternal(userData.mImeBindingState.mFocusedWindow, statsToken);
            showCurrentInputInternal(focusedWindow, statsToken);
        }

        final var curId = bindingController.getCurId();
@@ -2767,6 +2773,9 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl.
    @BinderThread
    @GuardedBy("ImfLock.class")
    private void reportStartInputLocked(IBinder startInputToken, @NonNull UserData userData) {
        if (Flags.optimizeImeInputTargetUpdate()) {
            return;
        }
        final IBinder targetWindowToken = mImeTargetWindowMap.get(startInputToken);
        if (targetWindowToken != null) {
            mWindowManagerInternal.updateImeTargetWindow(targetWindowToken);