Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(536)

Unified Diff: android_webview/java/src/org/chromium/android_webview/AwContents.java

Issue 1063853005: Unify Android Webview and Chrome's fling (Closed) Base URL: https://chromium.googlesource.com/a/chromium/src.git@master
Patch Set: add proguard Created 5 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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);

Powered by Google App Engine
This is Rietveld 408576698