summaryrefslogtreecommitdiffstats
path: root/core/java/android
diff options
context:
space:
mode:
Diffstat (limited to 'core/java/android')
-rw-r--r--core/java/android/webkit/WebViewClassic.java189
1 files changed, 97 insertions, 92 deletions
diff --git a/core/java/android/webkit/WebViewClassic.java b/core/java/android/webkit/WebViewClassic.java
index 1c0aee8..5a0818b 100644
--- a/core/java/android/webkit/WebViewClassic.java
+++ b/core/java/android/webkit/WebViewClassic.java
@@ -70,8 +70,6 @@ import android.util.DisplayMetrics;
import android.util.EventLog;
import android.util.Log;
import android.view.Display;
-import android.view.GestureDetector;
-import android.view.GestureDetector.SimpleOnGestureListener;
import android.view.Gravity;
import android.view.HapticFeedbackConstants;
import android.view.HardwareCanvas;
@@ -820,51 +818,6 @@ public final class WebViewClassic implements WebViewProvider, WebViewProvider.Sc
}
}
- private class TextScrollListener extends SimpleOnGestureListener {
- @Override
- public boolean onFling(MotionEvent e1, MotionEvent e2,
- float velocityX, float velocityY) {
- int maxScrollX = mEditTextContent.width() -
- mEditTextBounds.width();
- int maxScrollY = mEditTextContent.height() -
- mEditTextBounds.height();
-
- int contentVelocityX = viewToContentDimension((int)-velocityX);
- int contentVelocityY = viewToContentDimension((int)-velocityY);
- mEditTextScroller.fling(-mEditTextContent.left,
- -mEditTextContent.top,
- contentVelocityX, contentVelocityY,
- 0, maxScrollX, 0, maxScrollY);
- return true;
- }
-
- @Override
- public boolean onScroll(MotionEvent e1, MotionEvent e2,
- float distanceX, float distanceY) {
- // Scrollable edit text. Scroll it.
- int newScrollX = deltaToTextScroll(
- -mEditTextContent.left, mEditTextContent.width(),
- mEditTextBounds.width(),
- (int) distanceX);
- int newScrollY = deltaToTextScroll(
- -mEditTextContent.top, mEditTextContent.height(),
- mEditTextBounds.height(),
- (int) distanceY);
- scrollEditText(newScrollX, newScrollY);
- return true;
- }
-
- private int deltaToTextScroll(int oldScroll, int contentSize,
- int boundsSize, int delta) {
- int newScroll = oldScroll +
- viewToContentDimension(delta);
- int maxScroll = contentSize - boundsSize;
- newScroll = Math.min(maxScroll, newScroll);
- newScroll = Math.max(0, newScroll);
- return newScroll;
- }
- }
-
// The listener to capture global layout change event.
private InnerGlobalLayoutListener mGlobalLayoutListener = null;
@@ -893,7 +846,6 @@ public final class WebViewClassic implements WebViewProvider, WebViewProvider.Sc
private int mFieldPointer;
private PastePopupWindow mPasteWindow;
private AutoCompletePopup mAutoCompletePopup;
- private GestureDetector mGestureDetector;
Rect mEditTextBounds = new Rect();
Rect mEditTextContent = new Rect();
int mEditTextLayerId;
@@ -1037,6 +989,7 @@ public final class WebViewClassic implements WebViewProvider, WebViewProvider.Sc
private static final int TOUCH_DONE_MODE = 7;
private static final int TOUCH_PINCH_DRAG = 8;
private static final int TOUCH_DRAG_LAYER_MODE = 9;
+ private static final int TOUCH_DRAG_TEXT_MODE = 10;
// Whether to forward the touch events to WebCore
// Can only be set by WebKit via JNI.
@@ -1514,7 +1467,6 @@ public final class WebViewClassic implements WebViewProvider, WebViewProvider.Sc
}
mAutoFillData = new WebViewCore.AutoFillData();
- mGestureDetector = new GestureDetector(mContext, new TextScrollListener());
mEditTextScroller = new Scroller(context);
}
@@ -3404,6 +3356,10 @@ public final class WebViewClassic implements WebViewProvider, WebViewProvider.Sc
boolean clampedY) {
// Special-case layer scrolling so that we do not trigger normal scroll
// updating.
+ if (mTouchMode == TOUCH_DRAG_TEXT_MODE) {
+ scrollEditText(scrollX, scrollY);
+ return;
+ }
if (mTouchMode == TOUCH_DRAG_LAYER_MODE) {
scrollLayerTo(scrollX, scrollY);
return;
@@ -3876,6 +3832,12 @@ public final class WebViewClassic implements WebViewProvider, WebViewProvider.Sc
rangeY = mScrollingLayerRect.bottom;
// No overscrolling for layers.
overflingDistance = 0;
+ } else if (mTouchMode == TOUCH_DRAG_TEXT_MODE) {
+ oldX = getTextScrollX();
+ oldY = getTextScrollY();
+ rangeX = getMaxTextScrollX();
+ rangeY = getMaxTextScrollY();
+ overflingDistance = 0;
}
mWebViewPrivate.overScrollBy(x - oldX, y - oldY, oldX, oldY,
@@ -3886,12 +3848,14 @@ public final class WebViewClassic implements WebViewProvider, WebViewProvider.Sc
mOverScrollGlow.absorbGlow(x, y, oldX, oldY, rangeX, rangeY);
}
} else {
- if (mTouchMode != TOUCH_DRAG_LAYER_MODE) {
- setScrollXRaw(x);
- setScrollYRaw(y);
- } else {
+ if (mTouchMode == TOUCH_DRAG_LAYER_MODE) {
// Update the layer position instead of WebView.
scrollLayerTo(x, y);
+ } else if (mTouchMode == TOUCH_DRAG_TEXT_MODE) {
+ scrollEditText(x, y);
+ } else {
+ setScrollXRaw(x);
+ setScrollYRaw(y);
}
abortAnimation();
nativeSetIsScrolling(false);
@@ -6177,7 +6141,6 @@ public final class WebViewClassic implements WebViewProvider, WebViewProvider.Sc
startTouch(x, y, eventTime);
if (mIsEditingText) {
mTouchInEditText = mEditTextBounds.contains(contentX, contentY);
- mGestureDetector.onTouchEvent(ev);
}
break;
}
@@ -6210,13 +6173,6 @@ public final class WebViewClassic implements WebViewProvider, WebViewProvider.Sc
invalidate();
}
break;
- } else if (mConfirmMove && mTouchInEditText) {
- ViewParent parent = mWebView.getParent();
- if (parent != null) {
- parent.requestDisallowInterceptTouchEvent(true);
- }
- mGestureDetector.onTouchEvent(ev);
- break;
}
// pass the touch events from UI thread to WebCore thread
@@ -6264,7 +6220,8 @@ public final class WebViewClassic implements WebViewProvider, WebViewProvider.Sc
}
if (mTouchMode != TOUCH_DRAG_MODE &&
- mTouchMode != TOUCH_DRAG_LAYER_MODE) {
+ mTouchMode != TOUCH_DRAG_LAYER_MODE &&
+ mTouchMode != TOUCH_DRAG_TEXT_MODE) {
if (!mConfirmMove) {
break;
@@ -6347,9 +6304,6 @@ public final class WebViewClassic implements WebViewProvider, WebViewProvider.Sc
deltaX = 0;
}
}
- mLastTouchX = x;
- mLastTouchY = y;
-
if (deltaX * deltaX + deltaY * deltaY > mTouchSlopSquare) {
mHeldMotionless = MOTIONLESS_FALSE;
nativeSetIsScrolling(true);
@@ -6360,13 +6314,24 @@ public final class WebViewClassic implements WebViewProvider, WebViewProvider.Sc
}
mLastTouchTime = eventTime;
+ boolean allDrag = doDrag(deltaX, deltaY);
+ if (allDrag) {
+ mLastTouchX = x;
+ mLastTouchY = y;
+ } else {
+ int contentDeltaX = (int)Math.floor(deltaX * mZoomManager.getInvScale());
+ int roundedDeltaX = contentToViewDimension(contentDeltaX);
+ int contentDeltaY = (int)Math.floor(deltaY * mZoomManager.getInvScale());
+ int roundedDeltaY = contentToViewDimension(contentDeltaY);
+ mLastTouchX -= roundedDeltaX;
+ mLastTouchY -= roundedDeltaY;
+ }
}
- doDrag(deltaX, deltaY);
-
// Turn off scrollbars when dragging a layer.
if (keepScrollBarsVisible &&
- mTouchMode != TOUCH_DRAG_LAYER_MODE) {
+ mTouchMode != TOUCH_DRAG_LAYER_MODE &&
+ mTouchMode != TOUCH_DRAG_TEXT_MODE) {
if (mHeldMotionless != MOTIONLESS_TRUE) {
mHeldMotionless = MOTIONLESS_TRUE;
invalidate();
@@ -6387,11 +6352,6 @@ public final class WebViewClassic implements WebViewProvider, WebViewProvider.Sc
break;
}
case MotionEvent.ACTION_UP: {
- mGestureDetector.onTouchEvent(ev);
- if (mTouchInEditText && mConfirmMove) {
- stopTouch();
- break; // We've been scrolling the edit text.
- }
if (!mConfirmMove && mIsEditingText && mSelectionStarted &&
mIsCaretSelection) {
showPasteWindow();
@@ -6505,6 +6465,7 @@ public final class WebViewClassic implements WebViewProvider, WebViewProvider.Sc
}
case TOUCH_DRAG_MODE:
case TOUCH_DRAG_LAYER_MODE:
+ case TOUCH_DRAG_TEXT_MODE:
mPrivateHandler.removeMessages(DRAG_HELD_MOTIONLESS);
mPrivateHandler.removeMessages(AWAKEN_SCROLL_BARS);
// if the user waits a while w/o moving before the
@@ -6701,20 +6662,31 @@ public final class WebViewClassic implements WebViewProvider, WebViewProvider.Sc
}
}
- private void doDrag(int deltaX, int deltaY) {
+ private boolean doDrag(int deltaX, int deltaY) {
+ boolean allDrag = true;
if ((deltaX | deltaY) != 0) {
int oldX = getScrollX();
int oldY = getScrollY();
int rangeX = computeMaxScrollX();
int rangeY = computeMaxScrollY();
- // Check for the original scrolling layer in case we change
- // directions. mTouchMode might be TOUCH_DRAG_MODE if we have
- // reached the edge of a layer but mScrollingLayer will be non-zero
- // if we initiated the drag on a layer.
- if (mCurrentScrollingLayerId != 0) {
- final int contentX = viewToContentDimension(deltaX);
- final int contentY = viewToContentDimension(deltaY);
-
+ final int contentX = (int)Math.floor(deltaX * mZoomManager.getInvScale());
+ final int contentY = (int)Math.floor(deltaY * mZoomManager.getInvScale());
+
+ // Assume page scrolling and change below if we're wrong
+ mTouchMode = TOUCH_DRAG_MODE;
+
+ // Check special scrolling before going to main page scrolling.
+ if (mIsEditingText && mTouchInEditText && canTextScroll(deltaX, deltaY)) {
+ // Edit text scrolling
+ oldX = getTextScrollX();
+ rangeX = getMaxTextScrollX();
+ deltaX = contentX;
+ oldY = getTextScrollY();
+ rangeY = getMaxTextScrollY();
+ deltaY = contentY;
+ mTouchMode = TOUCH_DRAG_TEXT_MODE;
+ allDrag = false;
+ } else if (mCurrentScrollingLayerId != 0) {
// Check the scrolling bounds to see if we will actually do any
// scrolling. The rectangle is in document coordinates.
final int maxX = mScrollingLayerRect.right;
@@ -6734,12 +6706,7 @@ public final class WebViewClassic implements WebViewProvider, WebViewProvider.Sc
oldY = mScrollingLayerRect.top;
rangeX = maxX;
rangeY = maxY;
- } else {
- // Scroll the main page if we are not going to scroll the
- // layer. This does not reset mScrollingLayer in case the
- // user changes directions and the layer can scroll the
- // other way.
- mTouchMode = TOUCH_DRAG_MODE;
+ allDrag = false;
}
}
@@ -6755,11 +6722,13 @@ public final class WebViewClassic implements WebViewProvider, WebViewProvider.Sc
}
}
mZoomManager.keepZoomPickerVisible();
+ return allDrag;
}
private void stopTouch() {
if (mScroller.isFinished() && !mSelectingText
- && (mTouchMode == TOUCH_DRAG_MODE || mTouchMode == TOUCH_DRAG_LAYER_MODE)) {
+ && (mTouchMode == TOUCH_DRAG_MODE
+ || mTouchMode == TOUCH_DRAG_LAYER_MODE)) {
WebViewCore.resumePriority();
WebViewCore.resumeUpdatePicture(mWebViewCore);
nativeSetIsScrolling(false);
@@ -7153,6 +7122,13 @@ public final class WebViewClassic implements WebViewProvider, WebViewProvider.Sc
maxY = mScrollingLayerRect.bottom;
// No overscrolling for layers.
overscrollDistance = overflingDistance = 0;
+ } else if (mTouchMode == TOUCH_DRAG_TEXT_MODE) {
+ scrollX = getTextScrollX();
+ scrollY = getTextScrollY();
+ maxX = getMaxTextScrollX();
+ maxY = getMaxTextScrollY();
+ // No overscrolling for edit text.
+ overscrollDistance = overflingDistance = 0;
}
if (mSnapScrollMode != SNAP_NONE) {
@@ -7232,7 +7208,7 @@ public final class WebViewClassic implements WebViewProvider, WebViewProvider.Sc
final int time = mScroller.getDuration();
// Suppress scrollbars for layer scrolling.
- if (mTouchMode != TOUCH_DRAG_LAYER_MODE) {
+ if (mTouchMode != TOUCH_DRAG_LAYER_MODE && mTouchMode != TOUCH_DRAG_TEXT_MODE) {
mWebViewPrivate.awakenScrollBars(time);
}
@@ -7590,6 +7566,36 @@ public final class WebViewClassic implements WebViewProvider, WebViewProvider.Sc
return mWebViewCore;
}
+ private boolean canTextScroll(int directionX, int directionY) {
+ int scrollX = getTextScrollX();
+ int scrollY = getTextScrollY();
+ int maxScrollX = getMaxTextScrollX();
+ int maxScrollY = getMaxTextScrollY();
+ boolean canScrollX = (directionX > 0)
+ ? (scrollX < maxScrollX)
+ : (scrollX > 0);
+ boolean canScrollY = (directionY > 0)
+ ? (scrollY < maxScrollY)
+ : (scrollY > 0);
+ return canScrollX || canScrollY;
+ }
+
+ private int getTextScrollX() {
+ return -mEditTextContent.left;
+ }
+
+ private int getTextScrollY() {
+ return -mEditTextContent.top;
+ }
+
+ private int getMaxTextScrollX() {
+ return Math.max(0, mEditTextContent.width() - mEditTextBounds.width());
+ }
+
+ private int getMaxTextScrollY() {
+ return Math.max(0, mEditTextContent.height() - mEditTextBounds.height());
+ }
+
/**
* Used only by TouchEventQueue to store pending touch events.
*/
@@ -8909,8 +8915,7 @@ public final class WebViewClassic implements WebViewProvider, WebViewProvider.Sc
private void scrollEditText(int scrollX, int scrollY) {
// Scrollable edit text. Scroll it.
- float maxScrollX = (float)(mEditTextContent.width() -
- mEditTextBounds.width());
+ float maxScrollX = getMaxTextScrollX();
float scrollPercentX = ((float)scrollX)/maxScrollX;
mEditTextContent.offsetTo(-scrollX, -scrollY);
mWebViewCore.sendMessageAtFrontOfQueue(EventHub.SCROLL_TEXT_INPUT, 0,