summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/wm/DisplayContent.java4
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java26
2 files changed, 30 insertions, 0 deletions
diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java
index 8eb0046ff923..52651b9fd076 100644
--- a/services/core/java/com/android/server/wm/DisplayContent.java
+++ b/services/core/java/com/android/server/wm/DisplayContent.java
@@ -4140,6 +4140,10 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
final SurfaceControl.Transaction t = getPendingTransaction();
// Prepare IME screenshot for the target if it allows to attach into.
if (mInputMethodWindow != null && mInputMethodWindow.isVisible()) {
+ // Remove the obsoleted IME snapshot first in case the new snapshot happens to
+ // override the current one before the transition finish and the surface never be
+ // removed on the task.
+ removeImeSurfaceImmediately();
mImeScreenshot = new ImeScreenshot(
mWmService.mSurfaceControlFactory.apply(null), mImeLayeringTarget);
mImeScreenshot.attachAndShow(t);
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 91692676e216..eb85d0098d17 100644
--- a/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java
@@ -2050,6 +2050,32 @@ public class DisplayContentTests extends WindowTestsBase {
verify(mDisplayContent, never()).showImeScreenshot();
}
+ @UseTestDisplay(addWindows = {W_INPUT_METHOD})
+ @Test
+ public void testShowImeScreenshot_removeCurSnapshotBeforeCreateNext() {
+ final Task rootTask = createTask(mDisplayContent);
+ final Task task = createTaskInRootTask(rootTask, 0 /* userId */);
+ final ActivityRecord activity = createActivityRecord(mDisplayContent, task);
+ final WindowState win = createWindow(null, TYPE_BASE_APPLICATION, activity, "win");
+
+ mDisplayContent.setImeLayeringTarget(win);
+ mDisplayContent.setImeInputTarget(win);
+ spyOn(mDisplayContent);
+ spyOn(mDisplayContent.mInputMethodWindow);
+ doReturn(true).when(mDisplayContent.mInputMethodWindow).isVisible();
+ mDisplayContent.getInsetsStateController().getImeSourceProvider().setImeShowing(true);
+
+ // Verify when the timing of 2 showImeScreenshot invocations are very close, will first
+ // detach the current snapshot then create the next one.
+ mDisplayContent.showImeScreenshot();
+ DisplayContent.ImeScreenshot curSnapshot = mDisplayContent.mImeScreenshot;
+ spyOn(curSnapshot);
+ mDisplayContent.showImeScreenshot();
+ verify(curSnapshot).detach(any());
+ assertNotNull(mDisplayContent.mImeScreenshot);
+ assertNotEquals(curSnapshot, mDisplayContent.mImeScreenshot);
+ }
+
@Test
public void testRotateBounds_keepSamePhysicalPosition() {
final DisplayContent dc =