Store and return ImeContainer in RootDisplayArea for layers
Before, calling RootDisplayArea.findAreaForToken for TYPE_INPUT_METHOD returns null. Now, it should return the ImeContainer if it is attached below that RootDisplayArea. Fix: 173478743 Test: atest WmTests:DisplayAreaPolicyBuilderTest Change-Id: I28cc3223a0b9870accff56f93f4cb0fb87b0923f
This commit is contained in:
@@ -309,6 +309,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);
|
||||
@@ -546,6 +551,11 @@ public class DisplayArea<T extends WindowContainer> extends WindowContainer<T> {
|
||||
mLastOrientationSource = win;
|
||||
return req;
|
||||
}
|
||||
|
||||
@Override
|
||||
final DisplayArea.Tokens asTokens() {
|
||||
return this;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -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}.
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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");
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user