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

Commit eb51c3bd authored by Evan Rosky's avatar Evan Rosky Committed by Android (Google) Code Review
Browse files

Merge "Add mixed-handler for unfold and mix in pip state" into udc-dev

parents a0bbc289 0dd85ecb
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -536,9 +536,11 @@ public abstract class WMShellModule {
            Optional<PipTouchHandler> pipTouchHandlerOptional,
            Optional<RecentsTransitionHandler> recentsTransitionHandler,
            KeyguardTransitionHandler keyguardTransitionHandler,
            Optional<UnfoldTransitionHandler> unfoldHandler,
            Transitions transitions) {
        return new DefaultMixedHandler(shellInit, transitions, splitScreenOptional,
                pipTouchHandlerOptional, recentsTransitionHandler, keyguardTransitionHandler);
                pipTouchHandlerOptional, recentsTransitionHandler, keyguardTransitionHandler,
                unfoldHandler);
    }

    @WMSingleton
+51 −1
Original line number Diff line number Diff line
@@ -51,6 +51,7 @@ import com.android.wm.shell.recents.RecentsTransitionHandler;
import com.android.wm.shell.splitscreen.SplitScreenController;
import com.android.wm.shell.splitscreen.StageCoordinator;
import com.android.wm.shell.sysui.ShellInit;
import com.android.wm.shell.unfold.UnfoldTransitionHandler;
import com.android.wm.shell.util.TransitionUtil;

import java.util.ArrayList;
@@ -68,6 +69,7 @@ public class DefaultMixedHandler implements Transitions.TransitionHandler,
    private RecentsTransitionHandler mRecentsHandler;
    private StageCoordinator mSplitHandler;
    private final KeyguardTransitionHandler mKeyguardHandler;
    private UnfoldTransitionHandler mUnfoldHandler;

    private static class MixedTransition {
        static final int TYPE_ENTER_PIP_FROM_SPLIT = 1;
@@ -84,6 +86,9 @@ public class DefaultMixedHandler implements Transitions.TransitionHandler,
        /** Keyguard exit/occlude/unocclude transition. */
        static final int TYPE_KEYGUARD = 5;

        /** Fuld/Unfold transition. */
        static final int TYPE_UNFOLD = 6;

        /** The default animation for this mixed transition. */
        static final int ANIM_TYPE_DEFAULT = 0;

@@ -135,7 +140,8 @@ public class DefaultMixedHandler implements Transitions.TransitionHandler,
            Optional<SplitScreenController> splitScreenControllerOptional,
            Optional<PipTouchHandler> pipTouchHandlerOptional,
            Optional<RecentsTransitionHandler> recentsHandlerOptional,
            KeyguardTransitionHandler keyguardHandler) {
            KeyguardTransitionHandler keyguardHandler,
            Optional<UnfoldTransitionHandler> unfoldHandler) {
        mPlayer = player;
        mKeyguardHandler = keyguardHandler;
        if (Transitions.ENABLE_SHELL_TRANSITIONS && pipTouchHandlerOptional.isPresent()
@@ -152,6 +158,7 @@ public class DefaultMixedHandler implements Transitions.TransitionHandler,
                if (mRecentsHandler != null) {
                    mRecentsHandler.addMixer(this);
                }
                mUnfoldHandler = unfoldHandler.orElse(null);
            }, this);
        }
    }
@@ -215,6 +222,16 @@ public class DefaultMixedHandler implements Transitions.TransitionHandler,
            mixed.mLeftoversHandler = handler.first;
            mActiveTransitions.add(mixed);
            return handler.second;
        } else if (mUnfoldHandler != null && mUnfoldHandler.hasUnfold(request)) {
            final WindowContainerTransaction wct =
                    mUnfoldHandler.handleRequest(transition, request);
            if (wct != null) {
                final MixedTransition mixed = new MixedTransition(
                        MixedTransition.TYPE_UNFOLD, transition);
                mixed.mLeftoversHandler = mUnfoldHandler;
                mActiveTransitions.add(mixed);
            }
            return wct;
        }
        return null;
    }
@@ -322,6 +339,8 @@ public class DefaultMixedHandler implements Transitions.TransitionHandler,
        } else if (mixed.mType == MixedTransition.TYPE_KEYGUARD) {
            return animateKeyguard(mixed, info, startTransaction, finishTransaction,
                    finishCallback);
        } else if (mixed.mType == MixedTransition.TYPE_UNFOLD) {
            return animateUnfold(mixed, info, startTransaction, finishTransaction, finishCallback);
        } else {
            mActiveTransitions.remove(mixed);
            throw new IllegalStateException("Starting mixed animation without a known mixed type? "
@@ -606,6 +625,33 @@ public class DefaultMixedHandler implements Transitions.TransitionHandler,
        return true;
    }

    private boolean animateUnfold(@NonNull final MixedTransition mixed,
            @NonNull TransitionInfo info,
            @NonNull SurfaceControl.Transaction startTransaction,
            @NonNull SurfaceControl.Transaction finishTransaction,
            @NonNull Transitions.TransitionFinishCallback finishCallback) {
        final Transitions.TransitionFinishCallback finishCB = (wct, wctCB) -> {
            mixed.mInFlightSubAnimations--;
            if (mixed.mInFlightSubAnimations > 0) return;
            mActiveTransitions.remove(mixed);
            finishCallback.onTransitionFinished(wct, wctCB);
        };
        mixed.mInFlightSubAnimations = 1;
        if (!mUnfoldHandler.startAnimation(
                mixed.mTransition, info, startTransaction, finishTransaction, finishCB)) {
            return false;
        }
        // Sync pip state.
        if (mPipHandler != null) {
            // We don't know when to apply `startTransaction` so use a separate transaction here.
            // This should be fine because these surface properties are independent.
            final SurfaceControl.Transaction t = new SurfaceControl.Transaction();
            mPipHandler.syncPipSurfaceState(info, t, finishTransaction);
            t.apply();
        }
        return true;
    }

    /** Use to when split use intent to enter, check if this enter transition should be mixed or
     * not.*/
    public boolean shouldSplitEnterMixed(PendingIntent intent) {
@@ -665,6 +711,8 @@ public class DefaultMixedHandler implements Transitions.TransitionHandler,
                        finishCallback);
            } else if (mixed.mType == MixedTransition.TYPE_KEYGUARD) {
                mKeyguardHandler.mergeAnimation(transition, info, t, mergeTarget, finishCallback);
            } else if (mixed.mType == MixedTransition.TYPE_UNFOLD) {
                mUnfoldHandler.mergeAnimation(transition, info, t, mergeTarget, finishCallback);
            } else {
                throw new IllegalStateException("Playing a mixed transition with unknown type? "
                        + mixed.mType);
@@ -690,6 +738,8 @@ public class DefaultMixedHandler implements Transitions.TransitionHandler,
            mixed.mLeftoversHandler.onTransitionConsumed(transition, aborted, finishT);
        } else if (mixed.mType == MixedTransition.TYPE_KEYGUARD) {
            mKeyguardHandler.onTransitionConsumed(transition, aborted, finishT);
        } else if (mixed.mType == MixedTransition.TYPE_UNFOLD) {
            mUnfoldHandler.onTransitionConsumed(transition, aborted, finishT);
        }
    }
}
+8 −2
Original line number Diff line number Diff line
@@ -197,12 +197,18 @@ public class UnfoldTransitionHandler implements TransitionHandler, UnfoldListene
        }
    }

    /** Whether `request` contains an unfold action. */
    public boolean hasUnfold(@NonNull TransitionRequestInfo request) {
        return (request.getType() == TRANSIT_CHANGE
                && request.getDisplayChange() != null
                && request.getDisplayChange().isPhysicalDisplayChanged());
    }

    @Nullable
    @Override
    public WindowContainerTransaction handleRequest(@NonNull IBinder transition,
            @NonNull TransitionRequestInfo request) {
        if (request.getType() == TRANSIT_CHANGE && request.getDisplayChange() != null
                && request.getDisplayChange().isPhysicalDisplayChanged()) {
        if (hasUnfold(request)) {
            mTransition = transition;
            return new WindowContainerTransaction();
        }