Index: android_webview/java/src/org/chromium/android_webview/AwContents.java |
diff --git a/android_webview/java/src/org/chromium/android_webview/AwContents.java b/android_webview/java/src/org/chromium/android_webview/AwContents.java |
index c95137c7ec63a5d061f50cf0c56f4f90399adf86..325e6803cae5ca57d6a1ebac87ec963f82e27607 100644 |
--- a/android_webview/java/src/org/chromium/android_webview/AwContents.java |
+++ b/android_webview/java/src/org/chromium/android_webview/AwContents.java |
@@ -22,6 +22,7 @@ import android.os.Bundle; |
import android.os.Handler; |
import android.os.Message; |
import android.text.TextUtils; |
+import android.util.FloatMath; |
import android.util.Log; |
import android.util.Pair; |
import android.view.KeyEvent; |
@@ -31,6 +32,7 @@ import android.view.ViewGroup; |
import android.view.accessibility.AccessibilityEvent; |
import android.view.accessibility.AccessibilityNodeInfo; |
import android.view.accessibility.AccessibilityNodeProvider; |
+import android.view.animation.AnimationUtils; |
import android.view.inputmethod.EditorInfo; |
import android.view.inputmethod.InputConnection; |
import android.webkit.GeolocationPermissions; |
@@ -2279,14 +2281,29 @@ public class AwContents implements SmartClipProvider, |
} |
@CalledByNative |
- private void didOverscroll(int deltaX, int deltaY) { |
+ private void didOverscroll(int deltaX, int deltaY, float velocityX, float velocityY, |
+ boolean firstOverscrollX, boolean firstOverscrollY) { |
if (mOverScrollGlow != null) { |
mOverScrollGlow.setOverScrollDeltas(deltaX, deltaY); |
} |
+ // TODO(jdduke): Skip this for components with non-zero velocity? |
mScrollOffsetManager.overScrollBy(deltaX, deltaY); |
- if (mOverScrollGlow != null && mOverScrollGlow.isAnimating()) { |
+ if (mOverScrollGlow == null) return; |
+ |
+ if ((velocityX != 0 && firstOverscrollX) || (velocityY != 0 && firstOverscrollY)) { |
+ final int oldX = mContainerView.getScrollX(); |
+ final int oldY = mContainerView.getScrollY(); |
+ final int x = oldX + deltaX; |
+ final int y = oldX + deltaY; |
+ final int scrollRangeX = mScrollOffsetManager.computeMaximumHorizontalScrollOffset(); |
+ final int scrollRangeY = mScrollOffsetManager.computeMaximumVerticalScrollOffset(); |
+ mOverScrollGlow.absorbGlow(x, y, oldX, oldY, scrollRangeX, scrollRangeY, |
+ FloatMath.hypot(velocityX, velocityY)); |
+ } |
+ |
+ if (mOverScrollGlow.isAnimating()) { |
postInvalidateOnAnimation(); |
} |
} |
@@ -2682,6 +2699,8 @@ public class AwContents implements SmartClipProvider, |
@Override |
public void computeScroll() { |
+ if (isDestroyed()) return; |
+ nativeOnComputeScroll(mNativeAwContents, AnimationUtils.currentAnimationTimeMillis()); |
mScrollOffsetManager.computeScrollAndAbsorbGlow(mOverScrollGlow); |
} |
} |
@@ -2719,6 +2738,8 @@ public class AwContents implements SmartClipProvider, |
long nativeAwContents, String path, ValueCallback<String> callback); |
private native void nativeAddVisitedLinks(long nativeAwContents, String[] visitedLinks); |
+ private native void nativeOnComputeScroll( |
+ long nativeAwContents, long currentAnimationTimeMillis); |
private native boolean nativeOnDraw(long nativeAwContents, Canvas canvas, |
boolean isHardwareAccelerated, int scrollX, int scrollY, |
int visibleLeft, int visibleTop, int visibleRight, int visibleBottom); |