package com.iiordanov.bVNC.input;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageButton;
import android.widget.RelativeLayout;
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 SingleHandedInputHandler extends TouchMouseSwipePanInputHandler {
static final String TAG = "SingleHandedInputHandler";
static final String SINGLE_HANDED_MODE = "SINGLE_HANDED_MODE";
private RelativeLayout singleHandOpts;
private ImageButton dragModeButton;
private ImageButton rightDragModeButton;
private ImageButton middleDragModeButton;
private ImageButton scrollButton;
private ImageButton zoomButton;
private ImageButton cancelButton;
int accumulatedScroll;
private int eventStartX, eventStartY, eventAction, eventMeta;
/**
* Divide stated fling velocity by this amount to get initial velocity
* per pan interval
*/
static final float FLING_FACTOR = 8;
/**
* @param c
*/
public SingleHandedInputHandler(RemoteCanvasActivity va, RemoteCanvas v, boolean slowScrolling) {
super(va, v, slowScrolling);
initializeButtons();
}
private void initializeButtons() {
singleHandOpts = (RelativeLayout) activity.findViewById(R.id.singleHandOpts);
dragModeButton = (ImageButton) activity.findViewById(R.id.singleDrag);
dragModeButton.setOnClickListener(new OnClickListener () {
@Override
public void onClick(View arg0) {
startNewSingleHandedGesture();
dragMode = true;
RemotePointer p = canvas.getPointer();
p.processPointerEvent(eventStartX, eventStartY, eventAction, eventMeta, true, false, false, false, 0);
canvas.displayShortToastMessage(R.string.single_left);
}
});
rightDragModeButton = (ImageButton) activity.findViewById(R.id.singleRight);
rightDragModeButton.setOnClickListener(new OnClickListener () {
@Override
public void onClick(View arg0) {
startNewSingleHandedGesture();
rightDragMode = true;
RemotePointer p = canvas.getPointer();
p.processPointerEvent(eventStartX, eventStartY, eventAction, eventMeta, true, true, false, false, 0);
canvas.displayShortToastMessage(R.string.single_right);
}
});
middleDragModeButton = (ImageButton) activity.findViewById(R.id.singleMiddle);
middleDragModeButton.setOnClickListener(new OnClickListener () {
@Override
public void onClick(View arg0) {
startNewSingleHandedGesture();
middleDragMode = true;
RemotePointer p = canvas.getPointer();
p.processPointerEvent(eventStartX, eventStartY, eventAction, eventMeta, true, false, true, false, 0);
canvas.displayShortToastMessage(R.string.single_middle);
}
});
scrollButton = (ImageButton) activity.findViewById(R.id.singleScroll);
scrollButton.setOnClickListener(new OnClickListener () {
@Override
public void onClick(View arg0) {
startNewSingleHandedGesture();
canvas.inScrolling = true;
inSwiping = true;
RemotePointer p = canvas.getPointer();
p.processPointerEvent(eventStartX, eventStartY, eventAction, eventMeta, false, false, false, false, 0);
canvas.displayShortToastMessage(R.string.single_scroll);
}
});
zoomButton = (ImageButton) activity.findViewById(R.id.singleZoom);
zoomButton.setOnClickListener(new OnClickListener () {
@Override
public void onClick(View arg0) {
startNewSingleHandedGesture();
inScaling = true;
canvas.displayShortToastMessage(R.string.single_zoom);
}
});
cancelButton = (ImageButton) activity.findViewById(R.id.singleCancel);
cancelButton.setOnClickListener(new OnClickListener () {
@Override
public void onClick(View arg0) {
singleHandOpts.setVisibility(View.GONE);
canvas.displayShortToastMessage(R.string.single_cancel);
}
});
}
private void startNewSingleHandedGesture() {
singleHandOpts.setVisibility(View.GONE);
endDragModesAndScrolling ();
singleHandedGesture = true;
accumulatedScroll = 0;
}
/*
* (non-Javadoc)
*
* @see com.iiordanov.bVNC.AbstractInputHandler#getHandlerDescription()
*/
@Override
public CharSequence getHandlerDescription() {
return canvas.getResources().getString(R.string.input_mode_single_handed_description);
}
/*
* (non-Javadoc)
*
* @see com.iiordanov.bVNC.AbstractInputHandler#getName()
*/
@Override
public String getName() {
return SINGLE_HANDED_MODE;
}
/*
* (non-Javadoc)
*
* @see android.view.GestureDetector.SimpleOnGestureListener#onLongPress(android.view.MotionEvent)
*/
@Override
public void onLongPress(MotionEvent e) {
android.util.Log.e(TAG, "Long press.");
if (singleHandedGesture || singleHandedJustEnded)
return;
boolean buttonsVisible = (singleHandOpts.getVisibility() == View.VISIBLE);
initializeSingleHandedMode(e);
if (buttonsVisible)
canvas.displayShortToastMessage(R.string.single_reposition);
else
canvas.displayShortToastMessage(R.string.single_choose);
}
private void initializeSingleHandedMode(MotionEvent e) {
eventStartX = getX(e);
eventStartY = getY(e);
xInitialFocus = e.getX();
yInitialFocus = e.getY();
eventAction = e.getAction();
eventMeta = e.getMetaState();
singleHandOpts.setVisibility(View.VISIBLE);
// Move pointer to where we're performing gesture.
RemotePointer p = canvas.getPointer();
p.processPointerEvent(eventStartX, eventStartY, eventAction, eventMeta, false, false, false, false, 0);
}
/*
* (non-Javadoc)
*
* @see android.view.GestureDetector.SimpleOnGestureListener#onSingleTapConfirmed(android.view.MotionEvent)
*/
@Override
public boolean onSingleTapConfirmed(MotionEvent e) {
boolean buttonsVisible = (singleHandOpts.getVisibility() == View.VISIBLE);
// If the single-handed gesture buttons are visible, reposition pointer.
if (buttonsVisible) {
initializeSingleHandedMode(e);
canvas.displayShortToastMessage(R.string.single_reposition);
return true;
} else
return super.onSingleTapConfirmed(e);
}
/*
* (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) {
// If we are not in a single-handed gesture, simply pass events onto parent.
if (!singleHandedGesture)
return super.onScroll(e1, e2, distanceX, distanceY);
// Otherwise, handle scrolling and zooming here.
if (inSwiping) {
twoFingerSwipeUp = false;
twoFingerSwipeDown = false;
twoFingerSwipeRight = false;
twoFingerSwipeLeft = false;
// Set needed parameters for scroll event to happen in super.super.onTouchEvent.
int absX = (int)Math.abs(distanceX);
int absY = (int)Math.abs(distanceY);
if (absY > absX) {
// Scrolling up/down.
if (distanceY > 0)
twoFingerSwipeDown = true;
else
twoFingerSwipeUp = true;
swipeSpeed = (absY+accumulatedScroll)/15;
accumulatedScroll += absY;
} else {
// Scrolling side to side.
if (distanceX > 0)
twoFingerSwipeRight = true;
else
twoFingerSwipeLeft = true;
swipeSpeed = (absX+accumulatedScroll)/15;
accumulatedScroll += absY;
}
if (swipeSpeed < 1) {
swipeSpeed = 0;
} else
accumulatedScroll = 0;
} else if (inScaling) {
float scaleFactor = 1.0f + distanceY*0.01f;
if (canvas != null && canvas.scaling != null)
canvas.scaling.adjust(activity, scaleFactor, xInitialFocus, yInitialFocus);
}
return true;
}
}