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

Commit a405d20f authored by An An Yu's avatar An An Yu Committed by Automerger Merge Worker
Browse files

Merge "Implement merge animations for AE Shell animation." into udc-dev am:...

Merge "Implement merge animations for AE Shell animation." into udc-dev am: 0b922022 am: 35b393dd am: 2768b5ee

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/23127831



Change-Id: I6d161c320522f03647b26fd29ed918f74450f7fc
Signed-off-by: default avatarAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
parents 47ddae52 2768b5ee
Loading
Loading
Loading
Loading
+18 −1
Original line number Original line Diff line number Diff line
@@ -61,6 +61,9 @@ class ActivityEmbeddingAnimationRunner {
    @VisibleForTesting
    @VisibleForTesting
    final ActivityEmbeddingAnimationSpec mAnimationSpec;
    final ActivityEmbeddingAnimationSpec mAnimationSpec;


    @Nullable
    private Animator mActiveAnimator;

    ActivityEmbeddingAnimationRunner(@NonNull Context context,
    ActivityEmbeddingAnimationRunner(@NonNull Context context,
            @NonNull ActivityEmbeddingController controller) {
            @NonNull ActivityEmbeddingController controller) {
        mController = controller;
        mController = controller;
@@ -75,8 +78,10 @@ class ActivityEmbeddingAnimationRunner {
        // applied to make sure the surface is ready.
        // applied to make sure the surface is ready.
        final List<Consumer<SurfaceControl.Transaction>> postStartTransactionCallbacks =
        final List<Consumer<SurfaceControl.Transaction>> postStartTransactionCallbacks =
                new ArrayList<>();
                new ArrayList<>();
        final Animator animator = createAnimator(info, startTransaction, finishTransaction,
        final Animator animator = createAnimator(info, startTransaction,
                finishTransaction,
                () -> mController.onAnimationFinished(transition), postStartTransactionCallbacks);
                () -> mController.onAnimationFinished(transition), postStartTransactionCallbacks);
        mActiveAnimator = animator;


        // Start the animation.
        // Start the animation.
        if (!postStartTransactionCallbacks.isEmpty()) {
        if (!postStartTransactionCallbacks.isEmpty()) {
@@ -98,6 +103,17 @@ class ActivityEmbeddingAnimationRunner {
        }
        }
    }
    }


    void cancelAnimationFromMerge() {
        if (mActiveAnimator == null) {
            Log.e(TAG,
                    "No active ActivityEmbedding animator running but mergeAnimation is "
                            + "trying to cancel one."
            );
            return;
        }
        mActiveAnimator.end();
    }

    /**
    /**
     * Sets transition animation scale settings value.
     * Sets transition animation scale settings value.
     * @param scale The setting value of transition animation scale.
     * @param scale The setting value of transition animation scale.
@@ -153,6 +169,7 @@ class ActivityEmbeddingAnimationRunner {
                    adapter.onAnimationEnd(t);
                    adapter.onAnimationEnd(t);
                }
                }
                t.apply();
                t.apply();
                mActiveAnimator = null;
                animationFinishCallback.run();
                animationFinishCallback.run();
            }
            }


+7 −0
Original line number Original line Diff line number Diff line
@@ -118,6 +118,13 @@ public class ActivityEmbeddingController implements Transitions.TransitionHandle
        return true;
        return true;
    }
    }


    @Override
    public void mergeAnimation(@NonNull IBinder transition, @NonNull TransitionInfo info,
            @NonNull SurfaceControl.Transaction t, @NonNull IBinder mergeTarget,
            @NonNull Transitions.TransitionFinishCallback finishCallback) {
        mAnimationRunner.cancelAnimationFromMerge();
    }

    private boolean handleNonEmbeddedChanges(List<TransitionInfo.Change> changes) {
    private boolean handleNonEmbeddedChanges(List<TransitionInfo.Change> changes) {
        final Rect nonClosingEmbeddedArea = new Rect();
        final Rect nonClosingEmbeddedArea = new Rect();
        for (int i = changes.size() - 1; i >= 0; i--) {
        for (int i = changes.size() - 1; i >= 0; i--) {
+4 −2
Original line number Original line Diff line number Diff line
@@ -65,12 +65,14 @@ public class ActivityEmbeddingAnimationRunnerTests extends ActivityEmbeddingAnim
        final TransitionInfo info = new TransitionInfoBuilder(TRANSIT_OPEN, 0)
        final TransitionInfo info = new TransitionInfoBuilder(TRANSIT_OPEN, 0)
                .addChange(createChange(FLAG_IN_TASK_WITH_EMBEDDED_ACTIVITY))
                .addChange(createChange(FLAG_IN_TASK_WITH_EMBEDDED_ACTIVITY))
                .build();
                .build();
        doReturn(mAnimator).when(mAnimRunner).createAnimator(any(), any(), any(), any(), any());
        doReturn(mAnimator).when(mAnimRunner).createAnimator(any(), any(), any(), any(),
                any());


        mAnimRunner.startAnimation(mTransition, info, mStartTransaction, mFinishTransaction);
        mAnimRunner.startAnimation(mTransition, info, mStartTransaction, mFinishTransaction);


        final ArgumentCaptor<Runnable> finishCallback = ArgumentCaptor.forClass(Runnable.class);
        final ArgumentCaptor<Runnable> finishCallback = ArgumentCaptor.forClass(Runnable.class);
        verify(mAnimRunner).createAnimator(eq(info), eq(mStartTransaction), eq(mFinishTransaction),
        verify(mAnimRunner).createAnimator(eq(info), eq(mStartTransaction),
                eq(mFinishTransaction),
                finishCallback.capture(), any());
                finishCallback.capture(), any());
        verify(mStartTransaction).apply();
        verify(mStartTransaction).apply();
        verify(mAnimator).start();
        verify(mAnimator).start();
+1 −0
Original line number Original line Diff line number Diff line
@@ -47,6 +47,7 @@ abstract class ActivityEmbeddingAnimationTestBase extends ShellTestCase {


    @Mock
    @Mock
    ShellInit mShellInit;
    ShellInit mShellInit;

    @Mock
    @Mock
    Transitions mTransitions;
    Transitions mTransitions;
    @Mock
    @Mock
+44 −1
Original line number Original line Diff line number Diff line
@@ -29,9 +29,13 @@ import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
import static org.mockito.Mockito.verifyNoMoreInteractions;


import android.animation.Animator;
import android.animation.ValueAnimator;
import android.graphics.Rect;
import android.graphics.Rect;
import android.view.SurfaceControl;
import android.window.TransitionInfo;
import android.window.TransitionInfo;


import androidx.test.annotation.UiThreadTest;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.filters.SmallTest;
import androidx.test.filters.SmallTest;


@@ -58,7 +62,8 @@ public class ActivityEmbeddingControllerTests extends ActivityEmbeddingAnimation
    @Before
    @Before
    public void setup() {
    public void setup() {
        super.setUp();
        super.setUp();
        doReturn(mAnimator).when(mAnimRunner).createAnimator(any(), any(), any(), any(), any());
        doReturn(mAnimator).when(mAnimRunner).createAnimator(any(), any(), any(), any(),
                any());
    }
    }


    @Test
    @Test
@@ -182,6 +187,44 @@ public class ActivityEmbeddingControllerTests extends ActivityEmbeddingAnimation
        verifyNoMoreInteractions(mFinishTransaction);
        verifyNoMoreInteractions(mFinishTransaction);
    }
    }


    @UiThreadTest
    @Test
    public void testMergeAnimation() {
        final TransitionInfo info = new TransitionInfoBuilder(TRANSIT_OPEN, 0)
                .addChange(createEmbeddedChange(
                        EMBEDDED_LEFT_BOUNDS, EMBEDDED_LEFT_BOUNDS, TASK_BOUNDS))
                .build();

        final ValueAnimator animator = ValueAnimator.ofFloat(0, 1);
        animator.addListener(new Animator.AnimatorListener() {
            @Override
            public void onAnimationStart(Animator animation) {
            }

            @Override
            public void onAnimationEnd(Animator animation) {
                mController.onAnimationFinished(mTransition);
            }

            @Override
            public void onAnimationCancel(Animator animation) {
            }

            @Override
            public void onAnimationRepeat(Animator animation) {
            }
        });
        doReturn(animator).when(mAnimRunner).createAnimator(any(), any(), any(), any(), any());
        mController.startAnimation(mTransition, info, mStartTransaction,
                mFinishTransaction, mFinishCallback);
        verify(mFinishCallback, never()).onTransitionFinished(any(), any());
        mController.mergeAnimation(mTransition, info, new SurfaceControl.Transaction(),
                mTransition,
                (wct, cb) -> {
                });
        verify(mFinishCallback).onTransitionFinished(any(), any());
    }

    @Test
    @Test
    public void testOnAnimationFinished() {
    public void testOnAnimationFinished() {
        // Should not call finish when there is no transition.
        // Should not call finish when there is no transition.