| OLD | NEW |
| 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.Matrix; | 8 import android.graphics.Matrix; |
| 9 import android.graphics.Point; | |
| 10 import android.graphics.PointF; | 9 import android.graphics.PointF; |
| 11 import android.graphics.Rect; | 10 import android.graphics.Rect; |
| 12 import android.view.GestureDetector; | 11 import android.view.GestureDetector; |
| 13 import android.view.MotionEvent; | 12 import android.view.MotionEvent; |
| 14 import android.view.ScaleGestureDetector; | 13 import android.view.ScaleGestureDetector; |
| 15 import android.view.ViewConfiguration; | 14 import android.view.ViewConfiguration; |
| 16 | 15 |
| 17 /** | 16 /** |
| 18 * This class is responsible for handling Touch input from the user. Touch even
ts which manipulate | 17 * This class is responsible for handling Touch input from the user. Touch even
ts which manipulate |
| 19 * the local canvas are handled in this class and any input which should be sent
to the remote host | 18 * the local canvas are handled in this class and any input which should be sent
to the remote host |
| (...skipping 370 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 390 } | 389 } |
| 391 // Determine the center point from which to apply the delta. | 390 // Determine the center point from which to apply the delta. |
| 392 // For indirect input modes (i.e. trackpad), the view generally follows
the cursor. | 391 // For indirect input modes (i.e. trackpad), the view generally follows
the cursor. |
| 393 // For direct input modes (i.e. touch) the should track the user's motio
n. | 392 // For direct input modes (i.e. touch) the should track the user's motio
n. |
| 394 // If the user is dragging, then the viewport should always follow the u
ser's finger. | 393 // If the user is dragging, then the viewport should always follow the u
ser's finger. |
| 395 PointF newPos = mDesktopCanvas.moveViewportCenter(!followCursor, deltaX,
deltaY); | 394 PointF newPos = mDesktopCanvas.moveViewportCenter(!followCursor, deltaX,
deltaY); |
| 396 | 395 |
| 397 // If we are in an indirect mode, then we want to keep the cursor center
ed, if possible, as | 396 // If we are in an indirect mode, then we want to keep the cursor center
ed, if possible, as |
| 398 // the viewport moves. | 397 // the viewport moves. |
| 399 if (mInputStrategy.isIndirectInputMode()) { | 398 if (mInputStrategy.isIndirectInputMode()) { |
| 400 moveCursor((int) newPos.x, (int) newPos.y); | 399 moveCursor(newPos.x, newPos.y); |
| 401 } | 400 } |
| 402 | 401 |
| 403 mDesktopCanvas.repositionImage(true); | 402 mDesktopCanvas.repositionImage(true); |
| 404 } | 403 } |
| 405 | 404 |
| 406 /** Moves the cursor to the specified position on the screen. */ | 405 /** Moves the cursor to the specified position on the screen. */ |
| 407 private void moveCursorToScreenPoint(float screenX, float screenY) { | 406 private void moveCursorToScreenPoint(float screenX, float screenY) { |
| 408 float[] imagePoint = mapScreenPointToImagePoint(screenX, screenY); | 407 float[] imagePoint = mapScreenPointToImagePoint(screenX, screenY); |
| 409 moveCursor((int) imagePoint[0], (int) imagePoint[1]); | 408 moveCursor(imagePoint[0], imagePoint[1]); |
| 410 } | 409 } |
| 411 | 410 |
| 412 /** Moves the cursor to the specified position on the remote host. */ | 411 /** Moves the cursor to the specified position on the remote host. */ |
| 413 private void moveCursor(int newX, int newY) { | 412 private void moveCursor(float newX, float newY) { |
| 414 synchronized (mRenderData) { | 413 synchronized (mRenderData) { |
| 415 boolean cursorMoved = mRenderData.setCursorPosition(newX, newY); | 414 boolean cursorMoved = mRenderData.setCursorPosition(newX, newY); |
| 416 if (cursorMoved) { | 415 if (cursorMoved) { |
| 417 mInputStrategy.injectCursorMoveEvent(newX, newY); | 416 mInputStrategy.injectCursorMoveEvent((int) newX, (int) newY); |
| 418 } | 417 } |
| 419 } | 418 } |
| 420 mViewer.cursorMoved(); | 419 mViewer.cursorMoved(); |
| 421 } | 420 } |
| 422 | 421 |
| 423 /** Processes a (multi-finger) swipe gesture. */ | 422 /** Processes a (multi-finger) swipe gesture. */ |
| 424 private boolean onSwipe() { | 423 private boolean onSwipe() { |
| 425 if (mTotalMotionY > mSwipeThreshold) { | 424 if (mTotalMotionY > mSwipeThreshold) { |
| 426 // Swipe down occurred. | 425 // Swipe down occurred. |
| 427 mViewer.showActionBar(); | 426 mViewer.showActionBar(); |
| (...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 588 } | 587 } |
| 589 | 588 |
| 590 if (!mInputStrategy.isIndirectInputMode()) { | 589 if (!mInputStrategy.isIndirectInputMode()) { |
| 591 if (screenPointLiesOutsideImageBoundary(x, y)) { | 590 if (screenPointLiesOutsideImageBoundary(x, y)) { |
| 592 return false; | 591 return false; |
| 593 } | 592 } |
| 594 moveCursorToScreenPoint(x, y); | 593 moveCursorToScreenPoint(x, y); |
| 595 } | 594 } |
| 596 | 595 |
| 597 if (mInputStrategy.onTap(button)) { | 596 if (mInputStrategy.onTap(button)) { |
| 598 Point pos; | 597 PointF pos; |
| 599 synchronized (mRenderData) { | 598 synchronized (mRenderData) { |
| 600 pos = mRenderData.getCursorPosition(); | 599 pos = mRenderData.getCursorPosition(); |
| 601 } | 600 } |
| 602 mViewer.showInputFeedback(mInputStrategy.getShortPressFeedbackTy
pe(), pos); | 601 mViewer.showInputFeedback(mInputStrategy.getShortPressFeedbackTy
pe(), pos); |
| 603 } | 602 } |
| 604 return true; | 603 return true; |
| 605 } | 604 } |
| 606 | 605 |
| 607 /** Called when a long-press is triggered for one or more fingers. */ | 606 /** Called when a long-press is triggered for one or more fingers. */ |
| 608 @Override | 607 @Override |
| 609 public void onLongPress(int pointerCount, float x, float y) { | 608 public void onLongPress(int pointerCount, float x, float y) { |
| 610 int button = mouseButtonFromPointerCount(pointerCount); | 609 int button = mouseButtonFromPointerCount(pointerCount); |
| 611 if (button == InputStub.BUTTON_UNDEFINED) { | 610 if (button == InputStub.BUTTON_UNDEFINED) { |
| 612 return; | 611 return; |
| 613 } | 612 } |
| 614 | 613 |
| 615 if (!mInputStrategy.isIndirectInputMode()) { | 614 if (!mInputStrategy.isIndirectInputMode()) { |
| 616 if (screenPointLiesOutsideImageBoundary(x, y)) { | 615 if (screenPointLiesOutsideImageBoundary(x, y)) { |
| 617 return; | 616 return; |
| 618 } | 617 } |
| 619 moveCursorToScreenPoint(x, y); | 618 moveCursorToScreenPoint(x, y); |
| 620 } | 619 } |
| 621 | 620 |
| 622 if (mInputStrategy.onPressAndHold(button)) { | 621 if (mInputStrategy.onPressAndHold(button)) { |
| 623 Point pos; | 622 PointF pos; |
| 624 synchronized (mRenderData) { | 623 synchronized (mRenderData) { |
| 625 pos = mRenderData.getCursorPosition(); | 624 pos = mRenderData.getCursorPosition(); |
| 626 } | 625 } |
| 627 mViewer.showInputFeedback(mInputStrategy.getLongPressFeedbackTyp
e(), pos); | 626 mViewer.showInputFeedback(mInputStrategy.getLongPressFeedbackTyp
e(), pos); |
| 628 mSuppressFling = true; | 627 mSuppressFling = true; |
| 629 mIsDragging = true; | 628 mIsDragging = true; |
| 630 } | 629 } |
| 631 } | 630 } |
| 632 | 631 |
| 633 /** Maps the number of fingers in a tap or long-press gesture to a mouse
-button. */ | 632 /** Maps the number of fingers in a tap or long-press gesture to a mouse
-button. */ |
| (...skipping 18 matching lines...) Expand all Loading... |
| 652 synchronized (mRenderData) { | 651 synchronized (mRenderData) { |
| 653 imageWidth = (float) mRenderData.imageWidth + EPSILON; | 652 imageWidth = (float) mRenderData.imageWidth + EPSILON; |
| 654 imageHeight = (float) mRenderData.imageHeight + EPSILON; | 653 imageHeight = (float) mRenderData.imageHeight + EPSILON; |
| 655 } | 654 } |
| 656 | 655 |
| 657 return mappedPoints[0] < -EPSILON || mappedPoints[0] > imageWidth | 656 return mappedPoints[0] < -EPSILON || mappedPoints[0] > imageWidth |
| 658 || mappedPoints[1] < -EPSILON || mappedPoints[1] > imageHeig
ht; | 657 || mappedPoints[1] < -EPSILON || mappedPoints[1] > imageHeig
ht; |
| 659 } | 658 } |
| 660 } | 659 } |
| 661 } | 660 } |
| OLD | NEW |