Merge "Fix IME layering target above IME surface" into sc-v2-dev am: 175672ccef am: 1637d12bee
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/16545008
Change-Id: I7f15d11eb86f622463f68bb7a7038e58e4d98273
diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java
index 22677d7..55f463d 100644
--- a/services/core/java/com/android/server/wm/DisplayContent.java
+++ b/services/core/java/com/android/server/wm/DisplayContent.java
@@ -4995,8 +4995,11 @@
// exists so it get's layered above the starting window.
if (imeTarget != null && !(imeTarget.mActivityRecord != null
&& imeTarget.mActivityRecord.hasStartingWindow())) {
+ final WindowToken imeControlTargetToken =
+ mImeControlTarget != null && mImeControlTarget.getWindow() != null
+ ? mImeControlTarget.getWindow().mToken : null;
final boolean canImeTargetSetRelativeLayer = imeTarget.getSurfaceControl() != null
- && imeTarget == mImeControlTarget
+ && imeTarget.mToken == imeControlTargetToken
&& !imeTarget.inMultiWindowMode()
&& imeTarget.mToken.getActivity(app -> app.isAnimating(TRANSITION | PARENTS,
ANIMATION_TYPE_ALL & ~ANIMATION_TYPE_RECENTS)) == null;
diff --git a/services/tests/wmtests/src/com/android/server/wm/ZOrderingTests.java b/services/tests/wmtests/src/com/android/server/wm/ZOrderingTests.java
index 049966c..4dffe7e 100644
--- a/services/tests/wmtests/src/com/android/server/wm/ZOrderingTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/ZOrderingTests.java
@@ -428,6 +428,25 @@
assertWindowHigher(mImeWindow, imeAppTarget);
}
+ @Test
+ public void testAssignWindowLayers_ForImeOnPopupImeLayeringTarget() {
+ final WindowState imeAppTarget = createWindow(null, TYPE_APPLICATION,
+ mAppWindow.mActivityRecord, "imeAppTarget");
+ mDisplayContent.setImeInputTarget(imeAppTarget);
+ mDisplayContent.setImeLayeringTarget(imeAppTarget);
+ mDisplayContent.setImeControlTarget(imeAppTarget);
+
+ // Set a popup IME layering target and keeps the original IME control target behinds it.
+ final WindowState popupImeTargetWin = createWindow(imeAppTarget,
+ TYPE_APPLICATION_SUB_PANEL, mAppWindow.mActivityRecord, "popupImeTargetWin");
+ mDisplayContent.setImeLayeringTarget(popupImeTargetWin);
+ mDisplayContent.updateImeParent();
+
+ // Ime should on top of the popup IME layering target window.
+ mDisplayContent.assignChildLayers(mTransaction);
+ assertWindowHigher(mImeWindow, popupImeTargetWin);
+ }
+
@Test
public void testAssignWindowLayers_ForNegativelyZOrderedSubtype() {