From 197b24b8d5927c3c9a772b51ba3dbc374b844345 Mon Sep 17 00:00:00 2001 From: Taran Singh Date: Thu, 9 Jul 2020 11:05:01 -0700 Subject: [PATCH] Let system control IME for ineligible display When IME is requested from a display that cannot show IME, we fallback to StatusBar to control IME. However, StatusBar isn't always available. In such cases, let the system control the IME. Fix: 158122585 Fix: 148234093 Test: atest MultiDisplaySecurityTests Change-Id: I4d2245402952590af6b5fcc91309a3b01885fd8e --- .../com/android/server/wm/DisplayContent.java | 11 +++++---- .../server/wm/ImeInsetsSourceProvider.java | 23 ++++++++++++------- .../server/wm/WindowManagerService.java | 5 ++-- 3 files changed, 25 insertions(+), 14 deletions(-) diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index b94fb0471af41..33c4e676a03f3 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -3537,9 +3537,9 @@ class DisplayContent extends WindowContainer { ProtoLog.d(WM_DEBUG_IME, "Run showImeRunner"); // Target should still be the same. @@ -127,13 +130,17 @@ class ImeInsetsSourceProvider extends InsetsSourceProvider { return false; } ProtoLog.d(WM_DEBUG_IME, "dcTarget: %s mImeTargetFromIme: %s", - dcTarget.getName(), mImeTargetFromIme.getName()); + dcTarget.getName(), mImeTargetFromIme.getWindow() == null + ? mImeTargetFromIme : mImeTargetFromIme.getWindow().getName()); return (!dcTarget.isClosing() && mImeTargetFromIme == dcTarget) - || (mImeTargetFromIme != null && dcTarget.getParentWindow() == mImeTargetFromIme - && dcTarget.mSubLayer > mImeTargetFromIme.mSubLayer) + || (mImeTargetFromIme != null && mImeTargetFromIme.getWindow() != null + && dcTarget.getParentWindow() == mImeTargetFromIme + && dcTarget.mSubLayer > mImeTargetFromIme.getWindow().mSubLayer) || mImeTargetFromIme == mDisplayContent.getImeFallback() - || (!mImeTargetFromIme.isClosing() && controlTarget == mImeTargetFromIme); + || controlTarget == mImeTargetFromIme + && (mImeTargetFromIme.getWindow() == null + || !mImeTargetFromIme.getWindow().isClosing()); } @Override diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 0b50c1cd496a7..ef81c0a5d206c 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -7606,13 +7606,14 @@ public class WindowManagerService extends IWindowManager.Stub if (imeTarget == null) { return; } - imeTarget = imeTarget.getImeControlTarget().getWindow(); + final InsetsControlTarget controlTarget = imeTarget.getImeControlTarget(); + imeTarget = controlTarget.getWindow(); // If InsetsControlTarget doesn't have a window, its using remoteControlTarget which // is controlled by default display final DisplayContent dc = imeTarget != null ? imeTarget.getDisplayContent() : getDefaultDisplayContentLocked(); dc.getInsetsStateController().getImeSourceProvider() - .scheduleShowImePostLayout(imeTarget); + .scheduleShowImePostLayout(controlTarget); } }