Merge "Fix app requested animation for ActivityEmbedding remote animation" into tm-qpr-dev am: d64a471ea1 am: eee67f7a8e
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/20494325 Change-Id: I22d2ecacca782f66512f6bf2ad6996c9e8bdc2cc Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
@@ -169,7 +169,8 @@ public class AppTransition implements Dump {
|
||||
private final WindowManagerService mService;
|
||||
private final DisplayContent mDisplayContent;
|
||||
|
||||
private final TransitionAnimation mTransitionAnimation;
|
||||
@VisibleForTesting
|
||||
final TransitionAnimation mTransitionAnimation;
|
||||
|
||||
private @TransitionFlags int mNextAppTransitionFlags = 0;
|
||||
private final ArrayList<Integer> mNextAppTransitionRequests = new ArrayList<>();
|
||||
@@ -308,10 +309,33 @@ public class AppTransition implements Dump {
|
||||
setAppTransitionState(APP_STATE_TIMEOUT);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the animation overridden by app via {@link #overridePendingAppTransition}.
|
||||
*/
|
||||
@Nullable
|
||||
Animation getNextAppRequestedAnimation(boolean enter) {
|
||||
final Animation a = mTransitionAnimation.loadAppTransitionAnimation(
|
||||
mNextAppTransitionPackage,
|
||||
enter ? mNextAppTransitionEnter : mNextAppTransitionExit);
|
||||
if (mNextAppTransitionBackgroundColor != 0 && a != null) {
|
||||
a.setBackdropColor(mNextAppTransitionBackgroundColor);
|
||||
}
|
||||
return a;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the animation background color overridden by app via
|
||||
* {@link #overridePendingAppTransition}.
|
||||
*/
|
||||
@ColorInt int getNextAppTransitionBackgroundColor() {
|
||||
return mNextAppTransitionBackgroundColor;
|
||||
}
|
||||
|
||||
@VisibleForTesting
|
||||
boolean isNextAppTransitionOverrideRequested() {
|
||||
return mNextAppTransitionOverrideRequested;
|
||||
}
|
||||
|
||||
HardwareBuffer getAppTransitionThumbnailHeader(WindowContainer container) {
|
||||
AppTransitionAnimationSpec spec = mNextAppTransitionAnimationsSpecs.get(
|
||||
container.hashCode());
|
||||
@@ -401,9 +425,12 @@ public class AppTransition implements Dump {
|
||||
}
|
||||
|
||||
void clear() {
|
||||
clear(true /* clearAppOverride */);
|
||||
}
|
||||
|
||||
private void clear(boolean clearAppOverride) {
|
||||
mNextAppTransitionType = NEXT_TRANSIT_TYPE_NONE;
|
||||
mNextAppTransitionOverrideRequested = false;
|
||||
mNextAppTransitionPackage = null;
|
||||
mNextAppTransitionAnimationsSpecs.clear();
|
||||
mRemoteAnimationController = null;
|
||||
mNextAppTransitionAnimationsSpecsFuture = null;
|
||||
@@ -411,6 +438,12 @@ public class AppTransition implements Dump {
|
||||
mAnimationFinishedCallback = null;
|
||||
mOverrideTaskTransition = false;
|
||||
mNextAppTransitionIsSync = false;
|
||||
if (clearAppOverride) {
|
||||
mNextAppTransitionPackage = null;
|
||||
mNextAppTransitionEnter = 0;
|
||||
mNextAppTransitionExit = 0;
|
||||
mNextAppTransitionBackgroundColor = 0;
|
||||
}
|
||||
}
|
||||
|
||||
void freeze() {
|
||||
@@ -516,7 +549,7 @@ public class AppTransition implements Dump {
|
||||
return TransitionAnimation.loadAnimationSafely(context, resId, TAG);
|
||||
}
|
||||
|
||||
static int mapOpenCloseTransitTypes(int transit, boolean enter) {
|
||||
private static int mapOpenCloseTransitTypes(int transit, boolean enter) {
|
||||
int animAttr = 0;
|
||||
switch (transit) {
|
||||
case TRANSIT_OLD_ACTIVITY_OPEN:
|
||||
@@ -776,11 +809,7 @@ public class AppTransition implements Dump {
|
||||
"applyAnimation: anim=%s transit=%s Callers=%s", a,
|
||||
appTransitionOldToString(transit), Debug.getCallers(3));
|
||||
} else if (mNextAppTransitionType == NEXT_TRANSIT_TYPE_CUSTOM) {
|
||||
a = mTransitionAnimation.loadAppTransitionAnimation(mNextAppTransitionPackage,
|
||||
enter ? mNextAppTransitionEnter : mNextAppTransitionExit);
|
||||
if (mNextAppTransitionBackgroundColor != 0) {
|
||||
a.setBackdropColor(mNextAppTransitionBackgroundColor);
|
||||
}
|
||||
a = getNextAppRequestedAnimation(enter);
|
||||
ProtoLog.v(WM_DEBUG_APP_TRANSITIONS_ANIM,
|
||||
"applyAnimation: anim=%s nextAppTransition=ANIM_CUSTOM transit=%s "
|
||||
+ "isEntrance=%b Callers=%s",
|
||||
@@ -1020,7 +1049,9 @@ public class AppTransition implements Dump {
|
||||
ProtoLog.i(WM_DEBUG_APP_TRANSITIONS, "Override pending remote transitionSet=%b adapter=%s",
|
||||
isTransitionSet(), remoteAnimationAdapter);
|
||||
if (isTransitionSet() && !mNextAppTransitionIsSync) {
|
||||
clear();
|
||||
// ActivityEmbedding animation will run by the app process for which we want to respect
|
||||
// the app override for whether or not to show background color.
|
||||
clear(!isActivityEmbedding /* clearAppOverride */);
|
||||
mNextAppTransitionType = NEXT_TRANSIT_TYPE_REMOTE;
|
||||
mRemoteAnimationController = new RemoteAnimationController(mService, mDisplayContent,
|
||||
remoteAnimationAdapter, mHandler, isActivityEmbedding);
|
||||
|
||||
@@ -3009,10 +3009,9 @@ class WindowContainer<E extends WindowContainer> extends ConfigurationContainer<
|
||||
// screen empty. Show background color to cover that.
|
||||
showBackdrop = getDisplayContent().mChangingContainers.size() > 1;
|
||||
} else {
|
||||
// Check whether or not to show backdrop for open/close transition.
|
||||
final int animAttr = AppTransition.mapOpenCloseTransitTypes(transit, enter);
|
||||
final Animation a = animAttr != 0
|
||||
? appTransition.loadAnimationAttr(lp, animAttr, transit) : null;
|
||||
// Check whether the app has requested to show backdrop for open/close
|
||||
// transition.
|
||||
final Animation a = appTransition.getNextAppRequestedAnimation(enter);
|
||||
showBackdrop = a != null && a.getShowBackdrop();
|
||||
}
|
||||
backdropColor = appTransition.getNextAppTransitionBackgroundColor();
|
||||
|
||||
@@ -49,6 +49,7 @@ import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertFalse;
|
||||
import static org.junit.Assert.assertNull;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
import static org.junit.Assume.assumeFalse;
|
||||
import static org.mockito.ArgumentMatchers.any;
|
||||
import static org.mockito.ArgumentMatchers.anyBoolean;
|
||||
import static org.mockito.Mockito.mock;
|
||||
@@ -67,11 +68,14 @@ import android.view.RemoteAnimationAdapter;
|
||||
import android.view.RemoteAnimationTarget;
|
||||
import android.view.SurfaceControl;
|
||||
import android.view.WindowManager;
|
||||
import android.view.animation.Animation;
|
||||
import android.window.ITaskFragmentOrganizer;
|
||||
import android.window.TaskFragmentOrganizer;
|
||||
|
||||
import androidx.test.filters.SmallTest;
|
||||
|
||||
import com.android.internal.policy.TransitionAnimation;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
@@ -495,6 +499,80 @@ public class AppTransitionTests extends WindowTestsBase {
|
||||
assertEquals(startBounds, taskFragment.mSurfaceFreezer.mFreezeBounds);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGetNextAppTransitionBackgroundColor() {
|
||||
assumeFalse(WindowManagerService.sEnableShellTransitions);
|
||||
|
||||
// No override by default.
|
||||
assertEquals(0, mDc.mAppTransition.getNextAppTransitionBackgroundColor());
|
||||
|
||||
// Override with a custom color.
|
||||
mDc.mAppTransition.prepareAppTransition(TRANSIT_OPEN, 0);
|
||||
final int testColor = 123;
|
||||
mDc.mAppTransition.overridePendingAppTransition("testPackage", 0 /* enterAnim */,
|
||||
0 /* exitAnim */, testColor, null /* startedCallback */, null /* endedCallback */,
|
||||
false /* overrideTaskTransaction */);
|
||||
|
||||
assertEquals(testColor, mDc.mAppTransition.getNextAppTransitionBackgroundColor());
|
||||
assertTrue(mDc.mAppTransition.isNextAppTransitionOverrideRequested());
|
||||
|
||||
// Override with ActivityEmbedding remote animation. Background color should be kept.
|
||||
mDc.mAppTransition.overridePendingAppTransitionRemote(mock(RemoteAnimationAdapter.class),
|
||||
false /* sync */, true /* isActivityEmbedding */);
|
||||
|
||||
assertEquals(testColor, mDc.mAppTransition.getNextAppTransitionBackgroundColor());
|
||||
assertFalse(mDc.mAppTransition.isNextAppTransitionOverrideRequested());
|
||||
|
||||
// Background color should not be cleared anymore after #clear().
|
||||
mDc.mAppTransition.clear();
|
||||
assertEquals(0, mDc.mAppTransition.getNextAppTransitionBackgroundColor());
|
||||
assertFalse(mDc.mAppTransition.isNextAppTransitionOverrideRequested());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGetNextAppRequestedAnimation() {
|
||||
assumeFalse(WindowManagerService.sEnableShellTransitions);
|
||||
final String packageName = "testPackage";
|
||||
final int enterAnimResId = 1;
|
||||
final int exitAnimResId = 2;
|
||||
final int testColor = 123;
|
||||
final Animation enterAnim = mock(Animation.class);
|
||||
final Animation exitAnim = mock(Animation.class);
|
||||
final TransitionAnimation transitionAnimation = mDc.mAppTransition.mTransitionAnimation;
|
||||
spyOn(transitionAnimation);
|
||||
doReturn(enterAnim).when(transitionAnimation)
|
||||
.loadAppTransitionAnimation(packageName, enterAnimResId);
|
||||
doReturn(exitAnim).when(transitionAnimation)
|
||||
.loadAppTransitionAnimation(packageName, exitAnimResId);
|
||||
|
||||
// No override by default.
|
||||
assertNull(mDc.mAppTransition.getNextAppRequestedAnimation(true /* enter */));
|
||||
assertNull(mDc.mAppTransition.getNextAppRequestedAnimation(false /* enter */));
|
||||
|
||||
// Override with a custom animation.
|
||||
mDc.mAppTransition.prepareAppTransition(TRANSIT_OPEN, 0);
|
||||
mDc.mAppTransition.overridePendingAppTransition(packageName, enterAnimResId, exitAnimResId,
|
||||
testColor, null /* startedCallback */, null /* endedCallback */,
|
||||
false /* overrideTaskTransaction */);
|
||||
|
||||
assertEquals(enterAnim, mDc.mAppTransition.getNextAppRequestedAnimation(true /* enter */));
|
||||
assertEquals(exitAnim, mDc.mAppTransition.getNextAppRequestedAnimation(false /* enter */));
|
||||
assertTrue(mDc.mAppTransition.isNextAppTransitionOverrideRequested());
|
||||
|
||||
// Override with ActivityEmbedding remote animation. Custom animation should be kept.
|
||||
mDc.mAppTransition.overridePendingAppTransitionRemote(mock(RemoteAnimationAdapter.class),
|
||||
false /* sync */, true /* isActivityEmbedding */);
|
||||
|
||||
assertEquals(enterAnim, mDc.mAppTransition.getNextAppRequestedAnimation(true /* enter */));
|
||||
assertEquals(exitAnim, mDc.mAppTransition.getNextAppRequestedAnimation(false /* enter */));
|
||||
assertFalse(mDc.mAppTransition.isNextAppTransitionOverrideRequested());
|
||||
|
||||
// Custom animation should not be cleared anymore after #clear().
|
||||
mDc.mAppTransition.clear();
|
||||
assertNull(mDc.mAppTransition.getNextAppRequestedAnimation(true /* enter */));
|
||||
assertNull(mDc.mAppTransition.getNextAppRequestedAnimation(false /* enter */));
|
||||
}
|
||||
|
||||
private class TestRemoteAnimationRunner implements IRemoteAnimationRunner {
|
||||
boolean mCancelled = false;
|
||||
@Override
|
||||
|
||||
Reference in New Issue
Block a user