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.launcher2;
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;
28
29public class LauncherAnimUtils {
30    static HashSet<Animator> sAnimators = new HashSet<Animator>();
31    static Animator.AnimatorListener sEndAnimListener = new Animator.AnimatorListener() {
32        public void onAnimationStart(Animator animation) {
33        }
34
35        public void onAnimationRepeat(Animator animation) {
36        }
37
38        public void onAnimationEnd(Animator animation) {
39            sAnimators.remove(animation);
40        }
41
42        public void onAnimationCancel(Animator animation) {
43            sAnimators.remove(animation);
44        }
45    };
46
47    public static void cancelOnDestroyActivity(Animator a) {
48        sAnimators.add(a);
49        a.addListener(sEndAnimListener);
50    }
51
52    // Helper method. Assumes a draw is pending, and that if the animation's duration is 0
53    // it should be cancelled
54    public static void startAnimationAfterNextDraw(final Animator animator, final View view) {
55        view.getViewTreeObserver().addOnDrawListener(new ViewTreeObserver.OnDrawListener() {
56                private boolean mStarted = false;
57                public void onDraw() {
58                    if (mStarted) return;
59                    mStarted = true;
60                    // Use this as a signal that the animation was cancelled
61                    if (animator.getDuration() == 0) {
62                        return;
63                    }
64                    animator.start();
65
66                    final ViewTreeObserver.OnDrawListener listener = this;
67                    view.post(new Runnable() {
68                            public void run() {
69                                view.getViewTreeObserver().removeOnDrawListener(listener);
70                            }
71                        });
72                }
73            });
74    }
75
76    public static void onDestroyActivity() {
77        HashSet<Animator> animators = new HashSet<Animator>(sAnimators);
78        for (Animator a : animators) {
79            if (a.isRunning()) {
80                a.cancel();
81            } else {
82                sAnimators.remove(a);
83            }
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