From dce27c482268ec58ace47c14379b112c7e642136 Mon Sep 17 00:00:00 2001 From: Jacqueline Bronger Date: Thu, 24 Feb 2022 17:42:03 +0100 Subject: Add symmetric Getters to PictureInPictureParams - Adds getter to all setters in PictureInPictureParams.Builder - Changes getAspectRatio and getExpandedAspect ratio to return the Rational values instead of floats to ensure symmetry Bug: 220740459 Test: atest PictureInPictureParamsTest#testPictureInPictureParamsGetters Test: atest PictureInPictureParamsTest#testPictureInPictureParamsGettersNullValues Test: atest PinnedStackTests#testFillMaxAllowedActions Test: atest PinnedStackTests#testRejectExceededActions Test: atest PinnedStackTests#testCloseActionIsSet Test: atest PinnedStackTests#testTitleIsSet Test: atest PinnedStackTests#testSubtitleIsSet Test: atest PinnedStackTests#testIsSeamlessResizeEnabledDefaultToTrue Test: atest PinnedStackTests#testDisableIsSeamlessResizeEnabled Change-Id: Idb06fbf326815181c3e43907dc9c47e5ecc125d0 --- core/api/current.txt | 9 +++ core/api/test-current.txt | 10 +-- core/java/android/app/PictureInPictureParams.java | 85 +++++++++++++++------- .../android/wm/shell/pip/PipBoundsAlgorithm.java | 2 +- .../com/android/wm/shell/pip/PipTaskOrganizer.java | 6 +- .../android/wm/shell/pip/tv/TvPipBoundsState.java | 2 +- .../server/wm/ActivityClientController.java | 9 ++- .../server/wm/ActivityTaskManagerService.java | 5 +- .../android/server/wm/WindowOrganizerTests.java | 2 +- 9 files changed, 84 insertions(+), 46 deletions(-) diff --git a/core/api/current.txt b/core/api/current.txt index 45f7cf23fe61..aa3a4b9b9397 100644 --- a/core/api/current.txt +++ b/core/api/current.txt @@ -6644,6 +6644,15 @@ package android.app { public final class PictureInPictureParams implements android.os.Parcelable { method public int describeContents(); + method @NonNull public java.util.List getActions(); + method @Nullable public android.util.Rational getAspectRatio(); + method @Nullable public android.app.RemoteAction getCloseAction(); + method @Nullable public android.util.Rational getExpandedAspectRatio(); + method @Nullable public android.graphics.Rect getSourceRectHint(); + method @Nullable public CharSequence getSubtitle(); + method @Nullable public CharSequence getTitle(); + method public boolean isAutoEnterEnabled(); + method public boolean isSeamlessResizeEnabled(); method public void writeToParcel(android.os.Parcel, int); field @NonNull public static final android.os.Parcelable.Creator CREATOR; } diff --git a/core/api/test-current.txt b/core/api/test-current.txt index db95a1feec91..2e8bed32665c 100644 --- a/core/api/test-current.txt +++ b/core/api/test-current.txt @@ -356,14 +356,8 @@ package android.app { } public final class PictureInPictureParams implements android.os.Parcelable { - method public java.util.List getActions(); - method public float getAspectRatio(); - method @Nullable public android.app.RemoteAction getCloseAction(); - method public float getExpandedAspectRatio(); - method public android.graphics.Rect getSourceRectHint(); - method @Nullable public CharSequence getSubtitle(); - method @Nullable public CharSequence getTitle(); - method public boolean isSeamlessResizeEnabled(); + method public float getAspectRatioFloat(); + method public float getExpandedAspectRatioFloat(); } public final class PictureInPictureUiState implements android.os.Parcelable { diff --git a/core/java/android/app/PictureInPictureParams.java b/core/java/android/app/PictureInPictureParams.java index 2d2788ca91a3..3f1844e2ba8a 100644 --- a/core/java/android/app/PictureInPictureParams.java +++ b/core/java/android/app/PictureInPictureParams.java @@ -280,7 +280,7 @@ public final class PictureInPictureParams implements Parcelable { private Rational mAspectRatio; /** - * The expected aspect ratio of the vertically expanded picture-in-picture window. + * The expected aspect ratio of the expanded picture-in-picture window. */ @Nullable private Rational mExpandedAspectRatio; @@ -441,15 +441,21 @@ public final class PictureInPictureParams implements Parcelable { * @hide */ @TestApi - public float getAspectRatio() { + public float getAspectRatioFloat() { if (mAspectRatio != null) { return mAspectRatio.floatValue(); } return 0f; } - /** @hide */ - public Rational getAspectRatioRational() { + /** + * Returns the expected aspect ratio of the picture-in-picture window. + * + * @return aspect ratio as the desired width / height or {@code null} if not set. + * @see PictureInPictureParams.Builder#setAspectRatio(Rational) + */ + @Nullable + public Rational getAspectRatio() { return mAspectRatio; } @@ -466,13 +472,24 @@ public final class PictureInPictureParams implements Parcelable { * @hide */ @TestApi - public float getExpandedAspectRatio() { + public float getExpandedAspectRatioFloat() { if (mExpandedAspectRatio != null) { return mExpandedAspectRatio.floatValue(); } return 0f; } + /** + * Returns the desired aspect ratio of the expanded picture-in-picture window. + * + * @return aspect ratio as the desired width / height or {@code null} if not set. + * @see PictureInPictureParams.Builder#setExpandedAspectRatio(Rational) + */ + @Nullable + public Rational getExpandedAspectRatio() { + return mExpandedAspectRatio; + } + /** * @return whether the expanded aspect ratio is set * @hide @@ -482,11 +499,17 @@ public final class PictureInPictureParams implements Parcelable { } /** - * @return the set of user actions. - * @hide + * Returns the list of user actions that are associated with the activity when in + * picture-in-picture mode. + * + * @return the user actions in a new list. + * @see PictureInPictureParams.Builder#setActions(List) */ - @TestApi + @NonNull public List getActions() { + if (mUserActions == null) { + return new ArrayList<>(); + } return mUserActions; } @@ -499,10 +522,11 @@ public final class PictureInPictureParams implements Parcelable { } /** - * @return the close action. - * @hide + * Returns the action that is to replace the system close action. + * + * @return the close action or {@code null} if not set. + * @see PictureInPictureParams.Builder#setCloseAction(RemoteAction) */ - @TestApi @Nullable public RemoteAction getCloseAction() { return mCloseAction; @@ -528,10 +552,12 @@ public final class PictureInPictureParams implements Parcelable { } /** - * @return the source rect hint - * @hide + * Returns the source rect hint. + * + * @return the source rect hint also known as launch bounds or {@code null} if not set. + * @see PictureInPictureParams.Builder#setSourceRectHint(Rect) */ - @TestApi + @Nullable public Rect getSourceRectHint() { return mSourceRectHint; } @@ -545,18 +571,23 @@ public final class PictureInPictureParams implements Parcelable { } /** - * @return whether auto pip is enabled. - * @hide + * Returns whether auto enter picture-in-picture is enabled. + * + * @return {@code true} if the system will automatically put the activity in + * picture-in-picture mode. + * @see PictureInPictureParams.Builder#setAutoEnterEnabled(boolean) */ public boolean isAutoEnterEnabled() { return mAutoEnterEnabled == null ? false : mAutoEnterEnabled; } /** - * @return whether seamless resize is enabled. - * @hide + * Returns whether seamless resize is enabled. + * + * @return true if the system can seamlessly resize the window while activity is in + * picture-in-picture mode. + * @see PictureInPictureParams.Builder#setSeamlessResizeEnabled(boolean) */ - @TestApi public boolean isSeamlessResizeEnabled() { return mSeamlessResizeEnabled == null ? true : mSeamlessResizeEnabled; } @@ -570,10 +601,11 @@ public final class PictureInPictureParams implements Parcelable { } /** - * @return title of the pip. - * @hide + * Returns the title of the picture-in-picture window that may be displayed to the user. + * + * @return title of the picture-in-picture window. + * @see PictureInPictureParams.Builder#setTitle(CharSequence) */ - @TestApi @Nullable public CharSequence getTitle() { return mTitle; @@ -588,10 +620,11 @@ public final class PictureInPictureParams implements Parcelable { } /** - * @return subtitle of the pip. - * @hide + * Returns the subtitle of the picture-in-picture window that may be displayed to the user. + * + * @return subtitle of the picture-in-picture window. + * @see PictureInPictureParams.Builder#setSubtitle(CharSequence) */ - @TestApi @Nullable public CharSequence getSubtitle() { return mSubtitle; @@ -716,7 +749,7 @@ public final class PictureInPictureParams implements Parcelable { @Override public String toString() { return "PictureInPictureParams(" - + " aspectRatio=" + getAspectRatioRational() + + " aspectRatio=" + getAspectRatio() + " expandedAspectRatio=" + mExpandedAspectRatio + " sourceRectHint=" + getSourceRectHint() + " hasSetActions=" + hasSetActions() diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipBoundsAlgorithm.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipBoundsAlgorithm.java index c2d582354b13..7397e5273753 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipBoundsAlgorithm.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipBoundsAlgorithm.java @@ -194,7 +194,7 @@ public class PipBoundsAlgorithm { public float getAspectRatioOrDefault( @android.annotation.Nullable PictureInPictureParams params) { return params != null && params.hasSetAspectRatio() - ? params.getAspectRatio() + ? params.getAspectRatioFloat() : getDefaultAspectRatio(); } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java index c1e78251da2b..5d6b041f9006 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java @@ -1071,13 +1071,13 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener, */ private boolean applyPictureInPictureParams(@NonNull PictureInPictureParams params) { final Rational currentAspectRatio = - mPictureInPictureParams != null ? mPictureInPictureParams.getAspectRatioRational() + mPictureInPictureParams != null ? mPictureInPictureParams.getAspectRatio() : null; final boolean aspectRatioChanged = !Objects.equals(currentAspectRatio, - params.getAspectRatioRational()); + params.getAspectRatio()); mPictureInPictureParams = params; if (aspectRatioChanged) { - mPipBoundsState.setAspectRatio(params.getAspectRatio()); + mPipBoundsState.setAspectRatio(params.getAspectRatioFloat()); } return aspectRatioChanged; } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipBoundsState.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipBoundsState.java index d880f821ee73..986554853034 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipBoundsState.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipBoundsState.java @@ -75,7 +75,7 @@ public class TvPipBoundsState extends PipBoundsState { public void setBoundsStateForEntry(ComponentName componentName, ActivityInfo activityInfo, PictureInPictureParams params, PipBoundsAlgorithm pipBoundsAlgorithm) { super.setBoundsStateForEntry(componentName, activityInfo, params, pipBoundsAlgorithm); - setDesiredTvExpandedAspectRatio(params.getExpandedAspectRatio(), true); + setDesiredTvExpandedAspectRatio(params.getExpandedAspectRatioFloat(), true); } /** Resets the TV PiP state for a new activity. */ diff --git a/services/core/java/com/android/server/wm/ActivityClientController.java b/services/core/java/com/android/server/wm/ActivityClientController.java index 543e44cce8b6..ffc438834658 100644 --- a/services/core/java/com/android/server/wm/ActivityClientController.java +++ b/services/core/java/com/android/server/wm/ActivityClientController.java @@ -746,8 +746,9 @@ class ActivityClientController extends IActivityClientController.Stub { // if it is not already expanding to fullscreen. Otherwise, the arguments will // be used the next time the activity enters PiP. final Task rootTask = r.getRootTask(); - rootTask.setPictureInPictureAspectRatio(r.pictureInPictureArgs.getAspectRatio(), - r.pictureInPictureArgs.getExpandedAspectRatio()); + rootTask.setPictureInPictureAspectRatio( + r.pictureInPictureArgs.getAspectRatioFloat(), + r.pictureInPictureArgs.getExpandedAspectRatioFloat()); rootTask.setPictureInPictureActions(r.pictureInPictureArgs.getActions()); } } @@ -828,7 +829,7 @@ class ActivityClientController extends IActivityClientController.Stub { if (params.hasSetAspectRatio() && !mService.mWindowManager.isValidPictureInPictureAspectRatio( - r.mDisplayContent, params.getAspectRatio())) { + r.mDisplayContent, params.getAspectRatioFloat())) { throw new IllegalArgumentException(String.format(caller + ": Aspect ratio is too extreme (must be between %f and %f).", minAspectRatio, maxAspectRatio)); @@ -836,7 +837,7 @@ class ActivityClientController extends IActivityClientController.Stub { if (mService.mSupportsExpandedPictureInPicture && params.hasSetExpandedAspectRatio() && !mService.mWindowManager.isValidExpandedPictureInPictureAspectRatio( - r.mDisplayContent, params.getExpandedAspectRatio())) { + r.mDisplayContent, params.getExpandedAspectRatioFloat())) { throw new IllegalArgumentException(String.format(caller + ": Expanded aspect ratio is not extreme enough (must not be between" + " %f and %f).", diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java index b5312c4de437..988a7c6cde9a 100644 --- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java +++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java @@ -3523,8 +3523,9 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { } // Only update the saved args from the args that are set r.setPictureInPictureParams(params); - final float aspectRatio = r.pictureInPictureArgs.getAspectRatio(); - final float expandedAspectRatio = r.pictureInPictureArgs.getExpandedAspectRatio(); + final float aspectRatio = r.pictureInPictureArgs.getAspectRatioFloat(); + final float expandedAspectRatio = + r.pictureInPictureArgs.getExpandedAspectRatioFloat(); final List actions = r.pictureInPictureArgs.getActions(); mRootWindowContainer.moveActivityToPinnedRootTask(r, null /* launchIntoPipHostActivity */, "enterPictureInPictureMode"); diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowOrganizerTests.java b/services/tests/wmtests/src/com/android/server/wm/WindowOrganizerTests.java index 25d7334a529c..b4d305bbe4d0 100644 --- a/services/tests/wmtests/src/com/android/server/wm/WindowOrganizerTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/WindowOrganizerTests.java @@ -932,7 +932,7 @@ public class WindowOrganizerTests extends WindowTestsBase { mWm.mAtmService.mTaskOrganizerController.dispatchPendingEvents(); assertNotNull(o.mChangedInfo); assertNotNull(o.mChangedInfo.pictureInPictureParams); - final Rational ratio = o.mChangedInfo.pictureInPictureParams.getAspectRatioRational(); + final Rational ratio = o.mChangedInfo.pictureInPictureParams.getAspectRatio(); assertEquals(3, ratio.getNumerator()); assertEquals(4, ratio.getDenominator()); } -- cgit v1.2.3-59-g8ed1b