From d7a02ec7ae1b4e0309910e494319925c47c2059f Mon Sep 17 00:00:00 2001 From: hyunyoungs Date: Fri, 3 Jun 2022 00:47:04 -0700 Subject: [PATCH] Fix IME hiding animation being delayed after unlocking the device Hide keyboard with WindowInsetsController if could. In case hideSoftInputFromWindow may ignored by input connection being finished when the screen is off. Bug: 233158645 Test: manual as steps: 1. Launch AllApps. 2. Tap search bar to invoke IME. 3. Screen off. 4. Screen on. And all other keyboard hide cases such as back gesture, swipe down, etc. Change-Id: I4154f38f94b6760a430f7510a650422020d8f59a --- .../android/launcher3/ExtendedEditText.java | 1 + .../launcher3/util/UiThreadHelper.java | 29 ++++++++++++++++++- 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/src/com/android/launcher3/ExtendedEditText.java b/src/com/android/launcher3/ExtendedEditText.java index 3b5b454bc1..4629ca7a2b 100644 --- a/src/com/android/launcher3/ExtendedEditText.java +++ b/src/com/android/launcher3/ExtendedEditText.java @@ -104,6 +104,7 @@ public class ExtendedEditText extends EditText { public void hideKeyboard() { hideKeyboardAsync(ActivityContext.lookupContext(getContext()), getWindowToken()); + clearFocus(); } private boolean showSoftInput() { diff --git a/src/com/android/launcher3/util/UiThreadHelper.java b/src/com/android/launcher3/util/UiThreadHelper.java index a1f31fe459..8df3f8a129 100644 --- a/src/com/android/launcher3/util/UiThreadHelper.java +++ b/src/com/android/launcher3/util/UiThreadHelper.java @@ -25,9 +25,13 @@ import android.os.Bundle; import android.os.Handler; import android.os.IBinder; import android.os.Message; +import android.util.Log; import android.view.View; +import android.view.WindowInsets; +import android.view.WindowInsetsController; import android.view.inputmethod.InputMethodManager; +import com.android.launcher3.Utilities; import com.android.launcher3.views.ActivityContext; /** @@ -48,6 +52,29 @@ public class UiThreadHelper { public static void hideKeyboardAsync(ActivityContext activityContext, IBinder token) { View root = activityContext.getDragLayer(); + if (Utilities.ATLEAST_R) { + Preconditions.assertUIThread(); + // Hide keyboard with WindowInsetsController if could. In case + // hideSoftInputFromWindow may get ignored by input connection being finished + // when the screen is off. + // + // In addition, inside IMF, the keyboards are closed asynchronously that launcher no + // longer need to post to the message queue. + final WindowInsetsController wic = root.getWindowInsetsController(); + WindowInsets insets = root.getRootWindowInsets(); + boolean isImeShown = insets != null && insets.isVisible(WindowInsets.Type.ime()); + if (wic != null && isImeShown) { + // this method cannot be called cross threads + wic.hide(WindowInsets.Type.ime()); + activityContext.getStatsLogManager().logger() + .log(LAUNCHER_ALLAPPS_KEYBOARD_CLOSED); + return; + } else { + // print which stack trace failed. + Log.e("Launcher", "hideKeyboard ignored.", new Exception()); + // Then attempt to use the old logic. + } + } // Since the launcher context cannot be accessed directly from callback, adding secondary // message to log keyboard close event asynchronously. Bundle mHideKeyboardLoggerMsg = new Bundle(); @@ -55,7 +82,7 @@ public class UiThreadHelper { STATS_LOGGER_KEY, Message.obtain( HANDLER.get(root.getContext()), - () -> ActivityContext.lookupContext(root.getContext()) + () -> activityContext .getStatsLogManager() .logger() .log(LAUNCHER_ALLAPPS_KEYBOARD_CLOSED)