Loading core/java/android/inputmethodservice/InputMethodService.java +3 −1 Original line number Diff line number Diff line Loading @@ -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); Loading core/java/android/view/inputmethod/flags.aconfig +7 −0 Original line number Diff line number Diff line Loading @@ -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" } services/core/java/com/android/server/inputmethod/InputMethodManagerService.java +14 −5 Original line number Diff line number Diff line Loading @@ -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); Loading @@ -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(); Loading Loading @@ -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); Loading Loading
core/java/android/inputmethodservice/InputMethodService.java +3 −1 Original line number Diff line number Diff line Loading @@ -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); Loading
core/java/android/view/inputmethod/flags.aconfig +7 −0 Original line number Diff line number Diff line Loading @@ -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" }
services/core/java/com/android/server/inputmethod/InputMethodManagerService.java +14 −5 Original line number Diff line number Diff line Loading @@ -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); Loading @@ -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(); Loading Loading @@ -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); Loading