diff --git a/services/core/java/com/android/server/wm/DisplayArea.java b/services/core/java/com/android/server/wm/DisplayArea.java index a4ac16f2ec777..cd3f322781659 100644 --- a/services/core/java/com/android/server/wm/DisplayArea.java +++ b/services/core/java/com/android/server/wm/DisplayArea.java @@ -307,6 +307,11 @@ public class DisplayArea extends WindowContainer { return this; } + /** Cheap way of doing cast and instanceof. */ + DisplayArea.Tokens asTokens() { + return null; + } + @Override void forAllDisplayAreas(Consumer callback) { super.forAllDisplayAreas(callback); @@ -544,6 +549,11 @@ public class DisplayArea extends WindowContainer { mLastOrientationSource = win; return req; } + + @Override + final DisplayArea.Tokens asTokens() { + return this; + } } @Override diff --git a/services/core/java/com/android/server/wm/DisplayAreaPolicy.java b/services/core/java/com/android/server/wm/DisplayAreaPolicy.java index 211bd5d9eb77d..7573e92e82a84 100644 --- a/services/core/java/com/android/server/wm/DisplayAreaPolicy.java +++ b/services/core/java/com/android/server/wm/DisplayAreaPolicy.java @@ -86,7 +86,7 @@ public abstract class DisplayAreaPolicy { @Override public DisplayAreaPolicy instantiate(WindowManagerService wmService, DisplayContent content, RootDisplayArea root, - DisplayArea imeContainer) { + DisplayArea.Tokens imeContainer) { final TaskDisplayArea defaultTaskDisplayArea = new TaskDisplayArea(content, wmService, "DefaultTaskDisplayArea", FEATURE_DEFAULT_TASK_CONTAINER); final List tdaList = new ArrayList<>(); @@ -151,7 +151,7 @@ public abstract class DisplayAreaPolicy { * @see DisplayAreaPolicy#DisplayAreaPolicy */ DisplayAreaPolicy instantiate(WindowManagerService wmService, DisplayContent content, - RootDisplayArea root, DisplayArea imeContainer); + RootDisplayArea root, DisplayArea.Tokens imeContainer); /** * Instantiates the device-specific {@link Provider}. diff --git a/services/core/java/com/android/server/wm/DisplayAreaPolicyBuilder.java b/services/core/java/com/android/server/wm/DisplayAreaPolicyBuilder.java index 6a420874b924e..bc3220673ed39 100644 --- a/services/core/java/com/android/server/wm/DisplayAreaPolicyBuilder.java +++ b/services/core/java/com/android/server/wm/DisplayAreaPolicyBuilder.java @@ -247,7 +247,7 @@ class DisplayAreaPolicyBuilder { private final ArrayList mFeatures = new ArrayList<>(); private final ArrayList mTaskDisplayAreas = new ArrayList<>(); @Nullable - private DisplayArea mImeContainer; + private DisplayArea.Tokens mImeContainer; HierarchyBuilder(RootDisplayArea root) { mRoot = root; @@ -270,7 +270,7 @@ class DisplayAreaPolicyBuilder { } /** Sets IME container as a child of this hierarchy root. */ - HierarchyBuilder setImeContainer(DisplayArea imeContainer) { + HierarchyBuilder setImeContainer(DisplayArea.Tokens imeContainer) { mImeContainer = imeContainer; return this; } @@ -706,6 +706,10 @@ class DisplayAreaPolicyBuilder { private DisplayArea createArea(DisplayArea parent, DisplayArea.Tokens[] areaForLayer) { if (mExisting != null) { + if (mExisting.asTokens() != null) { + // Store the WindowToken container for layers + fillAreaForLayers(mExisting.asTokens(), areaForLayer); + } return mExisting; } if (mSkipTokens) { @@ -722,14 +726,18 @@ class DisplayAreaPolicyBuilder { if (mFeature == null) { final DisplayArea.Tokens leaf = new DisplayArea.Tokens(parent.mWmService, type, "Leaf:" + mMinLayer + ":" + mMaxLayer); - for (int i = mMinLayer; i <= mMaxLayer; i++) { - areaForLayer[i] = leaf; - } + fillAreaForLayers(leaf, areaForLayer); return leaf; } else { return mFeature.mNewDisplayAreaSupplier.create(parent.mWmService, type, mFeature.mName + ":" + mMinLayer + ":" + mMaxLayer, mFeature.mId); } } + + private void fillAreaForLayers(DisplayArea.Tokens leaf, DisplayArea.Tokens[] areaForLayer) { + for (int i = mMinLayer; i <= mMaxLayer; i++) { + areaForLayer[i] = leaf; + } + } } } diff --git a/services/core/java/com/android/server/wm/RootDisplayArea.java b/services/core/java/com/android/server/wm/RootDisplayArea.java index da04f438a496b..c4fcea68a6fc4 100644 --- a/services/core/java/com/android/server/wm/RootDisplayArea.java +++ b/services/core/java/com/android/server/wm/RootDisplayArea.java @@ -16,11 +16,17 @@ package com.android.server.wm; +import static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD; +import static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD_DIALOG; import static android.view.WindowManagerPolicyConstants.APPLICATION_LAYER; import static android.window.DisplayAreaOrganizer.FEATURE_IME_PLACEHOLDER; import static com.android.server.wm.DisplayAreaPolicyBuilder.Feature; +import android.annotation.Nullable; + +import com.android.server.policy.WindowManagerPolicy; + import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -72,7 +78,8 @@ class RootDisplayArea extends DisplayArea { * match the root. */ void placeImeContainer(DisplayArea.Tokens imeContainer) { - if (imeContainer.getRootDisplayArea() == this) { + final RootDisplayArea previousRoot = imeContainer.getRootDisplayArea(); + if (previousRoot == this) { // No need to reparent if IME container is below the same root. return; } @@ -88,7 +95,9 @@ class RootDisplayArea extends DisplayArea { + "FEATURE_IME_PLACEHOLDER"); } + previousRoot.updateImeContainerForLayers(null /* imeContainer */); imeContainer.reparent(imeDisplayAreas.get(0), POSITION_TOP); + updateImeContainerForLayers(imeContainer); return; } } @@ -119,4 +128,10 @@ class RootDisplayArea extends DisplayArea { mAreaForLayer = areaForLayer; mFeatureToDisplayAreas = featureToDisplayAreas; } + + private void updateImeContainerForLayers(@Nullable DisplayArea.Tokens imeContainer) { + final WindowManagerPolicy policy = mWmService.mPolicy; + mAreaForLayer[policy.getWindowLayerFromTypeLw(TYPE_INPUT_METHOD)] = imeContainer; + mAreaForLayer[policy.getWindowLayerFromTypeLw(TYPE_INPUT_METHOD_DIALOG)] = imeContainer; + } } diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayAreaPolicyBuilderTest.java b/services/tests/wmtests/src/com/android/server/wm/DisplayAreaPolicyBuilderTest.java index 8e6b6fab19eb0..266ce5ba0e686 100644 --- a/services/tests/wmtests/src/com/android/server/wm/DisplayAreaPolicyBuilderTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/DisplayAreaPolicyBuilderTest.java @@ -20,6 +20,7 @@ import static android.os.Process.INVALID_UID; import static android.view.WindowManager.LayoutParams.TYPE_ACCESSIBILITY_MAGNIFICATION_OVERLAY; import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY; import static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD; +import static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD_DIALOG; import static android.view.WindowManager.LayoutParams.TYPE_NAVIGATION_BAR; import static android.view.WindowManager.LayoutParams.TYPE_PRESENTATION; import static android.view.WindowManager.LayoutParams.TYPE_STATUS_BAR; @@ -82,7 +83,7 @@ public class DisplayAreaPolicyBuilderTest { private TestWindowManagerPolicy mPolicy = new TestWindowManagerPolicy(null, null); private WindowManagerService mWms; private RootDisplayArea mRoot; - private DisplayArea mImeContainer; + private DisplayArea.Tokens mImeContainer; private DisplayContent mDisplayContent; private TaskDisplayArea mDefaultTaskDisplayArea; private List mTaskDisplayAreaList; @@ -95,7 +96,7 @@ public class DisplayAreaPolicyBuilderTest { public void setup() { mWms = mSystemServices.getWindowManagerService(); mRoot = new SurfacelessDisplayAreaRoot(mWms); - mImeContainer = new DisplayArea<>(mWms, ABOVE_TASKS, "Ime"); + mImeContainer = new DisplayArea.Tokens(mWms, ABOVE_TASKS, "ImeContainer"); mDisplayContent = mock(DisplayContent.class); mDefaultTaskDisplayArea = new TaskDisplayArea(mDisplayContent, mWms, "Tasks", FEATURE_DEFAULT_TASK_CONTAINER); @@ -148,6 +149,10 @@ public class DisplayAreaPolicyBuilderTest { // The IME is below both foo and bar. assertThat(fooDescendantMatcher.matches(mImeContainer)).isTrue(); assertThat(barDescendantMatcher.matches(mImeContainer)).isTrue(); + assertThat(policy.findAreaForToken(tokenOfType(TYPE_INPUT_METHOD))) + .isEqualTo(mImeContainer); + assertThat(policy.findAreaForToken(tokenOfType(TYPE_INPUT_METHOD_DIALOG))) + .isEqualTo(mImeContainer); List> actualOrder = collectLeafAreas(mRoot); Map, Set> zSets = calculateZSets(policy, mImeContainer, @@ -547,7 +552,7 @@ public class DisplayAreaPolicyBuilderTest { private Map, Set> calculateZSets( DisplayAreaPolicyBuilder.Result policy, - DisplayArea ime, + DisplayArea.Tokens ime, DisplayArea tasks) { Map, Set> zSets = new HashMap<>(); int[] types = {TYPE_STATUS_BAR, TYPE_NAVIGATION_BAR, TYPE_PRESENTATION, diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayAreaPolicyTests.java b/services/tests/wmtests/src/com/android/server/wm/DisplayAreaPolicyTests.java index 5a47493c12cd5..496b2b7447121 100644 --- a/services/tests/wmtests/src/com/android/server/wm/DisplayAreaPolicyTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/DisplayAreaPolicyTests.java @@ -69,7 +69,7 @@ public class DisplayAreaPolicyTests { WindowManagerService wms = mSystemServices.getWindowManagerService(); mRoot = new SurfacelessDisplayAreaRoot(wms); spyOn(mRoot); - DisplayArea ime = new DisplayArea<>(wms, ABOVE_TASKS, "Ime"); + DisplayArea.Tokens ime = new DisplayArea.Tokens(wms, ABOVE_TASKS, "Ime"); DisplayContent displayContent = mock(DisplayContent.class); doReturn(true).when(displayContent).isTrusted(); mTaskDisplayArea1 = new TaskDisplayArea(displayContent, wms, "Tasks1", @@ -143,7 +143,7 @@ public class DisplayAreaPolicyTests { FEATURE_VENDOR_FIRST + 5); final TaskDisplayArea taskDisplayArea5 = new TaskDisplayArea(displayContent, wms, "Tasks5", FEATURE_VENDOR_FIRST + 6); - final DisplayArea ime = new DisplayArea<>(wms, ABOVE_TASKS, "Ime"); + final DisplayArea.Tokens ime = new DisplayArea.Tokens(wms, ABOVE_TASKS, "Ime"); final DisplayAreaPolicy policy = new DisplayAreaPolicyBuilder() .setRootHierarchy(new DisplayAreaPolicyBuilder.HierarchyBuilder(root) .setImeContainer(ime) diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayAreaProviderTest.java b/services/tests/wmtests/src/com/android/server/wm/DisplayAreaProviderTest.java index 351426ae78b2e..2d289808dd266 100644 --- a/services/tests/wmtests/src/com/android/server/wm/DisplayAreaProviderTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/DisplayAreaProviderTest.java @@ -81,7 +81,7 @@ public class DisplayAreaProviderTest { @Override public DisplayAreaPolicy instantiate(WindowManagerService wmService, DisplayContent content, - RootDisplayArea root, DisplayArea imeContainer) { + RootDisplayArea root, DisplayArea.Tokens imeContainer) { throw new RuntimeException("test stub"); } }