diff options
| author | 2021-07-26 11:22:39 -0700 | |
|---|---|---|
| committer | 2021-07-30 15:57:39 -0700 | |
| commit | c9a7c24e3e54152f8dd2728f5c5d042fa00fe6b4 (patch) | |
| tree | fd194a1f09cd044176c49544b81fec6e0f83532e | |
| parent | eced4b32087018b23efe9b59803f7a5d8e59d6bc (diff) | |
Pass AppOps result for PiP in RemoteAnimationTarget
This result will be used by Launcher when deciding if we should start
the auto-enter-pip transition.
Video: http://recall/-/aaaaaabFQoRHlzixHdtY/c9raN4jiaNqbiV7DF4YTJ6
Bug: 194272108
Test: try auto-enter-pip with permission disabled
Change-Id: Iea3a45fd68b54d74e7d5da91b63684c206a0132e
9 files changed, 26 insertions, 11 deletions
diff --git a/core/java/android/view/RemoteAnimationTarget.java b/core/java/android/view/RemoteAnimationTarget.java index cdc099b8e2ea..bd68401e6534 100644 --- a/core/java/android/view/RemoteAnimationTarget.java +++ b/core/java/android/view/RemoteAnimationTarget.java @@ -197,6 +197,12 @@ public class RemoteAnimationTarget implements Parcelable { public ActivityManager.RunningTaskInfo taskInfo; /** + * {@code true} if picture-in-picture permission is granted in {@link android.app.AppOpsManager} + */ + @UnsupportedAppUsage + public boolean allowEnterPip; + + /** * The {@link android.view.WindowManager.LayoutParams.WindowType} of this window. It's only used * for non-app window. */ @@ -206,10 +212,11 @@ public class RemoteAnimationTarget implements Parcelable { Rect clipRect, Rect contentInsets, int prefixOrderIndex, Point position, Rect localBounds, Rect screenSpaceBounds, WindowConfiguration windowConfig, boolean isNotInRecents, - SurfaceControl startLeash, Rect startBounds, ActivityManager.RunningTaskInfo taskInfo) { + SurfaceControl startLeash, Rect startBounds, ActivityManager.RunningTaskInfo taskInfo, + boolean allowEnterPip) { this(taskId, mode, leash, isTranslucent, clipRect, contentInsets, prefixOrderIndex, position, localBounds, screenSpaceBounds, windowConfig, isNotInRecents, startLeash, - startBounds, taskInfo, INVALID_WINDOW_TYPE); + startBounds, taskInfo, allowEnterPip, INVALID_WINDOW_TYPE); } public RemoteAnimationTarget(int taskId, int mode, SurfaceControl leash, boolean isTranslucent, @@ -217,7 +224,7 @@ public class RemoteAnimationTarget implements Parcelable { Rect localBounds, Rect screenSpaceBounds, WindowConfiguration windowConfig, boolean isNotInRecents, SurfaceControl startLeash, Rect startBounds, - ActivityManager.RunningTaskInfo taskInfo, + ActivityManager.RunningTaskInfo taskInfo, boolean allowEnterPip, @WindowManager.LayoutParams.WindowType int windowType) { this.mode = mode; this.taskId = taskId; @@ -235,6 +242,7 @@ public class RemoteAnimationTarget implements Parcelable { this.startLeash = startLeash; this.startBounds = startBounds == null ? null : new Rect(startBounds); this.taskInfo = taskInfo; + this.allowEnterPip = allowEnterPip; this.windowType = windowType; } @@ -255,6 +263,7 @@ public class RemoteAnimationTarget implements Parcelable { startLeash = in.readTypedObject(SurfaceControl.CREATOR); startBounds = in.readTypedObject(Rect.CREATOR); taskInfo = in.readTypedObject(ActivityManager.RunningTaskInfo.CREATOR); + allowEnterPip = in.readBoolean(); windowType = in.readInt(); } @@ -281,6 +290,7 @@ public class RemoteAnimationTarget implements Parcelable { dest.writeTypedObject(startLeash, 0 /* flags */); dest.writeTypedObject(startBounds, 0 /* flags */); dest.writeTypedObject(taskInfo, 0 /* flags */); + dest.writeBoolean(allowEnterPip); dest.writeInt(windowType); } @@ -299,6 +309,7 @@ public class RemoteAnimationTarget implements Parcelable { pw.print(prefix); pw.print("windowConfiguration="); pw.println(windowConfiguration); pw.print(prefix); pw.print("leash="); pw.println(leash); pw.print(prefix); pw.print("taskInfo="); pw.println(taskInfo); + pw.print(prefix); pw.print("allowEnterPip="); pw.println(allowEnterPip); pw.print(prefix); pw.print("windowType="); pw.print(windowType); } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java index 4795a2a4ef56..29e99175bed0 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java @@ -1125,7 +1125,7 @@ class StageCoordinator implements SplitLayout.SplitLayoutHandler, null /* contentInsets */, Integer.MAX_VALUE /* prefixOrderIndex */, new android.graphics.Point(0, 0) /* position */, bounds, bounds, new WindowConfiguration(), true, null /* startLeash */, null /* startBounds */, - null /* taskInfo */, TYPE_DOCK_DIVIDER); + null /* taskInfo */, false /* allowEnterPip */, TYPE_DOCK_DIVIDER); } @Override diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteAnimationTargetCompat.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteAnimationTargetCompat.java index 2407d216b4ab..23a365a1acef 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteAnimationTargetCompat.java +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteAnimationTargetCompat.java @@ -68,6 +68,7 @@ public class RemoteAnimationTargetCompat { public final boolean isNotInRecents; public final Rect contentInsets; public final ActivityManager.RunningTaskInfo taskInfo; + public final boolean allowEnterPip; public final int rotationChange; public final int windowType; @@ -88,6 +89,7 @@ public class RemoteAnimationTargetCompat { contentInsets = app.contentInsets; activityType = app.windowConfiguration.getActivityType(); taskInfo = app.taskInfo; + allowEnterPip = app.allowEnterPip; rotationChange = 0; mStartLeash = app.startLeash; @@ -214,6 +216,7 @@ public class RemoteAnimationTargetCompat { activityType = ACTIVITY_TYPE_UNDEFINED; } taskInfo = change.getTaskInfo(); + allowEnterPip = false; /* always false in shell-transition case */ mStartLeash = null; rotationChange = change.getEndRotation() - change.getStartRotation(); windowType = INVALID_WINDOW_TYPE; diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java index 391e6defd7e8..7160bb3d35bd 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java +++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java @@ -158,7 +158,7 @@ public class KeyguardService extends Service { info.getChanges().size() - i, new Point(), localBounds, new Rect(change.getEndAbsBounds()), windowConfiguration, isNotInRecents, null /* startLeash */, - change.getStartAbsBounds(), taskInfo)); + change.getStartAbsBounds(), taskInfo, false /* allowEnterPip */)); } return out.toArray(new RemoteAnimationTarget[out.size()]); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/animation/ActivityLaunchAnimatorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/animation/ActivityLaunchAnimatorTest.kt index 14f112b8b071..cc35a8f9e1b5 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/animation/ActivityLaunchAnimatorTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/animation/ActivityLaunchAnimatorTest.kt @@ -196,7 +196,7 @@ class ActivityLaunchAnimatorTest : SysuiTestCase() { return RemoteAnimationTarget( 0, RemoteAnimationTarget.MODE_OPENING, SurfaceControl(), false, Rect(), Rect(), 0, Point(), Rect(), bounds, WindowConfiguration(), false, SurfaceControl(), Rect(), - taskInfo + taskInfo, false ) } } diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java index f727ff9b30be..c96ffe761d90 100644 --- a/services/core/java/com/android/server/wm/ActivityRecord.java +++ b/services/core/java/com/android/server/wm/ActivityRecord.java @@ -2826,7 +2826,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A /** * @return Whether AppOps allows this package to enter picture-in-picture. */ - private boolean checkEnterPictureInPictureAppOpsState() { + boolean checkEnterPictureInPictureAppOpsState() { return mAtmService.getAppOpsManager().checkOpNoThrow( OP_PICTURE_IN_PICTURE, info.applicationInfo.uid, packageName) == MODE_ALLOWED; } @@ -9075,7 +9075,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A record.mAdapter.mRootTaskBounds, task.getWindowConfiguration(), false /*isNotInRecents*/, record.mThumbnailAdapter != null ? record.mThumbnailAdapter.mCapturedLeash : null, - record.mStartBounds, task.getTaskInfo()); + record.mStartBounds, task.getTaskInfo(), checkEnterPictureInPictureAppOpsState()); } @Override diff --git a/services/core/java/com/android/server/wm/NonAppWindowAnimationAdapter.java b/services/core/java/com/android/server/wm/NonAppWindowAnimationAdapter.java index d230936b5d51..88941eb4d369 100644 --- a/services/core/java/com/android/server/wm/NonAppWindowAnimationAdapter.java +++ b/services/core/java/com/android/server/wm/NonAppWindowAnimationAdapter.java @@ -138,7 +138,7 @@ class NonAppWindowAnimationAdapter implements AnimationAdapter { mTarget = new RemoteAnimationTarget(-1, -1, getLeash(), false, new Rect(), null, mWindowContainer.getPrefixOrderIndex(), mWindowContainer.getLastSurfacePosition(), mWindowContainer.getBounds(), null, - mWindowContainer.getWindowConfiguration(), true, null, null, null, + mWindowContainer.getWindowConfiguration(), true, null, null, null, false, mWindowContainer.getWindowType()); return mTarget; } diff --git a/services/core/java/com/android/server/wm/RecentsAnimationController.java b/services/core/java/com/android/server/wm/RecentsAnimationController.java index e346e3ec7db9..4f93c7ad6ed9 100644 --- a/services/core/java/com/android/server/wm/RecentsAnimationController.java +++ b/services/core/java/com/android/server/wm/RecentsAnimationController.java @@ -1201,7 +1201,8 @@ public class RecentsAnimationController implements DeathRecipient { !topApp.fillsParent(), new Rect(), insets, mTask.getPrefixOrderIndex(), new Point(mBounds.left, mBounds.top), mLocalBounds, mBounds, mTask.getWindowConfiguration(), - mIsRecentTaskInvisible, null, null, mTask.getTaskInfo()); + mIsRecentTaskInvisible, null, null, mTask.getTaskInfo(), + topApp.checkEnterPictureInPictureAppOpsState()); return mTarget; } diff --git a/services/core/java/com/android/server/wm/WallpaperAnimationAdapter.java b/services/core/java/com/android/server/wm/WallpaperAnimationAdapter.java index 416b9dfe50b4..25f7269effe8 100644 --- a/services/core/java/com/android/server/wm/WallpaperAnimationAdapter.java +++ b/services/core/java/com/android/server/wm/WallpaperAnimationAdapter.java @@ -93,7 +93,7 @@ class WallpaperAnimationAdapter implements AnimationAdapter { RemoteAnimationTarget createRemoteAnimationTarget() { mTarget = new RemoteAnimationTarget(-1, -1, getLeash(), false, null, null, mWallpaperToken.getPrefixOrderIndex(), new Point(), null, null, - mWallpaperToken.getWindowConfiguration(), true, null, null, null); + mWallpaperToken.getWindowConfiguration(), true, null, null, null, false); return mTarget; } |