From 526d5c692dfa8b6202710bac326002ea5e05be59 Mon Sep 17 00:00:00 2001 From: lbill Date: Fri, 28 Oct 2022 08:25:30 +0000 Subject: [PATCH] Request hiding IME before starting next activity transition Since legacy hideSoftInputFromWindow() for IME hiding animation will be scheduled on the focus app's UI thread, so if activity transition has running the animation on UI thread, the IME hiding animation will be delayed until the animation finish. Make sure calling WindowInsetsController#hide(ime()) before starting activity transition to prevent flicker issue. Bug: 204732064 Test: adb shell am start -a android.settings.BIOMETRIC_ENROLL Test: SUW set/confirm pin and move to setup fingerprint(back and forth) Test: make -j RunSettingsRoboTests Change-Id: I33278dd5c993c0bc299ebd065011e5d18c7242e0 --- .../settings/password/ChooseLockPassword.java | 3 +++ .../password/ConfirmDeviceCredentialUtils.java | 17 +++++++++++++++++ .../settings/password/ConfirmLockPassword.java | 3 +++ .../password/SetupChooseLockPassword.java | 6 ++---- 4 files changed, 25 insertions(+), 4 deletions(-) diff --git a/src/com/android/settings/password/ChooseLockPassword.java b/src/com/android/settings/password/ChooseLockPassword.java index c4a3159e001..265cee8eb09 100644 --- a/src/com/android/settings/password/ChooseLockPassword.java +++ b/src/com/android/settings/password/ChooseLockPassword.java @@ -954,6 +954,9 @@ public class ChooseLockPassword extends SettingsActivity { return; } + ConfirmDeviceCredentialUtils.hideImeImmediately( + getActivity().getWindow().getDecorView()); + mPasswordEntryInputDisabler.setInputEnabled(false); setNextEnabled(false); diff --git a/src/com/android/settings/password/ConfirmDeviceCredentialUtils.java b/src/com/android/settings/password/ConfirmDeviceCredentialUtils.java index a5febebc198..26c877fb10b 100644 --- a/src/com/android/settings/password/ConfirmDeviceCredentialUtils.java +++ b/src/com/android/settings/password/ConfirmDeviceCredentialUtils.java @@ -25,6 +25,11 @@ import android.content.Intent; import android.content.IntentSender; import android.os.RemoteException; import android.os.UserManager; +import android.view.View; +import android.view.WindowInsets; +import android.view.WindowInsetsController; + +import androidx.annotation.NonNull; import com.android.internal.widget.LockPatternUtils; @@ -67,4 +72,16 @@ public class ConfirmDeviceCredentialUtils { utils.userPresent(userId); } } + + /** + * Request hiding soft-keyboard before animating away credential UI, in case IME + * insets animation get delayed by dismissing animation. + * @param view used to get root {@link WindowInsets} and {@link WindowInsetsController}. + */ + public static void hideImeImmediately(@NonNull View view) { + if (view.isAttachedToWindow() + && view.getRootWindowInsets().isVisible(WindowInsets.Type.ime())) { + view.getWindowInsetsController().hide(WindowInsets.Type.ime()); + } + } } diff --git a/src/com/android/settings/password/ConfirmLockPassword.java b/src/com/android/settings/password/ConfirmLockPassword.java index a81f975f5c6..48c9aa87d35 100644 --- a/src/com/android/settings/password/ConfirmLockPassword.java +++ b/src/com/android/settings/password/ConfirmLockPassword.java @@ -493,6 +493,9 @@ public class ConfirmLockPassword extends ConfirmDeviceCredentialBaseActivity { } private void startDisappearAnimation(final Intent intent) { + ConfirmDeviceCredentialUtils.hideImeImmediately( + getActivity().getWindow().getDecorView()); + if (mDisappearing) { return; } diff --git a/src/com/android/settings/password/SetupChooseLockPassword.java b/src/com/android/settings/password/SetupChooseLockPassword.java index cca50e0e543..5306719ebe5 100644 --- a/src/com/android/settings/password/SetupChooseLockPassword.java +++ b/src/com/android/settings/password/SetupChooseLockPassword.java @@ -22,7 +22,6 @@ import android.content.Intent; import android.os.Bundle; import android.util.Log; import android.view.View; -import android.view.inputmethod.InputMethodManager; import android.widget.Button; import androidx.annotation.Nullable; @@ -121,9 +120,8 @@ public class SetupChooseLockPassword extends ChooseLockPassword { forFace, forBiometrics); - InputMethodManager imm = (InputMethodManager) getActivity().getSystemService( - Context.INPUT_METHOD_SERVICE); - imm.hideSoftInputFromWindow(view.getWindowToken(), 0); + ConfirmDeviceCredentialUtils.hideImeImmediately( + getActivity().getWindow().getDecorView()); dialog.show(getFragmentManager()); return;