From ae6bb5a6d2332eaceb218d7a3eb68284d8656afb Mon Sep 17 00:00:00 2001 From: Ming-Shin Lu Date: Wed, 15 Jun 2022 03:31:06 +0000 Subject: [PATCH] Use isVisibleRequested to replace with isAnimating for IME picker dialog In CL[1] to fix IME picker dialog may still be selected as the focus window when quick-switch to the next app from the IME layering target. Since even though the dialog surface is attached to the app where the surface hierarchy is lower than the next app, the dialog is a system window where the window hierarchy is higher than the next app. Previously we use isAnimating to check if the IME layering target is in transition state, which may costly and not reliable. In order to check if the IME layering target is leaving more efficiently, use isVisibleRequested to replace with isAnimating state and it also benefits when in shell-transition. [1]: I771d9817cd6dfcb1bf0d576d94bea9d1b9adc80e Bug: 212570341 Test: atest DisplayContentTests#\ testImeMenuDialogFocusWhenImeLayeringTargetChanges Test: manual, ensure Bug 195073688 won't happen with enabling shell-transition Change-Id: I6857c13ab8bbd0ca84d0e145fc783d4e64b8dcee --- .../java/com/android/server/wm/DisplayContent.java | 4 +--- .../com/android/server/wm/DisplayContentTests.java | 12 ++++-------- 2 files changed, 5 insertions(+), 11 deletions(-) diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index 2ea6ce53caa29..2351dd75a9cf1 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -130,7 +130,6 @@ import static com.android.server.wm.DisplayContentProto.RESUMED_ACTIVITY; import static com.android.server.wm.DisplayContentProto.ROOT_DISPLAY_AREA; import static com.android.server.wm.DisplayContentProto.SCREEN_ROTATION_ANIMATION; import static com.android.server.wm.DisplayContentProto.SLEEP_TOKENS; -import static com.android.server.wm.SurfaceAnimator.ANIMATION_TYPE_APP_TRANSITION; import static com.android.server.wm.SurfaceAnimator.ANIMATION_TYPE_WINDOW_ANIMATION; import static com.android.server.wm.WindowContainer.AnimationFlags.PARENTS; import static com.android.server.wm.WindowContainer.AnimationFlags.TRANSITION; @@ -757,8 +756,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp } if (w.mAttrs.type == TYPE_INPUT_METHOD_DIALOG && mImeLayeringTarget != null && !mImeLayeringTarget.getRequestedVisibility(ITYPE_IME) - && mImeLayeringTarget.isAnimating(PARENTS | TRANSITION, - ANIMATION_TYPE_APP_TRANSITION)) { + && !mImeLayeringTarget.isVisibleRequested()) { return false; } diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java b/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java index a19b19ec6af90..d737963f80e7d 100644 --- a/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java @@ -78,10 +78,8 @@ import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn; import static com.android.dx.mockito.inline.extended.ExtendedMockito.verify; import static com.android.server.wm.ActivityTaskSupervisor.ON_TOP; import static com.android.server.wm.DisplayContent.IME_TARGET_LAYERING; -import static com.android.server.wm.SurfaceAnimator.ANIMATION_TYPE_APP_TRANSITION; import static com.android.server.wm.SurfaceAnimator.ANIMATION_TYPE_TOKEN_TRANSFORM; import static com.android.server.wm.WindowContainer.AnimationFlags.PARENTS; -import static com.android.server.wm.WindowContainer.AnimationFlags.TRANSITION; import static com.android.server.wm.WindowContainer.POSITION_TOP; import static com.android.server.wm.WindowManagerService.UPDATE_FOCUS_NORMAL; @@ -2426,7 +2424,7 @@ public class DisplayContentTests extends WindowTestsBase { @Test public void testImeMenuDialogFocusWhenImeLayeringTargetChanges() { final WindowState imeMenuDialog = - createWindow(mImeWindow, TYPE_INPUT_METHOD_DIALOG, "imeMenuDialog"); + createWindow(null, TYPE_INPUT_METHOD_DIALOG, "imeMenuDialog"); makeWindowVisibleAndDrawn(imeMenuDialog, mImeWindow); assertTrue(imeMenuDialog.canReceiveKeys()); mDisplayContent.setInputMethodWindowLocked(mImeWindow); @@ -2439,13 +2437,11 @@ public class DisplayContentTests extends WindowTestsBase { doReturn(true).when(imeAppTarget).getRequestedVisibility(ITYPE_IME); assertEquals(imeMenuDialog, mDisplayContent.findFocusedWindow()); - // Verify imeMenuDialog doesn't be focused window if the next IME target does not - // request IME visible. + // Verify imeMenuDialog doesn't be focused window if the next IME target is closing. final WindowState nextImeAppTarget = createWindow(null, TYPE_BASE_APPLICATION, mDisplayContent, "nextImeAppTarget"); - spyOn(nextImeAppTarget); - doReturn(true).when(nextImeAppTarget).isAnimating(PARENTS | TRANSITION, - ANIMATION_TYPE_APP_TRANSITION); + makeWindowVisibleAndDrawn(nextImeAppTarget); + nextImeAppTarget.mActivityRecord.commitVisibility(false, false); mDisplayContent.setImeLayeringTarget(nextImeAppTarget); assertNotEquals(imeMenuDialog, mDisplayContent.findFocusedWindow()); }