Loading services/core/java/com/android/server/wm/DisplayArea.java +10 −0 Original line number Diff line number Diff line Loading @@ -307,6 +307,11 @@ public class DisplayArea<T extends WindowContainer> extends WindowContainer<T> { return this; } /** Cheap way of doing cast and instanceof. */ DisplayArea.Tokens asTokens() { return null; } @Override void forAllDisplayAreas(Consumer<DisplayArea> callback) { super.forAllDisplayAreas(callback); Loading Loading @@ -544,6 +549,11 @@ public class DisplayArea<T extends WindowContainer> extends WindowContainer<T> { mLastOrientationSource = win; return req; } @Override final DisplayArea.Tokens asTokens() { return this; } } @Override Loading services/core/java/com/android/server/wm/DisplayAreaPolicy.java +2 −2 Original line number Diff line number Diff line Loading @@ -86,7 +86,7 @@ public abstract class DisplayAreaPolicy { @Override public DisplayAreaPolicy instantiate(WindowManagerService wmService, DisplayContent content, RootDisplayArea root, DisplayArea<? extends WindowContainer> imeContainer) { DisplayArea.Tokens imeContainer) { final TaskDisplayArea defaultTaskDisplayArea = new TaskDisplayArea(content, wmService, "DefaultTaskDisplayArea", FEATURE_DEFAULT_TASK_CONTAINER); final List<TaskDisplayArea> tdaList = new ArrayList<>(); Loading Loading @@ -151,7 +151,7 @@ public abstract class DisplayAreaPolicy { * @see DisplayAreaPolicy#DisplayAreaPolicy */ DisplayAreaPolicy instantiate(WindowManagerService wmService, DisplayContent content, RootDisplayArea root, DisplayArea<? extends WindowContainer> imeContainer); RootDisplayArea root, DisplayArea.Tokens imeContainer); /** * Instantiates the device-specific {@link Provider}. Loading services/core/java/com/android/server/wm/DisplayAreaPolicyBuilder.java +13 −5 Original line number Diff line number Diff line Loading @@ -247,7 +247,7 @@ class DisplayAreaPolicyBuilder { private final ArrayList<DisplayAreaPolicyBuilder.Feature> mFeatures = new ArrayList<>(); private final ArrayList<TaskDisplayArea> mTaskDisplayAreas = new ArrayList<>(); @Nullable private DisplayArea<? extends WindowContainer> mImeContainer; private DisplayArea.Tokens mImeContainer; HierarchyBuilder(RootDisplayArea root) { mRoot = root; Loading @@ -270,7 +270,7 @@ class DisplayAreaPolicyBuilder { } /** Sets IME container as a child of this hierarchy root. */ HierarchyBuilder setImeContainer(DisplayArea<? extends WindowContainer> imeContainer) { HierarchyBuilder setImeContainer(DisplayArea.Tokens imeContainer) { mImeContainer = imeContainer; return this; } Loading Loading @@ -706,6 +706,10 @@ class DisplayAreaPolicyBuilder { private DisplayArea createArea(DisplayArea<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) { Loading @@ -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; } } } } services/core/java/com/android/server/wm/RootDisplayArea.java +16 −1 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -72,7 +78,8 @@ class RootDisplayArea extends DisplayArea<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; } Loading @@ -88,7 +95,9 @@ class RootDisplayArea extends DisplayArea<DisplayArea> { + "FEATURE_IME_PLACEHOLDER"); } previousRoot.updateImeContainerForLayers(null /* imeContainer */); imeContainer.reparent(imeDisplayAreas.get(0), POSITION_TOP); updateImeContainerForLayers(imeContainer); return; } } Loading Loading @@ -119,4 +128,10 @@ class RootDisplayArea extends DisplayArea<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; } } services/tests/wmtests/src/com/android/server/wm/DisplayAreaPolicyBuilderTest.java +8 −3 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -82,7 +83,7 @@ public class DisplayAreaPolicyBuilderTest { private TestWindowManagerPolicy mPolicy = new TestWindowManagerPolicy(null, null); private WindowManagerService mWms; private RootDisplayArea mRoot; private DisplayArea<WindowContainer> mImeContainer; private DisplayArea.Tokens mImeContainer; private DisplayContent mDisplayContent; private TaskDisplayArea mDefaultTaskDisplayArea; private List<TaskDisplayArea> mTaskDisplayAreaList; Loading @@ -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); Loading Loading @@ -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<DisplayArea<?>> actualOrder = collectLeafAreas(mRoot); Map<DisplayArea<?>, Set<Integer>> zSets = calculateZSets(policy, mImeContainer, Loading Loading @@ -547,7 +552,7 @@ public class DisplayAreaPolicyBuilderTest { private Map<DisplayArea<?>, Set<Integer>> calculateZSets( DisplayAreaPolicyBuilder.Result policy, DisplayArea<WindowContainer> ime, DisplayArea.Tokens ime, DisplayArea<Task> tasks) { Map<DisplayArea<?>, Set<Integer>> zSets = new HashMap<>(); int[] types = {TYPE_STATUS_BAR, TYPE_NAVIGATION_BAR, TYPE_PRESENTATION, Loading Loading
services/core/java/com/android/server/wm/DisplayArea.java +10 −0 Original line number Diff line number Diff line Loading @@ -307,6 +307,11 @@ public class DisplayArea<T extends WindowContainer> extends WindowContainer<T> { return this; } /** Cheap way of doing cast and instanceof. */ DisplayArea.Tokens asTokens() { return null; } @Override void forAllDisplayAreas(Consumer<DisplayArea> callback) { super.forAllDisplayAreas(callback); Loading Loading @@ -544,6 +549,11 @@ public class DisplayArea<T extends WindowContainer> extends WindowContainer<T> { mLastOrientationSource = win; return req; } @Override final DisplayArea.Tokens asTokens() { return this; } } @Override Loading
services/core/java/com/android/server/wm/DisplayAreaPolicy.java +2 −2 Original line number Diff line number Diff line Loading @@ -86,7 +86,7 @@ public abstract class DisplayAreaPolicy { @Override public DisplayAreaPolicy instantiate(WindowManagerService wmService, DisplayContent content, RootDisplayArea root, DisplayArea<? extends WindowContainer> imeContainer) { DisplayArea.Tokens imeContainer) { final TaskDisplayArea defaultTaskDisplayArea = new TaskDisplayArea(content, wmService, "DefaultTaskDisplayArea", FEATURE_DEFAULT_TASK_CONTAINER); final List<TaskDisplayArea> tdaList = new ArrayList<>(); Loading Loading @@ -151,7 +151,7 @@ public abstract class DisplayAreaPolicy { * @see DisplayAreaPolicy#DisplayAreaPolicy */ DisplayAreaPolicy instantiate(WindowManagerService wmService, DisplayContent content, RootDisplayArea root, DisplayArea<? extends WindowContainer> imeContainer); RootDisplayArea root, DisplayArea.Tokens imeContainer); /** * Instantiates the device-specific {@link Provider}. Loading
services/core/java/com/android/server/wm/DisplayAreaPolicyBuilder.java +13 −5 Original line number Diff line number Diff line Loading @@ -247,7 +247,7 @@ class DisplayAreaPolicyBuilder { private final ArrayList<DisplayAreaPolicyBuilder.Feature> mFeatures = new ArrayList<>(); private final ArrayList<TaskDisplayArea> mTaskDisplayAreas = new ArrayList<>(); @Nullable private DisplayArea<? extends WindowContainer> mImeContainer; private DisplayArea.Tokens mImeContainer; HierarchyBuilder(RootDisplayArea root) { mRoot = root; Loading @@ -270,7 +270,7 @@ class DisplayAreaPolicyBuilder { } /** Sets IME container as a child of this hierarchy root. */ HierarchyBuilder setImeContainer(DisplayArea<? extends WindowContainer> imeContainer) { HierarchyBuilder setImeContainer(DisplayArea.Tokens imeContainer) { mImeContainer = imeContainer; return this; } Loading Loading @@ -706,6 +706,10 @@ class DisplayAreaPolicyBuilder { private DisplayArea createArea(DisplayArea<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) { Loading @@ -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; } } } }
services/core/java/com/android/server/wm/RootDisplayArea.java +16 −1 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -72,7 +78,8 @@ class RootDisplayArea extends DisplayArea<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; } Loading @@ -88,7 +95,9 @@ class RootDisplayArea extends DisplayArea<DisplayArea> { + "FEATURE_IME_PLACEHOLDER"); } previousRoot.updateImeContainerForLayers(null /* imeContainer */); imeContainer.reparent(imeDisplayAreas.get(0), POSITION_TOP); updateImeContainerForLayers(imeContainer); return; } } Loading Loading @@ -119,4 +128,10 @@ class RootDisplayArea extends DisplayArea<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; } }
services/tests/wmtests/src/com/android/server/wm/DisplayAreaPolicyBuilderTest.java +8 −3 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -82,7 +83,7 @@ public class DisplayAreaPolicyBuilderTest { private TestWindowManagerPolicy mPolicy = new TestWindowManagerPolicy(null, null); private WindowManagerService mWms; private RootDisplayArea mRoot; private DisplayArea<WindowContainer> mImeContainer; private DisplayArea.Tokens mImeContainer; private DisplayContent mDisplayContent; private TaskDisplayArea mDefaultTaskDisplayArea; private List<TaskDisplayArea> mTaskDisplayAreaList; Loading @@ -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); Loading Loading @@ -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<DisplayArea<?>> actualOrder = collectLeafAreas(mRoot); Map<DisplayArea<?>, Set<Integer>> zSets = calculateZSets(policy, mImeContainer, Loading Loading @@ -547,7 +552,7 @@ public class DisplayAreaPolicyBuilderTest { private Map<DisplayArea<?>, Set<Integer>> calculateZSets( DisplayAreaPolicyBuilder.Result policy, DisplayArea<WindowContainer> ime, DisplayArea.Tokens ime, DisplayArea<Task> tasks) { Map<DisplayArea<?>, Set<Integer>> zSets = new HashMap<>(); int[] types = {TYPE_STATUS_BAR, TYPE_NAVIGATION_BAR, TYPE_PRESENTATION, Loading