Merge "Request hiding IME before starting next activity transition"
diff --git a/src/com/android/settings/password/ChooseLockPassword.java b/src/com/android/settings/password/ChooseLockPassword.java
index c4a3159..265cee8 100644
--- a/src/com/android/settings/password/ChooseLockPassword.java
+++ b/src/com/android/settings/password/ChooseLockPassword.java
@@ -954,6 +954,9 @@
                 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 a5febeb..26c877f 100644
--- a/src/com/android/settings/password/ConfirmDeviceCredentialUtils.java
+++ b/src/com/android/settings/password/ConfirmDeviceCredentialUtils.java
@@ -25,6 +25,11 @@
 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 @@
             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 a81f975..48c9aa8 100644
--- a/src/com/android/settings/password/ConfirmLockPassword.java
+++ b/src/com/android/settings/password/ConfirmLockPassword.java
@@ -493,6 +493,9 @@
         }
 
         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 cca50e0..5306719 100644
--- a/src/com/android/settings/password/SetupChooseLockPassword.java
+++ b/src/com/android/settings/password/SetupChooseLockPassword.java
@@ -22,7 +22,6 @@
 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 @@
                         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;