summaryrefslogtreecommitdiffstats
path: root/remoting
diff options
context:
space:
mode:
authorlambroslambrou@chromium.org <lambroslambrou@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-11-02 02:15:37 +0000
committerlambroslambrou@chromium.org <lambroslambrou@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-11-02 02:15:37 +0000
commitb6a0361a386f69c58f7c8e1d7a44d5cc116a6ec6 (patch)
treebecc9ace8158cff0f5b008528fcd087adf0bd9d1 /remoting
parent2bb45f5c12746649dd2b659e1cca8f0316f031bc (diff)
downloadchromium_src-b6a0361a386f69c58f7c8e1d7a44d5cc116a6ec6.zip
chromium_src-b6a0361a386f69c58f7c8e1d7a44d5cc116a6ec6.tar.gz
chromium_src-b6a0361a386f69c58f7c8e1d7a44d5cc116a6ec6.tar.bz2
Show keyboard/toolbar on 3-finger swipe up/down
3-finger swipe up shows the soft keyboard. 3-finger swipe down shows the toolbar, and 3-finger tap injects a middle mouse button click. BUG=293703 Review URL: https://codereview.chromium.org/55613002 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@232561 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'remoting')
-rw-r--r--remoting/android/java/src/org/chromium/chromoting/DesktopView.java6
-rw-r--r--remoting/android/java/src/org/chromium/chromoting/TrackingInputHandler.java80
2 files changed, 73 insertions, 13 deletions
diff --git a/remoting/android/java/src/org/chromium/chromoting/DesktopView.java b/remoting/android/java/src/org/chromium/chromoting/DesktopView.java
index 26cf83a..232174e 100644
--- a/remoting/android/java/src/org/chromium/chromoting/DesktopView.java
+++ b/remoting/android/java/src/org/chromium/chromoting/DesktopView.java
@@ -6,6 +6,7 @@ package org.chromium.chromoting;
import android.app.ActionBar;
import android.app.Activity;
+import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
@@ -14,6 +15,7 @@ import android.graphics.Point;
import android.os.Looper;
import android.text.InputType;
import android.util.Log;
+import android.view.inputmethod.InputMethodManager;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
@@ -218,7 +220,9 @@ public class DesktopView extends SurfaceView implements DesktopViewInterface, Ru
@Override
public void showKeyboard() {
- // TODO(lambroslambrou): Implement this.
+ InputMethodManager inputManager =
+ (InputMethodManager)getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
+ inputManager.showSoftInput(this, 0);
}
@Override
diff --git a/remoting/android/java/src/org/chromium/chromoting/TrackingInputHandler.java b/remoting/android/java/src/org/chromium/chromoting/TrackingInputHandler.java
index 537f5aa..92c1dec 100644
--- a/remoting/android/java/src/org/chromium/chromoting/TrackingInputHandler.java
+++ b/remoting/android/java/src/org/chromium/chromoting/TrackingInputHandler.java
@@ -40,6 +40,24 @@ public class TrackingInputHandler implements TouchInputHandler {
*/
private PointF mCursorPosition;
+ /**
+ * Used for tracking swipe gestures. Only the Y-direction is needed for responding to swipe-up
+ * or swipe-down.
+ */
+ private float mTotalMotionY = 0;
+
+ /**
+ * Set to true during the middle of a swipe gesture to prevent the remainder of the swipe
+ * motion triggering further actions.
+ */
+ private boolean mSwipeCompleted = false;
+
+ /**
+ * Distance in pixels beyond which a motion gesture is considered to be a swipe. This is
+ * initialized using the Context passed into the ctor.
+ */
+ private float mSwipeThreshold;
+
public TrackingInputHandler(DesktopViewInterface viewer, Context context,
RenderData renderData) {
mViewer = viewer;
@@ -58,6 +76,12 @@ public class TrackingInputHandler implements TouchInputHandler {
mTapDetector = new TapGestureDetector(context, listener);
mCursorPosition = new PointF();
+
+ // The threshold needs to be bigger than the ScaledTouchSlop used by the gesture-detectors,
+ // so that a gesture cannot be both a tap and a swipe. It also needs to be small enough so
+ // that intentional swipes are usually detected.
+ float density = context.getResources().getDisplayMetrics().density;
+ mSwipeThreshold = 40 * density;
}
/**
@@ -173,13 +197,33 @@ public class TrackingInputHandler implements TouchInputHandler {
mViewer.injectMouseEvent((int)mCursorPosition.x, (int)mCursorPosition.y, button, pressed);
}
+ /** Processes a (multi-finger) swipe gesture. */
+ private boolean onSwipe() {
+ if (mTotalMotionY > mSwipeThreshold) {
+ // Swipe down occurred.
+ mViewer.showActionBar();
+ return true;
+ } else if (mTotalMotionY < -mSwipeThreshold) {
+ // Swipe up occurred.
+ mViewer.showKeyboard();
+ return true;
+ }
+ return false;
+ }
+
@Override
public boolean onTouchEvent(MotionEvent event) {
// Avoid short-circuit logic evaluation - ensure both gesture detectors see all events so
// that they generate correct notifications.
boolean handled = mScroller.onTouchEvent(event);
- handled = mZoomer.onTouchEvent(event) || handled;
- handled = mTapDetector.onTouchEvent(event) || handled;
+ handled |= mZoomer.onTouchEvent(event);
+ handled |= mTapDetector.onTouchEvent(event);
+
+ if (event.getActionMasked() == MotionEvent.ACTION_POINTER_DOWN) {
+ mTotalMotionY = 0;
+ mSwipeCompleted = false;
+ }
+
return handled;
}
@@ -207,6 +251,17 @@ public class TrackingInputHandler implements TouchInputHandler {
*/
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
+ if (e2.getPointerCount() == 3) {
+ // Note that distance values are reversed. For example, dragging a finger in the
+ // direction of increasing Y coordinate (downwards) results in distanceY being
+ // negative.
+ mTotalMotionY -= distanceY;
+ if (!mSwipeCompleted) {
+ mSwipeCompleted = onSwipe();
+ return mSwipeCompleted;
+ }
+ }
+
if (e2.getPointerCount() != 1) {
return false;
}
@@ -262,23 +317,24 @@ public class TrackingInputHandler implements TouchInputHandler {
/** Called when the user taps the screen with one or more fingers. */
@Override
public boolean onTap(int pointerCount) {
+ int button;
switch (pointerCount) {
case 1:
- injectButtonEvent(BUTTON_LEFT, true);
- injectButtonEvent(BUTTON_LEFT, false);
- return true;
+ button = BUTTON_LEFT;
+ break;
case 2:
- injectButtonEvent(BUTTON_RIGHT, true);
- injectButtonEvent(BUTTON_RIGHT, false);
- return true;
+ button = BUTTON_RIGHT;
+ break;
case 3:
- // TODO(lambroslambrou): Add 3-finger-tap for middle-click, and use 3-finger
- // swipe to show the action-bar or keyboard.
- mViewer.showActionBar();
- return true;
+ button = BUTTON_MIDDLE;
+ break;
default:
return false;
}
+
+ injectButtonEvent(button, true);
+ injectButtonEvent(button, false);
+ return true;
}
}
}