From a210826fe5577d9501da413f569253e6fc9979d8 Mon Sep 17 00:00:00 2001 From: Wilson Wu Date: Tue, 22 Nov 2022 21:06:05 +0800 Subject: [PATCH] Fix IME not shown from recents to split-screen task DislplayImeController only update the ImeSurfaceControl for a non-null control. So it still keep a stale control even the control has lost. The ImeSurfaceControl should be updated to avoid using a stale control to start animation. Bug: 258814082 Test: Manual test with bug steps Test: atest DisplayImeControllerTest Change-Id: Id7ac6de6a9e8e5f0e620254c39d104272175b3a1 --- .../wm/shell/common/DisplayImeController.java | 2 +- .../shell/common/DisplayImeControllerTest.java | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayImeController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayImeController.java index d9b4f475a50cd..4edc64266ccab 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayImeController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayImeController.java @@ -295,8 +295,8 @@ public class DisplayImeController implements DisplayController.OnDisplaysChanged mImeSourceControl.release(SurfaceControl::release); } } - mImeSourceControl = imeSourceControl; } + mImeSourceControl = imeSourceControl; } private void applyVisibilityToLeash(InsetsSourceControl imeSourceControl) { diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/common/DisplayImeControllerTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/common/DisplayImeControllerTest.java index 40f2e88f34fdb..86415419418a7 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/common/DisplayImeControllerTest.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/common/DisplayImeControllerTest.java @@ -21,7 +21,9 @@ import static android.view.InsetsState.ITYPE_IME; import static android.view.Surface.ROTATION_0; import static android.view.WindowInsets.Type.ime; +import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.mock; @@ -89,6 +91,22 @@ public class DisplayImeControllerTest extends ShellTestCase { verifyZeroInteractions(mExecutor); } + @Test + public void insetsControlChanged_updateExpectedImeSourceControl() { + final InsetsSourceControl[] insetsSourceControls = new InsetsSourceControl[]{ + new InsetsSourceControl(ITYPE_IME, mock(SurfaceControl.class), false, + new Point(0, 0), Insets.NONE)}; + final InsetsSourceControl imeSourceControl = insetsSourceControls[0]; + + mPerDisplay.insetsControlChanged(insetsStateWithIme(false), insetsSourceControls); + + assertEquals(imeSourceControl, mPerDisplay.mImeSourceControl); + + mPerDisplay.insetsControlChanged(insetsStateWithIme(false), null); + + assertNull(mPerDisplay.mImeSourceControl); + } + @Test public void insetsChanged_schedulesNoWorkOnExecutor() { mPerDisplay.insetsChanged(insetsStateWithIme(false));