-
Notifications
You must be signed in to change notification settings - Fork 0
/
ProcessingTimer.pde
109 lines (93 loc) · 2.09 KB
/
ProcessingTimer.pde
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
105
106
107
108
109
class ProcessingTimer {
Timer timer;
TimerCallback callback;
TimerTask timerTask;
boolean isPaused;
long remainingTimeOnLastPause;
ProcessingTimer(TimerCallback callback) {
this.callback = callback;
this.isPaused = false;
}
TimerTask createTask() {
return new TimerTask() {
@Override
public void run() {
getCallback().expired();
}
};
}
TimerCallback getCallback() {
return this.callback;
}
private void schedule(long duration) {
this.timer = new Timer();
this.timerTask = createTask();
this.timer.schedule(timerTask, duration);
}
void start(long duration) {
if (timer != null) {
this.cancel();
}
this.schedule(duration);
}
int getRemaining() {
if (this.isPaused) {
return int(remainingTimeOnLastPause);
}
else {
long remainingTime = timerTask.scheduledExecutionTime() - System.currentTimeMillis();
if (remainingTime > 0)
return int(remainingTime);
else
return 0;
}
}
void cancel() {
if (isPaused) {
this.unpause();
}
this.timer.cancel();
}
boolean pause() {
int remaining = getRemaining();
if (remaining > 0 && ! isPaused) {
this.timer.cancel();
this.remainingTimeOnLastPause = remaining;
this.isPaused = true;
}
return isPaused;
}
boolean unpause() {
if (isPaused) {
schedule(this.remainingTimeOnLastPause);
this.isPaused = false;
}
return ! isPaused;
}
void modify(int modifiedDuration) {
long newDuration = getRemaining() + modifiedDuration;
this.cancel();
if (newDuration > 0) {
if (this.isPaused) {
remainingTimeOnLastPause = newDuration;
}
else {
this.schedule(newDuration);
}
}
else {
this.remainingTimeOnLastPause = 0;
this.isPaused = true;
this.callback.expired();
}
}
void add(int modifiedDuration) {
this.modify(modifiedDuration);
}
void subtract(int modifiedDuration) {
this.modify(modifiedDuration * -1);
}
}
interface TimerCallback {
void expired();
}