From 41ba83089f946289c8cf032deda8794998667be4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cosmin=20B=C4=83ie=C8=99?= Date: Tue, 13 Jun 2023 15:56:25 +0200 Subject: [PATCH] Fix IME nav bar button flickers This fixes the back navigation button flicker in 3-button navigation when switching IMEs, by setting it to the default (non-IME) position when the IME switcher dialog is shown. This also fixes the IME switcher button flicker in 3-button and gesture navigation modes when switching IMEs. Test: install two IMEs, open the IME and have the IME switcher icon visible, test switching IMEs in 3-button and gesture navigation mode and observe the behaviour of the navigation buttons. Bug: 287045025 Change-Id: I9c0d521d372db8b33f4898eb25bdef1e6fc50e48 --- .../inputmethod/InputMethodManagerService.java | 14 ++++++++++++-- .../inputmethod/InputMethodMenuController.java | 8 +++++++- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java b/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java index 8c137e2eb44c4..4dbd82065a667 100644 --- a/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java +++ b/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java @@ -3043,7 +3043,12 @@ public final class InputMethodManagerService extends IInputMethodManager.Stub private boolean shouldShowImeSwitcherLocked( @InputMethodService.ImeWindowVisibility int visibility) { if (!mShowOngoingImeSwitcherForPhones) return false; + // When the IME switcher dialog is shown, the IME switcher button should be hidden. if (mMenuController.getSwitchingDialogLocked() != null) return false; + // When we are switching IMEs, the IME switcher button should be hidden. + if (!Objects.equals(getCurIdLocked(), getSelectedMethodIdLocked())) { + return false; + } if (mWindowManagerInternal.isKeyguardShowingAndNotOccluded() && mWindowManagerInternal.isKeyguardSecure(mSettings.getCurrentUserId())) { return false; @@ -3208,7 +3213,12 @@ public final class InputMethodManagerService extends IInputMethodManager.Stub } else { vis &= ~InputMethodService.IME_VISIBLE_IMPERCEPTIBLE; } - // mImeWindowVis should be updated before calling shouldShowImeSwitcherLocked(). + if (mMenuController.getSwitchingDialogLocked() != null + || !Objects.equals(getCurIdLocked(), getSelectedMethodIdLocked())) { + // When the IME switcher dialog is shown, or we are switching IMEs, + // the back button should be in the default state (as if the IME is not shown). + backDisposition = InputMethodService.BACK_DISPOSITION_ADJUST_NOTHING; + } final boolean needsToShowImeSwitcher = shouldShowImeSwitcherLocked(vis); if (mStatusBarManagerInternal != null) { mStatusBarManagerInternal.setImeWindowStatus(mCurTokenDisplayId, @@ -5775,7 +5785,7 @@ public final class InputMethodManagerService extends IInputMethodManager.Stub // input target changed, in case seeing the dialog dismiss flickering during // the next focused window starting the input connection. if (mLastImeTargetWindow != mCurFocusedWindow) { - mMenuController.hideInputMethodMenu(); + mMenuController.hideInputMethodMenuLocked(); } } } diff --git a/services/core/java/com/android/server/inputmethod/InputMethodMenuController.java b/services/core/java/com/android/server/inputmethod/InputMethodMenuController.java index c212e8e3c82cc..c2ef83d066900 100644 --- a/services/core/java/com/android/server/inputmethod/InputMethodMenuController.java +++ b/services/core/java/com/android/server/inputmethod/InputMethodMenuController.java @@ -175,13 +175,13 @@ final class InputMethodMenuController { int subtypeId = mSubtypeIds[which]; adapter.mCheckedItem = which; adapter.notifyDataSetChanged(); - hideInputMethodMenu(); if (im != null) { if (subtypeId < 0 || subtypeId >= im.getSubtypeCount()) { subtypeId = NOT_A_SUBTYPE_ID; } mService.setInputMethodLocked(im.getId(), subtypeId); } + hideInputMethodMenuLocked(); } }; mDialogBuilder.setSingleChoiceItems(adapter, checkedItem, choiceListener); @@ -220,12 +220,18 @@ final class InputMethodMenuController { } } + /** + * Hides the input method switcher menu. + */ void hideInputMethodMenu() { synchronized (ImfLock.class) { hideInputMethodMenuLocked(); } } + /** + * Hides the input method switcher menu, synchronised version of {@link #hideInputMethodMenu}. + */ @GuardedBy("ImfLock.class") void hideInputMethodMenuLocked() { if (DEBUG) Slog.v(TAG, "Hide switching menu");