Loading services/core/java/com/android/server/wm/DisplayContent.java +6 −1 Original line number Diff line number Diff line Loading @@ -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 Loading services/core/java/com/android/server/wm/RootDisplayArea.java +0 −4 Original line number Diff line number Diff line Loading @@ -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++) { Loading services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java +0 −15 Original line number Diff line number Diff line Loading @@ -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(); Loading services/tests/wmtests/src/com/android/server/wm/DualDisplayAreaGroupPolicyTest.java +35 −0 Original line number Diff line number Diff line Loading @@ -310,6 +310,41 @@ public class DualDisplayAreaGroupPolicyTest extends WindowTestsBase { assertThat(mSecondRoot.findAreaForToken(imeToken)).isEqualTo(imeContainer); } @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 */); Loading Loading
services/core/java/com/android/server/wm/DisplayContent.java +6 −1 Original line number Diff line number Diff line Loading @@ -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 Loading
services/core/java/com/android/server/wm/RootDisplayArea.java +0 −4 Original line number Diff line number Diff line Loading @@ -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++) { Loading
services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java +0 −15 Original line number Diff line number Diff line Loading @@ -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(); Loading
services/tests/wmtests/src/com/android/server/wm/DualDisplayAreaGroupPolicyTest.java +35 −0 Original line number Diff line number Diff line Loading @@ -310,6 +310,41 @@ public class DualDisplayAreaGroupPolicyTest extends WindowTestsBase { assertThat(mSecondRoot.findAreaForToken(imeToken)).isEqualTo(imeContainer); } @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 */); Loading