From 4545703367b62c41a275295dd02d9ef47479d6fc Mon Sep 17 00:00:00 2001 From: Taran Singh Date: Fri, 26 Jun 2020 09:04:57 -0700 Subject: [PATCH] Deliver hideInsets when target is removed hideInsets(IME) may not be delivered to the control target if the window requesting hide is no longer available in WindowManager's window map. However, it is still nicer to deliver it to the default display's control target rather than not delivering it at all. Fix: 159623277 Test: Manually using steps in bug. Change-Id: I22cdf20627da2183d30af444f6dd9d0375d417c1 --- data/etc/services.core.protolog.json | 12 +++++++ .../InputMethodManagerService.java | 4 ++- .../server/wm/WindowManagerInternal.java | 3 +- .../server/wm/WindowManagerService.java | 31 ++++++++++--------- 4 files changed, 34 insertions(+), 16 deletions(-) diff --git a/data/etc/services.core.protolog.json b/data/etc/services.core.protolog.json index 33ab16de79056..67a64ac592f22 100644 --- a/data/etc/services.core.protolog.json +++ b/data/etc/services.core.protolog.json @@ -757,6 +757,12 @@ "group": "WM_DEBUG_BOOT", "at": "com\/android\/server\/wm\/WindowManagerService.java" }, + "-547111355": { + "message": "hideIme Control target: %s ", + "level": "DEBUG", + "group": "WM_DEBUG_IME", + "at": "com\/android\/server\/wm\/WindowManagerService.java" + }, "-545190927": { "message": "<<< CLOSE TRANSACTION animate", "level": "INFO", @@ -1087,6 +1093,12 @@ "group": "WM_ERROR", "at": "com\/android\/server\/wm\/WindowManagerService.java" }, + "95216706": { + "message": "hideIme target: %s ", + "level": "DEBUG", + "group": "WM_DEBUG_IME", + "at": "com\/android\/server\/wm\/WindowManagerService.java" + }, "95281111": { "message": "Attempted to get IME flag of a display that does not exist: %d", "level": "WARN", diff --git a/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java b/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java index 9acb47538043c..15e8a92ba0e40 100644 --- a/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java +++ b/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java @@ -4047,7 +4047,9 @@ public class InputMethodManagerService extends IInputMethodManager.Stub // Send it to window manager to hide IME from IME target window. // TODO(b/139861270): send to mCurClient.client once IMMS is aware of // actual IME target. - mWindowManagerInternal.hideIme(mHideRequestWindowMap.get(windowToken)); + mWindowManagerInternal.hideIme( + mHideRequestWindowMap.get(windowToken), + mCurClient.selfReportedDisplayId); } } else { // Send to window manager to show IME after IME layout finishes. diff --git a/services/core/java/com/android/server/wm/WindowManagerInternal.java b/services/core/java/com/android/server/wm/WindowManagerInternal.java index c605e3e1ea60e..315014c1b248c 100644 --- a/services/core/java/com/android/server/wm/WindowManagerInternal.java +++ b/services/core/java/com/android/server/wm/WindowManagerInternal.java @@ -528,8 +528,9 @@ public abstract class WindowManagerInternal { * Hide IME using imeTargetWindow when requested. * * @param imeTargetWindowToken token of the (IME target) window on which IME should be hidden. + * @param displayId the id of the display the IME is on. */ - public abstract void hideIme(IBinder imeTargetWindowToken); + public abstract void hideIme(IBinder imeTargetWindowToken, int displayId); /** * Tell window manager about a package that should not be running with high refresh rate diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index f4281fc0cafdb..0b50c1cd496a7 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -90,6 +90,7 @@ import static com.android.server.wm.ProtoLogGroup.WM_DEBUG_ADD_REMOVE; import static com.android.server.wm.ProtoLogGroup.WM_DEBUG_BOOT; import static com.android.server.wm.ProtoLogGroup.WM_DEBUG_FOCUS; import static com.android.server.wm.ProtoLogGroup.WM_DEBUG_FOCUS_LIGHT; +import static com.android.server.wm.ProtoLogGroup.WM_DEBUG_IME; import static com.android.server.wm.ProtoLogGroup.WM_DEBUG_KEEP_SCREEN_ON; import static com.android.server.wm.ProtoLogGroup.WM_DEBUG_ORIENTATION; import static com.android.server.wm.ProtoLogGroup.WM_DEBUG_SCREEN_ON; @@ -7616,24 +7617,26 @@ public class WindowManagerService extends IWindowManager.Stub } @Override - public void hideIme(IBinder imeTargetWindowToken) { + public void hideIme(IBinder imeTargetWindowToken, int displayId) { synchronized (mGlobalLock) { WindowState imeTarget = mWindowMap.get(imeTargetWindowToken); - if (imeTarget == null) { - // The target window no longer exists. - return; + ProtoLog.d(WM_DEBUG_IME, "hideIme target: %s ", imeTarget); + DisplayContent dc = mRoot.getDisplayContent(displayId); + if (imeTarget != null) { + imeTarget = imeTarget.getImeControlTarget().getWindow(); + if (imeTarget != null) { + dc = imeTarget.getDisplayContent(); + } + // If there was a pending IME show(), reset it as IME has been + // requested to be hidden. + dc.getInsetsStateController().getImeSourceProvider().abortShowImePostLayout(); } - imeTarget = imeTarget.getImeControlTarget().getWindow(); - final DisplayContent dc = imeTarget != null - ? imeTarget.getDisplayContent() : getDefaultDisplayContentLocked(); - // If there was a pending IME show(), reset it as IME has been - // requested to be hidden. - dc.getInsetsStateController().getImeSourceProvider().abortShowImePostLayout(); - if (dc.mInputMethodControlTarget == null) { - return; + if (dc != null && dc.mInputMethodControlTarget != null) { + ProtoLog.d(WM_DEBUG_IME, "hideIme Control target: %s ", + dc.mInputMethodControlTarget); + dc.mInputMethodControlTarget.hideInsets( + WindowInsets.Type.ime(), true /* fromIme */); } - dc.mInputMethodControlTarget.hideInsets( - WindowInsets.Type.ime(), true /* fromIme */); } }