From d0807dd0bedef4d55d143072f673a1cfdba7069c Mon Sep 17 00:00:00 2001 From: Taran Singh Date: Wed, 26 Jul 2023 22:40:08 +0000 Subject: [PATCH] IME's requested visibility considers tooltype IME requested visibility should consider the toolType used to focus the editor. If tool type was stylus, we should not request to show virtual keyboard. By not requesting virtual keyboard (no call to onStartInputView), IME can avoid redundant draw for keyboard views and hence reduce the initiation latency. Bug: 287109569 Test: atest StylusHandwritingTest Change-Id: I0f74f8de59cf3f530ede43243ed820d4bee8199b --- .../ImeVisibilityStateComputer.java | 23 ++++++++++++++++++- .../InputMethodManagerService.java | 7 ++++-- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/services/core/java/com/android/server/inputmethod/ImeVisibilityStateComputer.java b/services/core/java/com/android/server/inputmethod/ImeVisibilityStateComputer.java index 9ad4628596fcd..2e0274b79d1f4 100644 --- a/services/core/java/com/android/server/inputmethod/ImeVisibilityStateComputer.java +++ b/services/core/java/com/android/server/inputmethod/ImeVisibilityStateComputer.java @@ -23,6 +23,7 @@ import static android.server.inputmethod.InputMethodManagerServiceProto.SHOW_EXP import static android.server.inputmethod.InputMethodManagerServiceProto.SHOW_FORCED; import static android.view.Display.DEFAULT_DISPLAY; import static android.view.Display.INVALID_DISPLAY; +import static android.view.MotionEvent.TOOL_TYPE_UNKNOWN; import static android.view.WindowManager.LayoutParams.SOFT_INPUT_IS_FORWARD_NAVIGATION; import static android.view.WindowManager.LayoutParams.SOFT_INPUT_MASK_STATE; import static android.view.WindowManager.LayoutParams.SOFT_INPUT_STATE_UNSPECIFIED; @@ -44,6 +45,7 @@ import android.util.PrintWriterPrinter; import android.util.Printer; import android.util.Slog; import android.util.proto.ProtoOutputStream; +import android.view.MotionEvent; import android.view.WindowManager; import android.view.inputmethod.ImeTracker; import android.view.inputmethod.InputMethod; @@ -351,7 +353,8 @@ public final class ImeVisibilityStateComputer { void setWindowState(IBinder windowToken, @NonNull ImeTargetWindowState newState) { final ImeTargetWindowState state = mRequestWindowStateMap.get(windowToken); - if (state != null && newState.hasEditorFocused()) { + if (state != null && newState.hasEditorFocused() + && newState.mToolType != MotionEvent.TOOL_TYPE_STYLUS) { // Inherit the last requested IME visible state when the target window is still // focused with an editor. newState.setRequestedImeVisible(state.mRequestedImeVisible); @@ -652,14 +655,23 @@ public final class ImeVisibilityStateComputer { * A class that represents the current state of the IME target window. */ static class ImeTargetWindowState { + ImeTargetWindowState(@SoftInputModeFlags int softInputModeState, int windowFlags, boolean imeFocusChanged, boolean hasFocusedEditor, boolean isStartInputByGainFocus) { + this(softInputModeState, windowFlags, imeFocusChanged, hasFocusedEditor, + isStartInputByGainFocus, TOOL_TYPE_UNKNOWN); + } + + ImeTargetWindowState(@SoftInputModeFlags int softInputModeState, int windowFlags, + boolean imeFocusChanged, boolean hasFocusedEditor, + boolean isStartInputByGainFocus, @MotionEvent.ToolType int toolType) { mSoftInputModeState = softInputModeState; mWindowFlags = windowFlags; mImeFocusChanged = imeFocusChanged; mHasFocusedEditor = hasFocusedEditor; mIsStartInputByGainFocus = isStartInputByGainFocus; + mToolType = toolType; } /** @@ -669,6 +681,11 @@ public final class ImeVisibilityStateComputer { private final int mWindowFlags; + /** + * {@link MotionEvent#getToolType(int)} that was used to click editor. + */ + private final int mToolType; + /** * {@code true} means the IME focus changed from the previous window, {@code false} * otherwise. @@ -718,6 +735,10 @@ public final class ImeVisibilityStateComputer { return mWindowFlags; } + int getToolType() { + return mToolType; + } + private void setImeDisplayId(int imeDisplayId) { mImeDisplayId = imeDisplayId; } diff --git a/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java b/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java index cfcb4620bf25e..d4c3f9d468131 100644 --- a/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java +++ b/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java @@ -3877,11 +3877,14 @@ public final class InputMethodManagerService extends IInputMethodManager.Stub final boolean isTextEditor = (startInputFlags & StartInputFlags.IS_TEXT_EDITOR) != 0; final boolean startInputByWinGainedFocus = (startInputFlags & StartInputFlags.WINDOW_GAINED_FOCUS) != 0; + final int toolType = editorInfo != null + ? editorInfo.getInitialToolType() : MotionEvent.TOOL_TYPE_UNKNOWN; // Init the focused window state (e.g. whether the editor has focused or IME focus has // changed from another window). - final ImeTargetWindowState windowState = new ImeTargetWindowState(softInputMode, - windowFlags, !sameWindowFocused, isTextEditor, startInputByWinGainedFocus); + final ImeTargetWindowState windowState = new ImeTargetWindowState( + softInputMode, windowFlags, !sameWindowFocused, isTextEditor, + startInputByWinGainedFocus, toolType); mVisibilityStateComputer.setWindowState(windowToken, windowState); if (sameWindowFocused && isTextEditor) {