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

Commit f276a6ff authored by Wale Ogunwale's avatar Wale Ogunwale
Browse files

Cancel Pip animation if stack is already removed

It is possible for the pinned stack to be removed before the system has
a chance to run the scheduled bounds animation on it. In this case we
should just cancel the animation.
Also fixed:
- Issue where we are synchronizing on the wrong object in
PinnedActivityStack.updatePictureInPictureModeForPinnedStackAnimation
- Issue where the enterPipRunnable in
ActivityTaskManagerService.enterPictureInPictureMode wasn't synchronized

Change-Id: I9717ac4b5849eafa6332fb0043310a0e8387a05f
Fixes: 110255768
Test: atest ActivityManagerActivityVisibilityTests#testHomeVisibleOnActivityTaskPinned
parent 5148582e
Loading
Loading
Loading
Loading
+17 −14
Original line number Diff line number Diff line
@@ -2807,20 +2807,23 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
                }

                final Runnable enterPipRunnable = () -> {
                    synchronized (mGlobalLock) {
                        // Only update the saved args from the args that are set
                        r.pictureInPictureArgs.copyOnlySet(params);
                        final float aspectRatio = r.pictureInPictureArgs.getAspectRatio();
                        final List<RemoteAction> actions = r.pictureInPictureArgs.getActions();
                        // Adjust the source bounds by the insets for the transition down
                    final Rect sourceBounds = new Rect(r.pictureInPictureArgs.getSourceRectHint());
                    mStackSupervisor.moveActivityToPinnedStackLocked(r, sourceBounds, aspectRatio,
                            "enterPictureInPictureMode");
                        final Rect sourceBounds = new Rect(
                                r.pictureInPictureArgs.getSourceRectHint());
                        mStackSupervisor.moveActivityToPinnedStackLocked(
                                r, sourceBounds, aspectRatio, "enterPictureInPictureMode");
                        final PinnedActivityStack stack = r.getStack();
                        stack.setPictureInPictureAspectRatio(aspectRatio);
                        stack.setPictureInPictureActions(actions);
                        MetricsLoggerWrapper.logPictureInPictureEnter(mContext, r.appInfo.uid,
                                r.shortComponentName, r.supportsEnterPipOnTaskSwitch);
                        logPictureInPictureArgs(params);
                    }
                };

                if (mAm.isKeyguardLocked()) {
+1 −1
Original line number Diff line number Diff line
@@ -100,7 +100,7 @@ class PinnedActivityStack extends ActivityStack<PinnedStackWindowController>
        // It is guaranteed that the activities requiring the update will be in the pinned stack at
        // this point (either reparented before the animation into PiP, or before reparenting after
        // the animation out of PiP)
        synchronized(this) {
        synchronized (mService) {
            ArrayList<TaskRecord> tasks = getAllTasks();
            for (int i = 0; i < tasks.size(); i++ ) {
                mStackSupervisor.updatePictureInPictureMode(tasks.get(i), targetStackBounds,
+6 −0
Original line number Diff line number Diff line
@@ -196,6 +196,12 @@ public class BoundsAnimationController {

        @Override
        public void onAnimationStart(Animator animation) {
            if (!mTarget.isAttached()) {
                // No point of trying to animate something that isn't attached to the hierarchy
                // anymore.
                cancel();
            }

            if (DEBUG) Slog.d(TAG, "onAnimationStart: mTarget=" + mTarget
                    + " mPrevSchedulePipModeChangedState=" + mPrevSchedulePipModeChangedState
                    + " mSchedulePipModeChangedState=" + mSchedulePipModeChangedState);
+5 −0
Original line number Diff line number Diff line
@@ -65,4 +65,9 @@ interface BoundsAnimationTarget {
     */
    void onAnimationEnd(boolean schedulePipModeChangedCallback, Rect finalStackSize,
            boolean moveToFullscreen);

    /** @return True if the target is attached to the window hierarchy. */
    default boolean isAttached() {
        return true;
    }
}
+5 −0
Original line number Diff line number Diff line
@@ -1703,6 +1703,11 @@ public class TaskStack extends WindowContainer<Task> implements
        }
    }

    @Override
    public boolean isAttached() {
        return mDisplayContent != null;
    }

    /**
     * Called immediately prior to resizing the tasks at the end of the pinned stack animation.
     */