diff options
| author | 2023-05-08 16:02:09 +0000 | |
|---|---|---|
| committer | 2023-05-08 16:02:09 +0000 | |
| commit | 392226b61e33c6cf85eda51a4e7bb1322f2dab84 (patch) | |
| tree | 2f5f42becb8e32f2a22a591cff43ddb8ab973882 | |
| parent | 957410032e8f8e226cfdba8cf4abfcb415a0e7bc (diff) | |
Fix unexpected starting window removal timeout when in fixed-rotation
Not aware in DC#mayImeShowOnLaunchingActivity has an issue that
it uses findMainWindow() to check its softInputMode visiblity state
but always got 0 because the returned main window is the starting window
vs. the app's base application window, which is not expected.
This problematic logic leads to when CL[1] merged, the starting window
removal mode and timout always set to DEFER_MODE_ROTATION (3 secs)
vs. DEFER_MODE_NONE (100ms) if the warm launching activity's softInputMode
is hidden during fixed-rotation.
Ensure finding the main window with excluding the starting window in
DC#mayImeShowOnLaunchingActivity to fix this case.
[1]: Ie476e89a57f2f64d4d66e722fedeeb1719d9de55
Bug: 268627602
Test: atest FlickerTests:\
ShowImeOnAppStartWhenLaunchingAppFromFixedOrientationTest
Test: atest DisplayContentTests#\
testMayImeShowOnLaunchingActivity_negativeWhenSoftInputModeHidden
Change-Id: I3fa33daf20734b673fd89328dca6a8fd432f2969
| -rw-r--r-- | services/core/java/com/android/server/wm/DisplayContent.java | 2 | ||||
| -rw-r--r-- | services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java | 22 |
2 files changed, 23 insertions, 1 deletions
diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index 57812c1d604c..fa5da306d5f5 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -1884,7 +1884,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp /** Returns {@code true} if the IME is possible to show on the launching activity. */ boolean mayImeShowOnLaunchingActivity(@NonNull ActivityRecord r) { - final WindowState win = r.findMainWindow(); + final WindowState win = r.findMainWindow(false /* exclude starting window */); if (win == null) { 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 7330411d1dd7..340b591e4086 100644 --- a/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java @@ -53,6 +53,8 @@ import static android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_M import static android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES; import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_NO_MOVE_ANIMATION; import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_UNRESTRICTED_GESTURE_EXCLUSION; +import static android.view.WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN; +import static android.view.WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN; import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION; import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_ATTACHED_DIALOG; import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY; @@ -2827,6 +2829,26 @@ public class DisplayContentTests extends WindowTestsBase { mDisplayContent.getKeepClearAreas()); } + @Test + public void testMayImeShowOnLaunchingActivity_negativeWhenSoftInputModeHidden() { + final ActivityRecord app = createActivityRecord(mDisplayContent); + final WindowState appWin = createWindow(null, TYPE_BASE_APPLICATION, app, "appWin"); + createWindow(null, TYPE_APPLICATION_STARTING, app, "startingWin"); + app.mStartingData = mock(SnapshotStartingData.class); + // Assume the app has shown IME before and warm launching with a snapshot window. + doReturn(true).when(app.mStartingData).hasImeSurface(); + + // Expect true when this IME focusable activity will show IME during launching. + assertTrue(WindowManager.LayoutParams.mayUseInputMethod(appWin.mAttrs.flags)); + assertTrue(mDisplayContent.mayImeShowOnLaunchingActivity(app)); + + // Not expect IME will be shown during launching if the app's softInputMode is hidden. + appWin.mAttrs.softInputMode = SOFT_INPUT_STATE_ALWAYS_HIDDEN; + assertFalse(mDisplayContent.mayImeShowOnLaunchingActivity(app)); + appWin.mAttrs.softInputMode = SOFT_INPUT_STATE_HIDDEN; + assertFalse(mDisplayContent.mayImeShowOnLaunchingActivity(app)); + } + private void removeRootTaskTests(Runnable runnable) { final TaskDisplayArea taskDisplayArea = mRootWindowContainer.getDefaultTaskDisplayArea(); final Task rootTask1 = taskDisplayArea.createRootTask(WINDOWING_MODE_FULLSCREEN, |