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

Commit 15036ca5 authored by Winson Chung's avatar Winson Chung
Browse files

Update the task stack state when resizing the tasks after the PiP animation

- When the animation into PiP ends, we clear the task stack state and
  request a layout prior to resizing the the stack to update the task
  bounds to the stack bounds. This triggers a relayout from the client,
  which fetches the new configuration prior to handling the PiP mode/config
  change scheduled as a part of the PiP mode change.

  We can instead update the task stack state when we resize the tasks to
  ensure that we don't relayout multiple times.

Bug: 75995355
Test: atest CtsActivityManagerDeviceTestCases:ActivityManagerPinnedStackTests


Change-Id: I58a6e30651f16b85ec160e977554b8d091b461ec
parent f04b6c8d
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -134,7 +134,6 @@ import android.os.Looper;
import android.os.Message;
import android.os.RemoteException;
import android.os.SystemClock;
import android.os.Trace;
import android.os.UserHandle;
import android.service.voice.IVoiceInteractionSession;
import android.util.ArraySet;
@@ -4789,6 +4788,10 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai
        }
    }

    void onPipAnimationEndResize() {
        mWindowContainerController.onPipAnimationEndResize();
    }


    /**
     * Adjust bounds to stay within stack bounds.
+6 −0
Original line number Diff line number Diff line
@@ -2968,6 +2968,12 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
                insetBounds.right = tempPinnedTaskBounds.width();
                insetBounds.bottom = tempPinnedTaskBounds.height();
            }
            if (pinnedBounds != null && tempPinnedTaskBounds == null) {
                // We have finished the animation into PiP, and are resizing the tasks to match the
                // stack bounds, while layouts are deferred, update any task state as a part of
                // transitioning it from fullscreen into a floating state.
                stack.onPipAnimationEndResize();
            }
            stack.resize(pinnedBounds, tempPinnedTaskBounds, insetBounds);
            stack.ensureVisibleActivitiesConfigurationLocked(r, false);
        } finally {
+6 −0
Original line number Diff line number Diff line
@@ -192,6 +192,12 @@ public class StackWindowController
        }
    }

    public void onPipAnimationEndResize() {
        synchronized (mService.mWindowMap) {
            mContainer.onPipAnimationEndResize();
        }
    }

    /**
     * @see TaskStack.getStackDockedModeBoundsLocked(Rect, Rect, Rect, boolean)
     */
+12 −10
Original line number Diff line number Diff line
@@ -1667,16 +1667,6 @@ public class TaskStack extends WindowContainer<Task> implements
    @Override  // AnimatesBounds
    public void onAnimationEnd(boolean schedulePipModeChangedCallback, Rect finalStackSize,
            boolean moveToFullscreen) {
        // Hold the lock since this is called from the BoundsAnimator running on the UiThread
        synchronized (mService.mWindowMap) {
            mBoundsAnimating = false;
            for (int i = 0; i < mChildren.size(); i++) {
                final Task t = mChildren.get(i);
                t.clearPreserveNonFloatingState();
            }
            mService.requestTraversal();
        }

        if (inPinnedWindowingMode()) {
            // Update to the final bounds if requested. This is done here instead of in the bounds
            // animator to allow us to coordinate this after we notify the PiP mode changed
@@ -1706,6 +1696,18 @@ public class TaskStack extends WindowContainer<Task> implements
        }
    }

    /**
     * Called immediately prior to resizing the tasks at the end of the pinned stack animation.
     */
    public void onPipAnimationEndResize() {
        mBoundsAnimating = false;
        for (int i = 0; i < mChildren.size(); i++) {
            final Task t = mChildren.get(i);
            t.clearPreserveNonFloatingState();
        }
        mService.requestTraversal();
    }

    @Override
    public boolean shouldDeferStartOnMoveToFullscreen() {
        // Workaround for the recents animation -- normally we need to wait for the new activity to