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