Consider IME_VISIBLE_IMPERCEPTIBLE as shown for taskbar purposes

IME_VISIBLE isn't set until the keyboard is "perceptibly" visible to the user (e.g. based on alpha). But we want to signal to taskbar as soon as we know IME will be visible.

Test: tap an edit field to open keyboard, ensure taskbar reacts immediately instead of halfway through the transition
Bug: 202511986
Change-Id: I39c15578ed3e5b729f4645ad76988b113f0b57a6
This commit is contained in:
Tony Wickham
2021-11-23 17:34:25 +00:00
parent 4785ec13d0
commit e51f699fa8
3 changed files with 21 additions and 2 deletions

View File

@@ -395,7 +395,7 @@ public class InputMethodService extends AbstractInputMethodService {
/**
* @hide
* The IME is visible.
* The IME is perceptibly visible to the user.
*/
public static final int IME_VISIBLE = 0x2;
@@ -406,6 +406,15 @@ public class InputMethodService extends AbstractInputMethodService {
*/
public static final int IME_INVISIBLE = 0x4;
/**
* @hide
* The IME is visible, but not yet perceptible to the user (e.g. fading in)
* by {@link android.view.WindowInsetsController}.
*
* @see InputMethodManager#reportPerceptible
*/
public static final int IME_VISIBLE_IMPERCEPTIBLE = 0x8;
// Min and max values for back disposition.
private static final int BACK_DISPOSITION_MIN = BACK_DISPOSITION_DEFAULT;
private static final int BACK_DISPOSITION_MAX = BACK_DISPOSITION_ADJUST_NOTHING;

View File

@@ -41,6 +41,7 @@ import android.content.ComponentCallbacks;
import android.content.Context;
import android.content.res.Configuration;
import android.hardware.display.DisplayManager;
import android.inputmethodservice.InputMethodService;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log;
@@ -265,6 +266,10 @@ public class TaskbarDelegate implements CommandQueue.Callbacks,
public void setImeWindowStatus(int displayId, IBinder token, int vis, int backDisposition,
boolean showImeSwitcher) {
boolean imeShown = mNavBarHelper.isImeShown(vis);
if (!imeShown) {
// Count imperceptible changes as visible so we transition taskbar out quickly.
imeShown = (vis & InputMethodService.IME_VISIBLE_IMPERCEPTIBLE) != 0;
}
showImeSwitcher = imeShown && showImeSwitcher;
int hints = Utilities.calculateBackDispositionHints(mNavigationIconHints, backDisposition,
imeShown, showImeSwitcher);

View File

@@ -2868,7 +2868,12 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
final long ident = Binder.clearCallingIdentity();
try {
if (!mCurPerceptible) {
vis &= ~InputMethodService.IME_VISIBLE;
if ((vis & InputMethodService.IME_VISIBLE) != 0) {
vis &= ~InputMethodService.IME_VISIBLE;
vis |= InputMethodService.IME_VISIBLE_IMPERCEPTIBLE;
}
} else {
vis &= ~InputMethodService.IME_VISIBLE_IMPERCEPTIBLE;
}
// mImeWindowVis should be updated before calling shouldShowImeSwitcherLocked().
final boolean needsToShowImeSwitcher = shouldShowImeSwitcherLocked(vis);