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

Commit 8aaed30d authored by Hongwei Wang's avatar Hongwei Wang Committed by Android (Google) Code Review
Browse files

Merge "Enter PiP directly if the transition is handled in Launcher"

parents e6bebfc3 00657034
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ package android.view;
import android.app.ActivityManager;
import android.view.IRemoteAnimationFinishedCallback;
import android.graphics.GraphicBuffer;
import android.graphics.Rect;

/**
 * Passed to the {@link IRecentsAnimationRunner} in order for the runner to control to let the
@@ -36,6 +37,15 @@ interface IRecentsAnimationController {
    @UnsupportedAppUsage
    ActivityManager.TaskSnapshot screenshotTask(int taskId);

    /**
     * Sets the final bounds on a Task. This is used by Launcher to notify the system that
     * animating Activity to PiP has completed and the associated task surface should be updated
     * accordingly. This should be called before `finish`
     * @param taskId for which the leash should be updated
     * @param destinationBounds bounds of the final PiP window
     */
     void setFinishTaskBounds(int taskId, in Rect destinationBounds);

    /**
     * Notifies to the system that the animation into Recents should end, and all leashes associated
     * with remote animation targets should be relinquished. If {@param moveHomeToTop} is true, then
+6 −0
Original line number Diff line number Diff line
@@ -319,6 +319,12 @@
      "group": "WM_DEBUG_ORIENTATION",
      "at": "com\/android\/server\/wm\/DisplayRotation.java"
    },
    "-1729340764": {
      "message": "setFinishTaskBounds(%d): bounds=%s",
      "level": "DEBUG",
      "group": "WM_DEBUG_RECENTS_ANIMATIONS",
      "at": "com\/android\/server\/wm\/RecentsAnimationController.java"
    },
    "-1715268616": {
      "message": "Last window, removing starting window %s",
      "level": "VERBOSE",
+18 −10
Original line number Diff line number Diff line
@@ -68,7 +68,6 @@ import com.android.wm.shell.common.DisplayController;
import com.android.wm.shell.pip.phone.PipMenuActivityController;
import com.android.wm.shell.pip.phone.PipMotionHelper;
import com.android.wm.shell.pip.phone.PipUpdateThread;
import com.android.wm.shell.pip.phone.PipUtils;
import com.android.wm.shell.splitscreen.SplitScreen;

import java.io.PrintWriter;
@@ -339,7 +338,7 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener,
    public Rect startSwipePipToHome(ComponentName componentName, ActivityInfo activityInfo,
            PictureInPictureParams pictureInPictureParams) {
        mShouldIgnoreEnteringPipTransition = true;
        mState = State.ENTERING_PIP;
        sendOnPipTransitionStarted(componentName, TRANSITION_DIRECTION_TO_PIP);
        mPipBoundsState.setLastPipComponentName(componentName);
        mPipBoundsState.setAspectRatio(getAspectRatioOrDefault(pictureInPictureParams));
        return mPipBoundsHandler.getDestinationBounds(null /* bounds */,
@@ -351,8 +350,11 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener,
     * Expect {@link #onTaskAppeared(ActivityManager.RunningTaskInfo, SurfaceControl)} afterwards.
     */
    public void stopSwipePipToHome(ComponentName componentName, Rect destinationBounds) {
        // do nothing if there is no startSwipePipToHome being called before
        if (mShouldIgnoreEnteringPipTransition) {
            mPipBoundsState.setBounds(destinationBounds);
        }
    }

    /**
     * Expands PiP to the previous bounds, this is done in two phases using
@@ -494,11 +496,9 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener,
        }

        if (mShouldIgnoreEnteringPipTransition) {
            // Animation has been finished together with Recents, directly apply the sync
            // transaction to PiP here.
            applyEnterPipSyncTransaction(mPipBoundsState.getBounds(), () -> {
                mState = State.ENTERED_PIP;
            });
            // animation is finished in the Launcher and here we directly apply the final touch.
            applyEnterPipSyncTransaction(mPipBoundsState.getBounds(),
                    () -> sendOnPipTransitionFinished(TRANSITION_DIRECTION_TO_PIP));
            mShouldIgnoreEnteringPipTransition = false;
            return;
        }
@@ -589,11 +589,19 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener,

    private void sendOnPipTransitionStarted(
            @PipAnimationController.TransitionDirection int direction) {
        sendOnPipTransitionStarted(mTaskInfo.baseActivity, direction);
    }

    private void sendOnPipTransitionStarted(ComponentName componentName,
            @PipAnimationController.TransitionDirection int direction) {
        if (direction == TRANSITION_DIRECTION_TO_PIP) {
            mState = State.ENTERING_PIP;
        }
        final Rect pipBounds = mPipBoundsState.getBounds();
        runOnMainHandler(() -> {
            for (int i = mPipTransitionCallbacks.size() - 1; i >= 0; i--) {
                final PipTransitionCallback callback = mPipTransitionCallbacks.get(i);
                callback.onPipTransitionStarted(mTaskInfo.baseActivity, direction, pipBounds);
                callback.onPipTransitionStarted(componentName, direction, pipBounds);
            }
        });
    }
@@ -703,6 +711,7 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener,
            return;
        }
        mShouldDeferEnteringPip = false;
        mShouldIgnoreEnteringPipTransition = false;
        mPictureInPictureParams = null;
        mState = State.UNDEFINED;
        mPipUiEventLoggerLogger.setTaskInfo(null);
@@ -1081,7 +1090,6 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener,
        return WINDOWING_MODE_UNDEFINED;
    }


    private void animateResizePip(Rect currentBounds, Rect destinationBounds, Rect sourceHintRect,
            @PipAnimationController.TransitionDirection int direction, int durationMs) {
        if (Looper.myLooper() != mUpdateHandler.getLooper()) {
+16 −0
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@
package com.android.systemui.shared.system;

import android.app.ActivityManager.TaskSnapshot;
import android.graphics.Rect;
import android.os.RemoteException;
import android.util.Log;
import android.view.IRecentsAnimationController;
@@ -69,6 +70,21 @@ public class RecentsAnimationControllerCompat {
        }
    }

    /**
     * Sets the final bounds on a Task. This is used by Launcher to notify the system that
     * animating Activity to PiP has completed and the associated task surface should be updated
     * accordingly. This should be called before `finish`
     * @param taskId Task id of the Activity in PiP mode.
     * @param destinationBounds Bounds of the PiP window on home.
     */
    public void setFinishTaskBounds(int taskId, Rect destinationBounds) {
        try {
            mAnimationController.setFinishTaskBounds(taskId, destinationBounds);
        } catch (RemoteException e) {
            Log.d(TAG, "Failed to set finish task bounds", e);
        }
    }

    /**
     * Finish the current recents animation.
     * @param toHome Going to home or back to the previous app.
+36 −1
Original line number Diff line number Diff line
@@ -213,6 +213,26 @@ public class RecentsAnimationController implements DeathRecipient {
            }
        }

        @Override
        public void setFinishTaskBounds(int taskId, Rect destinationBounds) {
            ProtoLog.d(WM_DEBUG_RECENTS_ANIMATIONS,
                    "setFinishTaskBounds(%d): bounds=%s", taskId, destinationBounds);
            final long token = Binder.clearCallingIdentity();
            try {
                synchronized (mService.getWindowManagerLock()) {
                    for (int i = mPendingAnimations.size() - 1; i >= 0; i--) {
                        final TaskAnimationAdapter taskAdapter = mPendingAnimations.get(i);
                        if (taskAdapter.mTask.mTaskId == taskId) {
                            taskAdapter.mFinishBounds.set(destinationBounds);
                            break;
                        }
                    }
                }
            } finally {
                Binder.restoreCallingIdentity(token);
            }
        }

        @Override
        public void finish(boolean moveHomeToTop, boolean sendUserLeaveHint) {
            ProtoLog.d(WM_DEBUG_RECENTS_ANIMATIONS,
@@ -739,6 +759,7 @@ public class RecentsAnimationController implements DeathRecipient {
                taskAdapter.mTask.dontAnimateDimExit();
            }
            removeAnimation(taskAdapter);
            taskAdapter.maybeApplyFinishBounds();
        }

        for (int i = mPendingWallpaperAnimations.size() - 1; i >= 0; i--) {
@@ -925,7 +946,9 @@ public class RecentsAnimationController implements DeathRecipient {
        private RemoteAnimationTarget mTarget;
        private final Rect mBounds = new Rect();
        // The bounds of the target relative to its parent.
        private Rect mLocalBounds = new Rect();
        private final Rect mLocalBounds = new Rect();
        // The bounds of the target when animation is finished
        private final Rect mFinishBounds = new Rect();

        TaskAnimationAdapter(Task task, boolean isRecentTaskInvisible) {
            mTask = task;
@@ -960,6 +983,17 @@ public class RecentsAnimationController implements DeathRecipient {
            return mTarget;
        }

        void maybeApplyFinishBounds() {
            if (!mFinishBounds.isEmpty()) {
                final SurfaceControl taskSurface = mTask.getSurfaceControl();
                mTask.getPendingTransaction()
                        .setPosition(taskSurface, mFinishBounds.left, mFinishBounds.top)
                        .setWindowCrop(taskSurface, mFinishBounds.width(), mFinishBounds.height())
                        .apply();
                mFinishBounds.setEmpty();
            }
        }

        @Override
        public boolean getShowWallpaper() {
            return false;
@@ -1005,6 +1039,7 @@ public class RecentsAnimationController implements DeathRecipient {
            }
            pw.println("mIsRecentTaskInvisible=" + mIsRecentTaskInvisible);
            pw.println("mLocalBounds=" + mLocalBounds);
            pw.println("mFinishBounds=" + mFinishBounds);
            pw.println("mBounds=" + mBounds);
            pw.println("mIsRecentTaskInvisible=" + mIsRecentTaskInvisible);
        }