Merge "Hide IME after re-parenting IME container to DisplayArea" into sc-dev
This commit is contained in:
@@ -3724,10 +3724,15 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
|
|||||||
// config. (Only happens when the target window is in a different root DA)
|
// config. (Only happens when the target window is in a different root DA)
|
||||||
if (target != null) {
|
if (target != null) {
|
||||||
RootDisplayArea targetRoot = target.getRootDisplayArea();
|
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
|
// Reposition the IME container to the target root to get the correct bounds and
|
||||||
// config.
|
// config.
|
||||||
targetRoot.placeImeContainer(mImeWindowsContainer);
|
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
|
// 2. Assign window layers based on the IME surface parent to make sure it is on top of the
|
||||||
|
|||||||
@@ -79,10 +79,6 @@ class RootDisplayArea extends DisplayArea<DisplayArea> {
|
|||||||
*/
|
*/
|
||||||
void placeImeContainer(DisplayArea.Tokens imeContainer) {
|
void placeImeContainer(DisplayArea.Tokens imeContainer) {
|
||||||
final RootDisplayArea previousRoot = imeContainer.getRootDisplayArea();
|
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;
|
List<Feature> features = mFeatures;
|
||||||
for (int i = 0; i < features.size(); i++) {
|
for (int i = 0; i < features.size(); i++) {
|
||||||
|
|||||||
@@ -330,21 +330,6 @@ public class DisplayContentTests extends WindowTestsBase {
|
|||||||
assertEquals(startingWin, imeTarget);
|
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
|
@Test
|
||||||
public void testUpdateImeParent_forceUpdateRelativeLayer() {
|
public void testUpdateImeParent_forceUpdateRelativeLayer() {
|
||||||
final DisplayArea.Tokens imeContainer = mDisplayContent.getImeContainer();
|
final DisplayArea.Tokens imeContainer = mDisplayContent.getImeContainer();
|
||||||
|
|||||||
@@ -310,6 +310,41 @@ public class DualDisplayAreaGroupPolicyTest extends WindowTestsBase {
|
|||||||
assertThat(mSecondRoot.findAreaForToken(imeToken)).isEqualTo(imeContainer);
|
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
|
@Test
|
||||||
public void testResizableFixedOrientationApp_fixedOrientationLetterboxing() {
|
public void testResizableFixedOrientationApp_fixedOrientationLetterboxing() {
|
||||||
mFirstRoot.setIgnoreOrientationRequest(false /* ignoreOrientationRequest */);
|
mFirstRoot.setIgnoreOrientationRequest(false /* ignoreOrientationRequest */);
|
||||||
|
|||||||
Reference in New Issue
Block a user