From e59ae90be33685cafe73291736af6f7329d192a7 Mon Sep 17 00:00:00 2001 From: Chris Li Date: Mon, 10 May 2021 13:26:09 -0700 Subject: [PATCH] Include RootDisplayArea feature id in DisplayAreaInfo With the RootDisplayArea id, one can create WindowContext with bundle that specifying the RootDisplayArea using KEY_ROOT_DISPLAY_AREA_ID to get the WindowContext associated with the DA. Bug: 176875245 Test: atest WmTests:DisplayAreaTest --- core/java/android/window/DisplayAreaInfo.java | 13 ++++++++++ .../android/window/DisplayAreaOrganizer.java | 9 +++++++ core/java/android/window/WindowContext.java | 10 +++++-- .../com/android/server/wm/DisplayArea.java | 4 ++- .../server/wm/DisplayAreaPolicyBuilder.java | 7 +---- .../server/wm/ImmersiveModeConfirmation.java | 3 ++- .../wm/DisplayAreaPolicyBuilderTest.java | 2 +- .../android/server/wm/DisplayAreaTest.java | 26 +++++++++++++++++++ 8 files changed, 63 insertions(+), 11 deletions(-) diff --git a/core/java/android/window/DisplayAreaInfo.java b/core/java/android/window/DisplayAreaInfo.java index 358467ff599f4..1a7aab6852b6b 100644 --- a/core/java/android/window/DisplayAreaInfo.java +++ b/core/java/android/window/DisplayAreaInfo.java @@ -16,6 +16,8 @@ package android.window; +import static android.window.DisplayAreaOrganizer.FEATURE_UNDEFINED; + import android.annotation.NonNull; import android.annotation.TestApi; import android.content.res.Configuration; @@ -43,8 +45,17 @@ public final class DisplayAreaInfo implements Parcelable { */ public final int displayId; + /** + * The feature id of this display area. + */ public final int featureId; + /** + * The feature id of the root display area this display area is associated with. + * @hide + */ + public int rootDisplayAreaId = FEATURE_UNDEFINED; + public DisplayAreaInfo(@NonNull WindowContainerToken token, int displayId, int featureId) { this.token = token; this.displayId = displayId; @@ -56,6 +67,7 @@ public final class DisplayAreaInfo implements Parcelable { configuration.readFromParcel(in); displayId = in.readInt(); featureId = in.readInt(); + rootDisplayAreaId = in.readInt(); } @Override @@ -64,6 +76,7 @@ public final class DisplayAreaInfo implements Parcelable { configuration.writeToParcel(dest, flags); dest.writeInt(displayId); dest.writeInt(featureId); + dest.writeInt(rootDisplayAreaId); } @NonNull diff --git a/core/java/android/window/DisplayAreaOrganizer.java b/core/java/android/window/DisplayAreaOrganizer.java index 878439906de28..e6746556fb67d 100644 --- a/core/java/android/window/DisplayAreaOrganizer.java +++ b/core/java/android/window/DisplayAreaOrganizer.java @@ -33,6 +33,15 @@ import java.util.concurrent.Executor; @TestApi public class DisplayAreaOrganizer extends WindowOrganizer { + /** + * Key to specify the {@link com.android.server.wm.RootDisplayArea} to attach a window to. + * It will be used by the function passed in from + * {@link com.android.server.wm.DisplayAreaPolicyBuilder#setSelectRootForWindowFunc(BiFunction)} + * to find the Root DA to attach the window. + * @hide + */ + public static final String KEY_ROOT_DISPLAY_AREA_ID = "root_display_area_id"; + /** * The value in display area indicating that no value has been set. */ diff --git a/core/java/android/window/WindowContext.java b/core/java/android/window/WindowContext.java index 901625b0732c0..69d7b4c7d696b 100644 --- a/core/java/android/window/WindowContext.java +++ b/core/java/android/window/WindowContext.java @@ -57,8 +57,14 @@ public class WindowContext extends ContextWrapper { * * @param base Base {@link Context} for this new instance. * @param type Window type to be used with this context. - * @param options A bundle used to pass window-related options. - * + * @param options A bundle used to pass window-related options. For example, on device with + * multiple DisplayAreaGroups, one may specify the RootDisplayArea for the window + * using {@link DisplayAreaOrganizer#KEY_ROOT_DISPLAY_AREA_ID} in the options. + * Example usage: + * Bundle options = new Bundle(); + * options.put(KEY_ROOT_DISPLAY_AREA_ID, displayAreaInfo.rootDisplayAreaId); + * Context windowContext = context.createWindowContext(display, type, options); + * @see DisplayAreaInfo#rootDisplayAreaId * @hide */ public WindowContext(@NonNull Context base, int type, @Nullable Bundle options) { diff --git a/services/core/java/com/android/server/wm/DisplayArea.java b/services/core/java/com/android/server/wm/DisplayArea.java index b24ab93145b1a..86bbd1f9c4c6c 100644 --- a/services/core/java/com/android/server/wm/DisplayArea.java +++ b/services/core/java/com/android/server/wm/DisplayArea.java @@ -495,8 +495,10 @@ public class DisplayArea extends WindowContainer { DisplayAreaInfo getDisplayAreaInfo() { - DisplayAreaInfo info = new DisplayAreaInfo(mRemoteToken.toWindowContainerToken(), + final DisplayAreaInfo info = new DisplayAreaInfo(mRemoteToken.toWindowContainerToken(), getDisplayContent().getDisplayId(), mFeatureId); + final RootDisplayArea root = getRootDisplayArea(); + info.rootDisplayAreaId = root == null ? getDisplayContent().mFeatureId : root.mFeatureId; info.configuration.setTo(getConfiguration()); return info; } diff --git a/services/core/java/com/android/server/wm/DisplayAreaPolicyBuilder.java b/services/core/java/com/android/server/wm/DisplayAreaPolicyBuilder.java index 47d7c9d1279d9..3d7ac6c1a3f88 100644 --- a/services/core/java/com/android/server/wm/DisplayAreaPolicyBuilder.java +++ b/services/core/java/com/android/server/wm/DisplayAreaPolicyBuilder.java @@ -25,6 +25,7 @@ import static android.view.WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY; import static android.view.WindowManagerPolicyConstants.APPLICATION_LAYER; import static android.window.DisplayAreaOrganizer.FEATURE_DEFAULT_TASK_CONTAINER; import static android.window.DisplayAreaOrganizer.FEATURE_VENDOR_LAST; +import static android.window.DisplayAreaOrganizer.KEY_ROOT_DISPLAY_AREA_ID; import android.annotation.Nullable; import android.os.Bundle; @@ -135,12 +136,6 @@ import java.util.function.BiFunction; */ class DisplayAreaPolicyBuilder { - /** - * Key to specify the {@link RootDisplayArea} to attach the window to. Should be used by the - * function passed in from {@link #setSelectRootForWindowFunc(BiFunction)} - */ - static final String KEY_ROOT_DISPLAY_AREA_ID = "root_display_area_id"; - @Nullable private HierarchyBuilder mRootHierarchyBuilder; private final ArrayList mDisplayAreaGroupHierarchyBuilders = new ArrayList<>(); diff --git a/services/core/java/com/android/server/wm/ImmersiveModeConfirmation.java b/services/core/java/com/android/server/wm/ImmersiveModeConfirmation.java index 747d3652e1503..f3b9cdfd39e07 100644 --- a/services/core/java/com/android/server/wm/ImmersiveModeConfirmation.java +++ b/services/core/java/com/android/server/wm/ImmersiveModeConfirmation.java @@ -20,6 +20,7 @@ import static android.app.ActivityManager.LOCK_TASK_MODE_LOCKED; import static android.app.ActivityManager.LOCK_TASK_MODE_NONE; import static android.view.Display.DEFAULT_DISPLAY; import static android.window.DisplayAreaOrganizer.FEATURE_UNDEFINED; +import static android.window.DisplayAreaOrganizer.KEY_ROOT_DISPLAY_AREA_ID; import android.animation.ArgbEvaluator; import android.animation.ValueAnimator; @@ -420,7 +421,7 @@ public class ImmersiveModeConfirmation { } final Bundle options = new Bundle(); - options.putInt(DisplayAreaPolicyBuilder.KEY_ROOT_DISPLAY_AREA_ID, rootDisplayAreaId); + options.putInt(KEY_ROOT_DISPLAY_AREA_ID, rootDisplayAreaId); return options; } 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 31d46125fd70e..af21e02ce27cf 100644 --- a/services/tests/wmtests/src/com/android/server/wm/DisplayAreaPolicyBuilderTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/DisplayAreaPolicyBuilderTest.java @@ -35,10 +35,10 @@ import static android.window.DisplayAreaOrganizer.FEATURE_ROOT; import static android.window.DisplayAreaOrganizer.FEATURE_VENDOR_FIRST; import static android.window.DisplayAreaOrganizer.FEATURE_VENDOR_LAST; import static android.window.DisplayAreaOrganizer.FEATURE_WINDOWED_MAGNIFICATION; +import static android.window.DisplayAreaOrganizer.KEY_ROOT_DISPLAY_AREA_ID; import static com.android.server.wm.DisplayArea.Type.ABOVE_TASKS; import static com.android.server.wm.DisplayAreaPolicyBuilder.Feature; -import static com.android.server.wm.DisplayAreaPolicyBuilder.KEY_ROOT_DISPLAY_AREA_ID; import static com.google.common.truth.Truth.assertThat; diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayAreaTest.java b/services/tests/wmtests/src/com/android/server/wm/DisplayAreaTest.java index d5628fc9de48a..c4faaa31e5a0a 100644 --- a/services/tests/wmtests/src/com/android/server/wm/DisplayAreaTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/DisplayAreaTest.java @@ -61,6 +61,7 @@ import android.platform.test.annotations.Presubmit; import android.view.SurfaceControl; import android.view.View; import android.view.WindowManager; +import android.window.DisplayAreaInfo; import android.window.IDisplayAreaOrganizer; import com.google.android.collect.Lists; @@ -566,6 +567,31 @@ public class DisplayAreaTest extends WindowTestsBase { .onDisplayAreaVanished(mockDisplayAreaOrganizer, displayArea); } + @Test + public void testGetDisplayAreaInfo() { + final DisplayArea displayArea = new DisplayArea<>( + mWm, BELOW_TASKS, "NewArea", FEATURE_VENDOR_FIRST); + mDisplayContent.addChild(displayArea, 0); + final DisplayAreaInfo info = displayArea.getDisplayAreaInfo(); + + assertThat(info.token).isEqualTo(displayArea.mRemoteToken.toWindowContainerToken()); + assertThat(info.configuration).isEqualTo(displayArea.getConfiguration()); + assertThat(info.displayId).isEqualTo(mDisplayContent.getDisplayId()); + assertThat(info.featureId).isEqualTo(displayArea.mFeatureId); + assertThat(info.rootDisplayAreaId).isEqualTo(mDisplayContent.mFeatureId); + + final TaskDisplayArea tda = mDisplayContent.getDefaultTaskDisplayArea(); + final int tdaIndex = tda.getParent().mChildren.indexOf(tda); + final RootDisplayArea root = + new DisplayAreaGroup(mWm, "TestRoot", FEATURE_VENDOR_FIRST + 1); + mDisplayContent.addChild(root, tdaIndex + 1); + displayArea.reparent(root, 0); + + final DisplayAreaInfo info2 = displayArea.getDisplayAreaInfo(); + + assertThat(info2.rootDisplayAreaId).isEqualTo(root.mFeatureId); + } + private static class TestDisplayArea extends DisplayArea { private TestDisplayArea(WindowManagerService wms, Rect bounds) { super(wms, ANY, "half display area");