diff options
| author | 2018-01-18 00:17:26 +0000 | |
|---|---|---|
| committer | 2018-01-18 00:17:26 +0000 | |
| commit | 1f2acb9a163b3bc5164e042f233091060fcc7419 (patch) | |
| tree | dcb53225290a2a05f9c8cc91c2ede48bd259d50f | |
| parent | d4356fdf4b3e2005e5e69124a5fdd5724a348619 (diff) | |
| parent | f84e2f60fec6f6d2ecfb3b90ddf075101f4b902f (diff) | |
Merge "Add ability to register remote animation definitions per activity"
23 files changed, 573 insertions, 206 deletions
diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java index a05a76ca8d3b..0a5b848e6220 100644 --- a/core/java/android/app/Activity.java +++ b/core/java/android/app/Activity.java @@ -16,6 +16,7 @@ package android.app; +import static android.Manifest.permission.CONTROL_REMOTE_APP_TRANSITION_ANIMATIONS; import static java.lang.Character.MIN_VALUE; import android.annotation.CallSuper; @@ -98,6 +99,7 @@ import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.MotionEvent; +import android.view.RemoteAnimationDefinition; import android.view.SearchEvent; import android.view.View; import android.view.View.OnCreateContextMenuListener; @@ -7703,6 +7705,22 @@ public class Activity extends ContextThemeWrapper } } + /** + * Registers remote animations per transition type for this activity. + * + * @param definition The remote animation definition that defines which transition whould run + * which remote animation. + * @hide + */ + @RequiresPermission(CONTROL_REMOTE_APP_TRANSITION_ANIMATIONS) + public void registerRemoteAnimations(RemoteAnimationDefinition definition) { + try { + ActivityManager.getService().registerRemoteAnimations(mToken, definition); + } catch (RemoteException e) { + Log.e(TAG, "Failed to call registerRemoteAnimations", e); + } + } + class HostCallbacks extends FragmentHostCallback<Activity> { public HostCallbacks() { super(Activity.this /*activity*/); diff --git a/core/java/android/app/IActivityManager.aidl b/core/java/android/app/IActivityManager.aidl index 696899f73b96..04ee77d764aa 100644 --- a/core/java/android/app/IActivityManager.aidl +++ b/core/java/android/app/IActivityManager.aidl @@ -65,6 +65,7 @@ import android.os.PersistableBundle; import android.os.StrictMode; import android.os.WorkSource; import android.service.voice.IVoiceInteractionSession; +import android.view.RemoteAnimationDefinition; import com.android.internal.app.IVoiceInteractor; import com.android.internal.os.IResultReceiver; import com.android.internal.policy.IKeyguardDismissCallback; @@ -672,4 +673,9 @@ interface IActivityManager { * user unlock progress. */ boolean startUserInBackgroundWithListener(int userid, IProgressListener unlockProgressListener); + + /** + * Registers remote animations for a specific activity. + */ + void registerRemoteAnimations(in IBinder token, in RemoteAnimationDefinition definition); } diff --git a/core/java/android/view/RemoteAnimationDefinition.aidl b/core/java/android/view/RemoteAnimationDefinition.aidl new file mode 100644 index 000000000000..32ecd01ebf25 --- /dev/null +++ b/core/java/android/view/RemoteAnimationDefinition.aidl @@ -0,0 +1,19 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +package android.view; + +parcelable RemoteAnimationDefinition; diff --git a/core/java/android/view/RemoteAnimationDefinition.java b/core/java/android/view/RemoteAnimationDefinition.java new file mode 100644 index 000000000000..381f6926a1e8 --- /dev/null +++ b/core/java/android/view/RemoteAnimationDefinition.java @@ -0,0 +1,93 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +package android.view; + +import android.annotation.Nullable; +import android.os.Parcel; +import android.os.Parcelable; +import android.util.ArrayMap; +import android.util.SparseArray; +import android.view.WindowManager.TransitionType; + +/** + * Defines which animation types should be overridden by which remote animation. + * + * @hide + */ +public class RemoteAnimationDefinition implements Parcelable { + + private final SparseArray<RemoteAnimationAdapter> mTransitionAnimationMap; + + public RemoteAnimationDefinition() { + mTransitionAnimationMap = new SparseArray<>(); + } + + /** + * Registers a remote animation for a specific transition. + * + * @param transition The transition type. Must be one of WindowManager.TRANSIT_* values. + * @param adapter The adapter that described how to run the remote animation. + */ + public void addRemoteAnimation(@TransitionType int transition, RemoteAnimationAdapter adapter) { + mTransitionAnimationMap.put(transition, adapter); + } + + /** + * Checks whether a remote animation for specific transition is defined. + * + * @param transition The transition type. Must be one of WindowManager.TRANSIT_* values. + * @return Whether this definition has defined a remote animation for the specified transition. + */ + public boolean hasTransition(@TransitionType int transition) { + return mTransitionAnimationMap.get(transition) != null; + } + + /** + * Retrieves the remote animation for a specific transition. + * + * @param transition The transition type. Must be one of WindowManager.TRANSIT_* values. + * @return The remote animation adapter for the specified transition. + */ + public @Nullable RemoteAnimationAdapter getAdapter(@TransitionType int transition) { + return mTransitionAnimationMap.get(transition); + } + + public RemoteAnimationDefinition(Parcel in) { + mTransitionAnimationMap = in.readSparseArray(null /* loader */); + } + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeSparseArray((SparseArray) mTransitionAnimationMap); + } + + public static final Creator<RemoteAnimationDefinition> CREATOR = + new Creator<RemoteAnimationDefinition>() { + public RemoteAnimationDefinition createFromParcel(Parcel in) { + return new RemoteAnimationDefinition(in); + } + + public RemoteAnimationDefinition[] newArray(int size) { + return new RemoteAnimationDefinition[size]; + } + }; +} diff --git a/core/java/android/view/WindowManager.java b/core/java/android/view/WindowManager.java index 50d71185314f..3bb3a4c17b8f 100644 --- a/core/java/android/view/WindowManager.java +++ b/core/java/android/view/WindowManager.java @@ -105,6 +105,191 @@ public interface WindowManager extends ViewManager { final static String INPUT_CONSUMER_WALLPAPER = "wallpaper_input_consumer"; /** + * Not set up for a transition. + * @hide + */ + int TRANSIT_UNSET = -1; + + /** + * No animation for transition. + * @hide + */ + int TRANSIT_NONE = 0; + + /** + * A window in a new activity is being opened on top of an existing one in the same task. + * @hide + */ + int TRANSIT_ACTIVITY_OPEN = 6; + + /** + * The window in the top-most activity is being closed to reveal the previous activity in the + * same task. + * @hide + */ + int TRANSIT_ACTIVITY_CLOSE = 7; + + /** + * A window in a new task is being opened on top of an existing one in another activity's task. + * @hide + */ + int TRANSIT_TASK_OPEN = 8; + + /** + * A window in the top-most activity is being closed to reveal the previous activity in a + * different task. + * @hide + */ + int TRANSIT_TASK_CLOSE = 9; + + /** + * A window in an existing task is being displayed on top of an existing one in another + * activity's task. + * @hide + */ + int TRANSIT_TASK_TO_FRONT = 10; + + /** + * A window in an existing task is being put below all other tasks. + * @hide + */ + int TRANSIT_TASK_TO_BACK = 11; + + /** + * A window in a new activity that doesn't have a wallpaper is being opened on top of one that + * does, effectively closing the wallpaper. + * @hide + */ + int TRANSIT_WALLPAPER_CLOSE = 12; + + /** + * A window in a new activity that does have a wallpaper is being opened on one that didn't, + * effectively opening the wallpaper. + * @hide + */ + int TRANSIT_WALLPAPER_OPEN = 13; + + /** + * A window in a new activity is being opened on top of an existing one, and both are on top + * of the wallpaper. + * @hide + */ + int TRANSIT_WALLPAPER_INTRA_OPEN = 14; + + /** + * The window in the top-most activity is being closed to reveal the previous activity, and + * both are on top of the wallpaper. + * @hide + */ + int TRANSIT_WALLPAPER_INTRA_CLOSE = 15; + + /** + * A window in a new task is being opened behind an existing one in another activity's task. + * The new window will show briefly and then be gone. + * @hide + */ + int TRANSIT_TASK_OPEN_BEHIND = 16; + + /** + * A window in a task is being animated in-place. + * @hide + */ + int TRANSIT_TASK_IN_PLACE = 17; + + /** + * An activity is being relaunched (e.g. due to configuration change). + * @hide + */ + int TRANSIT_ACTIVITY_RELAUNCH = 18; + + /** + * A task is being docked from recents. + * @hide + */ + int TRANSIT_DOCK_TASK_FROM_RECENTS = 19; + + /** + * Keyguard is going away. + * @hide + */ + int TRANSIT_KEYGUARD_GOING_AWAY = 20; + + /** + * Keyguard is going away with showing an activity behind that requests wallpaper. + * @hide + */ + int TRANSIT_KEYGUARD_GOING_AWAY_ON_WALLPAPER = 21; + + /** + * Keyguard is being occluded. + * @hide + */ + int TRANSIT_KEYGUARD_OCCLUDE = 22; + + /** + * Keyguard is being unoccluded. + * @hide + */ + int TRANSIT_KEYGUARD_UNOCCLUDE = 23; + + /** + * @hide + */ + @IntDef(prefix = { "TRANSIT_" }, value = { + TRANSIT_UNSET, + TRANSIT_NONE, + TRANSIT_ACTIVITY_OPEN, + TRANSIT_ACTIVITY_CLOSE, + TRANSIT_TASK_OPEN, + TRANSIT_TASK_CLOSE, + TRANSIT_TASK_TO_FRONT, + TRANSIT_TASK_TO_BACK, + TRANSIT_WALLPAPER_CLOSE, + TRANSIT_WALLPAPER_OPEN, + TRANSIT_WALLPAPER_INTRA_OPEN, + TRANSIT_WALLPAPER_INTRA_CLOSE, + TRANSIT_TASK_OPEN_BEHIND, + TRANSIT_TASK_IN_PLACE, + TRANSIT_ACTIVITY_RELAUNCH, + TRANSIT_DOCK_TASK_FROM_RECENTS, + TRANSIT_KEYGUARD_GOING_AWAY, + TRANSIT_KEYGUARD_GOING_AWAY_ON_WALLPAPER, + TRANSIT_KEYGUARD_OCCLUDE, + TRANSIT_KEYGUARD_UNOCCLUDE + }) + @Retention(RetentionPolicy.SOURCE) + @interface TransitionType {} + + /** + * Transition flag: Keyguard is going away, but keeping the notification shade open + * @hide + */ + int TRANSIT_FLAG_KEYGUARD_GOING_AWAY_TO_SHADE = 0x1; + + /** + * Transition flag: Keyguard is going away, but doesn't want an animation for it + * @hide + */ + int TRANSIT_FLAG_KEYGUARD_GOING_AWAY_NO_ANIMATION = 0x2; + + /** + * Transition flag: Keyguard is going away while it was showing the system wallpaper. + * @hide + */ + int TRANSIT_FLAG_KEYGUARD_GOING_AWAY_WITH_WALLPAPER = 0x4; + + /** + * @hide + */ + @IntDef(flag = true, prefix = { "TRANSIT_FLAG_" }, value = { + TRANSIT_FLAG_KEYGUARD_GOING_AWAY_TO_SHADE, + TRANSIT_FLAG_KEYGUARD_GOING_AWAY_NO_ANIMATION, + TRANSIT_FLAG_KEYGUARD_GOING_AWAY_WITH_WALLPAPER, + }) + @Retention(RetentionPolicy.SOURCE) + @interface TransitionFlags {} + + /** * Exception that is thrown when trying to add view whose * {@link LayoutParams} {@link LayoutParams#token} * is invalid. diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index a16dd3d0477d..48c678ebd0e8 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -19,6 +19,7 @@ package com.android.server.am; import static android.Manifest.permission.BIND_VOICE_INTERACTION; import static android.Manifest.permission.CHANGE_CONFIGURATION; import static android.Manifest.permission.CHANGE_DEVICE_IDLE_TEMP_WHITELIST; +import static android.Manifest.permission.CONTROL_REMOTE_APP_TRANSITION_ANIMATIONS; import static android.Manifest.permission.INTERACT_ACROSS_USERS; import static android.Manifest.permission.INTERACT_ACROSS_USERS_FULL; import static android.Manifest.permission.INTERNAL_SYSTEM_WINDOW; @@ -192,11 +193,11 @@ import static com.android.server.am.TaskRecord.INVALID_TASK_ID; import static com.android.server.am.TaskRecord.LOCK_TASK_AUTH_DONT_LOCK; import static com.android.server.am.TaskRecord.REPARENT_KEEP_STACK_AT_FRONT; import static com.android.server.am.TaskRecord.REPARENT_LEAVE_STACK_IN_PLACE; -import static com.android.server.wm.AppTransition.TRANSIT_ACTIVITY_OPEN; -import static com.android.server.wm.AppTransition.TRANSIT_NONE; -import static com.android.server.wm.AppTransition.TRANSIT_TASK_IN_PLACE; -import static com.android.server.wm.AppTransition.TRANSIT_TASK_OPEN; -import static com.android.server.wm.AppTransition.TRANSIT_TASK_TO_FRONT; +import static android.view.WindowManager.TRANSIT_ACTIVITY_OPEN; +import static android.view.WindowManager.TRANSIT_NONE; +import static android.view.WindowManager.TRANSIT_TASK_IN_PLACE; +import static android.view.WindowManager.TRANSIT_TASK_OPEN; +import static android.view.WindowManager.TRANSIT_TASK_TO_FRONT; import static org.xmlpull.v1.XmlPullParser.END_DOCUMENT; import static org.xmlpull.v1.XmlPullParser.START_TAG; @@ -370,6 +371,7 @@ import android.util.Xml; import android.util.proto.ProtoOutputStream; import android.view.Gravity; import android.view.LayoutInflater; +import android.view.RemoteAnimationDefinition; import android.view.View; import android.view.WindowManager; @@ -25444,4 +25446,23 @@ public class ActivityManagerService extends IActivityManager.Stub } } } + + @Override + public void registerRemoteAnimations(IBinder token, RemoteAnimationDefinition definition) + throws RemoteException { + enforceCallingPermission(CONTROL_REMOTE_APP_TRANSITION_ANIMATIONS, + "registerRemoteAnimations"); + synchronized (this) { + final ActivityRecord r = ActivityRecord.isInStackLocked(token); + if (r == null) { + return; + } + final long origId = Binder.clearCallingIdentity(); + try { + r.registerRemoteAnimations(definition); + } finally { + Binder.restoreCallingIdentity(origId); + } + } + } } diff --git a/services/core/java/com/android/server/am/ActivityRecord.java b/services/core/java/com/android/server/am/ActivityRecord.java index 0fb29ff54582..3bef87794c24 100644 --- a/services/core/java/com/android/server/am/ActivityRecord.java +++ b/services/core/java/com/android/server/am/ActivityRecord.java @@ -171,6 +171,7 @@ import android.util.proto.ProtoOutputStream; import android.view.AppTransitionAnimationSpec; import android.view.IAppTransitionAnimationSpecsFuture; import android.view.IApplicationToken; +import android.view.RemoteAnimationDefinition; import android.view.WindowManager.LayoutParams; import com.android.internal.R; @@ -2790,6 +2791,10 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo return mStackSupervisor.topRunningActivityLocked() == this; } + void registerRemoteAnimations(RemoteAnimationDefinition definition) { + mWindowContainerController.registerRemoteAnimations(definition); + } + @Override public String toString() { if (stringName != null) { diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java index dbe5b6f80b9a..0904c8e71df2 100644 --- a/services/core/java/com/android/server/am/ActivityStack.java +++ b/services/core/java/com/android/server/am/ActivityStack.java @@ -84,14 +84,14 @@ import static com.android.server.am.proto.ActivityStackProto.FULLSCREEN; import static com.android.server.am.proto.ActivityStackProto.ID; import static com.android.server.am.proto.ActivityStackProto.RESUMED_ACTIVITY; import static com.android.server.am.proto.ActivityStackProto.TASKS; -import static com.android.server.wm.AppTransition.TRANSIT_ACTIVITY_CLOSE; -import static com.android.server.wm.AppTransition.TRANSIT_ACTIVITY_OPEN; -import static com.android.server.wm.AppTransition.TRANSIT_NONE; -import static com.android.server.wm.AppTransition.TRANSIT_TASK_CLOSE; -import static com.android.server.wm.AppTransition.TRANSIT_TASK_OPEN; -import static com.android.server.wm.AppTransition.TRANSIT_TASK_OPEN_BEHIND; -import static com.android.server.wm.AppTransition.TRANSIT_TASK_TO_BACK; -import static com.android.server.wm.AppTransition.TRANSIT_TASK_TO_FRONT; +import static android.view.WindowManager.TRANSIT_ACTIVITY_CLOSE; +import static android.view.WindowManager.TRANSIT_ACTIVITY_OPEN; +import static android.view.WindowManager.TRANSIT_NONE; +import static android.view.WindowManager.TRANSIT_TASK_CLOSE; +import static android.view.WindowManager.TRANSIT_TASK_OPEN; +import static android.view.WindowManager.TRANSIT_TASK_OPEN_BEHIND; +import static android.view.WindowManager.TRANSIT_TASK_TO_BACK; +import static android.view.WindowManager.TRANSIT_TASK_TO_FRONT; import static java.lang.Integer.MAX_VALUE; diff --git a/services/core/java/com/android/server/am/ActivityStackSupervisor.java b/services/core/java/com/android/server/am/ActivityStackSupervisor.java index e26ec72e66a5..8168cba213f5 100644 --- a/services/core/java/com/android/server/am/ActivityStackSupervisor.java +++ b/services/core/java/com/android/server/am/ActivityStackSupervisor.java @@ -94,7 +94,7 @@ import static com.android.server.am.proto.ActivityStackSupervisorProto.DISPLAYS; import static com.android.server.am.proto.ActivityStackSupervisorProto.FOCUSED_STACK_ID; import static com.android.server.am.proto.ActivityStackSupervisorProto.KEYGUARD_CONTROLLER; import static com.android.server.am.proto.ActivityStackSupervisorProto.RESUMED_ACTIVITY; -import static com.android.server.wm.AppTransition.TRANSIT_DOCK_TASK_FROM_RECENTS; +import static android.view.WindowManager.TRANSIT_DOCK_TASK_FROM_RECENTS; import static java.lang.Integer.MAX_VALUE; diff --git a/services/core/java/com/android/server/am/KeyguardController.java b/services/core/java/com/android/server/am/KeyguardController.java index 4d7bc1e4af56..79f3fe3ffd9f 100644 --- a/services/core/java/com/android/server/am/KeyguardController.java +++ b/services/core/java/com/android/server/am/KeyguardController.java @@ -27,13 +27,13 @@ import static com.android.server.am.ActivityManagerDebugConfig.TAG_WITH_CLASS_NA import static com.android.server.am.ActivityStackSupervisor.PRESERVE_WINDOWS; import static com.android.server.am.proto.KeyguardControllerProto.KEYGUARD_OCCLUDED; import static com.android.server.am.proto.KeyguardControllerProto.KEYGUARD_SHOWING; -import static com.android.server.wm.AppTransition.TRANSIT_FLAG_KEYGUARD_GOING_AWAY_NO_ANIMATION; -import static com.android.server.wm.AppTransition.TRANSIT_FLAG_KEYGUARD_GOING_AWAY_TO_SHADE; -import static com.android.server.wm.AppTransition.TRANSIT_FLAG_KEYGUARD_GOING_AWAY_WITH_WALLPAPER; -import static com.android.server.wm.AppTransition.TRANSIT_KEYGUARD_GOING_AWAY; -import static com.android.server.wm.AppTransition.TRANSIT_KEYGUARD_OCCLUDE; -import static com.android.server.wm.AppTransition.TRANSIT_KEYGUARD_UNOCCLUDE; -import static com.android.server.wm.AppTransition.TRANSIT_UNSET; +import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_GOING_AWAY_NO_ANIMATION; +import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_GOING_AWAY_TO_SHADE; +import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_GOING_AWAY_WITH_WALLPAPER; +import static android.view.WindowManager.TRANSIT_KEYGUARD_GOING_AWAY; +import static android.view.WindowManager.TRANSIT_KEYGUARD_OCCLUDE; +import static android.view.WindowManager.TRANSIT_KEYGUARD_UNOCCLUDE; +import static android.view.WindowManager.TRANSIT_UNSET; import android.app.ActivityManagerInternal.SleepToken; import android.os.IBinder; diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java index a453c333d560..88e4270ad07e 100644 --- a/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -5655,11 +5655,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { @Override public boolean allowAppAnimationsLw() { - if (mShowingDream) { - // If keyguard or dreams is currently visible, no reason to animate behind it. - return false; - } - return true; + return !mShowingDream; } @Override diff --git a/services/core/java/com/android/server/policy/WindowManagerPolicy.java b/services/core/java/com/android/server/policy/WindowManagerPolicy.java index 60dae534547e..c05dd2af3e5b 100644 --- a/services/core/java/com/android/server/policy/WindowManagerPolicy.java +++ b/services/core/java/com/android/server/policy/WindowManagerPolicy.java @@ -1206,13 +1206,12 @@ public interface WindowManagerPolicy extends WindowManagerPolicyConstants { /** * Return true if it is okay to perform animations for an app transition - * that is about to occur. You may return false for this if, for example, - * the lock screen is currently displayed so the switch should happen + * that is about to occur. You may return false for this if, for example, + * the dream window is currently displayed so the switch should happen * immediately. */ public boolean allowAppAnimationsLw(); - /** * A new window has been focused. */ diff --git a/services/core/java/com/android/server/wm/AccessibilityController.java b/services/core/java/com/android/server/wm/AccessibilityController.java index 163b1600e0bd..659253f9d603 100644 --- a/services/core/java/com/android/server/wm/AccessibilityController.java +++ b/services/core/java/com/android/server/wm/AccessibilityController.java @@ -346,12 +346,12 @@ final class AccessibilityController { final boolean magnifying = mMagnifedViewport.isMagnifyingLocked(); if (magnifying) { switch (transition) { - case AppTransition.TRANSIT_ACTIVITY_OPEN: - case AppTransition.TRANSIT_TASK_OPEN: - case AppTransition.TRANSIT_TASK_TO_FRONT: - case AppTransition.TRANSIT_WALLPAPER_OPEN: - case AppTransition.TRANSIT_WALLPAPER_CLOSE: - case AppTransition.TRANSIT_WALLPAPER_INTRA_OPEN: { + case WindowManager.TRANSIT_ACTIVITY_OPEN: + case WindowManager.TRANSIT_TASK_OPEN: + case WindowManager.TRANSIT_TASK_TO_FRONT: + case WindowManager.TRANSIT_WALLPAPER_OPEN: + case WindowManager.TRANSIT_WALLPAPER_CLOSE: + case WindowManager.TRANSIT_WALLPAPER_INTRA_OPEN: { mHandler.sendEmptyMessage(MyHandler.MESSAGE_NOTIFY_USER_CONTEXT_CHANGED); } } diff --git a/services/core/java/com/android/server/wm/AppTransition.java b/services/core/java/com/android/server/wm/AppTransition.java index f129fe161f0a..fc7ad09d5182 100644 --- a/services/core/java/com/android/server/wm/AppTransition.java +++ b/services/core/java/com/android/server/wm/AppTransition.java @@ -16,6 +16,28 @@ package com.android.server.wm; +import static android.view.WindowManager.LayoutParams; +import static android.view.WindowManager.TRANSIT_ACTIVITY_CLOSE; +import static android.view.WindowManager.TRANSIT_ACTIVITY_OPEN; +import static android.view.WindowManager.TRANSIT_ACTIVITY_RELAUNCH; +import static android.view.WindowManager.TRANSIT_DOCK_TASK_FROM_RECENTS; +import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_GOING_AWAY_NO_ANIMATION; +import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_GOING_AWAY_TO_SHADE; +import static android.view.WindowManager.TRANSIT_KEYGUARD_GOING_AWAY; +import static android.view.WindowManager.TRANSIT_KEYGUARD_GOING_AWAY_ON_WALLPAPER; +import static android.view.WindowManager.TRANSIT_KEYGUARD_OCCLUDE; +import static android.view.WindowManager.TRANSIT_KEYGUARD_UNOCCLUDE; +import static android.view.WindowManager.TRANSIT_NONE; +import static android.view.WindowManager.TRANSIT_TASK_CLOSE; +import static android.view.WindowManager.TRANSIT_TASK_OPEN; +import static android.view.WindowManager.TRANSIT_TASK_OPEN_BEHIND; +import static android.view.WindowManager.TRANSIT_TASK_TO_BACK; +import static android.view.WindowManager.TRANSIT_TASK_TO_FRONT; +import static android.view.WindowManager.TRANSIT_UNSET; +import static android.view.WindowManager.TRANSIT_WALLPAPER_CLOSE; +import static android.view.WindowManager.TRANSIT_WALLPAPER_INTRA_CLOSE; +import static android.view.WindowManager.TRANSIT_WALLPAPER_INTRA_OPEN; +import static android.view.WindowManager.TRANSIT_WALLPAPER_OPEN; import static com.android.internal.R.styleable.WindowAnimation_activityCloseEnterAnimation; import static com.android.internal.R.styleable.WindowAnimation_activityCloseExitAnimation; import static com.android.internal.R.styleable.WindowAnimation_activityOpenEnterAnimation; @@ -78,7 +100,8 @@ import android.view.IAppTransitionAnimationSpecsFuture; import android.view.RemoteAnimationAdapter; import android.view.RenderNode; import android.view.ThreadedRenderer; -import android.view.WindowManager; +import android.view.WindowManager.TransitionFlags; +import android.view.WindowManager.TransitionType; import android.view.animation.AlphaAnimation; import android.view.animation.Animation; import android.view.animation.AnimationSet; @@ -110,63 +133,6 @@ public class AppTransition implements Dump { private static final String TAG = TAG_WITH_CLASS_NAME ? "AppTransition" : TAG_WM; private static final int CLIP_REVEAL_TRANSLATION_Y_DP = 8; - /** Not set up for a transition. */ - public static final int TRANSIT_UNSET = -1; - /** No animation for transition. */ - public static final int TRANSIT_NONE = 0; - /** A window in a new activity is being opened on top of an existing one in the same task. */ - public static final int TRANSIT_ACTIVITY_OPEN = 6; - /** The window in the top-most activity is being closed to reveal the - * previous activity in the same task. */ - public static final int TRANSIT_ACTIVITY_CLOSE = 7; - /** A window in a new task is being opened on top of an existing one - * in another activity's task. */ - public static final int TRANSIT_TASK_OPEN = 8; - /** A window in the top-most activity is being closed to reveal the - * previous activity in a different task. */ - public static final int TRANSIT_TASK_CLOSE = 9; - /** A window in an existing task is being displayed on top of an existing one - * in another activity's task. */ - public static final int TRANSIT_TASK_TO_FRONT = 10; - /** A window in an existing task is being put below all other tasks. */ - public static final int TRANSIT_TASK_TO_BACK = 11; - /** A window in a new activity that doesn't have a wallpaper is being opened on top of one that - * does, effectively closing the wallpaper. */ - public static final int TRANSIT_WALLPAPER_CLOSE = 12; - /** A window in a new activity that does have a wallpaper is being opened on one that didn't, - * effectively opening the wallpaper. */ - public static final int TRANSIT_WALLPAPER_OPEN = 13; - /** A window in a new activity is being opened on top of an existing one, and both are on top - * of the wallpaper. */ - public static final int TRANSIT_WALLPAPER_INTRA_OPEN = 14; - /** The window in the top-most activity is being closed to reveal the previous activity, and - * both are on top of the wallpaper. */ - public static final int TRANSIT_WALLPAPER_INTRA_CLOSE = 15; - /** A window in a new task is being opened behind an existing one in another activity's task. - * The new window will show briefly and then be gone. */ - public static final int TRANSIT_TASK_OPEN_BEHIND = 16; - /** A window in a task is being animated in-place. */ - public static final int TRANSIT_TASK_IN_PLACE = 17; - /** An activity is being relaunched (e.g. due to configuration change). */ - public static final int TRANSIT_ACTIVITY_RELAUNCH = 18; - /** A task is being docked from recents. */ - public static final int TRANSIT_DOCK_TASK_FROM_RECENTS = 19; - /** Keyguard is going away */ - public static final int TRANSIT_KEYGUARD_GOING_AWAY = 20; - /** Keyguard is going away with showing an activity behind that requests wallpaper */ - public static final int TRANSIT_KEYGUARD_GOING_AWAY_ON_WALLPAPER = 21; - /** Keyguard is being occluded */ - public static final int TRANSIT_KEYGUARD_OCCLUDE = 22; - /** Keyguard is being unoccluded */ - public static final int TRANSIT_KEYGUARD_UNOCCLUDE = 23; - - /** Transition flag: Keyguard is going away, but keeping the notification shade open */ - public static final int TRANSIT_FLAG_KEYGUARD_GOING_AWAY_TO_SHADE = 0x1; - /** Transition flag: Keyguard is going away, but doesn't want an animation for it */ - public static final int TRANSIT_FLAG_KEYGUARD_GOING_AWAY_NO_ANIMATION = 0x2; - /** Transition flag: Keyguard is going away while it was showing the system wallpaper. */ - public static final int TRANSIT_FLAG_KEYGUARD_GOING_AWAY_WITH_WALLPAPER = 0x4; - /** Fraction of animation at which the recents thumbnail stays completely transparent */ private static final float RECENTS_THUMBNAIL_FADEIN_FRACTION = 0.5f; /** Fraction of animation at which the recents thumbnail becomes completely transparent */ @@ -192,8 +158,8 @@ public class AppTransition implements Dump { private final Context mContext; private final WindowManagerService mService; - private int mNextAppTransition = TRANSIT_UNSET; - private int mNextAppTransitionFlags = 0; + private @TransitionType int mNextAppTransition = TRANSIT_UNSET; + private @TransitionFlags int mNextAppTransitionFlags = 0; private int mLastUsedAppTransition = TRANSIT_UNSET; private String mLastOpeningApp; private String mLastClosingApp; @@ -326,11 +292,11 @@ public class AppTransition implements Dump { return mNextAppTransition != TRANSIT_UNSET; } - boolean isTransitionEqual(int transit) { + boolean isTransitionEqual(@TransitionType int transit) { return mNextAppTransition == transit; } - int getAppTransition() { + @TransitionType int getAppTransition() { return mNextAppTransition; } @@ -485,7 +451,7 @@ public class AppTransition implements Dump { void freeze() { final int transit = mNextAppTransition; - setAppTransition(AppTransition.TRANSIT_UNSET, 0 /* flags */); + setAppTransition(TRANSIT_UNSET, 0 /* flags */); clear(); setReady(); notifyAppTransitionCancelledLocked(transit); @@ -540,7 +506,7 @@ public class AppTransition implements Dump { return redoLayout; } - private AttributeCache.Entry getCachedAnimations(WindowManager.LayoutParams lp) { + private AttributeCache.Entry getCachedAnimations(LayoutParams lp) { if (DEBUG_ANIM) Slog.v(TAG, "Loading animations: layout params pkg=" + (lp != null ? lp.packageName : null) + " resId=0x" + (lp != null ? Integer.toHexString(lp.windowAnimations) : null)); @@ -576,7 +542,7 @@ public class AppTransition implements Dump { return null; } - Animation loadAnimationAttr(WindowManager.LayoutParams lp, int animAttr) { + Animation loadAnimationAttr(LayoutParams lp, int animAttr) { int anim = 0; Context context = mContext; if (animAttr >= 0) { @@ -592,7 +558,7 @@ public class AppTransition implements Dump { return null; } - Animation loadAnimationRes(WindowManager.LayoutParams lp, int resId) { + Animation loadAnimationRes(LayoutParams lp, int resId) { Context context = mContext; if (resId >= 0) { AttributeCache.Entry ent = getCachedAnimations(lp); @@ -1585,7 +1551,7 @@ public class AppTransition implements Dump { * to the recents thumbnail and hence need to account for the surface being * bigger. */ - Animation loadAnimation(WindowManager.LayoutParams lp, int transit, boolean enter, int uiMode, + Animation loadAnimation(LayoutParams lp, int transit, boolean enter, int uiMode, int orientation, Rect frame, Rect displayFrame, Rect insets, @Nullable Rect surfaceInsets, @Nullable Rect stableInsets, boolean isVoiceInteraction, boolean freeform, int taskId) { @@ -2157,8 +2123,8 @@ public class AppTransition implements Dump { * @return true if transition is not running and should not be skipped, false if transition is * already running */ - boolean prepareAppTransitionLocked(int transit, boolean alwaysKeepCurrent, int flags, - boolean forceOverride) { + boolean prepareAppTransitionLocked(@TransitionType int transit, boolean alwaysKeepCurrent, + @TransitionFlags int flags, boolean forceOverride) { if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "Prepare app transition:" + " transit=" + appTransitionToString(transit) + " " + this diff --git a/services/core/java/com/android/server/wm/AppWindowContainerController.java b/services/core/java/com/android/server/wm/AppWindowContainerController.java index ae9f28bcb6a6..e9efd4ec9e3d 100644 --- a/services/core/java/com/android/server/wm/AppWindowContainerController.java +++ b/services/core/java/com/android/server/wm/AppWindowContainerController.java @@ -19,8 +19,8 @@ package com.android.server.wm; import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED; import static android.view.WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER; -import static com.android.server.wm.AppTransition.TRANSIT_DOCK_TASK_FROM_RECENTS; -import static com.android.server.wm.AppTransition.TRANSIT_UNSET; +import static android.view.WindowManager.TRANSIT_DOCK_TASK_FROM_RECENTS; +import static android.view.WindowManager.TRANSIT_UNSET; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_ADD_REMOVE; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_APP_TRANSITIONS; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_ORIENTATION; @@ -32,7 +32,6 @@ import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM; import android.app.ActivityManager.TaskSnapshot; import android.content.res.CompatibilityInfo; import android.content.res.Configuration; -import android.graphics.Rect; import android.os.Debug; import android.os.Handler; import android.os.IBinder; @@ -40,6 +39,8 @@ import android.os.Looper; import android.os.Message; import android.util.Slog; import android.view.IApplicationToken; +import android.view.RemoteAnimationDefinition; +import android.view.WindowManager; import com.android.internal.annotations.VisibleForTesting; import com.android.server.AttributeCache; @@ -393,7 +394,7 @@ public class AppWindowContainerController wtoken.mEnteringAnimation = false; } if (mService.mAppTransition.getAppTransition() - == AppTransition.TRANSIT_TASK_OPEN_BEHIND) { + == WindowManager.TRANSIT_TASK_OPEN_BEHIND) { // We're launchingBehind, add the launching activity to mOpeningApps. final WindowState win = mService.getDefaultDisplayContentLocked().findFocusedWindow(); @@ -695,6 +696,17 @@ public class AppWindowContainerController } } + public void registerRemoteAnimations(RemoteAnimationDefinition definition) { + synchronized (mWindowMap) { + if (mContainer == null) { + Slog.w(TAG_WM, "Attempted to register remote animations with non-existing app" + + " token: " + mToken); + return; + } + mContainer.registerRemoteAnimations(definition); + } + } + void reportStartingWindowDrawn() { mHandler.sendMessage(mHandler.obtainMessage(H.NOTIFY_STARTING_WINDOW_DRAWN)); } diff --git a/services/core/java/com/android/server/wm/AppWindowToken.java b/services/core/java/com/android/server/wm/AppWindowToken.java index ed39159ca5c5..261065f05889 100644 --- a/services/core/java/com/android/server/wm/AppWindowToken.java +++ b/services/core/java/com/android/server/wm/AppWindowToken.java @@ -34,7 +34,7 @@ import static android.view.WindowManager.LayoutParams.TYPE_BASE_APPLICATION; import static com.android.server.policy.WindowManagerPolicy.FINISH_LAYOUT_REDO_ANIM; import static com.android.server.policy.WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER; -import static com.android.server.wm.AppTransition.TRANSIT_UNSET; +import static android.view.WindowManager.TRANSIT_UNSET; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_ADD_REMOVE; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_ANIM; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_APP_TRANSITIONS; @@ -91,6 +91,7 @@ import android.util.Slog; import android.util.proto.ProtoOutputStream; import android.view.DisplayInfo; import android.view.IApplicationToken; +import android.view.RemoteAnimationDefinition; import android.view.SurfaceControl; import android.view.SurfaceControl.Transaction; import android.view.WindowManager; @@ -106,7 +107,6 @@ import com.android.server.wm.WindowManagerService.H; import java.io.PrintWriter; import java.util.ArrayDeque; import java.util.ArrayList; -import java.util.LinkedList; class AppTokenList extends ArrayList<AppWindowToken> { } @@ -250,6 +250,7 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree private final Point mTmpPoint = new Point(); private final Rect mTmpRect = new Rect(); + private RemoteAnimationDefinition mRemoteAnimationDefinition; AppWindowToken(WindowManagerService service, IApplicationToken token, boolean voiceInteraction, DisplayContent dc, long inputDispatchingTimeoutNanos, boolean fullscreen, @@ -393,7 +394,7 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree boolean runningAppAnimation = false; - if (transit != AppTransition.TRANSIT_UNSET) { + if (transit != WindowManager.TRANSIT_UNSET) { if (applyAnimationLocked(lp, transit, visible, isVoiceInteraction)) { delayed = runningAppAnimation = true; } @@ -1900,6 +1901,14 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree mThumbnail = null; } + void registerRemoteAnimations(RemoteAnimationDefinition definition) { + mRemoteAnimationDefinition = definition; + } + + RemoteAnimationDefinition getRemoteAnimationDefinition() { + return mRemoteAnimationDefinition; + } + @Override void dump(PrintWriter pw, String prefix, boolean dumpAll) { super.dump(pw, prefix, dumpAll); diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index a8e00dd53526..ef486614fd2a 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -63,7 +63,7 @@ import static com.android.server.policy.WindowManagerPolicy.FINISH_LAYOUT_REDO_C import static com.android.server.policy.WindowManagerPolicy.FINISH_LAYOUT_REDO_LAYOUT; import static com.android.server.policy.WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER; import static com.android.server.wm.utils.CoordinateTransforms.transformPhysicalToLogicalCoordinates; -import static com.android.server.wm.AppTransition.TRANSIT_KEYGUARD_UNOCCLUDE; +import static android.view.WindowManager.TRANSIT_KEYGUARD_UNOCCLUDE; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_ADD_REMOVE; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_BOOT; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_DISPLAY; diff --git a/services/core/java/com/android/server/wm/DockedStackDividerController.java b/services/core/java/com/android/server/wm/DockedStackDividerController.java index 03c0768cdec0..0cf8d2f85b62 100644 --- a/services/core/java/com/android/server/wm/DockedStackDividerController.java +++ b/services/core/java/com/android/server/wm/DockedStackDividerController.java @@ -29,7 +29,7 @@ import static android.view.WindowManager.DOCKED_RIGHT; import static android.view.WindowManager.DOCKED_TOP; import static com.android.server.wm.AppTransition.DEFAULT_APP_TRANSITION_DURATION; import static com.android.server.wm.AppTransition.TOUCH_RESPONSE_INTERPOLATOR; -import static com.android.server.wm.AppTransition.TRANSIT_NONE; +import static android.view.WindowManager.TRANSIT_NONE; import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME; import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM; import static com.android.server.wm.WindowManagerService.H.NOTIFY_DOCKED_STACK_MINIMIZED_CHANGED; diff --git a/services/core/java/com/android/server/wm/WallpaperController.java b/services/core/java/com/android/server/wm/WallpaperController.java index ac0919d93166..1218d3bc1b9b 100644 --- a/services/core/java/com/android/server/wm/WallpaperController.java +++ b/services/core/java/com/android/server/wm/WallpaperController.java @@ -25,7 +25,7 @@ import static android.view.WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED; import static android.view.WindowManager.LayoutParams.TYPE_WALLPAPER; import static com.android.server.policy.WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER; -import static com.android.server.wm.AppTransition.TRANSIT_FLAG_KEYGUARD_GOING_AWAY_WITH_WALLPAPER; +import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_GOING_AWAY_WITH_WALLPAPER; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_APP_TRANSITIONS; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_WALLPAPER; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_WALLPAPER_LIGHT; diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index a91eb4f42aa2..0fedc795c16c 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -88,7 +88,6 @@ import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_ORIENTATION; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_SCREENSHOT; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_SCREEN_ON; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_STARTING_WINDOW; -import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_TASK_POSITIONING; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_VISIBILITY; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_WALLPAPER_LIGHT; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_WINDOW_MOVEMENT; @@ -214,15 +213,15 @@ import android.view.PointerIcon; import android.view.RemoteAnimationAdapter; import android.view.Surface; import android.view.SurfaceControl; -import android.view.SurfaceControl.Builder; import android.view.SurfaceSession; import android.view.View; import android.view.WindowContentFrameStats; import android.view.WindowManager; import android.view.WindowManager.LayoutParams; +import android.view.WindowManager.TransitionFlags; +import android.view.WindowManager.TransitionType; import android.view.WindowManagerGlobal; import android.view.WindowManagerPolicyConstants.PointerEventListener; -import android.view.animation.Animation; import android.view.inputmethod.InputMethodManagerInternal; import com.android.internal.R; @@ -1542,7 +1541,7 @@ public class WindowManagerService extends IWindowManager.Stub // We treat this as if this activity was opening, so we can trigger the app transition // animation and piggy-back on existing transition animation infrastructure. mOpeningApps.add(atoken); - prepareAppTransition(AppTransition.TRANSIT_ACTIVITY_RELAUNCH, ALWAYS_KEEP_CURRENT); + prepareAppTransition(WindowManager.TRANSIT_ACTIVITY_RELAUNCH, ALWAYS_KEEP_CURRENT); mAppTransition.overridePendingAppTransitionClipReveal(frame.left, frame.top, frame.width(), frame.height()); executeAppTransition(); @@ -1556,7 +1555,7 @@ public class WindowManagerService extends IWindowManager.Stub // we don't set up the transition anymore and just let it go. if (mDisplayFrozen && !mOpeningApps.contains(atoken) && atoken.isRelaunching()) { mOpeningApps.add(atoken); - prepareAppTransition(AppTransition.TRANSIT_NONE, !ALWAYS_KEEP_CURRENT); + prepareAppTransition(WindowManager.TRANSIT_NONE, !ALWAYS_KEEP_CURRENT); executeAppTransition(); } } @@ -2511,7 +2510,7 @@ public class WindowManagerService extends IWindowManager.Stub } @Override - public void prepareAppTransition(int transit, boolean alwaysKeepCurrent) { + public void prepareAppTransition(@TransitionType int transit, boolean alwaysKeepCurrent) { prepareAppTransition(transit, alwaysKeepCurrent, 0 /* flags */, false /* forceOverride */); } @@ -2524,8 +2523,8 @@ public class WindowManagerService extends IWindowManager.Stub * AppTransition.TRANSIT_FLAG_*. * @param forceOverride Always override the transit, not matter what was set previously. */ - public void prepareAppTransition(int transit, boolean alwaysKeepCurrent, int flags, - boolean forceOverride) { + public void prepareAppTransition(@TransitionType int transit, boolean alwaysKeepCurrent, + @TransitionFlags int flags, boolean forceOverride) { if (!checkCallingPermission(MANAGE_APP_TOKENS, "prepareAppTransition()")) { throw new SecurityException("Requires MANAGE_APP_TOKENS permission"); } @@ -2541,7 +2540,7 @@ public class WindowManagerService extends IWindowManager.Stub } @Override - public int getPendingAppTransition() { + public @TransitionType int getPendingAppTransition() { return mAppTransition.getAppTransition(); } diff --git a/services/core/java/com/android/server/wm/WindowSurfacePlacer.java b/services/core/java/com/android/server/wm/WindowSurfacePlacer.java index 017b3251696e..7364e87227e4 100644 --- a/services/core/java/com/android/server/wm/WindowSurfacePlacer.java +++ b/services/core/java/com/android/server/wm/WindowSurfacePlacer.java @@ -23,23 +23,23 @@ import static android.app.ActivityManagerInternal.APP_TRANSITION_WINDOWS_DRAWN; import static com.android.server.policy.WindowManagerPolicy.FINISH_LAYOUT_REDO_CONFIG; import static com.android.server.policy.WindowManagerPolicy.FINISH_LAYOUT_REDO_LAYOUT; -import static com.android.server.wm.AppTransition.TRANSIT_ACTIVITY_CLOSE; -import static com.android.server.wm.AppTransition.TRANSIT_ACTIVITY_OPEN; -import static com.android.server.wm.AppTransition.TRANSIT_FLAG_KEYGUARD_GOING_AWAY_NO_ANIMATION; -import static com.android.server.wm.AppTransition.TRANSIT_FLAG_KEYGUARD_GOING_AWAY_TO_SHADE; -import static com.android.server.wm.AppTransition.TRANSIT_FLAG_KEYGUARD_GOING_AWAY_WITH_WALLPAPER; -import static com.android.server.wm.AppTransition.TRANSIT_KEYGUARD_GOING_AWAY; -import static com.android.server.wm.AppTransition.TRANSIT_KEYGUARD_GOING_AWAY_ON_WALLPAPER; -import static com.android.server.wm.AppTransition.TRANSIT_NONE; -import static com.android.server.wm.AppTransition.TRANSIT_TASK_CLOSE; -import static com.android.server.wm.AppTransition.TRANSIT_TASK_IN_PLACE; -import static com.android.server.wm.AppTransition.TRANSIT_TASK_OPEN; -import static com.android.server.wm.AppTransition.TRANSIT_TASK_TO_BACK; -import static com.android.server.wm.AppTransition.TRANSIT_TASK_TO_FRONT; -import static com.android.server.wm.AppTransition.TRANSIT_WALLPAPER_CLOSE; -import static com.android.server.wm.AppTransition.TRANSIT_WALLPAPER_INTRA_CLOSE; -import static com.android.server.wm.AppTransition.TRANSIT_WALLPAPER_INTRA_OPEN; -import static com.android.server.wm.AppTransition.TRANSIT_WALLPAPER_OPEN; +import static android.view.WindowManager.TRANSIT_ACTIVITY_CLOSE; +import static android.view.WindowManager.TRANSIT_ACTIVITY_OPEN; +import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_GOING_AWAY_NO_ANIMATION; +import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_GOING_AWAY_TO_SHADE; +import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_GOING_AWAY_WITH_WALLPAPER; +import static android.view.WindowManager.TRANSIT_KEYGUARD_GOING_AWAY; +import static android.view.WindowManager.TRANSIT_KEYGUARD_GOING_AWAY_ON_WALLPAPER; +import static android.view.WindowManager.TRANSIT_NONE; +import static android.view.WindowManager.TRANSIT_TASK_CLOSE; +import static android.view.WindowManager.TRANSIT_TASK_IN_PLACE; +import static android.view.WindowManager.TRANSIT_TASK_OPEN; +import static android.view.WindowManager.TRANSIT_TASK_TO_BACK; +import static android.view.WindowManager.TRANSIT_TASK_TO_FRONT; +import static android.view.WindowManager.TRANSIT_WALLPAPER_CLOSE; +import static android.view.WindowManager.TRANSIT_WALLPAPER_INTRA_CLOSE; +import static android.view.WindowManager.TRANSIT_WALLPAPER_INTRA_OPEN; +import static android.view.WindowManager.TRANSIT_WALLPAPER_OPEN; import static com.android.server.wm.AppTransition.isKeyguardGoingAwayTransit; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_APP_TRANSITIONS; @@ -57,14 +57,19 @@ import android.util.ArraySet; import android.util.Slog; import android.util.SparseIntArray; import android.view.Display; +import android.view.RemoteAnimationAdapter; +import android.view.RemoteAnimationDefinition; import android.view.SurfaceControl; +import android.view.WindowManager; import android.view.WindowManager.LayoutParams; +import android.view.WindowManager.TransitionType; import android.view.animation.Animation; import com.android.server.wm.WindowManagerService.H; import java.io.PrintWriter; import java.util.ArrayList; +import java.util.function.Predicate; /** * Positions windows and their surfaces. @@ -247,7 +252,7 @@ class WindowSurfacePlacer { if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "**** GOOD TO GO"); int transit = mService.mAppTransition.getAppTransition(); if (mService.mSkipAppTransitionAnimation && !isKeyguardGoingAwayTransit(transit)) { - transit = AppTransition.TRANSIT_UNSET; + transit = WindowManager.TRANSIT_UNSET; } mService.mSkipAppTransitionAnimation = false; mService.mNoAnimationNotifyOnTransitionFinished.clear(); @@ -255,17 +260,9 @@ class WindowSurfacePlacer { mService.mH.removeMessages(H.APP_TRANSITION_TIMEOUT); final DisplayContent displayContent = mService.getDefaultDisplayContentLocked(); - // TODO: Don't believe this is really needed... - //mService.mWindowsChanged = true; mService.mRoot.mWallpaperMayChange = false; - // The top-most window will supply the layout params, and we will determine it below. - LayoutParams animLp = null; - int bestAnimLayer = -1; - boolean fullscreenAnim = false; - boolean voiceInteraction = false; - int i; for (i = 0; i < appsCount; i++) { final AppWindowToken wtoken = mService.mOpeningApps.valueAt(i); @@ -274,7 +271,6 @@ class WindowSurfacePlacer { // visibility. We need to clear it *before* maybeUpdateTransitToWallpaper() as the // transition selection depends on wallpaper target visibility. wtoken.clearAnimatingFlags(); - } // Adjust wallpaper before we pull the lower/upper target, since pending changes @@ -283,62 +279,30 @@ class WindowSurfacePlacer { mWallpaperControllerLocked.adjustWallpaperWindowsForAppTransitionIfNeeded(displayContent, mService.mOpeningApps); - final WindowState wallpaperTarget = mWallpaperControllerLocked.getWallpaperTarget(); - boolean openingAppHasWallpaper = false; - boolean closingAppHasWallpaper = false; - - // Do a first pass through the tokens for two things: - // (1) Determine if both the closing and opening app token sets are wallpaper targets, in - // which case special animations are needed (since the wallpaper needs to stay static behind - // them). - // (2) Find the layout params of the top-most application window in the tokens, which is - // what will control the animation theme. - final int closingAppsCount = mService.mClosingApps.size(); - appsCount = closingAppsCount + mService.mOpeningApps.size(); - for (i = 0; i < appsCount; i++) { - final AppWindowToken wtoken; - if (i < closingAppsCount) { - wtoken = mService.mClosingApps.valueAt(i); - if (wallpaperTarget != null && wtoken.windowsCanBeWallpaperTarget()) { - closingAppHasWallpaper = true; - } - } else { - wtoken = mService.mOpeningApps.valueAt(i - closingAppsCount); - if (wallpaperTarget != null && wtoken.windowsCanBeWallpaperTarget()) { - openingAppHasWallpaper = true; - } - } - - voiceInteraction |= wtoken.mVoiceInteraction; - - if (wtoken.fillsParent()) { - final WindowState ws = wtoken.findMainWindow(); - if (ws != null) { - animLp = ws.mAttrs; - bestAnimLayer = ws.mLayer; - fullscreenAnim = true; - } - } else if (!fullscreenAnim) { - final WindowState ws = wtoken.findMainWindow(); - if (ws != null) { - if (ws.mLayer > bestAnimLayer) { - animLp = ws.mAttrs; - bestAnimLayer = ws.mLayer; - } - } - } - } + // Determine if closing and opening app token sets are wallpaper targets, in which case + // special animations are needed. + final boolean hasWallpaperTarget = mWallpaperControllerLocked.getWallpaperTarget() != null; + final boolean openingAppHasWallpaper = canBeWallpaperTarget(mService.mOpeningApps) + && hasWallpaperTarget; + final boolean closingAppHasWallpaper = canBeWallpaperTarget(mService.mClosingApps) + && hasWallpaperTarget; transit = maybeUpdateTransitToWallpaper(transit, openingAppHasWallpaper, closingAppHasWallpaper); - // If all closing windows are obscured, then there is no need to do an animation. This is - // the case, for example, when this transition is being done behind the lock screen. - if (!mService.mPolicy.allowAppAnimationsLw()) { - if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, - "Animations disallowed by keyguard or dream."); - animLp = null; - } + // Find the layout params of the top-most application window in the tokens, which is + // what will control the animation theme. If all closing windows are obscured, then there is + // no need to do an animation. This is the case, for example, when this transition is being + // done behind a dream window. + final AppWindowToken animLpToken = mService.mPolicy.allowAppAnimationsLw() + ? findAnimLayoutParamsToken(transit) + : null; + + final LayoutParams animLp = getAnimLp(animLpToken); + overrideWithRemoteAnimationIfSet(animLpToken, transit); + + final boolean voiceInteraction = containsVoiceInteraction(mService.mOpeningApps) + || containsVoiceInteraction(mService.mOpeningApps); final int layoutRedo; mService.mSurfaceAnimationRunner.deferStartingAnimations(); @@ -388,6 +352,81 @@ class WindowSurfacePlacer { return layoutRedo | FINISH_LAYOUT_REDO_LAYOUT | FINISH_LAYOUT_REDO_CONFIG; } + private static LayoutParams getAnimLp(AppWindowToken wtoken) { + final WindowState mainWindow = wtoken != null ? wtoken.findMainWindow() : null; + return mainWindow != null ? mainWindow.mAttrs : null; + } + + /** + * Overrides the pending transition with the remote animation defined for the transition in the + * set of defined remote animations in the app window token. + */ + private void overrideWithRemoteAnimationIfSet(AppWindowToken animLpToken, int transit) { + if (animLpToken == null) { + return; + } + final RemoteAnimationDefinition definition = animLpToken.getRemoteAnimationDefinition(); + if (definition != null) { + final RemoteAnimationAdapter adapter = definition.getAdapter(transit); + if (adapter != null) { + mService.mAppTransition.overridePendingAppTransitionRemote(adapter); + } + } + } + + /** + * @return The window token that determines the animation theme. + */ + private AppWindowToken findAnimLayoutParamsToken(@TransitionType int transit) { + AppWindowToken result; + + // Remote animations always win, but fullscreen tokens override non-fullscreen tokens. + result = lookForHighestTokenWithFilter(mService.mClosingApps, mService.mOpeningApps, + w -> w.getRemoteAnimationDefinition() != null + && w.getRemoteAnimationDefinition().hasTransition(transit)); + if (result != null) { + return result; + } + result = lookForHighestTokenWithFilter(mService.mClosingApps, mService.mOpeningApps, + w -> w.fillsParent() && w.findMainWindow() != null); + if (result != null) { + return result; + } + return lookForHighestTokenWithFilter(mService.mClosingApps, mService.mOpeningApps, + w -> w.findMainWindow() != null); + } + + private AppWindowToken lookForHighestTokenWithFilter(ArraySet<AppWindowToken> array1, + ArraySet<AppWindowToken> array2, Predicate<AppWindowToken> filter) { + final int array1count = array1.size(); + final int count = array1count + array2.size(); + int bestPrefixOrderIndex = Integer.MIN_VALUE; + AppWindowToken bestToken = null; + for (int i = 0; i < count; i++) { + final AppWindowToken wtoken; + if (i < array1count) { + wtoken = array1.valueAt(i); + } else { + wtoken = array2.valueAt(i - array1count); + } + final int prefixOrderIndex = wtoken.getPrefixOrderIndex(); + if (filter.test(wtoken) && prefixOrderIndex > bestPrefixOrderIndex) { + bestPrefixOrderIndex = prefixOrderIndex; + bestToken = wtoken; + } + } + return bestToken; + } + + private boolean containsVoiceInteraction(ArraySet<AppWindowToken> apps) { + for (int i = apps.size() - 1; i >= 0; i--) { + if (apps.valueAt(i).mVoiceInteraction) { + return true; + } + } + return false; + } + private AppWindowToken handleOpeningApps(int transit, LayoutParams animLp, boolean voiceInteraction) { AppWindowToken topOpeningApp = null; diff --git a/services/tests/servicestests/src/com/android/server/wm/AppTransitionTests.java b/services/tests/servicestests/src/com/android/server/wm/AppTransitionTests.java index 77f96ca37e36..e7e55cd4404e 100644 --- a/services/tests/servicestests/src/com/android/server/wm/AppTransitionTests.java +++ b/services/tests/servicestests/src/com/android/server/wm/AppTransitionTests.java @@ -16,9 +16,9 @@ package com.android.server.wm; -import static com.android.server.wm.AppTransition.TRANSIT_ACTIVITY_OPEN; -import static com.android.server.wm.AppTransition.TRANSIT_KEYGUARD_GOING_AWAY; -import static com.android.server.wm.AppTransition.TRANSIT_KEYGUARD_UNOCCLUDE; +import static android.view.WindowManager.TRANSIT_ACTIVITY_OPEN; +import static android.view.WindowManager.TRANSIT_KEYGUARD_GOING_AWAY; +import static android.view.WindowManager.TRANSIT_KEYGUARD_UNOCCLUDE; import static org.junit.Assert.assertEquals; import android.content.Context; diff --git a/services/tests/servicestests/src/com/android/server/wm/TaskSnapshotControllerTest.java b/services/tests/servicestests/src/com/android/server/wm/TaskSnapshotControllerTest.java index f253632a1765..920796ed6a30 100644 --- a/services/tests/servicestests/src/com/android/server/wm/TaskSnapshotControllerTest.java +++ b/services/tests/servicestests/src/com/android/server/wm/TaskSnapshotControllerTest.java @@ -18,7 +18,7 @@ package com.android.server.wm; import static android.view.WindowManager.LayoutParams.FIRST_APPLICATION_WINDOW; import static android.view.WindowManager.LayoutParams.FLAG_SECURE; -import static com.android.server.wm.AppTransition.TRANSIT_UNSET; +import static android.view.WindowManager.TRANSIT_UNSET; import static com.android.server.wm.TaskSnapshotController.*; import static junit.framework.Assert.assertEquals; import static junit.framework.Assert.assertFalse; |