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
This commit is contained in:
Wilson Wu
2022-11-22 21:06:05 +08:00
parent 2d776741bc
commit a210826fe5
2 changed files with 19 additions and 1 deletions

View File

@@ -295,8 +295,8 @@ public class DisplayImeController implements DisplayController.OnDisplaysChanged
mImeSourceControl.release(SurfaceControl::release);
}
}
mImeSourceControl = imeSourceControl;
}
mImeSourceControl = imeSourceControl;
}
private void applyVisibilityToLeash(InsetsSourceControl imeSourceControl) {

View File

@@ -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));