Chromium Code Reviews| Index: remoting/android/java/src/org/chromium/chromoting/DesktopView.java |
| diff --git a/remoting/android/java/src/org/chromium/chromoting/DesktopView.java b/remoting/android/java/src/org/chromium/chromoting/DesktopView.java |
| index 3d571b9db8c8177667e245aa1846f959d841fc7b..e6f685cd6ace01d9ca1aadf71c8bf49e7cbe784e 100644 |
| --- a/remoting/android/java/src/org/chromium/chromoting/DesktopView.java |
| +++ b/remoting/android/java/src/org/chromium/chromoting/DesktopView.java |
| @@ -63,6 +63,8 @@ public class DesktopView extends SurfaceView implements Runnable, SurfaceHolder. |
| /** Whether the bottom edge of the image was visible on-screen during the last render. */ |
| private boolean mBottomUsedToBeOut; |
| + private int mMouseButton; |
| + |
| /** Whether the device has just been rotated, necessitating a canvas redraw. */ |
| private boolean mJustRotated; |
| @@ -81,6 +83,8 @@ public class DesktopView extends SurfaceView implements Runnable, SurfaceHolder. |
| mRightUsedToBeOut = false; |
| mBottomUsedToBeOut = false; |
| + mMouseButton = 0; |
| + |
| mJustRotated = false; |
| } |
| @@ -219,13 +223,66 @@ public class DesktopView extends SurfaceView implements Runnable, SurfaceHolder. |
| Log.i("deskview", "DesktopView.surfaceDestroyed(...)"); |
| } |
| + /** Called when a mouse action is made. */ |
| + private void handleMouseMovement(float[] coordinates, int button) { |
| + // Coordinates are relative to the canvas, but we need image coordinates. |
| + Matrix canvasToImage = new Matrix(); |
| + mTransform.invert(canvasToImage); |
| + canvasToImage.mapPoints(coordinates); |
| + |
| + // Coordinates are now relative to the image, so transmit them to the host. |
| + JniInterface.mouseAction((int)coordinates[0], (int)coordinates[1], button); |
| + } |
| + |
| /** |
| * Called whenever the user attempts to touch the canvas. Forwards such |
| * events to the appropriate gesture detector until one accepts them. |
| */ |
| @Override |
| public boolean onTouchEvent(MotionEvent event) { |
| - return mScroller.onTouchEvent(event) || mZoomer.onTouchEvent(event); |
| + boolean handled = mScroller.onTouchEvent(event) || mZoomer.onTouchEvent(event); |
| + |
| + if (event.getPointerCount()==1) { |
| + float[] coordinates = {event.getRawX(), event.getY()}; |
| + |
| + switch (event.getActionMasked()) { |
| + case MotionEvent.ACTION_DOWN: |
| + Log.i("gesture", "Down..."); |
| + mMouseButton = 0; |
| + break; |
| + |
| + case MotionEvent.ACTION_MOVE: |
| + if (mMouseButton==0) { |
| + Log.i("gesture", "Moving 1"); |
| + mMouseButton = 1; // TODO Name me! |
|
solb
2013/07/22 19:13:48
Sorry; I had forgotten how rough this revision was
|
| + } |
| + else Log.i("gesture", "Moving " + mMouseButton); |
| + break; |
| + |
| + case MotionEvent.ACTION_UP: |
| + if (mMouseButton==0) { |
| + Log.i("gesture", "Releasing 1 (after press)"); |
| + handleMouseMovement(coordinates, 1); // TODO Name me! |
| + mMouseButton = -1; // TODO Name me! |
| + } |
| + else if (mMouseButton > 0) { |
| + Log.i("gesture", "Releasing " + mMouseButton); |
| + mMouseButton *= -1; |
| + } |
| + else { |
| + Log.w("gesture", "Button already in released state before gesture ended"); |
| + } |
| + break; |
| + |
| + default: |
| + return handled; |
| + } |
| + handleMouseMovement(coordinates, mMouseButton); |
| + |
| + return true; |
| + } |
| + |
| + return handled; |
| } |
| /** Responds to touch events filtered by the gesture detectors. */ |
| @@ -267,6 +324,12 @@ public class DesktopView extends SurfaceView implements Runnable, SurfaceHolder. |
| return true; |
| } |
| + /** Called whenever a gesture starts. Always accepts the gesture so it isn't ignored. */ |
| + @Override |
| + public boolean onDown(MotionEvent e) { |
| + return true; |
| + } |
| + |
| /** |
| * Called when the user starts to zoom. Always accepts the zoom so that |
| * onScale() can decide whether to respond to it. |
| @@ -283,5 +346,19 @@ public class DesktopView extends SurfaceView implements Runnable, SurfaceHolder. |
| public void onScaleEnd(ScaleGestureDetector detector) { |
| onScale(detector); |
| } |
| + |
| + @Override |
| + public void onLongPress(MotionEvent e) { |
| + float[] coordinates = new float[] {e.getRawX(), e.getY()}; |
| + |
| + if (mMouseButton > 0) { |
| + Log.i("gesture", "Releasing " + mMouseButton); |
| + handleMouseMovement(coordinates, -mMouseButton); |
| + } |
| + |
| + Log.i("gesture", "Pressing 3"); |
| + mMouseButton = 3; // TODO Name me! |
| + handleMouseMovement(coordinates, mMouseButton); |
| + } |
| } |
| } |