From 4c4ba205cf59301adcb13ec7ea719a74b22ae693 Mon Sep 17 00:00:00 2001 From: Evan Rosky Date: Wed, 8 Dec 2021 21:24:05 -0800 Subject: [PATCH] Visible activity can be an ime target While an activity is still visible, it is still an ime target even if it is going away. This fixes the problem with shell transitions where IME is detached from the live tile while entering recents. During recents, the the recents activity is on-top but has canBeImeTarget() -> false. The IME code then searches for the next-highest ImeTarget candidate. Since the live-tile activity is still visible, it should be the next candidate. Bug: 193565597 Test: open app and open IME. Go to recents. IME should be attached to app atest WindowStateTests Change-Id: I197359e2c21da4c4f1dedaaa43fd1ca76a135ce8 --- services/core/java/com/android/server/wm/WindowState.java | 6 ++++-- .../wmtests/src/com/android/server/wm/WindowStateTests.java | 5 +++++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index f6729c552cc31..a55f66d72685f 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -2547,7 +2547,8 @@ class WindowState extends WindowContainer implements WindowManagerP if (DEBUG_INPUT_METHOD) { Slog.i(TAG_WM, "isVisibleRequestedOrAdding " + this + ": " - + isVisibleRequestedOrAdding()); + + isVisibleRequestedOrAdding() + " isVisible: " + (isVisible() + && mActivityRecord != null && mActivityRecord.isVisible())); if (!isVisibleRequestedOrAdding()) { Slog.i(TAG_WM, " mSurfaceController=" + mWinAnimator.mSurfaceController + " relayoutCalled=" + mRelayoutCalled @@ -2562,7 +2563,8 @@ class WindowState extends WindowContainer implements WindowManagerP } } } - return isVisibleRequestedOrAdding(); + return isVisibleRequestedOrAdding() + || (isVisible() && mActivityRecord != null && mActivityRecord.isVisible()); } private final class DeadWindowEventReceiver extends InputEventReceiver { diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java b/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java index ca2b4aebc736e..ec8ec2b319185 100644 --- a/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java @@ -252,6 +252,11 @@ public class WindowStateTests extends WindowTestsBase { assertFalse(appWindow.canBeImeTarget()); appWindow.mActivityRecord.setWindowingMode(initialMode); + // Verify that app window can still be IME target as long as it is visible (even if + // it is going to become invisible). + appWindow.mActivityRecord.mVisibleRequested = false; + assertTrue(appWindow.canBeImeTarget()); + // Make windows invisible appWindow.hide(false /* doAnimation */, false /* requestAnim */); imeWindow.hide(false /* doAnimation */, false /* requestAnim */);