-
Notifications
You must be signed in to change notification settings - Fork 982
/
DelayedMapListener.java
104 lines (88 loc) · 2.66 KB
/
DelayedMapListener.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
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);
}
}
}
}