/** * Copyright (c) 2010 Michael A. MacDonald */ package android.androidVNC; import android.graphics.PointF; import android.os.Handler; import android.view.KeyEvent; import android.view.MotionEvent; /** * Input handlers delegate to this class to handle keystrokes; this detects keystrokes * from the DPad and uses them to perform mouse actions; other keystrokes are passed to * VncCanvasActivity.defaultKeyXXXHandler * * @author Michael A. MacDonald * */ class DPadMouseKeyHandler { private MouseMover mouseMover; private boolean mouseDown; private VncCanvasActivity activity; private VncCanvas canvas; private boolean isMoving; DPadMouseKeyHandler(VncCanvasActivity activity, Handler handler) { this.activity = activity; canvas = activity.vncCanvas; mouseMover = new MouseMover(activity, handler); } public boolean onKeyDown(int keyCode, KeyEvent evt) { int xv = 0; int yv = 0; boolean result = true; switch (keyCode) { case KeyEvent.KEYCODE_DPAD_LEFT: xv = -1; break; case KeyEvent.KEYCODE_DPAD_RIGHT: xv = 1; break; case KeyEvent.KEYCODE_DPAD_UP: yv = -1; break; case KeyEvent.KEYCODE_DPAD_DOWN: yv = 1; break; case KeyEvent.KEYCODE_DPAD_CENTER: if (!mouseDown) { mouseDown = true; result = canvas.processPointerEvent(canvas.mouseX, canvas.mouseY, MotionEvent.ACTION_DOWN, evt.getMetaState(), mouseDown, canvas.cameraButtonDown); } break; default: result = activity.defaultKeyDownHandler(keyCode, evt); break; } if ((xv != 0 || yv != 0) && !isMoving) { final int x = xv; final int y = yv; isMoving = true; mouseMover.start(x, y, new Panner.VelocityUpdater() { /* * (non-Javadoc) * * @see android.androidVNC.Panner.VelocityUpdater#updateVelocity(android.graphics.Point, * long) */ @Override public boolean updateVelocity(PointF p, long interval) { double scale = (1.2 * (double) interval / 50.0); if (Math.abs(p.x) < 500) p.x += (int) (scale * x); if (Math.abs(p.y) < 500) p.y += (int) (scale * y); return true; } }); canvas.processPointerEvent(canvas.mouseX + x, canvas.mouseY + y, MotionEvent.ACTION_MOVE, evt.getMetaState(), mouseDown, canvas.cameraButtonDown); } return result; } public boolean onKeyUp(int keyCode, KeyEvent evt) { boolean result = false; switch (keyCode) { case KeyEvent.KEYCODE_DPAD_LEFT: case KeyEvent.KEYCODE_DPAD_RIGHT: case KeyEvent.KEYCODE_DPAD_UP: case KeyEvent.KEYCODE_DPAD_DOWN: mouseMover.stop(); isMoving = false; result = true; break; case KeyEvent.KEYCODE_DPAD_CENTER: if (mouseDown) { mouseDown = false; result = canvas.processPointerEvent(canvas.mouseX, canvas.mouseY, MotionEvent.ACTION_UP, evt.getMetaState(), mouseDown, canvas.cameraButtonDown); } else { result = true; } break; default: result = activity.defaultKeyUpHandler(keyCode, evt); break; } return result; } }