summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/wm/DisplayContent.java7
-rw-r--r--services/core/java/com/android/server/wm/RootDisplayArea.java4
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java15
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/DualDisplayAreaGroupPolicyTest.java35
4 files changed, 41 insertions, 20 deletions
diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java
index 6072a0678d4d..a9d33dc29467 100644
--- a/services/core/java/com/android/server/wm/DisplayContent.java
+++ b/services/core/java/com/android/server/wm/DisplayContent.java
@@ -3724,10 +3724,15 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
// config. (Only happens when the target window is in a different root DA)
if (target != null) {
RootDisplayArea targetRoot = target.getRootDisplayArea();
- if (targetRoot != null) {
+ if (targetRoot != null && targetRoot != mImeWindowsContainer.getRootDisplayArea()) {
// Reposition the IME container to the target root to get the correct bounds and
// config.
targetRoot.placeImeContainer(mImeWindowsContainer);
+ // Directly hide the IME window so it doesn't flash immediately after reparenting.
+ // InsetsController will make IME visible again before animating it.
+ if (mInputMethodWindow != null) {
+ mInputMethodWindow.hide(false /* doAnimation */, false /* requestAnim */);
+ }
}
}
// 2. Assign window layers based on the IME surface parent to make sure it is on top of the
diff --git a/services/core/java/com/android/server/wm/RootDisplayArea.java b/services/core/java/com/android/server/wm/RootDisplayArea.java
index 505af05ed642..cd20c8242d81 100644
--- a/services/core/java/com/android/server/wm/RootDisplayArea.java
+++ b/services/core/java/com/android/server/wm/RootDisplayArea.java
@@ -79,10 +79,6 @@ class RootDisplayArea extends DisplayArea<DisplayArea> {
*/
void placeImeContainer(DisplayArea.Tokens imeContainer) {
final RootDisplayArea previousRoot = imeContainer.getRootDisplayArea();
- if (previousRoot == this) {
- // No need to reparent if IME container is below the same root.
- return;
- }
List<Feature> features = mFeatures;
for (int i = 0; i < features.size(); i++) {
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 adf8fa461c06..24b4f65f65ff 100644
--- a/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java
@@ -330,21 +330,6 @@ public class DisplayContentTests extends WindowTestsBase {
assertEquals(startingWin, imeTarget);
}
- @UseTestDisplay(addAllCommonWindows = true)
- @Test
- public void testComputeImeTarget_placeImeToTheTargetRoot() {
- ActivityRecord activity = createActivityRecord(mDisplayContent);
-
- final WindowState startingWin = createWindow(null, TYPE_APPLICATION_STARTING, activity,
- "startingWin");
- startingWin.setHasSurface(true);
- assertTrue(startingWin.canBeImeTarget());
- DisplayArea.Tokens imeContainer = mDisplayContent.getImeContainer();
-
- WindowState imeTarget = mDisplayContent.computeImeTarget(true /* updateImeTarget */);
- verify(imeTarget.getRootDisplayArea()).placeImeContainer(imeContainer);
- }
-
@Test
public void testUpdateImeParent_forceUpdateRelativeLayer() {
final DisplayArea.Tokens imeContainer = mDisplayContent.getImeContainer();
diff --git a/services/tests/wmtests/src/com/android/server/wm/DualDisplayAreaGroupPolicyTest.java b/services/tests/wmtests/src/com/android/server/wm/DualDisplayAreaGroupPolicyTest.java
index e9c356d6c6c4..e9907c1fd1a5 100644
--- a/services/tests/wmtests/src/com/android/server/wm/DualDisplayAreaGroupPolicyTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/DualDisplayAreaGroupPolicyTest.java
@@ -311,6 +311,41 @@ public class DualDisplayAreaGroupPolicyTest extends WindowTestsBase {
}
@Test
+ public void testPlaceImeContainer_hidesImeWhenParentChanges() {
+ setupImeWindow();
+ final DisplayArea.Tokens imeContainer = mDisplay.getImeContainer();
+ final WindowToken imeToken = tokenOfType(TYPE_INPUT_METHOD);
+ final WindowState firstActivityWin =
+ createWindow(null /* parent */, TYPE_APPLICATION_STARTING, mFirstActivity,
+ "firstActivityWin");
+ spyOn(firstActivityWin);
+ final WindowState secondActivityWin =
+ createWindow(null /* parent */, TYPE_APPLICATION_STARTING, mSecondActivity,
+ "secondActivityWin");
+ spyOn(secondActivityWin);
+
+ // firstActivityWin should be the target
+ doReturn(true).when(firstActivityWin).canBeImeTarget();
+ doReturn(false).when(secondActivityWin).canBeImeTarget();
+
+ WindowState imeTarget = mDisplay.computeImeTarget(true /* updateImeTarget */);
+ assertThat(imeTarget).isEqualTo(firstActivityWin);
+ verify(mFirstRoot).placeImeContainer(imeContainer);
+
+ // secondActivityWin should be the target
+ doReturn(false).when(firstActivityWin).canBeImeTarget();
+ doReturn(true).when(secondActivityWin).canBeImeTarget();
+
+ spyOn(mDisplay.mInputMethodWindow);
+ imeTarget = mDisplay.computeImeTarget(true /* updateImeTarget */);
+
+ assertThat(imeTarget).isEqualTo(secondActivityWin);
+ verify(mSecondRoot).placeImeContainer(imeContainer);
+ // verify hide() was called on InputMethodWindow.
+ verify(mDisplay.mInputMethodWindow).hide(false /* doAnimation */, false /* requestAnim */);
+ }
+
+ @Test
public void testResizableFixedOrientationApp_fixedOrientationLetterboxing() {
mFirstRoot.setIgnoreOrientationRequest(false /* ignoreOrientationRequest */);
mSecondRoot.setIgnoreOrientationRequest(false /* ignoreOrientationRequest */);