1d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase/*
2d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase * Copyright (C) 2014 The Android Open Source Project
3d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase *
4d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase * Licensed under the Apache License, Version 2.0 (the "License");
5d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase * you may not use this file except in compliance with the License.
6d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase * You may obtain a copy of the License at
7d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase *
8d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase *      http://www.apache.org/licenses/LICENSE-2.0
9d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase *
10d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase * Unless required by applicable law or agreed to in writing, software
11d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase * distributed under the License is distributed on an "AS IS" BASIS,
12d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase * See the License for the specific language governing permissions and
14d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase * limitations under the License.
15d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase */
16d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haasepackage android.support.v4.view;
17d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
18bfd48d0521963754e04e407499ee9e278fe06c0fChris Banesimport android.os.Build;
19d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haaseimport android.view.View;
20d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haaseimport android.view.animation.Interpolator;
21d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
22d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haaseimport java.lang.ref.WeakReference;
23797c82a7055f7ba825169388465617f0db716739Chet Haaseimport java.util.WeakHashMap;
24d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
25c5847d13e40f5d52459f5c0dab32dc08f1a9a683Chris Banespublic final class ViewPropertyAnimatorCompat {
26d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    private static final String TAG = "ViewAnimatorCompat";
27d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    private WeakReference<View> mView;
28ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase    private Runnable mStartAction = null;
29ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase    private Runnable mEndAction = null;
30ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase    private int mOldLayerType = -1;
31ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase    // HACK ALERT! Choosing this id knowing that the framework does not use it anywhere
32ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase    // internally and apps should use ids higher than it
33ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase    static final int LISTENER_TAG_ID = 0x7e000000;
34ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase
35d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    ViewPropertyAnimatorCompat(View view) {
36d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        mView = new WeakReference<View>(view);
37d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
38d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
39d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    interface ViewPropertyAnimatorCompatImpl {
40ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void setDuration(ViewPropertyAnimatorCompat vpa, View view, long value);
41ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public long getDuration(ViewPropertyAnimatorCompat vpa, View view);
42ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void setInterpolator(ViewPropertyAnimatorCompat vpa, View view, Interpolator value);
43ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public Interpolator getInterpolator(ViewPropertyAnimatorCompat vpa, View view);
44ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void setStartDelay(ViewPropertyAnimatorCompat vpa, View view, long value);
45ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public long getStartDelay(ViewPropertyAnimatorCompat vpa, View view);
46ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void alpha(ViewPropertyAnimatorCompat vpa, View view, float value);
47ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void alphaBy(ViewPropertyAnimatorCompat vpa, View view, float value);
48ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void rotation(ViewPropertyAnimatorCompat vpa, View view, float value);
49ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void rotationBy(ViewPropertyAnimatorCompat vpa, View view, float value);
50ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void rotationX(ViewPropertyAnimatorCompat vpa, View view, float value);
51ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void rotationXBy(ViewPropertyAnimatorCompat vpa, View view, float value);
52ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void rotationY(ViewPropertyAnimatorCompat vpa, View view, float value);
53ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void rotationYBy(ViewPropertyAnimatorCompat vpa, View view, float value);
54ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void scaleX(ViewPropertyAnimatorCompat vpa, View view, float value);
55ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void scaleXBy(ViewPropertyAnimatorCompat vpa, View view, float value);
56ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void scaleY(ViewPropertyAnimatorCompat vpa, View view, float value);
57ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void scaleYBy(ViewPropertyAnimatorCompat vpa, View view, float value);
58ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void cancel(ViewPropertyAnimatorCompat vpa, View view);
59ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void x(ViewPropertyAnimatorCompat vpa, View view, float value);
60ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void xBy(ViewPropertyAnimatorCompat vpa, View view, float value);
61ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void y(ViewPropertyAnimatorCompat vpa, View view, float value);
62ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void yBy(ViewPropertyAnimatorCompat vpa, View view, float value);
63e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes        public void z(ViewPropertyAnimatorCompat vpa, View view, float value);
64e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes        public void zBy(ViewPropertyAnimatorCompat vpa, View view, float value);
65ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void translationX(ViewPropertyAnimatorCompat vpa, View view, float value);
66ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void translationXBy(ViewPropertyAnimatorCompat vpa, View view, float value);
67ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void translationY(ViewPropertyAnimatorCompat vpa, View view, float value);
68ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void translationYBy(ViewPropertyAnimatorCompat vpa, View view, float value);
69e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes        public void translationZ(ViewPropertyAnimatorCompat vpa, View view, float value);
70e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes        public void translationZBy(ViewPropertyAnimatorCompat vpa, View view, float value);
71ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void start(ViewPropertyAnimatorCompat vpa, View view);
72ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void withLayer(ViewPropertyAnimatorCompat vpa, View view);
73ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void withStartAction(ViewPropertyAnimatorCompat vpa, View view, Runnable runnable);
74ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void withEndAction(ViewPropertyAnimatorCompat vpa, View view, Runnable runnable);
75ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void setListener(ViewPropertyAnimatorCompat vpa, View view,
76ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase                ViewPropertyAnimatorListener listener);
77ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void setUpdateListener(ViewPropertyAnimatorCompat vpa, View view,
78ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase                ViewPropertyAnimatorUpdateListener listener);
79d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    };
80d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
81d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    static class BaseViewPropertyAnimatorCompatImpl implements ViewPropertyAnimatorCompatImpl {
82797c82a7055f7ba825169388465617f0db716739Chet Haase        WeakHashMap<View, Runnable> mStarterMap = null;
83d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
84d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
85ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void setDuration(ViewPropertyAnimatorCompat vpa, View view, long value) {
86d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            // noop on versions prior to ICS
87d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
88d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
89d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
90ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void alpha(ViewPropertyAnimatorCompat vpa, View view, float value) {
91d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            // noop on versions prior to ICS
92ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            postStartMessage(vpa, view);
93d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
94d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
95d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
96ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void translationX(ViewPropertyAnimatorCompat vpa, View view, float value) {
97d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            // noop on versions prior to ICS
98ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            postStartMessage(vpa, view);
99d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
100d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
101d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
102ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void translationY(ViewPropertyAnimatorCompat vpa, View view, float value) {
103d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            // noop on versions prior to ICS
104ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            postStartMessage(vpa, view);
105d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
106d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
107d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
108ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void withEndAction(ViewPropertyAnimatorCompat vpa, View view, Runnable runnable) {
109ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            vpa.mEndAction = runnable;
110ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            postStartMessage(vpa, view);
111d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
112d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
113d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
114ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public long getDuration(ViewPropertyAnimatorCompat vpa, View view) {
115d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            return 0;
116d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
117d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
118d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
119ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void setInterpolator(ViewPropertyAnimatorCompat vpa, View view, Interpolator value) {
120d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            // noop on versions prior to ICS
121d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
122d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
123d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
124ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public Interpolator getInterpolator(ViewPropertyAnimatorCompat vpa, View view) {
125d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            return null;
126d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
127d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
128d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
129ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void setStartDelay(ViewPropertyAnimatorCompat vpa, View view, long value) {
130d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            // noop on versions prior to ICS
131d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
132d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
133d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
134ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public long getStartDelay(ViewPropertyAnimatorCompat vpa, View view) {
135d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            return 0;
136d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
137d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
138d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
139ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void alphaBy(ViewPropertyAnimatorCompat vpa, View view, float value) {
140d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            // noop on versions prior to ICS
141ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            postStartMessage(vpa, view);
142d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
143d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
144d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
145ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void rotation(ViewPropertyAnimatorCompat vpa, View view, float value) {
146d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            // noop on versions prior to ICS
147ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            postStartMessage(vpa, view);
148d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
149d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
150d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
151ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void rotationBy(ViewPropertyAnimatorCompat vpa, View view, float value) {
152d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            // noop on versions prior to ICS
153ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            postStartMessage(vpa, view);
154d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
155d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
156d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
157ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void rotationX(ViewPropertyAnimatorCompat vpa, View view, float value) {
158d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            // noop on versions prior to ICS
159ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            postStartMessage(vpa, view);
160d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
161d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
162d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
163ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void rotationXBy(ViewPropertyAnimatorCompat vpa, View view, float value) {
164d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            // noop on versions prior to ICS
165ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            postStartMessage(vpa, view);
166d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
167d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
168d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
169ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void rotationY(ViewPropertyAnimatorCompat vpa, View view, float value) {
170d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            // noop on versions prior to ICS
171ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            postStartMessage(vpa, view);
172d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
173d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
174d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
175ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void rotationYBy(ViewPropertyAnimatorCompat vpa, View view, float value) {
176d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            // noop on versions prior to ICS
177ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            postStartMessage(vpa, view);
178d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
179d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
180d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
181ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void scaleX(ViewPropertyAnimatorCompat vpa, View view, float value) {
182d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            // noop on versions prior to ICS
183ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            postStartMessage(vpa, view);
184d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
185d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
186d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
187ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void scaleXBy(ViewPropertyAnimatorCompat vpa, View view, float value) {
188d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            // noop on versions prior to ICS
189ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            postStartMessage(vpa, view);
190d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
191d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
192d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
193ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void scaleY(ViewPropertyAnimatorCompat vpa, View view, float value) {
194d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            // noop on versions prior to ICS
195ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            postStartMessage(vpa, view);
196d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
197d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
198d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
199ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void scaleYBy(ViewPropertyAnimatorCompat vpa, View view, float value) {
200d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            // noop on versions prior to ICS
201ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            postStartMessage(vpa, view);
202d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
203d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
204d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
205ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void cancel(ViewPropertyAnimatorCompat vpa, View view) {
206d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            // noop on versions prior to ICS
207ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            postStartMessage(vpa, view);
208d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
209d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
210d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
211ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void x(ViewPropertyAnimatorCompat vpa, View view, float value) {
212d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            // noop on versions prior to ICS
213ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            postStartMessage(vpa, view);
214d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
215d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
216d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
217ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void xBy(ViewPropertyAnimatorCompat vpa, View view, float value) {
218d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            // noop on versions prior to ICS
219ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            postStartMessage(vpa, view);
220d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
221d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
222d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
223ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void y(ViewPropertyAnimatorCompat vpa, View view, float value) {
224d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            // noop on versions prior to ICS
225ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            postStartMessage(vpa, view);
226d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
227d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
228d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
229ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void yBy(ViewPropertyAnimatorCompat vpa, View view, float value) {
230d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            // noop on versions prior to ICS
231ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            postStartMessage(vpa, view);
232d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
233d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
234d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
235e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes        public void z(ViewPropertyAnimatorCompat vpa, View view, float value) {
236e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes            // noop on versions prior to Lollipop
237e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes        }
238e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes
239e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes        @Override
240e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes        public void zBy(ViewPropertyAnimatorCompat vpa, View view, float value) {
241e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes            // noop on versions prior to Lollipop
242e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes        }
243e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes
244e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes        @Override
245ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void translationXBy(ViewPropertyAnimatorCompat vpa, View view, float value) {
246d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            // noop on versions prior to ICS
247ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            postStartMessage(vpa, view);
248d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
249d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
250d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
251ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void translationYBy(ViewPropertyAnimatorCompat vpa, View view, float value) {
252d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            // noop on versions prior to ICS
253ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            postStartMessage(vpa, view);
254d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
255d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
256d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
257e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes        public void translationZ(ViewPropertyAnimatorCompat vpa, View view, float value) {
258e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes            // noop on versions prior to Lollipop
259e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes        }
260e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes
261e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes        @Override
262e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes        public void translationZBy(ViewPropertyAnimatorCompat vpa, View view, float value) {
263e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes            // noop on versions prior to Lollipop
264e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes        }
265e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes
266e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes        @Override
267ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void start(ViewPropertyAnimatorCompat vpa, View view) {
268797c82a7055f7ba825169388465617f0db716739Chet Haase            removeStartMessage(view);
269ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            startAnimation(vpa, view);
270d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
271d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
272d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
273ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void withLayer(ViewPropertyAnimatorCompat vpa, View view) {
274d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            // noop on versions prior to ICS
275d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
276d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
277d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
278ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void withStartAction(ViewPropertyAnimatorCompat vpa, View view, Runnable runnable) {
279ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            vpa.mStartAction = runnable;
280ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            postStartMessage(vpa, view);
281d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
282d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
283d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
284ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void setListener(ViewPropertyAnimatorCompat vpa, View view, ViewPropertyAnimatorListener listener) {
285ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            view.setTag(LISTENER_TAG_ID, listener);
28649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
28749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
28849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        @Override
289ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void setUpdateListener(ViewPropertyAnimatorCompat vpa, View view, ViewPropertyAnimatorUpdateListener listener) {
29049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            // noop
291d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
292797c82a7055f7ba825169388465617f0db716739Chet Haase
293ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        private void startAnimation(ViewPropertyAnimatorCompat vpa, View view) {
294ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            Object listenerTag = view.getTag(LISTENER_TAG_ID);
295ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            ViewPropertyAnimatorListener listener = null;
296ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            if (listenerTag instanceof ViewPropertyAnimatorListener) {
297ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase                listener = (ViewPropertyAnimatorListener) listenerTag;
298ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            }
299ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            Runnable startAction = vpa.mStartAction;
300ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            Runnable endAction = vpa.mEndAction;
301fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haase            vpa.mStartAction = null;
302fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haase            vpa.mEndAction = null;
303797c82a7055f7ba825169388465617f0db716739Chet Haase            if (startAction != null) {
304797c82a7055f7ba825169388465617f0db716739Chet Haase                startAction.run();
305797c82a7055f7ba825169388465617f0db716739Chet Haase            }
306797c82a7055f7ba825169388465617f0db716739Chet Haase            if (listener != null) {
307797c82a7055f7ba825169388465617f0db716739Chet Haase                listener.onAnimationStart(view);
308797c82a7055f7ba825169388465617f0db716739Chet Haase                listener.onAnimationEnd(view);
309797c82a7055f7ba825169388465617f0db716739Chet Haase            }
310797c82a7055f7ba825169388465617f0db716739Chet Haase            if (endAction != null) {
311797c82a7055f7ba825169388465617f0db716739Chet Haase                endAction.run();
312797c82a7055f7ba825169388465617f0db716739Chet Haase            }
313797c82a7055f7ba825169388465617f0db716739Chet Haase            if (mStarterMap != null) {
314797c82a7055f7ba825169388465617f0db716739Chet Haase                mStarterMap.remove(view);
315797c82a7055f7ba825169388465617f0db716739Chet Haase            }
316797c82a7055f7ba825169388465617f0db716739Chet Haase        }
317797c82a7055f7ba825169388465617f0db716739Chet Haase
318797c82a7055f7ba825169388465617f0db716739Chet Haase        class Starter implements Runnable {
319797c82a7055f7ba825169388465617f0db716739Chet Haase            WeakReference<View> mViewRef;
320ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            ViewPropertyAnimatorCompat mVpa;
321797c82a7055f7ba825169388465617f0db716739Chet Haase
322ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            private Starter(ViewPropertyAnimatorCompat vpa, View view) {
323797c82a7055f7ba825169388465617f0db716739Chet Haase                mViewRef = new WeakReference<View>(view);
324ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase                mVpa = vpa;
325797c82a7055f7ba825169388465617f0db716739Chet Haase            }
326797c82a7055f7ba825169388465617f0db716739Chet Haase
327797c82a7055f7ba825169388465617f0db716739Chet Haase            @Override
328797c82a7055f7ba825169388465617f0db716739Chet Haase            public void run() {
3293a91bf644ea3e07a52da5f1741b9b229493c84f9Yigit Boyar                final View view = mViewRef.get();
3303a91bf644ea3e07a52da5f1741b9b229493c84f9Yigit Boyar                if (view != null) {
3313a91bf644ea3e07a52da5f1741b9b229493c84f9Yigit Boyar                    startAnimation(mVpa, view);
3323a91bf644ea3e07a52da5f1741b9b229493c84f9Yigit Boyar                }
333797c82a7055f7ba825169388465617f0db716739Chet Haase            }
334797c82a7055f7ba825169388465617f0db716739Chet Haase        };
335797c82a7055f7ba825169388465617f0db716739Chet Haase
336797c82a7055f7ba825169388465617f0db716739Chet Haase        private void removeStartMessage(View view) {
337797c82a7055f7ba825169388465617f0db716739Chet Haase            Runnable starter = null;
338797c82a7055f7ba825169388465617f0db716739Chet Haase            if (mStarterMap != null) {
339797c82a7055f7ba825169388465617f0db716739Chet Haase                starter = mStarterMap.get(view);
340797c82a7055f7ba825169388465617f0db716739Chet Haase                if (starter != null) {
341797c82a7055f7ba825169388465617f0db716739Chet Haase                    view.removeCallbacks(starter);
342797c82a7055f7ba825169388465617f0db716739Chet Haase                }
343797c82a7055f7ba825169388465617f0db716739Chet Haase            }
344797c82a7055f7ba825169388465617f0db716739Chet Haase        }
345797c82a7055f7ba825169388465617f0db716739Chet Haase
346ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        private void postStartMessage(ViewPropertyAnimatorCompat vpa, View view) {
347797c82a7055f7ba825169388465617f0db716739Chet Haase            Runnable starter = null;
348797c82a7055f7ba825169388465617f0db716739Chet Haase            if (mStarterMap != null) {
349797c82a7055f7ba825169388465617f0db716739Chet Haase                starter = mStarterMap.get(view);
350797c82a7055f7ba825169388465617f0db716739Chet Haase            }
351797c82a7055f7ba825169388465617f0db716739Chet Haase            if (starter == null) {
352ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase                starter = new Starter(vpa, view);
353797c82a7055f7ba825169388465617f0db716739Chet Haase                if (mStarterMap == null) {
354797c82a7055f7ba825169388465617f0db716739Chet Haase                    mStarterMap = new WeakHashMap<View, Runnable>();
355797c82a7055f7ba825169388465617f0db716739Chet Haase                }
356797c82a7055f7ba825169388465617f0db716739Chet Haase                mStarterMap.put(view, starter);
357797c82a7055f7ba825169388465617f0db716739Chet Haase            }
358797c82a7055f7ba825169388465617f0db716739Chet Haase            view.removeCallbacks(starter);
359797c82a7055f7ba825169388465617f0db716739Chet Haase            view.post(starter);
360797c82a7055f7ba825169388465617f0db716739Chet Haase        }
361797c82a7055f7ba825169388465617f0db716739Chet Haase
362d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
363d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
364d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    static class ICSViewPropertyAnimatorCompatImpl extends BaseViewPropertyAnimatorCompatImpl {
365797c82a7055f7ba825169388465617f0db716739Chet Haase        WeakHashMap<View, Integer> mLayerMap = null;
366d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
367d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
368ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void setDuration(ViewPropertyAnimatorCompat vpa, View view, long value) {
369d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            ViewPropertyAnimatorCompatICS.setDuration(view, value);
370d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
371d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
372d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
373ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void alpha(ViewPropertyAnimatorCompat vpa, View view, float value) {
374d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            ViewPropertyAnimatorCompatICS.alpha(view, value);
375d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
376d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
377d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
378ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void translationX(ViewPropertyAnimatorCompat vpa, View view, float value) {
379d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            ViewPropertyAnimatorCompatICS.translationX(view, value);
380d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
381d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
382d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
383ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void translationY(ViewPropertyAnimatorCompat vpa, View view, float value) {
384d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            ViewPropertyAnimatorCompatICS.translationY(view, value);
385d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
386d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
387d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
388ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public long getDuration(ViewPropertyAnimatorCompat vpa, View view) {
389d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            return ViewPropertyAnimatorCompatICS.getDuration(view);
390d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
391d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
392d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
393ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void setInterpolator(ViewPropertyAnimatorCompat vpa, View view, Interpolator value) {
394d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            ViewPropertyAnimatorCompatICS.setInterpolator(view, value);
395d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
396d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
397d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
398ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void setStartDelay(ViewPropertyAnimatorCompat vpa, View view, long value) {
399d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            ViewPropertyAnimatorCompatICS.setStartDelay(view, value);
400d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
401d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
402d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
403ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public long getStartDelay(ViewPropertyAnimatorCompat vpa, View view) {
404d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            return ViewPropertyAnimatorCompatICS.getStartDelay(view);
405d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
406d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
407d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
408ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void alphaBy(ViewPropertyAnimatorCompat vpa, View view, float value) {
409d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            ViewPropertyAnimatorCompatICS.alphaBy(view, value);
410d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
411d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
412d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
413ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void rotation(ViewPropertyAnimatorCompat vpa, View view, float value) {
414d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            ViewPropertyAnimatorCompatICS.rotation(view, value);
415d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
416d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
417d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
418ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void rotationBy(ViewPropertyAnimatorCompat vpa, View view, float value) {
419d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            ViewPropertyAnimatorCompatICS.rotationBy(view, value);
420d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
421d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
422d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
423ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void rotationX(ViewPropertyAnimatorCompat vpa, View view, float value) {
424d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            ViewPropertyAnimatorCompatICS.rotationX(view, value);
425d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
426d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
427d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
428ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void rotationXBy(ViewPropertyAnimatorCompat vpa, View view, float value) {
429d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            ViewPropertyAnimatorCompatICS.rotationXBy(view, value);
430d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
431d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
432d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
433ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void rotationY(ViewPropertyAnimatorCompat vpa, View view, float value) {
434d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            ViewPropertyAnimatorCompatICS.rotationY(view, value);
435d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
436d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
437d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
438ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void rotationYBy(ViewPropertyAnimatorCompat vpa, View view, float value) {
439d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            ViewPropertyAnimatorCompatICS.rotationYBy(view, value);
440d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
441d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
442d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
443ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void scaleX(ViewPropertyAnimatorCompat vpa, View view, float value) {
444d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            ViewPropertyAnimatorCompatICS.scaleX(view, value);
445d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
446d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
447d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
448ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void scaleXBy(ViewPropertyAnimatorCompat vpa, View view, float value) {
449d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            ViewPropertyAnimatorCompatICS.scaleXBy(view, value);
450d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
451d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
452d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
453ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void scaleY(ViewPropertyAnimatorCompat vpa, View view, float value) {
454d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            ViewPropertyAnimatorCompatICS.scaleY(view, value);
455d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
456d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
457d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
458ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void scaleYBy(ViewPropertyAnimatorCompat vpa, View view, float value) {
459d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            ViewPropertyAnimatorCompatICS.scaleYBy(view, value);
460d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
461d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
462d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
463ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void cancel(ViewPropertyAnimatorCompat vpa, View view) {
464d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            ViewPropertyAnimatorCompatICS.cancel(view);
465d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
466d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
467d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
468ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void x(ViewPropertyAnimatorCompat vpa, View view, float value) {
469d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            ViewPropertyAnimatorCompatICS.x(view, value);
470d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
471d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
472d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
473ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void xBy(ViewPropertyAnimatorCompat vpa, View view, float value) {
474d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            ViewPropertyAnimatorCompatICS.xBy(view, value);
475d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
476d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
477d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
478ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void y(ViewPropertyAnimatorCompat vpa, View view, float value) {
479d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            ViewPropertyAnimatorCompatICS.y(view, value);
480d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
481d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
482d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
483ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void yBy(ViewPropertyAnimatorCompat vpa, View view, float value) {
484d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            ViewPropertyAnimatorCompatICS.yBy(view, value);
485d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
486d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
487d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
488ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void translationXBy(ViewPropertyAnimatorCompat vpa, View view, float value) {
489d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            ViewPropertyAnimatorCompatICS.translationXBy(view, value);
490d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
491d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
492d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
493ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void translationYBy(ViewPropertyAnimatorCompat vpa, View view, float value) {
494d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            ViewPropertyAnimatorCompatICS.translationYBy(view, value);
495d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
496d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
497d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
498ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void start(ViewPropertyAnimatorCompat vpa, View view) {
499d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            ViewPropertyAnimatorCompatICS.start(view);
500d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
501d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
502d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
503ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void setListener(ViewPropertyAnimatorCompat vpa, View view, ViewPropertyAnimatorListener listener) {
504ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            view.setTag(LISTENER_TAG_ID, listener);
505ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            ViewPropertyAnimatorCompatICS.setListener(view, new MyVpaListener(vpa));
506d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
507d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
508d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
509ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void withEndAction(ViewPropertyAnimatorCompat vpa, View view, final Runnable runnable) {
510ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            ViewPropertyAnimatorCompatICS.setListener(view, new MyVpaListener(vpa));
511ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            vpa.mEndAction = runnable;
512d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
513d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
514d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
515ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void withStartAction(ViewPropertyAnimatorCompat vpa, View view, final Runnable runnable) {
516ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            ViewPropertyAnimatorCompatICS.setListener(view, new MyVpaListener(vpa));
517ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            vpa.mStartAction = runnable;
518d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
519d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
520d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
521ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void withLayer(ViewPropertyAnimatorCompat vpa, View view) {
522ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            vpa.mOldLayerType = ViewCompat.getLayerType(view);
523ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            ViewPropertyAnimatorCompatICS.setListener(view, new MyVpaListener(vpa));
524797c82a7055f7ba825169388465617f0db716739Chet Haase        }
525797c82a7055f7ba825169388465617f0db716739Chet Haase
526ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        static class MyVpaListener implements ViewPropertyAnimatorListener {
527ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            ViewPropertyAnimatorCompat mVpa;
528bfd48d0521963754e04e407499ee9e278fe06c0fChris Banes            boolean mAnimEndCalled;
529ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase
530ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            MyVpaListener(ViewPropertyAnimatorCompat vpa) {
531ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase                mVpa = vpa;
532ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            }
533ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase
534797c82a7055f7ba825169388465617f0db716739Chet Haase            @Override
535797c82a7055f7ba825169388465617f0db716739Chet Haase            public void onAnimationStart(View view) {
536bfd48d0521963754e04e407499ee9e278fe06c0fChris Banes                // Reset our end called flag, since this is a new animation...
537bfd48d0521963754e04e407499ee9e278fe06c0fChris Banes                mAnimEndCalled = false;
538bfd48d0521963754e04e407499ee9e278fe06c0fChris Banes
539ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase                if (mVpa.mOldLayerType >= 0) {
540d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase                    ViewCompat.setLayerType(view, ViewCompat.LAYER_TYPE_HARDWARE, null);
541d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase                }
542ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase                if (mVpa.mStartAction != null) {
543fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haase                    Runnable startAction = mVpa.mStartAction;
544fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haase                    mVpa.mStartAction = null;
545fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haase                    startAction.run();
546ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase                }
547ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase                Object listenerTag = view.getTag(LISTENER_TAG_ID);
548ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase                ViewPropertyAnimatorListener listener = null;
549ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase                if (listenerTag instanceof ViewPropertyAnimatorListener) {
550ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase                    listener = (ViewPropertyAnimatorListener) listenerTag;
551797c82a7055f7ba825169388465617f0db716739Chet Haase                }
552797c82a7055f7ba825169388465617f0db716739Chet Haase                if (listener != null) {
553797c82a7055f7ba825169388465617f0db716739Chet Haase                    listener.onAnimationStart(view);
554797c82a7055f7ba825169388465617f0db716739Chet Haase                }
555797c82a7055f7ba825169388465617f0db716739Chet Haase            }
556ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase
557797c82a7055f7ba825169388465617f0db716739Chet Haase            @Override
558797c82a7055f7ba825169388465617f0db716739Chet Haase            public void onAnimationEnd(View view) {
559ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase                if (mVpa.mOldLayerType >= 0) {
560ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase                    ViewCompat.setLayerType(view, mVpa.mOldLayerType, null);
561ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase                    mVpa.mOldLayerType = -1;
562ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase                }
563bfd48d0521963754e04e407499ee9e278fe06c0fChris Banes                if (Build.VERSION.SDK_INT >= 16 || !mAnimEndCalled) {
564bfd48d0521963754e04e407499ee9e278fe06c0fChris Banes                    // Pre-v16 seems to have a bug where onAnimationEnd is called
565bfd48d0521963754e04e407499ee9e278fe06c0fChris Banes                    // twice, therefore we only dispatch on the first call
566bfd48d0521963754e04e407499ee9e278fe06c0fChris Banes                    if (mVpa.mEndAction != null) {
567fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haase                        Runnable endAction = mVpa.mEndAction;
568fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haase                        mVpa.mEndAction = null;
569fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haase                        endAction.run();
570bfd48d0521963754e04e407499ee9e278fe06c0fChris Banes                    }
571bfd48d0521963754e04e407499ee9e278fe06c0fChris Banes                    Object listenerTag = view.getTag(LISTENER_TAG_ID);
572bfd48d0521963754e04e407499ee9e278fe06c0fChris Banes                    ViewPropertyAnimatorListener listener = null;
573bfd48d0521963754e04e407499ee9e278fe06c0fChris Banes                    if (listenerTag instanceof ViewPropertyAnimatorListener) {
574bfd48d0521963754e04e407499ee9e278fe06c0fChris Banes                        listener = (ViewPropertyAnimatorListener) listenerTag;
575bfd48d0521963754e04e407499ee9e278fe06c0fChris Banes                    }
576bfd48d0521963754e04e407499ee9e278fe06c0fChris Banes                    if (listener != null) {
577bfd48d0521963754e04e407499ee9e278fe06c0fChris Banes                        listener.onAnimationEnd(view);
578bfd48d0521963754e04e407499ee9e278fe06c0fChris Banes                    }
579bfd48d0521963754e04e407499ee9e278fe06c0fChris Banes                    mAnimEndCalled = true;
580797c82a7055f7ba825169388465617f0db716739Chet Haase                }
581797c82a7055f7ba825169388465617f0db716739Chet Haase            }
582d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
583797c82a7055f7ba825169388465617f0db716739Chet Haase            @Override
584797c82a7055f7ba825169388465617f0db716739Chet Haase            public void onAnimationCancel(View view) {
585ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase                Object listenerTag = view.getTag(LISTENER_TAG_ID);
586ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase                ViewPropertyAnimatorListener listener = null;
587ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase                if (listenerTag instanceof ViewPropertyAnimatorListener) {
588ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase                    listener = (ViewPropertyAnimatorListener) listenerTag;
589ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase                }
590797c82a7055f7ba825169388465617f0db716739Chet Haase                if (listener != null) {
591797c82a7055f7ba825169388465617f0db716739Chet Haase                    listener.onAnimationCancel(view);
592d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase                }
593797c82a7055f7ba825169388465617f0db716739Chet Haase            }
594797c82a7055f7ba825169388465617f0db716739Chet Haase        };
595d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
596d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
597d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    static class JBViewPropertyAnimatorCompatImpl extends ICSViewPropertyAnimatorCompatImpl {
598d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
599d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
600ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void setListener(ViewPropertyAnimatorCompat vpa, View view, ViewPropertyAnimatorListener listener) {
601ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            ViewPropertyAnimatorCompatJB.setListener(view, listener);
602ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        }
603ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase
604ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        @Override
605ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void withStartAction(ViewPropertyAnimatorCompat vpa, View view, Runnable runnable) {
606d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            ViewPropertyAnimatorCompatJB.withStartAction(view, runnable);
607d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
608d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
609d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
610ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void withEndAction(ViewPropertyAnimatorCompat vpa, View view, Runnable runnable) {
611d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            ViewPropertyAnimatorCompatJB.withEndAction(view, runnable);
612d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
613d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
614d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
615ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void withLayer(ViewPropertyAnimatorCompat vpa, View view) {
616d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            ViewPropertyAnimatorCompatJB.withLayer(view);
617d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
618d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
619d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
620d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    static class JBMr2ViewPropertyAnimatorCompatImpl extends JBViewPropertyAnimatorCompatImpl {
621d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
622d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
623ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public Interpolator getInterpolator(ViewPropertyAnimatorCompat vpa, View view) {
624d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            return (Interpolator) ViewPropertyAnimatorCompatJellybeanMr2.getInterpolator(view);
625d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
626d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
627d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
62849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    static class KitKatViewPropertyAnimatorCompatImpl extends JBMr2ViewPropertyAnimatorCompatImpl {
62949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        @Override
630ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void setUpdateListener(ViewPropertyAnimatorCompat vpa, View view, ViewPropertyAnimatorUpdateListener listener) {
63149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            ViewPropertyAnimatorCompatKK.setUpdateListener(view, listener);
63249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
63349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
63449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
635e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes    static class LollipopViewPropertyAnimatorCompatImpl extends KitKatViewPropertyAnimatorCompatImpl {
636e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes        @Override
637e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes        public void translationZ(ViewPropertyAnimatorCompat vpa, View view, float value) {
638e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes            ViewPropertyAnimatorCompatLollipop.translationZ(view, value);
639e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes        }
640e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes
641e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes        @Override
642e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes        public void translationZBy(ViewPropertyAnimatorCompat vpa, View view, float value) {
643e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes            ViewPropertyAnimatorCompatLollipop.translationZBy(view, value);
644e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes        }
645e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes
646e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes        @Override
647e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes        public void z(ViewPropertyAnimatorCompat vpa, View view, float value) {
648e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes            ViewPropertyAnimatorCompatLollipop.z(view, value);
649e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes        }
650e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes
651e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes        @Override
652e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes        public void zBy(ViewPropertyAnimatorCompat vpa, View view, float value) {
653e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes            ViewPropertyAnimatorCompatLollipop.zBy(view, value);
654e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes        }
655e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes    }
656e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes
657d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    static final ViewPropertyAnimatorCompatImpl IMPL;
658d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    static {
659d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        final int version = android.os.Build.VERSION.SDK_INT;
660e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes        if (version >= 21) {
661e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes            IMPL = new LollipopViewPropertyAnimatorCompatImpl();
662e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes        } else if (version >= 19) {
66349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            IMPL = new KitKatViewPropertyAnimatorCompatImpl();
66449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        } else if (version >= 18) {
665d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            IMPL = new JBMr2ViewPropertyAnimatorCompatImpl();
666d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        } else if (version >= 16) {
667d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            IMPL = new JBViewPropertyAnimatorCompatImpl();
668d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        } else if (version >= 14) {
669d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            IMPL = new ICSViewPropertyAnimatorCompatImpl();
670d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        } else {
671d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            IMPL = new BaseViewPropertyAnimatorCompatImpl();
672d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
673d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
674d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
675d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
676d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * Sets the duration for the underlying animator that animates the requested properties.
677d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * By default, the animator uses the default value for ValueAnimator. Calling this method
678d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * will cause the declared value to be used instead.
679d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
680d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <p>Prior to API 14, this method will do nothing.</p>
681d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
682d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @param value The length of ensuing property animations, in milliseconds. The value
683d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * cannot be negative.
684d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @return This object, allowing calls to methods in this class to be chained.
685d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
686d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public ViewPropertyAnimatorCompat setDuration(long value) {
687d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
688d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
689ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            IMPL.setDuration(this, view, value);
690d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
691d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        return this;
692d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
693d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
694d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
695d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * This method will cause the View's <code>alpha</code> property to be animated to the
696d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * specified value. Animations already running on the property will be canceled.
697d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
698d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <p>Prior to API 14, this method will do nothing.</p>
699d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
700d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @param value The value to be animated to.
701d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @return This object, allowing calls to methods in this class to be chained.
702d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
703d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public ViewPropertyAnimatorCompat alpha(float value) {
704d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
705d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
706ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            IMPL.alpha(this, view, value);
707d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
708d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        return this;
709d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
710d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
711d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
712d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * This method will cause the View's <code>alpha</code> property to be animated by the
713d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * specified value. Animations already running on the property will be canceled.
714d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
715d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <p>Prior to API 14, this method will do nothing.</p>
716d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
717d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @param value The amount to be animated by, as an offset from the current value.
718d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @return This object, allowing calls to methods in this class to be chained.
719d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
720d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public ViewPropertyAnimatorCompat alphaBy(float value) {
721d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
722d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
723ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            IMPL.alphaBy(this, view, value);
724d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
725d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        return this;
726d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
727d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
728d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
729d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * This method will cause the View's <code>translationX</code> property to be animated to the
730d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * specified value. Animations already running on the property will be canceled.
731d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
732d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <p>Prior to API 14, this method will do nothing.</p>
733d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
734d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @param value The value to be animated to.
735d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @return This object, allowing calls to methods in this class to be chained.
736d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
737d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public ViewPropertyAnimatorCompat translationX(float value) {
738d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
739d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
740ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            IMPL.translationX(this, view, value);
741d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
742d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        return this;
743d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
744d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
745d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
746d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * This method will cause the View's <code>translationY</code> property to be animated to the
747d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * specified value. Animations already running on the property will be canceled.
748d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
749d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <p>Prior to API 14, this method will do nothing.</p>
750d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
751d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @param value The value to be animated to.
752d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @return This object, allowing calls to methods in this class to be chained.
753d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
754d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public ViewPropertyAnimatorCompat translationY(float value) {
755d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
756d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
757ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            IMPL.translationY(this, view, value);
758d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
759d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        return this;
760d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
761d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
762d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
763d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * Specifies an action to take place when the next animation ends. The action is only
764d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * run if the animation ends normally; if the ViewPropertyAnimator is canceled during
765d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * that animation, the runnable will not run.
766d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * This method, along with {@link #withStartAction(Runnable)}, is intended to help facilitate
767d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * choreographing ViewPropertyAnimator animations with other animations or actions
768d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * in the application.
769d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
770d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <p>For example, the following code animates a view to x=200 and then back to 0:</p>
771d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <pre>
772d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *     Runnable endAction = new Runnable() {
773d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *         public void run() {
774d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *             view.animate().x(0);
775d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *         }
776d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *     };
777d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *     view.animate().x(200).withEndAction(endAction);
778d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * </pre>
779d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
780d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <p>Prior to API 14, this method will run the action immediately.</p>
781d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
782d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <p>For API 14 and 15, this method will run by setting
783d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * a listener on the ViewPropertyAnimatorCompat object and running the action
784d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * in that listener's {@link ViewPropertyAnimatorListener#onAnimationEnd(View)} method.</p>
785d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
786d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @param runnable The action to run when the next animation ends.
787d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @return This object, allowing calls to methods in this class to be chained.
788d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
789d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public ViewPropertyAnimatorCompat withEndAction(Runnable runnable) {
790d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
791d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
792ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            IMPL.withEndAction(this, view, runnable);
793d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
794d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        return this;
795d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
796d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
797d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
798d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * Returns the current duration of property animations. If the duration was set on this
799d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * object, that value is returned. Otherwise, the default value of the underlying Animator
800d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * is returned.
801d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
802d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <p>Prior to API 14, this method will return 0.</p>
803d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
804d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @see #setDuration(long)
805d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @return The duration of animations, in milliseconds.
806d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
807d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public long getDuration() {
808d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
809d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
810ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            return IMPL.getDuration(this, view);
811d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        } else {
812d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            return 0;
813d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
814d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
815d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
816d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
817d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * Sets the interpolator for the underlying animator that animates the requested properties.
818d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * By default, the animator uses the default interpolator for ValueAnimator. Calling this method
819d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * will cause the declared object to be used instead.
820d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
821d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <p>Prior to API 14, this method will do nothing.</p>
822d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
823d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @param value The TimeInterpolator to be used for ensuing property animations.
824d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @return This object, allowing calls to methods in this class to be chained.
825d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
826d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public ViewPropertyAnimatorCompat setInterpolator(Interpolator value) {
827d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
828d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
829ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            IMPL.setInterpolator(this, view, value);
830d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
831d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        return this;
832d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
833d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
834d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
835d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * Returns the timing interpolator that this animation uses.
836d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
837d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <p>Prior to API 14, this method will return null.</p>
838d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
839d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @return The timing interpolator for this animation.
840d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
841d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public Interpolator getInterpolator() {
842d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
843d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
844ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            return IMPL.getInterpolator(this, view);
845d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
846d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        else return null;
847d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
848d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
849d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
850d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * Sets the startDelay for the underlying animator that animates the requested properties.
851d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * By default, the animator uses the default value for ValueAnimator. Calling this method
852d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * will cause the declared value to be used instead.
853d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
854d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <p>Prior to API 14, this method will do nothing.</p>
855d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
856d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @param value The delay of ensuing property animations, in milliseconds. The value
857d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * cannot be negative.
858d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @return This object, allowing calls to methods in this class to be chained.
859d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
860d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public ViewPropertyAnimatorCompat setStartDelay(long value) {
861d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
862d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
863ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            IMPL.setStartDelay(this, view, value);
864d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
865d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        return this;
866d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
867d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
868d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
869d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * Returns the current startDelay of property animations. If the startDelay was set on this
870d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * object, that value is returned. Otherwise, the default value of the underlying Animator
871d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * is returned.
872d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
873d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <p>Prior to API 14, this method will return 0.</p>
874d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
875d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @see #setStartDelay(long)
876d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @return The startDelay of animations, in milliseconds.
877d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
878d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public long getStartDelay() {
879d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
880d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
881ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            return IMPL.getStartDelay(this, view);
882d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        } else {
883d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            return 0;
884d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
885d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
886d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
887d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
888d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * This method will cause the View's <code>rotation</code> property to be animated to the
889d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * specified value. Animations already running on the property will be canceled.
890d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
891d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <p>Prior to API 14, this method will do nothing.</p>
892d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
893d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @param value The value to be animated to.
894d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @return This object, allowing calls to methods in this class to be chained.
895d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
896d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public ViewPropertyAnimatorCompat rotation(float value) {
897d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
898d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
899ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            IMPL.rotation(this, view, value);
900d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
901d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        return this;
902d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
903d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
904d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
905d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * This method will cause the View's <code>rotation</code> property to be animated by the
906d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * specified value. Animations already running on the property will be canceled.
907d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
908d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <p>Prior to API 14, this method will do nothing.</p>
909d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
910d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @param value The amount to be animated by, as an offset from the current value.
911d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @return This object, allowing calls to methods in this class to be chained.
912d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
913d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public ViewPropertyAnimatorCompat rotationBy(float value) {
914d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
915d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
916ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            IMPL.rotationBy(this, view, value);
917d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
918d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        return this;
919d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
920d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
921d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
922d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * This method will cause the View's <code>rotationX</code> property to be animated to the
923d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * specified value. Animations already running on the property will be canceled.
924d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
925d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <p>Prior to API 14, this method will do nothing.</p>
926d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
927d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @param value The value to be animated to.
928d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @return This object, allowing calls to methods in this class to be chained.
929d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
930d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public ViewPropertyAnimatorCompat rotationX(float value) {
931d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
932d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
933ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            IMPL.rotationX(this, view, value);
934d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
935d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        return this;
936d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
937d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
938d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
939d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * This method will cause the View's <code>rotationX</code> property to be animated by the
940d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * specified value. Animations already running on the property will be canceled.
941d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
942d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <p>Prior to API 14, this method will do nothing.</p>
943d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
944d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @param value The amount to be animated by, as an offset from the current value.
945d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @return This object, allowing calls to methods in this class to be chained.
946d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
947d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public ViewPropertyAnimatorCompat rotationXBy(float value) {
948d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
949d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
950ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            IMPL.rotationXBy(this, view, value);
951d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
952d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        return this;
953d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
954d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
955d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
956d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * This method will cause the View's <code>rotationY</code> property to be animated to the
957d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * specified value. Animations already running on the property will be canceled.
958d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
959d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <p>Prior to API 14, this method will do nothing.</p>
960d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
961d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @param value The value to be animated to.
962d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @return This object, allowing calls to methods in this class to be chained.
963d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
964d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public ViewPropertyAnimatorCompat rotationY(float value) {
965d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
966d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
967ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            IMPL.rotationY(this, view, value);
968d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
969d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        return this;
970d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
971d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
972d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
973d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * This method will cause the View's <code>rotationY</code> property to be animated by the
974d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * specified value. Animations already running on the property will be canceled.
975d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
976d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <p>Prior to API 14, this method will do nothing.</p>
977d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
978d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @param value The amount to be animated by, as an offset from the current value.
979d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @return This object, allowing calls to methods in this class to be chained.
980d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
981d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public ViewPropertyAnimatorCompat rotationYBy(float value) {
982d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
983d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
984ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            IMPL.rotationYBy(this, view, value);
985d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
986d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        return this;
987d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
988d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
989d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
990d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * This method will cause the View's <code>scaleX</code> property to be animated to the
991d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * specified value. Animations already running on the property will be canceled.
992d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
993d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <p>Prior to API 14, this method will do nothing.</p>
994d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
995d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @param value The value to be animated to.
996d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @return This object, allowing calls to methods in this class to be chained.
997d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
998d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public ViewPropertyAnimatorCompat scaleX(float value) {
999d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
1000d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
1001ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            IMPL.scaleX(this, view, value);
1002d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
1003d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        return this;
1004d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
1005d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
1006d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
1007d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * This method will cause the View's <code>scaleX</code> property to be animated by the
1008d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * specified value. Animations already running on the property will be canceled.
1009d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
1010d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <p>Prior to API 14, this method will do nothing.</p>
1011d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
1012d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @param value The amount to be animated by, as an offset from the current value.
1013d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @return This object, allowing calls to methods in this class to be chained.
1014d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
1015d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public ViewPropertyAnimatorCompat scaleXBy(float value) {
1016d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
1017d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
1018ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            IMPL.scaleXBy(this, view, value);
1019d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
1020d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        return this;
1021d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
1022d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
1023d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
1024d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * This method will cause the View's <code>scaleY</code> property to be animated to the
1025d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * specified value. Animations already running on the property will be canceled.
1026d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
1027d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <p>Prior to API 14, this method will do nothing.</p>
1028d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
1029d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @param value The value to be animated to.
1030d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @return This object, allowing calls to methods in this class to be chained.
1031d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
1032d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public ViewPropertyAnimatorCompat scaleY(float value) {
1033d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
1034d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
1035ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            IMPL.scaleY(this, view, value);
1036d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
1037d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        return this;
1038d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
1039d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
1040d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
1041d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * This method will cause the View's <code>scaleY</code> property to be animated by the
1042d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * specified value. Animations already running on the property will be canceled.
1043d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
1044d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <p>Prior to API 14, this method will do nothing.</p>
1045d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
1046d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @param value The amount to be animated by, as an offset from the current value.
1047d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @return This object, allowing calls to methods in this class to be chained.
1048d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
1049d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public ViewPropertyAnimatorCompat scaleYBy(float value) {
1050d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
1051d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
1052ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            IMPL.scaleYBy(this, view, value);
1053d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
1054d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        return this;
1055d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
1056d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
1057d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
1058d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * Cancels all property animations that are currently running or pending.
1059d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
1060d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public void cancel() {
1061d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
1062d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
1063ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            IMPL.cancel(this, view);
1064d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
1065d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
1066d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
1067d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
1068d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * This method will cause the View's <code>x</code> property to be animated to the
1069d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * specified value. Animations already running on the property will be canceled.
1070d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
1071d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <p>Prior to API 14, this method will do nothing.</p>
1072d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
1073d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @param value The value to be animated to.
1074d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @return This object, allowing calls to methods in this class to be chained.
1075d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
1076d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public ViewPropertyAnimatorCompat x(float value) {
1077d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
1078d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
1079ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            IMPL.x(this, view, value);
1080d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
1081d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        return this;
1082d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
1083d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
1084d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
1085d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * This method will cause the View's <code>x</code> property to be animated by the
1086d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * specified value. Animations already running on the property will be canceled.
1087d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
1088d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <p>Prior to API 14, this method will do nothing.</p>
1089d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
1090d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @param value The amount to be animated by, as an offset from the current value.
1091d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @return This object, allowing calls to methods in this class to be chained.
1092d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
1093d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public ViewPropertyAnimatorCompat xBy(float value) {
1094d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
1095d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
1096ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            IMPL.xBy(this, view, value);
1097d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
1098d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        return this;
1099d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
1100d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
1101d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
1102d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * This method will cause the View's <code>y</code> property to be animated to the
1103d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * specified value. Animations already running on the property will be canceled.
1104d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
1105d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <p>Prior to API 14, this method will do nothing.</p>
1106d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
1107d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @param value The value to be animated to.
1108d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @return This object, allowing calls to methods in this class to be chained.
1109d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
1110d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public ViewPropertyAnimatorCompat y(float value) {
1111d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
1112d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
1113ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            IMPL.y(this, view, value);
1114d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
1115d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        return this;
1116d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
1117d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
1118d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
1119d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * This method will cause the View's <code>y</code> property to be animated by the
1120d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * specified value. Animations already running on the property will be canceled.
1121d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
1122d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <p>Prior to API 14, this method will do nothing.</p>
1123d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
1124d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @param value The amount to be animated by, as an offset from the current value.
1125d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @return This object, allowing calls to methods in this class to be chained.
1126d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
1127d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public ViewPropertyAnimatorCompat yBy(float value) {
1128d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
1129d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
1130ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            IMPL.yBy(this, view, value);
1131d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
1132d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        return this;
1133d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
1134d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
1135d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
1136d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * This method will cause the View's <code>translationX</code> property to be animated by the
1137d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * specified value. Animations already running on the property will be canceled.
1138d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
1139d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <p>Prior to API 14, this method will do nothing.</p>
1140d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
1141d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @param value The amount to be animated by, as an offset from the current value.
1142d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @return This object, allowing calls to methods in this class to be chained.
1143d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
1144d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public ViewPropertyAnimatorCompat translationXBy(float value) {
1145d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
1146d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
1147ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            IMPL.translationXBy(this, view, value);
1148d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
1149d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        return this;
1150d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
1151d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
1152d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
1153d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * This method will cause the View's <code>translationY</code> property to be animated by the
1154d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * specified value. Animations already running on the property will be canceled.
1155d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
1156d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <p>Prior to API 14, this method will do nothing.</p>
1157d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
1158d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @param value The amount to be animated by, as an offset from the current value.
1159d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @return This object, allowing calls to methods in this class to be chained.
1160d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
1161d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public ViewPropertyAnimatorCompat translationYBy(float value) {
1162d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
1163d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
1164ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            IMPL.translationYBy(this, view, value);
1165d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
1166d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        return this;
1167d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
1168d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
1169d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
1170e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes     * This method will cause the View's <code>translationZ</code> property to be animated by the
1171e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes     * specified value. Animations already running on the property will be canceled.
1172e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes     *
1173e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes     * <p>Prior to API 21, this method will do nothing.</p>
1174e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes     *
1175e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes     * @param value The amount to be animated by, as an offset from the current value.
1176e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes     * @return This object, allowing calls to methods in this class to be chained.
1177e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes     */
1178e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes    public ViewPropertyAnimatorCompat translationZBy(float value) {
1179e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes        View view;
1180e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes        if ((view = mView.get()) != null) {
1181e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes            IMPL.translationZBy(this, view, value);
1182e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes        }
1183e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes        return this;
1184e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes    }
1185e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes
1186e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes    /**
1187e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes     * This method will cause the View's <code>translationZ</code> property to be animated to the
1188e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes     * specified value. Animations already running on the property will be canceled.
1189e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes     *
1190e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes     * <p>Prior to API 21, this method will do nothing.</p>
1191e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes     *
1192e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes     * @param value The amount to be animated by, as an offset from the current value.
1193e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes     * @return This object, allowing calls to methods in this class to be chained.
1194e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes     */
1195e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes    public ViewPropertyAnimatorCompat translationZ(float value) {
1196e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes        View view;
1197e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes        if ((view = mView.get()) != null) {
1198e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes            IMPL.translationZ(this, view, value);
1199e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes        }
1200e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes        return this;
1201e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes    }
1202e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes
1203e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes    /**
1204e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes     * This method will cause the View's <code>z</code> property to be animated to the
1205e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes     * specified value. Animations already running on the property will be canceled.
1206e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes     *
1207e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes     * <p>Prior to API 21, this method will do nothing.</p>
1208e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes     *
1209e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes     * @param value The amount to be animated by, as an offset from the current value.
1210e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes     * @return This object, allowing calls to methods in this class to be chained.
1211e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes     */
1212e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes    public ViewPropertyAnimatorCompat z(float value) {
1213e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes        View view;
1214e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes        if ((view = mView.get()) != null) {
1215e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes            IMPL.z(this, view, value);
1216e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes        }
1217e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes        return this;
1218e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes    }
1219e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes
1220e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes    /**
1221e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes     * This method will cause the View's <code>z</code> property to be animated by the
1222e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes     * specified value. Animations already running on the property will be canceled.
1223e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes     *
1224e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes     * <p>Prior to API 21, this method will do nothing.</p>
1225e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes     *
1226e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes     * @param value The amount to be animated by, as an offset from the current value.
1227e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes     * @return This object, allowing calls to methods in this class to be chained.
1228e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes     */
1229e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes    public ViewPropertyAnimatorCompat zBy(float value) {
1230e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes        View view;
1231e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes        if ((view = mView.get()) != null) {
1232e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes            IMPL.zBy(this, view, value);
1233e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes        }
1234e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes        return this;
1235e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes    }
1236e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes
1237e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes    /**
1238d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * Starts the currently pending property animations immediately. Calling <code>start()</code>
1239d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * is optional because all animations start automatically at the next opportunity. However,
1240d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * if the animations are needed to start immediately and synchronously (not at the time when
1241d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * the next event is processed by the hierarchy, which is when the animations would begin
1242d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * otherwise), then this method can be used.
1243d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
1244d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <p>Prior to API 14, this method will do nothing.</p>
1245d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
1246d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public void start() {
1247d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
1248d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
1249ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            IMPL.start(this, view);
1250d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
1251d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
1252d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
1253d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
1254d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * The View associated with this ViewPropertyAnimator will have its
1255d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * {@link ViewCompat#setLayerType(View, int, android.graphics.Paint) layer type} set to
1256d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * {@link ViewCompat#LAYER_TYPE_HARDWARE} for the duration of the next animation.
1257d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * As stated in the documentation for {@link ViewCompat#LAYER_TYPE_HARDWARE},
1258d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * the actual type of layer used internally depends on the runtime situation of the
1259d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * view. If the activity and this view are hardware-accelerated, then the layer will be
1260d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * accelerated as well. If the activity or the view is not accelerated, then the layer will
1261d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * effectively be the same as {@link ViewCompat#LAYER_TYPE_SOFTWARE}.
1262d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
1263d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <p>This state is not persistent, either on the View or on this ViewPropertyAnimator: the
1264d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * layer type of the View will be restored when the animation ends to what it was when this
1265d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * method was called, and this setting on ViewPropertyAnimator is only valid for the next
1266d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * animation. Note that calling this method and then independently setting the layer type of
1267d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * the View (by a direct call to
1268d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * {@link ViewCompat#setLayerType(View, int, android.graphics.Paint)}) will result in some
1269d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * inconsistency, including having the layer type restored to its pre-withLayer()
1270d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * value when the animation ends.</p>
1271d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
1272d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <p>Prior to API 14, this method will do nothing.</p>
1273d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
1274d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <p>For API 14 and 15, this method will run by setting
1275d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * a listener on the ViewPropertyAnimatorCompat object, setting a hardware layer in
1276d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * the listener's {@link ViewPropertyAnimatorListener#onAnimationStart(View)} method,
1277d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * and then restoring the orignal layer type in the listener's
1278d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * {@link ViewPropertyAnimatorListener#onAnimationEnd(View)} method.</p>
1279d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
1280d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @see View#setLayerType(int, android.graphics.Paint)
1281d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @return This object, allowing calls to methods in this class to be chained.
1282d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
1283d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public ViewPropertyAnimatorCompat withLayer() {
1284d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
1285d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
1286ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            IMPL.withLayer(this, view);
1287d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
1288d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        return this;
1289d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
1290d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
1291d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
1292d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * Specifies an action to take place when the next animation runs. If there is a
1293d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * {@link #setStartDelay(long) startDelay} set on this ViewPropertyAnimator, then the
1294d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * action will run after that startDelay expires, when the actual animation begins.
1295d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * This method, along with {@link #withEndAction(Runnable)}, is intended to help facilitate
1296d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * choreographing ViewPropertyAnimator animations with other animations or actions
1297d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * in the application.
1298d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
1299d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <p>Prior to API 14, this method will run the action immediately.</p>
1300d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
1301d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <p>For API 14 and 15, this method will run by setting
1302d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * a listener on the ViewPropertyAnimatorCompat object and running the action
1303d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * in that listener's {@link ViewPropertyAnimatorListener#onAnimationStart(View)} method.</p>
1304d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
1305d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @param runnable The action to run when the next animation starts.
1306d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @return This object, allowing calls to methods in this class to be chained.
1307d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
1308d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public ViewPropertyAnimatorCompat withStartAction(Runnable runnable) {
1309d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
1310d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
1311ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            IMPL.withStartAction(this, view, runnable);
1312d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
1313d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        return this;
1314d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
1315d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
1316d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
1317d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * Sets a listener for events in the underlying Animators that run the property
1318d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * animations.
1319d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
1320d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <p>Prior to API 14, this method will do nothing.</p>
1321d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
1322d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @param listener The listener to be called with AnimatorListener events. A value of
1323d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <code>null</code> removes any existing listener.
1324d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @return This object, allowing calls to methods in this class to be chained.
1325d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
1326d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public ViewPropertyAnimatorCompat setListener(ViewPropertyAnimatorListener listener) {
1327d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
1328d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
1329ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            IMPL.setListener(this, view, listener);
1330d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
1331d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        return this;
1332d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
133349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
133449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    /**
133549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes     * Sets a listener for update events in the underlying Animator that runs
133649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes     * the property animations.
133749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes     *
133849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes     * <p>Prior to API 19, this method will do nothing.</p>
133949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes     *
134049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes     * @param listener The listener to be called with update events. A value of
134149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes     * <code>null</code> removes any existing listener.
134249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes     * @return This object, allowing calls to methods in this class to be chained.
134349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes     */
134449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public ViewPropertyAnimatorCompat setUpdateListener(
134549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            ViewPropertyAnimatorUpdateListener listener) {
134649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        View view;
134749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if ((view = mView.get()) != null) {
1348ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            IMPL.setUpdateListener(this, view, listener);
134949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
135049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        return this;
135149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
1352d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase}
1353