package com.iiordanov.bVNC.input;
import android.graphics.PointF;
import android.os.SystemClock;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
import com.iiordanov.android.bc.BCFactory;
import com.iiordanov.bVNC.RemoteCanvas;
import com.iiordanov.bVNC.RemoteCanvasActivity;
import com.iiordanov.bVNC.*;
import com.iiordanov.freebVNC.*;
import com.iiordanov.aRDP.*;
import com.iiordanov.freeaRDP.*;
import com.iiordanov.aSPICE.*;
import com.iiordanov.freeaSPICE.*;
public class TouchMouseDragPanInputHandler extends AbstractGestureInputHandler {
static final String TAG = "TouchMouseDragPanInputHandler";
static final String TOUCH_ZOOM_MODE_DRAG_PAN = "TOUCH_ZOOM_MODE_DRAG_PAN";
/**
* Divide stated fling velocity by this amount to get initial velocity
* per pan interval
*/
static final float FLING_FACTOR = 8;
/**
* @param c
*/
public TouchMouseDragPanInputHandler(RemoteCanvasActivity va, RemoteCanvas v, boolean slowScrolling) {
super(va, v, slowScrolling);
}
/*
* (non-Javadoc)
*
* @see com.iiordanov.bVNC.AbstractInputHandler#getHandlerDescription()
*/
@Override
public CharSequence getHandlerDescription() {
return canvas.getResources().getString(R.string.input_mode_drag_pan_description);
}
/*
* (non-Javadoc)
*
* @see com.iiordanov.bVNC.AbstractInputHandler#getName()
*/
@Override
public String getName() {
return TOUCH_ZOOM_MODE_DRAG_PAN;
}
/*
* (non-Javadoc)
*
* @see com.iiordanov.bVNC.RemoteCanvasActivity.ZoomInputHandler#onKeyDown(int,
* android.view.KeyEvent)
*/
@Override
public boolean onKeyDown(int keyCode, KeyEvent evt) {
return keyHandler.onKeyDown(keyCode, evt);
}
/*
* (non-Javadoc)
*
* @see com.iiordanov.bVNC.RemoteCanvasActivity.ZoomInputHandler#onKeyUp(int,
* android.view.KeyEvent)
*/
@Override
public boolean onKeyUp(int keyCode, KeyEvent evt) {
return keyHandler.onKeyUp(keyCode, evt);
}
/*
* (non-Javadoc)
*
* @see com.iiordanov.bVNC.AbstractInputHandler#onTrackballEvent(android.view.MotionEvent)
*/
@Override
public boolean onTrackballEvent(MotionEvent evt) {
return trackballMouse(evt);
}
/*
* (non-Javadoc)
*
* @see android.view.GestureDetector.SimpleOnGestureListener#onLongPress(android.view.MotionEvent)
*/
@Override
public void onLongPress(MotionEvent e) {
// If we've performed a right/middle-click and the gesture is not over yet, do not start drag mode.
if (secondPointerWasDown || thirdPointerWasDown)
return;
BCFactory.getInstance().getBCHaptic().performLongPressHaptic(canvas);
canvas.displayShortToastMessage("Panning");
endDragModesAndScrolling();
panMode = true;
}
/*
* (non-Javadoc)
*
* @see android.view.GestureDetector.SimpleOnGestureListener#onScroll(android.view.MotionEvent,
* android.view.MotionEvent, float, float)
*/
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
RemotePointer p = canvas.getPointer();
// onScroll called while scaling/swiping gesture is in effect. We ignore the event and pretend it was
// consumed. This prevents the mouse pointer from flailing around while we are scaling.
// Also, if one releases one finger slightly earlier than the other when scaling, it causes Android
// to stick a spiteful onScroll with a MASSIVE delta here.
// This would cause the mouse pointer to jump to another place suddenly.
// Hence, we ignore onScroll after scaling until we lift all pointers up.
boolean twoFingers = false;
if (e1 != null)
twoFingers = (e1.getPointerCount() > 1);
if (e2 != null)
twoFingers = twoFingers || (e2.getPointerCount() > 1);
if (twoFingers||inSwiping||inScaling||scalingJustFinished)
return true;
activity.showZoomer(false);
if (!dragMode) {
dragMode = true;
p.processPointerEvent(getX(e1), getY(e1), e1.getActionMasked(), e1.getMetaState(), true, false, false, false, 0);
} else {
p.processPointerEvent(getX(e2), getY(e2), e2.getActionMasked(), e2.getMetaState(), true, false, false, false, 0);
}
canvas.panToMouse();
return true;
}
}