diff options
author | lambroslambrou@chromium.org <lambroslambrou@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-11-02 02:15:37 +0000 |
---|---|---|
committer | lambroslambrou@chromium.org <lambroslambrou@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-11-02 02:15:37 +0000 |
commit | b6a0361a386f69c58f7c8e1d7a44d5cc116a6ec6 (patch) | |
tree | becc9ace8158cff0f5b008528fcd087adf0bd9d1 /remoting | |
parent | 2bb45f5c12746649dd2b659e1cca8f0316f031bc (diff) | |
download | chromium_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.java | 6 | ||||
-rw-r--r-- | remoting/android/java/src/org/chromium/chromoting/TrackingInputHandler.java | 80 |
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; } } } |