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

Commit b576702e authored by Hongwei Wang's avatar Hongwei Wang
Browse files

Do not reset surface when entering PiP

When UnfoldAnimationController is present and entering PiP from a Task
with multiple activities, the resetTask within UnfoldAnimationController
could conflict with the PiP animation and cause flicker.

Fixed this by ignoring restTask in UnfoldAnimationController if there is
no state change going on.

Bug: 261996076
Test: Enter PiP from Task with multi-Activity on foldables
Change-Id: I7f13e86d030d427383e65a37efde13ec94dea2a8
parent 6680d5cd
Loading
Loading
Loading
Loading
+13 −7
Original line number Diff line number Diff line
@@ -16,8 +16,6 @@

package com.android.wm.shell.unfold;

import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED;

import android.annotation.NonNull;
import android.app.ActivityManager.RunningTaskInfo;
import android.app.TaskInfo;
@@ -56,6 +54,12 @@ public class UnfoldAnimationController implements UnfoldListener {
    private final SparseArray<SurfaceControl> mTaskSurfaces = new SparseArray<>();
    private final SparseArray<UnfoldTaskAnimator> mAnimatorsByTaskId = new SparseArray<>();

    /**
     * Indicates whether we're in stage change process. This should be set to {@code true} in
     * {@link #onStateChangeStarted()} and {@code false} in {@link #onStateChangeFinished()}.
     */
    private boolean mIsInStageChange;

    public UnfoldAnimationController(
            @NonNull ShellInit shellInit,
            @NonNull TransactionPool transactionPool,
@@ -123,7 +127,7 @@ public class UnfoldAnimationController implements UnfoldListener {
                animator.onTaskChanged(taskInfo);
            } else {
                // Became inapplicable
                resetTask(animator, taskInfo);
                maybeResetTask(animator, taskInfo);
                animator.onTaskVanished(taskInfo);
                mAnimatorsByTaskId.remove(taskInfo.taskId);
            }
@@ -154,7 +158,7 @@ public class UnfoldAnimationController implements UnfoldListener {
        final boolean isCurrentlyApplicable = animator != null;

        if (isCurrentlyApplicable) {
            resetTask(animator, taskInfo);
            maybeResetTask(animator, taskInfo);
            animator.onTaskVanished(taskInfo);
            mAnimatorsByTaskId.remove(taskInfo.taskId);
        }
@@ -166,6 +170,7 @@ public class UnfoldAnimationController implements UnfoldListener {
            return;
        }

        mIsInStageChange = true;
        SurfaceControl.Transaction transaction = null;
        for (int i = 0; i < mAnimators.size(); i++) {
            final UnfoldTaskAnimator animator = mAnimators.get(i);
@@ -219,11 +224,12 @@ public class UnfoldAnimationController implements UnfoldListener {
        transaction.apply();

        mTransactionPool.release(transaction);
        mIsInStageChange = false;
    }

    private void resetTask(UnfoldTaskAnimator animator, TaskInfo taskInfo) {
        if (taskInfo.getWindowingMode() == WINDOWING_MODE_PINNED) {
            // PiP task has its own cleanup path, ignore surface reset to avoid conflict.
    private void maybeResetTask(UnfoldTaskAnimator animator, TaskInfo taskInfo) {
        if (!mIsInStageChange) {
            // No need to resetTask if there is no ongoing state change.
            return;
        }
        final SurfaceControl.Transaction transaction = mTransactionPool.acquire();