diff --git a/core/java/android/view/WindowManagerInternal.java b/core/java/android/view/WindowManagerInternal.java index 6e2a92cd4ee98..7a5e670c02bde 100644 --- a/core/java/android/view/WindowManagerInternal.java +++ b/core/java/android/view/WindowManagerInternal.java @@ -281,6 +281,25 @@ public abstract class WindowManagerInternal { */ public abstract void clearLastInputMethodWindowForTransition(); + /** + * Notifies WindowManagerService that the current IME window status is being changed. + * + *
Only {@link com.android.server.InputMethodManagerService} is the expected and tested + * caller of this method.
+ * + * @param imeToken token to track the active input method. Corresponding IME windows can be + * identified by checking {@link android.view.WindowManager.LayoutParams#token}. + * Note that there is no guarantee that the corresponding window is already + * created + * @param imeWindowVisible whether the active IME thinks that its window should be visible or + * hidden, no matter how WindowManagerService will react / has reacted + * to corresponding API calls. Note that this state is not guaranteed + * to be synchronized with state in WindowManagerService. + * @param targetWindowToken token to identify the target window that the IME is associated with. + */ + public abstract void updateInputMethodWindowStatus(IBinder imeToken, boolean imeWindowVisible, + IBinder targetWindowToken); + /** * Returns true when the hardware keyboard is available. */ diff --git a/services/core/java/com/android/server/InputMethodManagerService.java b/services/core/java/com/android/server/InputMethodManagerService.java index b6a0e5cc9957f..1dadcf5908cd1 100644 --- a/services/core/java/com/android/server/InputMethodManagerService.java +++ b/services/core/java/com/android/server/InputMethodManagerService.java @@ -1856,8 +1856,9 @@ public class InputMethodManagerService extends IInputMethodManager.Stub return; } + final StartInputInfo info; synchronized (mMethodMap) { - final StartInputInfo info = mStartInputMap.get(startInputToken); + info = mStartInputMap.get(startInputToken); if (info == null) { throw new InvalidParameterException("Unknown startInputToken=" + startInputToken); } @@ -1865,6 +1866,8 @@ public class InputMethodManagerService extends IInputMethodManager.Stub mBackDisposition = backDisposition; updateSystemUiLocked(token, vis, backDisposition); } + mWindowManagerInternal.updateInputMethodWindowStatus(info.mImeToken, + (vis & InputMethodService.IME_VISIBLE) != 0, info.mTargetWindow); } private void updateSystemUi(IBinder token, int vis, int backDisposition) { diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index be0771ae97b5d..150e456fda13c 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -75,6 +75,7 @@ import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_CONFIGURATION import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_DRAG; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_FOCUS; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_FOCUS_LIGHT; +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_INPUT_METHOD; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_KEEP_SCREEN_ON; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_LAYOUT; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_ORIENTATION; @@ -7902,6 +7903,17 @@ public class WindowManagerService extends IWindowManager.Stub } } + @Override + public void updateInputMethodWindowStatus(IBinder imeToken, boolean imeWindowVisible, + IBinder targetWindowToken) { + // TODO (b/34628091): Use this method to address the window animation issue. + if (DEBUG_INPUT_METHOD) { + Slog.w(TAG_WM, "updateInputMethodWindowStatus: imeToken=" + imeToken + + " imeWindowVisible=" + imeWindowVisible + + " targetWindowToken=" + targetWindowToken); + } + } + @Override public boolean isHardKeyboardAvailable() { synchronized (mWindowMap) {