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
This commit is contained in:
Taran Singh
2023-07-26 22:40:08 +00:00
parent ffb3df9510
commit d0807dd0be
2 changed files with 27 additions and 3 deletions

View File

@@ -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;
}

View File

@@ -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) {