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

Commit b4056cde authored by Vinit Nayak's avatar Vinit Nayak
Browse files

Pass through onTransitionConsumed in OneShotRemoteHandler

* Needed for Launcher to have a signal of when a transition
has completed and uses this as a signal for a transition failure

Bug: 276361926
Change-Id: I414aff42aebc9f89efc2c360e57faff65c2dc2f5
parent 6b49b83a
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -59,4 +59,12 @@ oneway interface IRemoteTransition {
    void mergeAnimation(in IBinder transition, in TransitionInfo info,
            in SurfaceControl.Transaction t, in IBinder mergeTarget,
            in IRemoteTransitionFinishedCallback finishCallback);

    /**
     * Called when a different handler has consumed the transition
     *
     * @param transition An identifier for the transition that was consumed.
     * @param aborted Whether the transition is aborted or not.
     */
    void onTransitionConsumed(in IBinder transition, in boolean aborted);
}
+12 −5
Original line number Diff line number Diff line
@@ -2693,7 +2693,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
            @NonNull Transitions.TransitionFinishCallback finishCallback) {
        boolean shouldAnimate = true;
        if (mSplitTransitions.isPendingEnter(transition)) {
            shouldAnimate = startPendingEnterAnimation(
            shouldAnimate = startPendingEnterAnimation(transition,
                    mSplitTransitions.mPendingEnter, info, startTransaction, finishTransaction);
        } else if (mSplitTransitions.isPendingDismiss(transition)) {
            final SplitScreenTransitions.DismissSession dismiss = mSplitTransitions.mPendingDismiss;
@@ -2732,7 +2732,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
        }
    }

    private boolean startPendingEnterAnimation(
    private boolean startPendingEnterAnimation(@NonNull IBinder transition,
            @NonNull SplitScreenTransitions.EnterSession enterTransition,
            @NonNull TransitionInfo info, @NonNull SurfaceControl.Transaction t,
            @NonNull SurfaceControl.Transaction finishT) {
@@ -2761,21 +2761,22 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
            }
        }

        if (mSplitTransitions.mPendingEnter.mExtraTransitType
        SplitScreenTransitions.EnterSession pendingEnter = mSplitTransitions.mPendingEnter;
        if (pendingEnter.mExtraTransitType
                == TRANSIT_SPLIT_SCREEN_OPEN_TO_SIDE) {
            // Open to side should only be used when split already active and foregorund.
            if (mainChild == null && sideChild == null) {
                Log.w(TAG, splitFailureMessage("startPendingEnterAnimation",
                        "Launched a task in split, but didn't receive any task in transition."));
                // This should happen when the target app is already on front, so just cancel.
                mSplitTransitions.mPendingEnter.cancel(null);
                pendingEnter.cancel(null);
                return true;
            }
        } else {
            if (mainChild == null || sideChild == null) {
                final int dismissTop = mainChild != null ? STAGE_TYPE_MAIN :
                        (sideChild != null ? STAGE_TYPE_SIDE : STAGE_TYPE_UNDEFINED);
                mSplitTransitions.mPendingEnter.cancel(
                pendingEnter.cancel(
                        (cancelWct, cancelT) -> prepareExitSplitScreen(dismissTop, cancelWct));
                Log.w(TAG, splitFailureMessage("startPendingEnterAnimation",
                        "launched 2 tasks in split, but didn't receive "
@@ -2786,6 +2787,12 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
                if (mRecentTasks.isPresent() && sideChild != null) {
                    mRecentTasks.get().removeSplitPair(sideChild.getTaskInfo().taskId);
                }
                if (pendingEnter.mRemoteHandler != null) {
                    // Pass false for aborted since WM didn't abort, business logic chose to
                    // terminate/exit early
                    pendingEnter.mRemoteHandler.onTransitionConsumed(transition,
                            false /*aborted*/, finishT);
                }
                mSplitUnsupportedToast.show();
                return true;
            }
+10 −0
Original line number Diff line number Diff line
@@ -151,6 +151,16 @@ public class OneShotRemoteHandler implements Transitions.TransitionHandler {
        return new WindowContainerTransaction();
    }

    @Override
    public void onTransitionConsumed(@NonNull IBinder transition, boolean aborted,
            @Nullable SurfaceControl.Transaction finishTransaction) {
        try {
            mRemote.getRemoteTransition().onTransitionConsumed(transition, aborted);
        } catch (RemoteException e) {
            Log.e(Transitions.TAG, "Error calling onTransitionConsumed()", e);
        }
    }

    @Override
    public String toString() {
        return "OneShotRemoteHandler:" + mRemote.getDebugName() + ":"
+10 −1
Original line number Diff line number Diff line
@@ -86,7 +86,16 @@ public class RemoteTransitionHandler implements Transitions.TransitionHandler {
    @Override
    public void onTransitionConsumed(@NonNull IBinder transition, boolean aborted,
            @Nullable SurfaceControl.Transaction finishT) {
        mRequestedRemotes.remove(transition);
        RemoteTransition remoteTransition = mRequestedRemotes.remove(transition);
        if (remoteTransition == null) {
            return;
        }

        try {
            remoteTransition.getRemoteTransition().onTransitionConsumed(transition, aborted);
        } catch (RemoteException e) {
            Log.e(TAG, "Error delegating onTransitionConsumed()", e);
        }
    }

    @Override
+24 −0
Original line number Diff line number Diff line
@@ -206,6 +206,30 @@ public class SplitTransitionTests extends ShellTestCase {
        assertTrue(testRemote.isCalled());
    }

    @Test
    @UiThreadTest
    public void testRemoteTransitionConsumed() {
        // Omit side child change
        TransitionInfo info = new TransitionInfoBuilder(TRANSIT_OPEN, 0)
                .addChange(TRANSIT_OPEN, mMainChild)
                .build();
        TestRemoteTransition testRemote = new TestRemoteTransition();

        IBinder transition = mSplitScreenTransitions.startEnterTransition(
                TRANSIT_OPEN, new WindowContainerTransaction(),
                new RemoteTransition(testRemote, "Test"), mStageCoordinator,
                TRANSIT_SPLIT_SCREEN_PAIR_OPEN, false);
        mMainStage.onTaskAppeared(mMainChild, createMockSurface());
        boolean accepted = mStageCoordinator.startAnimation(transition, info,
                mock(SurfaceControl.Transaction.class),
                mock(SurfaceControl.Transaction.class),
                mock(Transitions.TransitionFinishCallback.class));
        assertTrue(accepted);

        assertTrue(testRemote.isConsumed());

    }

    @Test
    @UiThreadTest
    public void testMonitorInSplit() {
Loading