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

Commit 95807be5 authored by Ikram Gabiyev's avatar Ikram Gabiyev
Browse files

Implement legacy enter-pip2 w/o animation

Implement the enter PiP flow with auto-enter
flag off, i.e. legacy-enter-pip. Queue and start
a separate TRANSIT_PIP transition when client
requests enterPictureInPictureMode() via onUserLeaveHint().

Bug: 316218531
Test: manually enter PiP with auto-enter flag off

Change-Id: Iefd6b0f095e0e1ad6a57cc4ca554da86bae2e780
parent 1d00de07
Loading
Loading
Loading
Loading
+0 −1
Original line number Diff line number Diff line
@@ -122,7 +122,6 @@ import android.view.WindowInsets.Side.InsetsSide;
import android.view.WindowInsets.Type;
import android.view.WindowInsets.Type.InsetsType;
import android.view.accessibility.AccessibilityNodeInfo;
import android.window.ITrustedPresentationListener;
import android.window.TaskFpsCallback;
import android.window.TrustedPresentationThresholds;

+1 −1
Original line number Diff line number Diff line
@@ -96,7 +96,7 @@ public class PipScheduler {

    @Nullable
    private WindowContainerTransaction getExitPipViaExpandTransaction() {
        if (mPipTaskToken == null || mPinnedTaskLeash == null) {
        if (mPipTaskToken == null) {
            return null;
        }
        WindowContainerTransaction wct = new WindowContainerTransaction();
+66 −17
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ package com.android.wm.shell.pip2.phone;

import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED;
import static android.view.WindowManager.TRANSIT_OPEN;
import static android.view.WindowManager.TRANSIT_PIP;

import static com.android.wm.shell.transition.Transitions.TRANSIT_EXIT_PIP;

@@ -56,6 +57,8 @@ public class PipTransition extends PipTransitionController {
    private IBinder mAutoEnterButtonNavTransition;
    @Nullable
    private IBinder mExitViaExpandTransition;
    @Nullable
    private IBinder mLegacyEnterTransition;

    public PipTransition(
            @NonNull ShellInit shellInit,
@@ -98,6 +101,9 @@ public class PipTransition extends PipTransitionController {
        if (isAutoEnterInButtonNavigation(request)) {
            mAutoEnterButtonNavTransition = transition;
            return getEnterPipTransaction(transition, request);
        } else if (isLegacyEnter(request)) {
            mLegacyEnterTransition = transition;
            return getEnterPipTransaction(transition, request);
        }
        return null;
    }
@@ -108,6 +114,9 @@ public class PipTransition extends PipTransitionController {
        if (isAutoEnterInButtonNavigation(request)) {
            outWct.merge(getEnterPipTransaction(transition, request), true /* transfer */);
            mAutoEnterButtonNavTransition = transition;
        } else if (isLegacyEnter(request)) {
            outWct.merge(getEnterPipTransaction(transition, request), true /* transfer */);
            mLegacyEnterTransition = transition;
        }
    }

@@ -153,6 +162,10 @@ public class PipTransition extends PipTransitionController {
                && pipTask.pictureInPictureParams.isAutoEnterEnabled();
    }

    private boolean isLegacyEnter(@NonNull TransitionRequestInfo requestInfo) {
        return requestInfo.getType() == TRANSIT_PIP;
    }

    @Override
    public boolean startAnimation(@NonNull IBinder transition,
            @NonNull TransitionInfo info,
@@ -161,6 +174,23 @@ public class PipTransition extends PipTransitionController {
            @NonNull Transitions.TransitionFinishCallback finishCallback) {
        if (transition == mAutoEnterButtonNavTransition) {
            mAutoEnterButtonNavTransition = null;
            return startAutoEnterButtonNavAnimation(info, startTransaction, finishTransaction,
                    finishCallback);
        } else if (transition == mLegacyEnterTransition) {
            mLegacyEnterTransition = null;
            return startLegacyEnterAnimation(info, startTransaction, finishTransaction,
                    finishCallback);
        } else if (transition == mExitViaExpandTransition) {
            mExitViaExpandTransition = null;
            return startExpandAnimation(info, startTransaction, finishTransaction, finishCallback);
        }
        return false;
    }

    private boolean startAutoEnterButtonNavAnimation(@NonNull TransitionInfo info,
            @NonNull SurfaceControl.Transaction startTransaction,
            @NonNull SurfaceControl.Transaction finishTransaction,
            @NonNull Transitions.TransitionFinishCallback finishCallback) {
        TransitionInfo.Change pipChange = getPipChange(info);
        if (pipChange == null) {
            return false;
@@ -169,19 +199,38 @@ public class PipTransition extends PipTransitionController {

        // cache the PiP task token and leash
        mPipScheduler.setPipTaskToken(mPipTaskToken);
            mPipScheduler.setPinnedTaskLeash(pipChange.getLeash());

        startTransaction.apply();
        finishCallback.onTransitionFinished(null);
        return true;
        } else if (transition == mExitViaExpandTransition) {
            mExitViaExpandTransition = null;
    }

    private boolean startLegacyEnterAnimation(@NonNull TransitionInfo info,
            @NonNull SurfaceControl.Transaction startTransaction,
            @NonNull SurfaceControl.Transaction finishTransaction,
            @NonNull Transitions.TransitionFinishCallback finishCallback) {
        TransitionInfo.Change pipChange = getPipChange(info);
        if (pipChange == null) {
            return false;
        }
        mPipTaskToken = pipChange.getContainer();

        // cache the PiP task token and leash
        mPipScheduler.setPipTaskToken(mPipTaskToken);

        startTransaction.apply();
        finishCallback.onTransitionFinished(null);
            onExitPip();
        return true;
    }
        return false;

    private boolean startExpandAnimation(@NonNull TransitionInfo info,
            @NonNull SurfaceControl.Transaction startTransaction,
            @NonNull SurfaceControl.Transaction finishTransaction,
            @NonNull Transitions.TransitionFinishCallback finishCallback) {
        startTransaction.apply();
        finishCallback.onTransitionFinished(null);
        onExitPip();
        return true;
    }

    @Nullable
+15 −0
Original line number Diff line number Diff line
@@ -3695,6 +3695,21 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
        boolean originallyFromClient = fromClient
                && (!r.isState(PAUSING) || params.isAutoEnterEnabled());

        // If PiP2 flag is on and client-request to enter PiP came via onUserLeaveHint(),
        // we request a direct transition from Shell to TRANSIT_PIP_LEGACY to get the startWct
        // with the right entry bounds.
        if (isPip2ExperimentEnabled() && !originallyFromClient && !params.isAutoEnterEnabled()) {
            final Transition legacyEnterPipTransition = new Transition(TRANSIT_PIP,
                    0 /* flags */, getTransitionController(),
                    mWindowManager.mSyncEngine);
            legacyEnterPipTransition.setPipActivity(r);
            getTransitionController().startCollectOrQueue(legacyEnterPipTransition, (deferred) -> {
                getTransitionController().requestStartTransition(legacyEnterPipTransition,
                        r.getTask(), null /* remoteTransition */, null /* displayChange */);
            });
            return true;
        }

        // Create a transition only for this pip entry if it is coming from the app without the
        // system requesting that the app enter-pip. If the system requested it, that means it
        // should be part of that transition if possible.
+3 −3
Original line number Diff line number Diff line
@@ -731,9 +731,9 @@ class TransitionController {
            }

            // set the pip task in the request if provided
            if (mCollectingTransition.getPipActivity() != null) {
                pipTaskInfo = mCollectingTransition.getPipActivity().getTask().getTaskInfo();
                mCollectingTransition.setPipActivity(null);
            if (transition.getPipActivity() != null) {
                pipTaskInfo = transition.getPipActivity().getTask().getTaskInfo();
                transition.setPipActivity(null);
            }

            final TransitionRequestInfo request = new TransitionRequestInfo(transition.mType,