diff --git a/core/api/current.txt b/core/api/current.txt index cc5144aa5631e..282a4c355d2d3 100644 --- a/core/api/current.txt +++ b/core/api/current.txt @@ -4275,6 +4275,7 @@ package android.app { method public void setLocusContext(@Nullable android.content.LocusId, @Nullable android.os.Bundle); method public final void setMediaController(android.media.session.MediaController); method public void setPictureInPictureParams(@NonNull android.app.PictureInPictureParams); + method public void setPreferDockBigOverlays(boolean); method @Deprecated public final void setProgress(int); method @Deprecated public final void setProgressBarIndeterminate(boolean); method @Deprecated public final void setProgressBarIndeterminateVisibility(boolean); diff --git a/core/api/test-current.txt b/core/api/test-current.txt index 2f8878ee00479..9455f8f8856b3 100644 --- a/core/api/test-current.txt +++ b/core/api/test-current.txt @@ -418,6 +418,7 @@ package android.app { method @NonNull public android.content.res.Configuration getConfiguration(); method public int getParentTaskId(); method @Nullable public android.app.PictureInPictureParams getPictureInPictureParams(); + method public boolean getPreferDockBigOverlays(); method @NonNull public android.window.WindowContainerToken getToken(); method public boolean hasParentTask(); } diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java index 2b2f08f03dcc6..11663a52e6ae6 100644 --- a/core/java/android/app/Activity.java +++ b/core/java/android/app/Activity.java @@ -2965,6 +2965,27 @@ public class Activity extends ContextThemeWrapper return false; } + /** + * Specifies a preference to dock big overlays like the expanded picture-in-picture on TV + * (see {@link PictureInPictureParams.Builder#setExpandedAspectRatio}). Docking puts the + * big overlay side-by-side next to this activity, so that both windows are fully visible to + * the user. + * + *
If unspecified, whether the overlay window will be docked or not, will be defined + * by the system. + * + *
If specified, the system will try to respect the preference, but it may be
+ * overridden by a user preference.
+ *
+ * @param preferDockBigOverlays indicates that the activity prefers big overlays to be
+ * docked next to it instead of overlaying its content
+ *
+ * @see PictureInPictureParams.Builder#setExpandedAspectRatio
+ */
+ public void setPreferDockBigOverlays(boolean preferDockBigOverlays) {
+ ActivityClient.getInstance().setPreferDockBigOverlays(mToken, preferDockBigOverlays);
+ }
+
void dispatchMovedToDisplay(int displayId, Configuration config) {
updateDisplay(displayId);
onMovedToDisplay(displayId, config);
diff --git a/core/java/android/app/ActivityClient.java b/core/java/android/app/ActivityClient.java
index 4715e0f2cec8e..cf8480c6b9c84 100644
--- a/core/java/android/app/ActivityClient.java
+++ b/core/java/android/app/ActivityClient.java
@@ -324,6 +324,14 @@ public class ActivityClient {
}
}
+ void setPreferDockBigOverlays(IBinder token, boolean preferDockBigOverlays) {
+ try {
+ getActivityClientController().setPreferDockBigOverlays(token, preferDockBigOverlays);
+ } catch (RemoteException e) {
+ e.rethrowFromSystemServer();
+ }
+ }
+
void toggleFreeformWindowingMode(IBinder token) {
try {
getActivityClientController().toggleFreeformWindowingMode(token);
diff --git a/core/java/android/app/IActivityClientController.aidl b/core/java/android/app/IActivityClientController.aidl
index f9439cb6d770b..caf1c41b76220 100644
--- a/core/java/android/app/IActivityClientController.aidl
+++ b/core/java/android/app/IActivityClientController.aidl
@@ -88,6 +88,7 @@ interface IActivityClientController {
boolean enterPictureInPictureMode(in IBinder token, in PictureInPictureParams params);
void setPictureInPictureParams(in IBinder token, in PictureInPictureParams params);
+ oneway void setPreferDockBigOverlays(in IBinder token, in boolean preferDockBigOverlays);
void toggleFreeformWindowingMode(in IBinder token);
oneway void startLockTaskModeByToken(in IBinder token);
diff --git a/core/java/android/app/TaskInfo.java b/core/java/android/app/TaskInfo.java
index 3d2c03dc4e247..eca4170b5cd25 100644
--- a/core/java/android/app/TaskInfo.java
+++ b/core/java/android/app/TaskInfo.java
@@ -185,6 +185,11 @@ public class TaskInfo {
@Nullable
public PictureInPictureParams pictureInPictureParams;
+ /**
+ * @hide
+ */
+ public boolean preferDockBigOverlays;
+
/**
* The {@link Rect} copied from {@link DisplayCutout#getSafeInsets()} if the cutout is not of
* (LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES, LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS),
@@ -378,6 +383,12 @@ public class TaskInfo {
return pictureInPictureParams;
}
+ /** @hide */
+ @TestApi
+ public boolean getPreferDockBigOverlays() {
+ return preferDockBigOverlays;
+ }
+
/** @hide */
@WindowConfiguration.WindowingMode
public int getWindowingMode() {
@@ -447,6 +458,7 @@ public class TaskInfo {
&& displayAreaFeatureId == that.displayAreaFeatureId
&& Objects.equals(positionInParent, that.positionInParent)
&& Objects.equals(pictureInPictureParams, that.pictureInPictureParams)
+ && Objects.equals(preferDockBigOverlays, that.preferDockBigOverlays)
&& Objects.equals(displayCutoutInsets, that.displayCutoutInsets)
&& getWindowingMode() == that.getWindowingMode()
&& Objects.equals(taskDescription, that.taskDescription)
@@ -503,6 +515,7 @@ public class TaskInfo {
token = WindowContainerToken.CREATOR.createFromParcel(source);
topActivityType = source.readInt();
pictureInPictureParams = source.readTypedObject(PictureInPictureParams.CREATOR);
+ preferDockBigOverlays = source.readBoolean();
displayCutoutInsets = source.readTypedObject(Rect.CREATOR);
topActivityInfo = source.readTypedObject(ActivityInfo.CREATOR);
isResizeable = source.readBoolean();
@@ -548,6 +561,7 @@ public class TaskInfo {
token.writeToParcel(dest, flags);
dest.writeInt(topActivityType);
dest.writeTypedObject(pictureInPictureParams, flags);
+ dest.writeBoolean(preferDockBigOverlays);
dest.writeTypedObject(displayCutoutInsets, flags);
dest.writeTypedObject(topActivityInfo, flags);
dest.writeBoolean(isResizeable);
@@ -587,6 +601,7 @@ public class TaskInfo {
+ " token=" + token
+ " topActivityType=" + topActivityType
+ " pictureInPictureParams=" + pictureInPictureParams
+ + " preferDockBigOverlays=" + preferDockBigOverlays
+ " displayCutoutSafeInsets=" + displayCutoutInsets
+ " topActivityInfo=" + topActivityInfo
+ " launchCookies=" + launchCookies
diff --git a/core/res/res/values-television/config.xml b/core/res/res/values-television/config.xml
index 17ec02cca996e..0db08fb751d85 100644
--- a/core/res/res/values-television/config.xml
+++ b/core/res/res/values-television/config.xml
@@ -45,6 +45,10 @@