Deprecate IMM#showSoftInputUnchecked() part 2

This is the 2nd attempt to have CryptKeeper stop depending on
InputMethodManager#showSoftInputUnchecked() do avoid non-deterministic
behaviors.  Note that the original one [1] was reverted [2] due to
ClassCastException as crypt_keeper_pin_field.xml was not updated to
use ImeAwareEditText.

We have been receiving more and more strange bug reports regarding
the initial IME visibility on CryptKeeper (Bug 31915865, Bug 35198715,
and Bug 36148078).  Most likely we have introduced more bugs before
fixing previous bugs.

As the first step to disentangle multiple problems, this CL addresses
a long standing issue that CryptKeeper relies on @hide internal API
InputMethodManager#showSoftInputUnchecked().  As explained in
Bug 36015425, IMM#showSoftInputUnchecked() is considered harmful in
terms of bypassing standard IME focus handling flows, which prevents
us from taking advantage of historical debugging mechanism that we
have added recently in Bug 35079353.

 [1]: I3cffeec286d9372ff05e85a49b82287cb1add8a2
      4ae46cd1ad
 [2]: I776ad2e6ba0eabacb3d6be6de23ba37fe5ce7bc7
      cf026ead80

Test: Manually verified that Bug 31915865 is still broken but this CL
      does not make it worse.
      1. Flash an image into a non direct-boot device.
      2. Set up a device boot password.
      3. adb reboot
      After the step 3, the software keyboard shows up automatically
      then suddenly disappears (Bug 35198715). Do the same test for
      device boot PIN instead of password.
Bug: 36015425
Change-Id: I182b05d3ff59fb3b4732d60d0d5a464f0e0e0235
This commit is contained in:
Yohei Yukawa
2017-03-21 12:38:44 -07:00
parent e39e8350a1
commit f6af093e2d
4 changed files with 104 additions and 15 deletions

View File

@@ -57,7 +57,6 @@ import android.view.inputmethod.InputMethodInfo;
import android.view.inputmethod.InputMethodManager;
import android.view.inputmethod.InputMethodSubtype;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ProgressBar;
import android.widget.TextView;
@@ -66,6 +65,7 @@ import com.android.internal.widget.LockPatternUtils;
import com.android.internal.widget.LockPatternView;
import com.android.internal.widget.LockPatternView.Cell;
import com.android.internal.widget.LockPatternView.DisplayMode;
import com.android.settings.widget.ImeAwareEditText;
import java.util.List;
@@ -122,7 +122,7 @@ public class CryptKeeper extends Activity implements TextView.OnEditorActionList
private boolean mCooldown = false;
PowerManager.WakeLock mWakeLock;
private EditText mPasswordEntry;
private ImeAwareEditText mPasswordEntry;
private LockPatternView mLockPatternView;
/** Number of calls to {@link #notifyUser()} to ignore before notifying. */
private int mNotificationCountdown = 0;
@@ -277,9 +277,7 @@ public class CryptKeeper extends Activity implements TextView.OnEditorActionList
// Reenable the password entry
if (mPasswordEntry != null) {
mPasswordEntry.setEnabled(true);
final InputMethodManager imm = (InputMethodManager) getSystemService(
Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(mPasswordEntry, 0);
mPasswordEntry.scheduleShowSoftInput();
setBackFunctionality(true);
}
}
@@ -744,7 +742,7 @@ public class CryptKeeper extends Activity implements TextView.OnEditorActionList
private void passwordEntryInit() {
// Password/pin case
mPasswordEntry = (EditText) findViewById(R.id.passwordEntry);
mPasswordEntry = (ImeAwareEditText) findViewById(R.id.passwordEntry);
if (mPasswordEntry != null){
mPasswordEntry.setOnEditorActionListener(this);
mPasswordEntry.requestFocus();
@@ -797,16 +795,13 @@ public class CryptKeeper extends Activity implements TextView.OnEditorActionList
}
}
// Asynchronously throw up the IME, since there are issues with requesting it to be shown
// immediately.
// Make sure that the IME is shown when everything becomes ready.
if (mLockPatternView == null && !mCooldown) {
getWindow().setSoftInputMode(
WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
mHandler.postDelayed(new Runnable() {
@Override public void run() {
imm.showSoftInputUnchecked(0, null);
}
}, 0);
if (mPasswordEntry != null) {
mPasswordEntry.scheduleShowSoftInput();
}
}
updateEmergencyCallButtonState();