package com.mapbox.mapboxsdk.events;
import android.os.Handler;
import android.util.Log;
/**
* 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.]
*/
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 aWrappedListener The wrapped MapListener
* @param aDelay Listening delay, in milliseconds
*/
public DelayedMapListener(final MapListener aWrappedListener, final long aDelay) {
this.wrappedListener = aWrappedListener;
this.delay = aDelay;
this.handler = new Handler();
this.callback = null;
}
/**
* Constructor with default delay.
*
* @param aWrappedListener The wrapped MapListener
*/
public DelayedMapListener(final MapListener aWrappedListener) {
this(aWrappedListener, DEFAULT_DELAY);
}
@Override
public void onScroll(final ScrollEvent event) {
dispatch(event);
}
@Override
public void onZoom(final ZoomEvent event) {
dispatch(event);
}
@Override
public void onRotate(RotateEvent event) {
dispatch(event);
}
/*
* 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 if (event instanceof RotateEvent) {
wrappedListener.onRotate((RotateEvent) event);
} else {
// unknown event; discard
Log.i(TAG, "Unknown event received: " + event);
}
}
}
private static final String TAG = "DelayedMapListener";
}