summaryrefslogtreecommitdiffstats
path: root/core/java/android/webkit/WebView.java
diff options
context:
space:
mode:
Diffstat (limited to 'core/java/android/webkit/WebView.java')
-rw-r--r--core/java/android/webkit/WebView.java116
1 files changed, 92 insertions, 24 deletions
diff --git a/core/java/android/webkit/WebView.java b/core/java/android/webkit/WebView.java
index 4d9a8fb..c59a5fc 100644
--- a/core/java/android/webkit/WebView.java
+++ b/core/java/android/webkit/WebView.java
@@ -38,11 +38,13 @@ import android.os.Handler;
import android.os.Message;
import android.os.ServiceManager;
import android.os.SystemClock;
+import android.provider.Checkin;
import android.text.IClipboard;
import android.text.Selection;
import android.text.Spannable;
import android.util.AttributeSet;
import android.util.Config;
+import android.util.EventLog;
import android.util.Log;
import android.view.animation.AlphaAnimation;
import android.view.animation.Animation;
@@ -450,6 +452,13 @@ public class WebView extends AbsoluteLayout
// Used to match key downs and key ups
private boolean mGotKeyDown;
+ /* package */ static boolean mLogEvent = true;
+ private static final int EVENT_LOG_ZOOM_LEVEL_CHANGE = 70101;
+ private static final int EVENT_LOG_DOUBLE_TAP_DURATION = 70102;
+
+ // for event log
+ private long mLastTouchUpTime = 0;
+
/**
* URI scheme for telephone number
*/
@@ -556,7 +565,11 @@ public class WebView extends AbsoluteLayout
private ZoomRingController.OnZoomListener mZoomListener =
new ZoomRingController.OnZoomListener() {
-
+
+ private float mClockwiseBound;
+ private float mCounterClockwiseBound;
+ private float mStartScale;
+
public void onCenter(int x, int y) {
// Don't translate when the control is invoked, hence we do nothing
// in this callback
@@ -564,6 +577,10 @@ public class WebView extends AbsoluteLayout
public void onBeginPan() {
setZoomOverviewVisible(false);
+ if (mLogEvent) {
+ Checkin.updateStats(mContext.getContentResolver(),
+ Checkin.Stats.Tag.BROWSER_ZOOM_RING_DRAG, 1, 0.0);
+ }
}
public boolean onPan(int deltaX, int deltaY) {
@@ -576,12 +593,25 @@ public class WebView extends AbsoluteLayout
public void onVisibilityChanged(boolean visible) {
if (visible) {
switchOutDrawHistory();
+ if (mMaxZoomScale - 1 > ZOOM_RING_STEPS * 0.01f) {
+ mClockwiseBound = (float) (2 * Math.PI - MAX_ZOOM_RING_ANGLE);
+ } else {
+ mClockwiseBound = (float) (2 * Math.PI);
+ }
+ mZoomRingController.setThumbClockwiseBound(mClockwiseBound);
+ if (1 - mMinZoomScale > ZOOM_RING_STEPS * 0.01f) {
+ mCounterClockwiseBound = MAX_ZOOM_RING_ANGLE;
+ } else {
+ mCounterClockwiseBound = 0;
+ }
+ mZoomRingController
+ .setThumbCounterclockwiseBound(mCounterClockwiseBound);
float angle = 0f;
- if (mActualScale > 1) {
+ if (mActualScale > 1 && mClockwiseBound < (float) (2 * Math.PI)) {
angle = -(float) Math.round(ZOOM_RING_STEPS
* (mActualScale - 1) / (mMaxZoomScale - 1))
/ ZOOM_RING_STEPS;
- } else if (mActualScale < 1) {
+ } else if (mActualScale < 1 && mCounterClockwiseBound > 0) {
angle = (float) Math.round(ZOOM_RING_STEPS
* (1 - mActualScale) / (1 - mMinZoomScale))
/ ZOOM_RING_STEPS;
@@ -590,16 +620,26 @@ public class WebView extends AbsoluteLayout
// Show the zoom overview tab on the ring
setZoomOverviewVisible(true);
+ if (mLogEvent) {
+ Checkin.updateStats(mContext.getContentResolver(),
+ Checkin.Stats.Tag.BROWSER_ZOOM_RING, 1, 0.0);
+ }
}
}
public void onBeginDrag() {
mPreviewZoomOnly = true;
+ mStartScale = mActualScale;
setZoomOverviewVisible(false);
}
public void onEndDrag() {
mPreviewZoomOnly = false;
+ if (mLogEvent) {
+ EventLog.writeEvent(EVENT_LOG_ZOOM_LEVEL_CHANGE,
+ (int) mStartScale * 100, (int) mActualScale * 100,
+ System.currentTimeMillis());
+ }
setNewZoomScale(mActualScale, true);
}
@@ -616,21 +656,21 @@ public class WebView extends AbsoluteLayout
mZoomCenterY = (float) centerY;
float scale = 1.0f;
- if (curAngle > (float) Math.PI)
- curAngle -= (float) 2 * Math.PI;
- if (curAngle > 0) {
- if (curAngle >= MAX_ZOOM_RING_ANGLE) {
+ // curAngle is [0, 2 * Math.PI)
+ if (curAngle < (float) Math.PI) {
+ if (curAngle >= mCounterClockwiseBound) {
scale = mMinZoomScale;
} else {
scale = 1 - (float) Math.round(curAngle
/ ZOOM_RING_ANGLE_UNIT) / ZOOM_RING_STEPS
* (1 - mMinZoomScale);
}
- } else if (curAngle < 0) {
- if (curAngle <= -MAX_ZOOM_RING_ANGLE) {
+ } else {
+ if (curAngle <= mClockwiseBound) {
scale = mMaxZoomScale;
} else {
- scale = 1 + (float) Math.round(-curAngle
+ scale = 1 + (float) Math.round(
+ ((float) 2 * Math.PI - curAngle)
/ ZOOM_RING_ANGLE_UNIT) / ZOOM_RING_STEPS
* (mMaxZoomScale - 1);
}
@@ -687,12 +727,11 @@ public class WebView extends AbsoluteLayout
mScroller = new Scroller(context);
mZoomRingController = new ZoomRingController(context, this);
mZoomRingController.setResetThumbAutomatically(false);
- mZoomRingController.setThumbClockwiseBound(
- (float) (2 * Math.PI - MAX_ZOOM_RING_ANGLE));
- mZoomRingController.setThumbCounterclockwiseBound(MAX_ZOOM_RING_ANGLE);
mZoomRingController.setCallback(mZoomListener);
mZoomRingController.setZoomRingTrack(
com.android.internal.R.drawable.zoom_ring_track_absolute);
+ mZoomRingController.setPannerAcceleration(160);
+ mZoomRingController.setPannerStartAcceleratingDuration(700);
createZoomRingOverviewTab();
}
@@ -730,6 +769,10 @@ public class WebView extends AbsoluteLayout
public void onClick(View v) {
// Hide the zoom ring
mZoomRingController.setVisible(false);
+ if (mLogEvent) {
+ Checkin.updateStats(mContext.getContentResolver(),
+ Checkin.Stats.Tag.BROWSER_ZOOM_OVERVIEW, 1, 0.0);
+ }
zoomScrollOut();
}});
@@ -3468,7 +3511,7 @@ public class WebView extends AbsoluteLayout
// update mMinZoomScale
if (mMinContentWidth > MAX_FLOAT_CONTENT_WIDTH) {
boolean atMin = Math.abs(mActualScale - mMinZoomScale) < 0.01f;
- mMinZoomScale = (float) getViewWidth() / mMinContentWidth;
+ mMinZoomScale = (float) getViewWidth() / mContentWidth;
if (atMin) {
// if the WebView was at the minimum zoom scale, keep it. e,g.,
// the WebView was at the minimum zoom scale at the portrait
@@ -3535,7 +3578,8 @@ public class WebView extends AbsoluteLayout
return false;
}
- if (mShowZoomRingTutorial && mMinZoomScale < mMaxZoomScale) {
+ if (mShowZoomRingTutorial && getSettings().supportZoom()
+ && (mMaxZoomScale - mMinZoomScale) > ZOOM_RING_STEPS * 0.01f) {
ZoomRingController.showZoomTutorialOnce(mContext);
mShowZoomRingTutorial = false;
mPrivateHandler.sendMessageDelayed(mPrivateHandler
@@ -3616,10 +3660,18 @@ public class WebView extends AbsoluteLayout
mPrivateHandler.removeMessages(RELEASE_SINGLE_TAP);
mZoomRingController.setVisible(true);
mInZoomTapDragMode = true;
+ if (mLogEvent) {
+ EventLog.writeEvent(EVENT_LOG_DOUBLE_TAP_DURATION,
+ (eventTime - mLastTouchUpTime), eventTime);
+ }
return mZoomRingController.handleDoubleTapEvent(ev);
} else {
mTouchMode = TOUCH_INIT_MODE;
mPreventDrag = mForwardTouchEvents;
+ if (mLogEvent && eventTime - mLastTouchUpTime < 1000) {
+ EventLog.writeEvent(EVENT_LOG_DOUBLE_TAP_DURATION,
+ (eventTime - mLastTouchUpTime), eventTime);
+ }
}
// don't trigger the link if zoom ring is visible
if (mTouchMode == TOUCH_INIT_MODE
@@ -3783,17 +3835,23 @@ public class WebView extends AbsoluteLayout
break;
}
case MotionEvent.ACTION_UP: {
+ mLastTouchUpTime = eventTime;
switch (mTouchMode) {
case TOUCH_INIT_MODE: // tap
if (mZoomRingController.isVisible()) {
- // don't trigger the link if zoom ring is visible
+ // don't trigger the link if zoom ring is visible,
+ // but still allow the double tap
+ mPrivateHandler.sendMessageDelayed(mPrivateHandler
+ .obtainMessage(RELEASE_SINGLE_TAP,
+ new Boolean(false)),
+ DOUBLE_TAP_TIMEOUT);
break;
}
mPrivateHandler.removeMessages(SWITCH_TO_SHORTPRESS);
- if (getSettings().supportZoom()
- && (mMinZoomScale < mMaxZoomScale)) {
+ if (getSettings().supportZoom()) {
mPrivateHandler.sendMessageDelayed(mPrivateHandler
- .obtainMessage(RELEASE_SINGLE_TAP),
+ .obtainMessage(RELEASE_SINGLE_TAP,
+ new Boolean(true)),
DOUBLE_TAP_TIMEOUT);
} else {
// do short press now
@@ -3841,7 +3899,8 @@ public class WebView extends AbsoluteLayout
// as tap instead of short press.
mTouchMode = TOUCH_INIT_MODE;
mPrivateHandler.sendMessageDelayed(mPrivateHandler
- .obtainMessage(RELEASE_SINGLE_TAP),
+ .obtainMessage(RELEASE_SINGLE_TAP,
+ new Boolean(true)),
DOUBLE_TAP_TIMEOUT);
} else {
mTouchMode = TOUCH_DONE_MODE;
@@ -3963,6 +4022,7 @@ public class WebView extends AbsoluteLayout
+ " time=" + time
+ " mLastFocusTime=" + mLastFocusTime);
}
+ if (isInTouchMode()) requestFocusFromTouch();
return false; // let common code in onKeyDown at it
}
if (ev.getAction() == MotionEvent.ACTION_UP) {
@@ -4399,7 +4459,12 @@ public class WebView extends AbsoluteLayout
int contentX = viewToContent((int) mLastTouchX + mScrollX);
int contentY = viewToContent((int) mLastTouchY + mScrollY);
int contentSize = ViewConfiguration.get(getContext()).getScaledTouchSlop();
- nativeMotionUp(contentX, contentY, contentSize, true);
+ if (nativeMotionUp(contentX, contentY, contentSize, true)) {
+ if (mLogEvent) {
+ Checkin.updateStats(mContext.getContentResolver(),
+ Checkin.Stats.Tag.BROWSER_SNAP_CENTER, 1, 0.0);
+ }
+ }
if (nativeUpdateFocusNode() && !mFocusNode.mIsTextField
&& !mFocusNode.mIsTextArea) {
playSoundEffect(SoundEffectConstants.CLICK);
@@ -4619,7 +4684,9 @@ public class WebView extends AbsoluteLayout
}
case RELEASE_SINGLE_TAP: {
mTouchMode = TOUCH_DONE_MODE;
- doShortPress();
+ if ((Boolean)msg.obj) {
+ doShortPress();
+ }
break;
}
case SWITCH_TO_ENTER:
@@ -4671,7 +4738,7 @@ public class WebView extends AbsoluteLayout
mMinContentWidth = msg.arg1;
if (mMinContentWidth > MAX_FLOAT_CONTENT_WIDTH) {
mMinZoomScale = (float) getViewWidth()
- / mMinContentWidth;
+ / draw.mWidthHeight.x;
}
// We update the layout (i.e. request a layout from the
// view system) if the last view size that we sent to
@@ -5236,7 +5303,8 @@ public class WebView extends AbsoluteLayout
private native Rect nativeGetNavBounds();
private native void nativeInstrumentReport();
private native void nativeMarkNodeInvalid(int node);
- private native void nativeMotionUp(int x, int y, int slop, boolean isClick);
+ // return true if the page has been scrolled
+ private native boolean nativeMotionUp(int x, int y, int slop, boolean isClick);
// returns false if it handled the key
private native boolean nativeMoveFocus(int keyCode, int count,
boolean noScroll);