Merge "Store and return ImeContainer in RootDisplayArea for layers"

This commit is contained in:
Chris Li
2020-12-03 01:02:28 +00:00
committed by Android (Google) Code Review
7 changed files with 52 additions and 14 deletions

View File

@@ -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);
@@ -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

View File

@@ -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<>();
@@ -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}.

View File

@@ -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;
@@ -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;
}
@@ -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) {
@@ -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;
}
}
}
}

View File

@@ -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<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<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<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;
}
}

View File

@@ -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<WindowContainer> mImeContainer;
private DisplayArea.Tokens mImeContainer;
private DisplayContent mDisplayContent;
private TaskDisplayArea mDefaultTaskDisplayArea;
private List<TaskDisplayArea> 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<DisplayArea<?>> actualOrder = collectLeafAreas(mRoot);
Map<DisplayArea<?>, Set<Integer>> zSets = calculateZSets(policy, mImeContainer,
@@ -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,

View File

@@ -69,7 +69,7 @@ public class DisplayAreaPolicyTests {
WindowManagerService wms = mSystemServices.getWindowManagerService();
mRoot = new SurfacelessDisplayAreaRoot(wms);
spyOn(mRoot);
DisplayArea<WindowContainer> 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<WindowContainer> 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)

View File

@@ -81,7 +81,7 @@ public class DisplayAreaProviderTest {
@Override
public DisplayAreaPolicy instantiate(WindowManagerService wmService, DisplayContent content,
RootDisplayArea root, DisplayArea<? extends WindowContainer> imeContainer) {
RootDisplayArea root, DisplayArea.Tokens imeContainer) {
throw new RuntimeException("test stub");
}
}