From c3eab6a9d9c8298d8c487a41a47912a8818dac4e Mon Sep 17 00:00:00 2001 From: govenliu Date: Sun, 18 Aug 2019 16:31:13 +0800 Subject: [PATCH] [Wi-Fi] Hide SoftKeyboard temporary when user tap the advanced button. When tapping on the advanced button during configuring a network, some items in the expanded list are covered by IME keyboard, which may cause user to ignore them accidently. To improve it, hide the IME temporary to let user can see most of them. Bug: 78441374 Test: Use ShadowInputMethodManager to check if the keyboard is hide or not after tapping on the advance button. Change-Id: I0677d96febc90c66d1cf6f98555bbb436a654660 --- .../settings/wifi/WifiConfigController.java | 15 +++++++++++++-- .../settings/wifi/WifiConfigControllerTest.java | 17 +++++++++++++++++ 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/src/com/android/settings/wifi/WifiConfigController.java b/src/com/android/settings/wifi/WifiConfigController.java index 950b6458119..68ddb3ca640 100644 --- a/src/com/android/settings/wifi/WifiConfigController.java +++ b/src/com/android/settings/wifi/WifiConfigController.java @@ -35,6 +35,7 @@ import android.net.wifi.WifiEnterpriseConfig.Eap; import android.net.wifi.WifiEnterpriseConfig.Phase2; import android.net.wifi.WifiInfo; import android.net.wifi.WifiManager; +import android.os.IBinder; import android.os.UserManager; import android.security.Credentials; import android.security.KeyStore; @@ -48,6 +49,7 @@ import android.view.KeyEvent; import android.view.View; import android.view.ViewGroup; import android.view.inputmethod.EditorInfo; +import android.view.inputmethod.InputMethodManager; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.Button; @@ -60,8 +62,6 @@ import android.widget.ScrollView; import android.widget.Spinner; import android.widget.TextView; -import androidx.annotation.VisibleForTesting; - import com.android.settings.ProxySelector; import com.android.settings.R; import com.android.settings.wifi.details.WifiPrivacyPreferenceController; @@ -76,6 +76,8 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Iterator; +import androidx.annotation.VisibleForTesting; + /** * The class for allowing UIs like {@link WifiDialog} and {@link WifiConfigUiBase} to * share the logic for controlling buttons, text fields, etc. @@ -1490,6 +1492,9 @@ public class WifiConfigController implements TextWatcher, if (isChecked) { toggleVisibility = View.VISIBLE; stringID = R.string.wifi_advanced_toggle_description_expanded; + + // Hide the SoftKeyboard temporary to let user can see most of the expanded items. + hideSoftKeyboard(mView.getWindowToken()); } else { toggleVisibility = View.GONE; stringID = R.string.wifi_advanced_toggle_description_collapsed; @@ -1688,4 +1693,10 @@ public class WifiConfigController implements TextWatcher, } return accessibleEntries; } + + private void hideSoftKeyboard(IBinder windowToken) { + final InputMethodManager inputMethodManager = mContext.getSystemService( + InputMethodManager.class); + inputMethodManager.hideSoftInputFromWindow(windowToken, 0 /* flags */); + } } diff --git a/tests/robotests/src/com/android/settings/wifi/WifiConfigControllerTest.java b/tests/robotests/src/com/android/settings/wifi/WifiConfigControllerTest.java index 9da63ba3220..8ce300bcf24 100644 --- a/tests/robotests/src/com/android/settings/wifi/WifiConfigControllerTest.java +++ b/tests/robotests/src/com/android/settings/wifi/WifiConfigControllerTest.java @@ -35,7 +35,9 @@ import android.security.KeyStore; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.view.inputmethod.InputMethodManager; import android.widget.ArrayAdapter; +import android.widget.CheckBox; import android.widget.Spinner; import android.widget.TextView; @@ -51,7 +53,9 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; +import org.robolectric.Shadows; import org.robolectric.annotation.Config; +import org.robolectric.shadows.ShadowInputMethodManager; @RunWith(RobolectricTestRunner.class) @Config(shadows = ShadowConnectivityManager.class) @@ -509,4 +513,17 @@ public class WifiConfigControllerTest { final int selectedItemPosition = eapMethodSpinner.getSelectedItemPosition(); assertThat(eapMethodSpinner.getSelectedItem().toString()).isEqualTo("TLS"); } + + @Test + public void checkImeStatus_whenAdvancedToggled_shouldBeHide() { + final InputMethodManager inputMethodManager = mContext + .getSystemService(InputMethodManager.class); + final ShadowInputMethodManager shadowImm = Shadows.shadowOf(inputMethodManager); + final CheckBox advButton = mView.findViewById(R.id.wifi_advanced_togglebox); + + inputMethodManager.showSoftInput(null /* view */, 0 /* flags */); + advButton.performClick(); + + assertThat(shadowImm.isSoftInputVisible()).isFalse(); + } }