Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(638)

Side by Side Diff: remoting/android/java/src/org/chromium/chromoting/DesktopView.java

Issue 19500017: Implement basic point-and-touch mouse input for Android client (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 package org.chromium.chromoting; 5 package org.chromium.chromoting;
6 6
7 import android.content.Context; 7 import android.content.Context;
8 import android.graphics.Bitmap; 8 import android.graphics.Bitmap;
9 import android.graphics.Canvas; 9 import android.graphics.Canvas;
10 import android.graphics.Color; 10 import android.graphics.Color;
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
56 56
57 /** Specifies the dimension by which the zoom level is being lower-bounded. */ 57 /** Specifies the dimension by which the zoom level is being lower-bounded. */
58 private Constraint mConstraint; 58 private Constraint mConstraint;
59 59
60 /** Whether the right edge of the image was visible on-screen during the las t render. */ 60 /** Whether the right edge of the image was visible on-screen during the las t render. */
61 private boolean mRightUsedToBeOut; 61 private boolean mRightUsedToBeOut;
62 62
63 /** Whether the bottom edge of the image was visible on-screen during the la st render. */ 63 /** Whether the bottom edge of the image was visible on-screen during the la st render. */
64 private boolean mBottomUsedToBeOut; 64 private boolean mBottomUsedToBeOut;
65 65
66 private int mMouseButton;
67
66 /** Whether the device has just been rotated, necessitating a canvas redraw. */ 68 /** Whether the device has just been rotated, necessitating a canvas redraw. */
67 private boolean mJustRotated; 69 private boolean mJustRotated;
68 70
69 public DesktopView(Context context) { 71 public DesktopView(Context context) {
70 super(context); 72 super(context);
71 getHolder().addCallback(this); 73 getHolder().addCallback(this);
72 DesktopListener listener = new DesktopListener(); 74 DesktopListener listener = new DesktopListener();
73 mScroller = new GestureDetector(context, listener); 75 mScroller = new GestureDetector(context, listener);
74 mZoomer = new ScaleGestureDetector(context, listener); 76 mZoomer = new ScaleGestureDetector(context, listener);
75 77
76 mTransform = new Matrix(); 78 mTransform = new Matrix();
77 mScreenWidth = 0; 79 mScreenWidth = 0;
78 mScreenHeight = 0; 80 mScreenHeight = 0;
79 mConstraint = Constraint.UNDEFINED; 81 mConstraint = Constraint.UNDEFINED;
80 82
81 mRightUsedToBeOut = false; 83 mRightUsedToBeOut = false;
82 mBottomUsedToBeOut = false; 84 mBottomUsedToBeOut = false;
83 85
86 mMouseButton = 0;
87
84 mJustRotated = false; 88 mJustRotated = false;
85 } 89 }
86 90
87 /** 91 /**
88 * Redraws the canvas. This should be done on a non-UI thread or it could 92 * Redraws the canvas. This should be done on a non-UI thread or it could
89 * cause the UI to lag. Specifically, it is currently invoked on the native 93 * cause the UI to lag. Specifically, it is currently invoked on the native
90 * graphics thread using a JNI. 94 * graphics thread using a JNI.
91 */ 95 */
92 @Override 96 @Override
93 public void run() { 97 public void run() {
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after
212 Log.i("deskview", "DesktopView.surfaceCreated(...)"); 216 Log.i("deskview", "DesktopView.surfaceCreated(...)");
213 JniInterface.provideRedrawCallback(this); 217 JniInterface.provideRedrawCallback(this);
214 } 218 }
215 219
216 /** Called when the canvas is finally destroyed. */ 220 /** Called when the canvas is finally destroyed. */
217 @Override 221 @Override
218 public void surfaceDestroyed(SurfaceHolder holder) { 222 public void surfaceDestroyed(SurfaceHolder holder) {
219 Log.i("deskview", "DesktopView.surfaceDestroyed(...)"); 223 Log.i("deskview", "DesktopView.surfaceDestroyed(...)");
220 } 224 }
221 225
226 /** Called when a mouse action is made. */
227 private void handleMouseMovement(float[] coordinates, int button) {
228 // Coordinates are relative to the canvas, but we need image coordinates .
229 Matrix canvasToImage = new Matrix();
230 mTransform.invert(canvasToImage);
231 canvasToImage.mapPoints(coordinates);
232
233 // Coordinates are now relative to the image, so transmit them to the ho st.
234 JniInterface.mouseAction((int)coordinates[0], (int)coordinates[1], butto n);
235 }
236
222 /** 237 /**
223 * Called whenever the user attempts to touch the canvas. Forwards such 238 * Called whenever the user attempts to touch the canvas. Forwards such
224 * events to the appropriate gesture detector until one accepts them. 239 * events to the appropriate gesture detector until one accepts them.
225 */ 240 */
226 @Override 241 @Override
227 public boolean onTouchEvent(MotionEvent event) { 242 public boolean onTouchEvent(MotionEvent event) {
228 return mScroller.onTouchEvent(event) || mZoomer.onTouchEvent(event); 243 boolean handled = mScroller.onTouchEvent(event) || mZoomer.onTouchEvent( event);
244
245 if (event.getPointerCount()==1) {
246 float[] coordinates = {event.getRawX(), event.getY()};
247
248 switch (event.getActionMasked()) {
249 case MotionEvent.ACTION_DOWN:
250 Log.i("gesture", "Down...");
251 mMouseButton = 0;
252 break;
253
254 case MotionEvent.ACTION_MOVE:
255 if (mMouseButton==0) {
256 Log.i("gesture", "Moving 1");
257 mMouseButton = 1; // TODO Name me!
solb 2013/07/22 19:13:48 Sorry; I had forgotten how rough this revision was
258 }
259 else Log.i("gesture", "Moving " + mMouseButton);
260 break;
261
262 case MotionEvent.ACTION_UP:
263 if (mMouseButton==0) {
264 Log.i("gesture", "Releasing 1 (after press)");
265 handleMouseMovement(coordinates, 1); // TODO Name me!
266 mMouseButton = -1; // TODO Name me!
267 }
268 else if (mMouseButton > 0) {
269 Log.i("gesture", "Releasing " + mMouseButton);
270 mMouseButton *= -1;
271 }
272 else {
273 Log.w("gesture", "Button already in released state befor e gesture ended");
274 }
275 break;
276
277 default:
278 return handled;
279 }
280 handleMouseMovement(coordinates, mMouseButton);
281
282 return true;
283 }
284
285 return handled;
229 } 286 }
230 287
231 /** Responds to touch events filtered by the gesture detectors. */ 288 /** Responds to touch events filtered by the gesture detectors. */
232 private class DesktopListener extends GestureDetector.SimpleOnGestureListene r 289 private class DesktopListener extends GestureDetector.SimpleOnGestureListene r
233 implements ScaleGestureDetector.OnScaleGestureListener { 290 implements ScaleGestureDetector.OnScaleGestureListener {
234 /** 291 /**
235 * Called when the user is scrolling. We refuse to accept or process the event unless it 292 * Called when the user is scrolling. We refuse to accept or process the event unless it
236 * is being performed with 2 or more touch points, in order to reserve s ingle-point touch 293 * is being performed with 2 or more touch points, in order to reserve s ingle-point touch
237 * events for emulating mouse input. 294 * events for emulating mouse input.
238 */ 295 */
(...skipping 21 matching lines...) Expand all
260 317
261 synchronized (mTransform) { 318 synchronized (mTransform) {
262 float scaleFactor = detector.getScaleFactor(); 319 float scaleFactor = detector.getScaleFactor();
263 mTransform.postScale( 320 mTransform.postScale(
264 scaleFactor, scaleFactor, detector.getFocusX(), detector .getFocusY()); 321 scaleFactor, scaleFactor, detector.getFocusX(), detector .getFocusY());
265 } 322 }
266 JniInterface.redrawGraphics(); 323 JniInterface.redrawGraphics();
267 return true; 324 return true;
268 } 325 }
269 326
327 /** Called whenever a gesture starts. Always accepts the gesture so it i sn't ignored. */
328 @Override
329 public boolean onDown(MotionEvent e) {
330 return true;
331 }
332
270 /** 333 /**
271 * Called when the user starts to zoom. Always accepts the zoom so that 334 * Called when the user starts to zoom. Always accepts the zoom so that
272 * onScale() can decide whether to respond to it. 335 * onScale() can decide whether to respond to it.
273 */ 336 */
274 @Override 337 @Override
275 public boolean onScaleBegin(ScaleGestureDetector detector) { 338 public boolean onScaleBegin(ScaleGestureDetector detector) {
276 return true; 339 return true;
277 } 340 }
278 341
279 /** 342 /**
280 * Called when the user is done zooming. Defers to onScale()'s judgement . 343 * Called when the user is done zooming. Defers to onScale()'s judgement .
281 */ 344 */
282 @Override 345 @Override
283 public void onScaleEnd(ScaleGestureDetector detector) { 346 public void onScaleEnd(ScaleGestureDetector detector) {
284 onScale(detector); 347 onScale(detector);
285 } 348 }
349
350 @Override
351 public void onLongPress(MotionEvent e) {
352 float[] coordinates = new float[] {e.getRawX(), e.getY()};
353
354 if (mMouseButton > 0) {
355 Log.i("gesture", "Releasing " + mMouseButton);
356 handleMouseMovement(coordinates, -mMouseButton);
357 }
358
359 Log.i("gesture", "Pressing 3");
360 mMouseButton = 3; // TODO Name me!
361 handleMouseMovement(coordinates, mMouseButton);
362 }
286 } 363 }
287 } 364 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698