Index: android_webview/java/src/org/chromium/android_webview/AwScrollOffsetManager.java |
diff --git a/android_webview/java/src/org/chromium/android_webview/AwScrollOffsetManager.java b/android_webview/java/src/org/chromium/android_webview/AwScrollOffsetManager.java |
index 4564b42ff04c4f76e2bf45c42611cd21bae64bb0..ead226c1adf9e134e7ff8496c40c143d1d3de669 100644 |
--- a/android_webview/java/src/org/chromium/android_webview/AwScrollOffsetManager.java |
+++ b/android_webview/java/src/org/chromium/android_webview/AwScrollOffsetManager.java |
@@ -4,6 +4,8 @@ |
package org.chromium.android_webview; |
+import android.widget.OverScroller; |
+ |
import org.chromium.base.CalledByNative; |
/** |
@@ -24,8 +26,11 @@ public class AwScrollOffsetManager { |
// operation, the native side shouldn't synchronously alter the scroll offset from within |
// this call. |
void scrollNativeTo(int x, int y); |
+ |
int getContainerViewScrollX(); |
int getContainerViewScrollY(); |
+ |
+ void invalidate(); |
} |
private final Delegate mDelegate; |
@@ -42,14 +47,24 @@ public class AwScrollOffsetManager { |
private int mContainerViewWidth; |
private int mContainerViewHeight; |
+ // Whether we're in the middle of processing a touch event. |
private boolean mProcessingTouchEvent; |
+ // Whether (and to what value) to update the native side scroll offset after we've finished |
+ // provessing a touch event. |
private boolean mApplyDeferredNativeScroll; |
private int mDeferredNativeScrollX; |
private int mDeferredNativeScrollY; |
- public AwScrollOffsetManager(Delegate delegate) { |
+ // The velocity of the last recorded fling, |
+ private int mLastFlingVx; |
+ private int mLastFlingVy; |
+ |
+ private OverScroller mScroller; |
+ |
+ public AwScrollOffsetManager(Delegate delegate, OverScroller overScroller) { |
mDelegate = delegate; |
+ mScroller = overScroller; |
} |
//----- Scroll range and extent calculation methods ------------------------------------------- |
@@ -133,7 +148,9 @@ public class AwScrollOffsetManager { |
} |
// Called by the native side to over-scroll the container view. |
- public void overscrollBy(int deltaX, int deltaY) { |
+ public void overScrollBy(int deltaX, int deltaY) { |
+ if (deltaX == 0 && deltaY == 0) return; |
+ |
final int scrollX = mDelegate.getContainerViewScrollX(); |
final int scrollY = mDelegate.getContainerViewScrollY(); |
final int scrollRangeX = computeMaximumHorizontalScrollOffset(); |
@@ -201,4 +218,59 @@ public class AwScrollOffsetManager { |
mDelegate.scrollNativeTo(x, y); |
} |
+ |
+ /** |
+ * Called at the beginning of every fling gesture. |
+ */ |
+ public void onFlingStartGestureStart(int vx, int vy) { |
+ mLastFlingVx = vx; |
+ mLastFlingVy = vy; |
+ } |
+ |
+ /** |
+ * Called when a fling gesture is not handled by the renderer. |
+ * We explicitly ask the renderer not to handle fling gestures targeted at the root |
+ * scroll layer. |
+ */ |
+ public void onUnhandledFlingStartEvent() { |
+ final int scrollX = mDelegate.getContainerViewScrollX(); |
+ final int scrollY = mDelegate.getContainerViewScrollY(); |
+ final int rangeX = computeMaximumHorizontalScrollOffset(); |
+ final int rangeY = computeMaximumVerticalScrollOffset(); |
+ |
+ mScroller.fling(scrollX, scrollY, -mLastFlingVx, -mLastFlingVy, 0, rangeX, 0, rangeY); |
+ mDelegate.invalidate(); |
+ } |
+ |
+ /** |
+ * Called immediately before the draw to update the scroll offset. |
+ */ |
+ public void computeScrollAndAbsorbGlow(OverScrollGlow overScrollGlow) { |
+ if (!mScroller.computeScrollOffset()) { |
+ return; |
+ } |
+ |
+ final int oldX = mDelegate.getContainerViewScrollX(); |
+ final int oldY = mDelegate.getContainerViewScrollY(); |
+ int x = mScroller.getCurrX(); |
+ int y = mScroller.getCurrY(); |
+ |
+ int rangeX = computeMaximumHorizontalScrollOffset(); |
+ int rangeY = computeMaximumVerticalScrollOffset(); |
+ |
+ if (overScrollGlow != null) { |
+ overScrollGlow.absorbGlow(x, y, oldX, oldY, rangeX, rangeY, |
+ mScroller.getCurrVelocity()); |
+ } |
+ |
+ overScrollBy(x - oldX, y - oldY); |
+ |
+ mDelegate.invalidate(); |
+ } |
+ |
+ public void onTouchDown() { |
+ // TODO(mkosiba): Support speeding up a fling by flinging again. |
+ // http://crbug.com/265841 |
+ mScroller.forceFinished(true); |
+ } |
} |