From 0ea829a8a03d2cb982b22b960d01eb0167d5f92b Mon Sep 17 00:00:00 2001 From: LongCatIsLooong <31859944+LongCatIsLooong@users.noreply.github.com> Date: Thu, 18 Feb 2021 10:13:57 -0800 Subject: [PATCH] Revert "[Android Text Input] Remove Samsung restart input workaround for newer Samsung keyboards (#24288)" This reverts commit 16870408831ef57718e7b14027b1f292b66cde74. --- .../plugin/editing/TextInputPlugin.java | 23 +----- .../plugin/editing/TextInputPluginTest.java | 77 ++----------------- 2 files changed, 8 insertions(+), 92 deletions(-) diff --git a/shell/platform/android/io/flutter/plugin/editing/TextInputPlugin.java b/shell/platform/android/io/flutter/plugin/editing/TextInputPlugin.java index ea188d3722626..698be1c1a8b57 100644 --- a/shell/platform/android/io/flutter/plugin/editing/TextInputPlugin.java +++ b/shell/platform/android/io/flutter/plugin/editing/TextInputPlugin.java @@ -6,7 +6,6 @@ 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 @@ private boolean isRestartAlwaysRequired() { 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 diff --git a/shell/platform/android/test/io/flutter/plugin/editing/TextInputPluginTest.java b/shell/platform/android/test/io/flutter/plugin/editing/TextInputPluginTest.java index 2bf7ae7584941..19a8b1b5be5f2 100644 --- a/shell/platform/android/test/io/flutter/plugin/editing/TextInputPluginTest.java +++ b/shell/platform/android/test/io/flutter/plugin/editing/TextInputPluginTest.java @@ -18,7 +18,6 @@ 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.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.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 void setTextInputEditingState_alwaysSetEditableWhenDifferent() { 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 void setTextInputEditingState_alwaysRestartsOnAffectedDevices() { 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 void setTextInputEditingState_doesNotRestartOnUnaffectedDevices() { 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)); }