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 Boyar * @hide
32e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar */
33e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyarclass HoneycombMr1AnimatorCompatProvider implements AnimatorProvider {
34e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar
35d03a495b04ee74c1cb493cee0d5998b895b1c79bVladislav Kaznacheev    private TimeInterpolator mDefaultInterpolator;
36d03a495b04ee74c1cb493cee0d5998b895b1c79bVladislav Kaznacheev
37e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar    @Override
38e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar    public ValueAnimatorCompat emptyValueAnimator() {
39e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        return new HoneycombValueAnimatorCompat(ValueAnimator.ofFloat(0f, 1f));
40e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar    }
41e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar
42e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar    static class HoneycombValueAnimatorCompat implements ValueAnimatorCompat {
43e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar
44e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        final Animator mWrapped;
45e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar
46e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        public HoneycombValueAnimatorCompat(Animator wrapped) {
47e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar            mWrapped = wrapped;
48e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        }
49e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar
50e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        @Override
51e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        public void setTarget(View view) {
52e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar            mWrapped.setTarget(view);
53e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        }
54e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar
55e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        @Override
56e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        public void addListener(AnimatorListenerCompat listener) {
57e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar            mWrapped.addListener(new AnimatorListenerCompatWrapper(listener, this));
58e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        }
59e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar
60e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        @Override
61e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        public void setDuration(long duration) {
62e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar            mWrapped.setDuration(duration);
63e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        }
64e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar
65e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        @Override
66e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        public void start() {
67e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar            mWrapped.start();
68e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        }
69e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar
70e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        @Override
71e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        public void cancel() {
72e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar            mWrapped.cancel();
73e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        }
74e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar
75e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        @Override
76e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        public void addUpdateListener(final AnimatorUpdateListenerCompat animatorUpdateListener) {
77e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar            if (mWrapped instanceof ValueAnimator) {
78e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar                ((ValueAnimator) mWrapped).addUpdateListener(
79e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar                        new ValueAnimator.AnimatorUpdateListener() {
80e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar                            @Override
81e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar                            public void onAnimationUpdate(ValueAnimator animation) {
82e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar                                animatorUpdateListener
83e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar                                        .onAnimationUpdate(HoneycombValueAnimatorCompat.this);
84e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar                            }
85e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar                        });
86e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar            }
87e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        }
88e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar
89e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        @Override
90e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        public float getAnimatedFraction() {
91e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar            return ((ValueAnimator) mWrapped).getAnimatedFraction();
92e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        }
93e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar    }
94e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar
95e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar    static class AnimatorListenerCompatWrapper implements Animator.AnimatorListener {
96e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar
97e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        final AnimatorListenerCompat mWrapped;
98e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar
99e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        final ValueAnimatorCompat mValueAnimatorCompat;
100e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar
101e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        public AnimatorListenerCompatWrapper(
102e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar                AnimatorListenerCompat wrapped, ValueAnimatorCompat valueAnimatorCompat) {
103e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar            mWrapped = wrapped;
104e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar            mValueAnimatorCompat = valueAnimatorCompat;
105e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        }
106e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar
107e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        @Override
108e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        public void onAnimationStart(Animator animation) {
109e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar            mWrapped.onAnimationStart(mValueAnimatorCompat);
110e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        }
111e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar
112e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        @Override
113e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        public void onAnimationEnd(Animator animation) {
114e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar            mWrapped.onAnimationEnd(mValueAnimatorCompat);
115e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        }
116e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar
117e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        @Override
118e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        public void onAnimationCancel(Animator animation) {
119e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar            mWrapped.onAnimationCancel(mValueAnimatorCompat);
120e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        }
121e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar
122e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        @Override
123e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        public void onAnimationRepeat(Animator animation) {
124e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar            mWrapped.onAnimationRepeat(mValueAnimatorCompat);
125e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        }
126e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar    }
127d03a495b04ee74c1cb493cee0d5998b895b1c79bVladislav Kaznacheev
128d03a495b04ee74c1cb493cee0d5998b895b1c79bVladislav Kaznacheev    @Override
129d03a495b04ee74c1cb493cee0d5998b895b1c79bVladislav Kaznacheev    public void clearInterpolator(View view) {
130d03a495b04ee74c1cb493cee0d5998b895b1c79bVladislav Kaznacheev        if (mDefaultInterpolator == null) {
131d03a495b04ee74c1cb493cee0d5998b895b1c79bVladislav Kaznacheev            mDefaultInterpolator = new ValueAnimator().getInterpolator();
132d03a495b04ee74c1cb493cee0d5998b895b1c79bVladislav Kaznacheev        }
133d03a495b04ee74c1cb493cee0d5998b895b1c79bVladislav Kaznacheev        view.animate().setInterpolator(mDefaultInterpolator);
134d03a495b04ee74c1cb493cee0d5998b895b1c79bVladislav Kaznacheev    }
135e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar}
136