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 @@ 110dp + + true + false diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index 80d84d747bcb3..05894d55358e2 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -3738,6 +3738,10 @@ must be no less than 3 for back compatibility. --> 3 + + false +