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 9060c091319daeb93e497aee886b4e3450569c6e..1feb738ef079176517a2a20a51ef4b7be34de6b1 100644 |
--- a/android_webview/java/src/org/chromium/android_webview/AwContents.java |
+++ b/android_webview/java/src/org/chromium/android_webview/AwContents.java |
@@ -22,8 +22,10 @@ import android.os.Build; |
import android.os.Bundle; |
import android.os.Handler; |
import android.os.Message; |
+import android.os.SystemClock; |
import android.text.TextUtils; |
import android.util.Base64; |
+import android.util.FloatMath; |
import android.util.Log; |
import android.util.Pair; |
import android.view.KeyEvent; |
@@ -33,6 +35,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; |
@@ -553,6 +556,11 @@ public class AwContents implements SmartClipProvider, |
public void invalidate() { |
postInvalidateOnAnimation(); |
} |
+ |
+ @Override |
+ public void cancelFling() { |
+ mContentViewCore.cancelFling(SystemClock.uptimeMillis()); |
+ } |
} |
//-------------------------------------------------------------------------------------------- |
@@ -575,12 +583,7 @@ public class AwContents implements SmartClipProvider, |
@Override |
public void onFlingCancelGesture() { |
- mScrollOffsetManager.onFlingCancelGesture(); |
- } |
- |
- @Override |
- public void onUnhandledFlingStartEvent(int velocityX, int velocityY) { |
- mScrollOffsetManager.onUnhandledFlingStartEvent(velocityX, velocityY); |
+ mScrollOffsetManager.finishScroll(); |
} |
@Override |
@@ -1936,7 +1939,14 @@ public class AwContents implements SmartClipProvider, |
*/ |
public void flingScroll(int velocityX, int velocityY) { |
if (TRACE) Log.d(TAG, "flingScroll"); |
- mScrollOffsetManager.flingScroll(velocityX, velocityY); |
+ // Cancel the current smooth scroll, if there is one. |
+ mScrollOffsetManager.finishScroll(); |
+ // TODO(hush): crbug.com/493765. A hit test at 0, 0 may not |
+ // target the scroll at root scrolling layer. Instead, we |
+ // should add a method flingRootLayer to ContentViewCore |
+ // and call it here to specifically target the scroll at |
+ // the root layer. |
+ mContentViewCore.fling(SystemClock.uptimeMillis(), 0, 0, -velocityX, -velocityY); |
} |
/** |
@@ -2549,8 +2559,8 @@ public class AwContents implements SmartClipProvider, |
} |
@CalledByNative |
- public boolean isFlingActive() { |
- return mScrollOffsetManager.isFlingActive(); |
+ public boolean isSmoothScrollingActive() { |
+ return mScrollOffsetManager.isSmoothScrollingActive(); |
} |
@CalledByNative |
@@ -2570,15 +2580,24 @@ public class AwContents implements SmartClipProvider, |
client.init(mContentViewCore); |
} |
+ @SuppressLint("NewApi") // FloatMath#hypot requires API level 17. |
@CalledByNative |
- private void didOverscroll(int deltaX, int deltaY) { |
- if (mOverScrollGlow != null) { |
- mOverScrollGlow.setOverScrollDeltas(deltaX, deltaY); |
- } |
- |
+ private void didOverscroll(int deltaX, int deltaY, float velocityX, float velocityY) { |
mScrollOffsetManager.overScrollBy(deltaX, deltaY); |
- if (mOverScrollGlow != null && mOverScrollGlow.isAnimating()) { |
+ if (mOverScrollGlow == null) return; |
+ |
+ mOverScrollGlow.setOverScrollDeltas(deltaX, deltaY); |
+ final int oldX = mContainerView.getScrollX(); |
+ final int oldY = mContainerView.getScrollY(); |
+ final int x = oldX + deltaX; |
+ final int y = oldY + 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(); |
} |
} |
@@ -2987,7 +3006,13 @@ public class AwContents implements SmartClipProvider, |
@Override |
public void computeScroll() { |
- mScrollOffsetManager.computeScrollAndAbsorbGlow(mOverScrollGlow); |
+ if (mScrollOffsetManager.isSmoothScrollingActive()) { |
+ mScrollOffsetManager.computeScrollAndAbsorbGlow(mOverScrollGlow); |
+ } else { |
+ if (isDestroyed()) return; |
+ nativeOnComputeScroll( |
+ mNativeAwContents, AnimationUtils.currentAnimationTimeMillis()); |
+ } |
} |
} |
@@ -3026,6 +3051,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); |