1346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell/*
2346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * Copyright (C) 2012 The Android Open Source Project
3346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell *
4346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * Licensed under the Apache License, Version 2.0 (the "License");
5346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * you may not use this file except in compliance with the License.
6346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * You may obtain a copy of the License at
7346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell *
8346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell *      http://www.apache.org/licenses/LICENSE-2.0
9346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell *
10346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * Unless required by applicable law or agreed to in writing, software
11346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * distributed under the License is distributed on an "AS IS" BASIS,
12346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * See the License for the specific language governing permissions and
14346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * limitations under the License.
15346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell */
16346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell
17346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powellpackage android.support.v4.widget;
18346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell
19346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powellimport android.content.Context;
20b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powellimport android.os.Build;
21c56ba65d20be8742ff717907a3a2cd81dd0e5f3cAdam Powellimport android.view.animation.Interpolator;
22346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powellimport android.widget.Scroller;
23346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell
24346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell/**
25346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * Provides access to new {@link android.widget.Scroller Scroller} APIs when available.
26346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell *
27346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * <p>This class provides a platform version-independent mechanism for obeying the
28346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * current device's preferred scroll physics and fling behavior. It offers a subset of
29346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * the APIs from Scroller or OverScroller.</p>
30346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell */
31b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powellpublic class ScrollerCompat {
32b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell    Object mScroller;
33346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell
34b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell    interface ScrollerCompatImpl {
35b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        Object createScroller(Context context, Interpolator interpolator);
36b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        boolean isFinished(Object scroller);
37b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        int getCurrX(Object scroller);
38b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        int getCurrY(Object scroller);
39b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        float getCurrVelocity(Object scroller);
40b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        boolean computeScrollOffset(Object scroller);
41b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        void startScroll(Object scroller, int startX, int startY, int dx, int dy);
42b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        void startScroll(Object scroller, int startX, int startY, int dx, int dy, int duration);
43b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        void fling(Object scroller, int startX, int startY, int velX, int velY,
44b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell                int minX, int maxX, int minY, int maxY);
45b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        void fling(Object scroller, int startX, int startY, int velX, int velY,
46b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell                int minX, int maxX, int minY, int maxY, int overX, int overY);
47b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        void abortAnimation(Object scroller);
48b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        void notifyHorizontalEdgeReached(Object scroller, int startX, int finalX, int overX);
49b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        void notifyVerticalEdgeReached(Object scroller, int startY, int finalY, int overY);
50b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        boolean isOverScrolled(Object scroller);
516580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell        int getFinalX(Object scroller);
526580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell        int getFinalY(Object scroller);
53b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell    }
54b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell
55b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell    static class ScrollerCompatImplBase implements ScrollerCompatImpl {
56b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        @Override
57b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        public Object createScroller(Context context, Interpolator interpolator) {
58b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell            return interpolator != null ?
59b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell                    new Scroller(context, interpolator) : new Scroller(context);
60b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        }
61b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell
62b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        @Override
63b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        public boolean isFinished(Object scroller) {
64b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell            return ((Scroller) scroller).isFinished();
65b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        }
66b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell
67b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        @Override
68b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        public int getCurrX(Object scroller) {
69b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell            return ((Scroller) scroller).getCurrX();
70b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        }
71b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell
72b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        @Override
73b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        public int getCurrY(Object scroller) {
74b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell            return ((Scroller) scroller).getCurrY();
75b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        }
76b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell
77b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        @Override
78b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        public float getCurrVelocity(Object scroller) {
79b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell            return 0;
80b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        }
81b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell
82b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        @Override
83b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        public boolean computeScrollOffset(Object scroller) {
84b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell            return ((Scroller) scroller).computeScrollOffset();
85b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        }
86b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell
87b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        @Override
88b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        public void startScroll(Object scroller, int startX, int startY, int dx, int dy) {
89b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell            ((Scroller) scroller).startScroll(startX, startY, dx, dy);
90b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        }
91b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell
92b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        @Override
93b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        public void startScroll(Object scroller, int startX, int startY, int dx, int dy,
94b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell                int duration) {
95b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell            ((Scroller) scroller).startScroll(startX, startY, dx, dy, duration);
96b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        }
97b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell
98b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        @Override
99b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        public void fling(Object scroller, int startX, int startY, int velX, int velY,
100b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell                int minX, int maxX, int minY, int maxY) {
101b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell            ((Scroller) scroller).fling(startX, startY, velX, velY, minX, maxX, minY, maxY);
102b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        }
103b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell
104b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        @Override
105b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        public void fling(Object scroller, int startX, int startY, int velX, int velY,
106b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell                int minX, int maxX, int minY, int maxY, int overX, int overY) {
107b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell            ((Scroller) scroller).fling(startX, startY, velX, velY, minX, maxX, minY, maxY);
108b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        }
109b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell
110b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        @Override
111b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        public void abortAnimation(Object scroller) {
112b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell            ((Scroller) scroller).abortAnimation();
113b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        }
114b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell
115b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        @Override
116b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        public void notifyHorizontalEdgeReached(Object scroller, int startX, int finalX,
117b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell                int overX) {
118b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell            // No-op
119b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        }
120b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell
121b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        @Override
122b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        public void notifyVerticalEdgeReached(Object scroller, int startY, int finalY, int overY) {
123b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell            // No-op
124b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        }
125b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell
126b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        @Override
127b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        public boolean isOverScrolled(Object scroller) {
128b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell            // Always false
129b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell            return false;
130b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        }
1316580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell
1326580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell        @Override
1336580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell        public int getFinalX(Object scroller) {
1346580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell            return ((Scroller) scroller).getFinalX();
1356580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell        }
1366580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell
1376580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell        @Override
1386580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell        public int getFinalY(Object scroller) {
1396580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell            return ((Scroller) scroller).getFinalY();
1406580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell        }
141b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell    }
142b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell
143b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell    static class ScrollerCompatImplGingerbread implements ScrollerCompatImpl {
144b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        @Override
145b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        public Object createScroller(Context context, Interpolator interpolator) {
146b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell            return ScrollerCompatGingerbread.createScroller(context, interpolator);
147b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        }
148b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell
149b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        @Override
150b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        public boolean isFinished(Object scroller) {
151b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell            return ScrollerCompatGingerbread.isFinished(scroller);
152b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        }
153b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell
154b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        @Override
155b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        public int getCurrX(Object scroller) {
156b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell            return ScrollerCompatGingerbread.getCurrX(scroller);
157b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        }
158b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell
159b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        @Override
160b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        public int getCurrY(Object scroller) {
161b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell            return ScrollerCompatGingerbread.getCurrY(scroller);
162b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        }
163b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell
164b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        @Override
165b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        public float getCurrVelocity(Object scroller) {
166b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell            return 0;
167b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        }
168b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell
169b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        @Override
170b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        public boolean computeScrollOffset(Object scroller) {
171b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell            return ScrollerCompatGingerbread.computeScrollOffset(scroller);
172b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        }
173b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell
174b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        @Override
175b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        public void startScroll(Object scroller, int startX, int startY, int dx, int dy) {
176b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell            ScrollerCompatGingerbread.startScroll(scroller, startX, startY, dx, dy);
177b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        }
178b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell
179b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        @Override
180b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        public void startScroll(Object scroller, int startX, int startY, int dx, int dy,
181b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell                int duration) {
182b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell            ScrollerCompatGingerbread.startScroll(scroller, startX, startY, dx, dy, duration);
183346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell        }
184346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell
185346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell        @Override
186b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        public void fling(Object scroller, int startX, int startY, int velX, int velY,
187b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell                int minX, int maxX, int minY, int maxY) {
188b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell            ScrollerCompatGingerbread.fling(scroller, startX, startY, velX, velY,
189b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell                    minX, maxX, minY, maxY);
190b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        }
191b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell
192b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        @Override
193b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        public void fling(Object scroller, int startX, int startY, int velX, int velY,
194b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell                int minX, int maxX, int minY, int maxY, int overX, int overY) {
195b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell            ScrollerCompatGingerbread.fling(scroller, startX, startY, velX, velY,
196b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell                    minX, maxX, minY, maxY, overX, overY);
197b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        }
198b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell
199b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        @Override
200b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        public void abortAnimation(Object scroller) {
201b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell            ScrollerCompatGingerbread.abortAnimation(scroller);
202b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        }
203b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell
204b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        @Override
205b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        public void notifyHorizontalEdgeReached(Object scroller, int startX, int finalX,
206b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell                int overX) {
207b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell            ScrollerCompatGingerbread.notifyHorizontalEdgeReached(scroller, startX, finalX, overX);
208b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        }
209b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell
210b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        @Override
211b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        public void notifyVerticalEdgeReached(Object scroller, int startY, int finalY, int overY) {
212b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell            ScrollerCompatGingerbread.notifyVerticalEdgeReached(scroller, startY, finalY, overY);
213b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        }
214b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell
215b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        @Override
216b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        public boolean isOverScrolled(Object scroller) {
217b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell            return ScrollerCompatGingerbread.isOverScrolled(scroller);
218b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        }
2196580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell
2206580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell        @Override
2216580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell        public int getFinalX(Object scroller) {
2226580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell            return ScrollerCompatGingerbread.getFinalX(scroller);
2236580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell        }
2246580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell
2256580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell        @Override
2266580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell        public int getFinalY(Object scroller) {
2276580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell            return ScrollerCompatGingerbread.getFinalY(scroller);
2286580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell        }
229b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell    }
230b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell
231b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell    static class ScrollerCompatImplIcs extends ScrollerCompatImplGingerbread {
232b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        @Override
233b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        public float getCurrVelocity(Object scroller) {
234b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell            return ScrollerCompatIcs.getCurrVelocity(scroller);
235b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        }
236b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell    }
237b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell
238b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell    static final ScrollerCompatImpl IMPL;
239b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell    static {
240b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        final int version = Build.VERSION.SDK_INT;
241b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        if (version >= 14) { // ICS
242b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell            IMPL = new ScrollerCompatImplIcs();
243b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        } else if (version >= 9) { // Gingerbread
244b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell            IMPL = new ScrollerCompatImplGingerbread();
245b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        } else {
246b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell            IMPL = new ScrollerCompatImplBase();
247346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell        }
248346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell    }
249346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell
250c56ba65d20be8742ff717907a3a2cd81dd0e5f3cAdam Powell    public static ScrollerCompat create(Context context) {
251c56ba65d20be8742ff717907a3a2cd81dd0e5f3cAdam Powell        return create(context, null);
252c56ba65d20be8742ff717907a3a2cd81dd0e5f3cAdam Powell    }
253c56ba65d20be8742ff717907a3a2cd81dd0e5f3cAdam Powell
254c56ba65d20be8742ff717907a3a2cd81dd0e5f3cAdam Powell    public static ScrollerCompat create(Context context, Interpolator interpolator) {
255c56ba65d20be8742ff717907a3a2cd81dd0e5f3cAdam Powell        return new ScrollerCompat(context, interpolator);
256346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell    }
257346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell
258c56ba65d20be8742ff717907a3a2cd81dd0e5f3cAdam Powell    ScrollerCompat(Context context, Interpolator interpolator) {
259b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        mScroller = IMPL.createScroller(context, interpolator);
260346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell    }
261346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell
262346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell    /**
263346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     * Returns whether the scroller has finished scrolling.
264346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     *
265346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     * @return True if the scroller has finished scrolling, false otherwise.
266346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     */
267346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell    public boolean isFinished() {
268b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        return IMPL.isFinished(mScroller);
269346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell    }
270346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell
271346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell    /**
272346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     * Returns the current X offset in the scroll.
273346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     *
274346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     * @return The new X offset as an absolute distance from the origin.
275346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     */
276346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell    public int getCurrX() {
277b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        return IMPL.getCurrX(mScroller);
278346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell    }
279346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell
280346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell    /**
281346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     * Returns the current Y offset in the scroll.
282346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     *
283346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     * @return The new Y offset as an absolute distance from the origin.
284346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     */
285346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell    public int getCurrY() {
286b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        return IMPL.getCurrY(mScroller);
287346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell    }
288346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell
289346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell    /**
2906580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell     * @return The final X position for the scroll in progress, if known.
2916580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell     */
2926580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell    public int getFinalX() {
2936580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell        return IMPL.getFinalX(mScroller);
2946580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell    }
2956580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell
2966580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell    /**
2976580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell     * @return The final Y position for the scroll in progress, if known.
2986580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell     */
2996580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell    public int getFinalY() {
3006580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell        return IMPL.getFinalY(mScroller);
3016580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell    }
3026580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell
3036580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell    /**
304b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     * Returns the current velocity on platform versions that support it.
305346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     *
306b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     * <p>The device must support at least API level 14 (Ice Cream Sandwich).
307b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     * On older platform versions this method will return 0. This method should
308b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     * only be used as input for nonessential visual effects such as {@link EdgeEffectCompat}.</p>
309346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     *
310346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     * @return The original velocity less the deceleration. Result may be
311346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     * negative.
312346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     */
313346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell    public float getCurrVelocity() {
314b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        return IMPL.getCurrVelocity(mScroller);
315346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell    }
316346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell
317346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell    /**
318346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     * Call this when you want to know the new location.  If it returns true,
319346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     * the animation is not yet finished.  loc will be altered to provide the
320346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     * new location.
321346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     */
322346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell    public boolean computeScrollOffset() {
323b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        return IMPL.computeScrollOffset(mScroller);
324346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell    }
325346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell
326346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell    /**
327346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     * Start scrolling by providing a starting point and the distance to travel.
328346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     * The scroll will use the default value of 250 milliseconds for the
329346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     * duration.
330346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     *
331346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     * @param startX Starting horizontal scroll offset in pixels. Positive
332346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     *        numbers will scroll the content to the left.
333346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     * @param startY Starting vertical scroll offset in pixels. Positive numbers
334346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     *        will scroll the content up.
335346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     * @param dx Horizontal distance to travel. Positive numbers will scroll the
336346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     *        content to the left.
337346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     * @param dy Vertical distance to travel. Positive numbers will scroll the
338346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     *        content up.
339346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     */
340346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell    public void startScroll(int startX, int startY, int dx, int dy) {
341b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        IMPL.startScroll(mScroller, startX, startY, dx, dy);
342346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell    }
343346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell
344346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell    /**
345346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     * Start scrolling by providing a starting point and the distance to travel.
346346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     *
347346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     * @param startX Starting horizontal scroll offset in pixels. Positive
348346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     *        numbers will scroll the content to the left.
349346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     * @param startY Starting vertical scroll offset in pixels. Positive numbers
350346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     *        will scroll the content up.
351346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     * @param dx Horizontal distance to travel. Positive numbers will scroll the
352346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     *        content to the left.
353346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     * @param dy Vertical distance to travel. Positive numbers will scroll the
354346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     *        content up.
355346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     * @param duration Duration of the scroll in milliseconds.
356346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     */
357346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell    public void startScroll(int startX, int startY, int dx, int dy, int duration) {
358b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        IMPL.startScroll(mScroller, startX, startY, dx, dy, duration);
359346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell    }
360346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell
361346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell    /**
362346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     * Start scrolling based on a fling gesture. The distance travelled will
363346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     * depend on the initial velocity of the fling.
364346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     *
365346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     * @param startX Starting point of the scroll (X)
366346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     * @param startY Starting point of the scroll (Y)
367346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     * @param velocityX Initial velocity of the fling (X) measured in pixels per
368346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     *        second.
369346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     * @param velocityY Initial velocity of the fling (Y) measured in pixels per
370346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     *        second
371346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     * @param minX Minimum X value. The scroller will not scroll past this
372346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     *        point.
373346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     * @param maxX Maximum X value. The scroller will not scroll past this
374346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     *        point.
375346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     * @param minY Minimum Y value. The scroller will not scroll past this
376346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     *        point.
377346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     * @param maxY Maximum Y value. The scroller will not scroll past this
378346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     *        point.
379346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     */
380346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell    public void fling(int startX, int startY, int velocityX, int velocityY,
381346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell            int minX, int maxX, int minY, int maxY) {
382b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        IMPL.fling(mScroller, startX, startY, velocityX, velocityY, minX, maxX, minY, maxY);
383346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell    }
384346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell
385346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell    /**
386b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     * Start scrolling based on a fling gesture. The distance travelled will
387b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     * depend on the initial velocity of the fling.
388b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     *
389b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     * @param startX Starting point of the scroll (X)
390b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     * @param startY Starting point of the scroll (Y)
391b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     * @param velocityX Initial velocity of the fling (X) measured in pixels per
392b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     *        second.
393b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     * @param velocityY Initial velocity of the fling (Y) measured in pixels per
394b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     *        second
395b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     * @param minX Minimum X value. The scroller will not scroll past this
396b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     *        point.
397b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     * @param maxX Maximum X value. The scroller will not scroll past this
398b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     *        point.
399b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     * @param minY Minimum Y value. The scroller will not scroll past this
400b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     *        point.
401b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     * @param maxY Maximum Y value. The scroller will not scroll past this
402b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     *        point.
403b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     * @param overX Overfling range. If > 0, horizontal overfling in either
404b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     *            direction will be possible.
405b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     * @param overY Overfling range. If > 0, vertical overfling in either
406b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     *            direction will be possible.
407b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     */
408b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell    public void fling(int startX, int startY, int velocityX, int velocityY,
409b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell            int minX, int maxX, int minY, int maxY, int overX, int overY) {
410b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        IMPL.fling(mScroller, startX, startY, velocityX, velocityY,
411b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell                minX, maxX, minY, maxY, overX, overY);
412b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell    }
413b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell
414b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell    /**
415b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     * Stops the animation. Aborting the animation causes the scroller to move to the final x and y
416b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     * position.
417346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     */
418346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell    public void abortAnimation() {
419b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        IMPL.abortAnimation(mScroller);
420b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell    }
421b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell
422b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell
423b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell    /**
424b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     * Notify the scroller that we've reached a horizontal boundary.
425b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     * Normally the information to handle this will already be known
426b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     * when the animation is started, such as in a call to one of the
427b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     * fling functions. However there are cases where this cannot be known
428b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     * in advance. This function will transition the current motion and
429b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     * animate from startX to finalX as appropriate.
430b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     *
431b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     * @param startX Starting/current X position
432b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     * @param finalX Desired final X position
433b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     * @param overX Magnitude of overscroll allowed. This should be the maximum
434b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     *              desired distance from finalX. Absolute value - must be positive.
435b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     */
436b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell    public void notifyHorizontalEdgeReached(int startX, int finalX, int overX) {
437b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        IMPL.notifyHorizontalEdgeReached(mScroller, startX, finalX, overX);
438b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell    }
439b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell
440b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell    /**
441b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     * Notify the scroller that we've reached a vertical boundary.
442b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     * Normally the information to handle this will already be known
443b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     * when the animation is started, such as in a call to one of the
444b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     * fling functions. However there are cases where this cannot be known
445b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     * in advance. This function will animate a parabolic motion from
446b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     * startY to finalY.
447b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     *
448b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     * @param startY Starting/current Y position
449b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     * @param finalY Desired final Y position
450b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     * @param overY Magnitude of overscroll allowed. This should be the maximum
451b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     *              desired distance from finalY. Absolute value - must be positive.
452b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     */
453b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell    public void notifyVerticalEdgeReached(int startY, int finalY, int overY) {
454b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        IMPL.notifyVerticalEdgeReached(mScroller, startY, finalY, overY);
455b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell    }
456b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell
457b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell    /**
458b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     * Returns whether the current Scroller is currently returning to a valid position.
459b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     * Valid bounds were provided by the
460b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     * {@link #fling(int, int, int, int, int, int, int, int, int, int)} method.
461b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     *
462b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     * One should check this value before calling
463b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     * {@link #startScroll(int, int, int, int)} as the interpolation currently in progress
464b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     * to restore a valid position will then be stopped. The caller has to take into account
465b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     * the fact that the started scroll will start from an overscrolled position.
466b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     *
467b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     * @return true when the current position is overscrolled and in the process of
468b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     *         interpolating back to a valid value.
469b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     */
470b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell    public boolean isOverScrolled() {
471b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        return IMPL.isOverScrolled(mScroller);
472346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell    }
473346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell}
474