From 69e68024220d3f18b08cbb314c7991f8f76cbe49 Mon Sep 17 00:00:00 2001 From: Yohei Yukawa Date: Mon, 13 Feb 2017 12:04:50 -0800 Subject: [PATCH] Propagate setImeWindowStatus() to WMS setImeWindowStatus() introduced in the previous CL [1] can help WindowManagerService (WMS) address Bug 34628091. As a preparation this CL has InputMethodManagerService propagate relevant information to WMS WMS for later use. [1]: I9921b381e02106dbffff5e0b3d13f0a1245ce807 db2afde0e584904ee4ce115ce176a4dfe1773990 Test: Verified the callback in WindowManagerService as follows: 1. Rebuild the system with DEBUG_INPUT_METHOD=true 2. adb logcat -s WindowManager:* to make sure the visibility passed to WindowManagerService#updateInputMethodWindowStatus matches to the actual IME window visibility Bug: 34628091 Bug: 35079353 Change-Id: I54fb1faf513883a54293a756e4c9d2ae9453d778 --- core/java/android/view/WindowManagerInternal.java | 19 +++++++++++++++++++ .../com/android/server/InputMethodManagerService.java | 5 ++++- .../com/android/server/wm/WindowManagerService.java | 12 ++++++++++++ 3 files changed, 35 insertions(+), 1 deletion(-) diff --git a/core/java/android/view/WindowManagerInternal.java b/core/java/android/view/WindowManagerInternal.java index 6e2a92cd4ee9..7a5e670c02bd 100644 --- a/core/java/android/view/WindowManagerInternal.java +++ b/core/java/android/view/WindowManagerInternal.java @@ -282,6 +282,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. */ public abstract boolean isHardKeyboardAvailable(); diff --git a/services/core/java/com/android/server/InputMethodManagerService.java b/services/core/java/com/android/server/InputMethodManagerService.java index b6a0e5cc9957..1dadcf5908cd 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 be0771ae97b5..150e456fda13 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; @@ -7903,6 +7904,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) { return mHardKeyboardAvailable; -- 2.11.0