1
1
package com .omkarmoghe .pokemap .controllers ;
2
2
3
+ import android .os .CountDownTimer ;
3
4
import android .os .Handler ;
4
5
import android .os .HandlerThread ;
5
- import android .support . design . widget . TabLayout ;
6
+ import android .os . Message ;
6
7
import android .util .Log ;
7
8
8
- import com .omkarmoghe .pokemap .models .events .MarkerUpdateEvent ;
9
+ import com .omkarmoghe .pokemap .models .events .MarkerExpired ;
10
+ import com .omkarmoghe .pokemap .models .events .MarkerUpdate ;
11
+ import com .omkarmoghe .pokemap .models .map .PokemonMarkerExtended ;
9
12
10
13
import org .greenrobot .eventbus .EventBus ;
11
14
15
+ import java .sql .Time ;
16
+
12
17
/**
13
18
* Created by Rohan on 26-07-2016.
14
19
*/
@@ -18,38 +23,31 @@ public class MarkerRefreshController {
18
23
19
24
final private String TAG = MarkerRefreshController .class .getName ();
20
25
21
- private HandlerThread mThread ;
26
+ private static final int DEFAULT_UPDATE_INTERVAL = 1000 ;//1 seconds : heartbeat
27
+ private static final int MARKER_EXPIRED = 1 ;
28
+
22
29
private Handler mHandler ;
23
- private static final int DEFAULT_UPDATE_INTERVAL = 10 * 1000 ;//10 seconds : heartbeat
24
- private long updateInterval = DEFAULT_UPDATE_INTERVAL ;
25
- private MarkerUpdateEvent mEvent ;
26
- private Runnable markerExpiryUpdate ;
30
+ private CountDownTimer mTimer ;
27
31
28
32
private static MarkerRefreshController mInstance ;
29
33
30
34
private MarkerRefreshController () {
31
- if (mThread == null ) {
32
-
33
- mThread = new HandlerThread ("MarkerRefreshThread" );
34
- mThread .start ();
35
- mHandler = new Handler (mThread .getLooper ());
36
- mEvent = new MarkerUpdateEvent ();
37
- markerExpiryUpdate = new Runnable () {
38
- @ Override
39
- public void run ()
40
- {
41
- /**
42
- * Talking to:
43
- * {@link com.omkarmoghe.pokemap.views.map.MapWrapperFragment,}
44
- */
45
- EventBus .getDefault ().post (new MarkerUpdateEvent ());
35
+ Handler .Callback callback = new Handler .Callback () {
36
+ @ Override
37
+ public boolean handleMessage (Message message ) {
38
+ switch (message .what ) {
39
+ case MARKER_EXPIRED :
40
+ //If Marker Expired
41
+ if (message .obj instanceof PokemonMarkerExtended ) {
42
+ EventBus .getDefault ().post (new MarkerExpired ((PokemonMarkerExtended ) message .obj ));
43
+ return true ;
44
+ }
45
+ break ;
46
46
}
47
- };
48
-
49
- } else {
50
- throw new RuntimeException ("Invalid state of Marker Refresh Thread." );
51
- }
52
-
47
+ return false ;
48
+ }
49
+ };
50
+ mHandler = new Handler (callback );
53
51
}
54
52
55
53
/*
@@ -64,44 +62,58 @@ public static MarkerRefreshController getInstance() {
64
62
65
63
66
64
/**
67
- * Cleanup thread state.
68
- * Must ensure thread is properly quitting to allow safe reInit when needed
65
+ * Cleanup Messages and cancels the timer if it is running.
69
66
*/
70
67
public void clear () {
71
- if (mThread !=null ) {
72
- try {
73
- mThread .join ();
74
- mThread .quit (); //I don't need to process the scheduled messages in queue.
75
-
76
- } catch (InterruptedException e ) {
77
- Log .d (TAG , "Quitting too soon.. doing final cleanup" );
78
- } finally {
79
- mThread = null ;
80
- mInstance = null ;
81
- }
68
+ if (mTimer != null ){
69
+ mTimer .cancel ();
70
+ mTimer = null ;
82
71
}
72
+ mHandler .removeMessages (MARKER_EXPIRED );
73
+
83
74
}
84
75
85
- /**
86
- * Combo call for starting, resetting, refreshing, scheduling next update
87
- * Must be called separately after [@link notifyTimeToExpiry]
88
- */
89
- public void reset () {
90
- getInstance ().mHandler .removeCallbacks (markerExpiryUpdate );
91
- getInstance ().mHandler .postDelayed (markerExpiryUpdate , updateInterval );
92
- updateInterval = DEFAULT_UPDATE_INTERVAL ;
76
+ public void startTimer (long duration ){
77
+ if (mTimer != null ){
78
+ mTimer .cancel ();
79
+ }
80
+
81
+ if (duration <= 0 ) {
82
+ return ;
83
+ }
84
+
85
+ final MarkerUpdate event = new MarkerUpdate ();
86
+ mTimer = new CountDownTimer (duration , DEFAULT_UPDATE_INTERVAL ) {
87
+ @ Override
88
+ public void onTick (long l ) {
89
+ EventBus .getDefault ().post (event );
90
+ }
91
+
92
+ @ Override
93
+ public void onFinish () {
94
+ mTimer = null ;
95
+ EventBus .getDefault ().post (event );
96
+ }
97
+ };
98
+ mTimer .start ();
93
99
}
94
100
95
- /**
96
- * Hook to determine next closest expiration time.
97
- * Can be scheduled at regular intervals to use as a heartbeat.
98
- *
99
- * @param timeToExpiry
100
- */
101
- public void notifyTimeToExpiry (long timeToExpiry ) {
102
- if (updateInterval > timeToExpiry ) {
103
- updateInterval = timeToExpiry ;
101
+ public void stopTimer (){
102
+ if (mTimer != null ){
103
+ mTimer .cancel ();
104
+ mTimer = null ;
104
105
}
105
106
}
106
107
108
+ public void clearMessages (){
109
+ mHandler .removeMessages (MARKER_EXPIRED );
110
+ }
111
+
112
+ public void postMarker (PokemonMarkerExtended markerData ){
113
+ long time = markerData .getCatchablePokemon ().getExpirationTimestampMs () - System .currentTimeMillis ();
114
+ if (time > 0 ) {
115
+ Message message = mHandler .obtainMessage (MARKER_EXPIRED , markerData );
116
+ mHandler .sendMessageDelayed (message , time );
117
+ }
118
+ }
107
119
}
0 commit comments