/** * Copyright (C) 2009 Michael A. MacDonald */ package android.androidVNC; import android.graphics.PointF; import android.os.Handler; import android.os.SystemClock; import android.util.Log; /** * Handles panning the screen continuously over a period of time * @author Michael A. MacDonald */ class Panner implements Runnable { VncCanvasActivity activity; Handler handler; PointF velocity; long lastSent; VelocityUpdater updater; private static final String TAG = "PANNER"; /** * Specify how the panning velocity changes over time * @author Michael A. MacDonald */ interface VelocityUpdater { /** * Called approximately every 50 ms to update the velocity of panning * @param p X and Y components to update * @param interval Milliseconds since last update * @return False if the panning should stop immediately; true otherwise */ boolean updateVelocity(PointF p, long interval); } static class DefaultUpdater implements VelocityUpdater { static DefaultUpdater instance = new DefaultUpdater(); /** * Don't change velocity */ @Override public boolean updateVelocity(PointF p, long interval) { return true; } } Panner(VncCanvasActivity act, Handler hand) { activity = act; velocity = new PointF(); handler = hand; } void stop() { handler.removeCallbacks(this); } void start(float xv, float yv, VelocityUpdater update) { if (update == null) update = DefaultUpdater.instance; updater = update; velocity.x = xv; velocity.y = yv; //Log.v(TAG, String.format("pan start %f %f", velocity.x, velocity.y)); lastSent = SystemClock.uptimeMillis(); handler.postDelayed(this, 50); } /* (non-Javadoc) * @see java.lang.Runnable#run() */ @Override public void run() { long interval = SystemClock.uptimeMillis() - lastSent; lastSent += interval; double scale = (double)interval / 50.0; //Log.v(TAG, String.format("panning %f %d %d", scale, (int)((double)velocity.x * scale), (int)((double)velocity.y * scale))); if ( activity.vncCanvas.pan((int)((double)velocity.x * scale), (int)((double)velocity.y * scale))) { if (updater.updateVelocity(velocity, interval)) { handler.postDelayed(this, 50); } else { //Log.v(TAG, "Updater requests stop"); stop(); } } else { //Log.v(TAG, "Panning failed"); stop(); } } }