[Android] Revert "Reset IME state on clear text input client" (flutter/engine#54277)
## Description This PR reverts two commits https://github.com/flutter/engine/pull/49829 and https://github.com/flutter/engine/pull/53662. The main change was in https://github.com/flutter/engine/pull/49829. https://github.com/flutter/engine/pull/53662 was a follow-up to mitigate the impact of https://github.com/flutter/engine/pull/49829. ## Related Issue Fixes https://github.com/flutter/flutter/issues/148530 Fixes https://github.com/flutter/flutter/issues/152620 Reopens https://github.com/flutter/flutter/issues/70546. Reopens https://github.com/flutter/flutter/issues/51478
This commit is contained in:
parent
3fae0ad188
commit
555c2ff92a
@ -546,22 +546,11 @@ public class TextInputPlugin implements ListenableEditingState.EditingStateWatch
|
|||||||
}
|
}
|
||||||
mEditable.removeEditingStateListener(this);
|
mEditable.removeEditingStateListener(this);
|
||||||
notifyViewExited();
|
notifyViewExited();
|
||||||
|
|
||||||
boolean needsRestart =
|
|
||||||
configuration.inputAction == null
|
|
||||||
|| configuration.inputAction == EditorInfo.IME_ACTION_DONE
|
|
||||||
|| configuration.inputAction == EditorInfo.IME_ACTION_NONE;
|
|
||||||
configuration = null;
|
configuration = null;
|
||||||
updateAutofillConfigurationIfNeeded(null);
|
updateAutofillConfigurationIfNeeded(null);
|
||||||
inputTarget = new InputTarget(InputTarget.Type.NO_TARGET, 0);
|
inputTarget = new InputTarget(InputTarget.Type.NO_TARGET, 0);
|
||||||
unlockPlatformViewInputConnection();
|
unlockPlatformViewInputConnection();
|
||||||
lastClientRect = null;
|
lastClientRect = null;
|
||||||
|
|
||||||
if (needsRestart) {
|
|
||||||
// Call restartInput to reset IME internal states. Otherwise some IMEs (Gboard for instance)
|
|
||||||
// keep reacting based on the previous input configuration until a new configuration is set.
|
|
||||||
mImm.restartInput(mView);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static class InputTarget {
|
private static class InputTarget {
|
||||||
|
@ -1130,150 +1130,6 @@ public class TextInputPluginTest {
|
|||||||
assertEquals(1, testImm.getRestartCount(testView));
|
assertEquals(1, testImm.getRestartCount(testView));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
|
||||||
public void clearTextInputClient_restartsImmWhenInputActionIsNull() {
|
|
||||||
// Initialize a general TextInputPlugin.
|
|
||||||
InputMethodSubtype inputMethodSubtype = mock(InputMethodSubtype.class);
|
|
||||||
TestImm testImm = Shadow.extract(ctx.getSystemService(Context.INPUT_METHOD_SERVICE));
|
|
||||||
testImm.setCurrentInputMethodSubtype(inputMethodSubtype);
|
|
||||||
View testView = new View(ctx);
|
|
||||||
TextInputChannel textInputChannel = new TextInputChannel(mock(DartExecutor.class));
|
|
||||||
TextInputPlugin textInputPlugin =
|
|
||||||
new TextInputPlugin(testView, textInputChannel, mock(PlatformViewsController.class));
|
|
||||||
textInputPlugin.setTextInputClient(
|
|
||||||
0,
|
|
||||||
new TextInputChannel.Configuration(
|
|
||||||
false,
|
|
||||||
false,
|
|
||||||
true,
|
|
||||||
true,
|
|
||||||
false,
|
|
||||||
TextInputChannel.TextCapitalization.NONE,
|
|
||||||
null,
|
|
||||||
null,
|
|
||||||
null,
|
|
||||||
null,
|
|
||||||
null,
|
|
||||||
null));
|
|
||||||
// There's a pending restart since we initialized the text input client. Flush that now.
|
|
||||||
textInputPlugin.setTextInputEditingState(
|
|
||||||
testView, new TextInputChannel.TextEditState("", 0, 0, -1, -1));
|
|
||||||
assertEquals(1, testImm.getRestartCount(testView));
|
|
||||||
|
|
||||||
// A restart is always forced when calling clearTextInputClient().
|
|
||||||
textInputPlugin.clearTextInputClient();
|
|
||||||
assertEquals(2, testImm.getRestartCount(testView));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void clearTextInputClient_restartsImmWhenInputActionIsDone() {
|
|
||||||
// Initialize a general TextInputPlugin.
|
|
||||||
InputMethodSubtype inputMethodSubtype = mock(InputMethodSubtype.class);
|
|
||||||
TestImm testImm = Shadow.extract(ctx.getSystemService(Context.INPUT_METHOD_SERVICE));
|
|
||||||
testImm.setCurrentInputMethodSubtype(inputMethodSubtype);
|
|
||||||
View testView = new View(ctx);
|
|
||||||
TextInputChannel textInputChannel = new TextInputChannel(mock(DartExecutor.class));
|
|
||||||
TextInputPlugin textInputPlugin =
|
|
||||||
new TextInputPlugin(testView, textInputChannel, mock(PlatformViewsController.class));
|
|
||||||
textInputPlugin.setTextInputClient(
|
|
||||||
0,
|
|
||||||
new TextInputChannel.Configuration(
|
|
||||||
false,
|
|
||||||
false,
|
|
||||||
true,
|
|
||||||
true,
|
|
||||||
false,
|
|
||||||
TextInputChannel.TextCapitalization.NONE,
|
|
||||||
null,
|
|
||||||
EditorInfo.IME_ACTION_DONE,
|
|
||||||
null,
|
|
||||||
null,
|
|
||||||
null,
|
|
||||||
null));
|
|
||||||
// There's a pending restart since we initialized the text input client. Flush that now.
|
|
||||||
textInputPlugin.setTextInputEditingState(
|
|
||||||
testView, new TextInputChannel.TextEditState("", 0, 0, -1, -1));
|
|
||||||
assertEquals(1, testImm.getRestartCount(testView));
|
|
||||||
|
|
||||||
// A restart should be forced when calling clearTextInputClient() and input action is
|
|
||||||
// EditorInfo.IME_ACTION_DONE.
|
|
||||||
textInputPlugin.clearTextInputClient();
|
|
||||||
assertEquals(2, testImm.getRestartCount(testView));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void clearTextInputClient_restartsImmWhenInputActionIsNone() {
|
|
||||||
// Initialize a general TextInputPlugin.
|
|
||||||
InputMethodSubtype inputMethodSubtype = mock(InputMethodSubtype.class);
|
|
||||||
TestImm testImm = Shadow.extract(ctx.getSystemService(Context.INPUT_METHOD_SERVICE));
|
|
||||||
testImm.setCurrentInputMethodSubtype(inputMethodSubtype);
|
|
||||||
View testView = new View(ctx);
|
|
||||||
TextInputChannel textInputChannel = new TextInputChannel(mock(DartExecutor.class));
|
|
||||||
TextInputPlugin textInputPlugin =
|
|
||||||
new TextInputPlugin(testView, textInputChannel, mock(PlatformViewsController.class));
|
|
||||||
textInputPlugin.setTextInputClient(
|
|
||||||
0,
|
|
||||||
new TextInputChannel.Configuration(
|
|
||||||
false,
|
|
||||||
false,
|
|
||||||
true,
|
|
||||||
true,
|
|
||||||
false,
|
|
||||||
TextInputChannel.TextCapitalization.NONE,
|
|
||||||
null,
|
|
||||||
EditorInfo.IME_ACTION_NONE,
|
|
||||||
null,
|
|
||||||
null,
|
|
||||||
null,
|
|
||||||
null));
|
|
||||||
// There's a pending restart since we initialized the text input client. Flush that now.
|
|
||||||
textInputPlugin.setTextInputEditingState(
|
|
||||||
testView, new TextInputChannel.TextEditState("", 0, 0, -1, -1));
|
|
||||||
assertEquals(1, testImm.getRestartCount(testView));
|
|
||||||
|
|
||||||
// A restart should be forced when calling clearTextInputClient() and input action is
|
|
||||||
// EditorInfo.IME_ACTION_NONE.
|
|
||||||
textInputPlugin.clearTextInputClient();
|
|
||||||
assertEquals(2, testImm.getRestartCount(testView));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void clearTextInputClient_doesNotRestartImmWhenInputActionIsNext() {
|
|
||||||
// Regression test for https://github.com/flutter/flutter/issues/148673.
|
|
||||||
// Initialize a general TextInputPlugin.
|
|
||||||
InputMethodSubtype inputMethodSubtype = mock(InputMethodSubtype.class);
|
|
||||||
TestImm testImm = Shadow.extract(ctx.getSystemService(Context.INPUT_METHOD_SERVICE));
|
|
||||||
testImm.setCurrentInputMethodSubtype(inputMethodSubtype);
|
|
||||||
View testView = new View(ctx);
|
|
||||||
TextInputChannel textInputChannel = new TextInputChannel(mock(DartExecutor.class));
|
|
||||||
TextInputPlugin textInputPlugin =
|
|
||||||
new TextInputPlugin(testView, textInputChannel, mock(PlatformViewsController.class));
|
|
||||||
textInputPlugin.setTextInputClient(
|
|
||||||
0,
|
|
||||||
new TextInputChannel.Configuration(
|
|
||||||
false,
|
|
||||||
false,
|
|
||||||
true,
|
|
||||||
true,
|
|
||||||
false,
|
|
||||||
TextInputChannel.TextCapitalization.NONE,
|
|
||||||
null,
|
|
||||||
EditorInfo.IME_ACTION_NEXT,
|
|
||||||
null,
|
|
||||||
null,
|
|
||||||
null,
|
|
||||||
null));
|
|
||||||
// There's a pending restart since we initialized the text input client. Flush that now.
|
|
||||||
textInputPlugin.setTextInputEditingState(
|
|
||||||
testView, new TextInputChannel.TextEditState("", 0, 0, -1, -1));
|
|
||||||
assertEquals(1, testImm.getRestartCount(testView));
|
|
||||||
|
|
||||||
// No restart is forced when calling clearTextInputClient() and input action is
|
|
||||||
// EditorInfo.IME_ACTION_NEXT.
|
|
||||||
textInputPlugin.clearTextInputClient();
|
|
||||||
assertEquals(1, testImm.getRestartCount(testView));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void destroy_clearTextInputMethodHandler() {
|
public void destroy_clearTextInputMethodHandler() {
|
||||||
View testView = new View(ctx);
|
View testView = new View(ctx);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user