Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8c95ce58 authored by Hongwei Wang's avatar Hongwei Wang
Browse files

Track PictureInPictureParams in PipTaskOrganizer

When onTaskInfoChanged is invoked, always compare it with the last known
PictureInPictureParams and keep PipBoundsHandler in sync w/ the latest

Bug: 155004450
Test: tap next vidoe in YouTube PiP window
Change-Id: Ia88f96c7d88f973369759b27472931fa35e7641a
parent b8ad491e
Loading
Loading
Loading
Loading
+13 −8
Original line number Diff line number Diff line
@@ -190,6 +190,7 @@ public class PipTaskOrganizer extends TaskOrganizer {
    private @PipAnimationController.AnimationType int mOneShotAnimationType = ANIM_TYPE_BOUNDS;
    private PipSurfaceTransactionHelper.SurfaceControlTransactionFactory
            mSurfaceControlTransactionFactory;
    private PictureInPictureParams mPictureInPictureParams;

    public PipTaskOrganizer(Context context, @NonNull PipBoundsHandler boundsHandler,
            @NonNull PipSurfaceTransactionHelper surfaceTransactionHelper,
@@ -252,8 +253,9 @@ public class PipTaskOrganizer extends TaskOrganizer {
    @Override
    public void onTaskAppeared(ActivityManager.RunningTaskInfo info, SurfaceControl leash) {
        Objects.requireNonNull(info, "Requires RunningTaskInfo");
        mPictureInPictureParams = info.pictureInPictureParams;
        final Rect destinationBounds = mPipBoundsHandler.getDestinationBounds(
                info.topActivity, getAspectRatioOrDefault(info.pictureInPictureParams),
                info.topActivity, getAspectRatioOrDefault(mPictureInPictureParams),
                null /* bounds */, getMinimalSize(info.topActivityInfo));
        Objects.requireNonNull(destinationBounds, "Missing destination bounds");
        mTaskInfo = info;
@@ -299,6 +301,7 @@ public class PipTaskOrganizer extends TaskOrganizer {
            Log.wtf(TAG, "Unrecognized token: " + token);
            return;
        }
        mPictureInPictureParams = null;
        mInPip = false;
    }

@@ -306,7 +309,7 @@ public class PipTaskOrganizer extends TaskOrganizer {
    public void onTaskInfoChanged(ActivityManager.RunningTaskInfo info) {
        Objects.requireNonNull(mToken, "onTaskInfoChanged requires valid existing mToken");
        final PictureInPictureParams newParams = info.pictureInPictureParams;
        if (!shouldUpdateDestinationBounds(newParams)) {
        if (!applyPictureInPictureParams(newParams)) {
            Log.d(TAG, "Ignored onTaskInfoChanged with PiP param: " + newParams);
            return;
        }
@@ -354,7 +357,7 @@ public class PipTaskOrganizer extends TaskOrganizer {
        }

        final Rect newDestinationBounds = mPipBoundsHandler.getDestinationBounds(
                mTaskInfo.topActivity, getAspectRatioOrDefault(mTaskInfo.pictureInPictureParams),
                mTaskInfo.topActivity, getAspectRatioOrDefault(mPictureInPictureParams),
                null /* bounds */, getMinimalSize(mTaskInfo.topActivityInfo));
        if (newDestinationBounds.equals(currentDestinationBounds)) return;
        if (animator.getAnimationType() == ANIM_TYPE_BOUNDS) {
@@ -368,12 +371,14 @@ public class PipTaskOrganizer extends TaskOrganizer {
     * @return {@code true} if the aspect ratio is changed since no other parameters within
     * {@link PictureInPictureParams} would affect the bounds.
     */
    private boolean shouldUpdateDestinationBounds(PictureInPictureParams params) {
        if (params == null || mTaskInfo.pictureInPictureParams == null) {
            return params != mTaskInfo.pictureInPictureParams;
        }
        return !Objects.equals(mTaskInfo.pictureInPictureParams.getAspectRatioRational(),
                params.getAspectRatioRational());
    private boolean applyPictureInPictureParams(@NonNull PictureInPictureParams params) {
        final boolean changed = (mPictureInPictureParams == null) ? true : !Objects.equals(
                mPictureInPictureParams.getAspectRatioRational(), params.getAspectRatioRational());
        if (changed) {
            mPictureInPictureParams = params;
            mPipBoundsHandler.onAspectRatioChanged(params.getAspectRatio());
        }
        return changed;
    }

    /**