1/*
2 * Copyright (C) 2012 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.launcher3;
18
19import android.animation.Animator;
20import android.animation.AnimatorSet;
21import android.animation.ObjectAnimator;
22import android.animation.PropertyValuesHolder;
23import android.animation.ValueAnimator;
24import android.view.View;
25import android.view.ViewTreeObserver;
26
27import java.util.HashSet;
28import java.util.WeakHashMap;
29
30public class LauncherAnimUtils {
31    static WeakHashMap<Animator, Object> sAnimators = new WeakHashMap<Animator, Object>();
32    static Animator.AnimatorListener sEndAnimListener = new Animator.AnimatorListener() {
33        public void onAnimationStart(Animator animation) {
34            sAnimators.put(animation, null);
35        }
36
37        public void onAnimationRepeat(Animator animation) {
38        }
39
40        public void onAnimationEnd(Animator animation) {
41            sAnimators.remove(animation);
42        }
43
44        public void onAnimationCancel(Animator animation) {
45            sAnimators.remove(animation);
46        }
47    };
48
49    public static void cancelOnDestroyActivity(Animator a) {
50        a.addListener(sEndAnimListener);
51    }
52
53    // Helper method. Assumes a draw is pending, and that if the animation's duration is 0
54    // it should be cancelled
55    public static void startAnimationAfterNextDraw(final Animator animator, final View view) {
56        view.getViewTreeObserver().addOnDrawListener(new ViewTreeObserver.OnDrawListener() {
57                private boolean mStarted = false;
58                public void onDraw() {
59                    if (mStarted) return;
60                    mStarted = true;
61                    // Use this as a signal that the animation was cancelled
62                    if (animator.getDuration() == 0) {
63                        return;
64                    }
65                    animator.start();
66
67                    final ViewTreeObserver.OnDrawListener listener = this;
68                    view.post(new Runnable() {
69                            public void run() {
70                                view.getViewTreeObserver().removeOnDrawListener(listener);
71                            }
72                        });
73                }
74            });
75    }
76
77    public static void onDestroyActivity() {
78        HashSet<Animator> animators = new HashSet<Animator>(sAnimators.keySet());
79        for (Animator a : animators) {
80            if (a.isRunning()) {
81                a.cancel();
82            }
83            sAnimators.remove(a);
84        }
85    }
86
87    public static AnimatorSet createAnimatorSet() {
88        AnimatorSet anim = new AnimatorSet();
89        cancelOnDestroyActivity(anim);
90        return anim;
91    }
92
93    public static ValueAnimator ofFloat(View target, float... values) {
94        ValueAnimator anim = new ValueAnimator();
95        anim.setFloatValues(values);
96        cancelOnDestroyActivity(anim);
97        return anim;
98    }
99
100    public static ObjectAnimator ofFloat(View target, String propertyName, float... values) {
101        ObjectAnimator anim = new ObjectAnimator();
102        anim.setTarget(target);
103        anim.setPropertyName(propertyName);
104        anim.setFloatValues(values);
105        cancelOnDestroyActivity(anim);
106        new FirstFrameAnimatorHelper(anim, target);
107        return anim;
108    }
109
110    public static ObjectAnimator ofPropertyValuesHolder(View target,
111            PropertyValuesHolder... values) {
112        ObjectAnimator anim = new ObjectAnimator();
113        anim.setTarget(target);
114        anim.setValues(values);
115        cancelOnDestroyActivity(anim);
116        new FirstFrameAnimatorHelper(anim, target);
117        return anim;
118    }
119
120    public static ObjectAnimator ofPropertyValuesHolder(Object target,
121            View view, PropertyValuesHolder... values) {
122        ObjectAnimator anim = new ObjectAnimator();
123        anim.setTarget(target);
124        anim.setValues(values);
125        cancelOnDestroyActivity(anim);
126        new FirstFrameAnimatorHelper(anim, view);
127        return anim;
128    }
129}
130