diff --git a/api/test-current.txt b/api/test-current.txt index ca291f373be20..f92f28ca65f84 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -5259,10 +5259,20 @@ package android.widget { package android.window { + public final class DisplayAreaInfo implements android.os.Parcelable { + ctor public DisplayAreaInfo(@NonNull android.window.WindowContainerToken, int); + method public int describeContents(); + method public void writeToParcel(@NonNull android.os.Parcel, int); + field @NonNull public static final android.os.Parcelable.Creator CREATOR; + field @NonNull public final android.content.res.Configuration configuration; + field public final int displayId; + field @NonNull public final android.window.WindowContainerToken token; + } + public class DisplayAreaOrganizer extends android.window.WindowOrganizer { ctor public DisplayAreaOrganizer(); - method public void onDisplayAreaAppeared(@NonNull android.window.WindowContainerToken); - method public void onDisplayAreaVanished(@NonNull android.window.WindowContainerToken); + method public void onDisplayAreaAppeared(@NonNull android.window.DisplayAreaInfo); + method public void onDisplayAreaVanished(@NonNull android.window.DisplayAreaInfo); method @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_STACKS) public void registerOrganizer(int); field public static final int FEATURE_DEFAULT_TASK_CONTAINER = 1; // 0x1 field public static final int FEATURE_ROOT = 0; // 0x0 diff --git a/core/java/android/window/DisplayAreaInfo.aidl b/core/java/android/window/DisplayAreaInfo.aidl new file mode 100644 index 0000000000000..b7450172c55af --- /dev/null +++ b/core/java/android/window/DisplayAreaInfo.aidl @@ -0,0 +1,18 @@ +/** + * Copyright (c) 2020, The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package android.window; + +parcelable DisplayAreaInfo; diff --git a/core/java/android/window/DisplayAreaInfo.java b/core/java/android/window/DisplayAreaInfo.java new file mode 100644 index 0000000000000..0d35bcafdf453 --- /dev/null +++ b/core/java/android/window/DisplayAreaInfo.java @@ -0,0 +1,87 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.window; + +import android.annotation.NonNull; +import android.annotation.TestApi; +import android.content.res.Configuration; +import android.os.Parcel; +import android.os.Parcelable; + +/** + * Stores information about a particular {@link com.android.server.wm.DisplayArea}. This object will + * be sent to registered {@link DisplayAreaOrganizer} to provide information when the DisplayArea + * is added, removed, or changed. + * + * @hide + */ +@TestApi +public final class DisplayAreaInfo implements Parcelable { + + @NonNull + public final WindowContainerToken token; + + @NonNull + public final Configuration configuration = new Configuration(); + + /** + * The id of the display this display area is associated with. + */ + public final int displayId; + + public DisplayAreaInfo(@NonNull WindowContainerToken token, int displayId) { + this.token = token; + this.displayId = displayId; + } + + private DisplayAreaInfo(Parcel in) { + token = WindowContainerToken.CREATOR.createFromParcel(in); + configuration.readFromParcel(in); + displayId = in.readInt(); + } + + @Override + public void writeToParcel(@NonNull Parcel dest, int flags) { + token.writeToParcel(dest, flags); + configuration.writeToParcel(dest, flags); + dest.writeInt(displayId); + } + + @NonNull + public static final Creator CREATOR = new Creator() { + @Override + public DisplayAreaInfo createFromParcel(Parcel in) { + return new DisplayAreaInfo(in); + } + + @Override + public DisplayAreaInfo[] newArray(int size) { + return new DisplayAreaInfo[size]; + } + }; + + @Override + public String toString() { + return "DisplayAreaInfo{token=" + token + + " config=" + configuration + "}"; + } + + @Override + public int describeContents() { + return 0; + } +} diff --git a/core/java/android/window/DisplayAreaOrganizer.java b/core/java/android/window/DisplayAreaOrganizer.java index 6ae70b7799605..79999bbe812e2 100644 --- a/core/java/android/window/DisplayAreaOrganizer.java +++ b/core/java/android/window/DisplayAreaOrganizer.java @@ -52,21 +52,20 @@ public class DisplayAreaOrganizer extends WindowOrganizer { } } - public void onDisplayAreaAppeared(@NonNull WindowContainerToken displayArea) {} - - public void onDisplayAreaVanished(@NonNull WindowContainerToken displayArea) {} + public void onDisplayAreaAppeared(@NonNull DisplayAreaInfo displayAreaInfo) {} + public void onDisplayAreaVanished(@NonNull DisplayAreaInfo displayAreaInfo) {} private final IDisplayAreaOrganizer mInterface = new IDisplayAreaOrganizer.Stub() { @Override - public void onDisplayAreaAppeared(@NonNull WindowContainerToken displayArea) { - DisplayAreaOrganizer.this.onDisplayAreaAppeared(displayArea); + public void onDisplayAreaAppeared(@NonNull DisplayAreaInfo displayAreaInfo) { + DisplayAreaOrganizer.this.onDisplayAreaAppeared(displayAreaInfo); } @Override - public void onDisplayAreaVanished(@NonNull WindowContainerToken displayArea) { - DisplayAreaOrganizer.this.onDisplayAreaVanished(displayArea); + public void onDisplayAreaVanished(@NonNull DisplayAreaInfo displayAreaInfo) { + DisplayAreaOrganizer.this.onDisplayAreaVanished(displayAreaInfo); } }; diff --git a/core/java/android/window/IDisplayAreaOrganizer.aidl b/core/java/android/window/IDisplayAreaOrganizer.aidl index 9c72e60c894c7..18d4e88869b04 100644 --- a/core/java/android/window/IDisplayAreaOrganizer.aidl +++ b/core/java/android/window/IDisplayAreaOrganizer.aidl @@ -16,13 +16,13 @@ package android.window; -import android.window.WindowContainerToken; +import android.window.DisplayAreaInfo; /** * Interface for WindowManager to delegate control of display areas. * {@hide} */ oneway interface IDisplayAreaOrganizer { - void onDisplayAreaAppeared(in WindowContainerToken displayArea); - void onDisplayAreaVanished(in WindowContainerToken displayArea); + void onDisplayAreaAppeared(in DisplayAreaInfo displayAreaInfo); + void onDisplayAreaVanished(in DisplayAreaInfo displayAreaInfo); } diff --git a/services/core/java/com/android/server/wm/DisplayArea.java b/services/core/java/com/android/server/wm/DisplayArea.java index a512337c96ecb..a7256c16a67c1 100644 --- a/services/core/java/com/android/server/wm/DisplayArea.java +++ b/services/core/java/com/android/server/wm/DisplayArea.java @@ -33,6 +33,7 @@ import static com.android.server.wm.WindowContainerChildProto.DISPLAY_AREA; import android.graphics.Rect; import android.util.proto.ProtoOutputStream; +import android.window.DisplayAreaInfo; import android.window.IDisplayAreaOrganizer; import com.android.server.policy.WindowManagerPolicy; @@ -158,6 +159,14 @@ public class DisplayArea extends WindowContainer { return mOrganizer != null; } + + DisplayAreaInfo getDisplayAreaInfo() { + DisplayAreaInfo info = new DisplayAreaInfo(mRemoteToken.toWindowContainerToken(), + getDisplayContent().getDisplayId()); + info.configuration.setTo(getConfiguration()); + return info; + } + /** * DisplayArea that contains WindowTokens, and orders them according to their type. */ diff --git a/services/core/java/com/android/server/wm/DisplayAreaOrganizerController.java b/services/core/java/com/android/server/wm/DisplayAreaOrganizerController.java index f05783b8f3ef0..2e7a8a3b31aca 100644 --- a/services/core/java/com/android/server/wm/DisplayAreaOrganizerController.java +++ b/services/core/java/com/android/server/wm/DisplayAreaOrganizerController.java @@ -94,7 +94,7 @@ public class DisplayAreaOrganizerController extends IDisplayAreaOrganizerControl void onDisplayAreaAppeared(IDisplayAreaOrganizer organizer, DisplayArea da) { try { - organizer.onDisplayAreaAppeared(da.mRemoteToken.toWindowContainerToken()); + organizer.onDisplayAreaAppeared(da.getDisplayAreaInfo()); } catch (RemoteException e) { // Oh well... } @@ -102,7 +102,7 @@ public class DisplayAreaOrganizerController extends IDisplayAreaOrganizerControl void onDisplayAreaVanished(IDisplayAreaOrganizer organizer, DisplayArea da) { try { - organizer.onDisplayAreaVanished(da.mRemoteToken.toWindowContainerToken()); + organizer.onDisplayAreaVanished(da.getDisplayAreaInfo()); } catch (RemoteException e) { // Oh well... }