ScrollerCompat.java revision c5847d13e40f5d52459f5c0dab32dc08f1a9a683
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;
21009b4ef9d97e1cc237477e3284fc305bb1438cc9Adam Powellimport android.view.animation.AnimationUtils;
22c56ba65d20be8742ff717907a3a2cd81dd0e5f3cAdam Powellimport android.view.animation.Interpolator;
23346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powellimport android.widget.Scroller;
24346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell
25346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell/**
26346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * Provides access to new {@link android.widget.Scroller Scroller} APIs when available.
27346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell *
28346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * <p>This class provides a platform version-independent mechanism for obeying the
29346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * current device's preferred scroll physics and fling behavior. It offers a subset of
30346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * the APIs from Scroller or OverScroller.</p>
31346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell */
32c5847d13e40f5d52459f5c0dab32dc08f1a9a683Chris Banespublic final class ScrollerCompat {
33009b4ef9d97e1cc237477e3284fc305bb1438cc9Adam Powell    private static final String TAG = "ScrollerCompat";
34009b4ef9d97e1cc237477e3284fc305bb1438cc9Adam Powell
35b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell    Object mScroller;
36009b4ef9d97e1cc237477e3284fc305bb1438cc9Adam Powell    ScrollerCompatImpl mImpl;
37346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell
38b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell    interface ScrollerCompatImpl {
39b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        Object createScroller(Context context, Interpolator interpolator);
40b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        boolean isFinished(Object scroller);
41b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        int getCurrX(Object scroller);
42b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        int getCurrY(Object scroller);
43b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        float getCurrVelocity(Object scroller);
44b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        boolean computeScrollOffset(Object scroller);
45b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        void startScroll(Object scroller, int startX, int startY, int dx, int dy);
46b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        void startScroll(Object scroller, int startX, int startY, int dx, int dy, int duration);
47b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        void fling(Object scroller, int startX, int startY, int velX, int velY,
48b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell                int minX, int maxX, int minY, int maxY);
49b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        void fling(Object scroller, int startX, int startY, int velX, int velY,
50b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell                int minX, int maxX, int minY, int maxY, int overX, int overY);
51b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        void abortAnimation(Object scroller);
52b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        void notifyHorizontalEdgeReached(Object scroller, int startX, int finalX, int overX);
53b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        void notifyVerticalEdgeReached(Object scroller, int startY, int finalY, int overY);
54b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        boolean isOverScrolled(Object scroller);
556580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell        int getFinalX(Object scroller);
566580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell        int getFinalY(Object scroller);
5700db92e217c3bc08acd09143cac8e3d3b0d0e813Chris Banes        boolean springBack(Object scroller, int startX, int startY, int minX, int maxX,
5800db92e217c3bc08acd09143cac8e3d3b0d0e813Chris Banes                int minY, int maxY);
59b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell    }
60b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell
61009b4ef9d97e1cc237477e3284fc305bb1438cc9Adam Powell    static final int CHASE_FRAME_TIME = 16; // ms per target frame
62009b4ef9d97e1cc237477e3284fc305bb1438cc9Adam Powell
63b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell    static class ScrollerCompatImplBase implements ScrollerCompatImpl {
64b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        @Override
65b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        public Object createScroller(Context context, Interpolator interpolator) {
66b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell            return interpolator != null ?
67b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell                    new Scroller(context, interpolator) : new Scroller(context);
68b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        }
69b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell
70b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        @Override
71b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        public boolean isFinished(Object scroller) {
7248e3efd2e7bc8057212d3936a239838ecf6e40a9Yigit Boyar            return ((Scroller) scroller).isFinished();
73b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        }
74b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell
75b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        @Override
76b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        public int getCurrX(Object scroller) {
77b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell            return ((Scroller) scroller).getCurrX();
78b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        }
79b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell
80b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        @Override
81b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        public int getCurrY(Object scroller) {
82b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell            return ((Scroller) scroller).getCurrY();
83b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        }
84b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell
85b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        @Override
86b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        public float getCurrVelocity(Object scroller) {
87b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell            return 0;
88b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        }
89b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell
90b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        @Override
91b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        public boolean computeScrollOffset(Object scroller) {
92009b4ef9d97e1cc237477e3284fc305bb1438cc9Adam Powell            final Scroller s = (Scroller) scroller;
9348e3efd2e7bc8057212d3936a239838ecf6e40a9Yigit Boyar            return s.computeScrollOffset();
94b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        }
95b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell
96b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        @Override
97b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        public void startScroll(Object scroller, int startX, int startY, int dx, int dy) {
98b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell            ((Scroller) scroller).startScroll(startX, startY, dx, dy);
99b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        }
100b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell
101b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        @Override
102b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        public void startScroll(Object scroller, int startX, int startY, int dx, int dy,
103b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell                int duration) {
104b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell            ((Scroller) scroller).startScroll(startX, startY, dx, dy, duration);
105b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        }
106b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell
107b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        @Override
108b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        public void fling(Object scroller, int startX, int startY, int velX, int velY,
109b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell                int minX, int maxX, int minY, int maxY) {
110b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell            ((Scroller) scroller).fling(startX, startY, velX, velY, minX, maxX, minY, maxY);
111b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        }
112b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell
113b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        @Override
114b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        public void fling(Object scroller, int startX, int startY, int velX, int velY,
115b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell                int minX, int maxX, int minY, int maxY, int overX, int overY) {
116b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell            ((Scroller) scroller).fling(startX, startY, velX, velY, minX, maxX, minY, maxY);
117b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        }
118b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell
119b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        @Override
120b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        public void abortAnimation(Object scroller) {
121b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell            ((Scroller) scroller).abortAnimation();
122b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        }
123b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell
124b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        @Override
125b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        public void notifyHorizontalEdgeReached(Object scroller, int startX, int finalX,
126b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell                int overX) {
127b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell            // No-op
128b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        }
129b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell
130b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        @Override
131b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        public void notifyVerticalEdgeReached(Object scroller, int startY, int finalY, int overY) {
132b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell            // No-op
133b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        }
134b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell
135b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        @Override
136b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        public boolean isOverScrolled(Object scroller) {
137b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell            // Always false
138b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell            return false;
139b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        }
1406580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell
1416580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell        @Override
1426580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell        public int getFinalX(Object scroller) {
1436580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell            return ((Scroller) scroller).getFinalX();
1446580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell        }
1456580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell
1466580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell        @Override
1476580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell        public int getFinalY(Object scroller) {
1486580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell            return ((Scroller) scroller).getFinalY();
1496580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell        }
15000db92e217c3bc08acd09143cac8e3d3b0d0e813Chris Banes
15100db92e217c3bc08acd09143cac8e3d3b0d0e813Chris Banes        @Override
15200db92e217c3bc08acd09143cac8e3d3b0d0e813Chris Banes        public boolean springBack(Object scroller, int startX, int startY, int minX, int maxX,
15300db92e217c3bc08acd09143cac8e3d3b0d0e813Chris Banes                int minY, int maxY) {
15400db92e217c3bc08acd09143cac8e3d3b0d0e813Chris Banes            return false;
15500db92e217c3bc08acd09143cac8e3d3b0d0e813Chris Banes        }
156b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell    }
157b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell
158b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell    static class ScrollerCompatImplGingerbread implements ScrollerCompatImpl {
159b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        @Override
160b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        public Object createScroller(Context context, Interpolator interpolator) {
161b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell            return ScrollerCompatGingerbread.createScroller(context, interpolator);
162b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        }
163b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell
164b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        @Override
165b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        public boolean isFinished(Object scroller) {
16648e3efd2e7bc8057212d3936a239838ecf6e40a9Yigit Boyar            return ScrollerCompatGingerbread.isFinished(scroller);
167b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        }
168b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell
169b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        @Override
170b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        public int getCurrX(Object scroller) {
171b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell            return ScrollerCompatGingerbread.getCurrX(scroller);
172b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        }
173b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell
174b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        @Override
175b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        public int getCurrY(Object scroller) {
176b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell            return ScrollerCompatGingerbread.getCurrY(scroller);
177b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        }
178b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell
179b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        @Override
180b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        public float getCurrVelocity(Object scroller) {
181b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell            return 0;
182b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        }
183b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell
184b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        @Override
185b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        public boolean computeScrollOffset(Object scroller) {
18648e3efd2e7bc8057212d3936a239838ecf6e40a9Yigit Boyar            return ScrollerCompatGingerbread.computeScrollOffset(scroller);
187b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        }
188b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell
189b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        @Override
190b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        public void startScroll(Object scroller, int startX, int startY, int dx, int dy) {
191b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell            ScrollerCompatGingerbread.startScroll(scroller, startX, startY, dx, dy);
192b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        }
193b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell
194b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        @Override
195b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        public void startScroll(Object scroller, int startX, int startY, int dx, int dy,
196b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell                int duration) {
197b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell            ScrollerCompatGingerbread.startScroll(scroller, startX, startY, dx, dy, duration);
198346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell        }
199346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell
200346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell        @Override
201b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        public void fling(Object scroller, int startX, int startY, int velX, int velY,
202b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell                int minX, int maxX, int minY, int maxY) {
203b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell            ScrollerCompatGingerbread.fling(scroller, startX, startY, velX, velY,
204b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell                    minX, maxX, minY, maxY);
205b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        }
206b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell
207b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        @Override
208b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        public void fling(Object scroller, int startX, int startY, int velX, int velY,
209b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell                int minX, int maxX, int minY, int maxY, int overX, int overY) {
210b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell            ScrollerCompatGingerbread.fling(scroller, startX, startY, velX, velY,
211b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell                    minX, maxX, minY, maxY, overX, overY);
212b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        }
213b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell
214b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        @Override
215b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        public void abortAnimation(Object scroller) {
216b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell            ScrollerCompatGingerbread.abortAnimation(scroller);
217b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        }
218b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell
219b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        @Override
220b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        public void notifyHorizontalEdgeReached(Object scroller, int startX, int finalX,
221b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell                int overX) {
222b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell            ScrollerCompatGingerbread.notifyHorizontalEdgeReached(scroller, startX, finalX, overX);
223b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        }
224b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell
225b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        @Override
226b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        public void notifyVerticalEdgeReached(Object scroller, int startY, int finalY, int overY) {
227b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell            ScrollerCompatGingerbread.notifyVerticalEdgeReached(scroller, startY, finalY, overY);
228b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        }
229b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell
230b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        @Override
231b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        public boolean isOverScrolled(Object scroller) {
232b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell            return ScrollerCompatGingerbread.isOverScrolled(scroller);
233b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        }
2346580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell
2356580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell        @Override
2366580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell        public int getFinalX(Object scroller) {
2376580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell            return ScrollerCompatGingerbread.getFinalX(scroller);
2386580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell        }
2396580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell
2406580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell        @Override
2416580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell        public int getFinalY(Object scroller) {
2426580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell            return ScrollerCompatGingerbread.getFinalY(scroller);
2436580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell        }
24400db92e217c3bc08acd09143cac8e3d3b0d0e813Chris Banes
24500db92e217c3bc08acd09143cac8e3d3b0d0e813Chris Banes        @Override
24600db92e217c3bc08acd09143cac8e3d3b0d0e813Chris Banes        public boolean springBack(Object scroller, int startX, int startY, int minX, int maxX,
24700db92e217c3bc08acd09143cac8e3d3b0d0e813Chris Banes                int minY, int maxY) {
24800db92e217c3bc08acd09143cac8e3d3b0d0e813Chris Banes            return ScrollerCompatGingerbread.springBack(scroller, startX, startY, minX, maxX,
24900db92e217c3bc08acd09143cac8e3d3b0d0e813Chris Banes                    minY, maxY);
25000db92e217c3bc08acd09143cac8e3d3b0d0e813Chris Banes        }
251b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell    }
252b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell
253b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell    static class ScrollerCompatImplIcs extends ScrollerCompatImplGingerbread {
254b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        @Override
255b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        public float getCurrVelocity(Object scroller) {
256b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell            return ScrollerCompatIcs.getCurrVelocity(scroller);
257b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell        }
258b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell    }
259b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell
260c56ba65d20be8742ff717907a3a2cd81dd0e5f3cAdam Powell    public static ScrollerCompat create(Context context) {
261c56ba65d20be8742ff717907a3a2cd81dd0e5f3cAdam Powell        return create(context, null);
262c56ba65d20be8742ff717907a3a2cd81dd0e5f3cAdam Powell    }
263c56ba65d20be8742ff717907a3a2cd81dd0e5f3cAdam Powell
264c56ba65d20be8742ff717907a3a2cd81dd0e5f3cAdam Powell    public static ScrollerCompat create(Context context, Interpolator interpolator) {
265c5847d13e40f5d52459f5c0dab32dc08f1a9a683Chris Banes        return new ScrollerCompat(Build.VERSION.SDK_INT, context, interpolator);
2664ad0efc06631e6e35d8ced424c36438bf5827569Yigit Boyar    }
2674ad0efc06631e6e35d8ced424c36438bf5827569Yigit Boyar
2684ad0efc06631e6e35d8ced424c36438bf5827569Yigit Boyar    /**
2694ad0efc06631e6e35d8ced424c36438bf5827569Yigit Boyar     * Private constructer where API version can be provided.
2704ad0efc06631e6e35d8ced424c36438bf5827569Yigit Boyar     * Useful for unit testing.
2714ad0efc06631e6e35d8ced424c36438bf5827569Yigit Boyar     */
2724ad0efc06631e6e35d8ced424c36438bf5827569Yigit Boyar    private ScrollerCompat(int apiVersion, Context context, Interpolator interpolator) {
2734ad0efc06631e6e35d8ced424c36438bf5827569Yigit Boyar        if (apiVersion >= 14) { // ICS
274009b4ef9d97e1cc237477e3284fc305bb1438cc9Adam Powell            mImpl = new ScrollerCompatImplIcs();
2754ad0efc06631e6e35d8ced424c36438bf5827569Yigit Boyar        } else if (apiVersion>= 9) { // Gingerbread
276009b4ef9d97e1cc237477e3284fc305bb1438cc9Adam Powell            mImpl = new ScrollerCompatImplGingerbread();
277009b4ef9d97e1cc237477e3284fc305bb1438cc9Adam Powell        } else {
278009b4ef9d97e1cc237477e3284fc305bb1438cc9Adam Powell            mImpl = new ScrollerCompatImplBase();
279009b4ef9d97e1cc237477e3284fc305bb1438cc9Adam Powell        }
280009b4ef9d97e1cc237477e3284fc305bb1438cc9Adam Powell        mScroller = mImpl.createScroller(context, interpolator);
281346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell    }
282346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell
283346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell    /**
284346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     * Returns whether the scroller has finished scrolling.
285346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     *
286346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     * @return True if the scroller has finished scrolling, false otherwise.
287346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     */
288346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell    public boolean isFinished() {
289009b4ef9d97e1cc237477e3284fc305bb1438cc9Adam Powell        return mImpl.isFinished(mScroller);
290346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell    }
291346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell
292346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell    /**
293346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     * Returns the current X offset in the scroll.
294346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     *
295346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     * @return The new X offset as an absolute distance from the origin.
296346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     */
297346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell    public int getCurrX() {
298009b4ef9d97e1cc237477e3284fc305bb1438cc9Adam Powell        return mImpl.getCurrX(mScroller);
299346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell    }
300346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell
301346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell    /**
302346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     * Returns the current Y offset in the scroll.
303346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     *
304346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     * @return The new Y offset as an absolute distance from the origin.
305346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     */
306346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell    public int getCurrY() {
307009b4ef9d97e1cc237477e3284fc305bb1438cc9Adam Powell        return mImpl.getCurrY(mScroller);
308346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell    }
309346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell
310346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell    /**
3116580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell     * @return The final X position for the scroll in progress, if known.
3126580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell     */
3136580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell    public int getFinalX() {
314009b4ef9d97e1cc237477e3284fc305bb1438cc9Adam Powell        return mImpl.getFinalX(mScroller);
3156580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell    }
3166580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell
3176580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell    /**
3186580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell     * @return The final Y position for the scroll in progress, if known.
3196580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell     */
3206580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell    public int getFinalY() {
321009b4ef9d97e1cc237477e3284fc305bb1438cc9Adam Powell        return mImpl.getFinalY(mScroller);
3226580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell    }
3236580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell
3246580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell    /**
325b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     * Returns the current velocity on platform versions that support it.
326346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     *
327b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     * <p>The device must support at least API level 14 (Ice Cream Sandwich).
328b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     * On older platform versions this method will return 0. This method should
329b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     * only be used as input for nonessential visual effects such as {@link EdgeEffectCompat}.</p>
330346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     *
331346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     * @return The original velocity less the deceleration. Result may be
332346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     * negative.
333346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     */
334346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell    public float getCurrVelocity() {
335009b4ef9d97e1cc237477e3284fc305bb1438cc9Adam Powell        return mImpl.getCurrVelocity(mScroller);
336346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell    }
337346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell
338346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell    /**
339346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     * Call this when you want to know the new location.  If it returns true,
340346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     * the animation is not yet finished.  loc will be altered to provide the
341346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     * new location.
342346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     */
343346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell    public boolean computeScrollOffset() {
344009b4ef9d97e1cc237477e3284fc305bb1438cc9Adam Powell        return mImpl.computeScrollOffset(mScroller);
345346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell    }
346346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell
347346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell    /**
348346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     * Start scrolling by providing a starting point and the distance to travel.
349346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     * The scroll will use the default value of 250 milliseconds for the
350346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     * duration.
351346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     *
352346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     * @param startX Starting horizontal scroll offset in pixels. Positive
353346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     *        numbers will scroll the content to the left.
354346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     * @param startY Starting vertical scroll offset in pixels. Positive numbers
355346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     *        will scroll the content up.
356346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     * @param dx Horizontal distance to travel. Positive numbers will scroll the
357346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     *        content to the left.
358346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     * @param dy Vertical distance to travel. Positive numbers will scroll the
359346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     *        content up.
360346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     */
361346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell    public void startScroll(int startX, int startY, int dx, int dy) {
362009b4ef9d97e1cc237477e3284fc305bb1438cc9Adam Powell        mImpl.startScroll(mScroller, startX, startY, dx, dy);
363346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell    }
364346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell
365346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell    /**
366346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     * Start scrolling by providing a starting point and the distance to travel.
367346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     *
368346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     * @param startX Starting horizontal scroll offset in pixels. Positive
369346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     *        numbers will scroll the content to the left.
370346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     * @param startY Starting vertical scroll offset in pixels. Positive numbers
371346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     *        will scroll the content up.
372346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     * @param dx Horizontal distance to travel. Positive numbers will scroll the
373346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     *        content to the left.
374346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     * @param dy Vertical distance to travel. Positive numbers will scroll the
375346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     *        content up.
376346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     * @param duration Duration of the scroll in milliseconds.
377346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     */
378346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell    public void startScroll(int startX, int startY, int dx, int dy, int duration) {
379009b4ef9d97e1cc237477e3284fc305bb1438cc9Adam Powell        mImpl.startScroll(mScroller, startX, startY, dx, dy, duration);
380346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell    }
381346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell
382346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell    /**
383346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     * Start scrolling based on a fling gesture. The distance travelled will
384346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     * depend on the initial velocity of the fling.
385346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     *
386346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     * @param startX Starting point of the scroll (X)
387346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     * @param startY Starting point of the scroll (Y)
388346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     * @param velocityX Initial velocity of the fling (X) measured in pixels per
389346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     *        second.
390346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     * @param velocityY Initial velocity of the fling (Y) measured in pixels per
391346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     *        second
392346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     * @param minX Minimum X value. The scroller will not scroll past this
393346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     *        point.
394346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     * @param maxX Maximum X value. The scroller will not scroll past this
395346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     *        point.
396346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     * @param minY Minimum Y value. The scroller will not scroll past this
397346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     *        point.
398346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     * @param maxY Maximum Y value. The scroller will not scroll past this
399346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     *        point.
400346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     */
401346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell    public void fling(int startX, int startY, int velocityX, int velocityY,
402346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell            int minX, int maxX, int minY, int maxY) {
403009b4ef9d97e1cc237477e3284fc305bb1438cc9Adam Powell        mImpl.fling(mScroller, startX, startY, velocityX, velocityY, minX, maxX, minY, maxY);
404346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell    }
405346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell
406346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell    /**
407b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     * Start scrolling based on a fling gesture. The distance travelled will
408b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     * depend on the initial velocity of the fling.
409b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     *
410b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     * @param startX Starting point of the scroll (X)
411b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     * @param startY Starting point of the scroll (Y)
412b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     * @param velocityX Initial velocity of the fling (X) measured in pixels per
413b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     *        second.
414b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     * @param velocityY Initial velocity of the fling (Y) measured in pixels per
415b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     *        second
416b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     * @param minX Minimum X value. The scroller will not scroll past this
417b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     *        point.
418b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     * @param maxX Maximum X value. The scroller will not scroll past this
419b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     *        point.
420b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     * @param minY Minimum Y value. The scroller will not scroll past this
421b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     *        point.
422b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     * @param maxY Maximum Y value. The scroller will not scroll past this
423b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     *        point.
424b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     * @param overX Overfling range. If > 0, horizontal overfling in either
425b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     *            direction will be possible.
426b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     * @param overY Overfling range. If > 0, vertical overfling in either
427b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     *            direction will be possible.
428b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     */
429b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell    public void fling(int startX, int startY, int velocityX, int velocityY,
430b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell            int minX, int maxX, int minY, int maxY, int overX, int overY) {
431009b4ef9d97e1cc237477e3284fc305bb1438cc9Adam Powell        mImpl.fling(mScroller, startX, startY, velocityX, velocityY,
432b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell                minX, maxX, minY, maxY, overX, overY);
433b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell    }
434b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell
435b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell    /**
43600db92e217c3bc08acd09143cac8e3d3b0d0e813Chris Banes     * Call this when you want to 'spring back' into a valid coordinate range.
43700db92e217c3bc08acd09143cac8e3d3b0d0e813Chris Banes     *
43800db92e217c3bc08acd09143cac8e3d3b0d0e813Chris Banes     * @param startX Starting X coordinate
43900db92e217c3bc08acd09143cac8e3d3b0d0e813Chris Banes     * @param startY Starting Y coordinate
44000db92e217c3bc08acd09143cac8e3d3b0d0e813Chris Banes     * @param minX Minimum valid X value
44100db92e217c3bc08acd09143cac8e3d3b0d0e813Chris Banes     * @param maxX Maximum valid X value
44200db92e217c3bc08acd09143cac8e3d3b0d0e813Chris Banes     * @param minY Minimum valid Y value
4438c05e5f52fbc790b745e768398d9e69d6b9d9ee1Chris Banes     * @param maxY Maximum valid Y value
44400db92e217c3bc08acd09143cac8e3d3b0d0e813Chris Banes     * @return true if a springback was initiated, false if startX and startY were
44500db92e217c3bc08acd09143cac8e3d3b0d0e813Chris Banes     *          already within the valid range.
44600db92e217c3bc08acd09143cac8e3d3b0d0e813Chris Banes     */
44700db92e217c3bc08acd09143cac8e3d3b0d0e813Chris Banes    public boolean springBack(int startX, int startY, int minX, int maxX, int minY, int maxY) {
44800db92e217c3bc08acd09143cac8e3d3b0d0e813Chris Banes        return mImpl.springBack(mScroller, startX, startY, minX, maxX, minY, maxY);
44900db92e217c3bc08acd09143cac8e3d3b0d0e813Chris Banes    }
45000db92e217c3bc08acd09143cac8e3d3b0d0e813Chris Banes
45100db92e217c3bc08acd09143cac8e3d3b0d0e813Chris Banes    /**
452b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     * Stops the animation. Aborting the animation causes the scroller to move to the final x and y
453b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     * position.
454346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell     */
455346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell    public void abortAnimation() {
456009b4ef9d97e1cc237477e3284fc305bb1438cc9Adam Powell        mImpl.abortAnimation(mScroller);
457b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell    }
458b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell
459b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell
460b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell    /**
461b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     * Notify the scroller that we've reached a horizontal boundary.
462b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     * Normally the information to handle this will already be known
463b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     * when the animation is started, such as in a call to one of the
464b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     * fling functions. However there are cases where this cannot be known
465b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     * in advance. This function will transition the current motion and
466b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     * animate from startX to finalX as appropriate.
467b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     *
468b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     * @param startX Starting/current X position
469b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     * @param finalX Desired final X position
470b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     * @param overX Magnitude of overscroll allowed. This should be the maximum
471b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     *              desired distance from finalX. Absolute value - must be positive.
472b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     */
473b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell    public void notifyHorizontalEdgeReached(int startX, int finalX, int overX) {
474009b4ef9d97e1cc237477e3284fc305bb1438cc9Adam Powell        mImpl.notifyHorizontalEdgeReached(mScroller, startX, finalX, overX);
475b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell    }
476b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell
477b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell    /**
478b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     * Notify the scroller that we've reached a vertical boundary.
479b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     * Normally the information to handle this will already be known
480b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     * when the animation is started, such as in a call to one of the
481b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     * fling functions. However there are cases where this cannot be known
482b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     * in advance. This function will animate a parabolic motion from
483b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     * startY to finalY.
484b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     *
485b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     * @param startY Starting/current Y position
486b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     * @param finalY Desired final Y position
487b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     * @param overY Magnitude of overscroll allowed. This should be the maximum
488b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     *              desired distance from finalY. Absolute value - must be positive.
489b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     */
490b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell    public void notifyVerticalEdgeReached(int startY, int finalY, int overY) {
491009b4ef9d97e1cc237477e3284fc305bb1438cc9Adam Powell        mImpl.notifyVerticalEdgeReached(mScroller, startY, finalY, overY);
492b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell    }
493b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell
494b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell    /**
495b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     * Returns whether the current Scroller is currently returning to a valid position.
496b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     * Valid bounds were provided by the
497b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     * {@link #fling(int, int, int, int, int, int, int, int, int, int)} method.
498b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     *
499b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     * One should check this value before calling
500b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     * {@link #startScroll(int, int, int, int)} as the interpolation currently in progress
501b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     * to restore a valid position will then be stopped. The caller has to take into account
502b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     * the fact that the started scroll will start from an overscrolled position.
503b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     *
504b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     * @return true when the current position is overscrolled and in the process of
505b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     *         interpolating back to a valid value.
506b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell     */
507b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell    public boolean isOverScrolled() {
508009b4ef9d97e1cc237477e3284fc305bb1438cc9Adam Powell        return mImpl.isOverScrolled(mScroller);
509346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell    }
510346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell}
511