summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Ming-Shin Lu <lumark@google.com> 2023-05-08 16:02:09 +0000
committer Ming-Shin Lu <lumark@google.com> 2023-05-08 16:02:09 +0000
commit392226b61e33c6cf85eda51a4e7bb1322f2dab84 (patch)
tree2f5f42becb8e32f2a22a591cff43ddb8ab973882
parent957410032e8f8e226cfdba8cf4abfcb415a0e7bc (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.java2
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java22
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,