mirror of
https://github.com/flutter/flutter.git
synced 2026-02-20 02:29:02 +08:00
Revert "[Android Text Input] Remove Samsung restart input workaround for newer Samsung keyboards (#24288)" (flutter/engine#24486)
This commit is contained in:
parent
4aaebf5c54
commit
98147bb6dc
@ -6,7 +6,6 @@ package io.flutter.plugin.editing;
|
||||
|
||||
import android.annotation.SuppressLint;
|
||||
import android.content.Context;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.graphics.Rect;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
@ -500,27 +499,7 @@ public class TextInputPlugin implements ListenableEditingState.EditingStateWatch
|
||||
mView.getContext().getContentResolver(), Settings.Secure.DEFAULT_INPUT_METHOD);
|
||||
// The Samsung keyboard is called "com.sec.android.inputmethod/.SamsungKeypad" but look
|
||||
// for "Samsung" just in case Samsung changes the name of the keyboard.
|
||||
if (!keyboardName.contains("Samsung")) {
|
||||
return false;
|
||||
}
|
||||
|
||||
final long versionCode;
|
||||
try {
|
||||
versionCode =
|
||||
mView
|
||||
.getContext()
|
||||
.getPackageManager()
|
||||
.getPackageInfo("com.sec.android.inputmethod", 0)
|
||||
.getLongVersionCode();
|
||||
} catch (PackageManager.NameNotFoundException e) {
|
||||
Log.w(TAG, "com.sec.android.inputmethod is not installed.");
|
||||
return false;
|
||||
}
|
||||
|
||||
// 3.3.23.33 is a known version that's free of the aforementioned bug.
|
||||
// 3.0.24.96 still has this bug.
|
||||
// TODO(LongCatIsLooong): Find the minimum version that has the fix.
|
||||
return versionCode < 332333999;
|
||||
return keyboardName.contains("Samsung");
|
||||
}
|
||||
|
||||
@VisibleForTesting
|
||||
|
||||
@ -18,7 +18,6 @@ import static org.mockito.Mockito.when;
|
||||
|
||||
import android.annotation.TargetApi;
|
||||
import android.content.Context;
|
||||
import android.content.pm.PackageInfo;
|
||||
import android.content.res.AssetManager;
|
||||
import android.graphics.Insets;
|
||||
import android.graphics.Rect;
|
||||
@ -67,7 +66,6 @@ import org.mockito.ArgumentCaptor;
|
||||
import org.mockito.Mock;
|
||||
import org.robolectric.RobolectricTestRunner;
|
||||
import org.robolectric.RuntimeEnvironment;
|
||||
import org.robolectric.Shadows;
|
||||
import org.robolectric.annotation.Config;
|
||||
import org.robolectric.annotation.Implementation;
|
||||
import org.robolectric.annotation.Implements;
|
||||
@ -75,7 +73,6 @@ import org.robolectric.shadow.api.Shadow;
|
||||
import org.robolectric.shadows.ShadowAutofillManager;
|
||||
import org.robolectric.shadows.ShadowBuild;
|
||||
import org.robolectric.shadows.ShadowInputMethodManager;
|
||||
import org.robolectric.shadows.ShadowPackageManager;
|
||||
|
||||
@Config(
|
||||
manifest = Config.NONE,
|
||||
@ -344,21 +341,14 @@ public class TextInputPluginTest {
|
||||
assertTrue(textInputPlugin.getEditable().toString().equals("Shibuyawoo"));
|
||||
}
|
||||
|
||||
// See also: https://github.com/flutter/flutter/issues/29341 and
|
||||
// https://github.com/flutter/flutter/issues/31512.
|
||||
// Some recent versions of Samsung keybords are affected including non-korean
|
||||
// languages and thus needed the restart.
|
||||
// See https://github.com/flutter/flutter/issues/29341 and
|
||||
// https://github.com/flutter/flutter/issues/31512
|
||||
// All modern Samsung keybords are affected including non-korean languages and thus
|
||||
// need the restart.
|
||||
@Test
|
||||
public void setTextInputEditingState_alwaysRestartsOnAffectedDevices() {
|
||||
// Initialize a TextInputPlugin with a Samsung keypad.
|
||||
public void setTextInputEditingState_alwaysRestartsOnAffectedDevices2() {
|
||||
// Initialize a TextInputPlugin that needs to be always restarted.
|
||||
ShadowBuild.setManufacturer("samsung");
|
||||
final ShadowPackageManager packageManager =
|
||||
Shadows.shadowOf(
|
||||
RuntimeEnvironment.application.getApplicationContext().getPackageManager());
|
||||
final PackageInfo info = new PackageInfo();
|
||||
info.packageName = "com.sec.android.inputmethod";
|
||||
info.versionCode = 200000000;
|
||||
packageManager.addPackage(info);
|
||||
InputMethodSubtype inputMethodSubtype =
|
||||
new InputMethodSubtype(0, 0, /*locale=*/ "en", "", "", false, false);
|
||||
Settings.Secure.putString(
|
||||
@ -398,59 +388,6 @@ public class TextInputPluginTest {
|
||||
assertEquals(2, testImm.getRestartCount(testView));
|
||||
}
|
||||
|
||||
// Regression test for https://github.com/flutter/flutter/issues/73433.
|
||||
// The restart workaround seems to have caused #73433 and it's no longer
|
||||
// needed on newer versions of Samsung keyboard.
|
||||
@Test
|
||||
public void setTextInputEditingState_DontForceRestartOnNewSamsungKeyboard() {
|
||||
// Initialize a TextInputPlugin with a Samsung keypad.
|
||||
ShadowBuild.setManufacturer("samsung");
|
||||
final ShadowPackageManager packageManager =
|
||||
Shadows.shadowOf(
|
||||
RuntimeEnvironment.application.getApplicationContext().getPackageManager());
|
||||
final PackageInfo info = new PackageInfo();
|
||||
info.packageName = "com.sec.android.inputmethod";
|
||||
info.versionCode = 333183070;
|
||||
packageManager.addPackage(info);
|
||||
InputMethodSubtype inputMethodSubtype =
|
||||
new InputMethodSubtype(0, 0, /*locale=*/ "en", "", "", false, false);
|
||||
Settings.Secure.putString(
|
||||
RuntimeEnvironment.application.getContentResolver(),
|
||||
Settings.Secure.DEFAULT_INPUT_METHOD,
|
||||
"com.sec.android.inputmethod/.SamsungKeypad");
|
||||
TestImm testImm =
|
||||
Shadow.extract(
|
||||
RuntimeEnvironment.application.getSystemService(Context.INPUT_METHOD_SERVICE));
|
||||
testImm.setCurrentInputMethodSubtype(inputMethodSubtype);
|
||||
View testView = new View(RuntimeEnvironment.application);
|
||||
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,
|
||||
TextInputChannel.TextCapitalization.NONE,
|
||||
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));
|
||||
|
||||
// Move the cursor.
|
||||
assertEquals(1, testImm.getRestartCount(testView));
|
||||
textInputPlugin.setTextInputEditingState(
|
||||
testView, new TextInputChannel.TextEditState("", 0, 0, -1, -1));
|
||||
|
||||
// Verify that we've NOT restarted the input.
|
||||
assertEquals(1, testImm.getRestartCount(testView));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void setTextInputEditingState_doesNotRestartOnUnaffectedDevices() {
|
||||
// Initialize a TextInputPlugin that needs to be always restarted.
|
||||
@ -490,7 +427,7 @@ public class TextInputPluginTest {
|
||||
textInputPlugin.setTextInputEditingState(
|
||||
testView, new TextInputChannel.TextEditState("", 0, 0, -1, -1));
|
||||
|
||||
// Verify that we've NOT restarted the input.
|
||||
// Verify that we've restarted the input.
|
||||
assertEquals(1, testImm.getRestartCount(testView));
|
||||
}
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user