From 480326710681b1ef1c1a55cf38b3de10ed75f27e Mon Sep 17 00:00:00 2001 From: Tarandeep Singh Date: Mon, 12 Jun 2017 15:32:28 -0700 Subject: [PATCH] Replace showSoftInput with ImeAwareEditText.scheduleShowSoftInput Both View focus (which is triggered by View.requestFocus()) and IME focus (which is internally handled inside InputMethodManager), are implemented as delayed tasks on the UI thread. The goal here is to make sure that InputMethodManager.showSoftInput() always gets called only after the target EditText gained IME focus. This requires some tricks, but is basically a solved problem with ImeAwareEditText introduced by I182b05d3ff59fb3b4732d60d0d5a464f0e0e0235. Here we can just reuse it. Note that ConfirmLockPassword & ChooseLockPassword are the only ones using ScrollToParentEditText. Latter doesn't call IMM.showSoftInput(). Fixes: 62542157 Test: Verified keyboard still shows-up on the ConfirmLock screen. Change-Id: I892d639f3cc5d43db553b682d5278b8ce2fe72da --- src/com/android/settings/password/ConfirmLockPassword.java | 7 ++++--- .../android/settings/widget/ScrollToParentEditText.java | 4 +++- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/com/android/settings/password/ConfirmLockPassword.java b/src/com/android/settings/password/ConfirmLockPassword.java index 9a494cbb84b..69498a992ea 100644 --- a/src/com/android/settings/password/ConfirmLockPassword.java +++ b/src/com/android/settings/password/ConfirmLockPassword.java @@ -44,6 +44,7 @@ import com.android.internal.widget.LockPatternChecker; import com.android.internal.widget.LockPatternUtils; import com.android.internal.widget.TextViewInputDisabler; import com.android.settings.R; +import com.android.settings.widget.ImeAwareEditText; import com.android.settingslib.animation.AppearAnimationUtils; import com.android.settingslib.animation.DisappearAnimationUtils; @@ -93,7 +94,7 @@ public class ConfirmLockPassword extends ConfirmDeviceCredentialBaseActivity { CredentialCheckResultTracker.Listener { private static final long ERROR_MESSAGE_TIMEOUT = 3000; private static final String FRAGMENT_TAG_CHECK_LOCK_RESULT = "check_lock_result"; - private TextView mPasswordEntry; + private ImeAwareEditText mPasswordEntry; private TextViewInputDisabler mPasswordEntryInputDisabler; private AsyncTask mPendingLockCheck; private CredentialCheckResultTracker mCredentialCheckResultTracker; @@ -132,7 +133,7 @@ public class ConfirmLockPassword extends ConfirmDeviceCredentialBaseActivity { container, false); - mPasswordEntry = (TextView) view.findViewById(R.id.password_entry); + mPasswordEntry = (ImeAwareEditText) view.findViewById(R.id.password_entry); mPasswordEntry.setOnEditorActionListener(this); // EditText inside ScrollView doesn't automatically get focus. mPasswordEntry.requestFocus(); @@ -310,7 +311,7 @@ public class ConfirmLockPassword extends ConfirmDeviceCredentialBaseActivity { mPasswordEntry.setEnabled(true); mPasswordEntryInputDisabler.setInputEnabled(true); if (shouldAutoShowSoftKeyboard()) { - mImm.showSoftInput(mPasswordEntry, InputMethodManager.SHOW_IMPLICIT); + mPasswordEntry.scheduleShowSoftInput(); } } diff --git a/src/com/android/settings/widget/ScrollToParentEditText.java b/src/com/android/settings/widget/ScrollToParentEditText.java index 97602afd9b4..705e918ea5e 100644 --- a/src/com/android/settings/widget/ScrollToParentEditText.java +++ b/src/com/android/settings/widget/ScrollToParentEditText.java @@ -23,12 +23,14 @@ import android.view.View; import android.view.ViewParent; import android.widget.EditText; +import com.android.settings.widget.ImeAwareEditText; + /** * An EditText that, instead of scrolling to itself when focused, will request scrolling to its * parent. This is used in ChooseLockPassword to do make a best effort for not hiding the error * messages for why the password is invalid under the keyboard. */ -public class ScrollToParentEditText extends EditText { +public class ScrollToParentEditText extends ImeAwareEditText { private Rect mRect = new Rect();