| Index: content/public/android/java/org/chromium/content/browser/TouchPoint.java | 
| diff --git a/content/public/android/java/org/chromium/content/browser/TouchPoint.java b/content/public/android/java/org/chromium/content/browser/TouchPoint.java | 
| new file mode 100644 | 
| index 0000000000000000000000000000000000000000..66e35b1443000a0f241b4931fdd76061dd95f6a3 | 
| --- /dev/null | 
| +++ b/content/public/android/java/org/chromium/content/browser/TouchPoint.java | 
| @@ -0,0 +1,144 @@ | 
| +// Copyright (c) 2012 The Chromium Authors. All rights reserved. | 
| +// Use of this source code is governed by a BSD-style license that can be | 
| +// found in the LICENSE file. | 
| + | 
| +package org.chromium.content.browser; | 
| + | 
| +import android.util.Log; | 
| +import android.view.MotionEvent; | 
| + | 
| +import org.chromium.base.CalledByNative; | 
| + | 
| +// This class converts android MotionEvent into an array of touch points so | 
| +// that they can be forwarded to the renderer process. | 
| +class TouchPoint { | 
| + | 
| +    public static final int CONVERSION_ERROR = -1; | 
| + | 
| +    // Type of motion event to send to the native side. The values originate from their | 
| +    // webkit WebInputEvent counterparts, and are set via initializeConstants(). | 
| +    private static int TOUCH_EVENT_TYPE_START; | 
| +    private static int TOUCH_EVENT_TYPE_MOVE; | 
| +    private static int TOUCH_EVENT_TYPE_END; | 
| +    private static int TOUCH_EVENT_TYPE_CANCEL; | 
| + | 
| +    // Type of motion event to send to the native side. The values originate from their | 
| +    // webkit WebTouchPoint counterparts, and are set via initializeConstants(). | 
| +    private static int TOUCH_POINT_STATE_UNDEFINED; | 
| +    private static int TOUCH_POINT_STATE_RELEASED; | 
| +    private static int TOUCH_POINT_STATE_PRESSED; | 
| +    private static int TOUCH_POINT_STATE_MOVED; | 
| +    private static int TOUCH_POINT_STATE_STATIONARY; | 
| +    private static int TOUCH_POINT_STATE_CANCELLED; | 
| + | 
| +    private final int mState; | 
| +    private final int mId; | 
| +    private final float mX; | 
| +    private final float mY; | 
| +    private final float mSize; | 
| +    private final float mPressure; | 
| + | 
| +    TouchPoint(int state, int id, float x, float y, float size, float pressure) { | 
| +        mState = state; | 
| +        mId = id; | 
| +        mX = x; | 
| +        mY = y; | 
| +        mSize = size; | 
| +        mPressure = pressure; | 
| +    } | 
| + | 
| +    // The following methods are called by native to parse the java TouchPoint | 
| +    // object it has received. | 
| +    @SuppressWarnings("unused") | 
| +    @CalledByNative | 
| +    public int getState() { return mState; } | 
| + | 
| +    @SuppressWarnings("unused") | 
| +    @CalledByNative | 
| +    public int getId() { return mId; } | 
| + | 
| +    @SuppressWarnings("unused") | 
| +    @CalledByNative | 
| +    public int getX() { return (int) mX; } | 
| + | 
| +    @SuppressWarnings("unused") | 
| +    @CalledByNative | 
| +    public int getY() { return (int) mY; } | 
| + | 
| +    @SuppressWarnings("unused") | 
| +    @CalledByNative | 
| +    public double getSize() { return mSize; } | 
| + | 
| +    @SuppressWarnings("unused") | 
| +    @CalledByNative | 
| +    public double getPressure() { return mPressure; } | 
| + | 
| +    // Converts a MotionEvent into an array of touch points. | 
| +    // Returns the WebTouchEvent::Type for the MotionEvent and -1 for failure. | 
| +    public static int createTouchPoints(MotionEvent event, TouchPoint[] pts) { | 
| +        int type; | 
| +        int defaultState; | 
| + | 
| +        switch (event.getActionMasked()) { | 
| +            case MotionEvent.ACTION_DOWN: | 
| +                type = TOUCH_EVENT_TYPE_START; | 
| +                defaultState = TOUCH_POINT_STATE_PRESSED; | 
| +                break; | 
| +            case MotionEvent.ACTION_MOVE: | 
| +                type = TOUCH_EVENT_TYPE_MOVE; | 
| +                defaultState = TOUCH_POINT_STATE_MOVED; | 
| +                break; | 
| +            case MotionEvent.ACTION_UP: | 
| +                type = TOUCH_EVENT_TYPE_END; | 
| +                defaultState = TOUCH_POINT_STATE_RELEASED; | 
| +                break; | 
| +            case MotionEvent.ACTION_CANCEL: | 
| +                type = TOUCH_EVENT_TYPE_CANCEL; | 
| +                defaultState = TOUCH_POINT_STATE_CANCELLED; | 
| +                break; | 
| +            case MotionEvent.ACTION_POINTER_DOWN:  // fall through. | 
| +            case MotionEvent.ACTION_POINTER_UP: | 
| +                type = TOUCH_EVENT_TYPE_MOVE; | 
| +                defaultState = TOUCH_POINT_STATE_STATIONARY; | 
| +                break; | 
| +            default: | 
| +                Log.e("Chromium", "Unknown motion event action: " + event.getActionMasked()); | 
| +                return CONVERSION_ERROR; | 
| +        } | 
| + | 
| +        for (int i = 0; i < pts.length; ++i) { | 
| +            int state = defaultState; | 
| +            if (defaultState == TOUCH_POINT_STATE_STATIONARY && event.getActionIndex() == i) { | 
| +                // An additional pointer has started or ended. Map this pointer state as | 
| +                // required, and all other pointers as "stationary". | 
| +                state = event.getActionMasked() == MotionEvent.ACTION_POINTER_DOWN ? | 
| +                    TOUCH_POINT_STATE_PRESSED : TOUCH_POINT_STATE_RELEASED; | 
| +            } | 
| +            pts[i] = new TouchPoint(state, event.getPointerId(i), | 
| +                                    event.getX(i), event.getY(i), | 
| +                                    event.getSize(i), event.getPressure(i)); | 
| +        } | 
| + | 
| +        return type; | 
| +    } | 
| + | 
| +    // This method is called by native to initialize all the constants from | 
| +    // their counterparts in WebInputEvent and WebTouchPoint. | 
| +    @SuppressWarnings("unused") | 
| +    @CalledByNative | 
| +    private static void initializeConstants( | 
| +            int touchTypeStart, int touchTypeMove, int touchTypeEnd, int touchTypeCancel, | 
| +            int touchPointUndefined, int touchPointReleased, int touchPointPressed, | 
| +            int touchPointMoved, int touchPointStationary, int touchPointCancelled) { | 
| +        TOUCH_EVENT_TYPE_START = touchTypeStart; | 
| +        TOUCH_EVENT_TYPE_MOVE = touchTypeMove; | 
| +        TOUCH_EVENT_TYPE_END = touchTypeEnd; | 
| +        TOUCH_EVENT_TYPE_CANCEL = touchTypeCancel; | 
| +        TOUCH_POINT_STATE_UNDEFINED = touchPointUndefined; | 
| +        TOUCH_POINT_STATE_RELEASED = touchPointReleased; | 
| +        TOUCH_POINT_STATE_PRESSED = touchPointPressed; | 
| +        TOUCH_POINT_STATE_MOVED = touchPointMoved; | 
| +        TOUCH_POINT_STATE_STATIONARY = touchPointStationary; | 
| +        TOUCH_POINT_STATE_CANCELLED = touchPointCancelled; | 
| +    } | 
| +} | 
|  |