1f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi/* 2f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi * Copyright (C) 2018 The Android Open Source Project 3f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi * 4f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi * Licensed under the Apache License, Version 2.0 (the "License"); 5f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi * you may not use this file except in compliance with the License. 6f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi * You may obtain a copy of the License at 7f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi * 8f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi * http://www.apache.org/licenses/LICENSE-2.0 9f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi * 10f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi * Unless required by applicable law or agreed to in writing, software 11f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi * distributed under the License is distributed on an "AS IS" BASIS, 12f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi * See the License for the specific language governing permissions and 14f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi * limitations under the License 15f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi */ 16f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi 17f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggipackage android.view; 18f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi 1977be157a9ebe7c85687c38921322608950ceef14Jorim Jaggiimport static android.app.WindowConfiguration.ACTIVITY_TYPE_UNDEFINED; 2077be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi 21f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggiimport android.annotation.Nullable; 2277be157a9ebe7c85687c38921322608950ceef14Jorim Jaggiimport android.app.WindowConfiguration; 2377be157a9ebe7c85687c38921322608950ceef14Jorim Jaggiimport android.app.WindowConfiguration.ActivityType; 24f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggiimport android.os.Parcel; 25f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggiimport android.os.Parcelable; 2677be157a9ebe7c85687c38921322608950ceef14Jorim Jaggiimport android.util.ArraySet; 27f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggiimport android.util.SparseArray; 28f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggiimport android.view.WindowManager.TransitionType; 29f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi 30f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi/** 31f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi * Defines which animation types should be overridden by which remote animation. 32f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi * 33f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi * @hide 34f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi */ 35f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggipublic class RemoteAnimationDefinition implements Parcelable { 36f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi 3777be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi private final SparseArray<RemoteAnimationAdapterEntry> mTransitionAnimationMap; 38f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi 39f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi public RemoteAnimationDefinition() { 40f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi mTransitionAnimationMap = new SparseArray<>(); 41f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi } 42f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi 43f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi /** 44f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi * Registers a remote animation for a specific transition. 45f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi * 46f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi * @param transition The transition type. Must be one of WindowManager.TRANSIT_* values. 4777be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi * @param activityTypeFilter The remote animation only runs if an activity with type of this 4877be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi * parameter is involved in the transition. 4977be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi * @param adapter The adapter that described how to run the remote animation. 5077be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi */ 5177be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi public void addRemoteAnimation(@TransitionType int transition, 5277be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi @ActivityType int activityTypeFilter, RemoteAnimationAdapter adapter) { 5377be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi mTransitionAnimationMap.put(transition, 5477be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi new RemoteAnimationAdapterEntry(adapter, activityTypeFilter)); 5577be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi } 5677be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi 5777be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi /** 5877be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi * Registers a remote animation for a specific transition without defining an activity type 5977be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi * filter. 6077be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi * 6177be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi * @param transition The transition type. Must be one of WindowManager.TRANSIT_* values. 62f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi * @param adapter The adapter that described how to run the remote animation. 63f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi */ 64f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi public void addRemoteAnimation(@TransitionType int transition, RemoteAnimationAdapter adapter) { 6577be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi addRemoteAnimation(transition, ACTIVITY_TYPE_UNDEFINED, adapter); 66f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi } 67f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi 68f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi /** 69f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi * Checks whether a remote animation for specific transition is defined. 70f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi * 71f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi * @param transition The transition type. Must be one of WindowManager.TRANSIT_* values. 7277be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi * @param activityTypes The set of activity types of activities that are involved in the 7377be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi * transition. Will be used for filtering. 74f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi * @return Whether this definition has defined a remote animation for the specified transition. 75f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi */ 7677be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi public boolean hasTransition(@TransitionType int transition, ArraySet<Integer> activityTypes) { 7777be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi return getAdapter(transition, activityTypes) != null; 78f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi } 79f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi 80f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi /** 81f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi * Retrieves the remote animation for a specific transition. 82f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi * 83f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi * @param transition The transition type. Must be one of WindowManager.TRANSIT_* values. 8477be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi * @param activityTypes The set of activity types of activities that are involved in the 8577be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi * transition. Will be used for filtering. 86f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi * @return The remote animation adapter for the specified transition. 87f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi */ 8877be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi public @Nullable RemoteAnimationAdapter getAdapter(@TransitionType int transition, 8977be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi ArraySet<Integer> activityTypes) { 9077be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi final RemoteAnimationAdapterEntry entry = mTransitionAnimationMap.get(transition); 9177be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi if (entry == null) { 9277be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi return null; 9377be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi } 9477be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi if (entry.activityTypeFilter == ACTIVITY_TYPE_UNDEFINED 9577be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi || activityTypes.contains(entry.activityTypeFilter)) { 9677be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi return entry.adapter; 9777be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi } else { 9877be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi return null; 9977be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi } 100f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi } 101f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi 102f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi public RemoteAnimationDefinition(Parcel in) { 10377be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi final int size = in.readInt(); 10477be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi mTransitionAnimationMap = new SparseArray<>(size); 10577be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi for (int i = 0; i < size; i++) { 10677be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi final int transition = in.readInt(); 10777be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi final RemoteAnimationAdapterEntry entry = in.readTypedObject( 10877be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi RemoteAnimationAdapterEntry.CREATOR); 10977be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi mTransitionAnimationMap.put(transition, entry); 11077be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi } 111f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi } 112f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi 113bc2aabe84568c6b1a54c1b1467a539781488c8caJorim Jaggi /** 114bc2aabe84568c6b1a54c1b1467a539781488c8caJorim Jaggi * To be called by system_server to keep track which pid is running the remote animations inside 115bc2aabe84568c6b1a54c1b1467a539781488c8caJorim Jaggi * this definition. 116bc2aabe84568c6b1a54c1b1467a539781488c8caJorim Jaggi */ 117bc2aabe84568c6b1a54c1b1467a539781488c8caJorim Jaggi public void setCallingPid(int pid) { 118bc2aabe84568c6b1a54c1b1467a539781488c8caJorim Jaggi for (int i = mTransitionAnimationMap.size() - 1; i >= 0; i--) { 11977be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi mTransitionAnimationMap.valueAt(i).adapter.setCallingPid(pid); 120bc2aabe84568c6b1a54c1b1467a539781488c8caJorim Jaggi } 121bc2aabe84568c6b1a54c1b1467a539781488c8caJorim Jaggi } 122bc2aabe84568c6b1a54c1b1467a539781488c8caJorim Jaggi 123f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi @Override 124f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi public int describeContents() { 125f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi return 0; 126f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi } 127f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi 128f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi @Override 129f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi public void writeToParcel(Parcel dest, int flags) { 13077be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi final int size = mTransitionAnimationMap.size(); 13177be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi dest.writeInt(size); 13277be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi for (int i = 0; i < size; i++) { 13377be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi dest.writeInt(mTransitionAnimationMap.keyAt(i)); 13477be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi dest.writeTypedObject(mTransitionAnimationMap.valueAt(i), flags); 13577be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi } 136f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi } 137f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi 138f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi public static final Creator<RemoteAnimationDefinition> CREATOR = 139f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi new Creator<RemoteAnimationDefinition>() { 140f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi public RemoteAnimationDefinition createFromParcel(Parcel in) { 141f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi return new RemoteAnimationDefinition(in); 142f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi } 143f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi 144f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi public RemoteAnimationDefinition[] newArray(int size) { 145f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi return new RemoteAnimationDefinition[size]; 146f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi } 147f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi }; 14877be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi 14977be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi private static class RemoteAnimationAdapterEntry implements Parcelable { 15077be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi 15177be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi final RemoteAnimationAdapter adapter; 15277be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi 15377be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi /** 15477be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi * Only run the transition if one of the activities matches the filter. 15577be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi * {@link WindowConfiguration.ACTIVITY_TYPE_UNDEFINED} means no filter 15677be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi */ 15777be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi @ActivityType final int activityTypeFilter; 15877be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi 15977be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi RemoteAnimationAdapterEntry(RemoteAnimationAdapter adapter, int activityTypeFilter) { 16077be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi this.adapter = adapter; 16177be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi this.activityTypeFilter = activityTypeFilter; 16277be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi } 16377be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi 16477be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi private RemoteAnimationAdapterEntry(Parcel in) { 16577be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi adapter = in.readParcelable(RemoteAnimationAdapter.class.getClassLoader()); 16677be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi activityTypeFilter = in.readInt(); 16777be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi } 16877be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi 16977be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi @Override 17077be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi public void writeToParcel(Parcel dest, int flags) { 17177be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi dest.writeParcelable(adapter, flags); 17277be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi dest.writeInt(activityTypeFilter); 17377be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi } 17477be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi 17577be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi @Override 17677be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi public int describeContents() { 17777be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi return 0; 17877be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi } 17977be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi 18077be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi private static final Creator<RemoteAnimationAdapterEntry> CREATOR 18177be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi = new Creator<RemoteAnimationAdapterEntry>() { 18277be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi 18377be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi @Override 18477be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi public RemoteAnimationAdapterEntry createFromParcel(Parcel in) { 18577be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi return new RemoteAnimationAdapterEntry(in); 18677be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi } 18777be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi 18877be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi @Override 18977be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi public RemoteAnimationAdapterEntry[] newArray(int size) { 19077be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi return new RemoteAnimationAdapterEntry[size]; 19177be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi } 19277be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi }; 19377be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi } 194f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi} 195