Merge "update sidenav, fix typos" into honeycomb
diff --git a/core/java/android/webkit/WebView.java b/core/java/android/webkit/WebView.java
index c1fafa2..3102ee9 100644
--- a/core/java/android/webkit/WebView.java
+++ b/core/java/android/webkit/WebView.java
@@ -476,6 +476,7 @@
     private static final int TOUCH_DRAG_LAYER_MODE = 9;
 
     // Whether to forward the touch events to WebCore
+    // Can only be set by WebKit via JNI.
     private boolean mForwardTouchEvents = false;
 
     // Whether to prevent default during touch. The initial value depends on
@@ -5358,26 +5359,26 @@
                 + " numPointers=" + ev.getPointerCount());
         }
 
-        // Always pass multi-touch event to WebKit first.
-        // If WebKit doesn't consume it and set preventDefault to true,
-        // WebView's private handler will handle it.
-        if (ev.getPointerCount() > 1) {
-            if (DebugFlags.WEB_VIEW) {
-                Log.v(LOGTAG, "passing " + ev.getPointerCount() + " points to webkit");
+        int action = ev.getActionMasked();
+        if (ev.getPointerCount() > 1) {  // Multi-touch
+            mIsHandlingMultiTouch = true;
+
+            // If WebKit already showed no interests in this sequence of events,
+            // WebView handles them directly.
+            if (mPreventDefault == PREVENT_DEFAULT_NO && action == MotionEvent.ACTION_MOVE) {
+                handleMultiTouchInWebView(ev);
+            } else {
+                passMultiTouchToWebKit(ev);
             }
-            if (!mIsHandlingMultiTouch) {
-                mIsHandlingMultiTouch = true;
-            }
-            passMultiTouchToWebKit(ev);
             return true;
-        } else {
-            // Skip ACTION_MOVE for single touch if it's still handling multi-touch.
-            if (mIsHandlingMultiTouch && ev.getActionMasked() == MotionEvent.ACTION_MOVE) {
-                return false;
-            }
         }
 
-        return handleTouchEventCommon(ev, ev.getActionMasked(), Math.round(ev.getX()), Math.round(ev.getY()));
+        // Skip ACTION_MOVE for single touch if it's still handling multi-touch.
+        if (mIsHandlingMultiTouch && action == MotionEvent.ACTION_MOVE) {
+            return false;
+        }
+
+        return handleTouchEventCommon(ev, action, Math.round(ev.getX()), Math.round(ev.getY()));
     }
 
     /*
@@ -7357,75 +7358,85 @@
                         if (mPreventDefault == PREVENT_DEFAULT_YES) {
                             mTouchHighlightRegion.setEmpty();
                         }
-                    } else if (msg.arg2 == 0) {
-                        // prevent default is not called in WebCore, so the
-                        // message needs to be reprocessed in UI
+                    } else {
                         TouchEventData ted = (TouchEventData) msg.obj;
 
-                        if (ted.mPoints.length > 1) {  // for multi-touch.
-                            handleMultiTouchInWebView(ted.mMotionEvent);
+                        if (ted.mPoints.length > 1) {  // multi-touch
+                            if (ted.mAction == MotionEvent.ACTION_POINTER_UP) {
+                                mIsHandlingMultiTouch = false;
+                            }
+                            if (msg.arg2 == 0) {
+                                mPreventDefault = PREVENT_DEFAULT_NO;
+                                handleMultiTouchInWebView(ted.mMotionEvent);
+                            } else {
+                                mPreventDefault = PREVENT_DEFAULT_YES;
+                            }
                             break;
                         }
 
-                        // Following is for single touch.
-                        switch (ted.mAction) {
-                            case MotionEvent.ACTION_DOWN:
-                                mLastDeferTouchX = contentToViewX(ted.mPoints[0].x)
-                                        - mScrollX;
-                                mLastDeferTouchY = contentToViewY(ted.mPoints[0].y)
-                                        - mScrollY;
-                                mDeferTouchMode = TOUCH_INIT_MODE;
-                                break;
-                            case MotionEvent.ACTION_MOVE: {
-                                // no snapping in defer process
-                                int x = contentToViewX(ted.mPoints[0].x) - mScrollX;
-                                int y = contentToViewY(ted.mPoints[0].y) - mScrollY;
-                                if (mDeferTouchMode != TOUCH_DRAG_MODE) {
-                                    mDeferTouchMode = TOUCH_DRAG_MODE;
-                                    mLastDeferTouchX = x;
-                                    mLastDeferTouchY = y;
-                                    startScrollingLayer(x, y);
-                                    startDrag();
+                        // prevent default is not called in WebCore, so the
+                        // message needs to be reprocessed in UI
+                        if (msg.arg2 == 0) {
+                            // Following is for single touch.
+                            switch (ted.mAction) {
+                                case MotionEvent.ACTION_DOWN:
+                                    mLastDeferTouchX = contentToViewX(ted.mPoints[0].x)
+                                            - mScrollX;
+                                    mLastDeferTouchY = contentToViewY(ted.mPoints[0].y)
+                                            - mScrollY;
+                                    mDeferTouchMode = TOUCH_INIT_MODE;
+                                    break;
+                                case MotionEvent.ACTION_MOVE: {
+                                    // no snapping in defer process
+                                    int x = contentToViewX(ted.mPoints[0].x) - mScrollX;
+                                    int y = contentToViewY(ted.mPoints[0].y) - mScrollY;
+                                    if (mDeferTouchMode != TOUCH_DRAG_MODE) {
+                                        mDeferTouchMode = TOUCH_DRAG_MODE;
+                                        mLastDeferTouchX = x;
+                                        mLastDeferTouchY = y;
+                                        startScrollingLayer(x, y);
+                                        startDrag();
+                                    }
+                                    int deltaX = pinLocX((int) (mScrollX
+                                            + mLastDeferTouchX - x))
+                                            - mScrollX;
+                                    int deltaY = pinLocY((int) (mScrollY
+                                            + mLastDeferTouchY - y))
+                                            - mScrollY;
+                                    doDrag(deltaX, deltaY);
+                                    if (deltaX != 0) mLastDeferTouchX = x;
+                                    if (deltaY != 0) mLastDeferTouchY = y;
+                                    break;
                                 }
-                                int deltaX = pinLocX((int) (mScrollX
-                                        + mLastDeferTouchX - x))
-                                        - mScrollX;
-                                int deltaY = pinLocY((int) (mScrollY
-                                        + mLastDeferTouchY - y))
-                                        - mScrollY;
-                                doDrag(deltaX, deltaY);
-                                if (deltaX != 0) mLastDeferTouchX = x;
-                                if (deltaY != 0) mLastDeferTouchY = y;
-                                break;
+                                case MotionEvent.ACTION_UP:
+                                case MotionEvent.ACTION_CANCEL:
+                                    if (mDeferTouchMode == TOUCH_DRAG_MODE) {
+                                        // no fling in defer process
+                                        mScroller.springBack(mScrollX, mScrollY, 0,
+                                                computeMaxScrollX(), 0,
+                                                computeMaxScrollY());
+                                        invalidate();
+                                        WebViewCore.resumePriority();
+                                        WebViewCore.resumeUpdatePicture(mWebViewCore);
+                                    }
+                                    mDeferTouchMode = TOUCH_DONE_MODE;
+                                    break;
+                                case WebViewCore.ACTION_DOUBLETAP:
+                                    // doDoubleTap() needs mLastTouchX/Y as anchor
+                                    mLastTouchX = contentToViewX(ted.mPoints[0].x) - mScrollX;
+                                    mLastTouchY = contentToViewY(ted.mPoints[0].y) - mScrollY;
+                                    mZoomManager.handleDoubleTap(mLastTouchX, mLastTouchY);
+                                    mDeferTouchMode = TOUCH_DONE_MODE;
+                                    break;
+                                case WebViewCore.ACTION_LONGPRESS:
+                                    HitTestResult hitTest = getHitTestResult();
+                                    if (hitTest != null && hitTest.mType
+                                            != HitTestResult.UNKNOWN_TYPE) {
+                                        performLongClick();
+                                    }
+                                    mDeferTouchMode = TOUCH_DONE_MODE;
+                                    break;
                             }
-                            case MotionEvent.ACTION_UP:
-                            case MotionEvent.ACTION_CANCEL:
-                                if (mDeferTouchMode == TOUCH_DRAG_MODE) {
-                                    // no fling in defer process
-                                    mScroller.springBack(mScrollX, mScrollY, 0,
-                                            computeMaxScrollX(), 0,
-                                            computeMaxScrollY());
-                                    invalidate();
-                                    WebViewCore.resumePriority();
-                                    WebViewCore.resumeUpdatePicture(mWebViewCore);
-                                }
-                                mDeferTouchMode = TOUCH_DONE_MODE;
-                                break;
-                            case WebViewCore.ACTION_DOUBLETAP:
-                                // doDoubleTap() needs mLastTouchX/Y as anchor
-                                mLastTouchX = contentToViewX(ted.mPoints[0].x) - mScrollX;
-                                mLastTouchY = contentToViewY(ted.mPoints[0].y) - mScrollY;
-                                mZoomManager.handleDoubleTap(mLastTouchX, mLastTouchY);
-                                mDeferTouchMode = TOUCH_DONE_MODE;
-                                break;
-                            case WebViewCore.ACTION_LONGPRESS:
-                                HitTestResult hitTest = getHitTestResult();
-                                if (hitTest != null && hitTest.mType
-                                        != HitTestResult.UNKNOWN_TYPE) {
-                                    performLongClick();
-                                }
-                                mDeferTouchMode = TOUCH_DONE_MODE;
-                                break;
                         }
                     }
                     break;
@@ -8174,8 +8185,8 @@
      * @hide This is only used by the webkit layout test.
      */
     public void setDeferMultiTouch(boolean value) {
-        mDeferMultitouch = value;
-        Log.v(LOGTAG, "set mDeferMultitouch to " + value);
+      mDeferMultitouch = value;
+      Log.v(LOGTAG, "set mDeferMultitouch to " + value);
     }
 
     /**
diff --git a/core/java/com/android/internal/view/menu/ActionMenuView.java b/core/java/com/android/internal/view/menu/ActionMenuView.java
index 8825c02..30d6878 100644
--- a/core/java/com/android/internal/view/menu/ActionMenuView.java
+++ b/core/java/com/android/internal/view/menu/ActionMenuView.java
@@ -22,6 +22,7 @@
 import android.graphics.drawable.Drawable;
 import android.util.AttributeSet;
 import android.view.Gravity;
+import android.view.SoundEffectConstants;
 import android.view.View;
 import android.view.ViewGroup;
 import android.view.ViewParent;
@@ -328,6 +329,7 @@
                 return true;
             }
 
+            playSoundEffect(SoundEffectConstants.CLICK);
             showOverflowMenu();
             return true;
         }