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