2 * Copyright (C) 2018 The Android Open Source Project
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License
19 import android.annotation.UnsupportedAppUsage;
20 import android.app.ActivityOptions;
21 import android.os.Parcel;
22 import android.os.Parcelable;
25 * Object that describes how to run a remote animation.
27 * A remote animation lets another app control the entire app transition. It does so by
29 * <li>using {@link ActivityOptions#makeRemoteAnimation}</li>
30 * <li>using {@link IWindowManager#overridePendingAppTransitionRemote}</li>
32 * to register a {@link RemoteAnimationAdapter} that describes how the animation should be run:
33 * Along some meta-data, this object contains a callback that gets invoked from window manager when
34 * the transition is ready to be started.
36 * Window manager supplies a list of {@link RemoteAnimationTarget}s into the callback. Each target
37 * contains information about the activity that is animating as well as
38 * {@link RemoteAnimationTarget#leash}. The controlling app can modify the leash like any other
39 * {@link SurfaceControl}, including the possibility to synchronize updating the leash's surface
40 * properties with a frame to be drawn using
41 * {@link SurfaceControl.Transaction#deferTransactionUntil}.
43 * When the animation is done, the controlling app can invoke
44 * {@link IRemoteAnimationFinishedCallback} that gets supplied into
45 * {@link IRemoteAnimationRunner#onStartAnimation}
49 public class RemoteAnimationAdapter implements Parcelable {
51 private final IRemoteAnimationRunner mRunner;
52 private final long mDuration;
53 private final long mStatusBarTransitionDelay;
54 private final boolean mChangeNeedsSnapshot;
56 /** @see #getCallingPid */
57 private int mCallingPid;
60 * @param runner The interface that gets notified when we actually need to start the animation.
61 * @param duration The duration of the animation.
62 * @param changeNeedsSnapshot For change transitions, whether this should create a snapshot by
63 * screenshotting the task.
64 * @param statusBarTransitionDelay The desired delay for all visual animations in the
65 * status bar caused by this app animation in millis.
68 public RemoteAnimationAdapter(IRemoteAnimationRunner runner, long duration,
69 long statusBarTransitionDelay, boolean changeNeedsSnapshot) {
72 mChangeNeedsSnapshot = changeNeedsSnapshot;
73 mStatusBarTransitionDelay = statusBarTransitionDelay;
77 public RemoteAnimationAdapter(IRemoteAnimationRunner runner, long duration,
78 long statusBarTransitionDelay) {
79 this(runner, duration, statusBarTransitionDelay, false /* changeNeedsSnapshot */);
82 public RemoteAnimationAdapter(Parcel in) {
83 mRunner = IRemoteAnimationRunner.Stub.asInterface(in.readStrongBinder());
84 mDuration = in.readLong();
85 mStatusBarTransitionDelay = in.readLong();
86 mChangeNeedsSnapshot = in.readBoolean();
89 public IRemoteAnimationRunner getRunner() {
93 public long getDuration() {
97 public long getStatusBarTransitionDelay() {
98 return mStatusBarTransitionDelay;
101 public boolean getChangeNeedsSnapshot() {
102 return mChangeNeedsSnapshot;
106 * To be called by system_server to keep track which pid is running this animation.
108 public void setCallingPid(int pid) {
113 * @return The pid of the process running the animation.
115 public int getCallingPid() {
120 public int describeContents() {
125 public void writeToParcel(Parcel dest, int flags) {
126 dest.writeStrongInterface(mRunner);
127 dest.writeLong(mDuration);
128 dest.writeLong(mStatusBarTransitionDelay);
129 dest.writeBoolean(mChangeNeedsSnapshot);
132 public static final @android.annotation.NonNull Creator<RemoteAnimationAdapter> CREATOR
133 = new Creator<RemoteAnimationAdapter>() {
134 public RemoteAnimationAdapter createFromParcel(Parcel in) {
135 return new RemoteAnimationAdapter(in);
138 public RemoteAnimationAdapter[] newArray(int size) {
139 return new RemoteAnimationAdapter[size];