package org.osmdroid.events;
import android.os.Handler;
import android.util.Log;
import org.osmdroid.api.IMapView;
/*
* A MapListener that aggregates multiple events called in quick succession.
* After an event arrives, if another event arrives within <code>delay</code> milliseconds,
* the original event is discarded. Otherwise, the event is propagated to the wrapped
* MapListener. Note: This class is not thread-safe.
*
* @author Theodore Hong
*/
public class DelayedMapListener implements MapListener {
/** Default listening delay */
protected static final int DEFAULT_DELAY = 100;
/** The wrapped MapListener */
MapListener wrappedListener;
/** Listening delay, in milliseconds */
protected long delay;
protected Handler handler;
protected CallbackTask callback;
/*
* @param wrappedListener The wrapped MapListener
*
* @param delay Listening delay, in milliseconds
*/
public DelayedMapListener(final MapListener wrappedListener, final long delay) {
this.wrappedListener = wrappedListener;
this.delay = delay;
this.handler = new Handler();
this.callback = null;
}
/*
* Constructor with default delay.
*
* @param wrappedListener The wrapped MapListener
*/
public DelayedMapListener(final MapListener wrappedListener) {
this(wrappedListener, DEFAULT_DELAY);
}
@Override
public boolean onScroll(final ScrollEvent event) {
dispatch(event);
return true;
}
@Override
public boolean onZoom(final ZoomEvent event) {
dispatch(event);
return true;
}
/*
* Process an incoming MapEvent.
*/
protected void dispatch(final MapEvent event) {
// cancel any pending callback
if (callback != null) {
handler.removeCallbacks(callback);
}
callback = new CallbackTask(event);
// set timer
handler.postDelayed(callback, delay);
}
// Callback tasks
private class CallbackTask implements Runnable {
private final MapEvent event;
public CallbackTask(final MapEvent event) {
this.event = event;
}
@Override
public void run() {
// do the callback
if (event instanceof ScrollEvent) {
wrappedListener.onScroll((ScrollEvent) event);
} else if (event instanceof ZoomEvent) {
wrappedListener.onZoom((ZoomEvent) event);
} else {
// unknown event; discard
Log.d(IMapView.LOGTAG,"Unknown event received: " + event);
}
}
}
}