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