Merge "Hook up custom activity-level animation callbacks to shell" into sc-v2-dev

This commit is contained in:
Evan Rosky
2021-07-21 23:31:02 +00:00
committed by Android (Google) Code Review
4 changed files with 39 additions and 5 deletions

View File

@@ -1042,7 +1042,8 @@ class ActivityClientController extends IActivityClientController.Stub {
r.mOverrideTaskTransition); r.mOverrideTaskTransition);
mService.getTransitionController().setOverrideAnimation( mService.getTransitionController().setOverrideAnimation(
TransitionInfo.AnimationOptions.makeCustomAnimOptions(packageName, TransitionInfo.AnimationOptions.makeCustomAnimOptions(packageName,
enterAnim, exitAnim, r.mOverrideTaskTransition)); enterAnim, exitAnim, r.mOverrideTaskTransition),
null /* startCallback */, null /* finishCallback */);
} }
} }
Binder.restoreCallingIdentity(origId); Binder.restoreCallingIdentity(origId);

View File

@@ -273,6 +273,7 @@ import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.os.Debug; import android.os.Debug;
import android.os.IBinder; import android.os.IBinder;
import android.os.IRemoteCallback;
import android.os.PersistableBundle; import android.os.PersistableBundle;
import android.os.Process; import android.os.Process;
import android.os.RemoteException; import android.os.RemoteException;
@@ -4315,6 +4316,8 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
final int animationType = pendingOptions.getAnimationType(); final int animationType = pendingOptions.getAnimationType();
final DisplayContent displayContent = getDisplayContent(); final DisplayContent displayContent = getDisplayContent();
AnimationOptions options = null; AnimationOptions options = null;
IRemoteCallback startCallback = null;
IRemoteCallback finishCallback = null;
switch (animationType) { switch (animationType) {
case ANIM_CUSTOM: case ANIM_CUSTOM:
displayContent.mAppTransition.overridePendingAppTransition( displayContent.mAppTransition.overridePendingAppTransition(
@@ -4327,6 +4330,8 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
options = AnimationOptions.makeCustomAnimOptions(pendingOptions.getPackageName(), options = AnimationOptions.makeCustomAnimOptions(pendingOptions.getPackageName(),
pendingOptions.getCustomEnterResId(), pendingOptions.getCustomExitResId(), pendingOptions.getCustomEnterResId(), pendingOptions.getCustomExitResId(),
pendingOptions.getOverrideTaskTransition()); pendingOptions.getOverrideTaskTransition());
startCallback = pendingOptions.getAnimationStartedListener();
finishCallback = pendingOptions.getAnimationFinishedListener();
break; break;
case ANIM_CLIP_REVEAL: case ANIM_CLIP_REVEAL:
displayContent.mAppTransition.overridePendingAppTransitionClipReveal( displayContent.mAppTransition.overridePendingAppTransitionClipReveal(
@@ -4366,6 +4371,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
scaleUp); scaleUp);
options = AnimationOptions.makeThumnbnailAnimOptions(buffer, options = AnimationOptions.makeThumnbnailAnimOptions(buffer,
pendingOptions.getStartX(), pendingOptions.getStartY(), scaleUp); pendingOptions.getStartX(), pendingOptions.getStartY(), scaleUp);
startCallback = pendingOptions.getAnimationStartedListener();
if (intent.getSourceBounds() == null && buffer != null) { if (intent.getSourceBounds() == null && buffer != null) {
intent.setSourceBounds(new Rect(pendingOptions.getStartX(), intent.setSourceBounds(new Rect(pendingOptions.getStartX(),
pendingOptions.getStartY(), pendingOptions.getStartY(),
@@ -4416,7 +4422,8 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
} }
if (options != null) { if (options != null) {
mAtmService.getTransitionController().setOverrideAnimation(options); mAtmService.getTransitionController().setOverrideAnimation(options,
startCallback, finishCallback);
} }
} }

View File

@@ -46,11 +46,13 @@ import static com.android.server.wm.ActivityTaskManagerInternal.APP_TRANSITION_W
import android.annotation.IntDef; import android.annotation.IntDef;
import android.annotation.NonNull; import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.ActivityManager; import android.app.ActivityManager;
import android.graphics.Point; import android.graphics.Point;
import android.graphics.Rect; import android.graphics.Rect;
import android.os.Binder; import android.os.Binder;
import android.os.IBinder; import android.os.IBinder;
import android.os.IRemoteCallback;
import android.os.RemoteException; import android.os.RemoteException;
import android.os.SystemClock; import android.os.SystemClock;
import android.util.ArrayMap; import android.util.ArrayMap;
@@ -65,6 +67,7 @@ import android.window.TransitionInfo;
import com.android.internal.annotations.VisibleForTesting; import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.protolog.ProtoLogGroup; import com.android.internal.protolog.ProtoLogGroup;
import com.android.internal.protolog.common.ProtoLog; import com.android.internal.protolog.common.ProtoLog;
import com.android.internal.util.function.pooled.PooledLambda;
import java.lang.annotation.Retention; import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy; import java.lang.annotation.RetentionPolicy;
@@ -130,7 +133,10 @@ class Transition extends Binder implements BLASTSyncEngine.TransactionReadyListe
/** The final animation targets derived from participants after promotion. */ /** The final animation targets derived from participants after promotion. */
private ArraySet<WindowContainer> mTargets = null; private ArraySet<WindowContainer> mTargets = null;
/** Custom activity-level animation options and callbacks. */
private TransitionInfo.AnimationOptions mOverrideOptions; private TransitionInfo.AnimationOptions mOverrideOptions;
private IRemoteCallback mClientAnimationStartCallback = null;
private IRemoteCallback mClientAnimationFinishCallback = null;
private @TransitionState int mState = STATE_COLLECTING; private @TransitionState int mState = STATE_COLLECTING;
private final ReadyTracker mReadyTracker = new ReadyTracker(); private final ReadyTracker mReadyTracker = new ReadyTracker();
@@ -226,13 +232,26 @@ class Transition extends Binder implements BLASTSyncEngine.TransactionReadyListe
mChanges.get(wc).mExistenceChanged = true; mChanges.get(wc).mExistenceChanged = true;
} }
private void sendRemoteCallback(@Nullable IRemoteCallback callback) {
if (callback == null) return;
mController.mAtm.mH.sendMessage(PooledLambda.obtainMessage(cb -> {
try {
cb.sendResult(null);
} catch (RemoteException e) { }
}, callback));
}
/** /**
* Set animation options for collecting transition by ActivityRecord. * Set animation options for collecting transition by ActivityRecord.
* @param options AnimationOptions captured from ActivityOptions * @param options AnimationOptions captured from ActivityOptions
*/ */
void setOverrideAnimation(TransitionInfo.AnimationOptions options) { void setOverrideAnimation(TransitionInfo.AnimationOptions options,
@Nullable IRemoteCallback startCallback, @Nullable IRemoteCallback finishCallback) {
if (mSyncId < 0) return; if (mSyncId < 0) return;
mOverrideOptions = options; mOverrideOptions = options;
sendRemoteCallback(mClientAnimationStartCallback);
mClientAnimationStartCallback = startCallback;
mClientAnimationFinishCallback = finishCallback;
} }
/** /**
@@ -363,6 +382,8 @@ class Transition extends Binder implements BLASTSyncEngine.TransactionReadyListe
.scheduleProcessStoppingAndFinishingActivitiesIfNeeded(); .scheduleProcessStoppingAndFinishingActivitiesIfNeeded();
} }
sendRemoteCallback(mClientAnimationFinishCallback);
legacyRestoreNavigationBarFromApp(); legacyRestoreNavigationBarFromApp();
} }
@@ -426,6 +447,9 @@ class Transition extends Binder implements BLASTSyncEngine.TransactionReadyListe
reportStartReasonsToLogger(); reportStartReasonsToLogger();
// The callback is only populated for custom activity-level client animations
sendRemoteCallback(mClientAnimationStartCallback);
// Manually show any activities that are visibleRequested. This is needed to properly // Manually show any activities that are visibleRequested. This is needed to properly
// support simultaneous animation queueing/merging. Specifically, if transition A makes // support simultaneous animation queueing/merging. Specifically, if transition A makes
// an activity invisible, it's finishTransaction (which is applied *after* the animation) // an activity invisible, it's finishTransaction (which is applied *after* the animation)

View File

@@ -30,6 +30,7 @@ import android.annotation.NonNull;
import android.annotation.Nullable; import android.annotation.Nullable;
import android.app.ActivityManager; import android.app.ActivityManager;
import android.os.IBinder; import android.os.IBinder;
import android.os.IRemoteCallback;
import android.os.RemoteException; import android.os.RemoteException;
import android.os.SystemClock; import android.os.SystemClock;
import android.util.Slog; import android.util.Slog;
@@ -277,9 +278,10 @@ class TransitionController {
} }
/** @see Transition#setOverrideAnimation */ /** @see Transition#setOverrideAnimation */
void setOverrideAnimation(TransitionInfo.AnimationOptions options) { void setOverrideAnimation(TransitionInfo.AnimationOptions options,
@Nullable IRemoteCallback startCallback, @Nullable IRemoteCallback finishCallback) {
if (mCollectingTransition == null) return; if (mCollectingTransition == null) return;
mCollectingTransition.setOverrideAnimation(options); mCollectingTransition.setOverrideAnimation(options, startCallback, finishCallback);
} }
/** @see Transition#setReady */ /** @see Transition#setReady */