From 3855d347a2f4d5a9eb3082f3e44fec514e462a41 Mon Sep 17 00:00:00 2001 From: Ming-Shin Lu Date: Fri, 4 Nov 2022 16:30:58 +0000 Subject: [PATCH] Fix launcher animates keyboard by wrong insets visible value Remove ActivityRecord#mLastImeShown in InsetsPolicy#adjustVisibilityForIme. In case when the launcher has requested to hide keyboard when launching the next app, after backing to launcher from the app, the launcher still took the wrong IME visiblity from WindowInsetsController#isVisible(ime()) to show the keyboard again. Fix: 254624767 Test: atest WindowStateTests Test: atest KeyboardVisibilityControlTest Test: manual as steps: 1) Enable 3-button navigations 2) enable 'Always show keyboard' on home settings 3) Go to all-apps, open an app while the keyboard is visible 4) Close the app with the central button of 3-button navigation 5) Expect the keyboard won't be shown after backing to home Change-Id: I3c9e3573454b26bc5f8e4cda90f9dc45eadae74c --- services/core/java/com/android/server/wm/InsetsPolicy.java | 3 +-- .../wmtests/src/com/android/server/wm/WindowStateTests.java | 3 +++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/services/core/java/com/android/server/wm/InsetsPolicy.java b/services/core/java/com/android/server/wm/InsetsPolicy.java index 7e56dbf5602b7..0d7eb65f2b0a3 100644 --- a/services/core/java/com/android/server/wm/InsetsPolicy.java +++ b/services/core/java/com/android/server/wm/InsetsPolicy.java @@ -438,8 +438,7 @@ class InsetsPolicy { final InsetsSource originalImeSource = originalState.peekSource(ITYPE_IME); if (originalImeSource != null) { - final boolean imeVisibility = - w.mActivityRecord.mLastImeShown || w.isRequestedVisible(Type.ime()); + final boolean imeVisibility = w.isRequestedVisible(Type.ime()); final InsetsState state = copyState ? new InsetsState(originalState) : originalState; final InsetsSource imeSource = new InsetsSource(originalImeSource); 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 0139f6a5695af..c0a2131d6c539 100644 --- a/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java @@ -26,6 +26,7 @@ import static android.view.InsetsState.ITYPE_STATUS_BAR; import static android.view.Surface.ROTATION_0; import static android.view.Surface.ROTATION_270; import static android.view.Surface.ROTATION_90; +import static android.view.WindowInsets.Type.ime; import static android.view.WindowInsets.Type.statusBars; import static android.view.WindowManager.LayoutParams.FIRST_SUB_WINDOW; import static android.view.WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM; @@ -999,6 +1000,7 @@ public class WindowStateTests extends WindowTestsBase { // Simulate app requests IME with updating all windows Insets State when IME is above app. mDisplayContent.setImeLayeringTarget(app); mDisplayContent.setImeInputTarget(app); + app.setRequestedVisibleTypes(ime(), ime()); assertTrue(mDisplayContent.shouldImeAttachedToApp()); controller.getImeSourceProvider().scheduleShowImePostLayout(app); controller.getImeSourceProvider().getSource().setVisible(true); @@ -1036,6 +1038,7 @@ public class WindowStateTests extends WindowTestsBase { app2.mActivityRecord.mImeInsetsFrozenUntilStartInput = true; mDisplayContent.setImeLayeringTarget(app); mDisplayContent.setImeInputTarget(app); + app.setRequestedVisibleTypes(ime(), ime()); assertTrue(mDisplayContent.shouldImeAttachedToApp()); controller.getImeSourceProvider().scheduleShowImePostLayout(app); controller.getImeSourceProvider().getSource().setVisible(true);