1e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar/*
2e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar * Copyright (C) 2015 The Android Open Source Project
3e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar *
4e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar * Licensed under the Apache License, Version 2.0 (the "License");
5e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar * you may not use this file except in compliance with the License.
6e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar * You may obtain a copy of the License at
7e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar *
8e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar *      http://www.apache.org/licenses/LICENSE-2.0
9e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar *
10e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar * Unless required by applicable law or agreed to in writing, software
11e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar * distributed under the License is distributed on an "AS IS" BASIS,
12e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar * See the License for the specific language governing permissions and
14e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar * limitations under the License.
15e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar */
16e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar
17e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyarpackage android.support.v4.animation;
18e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar
19e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyarimport android.animation.Animator;
20e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyarimport android.animation.PropertyValuesHolder;
21d03a495b04ee74c1cb493cee0d5998b895b1c79bVladislav Kaznacheevimport android.animation.TimeInterpolator;
22e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyarimport android.animation.TypeEvaluator;
23e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyarimport android.animation.ValueAnimator;
24e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyarimport android.view.View;
25e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar
26e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar/**
27e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar * Uses framework Animators to provide ValueAnimatorCompat interface.
28e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar * <p>
29e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar * This is not a fully implemented API which is why it is not public.
30e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar */
31e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyarclass HoneycombMr1AnimatorCompatProvider implements AnimatorProvider {
32e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar
33d03a495b04ee74c1cb493cee0d5998b895b1c79bVladislav Kaznacheev    private TimeInterpolator mDefaultInterpolator;
34d03a495b04ee74c1cb493cee0d5998b895b1c79bVladislav Kaznacheev
35e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar    @Override
36e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar    public ValueAnimatorCompat emptyValueAnimator() {
37e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        return new HoneycombValueAnimatorCompat(ValueAnimator.ofFloat(0f, 1f));
38e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar    }
39e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar
40e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar    static class HoneycombValueAnimatorCompat implements ValueAnimatorCompat {
41e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar
42e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        final Animator mWrapped;
43e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar
44e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        public HoneycombValueAnimatorCompat(Animator wrapped) {
45e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar            mWrapped = wrapped;
46e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        }
47e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar
48e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        @Override
49e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        public void setTarget(View view) {
50e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar            mWrapped.setTarget(view);
51e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        }
52e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar
53e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        @Override
54e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        public void addListener(AnimatorListenerCompat listener) {
55e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar            mWrapped.addListener(new AnimatorListenerCompatWrapper(listener, this));
56e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        }
57e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar
58e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        @Override
59e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        public void setDuration(long duration) {
60e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar            mWrapped.setDuration(duration);
61e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        }
62e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar
63e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        @Override
64e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        public void start() {
65e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar            mWrapped.start();
66e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        }
67e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar
68e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        @Override
69e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        public void cancel() {
70e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar            mWrapped.cancel();
71e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        }
72e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar
73e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        @Override
74e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        public void addUpdateListener(final AnimatorUpdateListenerCompat animatorUpdateListener) {
75e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar            if (mWrapped instanceof ValueAnimator) {
76e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar                ((ValueAnimator) mWrapped).addUpdateListener(
77e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar                        new ValueAnimator.AnimatorUpdateListener() {
78e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar                            @Override
79e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar                            public void onAnimationUpdate(ValueAnimator animation) {
80e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar                                animatorUpdateListener
81e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar                                        .onAnimationUpdate(HoneycombValueAnimatorCompat.this);
82e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar                            }
83e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar                        });
84e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar            }
85e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        }
86e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar
87e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        @Override
88e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        public float getAnimatedFraction() {
89e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar            return ((ValueAnimator) mWrapped).getAnimatedFraction();
90e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        }
91e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar    }
92e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar
93e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar    static class AnimatorListenerCompatWrapper implements Animator.AnimatorListener {
94e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar
95e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        final AnimatorListenerCompat mWrapped;
96e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar
97e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        final ValueAnimatorCompat mValueAnimatorCompat;
98e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar
99e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        public AnimatorListenerCompatWrapper(
100e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar                AnimatorListenerCompat wrapped, ValueAnimatorCompat valueAnimatorCompat) {
101e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar            mWrapped = wrapped;
102e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar            mValueAnimatorCompat = valueAnimatorCompat;
103e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        }
104e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar
105e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        @Override
106e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        public void onAnimationStart(Animator animation) {
107e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar            mWrapped.onAnimationStart(mValueAnimatorCompat);
108e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        }
109e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar
110e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        @Override
111e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        public void onAnimationEnd(Animator animation) {
112e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar            mWrapped.onAnimationEnd(mValueAnimatorCompat);
113e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        }
114e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar
115e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        @Override
116e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        public void onAnimationCancel(Animator animation) {
117e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar            mWrapped.onAnimationCancel(mValueAnimatorCompat);
118e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        }
119e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar
120e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        @Override
121e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        public void onAnimationRepeat(Animator animation) {
122e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar            mWrapped.onAnimationRepeat(mValueAnimatorCompat);
123e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        }
124e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar    }
125d03a495b04ee74c1cb493cee0d5998b895b1c79bVladislav Kaznacheev
126d03a495b04ee74c1cb493cee0d5998b895b1c79bVladislav Kaznacheev    @Override
127d03a495b04ee74c1cb493cee0d5998b895b1c79bVladislav Kaznacheev    public void clearInterpolator(View view) {
128d03a495b04ee74c1cb493cee0d5998b895b1c79bVladislav Kaznacheev        if (mDefaultInterpolator == null) {
129d03a495b04ee74c1cb493cee0d5998b895b1c79bVladislav Kaznacheev            mDefaultInterpolator = new ValueAnimator().getInterpolator();
130d03a495b04ee74c1cb493cee0d5998b895b1c79bVladislav Kaznacheev        }
131d03a495b04ee74c1cb493cee0d5998b895b1c79bVladislav Kaznacheev        view.animate().setInterpolator(mDefaultInterpolator);
132d03a495b04ee74c1cb493cee0d5998b895b1c79bVladislav Kaznacheev    }
133e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar}
134