Merge "Merge "Implement merge animations for AE Shell animation." into udc-dev am: 0b922022eb" into udc-dev-plus-aosp
This commit is contained in:
committed by
Android (Google) Code Review
commit
c2e436fdf5
@@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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--) {
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -47,6 +47,7 @@ abstract class ActivityEmbeddingAnimationTestBase extends ShellTestCase {
|
|||||||
|
|
||||||
@Mock
|
@Mock
|
||||||
ShellInit mShellInit;
|
ShellInit mShellInit;
|
||||||
|
|
||||||
@Mock
|
@Mock
|
||||||
Transitions mTransitions;
|
Transitions mTransitions;
|
||||||
@Mock
|
@Mock
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
Reference in New Issue
Block a user