1be8e696a1f40a61c52a74022f4f084fdc0600f90Winson/* 2be8e696a1f40a61c52a74022f4f084fdc0600f90Winson * Copyright (C) 2016 The Android Open Source Project 3be8e696a1f40a61c52a74022f4f084fdc0600f90Winson * 4be8e696a1f40a61c52a74022f4f084fdc0600f90Winson * Licensed under the Apache License, Version 2.0 (the "License"); 5be8e696a1f40a61c52a74022f4f084fdc0600f90Winson * you may not use this file except in compliance with the License. 6be8e696a1f40a61c52a74022f4f084fdc0600f90Winson * You may obtain a copy of the License at 7be8e696a1f40a61c52a74022f4f084fdc0600f90Winson * 8be8e696a1f40a61c52a74022f4f084fdc0600f90Winson * http://www.apache.org/licenses/LICENSE-2.0 9be8e696a1f40a61c52a74022f4f084fdc0600f90Winson * 10be8e696a1f40a61c52a74022f4f084fdc0600f90Winson * Unless required by applicable law or agreed to in writing, software 11be8e696a1f40a61c52a74022f4f084fdc0600f90Winson * distributed under the License is distributed on an "AS IS" BASIS, 12be8e696a1f40a61c52a74022f4f084fdc0600f90Winson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13be8e696a1f40a61c52a74022f4f084fdc0600f90Winson * See the License for the specific language governing permissions and 14be8e696a1f40a61c52a74022f4f084fdc0600f90Winson * limitations under the License. 15be8e696a1f40a61c52a74022f4f084fdc0600f90Winson */ 16be8e696a1f40a61c52a74022f4f084fdc0600f90Winson 17be8e696a1f40a61c52a74022f4f084fdc0600f90Winsonpackage com.android.systemui.recents.views; 18be8e696a1f40a61c52a74022f4f084fdc0600f90Winson 19be8e696a1f40a61c52a74022f4f084fdc0600f90Winsonimport android.animation.Animator; 20be8e696a1f40a61c52a74022f4f084fdc0600f90Winsonimport android.animation.AnimatorSet; 213f32e7eba7aec02edbf542cc11eee13264a5abf2Winsonimport android.animation.ValueAnimator; 22be8e696a1f40a61c52a74022f4f084fdc0600f90Winsonimport android.annotation.IntDef; 23be8e696a1f40a61c52a74022f4f084fdc0600f90Winsonimport android.util.SparseArray; 24be8e696a1f40a61c52a74022f4f084fdc0600f90Winsonimport android.util.SparseLongArray; 25be8e696a1f40a61c52a74022f4f084fdc0600f90Winsonimport android.view.View; 26be8e696a1f40a61c52a74022f4f084fdc0600f90Winsonimport android.view.animation.Interpolator; 27be8e696a1f40a61c52a74022f4f084fdc0600f90Winson 28be8e696a1f40a61c52a74022f4f084fdc0600f90Winsonimport com.android.systemui.Interpolators; 29be8e696a1f40a61c52a74022f4f084fdc0600f90Winson 30be8e696a1f40a61c52a74022f4f084fdc0600f90Winsonimport java.lang.annotation.Retention; 31be8e696a1f40a61c52a74022f4f084fdc0600f90Winsonimport java.lang.annotation.RetentionPolicy; 32be8e696a1f40a61c52a74022f4f084fdc0600f90Winsonimport java.util.List; 33be8e696a1f40a61c52a74022f4f084fdc0600f90Winson 34be8e696a1f40a61c52a74022f4f084fdc0600f90Winson/** 35be8e696a1f40a61c52a74022f4f084fdc0600f90Winson * The generic set of animation properties to animate a {@link View}. The animation can have 36be8e696a1f40a61c52a74022f4f084fdc0600f90Winson * different interpolators, start delays and durations for each of the different properties. 37be8e696a1f40a61c52a74022f4f084fdc0600f90Winson */ 38be8e696a1f40a61c52a74022f4f084fdc0600f90Winsonpublic class AnimationProps { 39be8e696a1f40a61c52a74022f4f084fdc0600f90Winson 40be8e696a1f40a61c52a74022f4f084fdc0600f90Winson public static final AnimationProps IMMEDIATE = new AnimationProps(0, Interpolators.LINEAR); 41be8e696a1f40a61c52a74022f4f084fdc0600f90Winson 42be8e696a1f40a61c52a74022f4f084fdc0600f90Winson @Retention(RetentionPolicy.SOURCE) 43be8e696a1f40a61c52a74022f4f084fdc0600f90Winson @IntDef({ALL, TRANSLATION_X, TRANSLATION_Y, TRANSLATION_Z, ALPHA, SCALE, BOUNDS}) 44be8e696a1f40a61c52a74022f4f084fdc0600f90Winson public @interface PropType {} 45be8e696a1f40a61c52a74022f4f084fdc0600f90Winson 46be8e696a1f40a61c52a74022f4f084fdc0600f90Winson public static final int ALL = 0; 47be8e696a1f40a61c52a74022f4f084fdc0600f90Winson public static final int TRANSLATION_X = 1; 48be8e696a1f40a61c52a74022f4f084fdc0600f90Winson public static final int TRANSLATION_Y = 2; 49be8e696a1f40a61c52a74022f4f084fdc0600f90Winson public static final int TRANSLATION_Z = 3; 50be8e696a1f40a61c52a74022f4f084fdc0600f90Winson public static final int ALPHA = 4; 51be8e696a1f40a61c52a74022f4f084fdc0600f90Winson public static final int SCALE = 5; 52be8e696a1f40a61c52a74022f4f084fdc0600f90Winson public static final int BOUNDS = 6; 531bcf3c4742da5a1d9c04c73efac5c2418142c262Winson public static final int DIM_ALPHA = 7; 54680888123db816ad0c5f082d1e9b3f9b756bc7b6Winson public static final int FOCUS_STATE = 8; 55be8e696a1f40a61c52a74022f4f084fdc0600f90Winson 56be8e696a1f40a61c52a74022f4f084fdc0600f90Winson private SparseLongArray mPropStartDelay; 57be8e696a1f40a61c52a74022f4f084fdc0600f90Winson private SparseLongArray mPropDuration; 58be8e696a1f40a61c52a74022f4f084fdc0600f90Winson private SparseArray<Interpolator> mPropInterpolators; 59be8e696a1f40a61c52a74022f4f084fdc0600f90Winson private Animator.AnimatorListener mListener; 60be8e696a1f40a61c52a74022f4f084fdc0600f90Winson 61be8e696a1f40a61c52a74022f4f084fdc0600f90Winson /** 62be8e696a1f40a61c52a74022f4f084fdc0600f90Winson * The builder constructor. 63be8e696a1f40a61c52a74022f4f084fdc0600f90Winson */ 64be8e696a1f40a61c52a74022f4f084fdc0600f90Winson public AnimationProps() {} 65be8e696a1f40a61c52a74022f4f084fdc0600f90Winson 66be8e696a1f40a61c52a74022f4f084fdc0600f90Winson /** 67be8e696a1f40a61c52a74022f4f084fdc0600f90Winson * Creates an animation with a default {@param duration} and {@param interpolator} for all 68be8e696a1f40a61c52a74022f4f084fdc0600f90Winson * properties in this animation. 69be8e696a1f40a61c52a74022f4f084fdc0600f90Winson */ 70be8e696a1f40a61c52a74022f4f084fdc0600f90Winson public AnimationProps(int duration, Interpolator interpolator) { 71be8e696a1f40a61c52a74022f4f084fdc0600f90Winson this(0, duration, interpolator, null); 72be8e696a1f40a61c52a74022f4f084fdc0600f90Winson } 73be8e696a1f40a61c52a74022f4f084fdc0600f90Winson 74be8e696a1f40a61c52a74022f4f084fdc0600f90Winson /** 75be8e696a1f40a61c52a74022f4f084fdc0600f90Winson * Creates an animation with a default {@param duration} and {@param interpolator} for all 76be8e696a1f40a61c52a74022f4f084fdc0600f90Winson * properties in this animation. 77be8e696a1f40a61c52a74022f4f084fdc0600f90Winson */ 78be8e696a1f40a61c52a74022f4f084fdc0600f90Winson public AnimationProps(int duration, Interpolator interpolator, 79be8e696a1f40a61c52a74022f4f084fdc0600f90Winson Animator.AnimatorListener listener) { 80be8e696a1f40a61c52a74022f4f084fdc0600f90Winson this(0, duration, interpolator, listener); 81be8e696a1f40a61c52a74022f4f084fdc0600f90Winson } 82be8e696a1f40a61c52a74022f4f084fdc0600f90Winson 83be8e696a1f40a61c52a74022f4f084fdc0600f90Winson /** 84be8e696a1f40a61c52a74022f4f084fdc0600f90Winson * Creates an animation with a default {@param startDelay}, {@param duration} and 85be8e696a1f40a61c52a74022f4f084fdc0600f90Winson * {@param interpolator} for all properties in this animation. 86be8e696a1f40a61c52a74022f4f084fdc0600f90Winson */ 87be8e696a1f40a61c52a74022f4f084fdc0600f90Winson public AnimationProps(int startDelay, int duration, Interpolator interpolator) { 88be8e696a1f40a61c52a74022f4f084fdc0600f90Winson this(startDelay, duration, interpolator, null); 89be8e696a1f40a61c52a74022f4f084fdc0600f90Winson } 90be8e696a1f40a61c52a74022f4f084fdc0600f90Winson 91be8e696a1f40a61c52a74022f4f084fdc0600f90Winson /** 92be8e696a1f40a61c52a74022f4f084fdc0600f90Winson * Creates an animation with a default {@param startDelay}, {@param duration} and 93be8e696a1f40a61c52a74022f4f084fdc0600f90Winson * {@param interpolator} for all properties in this animation. 94be8e696a1f40a61c52a74022f4f084fdc0600f90Winson */ 95be8e696a1f40a61c52a74022f4f084fdc0600f90Winson public AnimationProps(int startDelay, int duration, Interpolator interpolator, 96be8e696a1f40a61c52a74022f4f084fdc0600f90Winson Animator.AnimatorListener listener) { 97be8e696a1f40a61c52a74022f4f084fdc0600f90Winson setStartDelay(ALL, startDelay); 98be8e696a1f40a61c52a74022f4f084fdc0600f90Winson setDuration(ALL, duration); 99be8e696a1f40a61c52a74022f4f084fdc0600f90Winson setInterpolator(ALL, interpolator); 100be8e696a1f40a61c52a74022f4f084fdc0600f90Winson setListener(listener); 101be8e696a1f40a61c52a74022f4f084fdc0600f90Winson } 102be8e696a1f40a61c52a74022f4f084fdc0600f90Winson 103be8e696a1f40a61c52a74022f4f084fdc0600f90Winson /** 104be8e696a1f40a61c52a74022f4f084fdc0600f90Winson * Creates a new {@link AnimatorSet} that will animate the given animators. Callers need to 105be8e696a1f40a61c52a74022f4f084fdc0600f90Winson * manually apply the individual animation properties for each of the animators respectively. 106be8e696a1f40a61c52a74022f4f084fdc0600f90Winson */ 107be8e696a1f40a61c52a74022f4f084fdc0600f90Winson public AnimatorSet createAnimator(List<Animator> animators) { 108be8e696a1f40a61c52a74022f4f084fdc0600f90Winson AnimatorSet anim = new AnimatorSet(); 109be8e696a1f40a61c52a74022f4f084fdc0600f90Winson if (mListener != null) { 110be8e696a1f40a61c52a74022f4f084fdc0600f90Winson anim.addListener(mListener); 111be8e696a1f40a61c52a74022f4f084fdc0600f90Winson } 112be8e696a1f40a61c52a74022f4f084fdc0600f90Winson anim.playTogether(animators); 113be8e696a1f40a61c52a74022f4f084fdc0600f90Winson return anim; 114be8e696a1f40a61c52a74022f4f084fdc0600f90Winson } 115be8e696a1f40a61c52a74022f4f084fdc0600f90Winson 116be8e696a1f40a61c52a74022f4f084fdc0600f90Winson /** 117be8e696a1f40a61c52a74022f4f084fdc0600f90Winson * Applies the specific start delay, duration and interpolator to the given {@param animator} 118be8e696a1f40a61c52a74022f4f084fdc0600f90Winson * for the specified {@param propertyType}. 119be8e696a1f40a61c52a74022f4f084fdc0600f90Winson */ 1203f32e7eba7aec02edbf542cc11eee13264a5abf2Winson public <T extends ValueAnimator> T apply(@PropType int propertyType, T animator) { 121be8e696a1f40a61c52a74022f4f084fdc0600f90Winson animator.setStartDelay(getStartDelay(propertyType)); 122be8e696a1f40a61c52a74022f4f084fdc0600f90Winson animator.setDuration(getDuration(propertyType)); 123be8e696a1f40a61c52a74022f4f084fdc0600f90Winson animator.setInterpolator(getInterpolator(propertyType)); 124be8e696a1f40a61c52a74022f4f084fdc0600f90Winson return animator; 125be8e696a1f40a61c52a74022f4f084fdc0600f90Winson } 126be8e696a1f40a61c52a74022f4f084fdc0600f90Winson 127be8e696a1f40a61c52a74022f4f084fdc0600f90Winson /** 128be8e696a1f40a61c52a74022f4f084fdc0600f90Winson * Sets a start delay for a specific property. 129be8e696a1f40a61c52a74022f4f084fdc0600f90Winson */ 130be8e696a1f40a61c52a74022f4f084fdc0600f90Winson public AnimationProps setStartDelay(@PropType int propertyType, int startDelay) { 131be8e696a1f40a61c52a74022f4f084fdc0600f90Winson if (mPropStartDelay == null) { 132be8e696a1f40a61c52a74022f4f084fdc0600f90Winson mPropStartDelay = new SparseLongArray(); 133be8e696a1f40a61c52a74022f4f084fdc0600f90Winson } 134be8e696a1f40a61c52a74022f4f084fdc0600f90Winson mPropStartDelay.append(propertyType, startDelay); 135be8e696a1f40a61c52a74022f4f084fdc0600f90Winson return this; 136be8e696a1f40a61c52a74022f4f084fdc0600f90Winson } 137be8e696a1f40a61c52a74022f4f084fdc0600f90Winson 138be8e696a1f40a61c52a74022f4f084fdc0600f90Winson /** 139be8e696a1f40a61c52a74022f4f084fdc0600f90Winson * Returns the start delay for a specific property. 140be8e696a1f40a61c52a74022f4f084fdc0600f90Winson */ 141be8e696a1f40a61c52a74022f4f084fdc0600f90Winson public long getStartDelay(@PropType int propertyType) { 142be8e696a1f40a61c52a74022f4f084fdc0600f90Winson if (mPropStartDelay != null) { 143be8e696a1f40a61c52a74022f4f084fdc0600f90Winson long startDelay = mPropStartDelay.get(propertyType, -1); 144be8e696a1f40a61c52a74022f4f084fdc0600f90Winson if (startDelay != -1) { 145be8e696a1f40a61c52a74022f4f084fdc0600f90Winson return startDelay; 146be8e696a1f40a61c52a74022f4f084fdc0600f90Winson } 147be8e696a1f40a61c52a74022f4f084fdc0600f90Winson return mPropStartDelay.get(ALL, 0); 148be8e696a1f40a61c52a74022f4f084fdc0600f90Winson } 149be8e696a1f40a61c52a74022f4f084fdc0600f90Winson return 0; 150be8e696a1f40a61c52a74022f4f084fdc0600f90Winson } 151be8e696a1f40a61c52a74022f4f084fdc0600f90Winson 152be8e696a1f40a61c52a74022f4f084fdc0600f90Winson /** 153be8e696a1f40a61c52a74022f4f084fdc0600f90Winson * Sets a duration for a specific property. 154be8e696a1f40a61c52a74022f4f084fdc0600f90Winson */ 155be8e696a1f40a61c52a74022f4f084fdc0600f90Winson public AnimationProps setDuration(@PropType int propertyType, int duration) { 156be8e696a1f40a61c52a74022f4f084fdc0600f90Winson if (mPropDuration == null) { 157be8e696a1f40a61c52a74022f4f084fdc0600f90Winson mPropDuration = new SparseLongArray(); 158be8e696a1f40a61c52a74022f4f084fdc0600f90Winson } 159be8e696a1f40a61c52a74022f4f084fdc0600f90Winson mPropDuration.append(propertyType, duration); 160be8e696a1f40a61c52a74022f4f084fdc0600f90Winson return this; 161be8e696a1f40a61c52a74022f4f084fdc0600f90Winson } 162be8e696a1f40a61c52a74022f4f084fdc0600f90Winson 163be8e696a1f40a61c52a74022f4f084fdc0600f90Winson /** 164be8e696a1f40a61c52a74022f4f084fdc0600f90Winson * Returns the duration for a specific property. 165be8e696a1f40a61c52a74022f4f084fdc0600f90Winson */ 166be8e696a1f40a61c52a74022f4f084fdc0600f90Winson public long getDuration(@PropType int propertyType) { 167be8e696a1f40a61c52a74022f4f084fdc0600f90Winson if (mPropDuration != null) { 168be8e696a1f40a61c52a74022f4f084fdc0600f90Winson long duration = mPropDuration.get(propertyType, -1); 169be8e696a1f40a61c52a74022f4f084fdc0600f90Winson if (duration != -1) { 170be8e696a1f40a61c52a74022f4f084fdc0600f90Winson return duration; 171be8e696a1f40a61c52a74022f4f084fdc0600f90Winson } 172be8e696a1f40a61c52a74022f4f084fdc0600f90Winson return mPropDuration.get(ALL, 0); 173be8e696a1f40a61c52a74022f4f084fdc0600f90Winson } 174be8e696a1f40a61c52a74022f4f084fdc0600f90Winson return 0; 175be8e696a1f40a61c52a74022f4f084fdc0600f90Winson } 176be8e696a1f40a61c52a74022f4f084fdc0600f90Winson 177be8e696a1f40a61c52a74022f4f084fdc0600f90Winson /** 178be8e696a1f40a61c52a74022f4f084fdc0600f90Winson * Sets an interpolator for a specific property. 179be8e696a1f40a61c52a74022f4f084fdc0600f90Winson */ 180be8e696a1f40a61c52a74022f4f084fdc0600f90Winson public AnimationProps setInterpolator(@PropType int propertyType, Interpolator interpolator) { 181be8e696a1f40a61c52a74022f4f084fdc0600f90Winson if (mPropInterpolators == null) { 182be8e696a1f40a61c52a74022f4f084fdc0600f90Winson mPropInterpolators = new SparseArray<>(); 183be8e696a1f40a61c52a74022f4f084fdc0600f90Winson } 184be8e696a1f40a61c52a74022f4f084fdc0600f90Winson mPropInterpolators.append(propertyType, interpolator); 185be8e696a1f40a61c52a74022f4f084fdc0600f90Winson return this; 186be8e696a1f40a61c52a74022f4f084fdc0600f90Winson } 187be8e696a1f40a61c52a74022f4f084fdc0600f90Winson 188be8e696a1f40a61c52a74022f4f084fdc0600f90Winson /** 189be8e696a1f40a61c52a74022f4f084fdc0600f90Winson * Returns the interpolator for a specific property, falling back to the general interpolator 190be8e696a1f40a61c52a74022f4f084fdc0600f90Winson * if there is no specific property interpolator. 191be8e696a1f40a61c52a74022f4f084fdc0600f90Winson */ 192be8e696a1f40a61c52a74022f4f084fdc0600f90Winson public Interpolator getInterpolator(@PropType int propertyType) { 193be8e696a1f40a61c52a74022f4f084fdc0600f90Winson if (mPropInterpolators != null) { 194be8e696a1f40a61c52a74022f4f084fdc0600f90Winson Interpolator interp = mPropInterpolators.get(propertyType); 195be8e696a1f40a61c52a74022f4f084fdc0600f90Winson if (interp != null) { 196be8e696a1f40a61c52a74022f4f084fdc0600f90Winson return interp; 197be8e696a1f40a61c52a74022f4f084fdc0600f90Winson } 198be8e696a1f40a61c52a74022f4f084fdc0600f90Winson return mPropInterpolators.get(ALL, Interpolators.LINEAR); 199be8e696a1f40a61c52a74022f4f084fdc0600f90Winson } 200be8e696a1f40a61c52a74022f4f084fdc0600f90Winson return Interpolators.LINEAR; 201be8e696a1f40a61c52a74022f4f084fdc0600f90Winson } 202be8e696a1f40a61c52a74022f4f084fdc0600f90Winson 203be8e696a1f40a61c52a74022f4f084fdc0600f90Winson /** 204be8e696a1f40a61c52a74022f4f084fdc0600f90Winson * Sets an animator listener for this animation. 205be8e696a1f40a61c52a74022f4f084fdc0600f90Winson */ 206be8e696a1f40a61c52a74022f4f084fdc0600f90Winson public AnimationProps setListener(Animator.AnimatorListener listener) { 207be8e696a1f40a61c52a74022f4f084fdc0600f90Winson mListener = listener; 208be8e696a1f40a61c52a74022f4f084fdc0600f90Winson return this; 209be8e696a1f40a61c52a74022f4f084fdc0600f90Winson } 210be8e696a1f40a61c52a74022f4f084fdc0600f90Winson 211be8e696a1f40a61c52a74022f4f084fdc0600f90Winson /** 212be8e696a1f40a61c52a74022f4f084fdc0600f90Winson * Returns the animator listener for this animation. 213be8e696a1f40a61c52a74022f4f084fdc0600f90Winson */ 214be8e696a1f40a61c52a74022f4f084fdc0600f90Winson public Animator.AnimatorListener getListener() { 215be8e696a1f40a61c52a74022f4f084fdc0600f90Winson return mListener; 216be8e696a1f40a61c52a74022f4f084fdc0600f90Winson } 217be8e696a1f40a61c52a74022f4f084fdc0600f90Winson 218be8e696a1f40a61c52a74022f4f084fdc0600f90Winson /** 219be8e696a1f40a61c52a74022f4f084fdc0600f90Winson * Returns whether this animation has any duration. 220be8e696a1f40a61c52a74022f4f084fdc0600f90Winson */ 221be8e696a1f40a61c52a74022f4f084fdc0600f90Winson public boolean isImmediate() { 222be8e696a1f40a61c52a74022f4f084fdc0600f90Winson int count = mPropDuration.size(); 223be8e696a1f40a61c52a74022f4f084fdc0600f90Winson for (int i = 0; i < count; i++) { 224be8e696a1f40a61c52a74022f4f084fdc0600f90Winson if (mPropDuration.valueAt(i) > 0) { 225be8e696a1f40a61c52a74022f4f084fdc0600f90Winson return false; 226be8e696a1f40a61c52a74022f4f084fdc0600f90Winson } 227be8e696a1f40a61c52a74022f4f084fdc0600f90Winson } 228be8e696a1f40a61c52a74022f4f084fdc0600f90Winson return true; 229be8e696a1f40a61c52a74022f4f084fdc0600f90Winson } 230be8e696a1f40a61c52a74022f4f084fdc0600f90Winson} 231