1 package com.cooliris.media;
3 import android.content.Context;
4 import android.hardware.Sensor;
5 import android.hardware.SensorEvent;
6 import android.os.SystemClock;
7 import android.view.GestureDetector;
8 import android.view.HapticFeedbackConstants;
9 import android.view.KeyEvent;
10 import android.view.MotionEvent;
12 public final class GridInputProcessor implements GestureDetector.OnGestureListener, GestureDetector.OnDoubleTapListener {
13 private int mCurrentFocusSlot;
14 private boolean mCurrentFocusIsPressed;
15 private int mCurrentSelectedSlot;
17 private float mPrevTiltValueLowPass;
18 private float mPrevShakeValueHighPass;
19 private float mShakeValue;
20 private int mTouchPosX;
21 private int mTouchPosY;
22 private int mActionCode;
23 private long mPrevTouchTime;
24 private float mFirstTouchPosX;
25 private float mFirstTouchPosY;
26 private float mPrevTouchPosX;
27 private float mPrevTouchPosY;
28 private float mTouchVelX;
29 private float mTouchVelY;
30 private boolean mProcessTouch;
31 private boolean mTouchMoved;
32 private float mDpadIgnoreTime = 0.0f;
33 private GridCamera mCamera;
34 private GridLayer mLayer;
35 private Context mContext;
36 private Pool<Vector3f> mPool;
37 private DisplayItem[] mDisplayItems;
38 private boolean mPrevHitEdge;
39 private boolean mTouchFeedbackDelivered;
40 private GestureDetector mGestureDetector;
41 private RenderView mView;
43 public GridInputProcessor(Context context, GridCamera camera, GridLayer layer, RenderView view, Pool<Vector3f> pool,
44 DisplayItem[] displayItems) {
48 mCurrentFocusSlot = Shared.INVALID;
49 mCurrentSelectedSlot = Shared.INVALID;
51 mDisplayItems = displayItems;
52 mGestureDetector = new GestureDetector(context, this);
53 mGestureDetector.setIsLongpressEnabled(true);
57 public int getCurrentFocusSlot() {
58 return mCurrentFocusSlot;
61 public int getCurrentSelectedSlot() {
62 return mCurrentSelectedSlot;
65 public void setCurrentSelectedSlot(int slot) {
66 mCurrentSelectedSlot = slot;
67 GridLayer layer = mLayer;
68 layer.setState(GridLayer.STATE_FULL_SCREEN);
69 mCamera.mConvergenceSpeed = 2.0f;
70 DisplayItem displayItem = layer.getDisplayItemForSlotId(slot);
71 MediaItem item = null;
72 if (displayItem != null)
73 item = displayItem.mItemRef;
74 layer.getHud().fullscreenSelectionChanged(item, mCurrentSelectedSlot + 1, layer.getCompleteRange().end + 1);
77 public void onSensorChanged(RenderView view, SensorEvent event, int state) {
78 switch (event.sensor.getType()) {
79 case Sensor.TYPE_ACCELEROMETER:
80 case Sensor.TYPE_ORIENTATION:
81 float[] values = event.values;
82 float valueToUse = (mCamera.mWidth < mCamera.mHeight) ? values[0] : -values[1];
83 float tiltValue = 0.8f * mPrevTiltValueLowPass + 0.2f * valueToUse;
84 if (Math.abs(tiltValue) < 0.5f)
86 if (state == GridLayer.STATE_FULL_SCREEN)
88 if (tiltValue != 0.0f)
90 mCamera.mEyeOffsetX = -3.0f * tiltValue;
91 float shakeValue = values[1] * values[1] + values[2] * values[2];
92 mShakeValue = shakeValue - mPrevShakeValueHighPass;
93 mPrevShakeValueHighPass = shakeValue;
94 if (mShakeValue < 16.0f) {
97 mShakeValue = mShakeValue * 4.0f;
98 if (mShakeValue > 200) {
106 public boolean onTouchEvent(MotionEvent event) {
107 mTouchPosX = (int) (event.getX());
108 mTouchPosY = (int) (event.getY());
109 mActionCode = event.getAction();
110 long timestamp = SystemClock.elapsedRealtime();
111 long delta = timestamp - mPrevTouchTime;
112 mPrevTouchTime = timestamp;
113 float timeElapsed = (float) delta;
114 timeElapsed = timeElapsed * 0.001f; // division by 1000 for seconds
115 switch (mActionCode) {
116 case MotionEvent.ACTION_UP:
117 if (mProcessTouch == false) {
118 touchBegan(mTouchPosX, mTouchPosY);
120 touchEnded(mTouchPosX, mTouchPosY, timeElapsed);
122 case MotionEvent.ACTION_DOWN:
123 mPrevTouchTime = timestamp;
124 touchBegan(mTouchPosX, mTouchPosY);
126 case MotionEvent.ACTION_MOVE:
127 touchMoved(mTouchPosX, mTouchPosY, timeElapsed);
130 mGestureDetector.onTouchEvent(event);
134 public boolean onKeyDown(int keyCode, KeyEvent event, int state) {
135 GridLayer layer = mLayer;
136 if (keyCode == KeyEvent.KEYCODE_BACK) {
137 if (layer.getViewIntent())
139 if (layer.getHud().getMode() == HudLayer.MODE_SELECT) {
143 if (layer.inSlideShowMode()) {
144 layer.endSlideshow();
145 layer.getHud().setAlpha(1.0f);
148 float zoomValue = layer.getZoomValue();
149 if (zoomValue != 1.0f) {
150 layer.setZoomValue(1.0f);
151 layer.centerCameraForSlot(mCurrentSelectedSlot, 1.0f);
155 if (state == GridLayer.STATE_MEDIA_SETS)
159 if (mDpadIgnoreTime < 0.1f)
161 mDpadIgnoreTime = 0.0f;
162 IndexRange bufferedVisibleRange = layer.getBufferedVisibleRange();
163 int firstBufferedVisibleSlot = bufferedVisibleRange.begin;
164 int lastBufferedVisibleSlot = bufferedVisibleRange.end;
165 int anchorSlot = layer.getAnchorSlotIndex(GridLayer.ANCHOR_CENTER);
166 if (state == GridLayer.STATE_FULL_SCREEN) {
167 layer.endSlideshow();
168 boolean needsVibrate = false;
169 if (keyCode == KeyEvent.KEYCODE_DPAD_RIGHT) {
170 needsVibrate = !layer.changeFocusToNextSlot(1.0f);
172 if (keyCode == KeyEvent.KEYCODE_DPAD_LEFT) {
173 needsVibrate = !layer.changeFocusToPreviousSlot(1.0f);
178 if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER && !mCamera.isAnimating()) {
179 if (layer.getZoomValue() == 1.0f)
180 layer.zoomInToSelectedItem();
182 layer.setZoomValue(1.0f);
184 if (keyCode == KeyEvent.KEYCODE_MENU) {
185 if (layer.getHud().getMode() == HudLayer.MODE_NORMAL)
186 layer.enterSelectionMode();
191 mCurrentFocusIsPressed = false;
192 int numRows = ((GridLayoutInterface) layer.getLayoutInterface()).mNumRows;
193 if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER && mCurrentFocusSlot != Shared.INVALID) {
194 if (layer.getHud().getMode() != HudLayer.MODE_SELECT) {
195 boolean centerCamera = layer.tapGesture(mCurrentFocusSlot, false);
197 int slotId = mCurrentFocusSlot;
200 mCurrentFocusSlot = Shared.INVALID;
203 layer.addSlotToSelectedItems(mCurrentFocusSlot, true, true);
205 mCurrentFocusIsPressed = true;
206 } else if (keyCode == KeyEvent.KEYCODE_MENU && mCurrentFocusSlot != Shared.INVALID) {
207 if (layer.getHud().getMode() == HudLayer.MODE_NORMAL)
208 layer.enterSelectionMode();
211 } else if (mCurrentFocusSlot == Shared.INVALID) {
212 mCurrentFocusSlot = anchorSlot;
213 } else if (keyCode == KeyEvent.KEYCODE_DPAD_RIGHT) {
214 mCurrentFocusSlot += numRows;
215 } else if (keyCode == KeyEvent.KEYCODE_DPAD_LEFT) {
216 mCurrentFocusSlot -= numRows;
217 } else if (keyCode == KeyEvent.KEYCODE_DPAD_UP) {
219 } else if (keyCode == KeyEvent.KEYCODE_DPAD_DOWN) {
222 if (mCurrentFocusSlot > lastBufferedVisibleSlot) {
223 mCurrentFocusSlot = lastBufferedVisibleSlot;
225 if (mCurrentFocusSlot < firstBufferedVisibleSlot)
226 mCurrentFocusSlot = firstBufferedVisibleSlot;
227 if (mCurrentFocusSlot != Shared.INVALID) {
228 layer.centerCameraForSlot(mCurrentFocusSlot, 1.0f);
234 private void touchBegan(int posX, int posY) {
235 mPrevTouchPosX = posX;
236 mPrevTouchPosY = posY;
237 mFirstTouchPosX = posX;
238 mFirstTouchPosY = posY;
241 mProcessTouch = true;
243 mCamera.stopMovementInX();
244 GridLayer layer = mLayer;
245 mCurrentFocusSlot = layer.getSlotIndexForScreenPosition(posX, posY);
246 mCurrentFocusIsPressed = true;
247 mTouchFeedbackDelivered = false;
248 HudLayer hud = layer.getHud();
249 if (hud.getMode() == HudLayer.MODE_SELECT)
250 hud.closeSelectionMenu();
251 if (layer.getState() == GridLayer.STATE_FULL_SCREEN && hud.getMode() == HudLayer.MODE_SELECT) {
255 int slotId = layer.getSlotIndexForScreenPosition(posX, posY);
256 if (slotId != Shared.INVALID && layer.getState() != GridLayer.STATE_FULL_SCREEN) {
261 private void touchMoved(int posX, int posY, float timeElapsedx) {
263 GridLayer layer = mLayer;
264 GridCamera camera = mCamera;
265 float deltaX = -(posX - mPrevTouchPosX); // negation since the wall
266 // moves in a direction
267 // opposite to that of
269 float deltaY = -(posY - mPrevTouchPosY);
270 if (Math.abs(deltaX) >= 10.0f || Math.abs(deltaY) >= 10.0f) {
273 Pool<Vector3f> pool = mPool;
274 Vector3f firstPosition = pool.create();
275 Vector3f lastPosition = pool.create();
276 Vector3f deltaAnchorPosition = pool.create();
277 Vector3f worldPosDelta = pool.create();
279 deltaAnchorPosition.set(layer.getDeltaAnchorPosition());
280 LayoutInterface layout = layer.getLayoutInterface();
281 GridCameraManager.getSlotPositionForSlotIndex(0, camera, layout, deltaAnchorPosition, firstPosition);
282 int lastSlotIndex = 0;
283 IndexRange completeRange = layer.getCompleteRange();
284 synchronized (completeRange) {
285 lastSlotIndex = completeRange.end;
287 GridCameraManager.getSlotPositionForSlotIndex(lastSlotIndex, camera, layout, deltaAnchorPosition, lastPosition);
289 camera.convertToRelativeCameraSpace(deltaX, deltaY, 0, worldPosDelta);
290 deltaX = worldPosDelta.x;
291 deltaY = worldPosDelta.y;
292 camera.moveBy(deltaX, (layer.getZoomValue() == 1.0f) ? 0 : deltaY, 0);
293 deltaX *= camera.mScale;
294 deltaY *= camera.mScale;
296 pool.delete(firstPosition);
297 pool.delete(lastPosition);
298 pool.delete(deltaAnchorPosition);
299 pool.delete(worldPosDelta);
301 if (layer.getZoomValue() == 1.0f) {
303 .computeConstraints(false, (layer.getState() != GridLayer.STATE_FULL_SCREEN), firstPosition, lastPosition)) {
306 if (!mTouchFeedbackDelivered) {
307 mTouchFeedbackDelivered = true;
312 mTouchVelX = deltaX * timeElapsedx;
313 mTouchVelY = deltaY * timeElapsedx;
314 float maxVelXx = (mCamera.mWidth * 0.5f);
315 float maxVelYx = (mCamera.mHeight);
316 mTouchVelX = FloatUtils.clamp(mTouchVelX, -maxVelXx, maxVelXx);
317 mTouchVelY = FloatUtils.clamp(mTouchVelY, -maxVelYx, maxVelYx);
318 mPrevTouchPosX = posX;
319 mPrevTouchPosY = posY;
320 // you want the movement to track the finger immediately
321 if (mTouchMoved == false)
322 mCurrentFocusSlot = layer.getSlotIndexForScreenPosition(posX, posY);
324 mCurrentFocusSlot = Shared.INVALID;
325 if (!mCamera.isZAnimating()) {
326 mCamera.commitMoveInX();
327 mCamera.commitMoveInY();
329 int anchorSlotIndex = layer.getAnchorSlotIndex(GridLayer.ANCHOR_LEFT);
330 DisplayItem[] displayItems = mDisplayItems;
331 IndexRange bufferedVisibleRange = layer.getBufferedVisibleRange();
332 int firstBufferedVisibleSlot = bufferedVisibleRange.begin;
333 int lastBufferedVisibleSlot = bufferedVisibleRange.end;
334 synchronized (displayItems) {
335 if (anchorSlotIndex >= firstBufferedVisibleSlot && anchorSlotIndex <= lastBufferedVisibleSlot) {
336 DisplayItem item = displayItems[(anchorSlotIndex - firstBufferedVisibleSlot) * GridLayer.MAX_ITEMS_PER_SLOT];
338 layer.getHud().setTimeBarTime(item.mItemRef.mDateTakenInMs);
345 private void touchEnded(int posX, int posY, float timeElapsedx) {
346 if (mProcessTouch == false)
348 int maxPixelsBeforeSwitch = mCamera.mWidth / 8;
349 mCamera.mConvergenceSpeed = 2.0f;
350 GridLayer layer = mLayer;
351 if (layer.getExpandedSlot() == Shared.INVALID && !layer.feedAboutToChange()) {
352 if (mCurrentSelectedSlot != Shared.INVALID) {
353 if (layer.getState() == GridLayer.STATE_FULL_SCREEN) {
355 // tap gesture for fullscreen
356 if (layer.getZoomValue() == 1.0f)
357 layer.changeFocusToSlot(mCurrentSelectedSlot, 1.0f);
358 } else if (layer.getZoomValue() == 1.0f) {
359 // we want to snap to a new slotIndex based on where the
360 // current position is
361 if (layer.inSlideShowMode()) {
362 layer.endSlideshow();
364 float deltaX = posX - mFirstTouchPosX;
365 float deltaY = posY - mFirstTouchPosY;
367 // it has moved vertically
369 layer.changeFocusToSlot(mCurrentSelectedSlot, 1.0f);
370 HudLayer hud = layer.getHud();
371 if (deltaX > maxPixelsBeforeSwitch && hud.getMode() != HudLayer.MODE_SELECT) {
372 layer.changeFocusToPreviousSlot(1.0f);
373 } else if (deltaX < -maxPixelsBeforeSwitch && hud.getMode() != HudLayer.MODE_SELECT) {
374 layer.changeFocusToNextSlot(1.0f);
378 // we do nothing for now, but we should clamp to the
380 boolean hitEdge = layer.constrainCameraForSlot(mCurrentSelectedSlot);
381 // mPrevHitEdge = false;
382 if (hitEdge && mPrevHitEdge) {
383 float deltaX = posX - mFirstTouchPosX;
384 float deltaY = posY - mFirstTouchPosY;
385 maxPixelsBeforeSwitch *= 4;
387 // it has moved vertically
389 mPrevHitEdge = false;
390 HudLayer hud = layer.getHud();
391 if (deltaX > maxPixelsBeforeSwitch && hud.getMode() != HudLayer.MODE_SELECT) {
392 layer.changeFocusToPreviousSlot(1.0f);
393 } else if (deltaX < -maxPixelsBeforeSwitch && hud.getMode() != HudLayer.MODE_SELECT) {
394 layer.changeFocusToNextSlot(1.0f);
396 mPrevHitEdge = hitEdge;
399 mPrevHitEdge = hitEdge;
404 if (!layer.feedAboutToChange() && layer.getZoomValue() == 1.0f) {
405 constrainCamera(true);
409 mCurrentFocusSlot = Shared.INVALID;
410 mCurrentFocusIsPressed = false;
411 mPrevTouchPosX = posX;
412 mPrevTouchPosY = posY;
413 mProcessTouch = false;
416 private void constrainCamera(boolean b) {
417 Pool<Vector3f> pool = mPool;
418 GridLayer layer = mLayer;
419 Vector3f firstPosition = pool.create();
420 Vector3f lastPosition = pool.create();
421 Vector3f deltaAnchorPosition = pool.create();
423 deltaAnchorPosition.set(layer.getDeltaAnchorPosition());
424 GridCamera camera = mCamera;
425 LayoutInterface layout = layer.getLayoutInterface();
426 GridCameraManager.getSlotPositionForSlotIndex(0, camera, layout, deltaAnchorPosition, firstPosition);
427 int lastSlotIndex = 0;
428 IndexRange completeRange = layer.getCompleteRange();
429 synchronized (completeRange) {
430 lastSlotIndex = completeRange.end;
432 GridCameraManager.getSlotPositionForSlotIndex(lastSlotIndex, camera, layout, deltaAnchorPosition, lastPosition);
433 camera.computeConstraints(true, (layer.getState() != GridLayer.STATE_FULL_SCREEN), firstPosition, lastPosition);
435 pool.delete(firstPosition);
436 pool.delete(lastPosition);
437 pool.delete(deltaAnchorPosition);
441 public void clearSelection() {
442 mCurrentSelectedSlot = Shared.INVALID;
445 public void clearFocus() {
446 mCurrentFocusSlot = Shared.INVALID;
449 public boolean isFocusItemPressed() {
450 return mCurrentFocusIsPressed;
453 public void update(float timeElapsed) {
454 mDpadIgnoreTime += timeElapsed;
457 public void setCurrentFocusSlot(int slotId) {
458 mCurrentSelectedSlot = slotId;
461 public boolean onDown(MotionEvent e) {
462 // TODO Auto-generated method stub
466 public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
467 if (mCurrentSelectedSlot == Shared.INVALID) {
470 mCamera.mConvergenceSpeed = 1.0f;
471 float normalizedVelocity = velocityX * mCamera.mOneByScale;
472 // mCamera.moveBy(-velocityX * mCamera.mOneByScale * 0.25f, 0, 0);
473 // constrainCamera(true);
474 IndexRange visibleRange = mLayer.getVisibleRange();
475 int numVisibleSlots = visibleRange.end - visibleRange.begin;
476 if (numVisibleSlots > 0) {
477 float fastFlingVelocity = 20.0f;
478 int slotsToSkip = (int) (numVisibleSlots * (-normalizedVelocity / fastFlingVelocity));
479 int maxSlots = numVisibleSlots;
480 if (slotsToSkip > maxSlots)
481 slotsToSkip = maxSlots;
482 if (slotsToSkip < -maxSlots)
483 slotsToSkip = -maxSlots;
484 if (Math.abs(slotsToSkip) <= 1) {
487 else if (velocityX < 0)
490 int slotToGetTo = mLayer.getAnchorSlotIndex(GridLayer.ANCHOR_CENTER) + slotsToSkip;
493 int lastSlot = mLayer.getCompleteRange().end;
494 if (slotToGetTo > lastSlot)
495 slotToGetTo = lastSlot;
496 mLayer.centerCameraForSlot(slotToGetTo, 1.0f);
498 constrainCamera(true);
505 public void onLongPress(MotionEvent e) {
506 if (mLayer.getFeed() != null && mLayer.getFeed().isSingleImageMode()) {
507 HudLayer hud = mLayer.getHud();
508 hud.getPathBar().setHidden(true);
509 hud.getMenuBar().setHidden(true);
510 if (hud.getMode() != HudLayer.MODE_NORMAL)
511 hud.setMode(HudLayer.MODE_NORMAL);
513 if (mCurrentFocusSlot != Shared.INVALID) {
515 GridLayer layer = mLayer;
516 if (layer.getState() == GridLayer.STATE_FULL_SCREEN) {
519 HudLayer hud = layer.getHud();
520 hud.enterSelectionMode();
521 layer.addSlotToSelectedItems(mCurrentFocusSlot, true, true);
525 public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
526 // TODO Auto-generated method stub
530 public void onShowPress(MotionEvent e) {
531 // TODO Auto-generated method stub
535 public boolean onSingleTapUp(MotionEvent e) {
536 GridLayer layer = mLayer;
537 int posX = (int) e.getX();
538 int posY = (int) e.getY();
539 if (mCurrentSelectedSlot != Shared.INVALID) {
541 mCamera.mConvergenceSpeed = 2.0f;
542 int slotId = mCurrentSelectedSlot;
543 if (layer.getZoomValue() == 1.0f) {
544 layer.centerCameraForSlot(slotId, 1.0f);
546 layer.constrainCameraForSlot(slotId);
548 DisplayItem displayItem = layer.getDisplayItemForSlotId(slotId);
549 if (displayItem != null) {
550 final MediaItem item = displayItem.mItemRef;
551 int heightBy2 = mCamera.mHeight / 2;
552 boolean posYInBounds = (Math.abs(posY - heightBy2) < 64);
553 if (posX < 32 && posYInBounds) {
554 layer.changeFocusToPreviousSlot(1.0f);
555 } else if (posX > mCamera.mWidth - 32 && posYInBounds) {
556 layer.changeFocusToNextSlot(1.0f);
557 } else if (item.getMediaType() == MediaItem.MEDIA_TYPE_VIDEO) {
558 Utils.playVideo(mContext, item);
560 // We stop any slideshow.
561 HudLayer hud = layer.getHud();
562 if (layer.inSlideShowMode()) {
563 layer.endSlideshow();
565 hud.setAlpha(1.0f - hud.getAlpha());
567 if (hud.getMode() == HudLayer.MODE_SELECT) {
573 int slotId = layer.getSlotIndexForScreenPosition(posX, posY);
574 if (slotId != Shared.INVALID) {
575 HudLayer hud = layer.getHud();
576 if (hud.getMode() == HudLayer.MODE_SELECT) {
577 layer.addSlotToSelectedItems(slotId, true, true);
579 boolean centerCamera = (mCurrentSelectedSlot == Shared.INVALID) ? layer.tapGesture(slotId, false) : true;
581 // We check if this item is a video or not.
586 int state = layer.getState();
587 if (state != GridLayer.STATE_FULL_SCREEN && state != GridLayer.STATE_GRID_VIEW
588 && layer.getHud().getMode() != HudLayer.MODE_SELECT) {
589 slotId = layer.getMetadataSlotIndexForScreenPosition(posX, posY);
590 if (slotId != Shared.INVALID) {
591 layer.tapGesture(slotId, true);
599 private void selectSlot(int slotId) {
600 GridLayer layer = mLayer;
601 if (layer.getState() == GridLayer.STATE_GRID_VIEW) {
602 DisplayItem displayItem = layer.getDisplayItemForSlotId(slotId);
603 if (displayItem != null) {
604 final MediaItem item = displayItem.mItemRef;
605 if (layer.getPickIntent()) {
606 // we need to return this item
607 ((Gallery) mContext).getHandler().post(new Runnable() {
609 ((Gallery) mContext).launchCropperOrFinish(item);
614 if (item.getMediaType() == MediaItem.MEDIA_TYPE_VIDEO) {
615 Utils.playVideo(mContext, item);
617 mCurrentSelectedSlot = slotId;
618 layer.endSlideshow();
619 layer.setState(GridLayer.STATE_FULL_SCREEN);
620 mCamera.mConvergenceSpeed = 2.0f;
621 layer.getHud().fullscreenSelectionChanged(item, mCurrentSelectedSlot + 1, layer.getCompleteRange().end + 1);
627 public boolean onDoubleTap(MotionEvent e) {
628 final GridLayer layer = mLayer;
629 if (layer.getState() == GridLayer.STATE_FULL_SCREEN && !mCamera.isZAnimating()) {
630 float posX = e.getX();
631 float posY = e.getY();
632 final Vector3f retVal = new Vector3f();
633 posX -= (mCamera.mWidth / 2);
634 posY -= (mCamera.mHeight / 2);
635 mCamera.convertToRelativeCameraSpace(posX, posY, 0, retVal);
636 if (layer.getZoomValue() == 1.0f) {
637 layer.setZoomValue(3f);
638 mCamera.update(0.001f);
639 mCamera.moveBy(retVal.x, retVal.y, 0);
640 layer.constrainCameraForSlot(mCurrentSelectedSlot);
642 layer.setZoomValue(1.0f);
644 mCamera.mConvergenceSpeed = 2.0f;
646 return onSingleTapConfirmed(e);
651 public boolean onDoubleTapEvent(MotionEvent e) {
655 public boolean onSingleTapConfirmed(MotionEvent e) {
659 public boolean touchPressed() {
660 return mProcessTouch;
663 private void vibrateShort() {
664 // As per request by Google, this line disables vibration.
665 //mView.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS);
668 private void vibrateLong() {
669 //mView.performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY);