OLD | NEW |
1 // Copyright 2013 Google Inc. All Rights Reserved. | 1 // Copyright 2013 Google Inc. All Rights Reserved. |
2 // | 2 // |
3 // Licensed under the Apache License, Version 2.0 (the "License"); | 3 // Licensed under the Apache License, Version 2.0 (the "License"); |
4 // you may not use this file except in compliance with the License. | 4 // you may not use this file except in compliance with the License. |
5 // You may obtain a copy of the License at | 5 // You may obtain a copy of the License at |
6 // | 6 // |
7 // http://www.apache.org/licenses/LICENSE-2.0 | 7 // http://www.apache.org/licenses/LICENSE-2.0 |
8 // | 8 // |
9 // Unless required by applicable law or agreed to in writing, software | 9 // Unless required by applicable law or agreed to in writing, software |
10 // distributed under the License is distributed on an "AS IS" BASIS, | 10 // distributed under the License is distributed on an "AS IS" BASIS, |
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
12 // See the License for the specific language governing permissions and | 12 // See the License for the specific language governing permissions and |
13 // limitations under the License. | 13 // limitations under the License. |
14 | 14 |
15 part of quiver.async; | 15 part of quiver.async; |
16 | 16 |
17 /** | 17 /// A simple countdown timer that fires events in regular increments until a |
18 * A simple countdown timer that fires events in regular increments until a | 18 /// duration has passed. |
19 * duration has passed. | 19 /// |
20 * | 20 /// CountdownTimer implements [Stream] and sends itself as the event. From the |
21 * CountdownTimer implements [Stream] and sends itself as the event. From the | 21 /// timer you can get the [remaining] and [elapsed] time, or [cancel] the |
22 * timer you can get the [remaining] and [elapsed] time, or [cancel] the timer. | 22 /// timer. |
23 */ | |
24 class CountdownTimer extends Stream<CountdownTimer> { | 23 class CountdownTimer extends Stream<CountdownTimer> { |
25 static const _THRESHOLD_MS = 4; | 24 static const _THRESHOLD_MS = 4; |
26 | 25 |
27 final Duration _duration; | 26 final Duration _duration; |
28 final Duration _increment; | |
29 final Stopwatch _stopwatch; | 27 final Stopwatch _stopwatch; |
| 28 |
| 29 /// The duration between timer events. |
| 30 final Duration increment; |
30 final StreamController<CountdownTimer> _controller; | 31 final StreamController<CountdownTimer> _controller; |
31 Timer _timer; | 32 Timer _timer; |
32 | 33 |
33 /** | 34 /// Creates a new [CountdownTimer] that fires events in increments of |
34 * Creates a new [CountdownTimer] that fires events in increments of | 35 /// [increment], until the [duration] has passed. |
35 * [increment], until the [duration] has passed. | 36 /// |
36 * | 37 /// [stopwatch] is for testing purposes. If you're using CountdownTimer and |
37 * [stopwatch] is for testing purposes. If you're using CountdownTimer and | 38 /// need to control time in a test, pass a mock or a fake. See [FakeAsync] |
38 * need to control time in a test, pass a mock or a fake. See [FakeAsync] and | 39 /// and [FakeStopwatch]. |
39 * [FakeStopwatch]. | |
40 */ | |
41 CountdownTimer(Duration duration, Duration increment, {Stopwatch stopwatch}) | 40 CountdownTimer(Duration duration, Duration increment, {Stopwatch stopwatch}) |
42 : _duration = duration, | 41 : _duration = duration, |
43 _increment = increment, | 42 increment = increment, |
44 _stopwatch = stopwatch == null ? new Stopwatch() : stopwatch, | 43 _stopwatch = stopwatch == null ? new Stopwatch() : stopwatch, |
45 _controller = new StreamController<CountdownTimer>.broadcast( | 44 _controller = |
46 sync: true) { | 45 new StreamController<CountdownTimer>.broadcast(sync: true) { |
47 _timer = new Timer.periodic(increment, _tick); | 46 _timer = new Timer.periodic(increment, _tick); |
48 _stopwatch.start(); | 47 _stopwatch.start(); |
49 } | 48 } |
50 | 49 |
51 StreamSubscription<CountdownTimer> listen(void onData(CountdownTimer event), | 50 StreamSubscription<CountdownTimer> listen(void onData(CountdownTimer event), |
52 {Function onError, void onDone(), bool cancelOnError}) => | 51 {Function onError, void onDone(), bool cancelOnError}) => |
53 _controller.stream.listen(onData, onError: onError, onDone: onDone); | 52 _controller.stream.listen(onData, onError: onError, onDone: onDone); |
54 | 53 |
55 Duration get elapsed => _stopwatch.elapsed; | 54 Duration get elapsed => _stopwatch.elapsed; |
56 | 55 |
57 Duration get remaining => _duration - _stopwatch.elapsed; | 56 Duration get remaining => _duration - _stopwatch.elapsed; |
58 | 57 |
59 bool get isRunning => _stopwatch.isRunning; | 58 bool get isRunning => _stopwatch.isRunning; |
60 | 59 |
61 cancel() { | 60 cancel() { |
62 _stopwatch.stop(); | 61 _stopwatch.stop(); |
63 _timer.cancel(); | 62 _timer.cancel(); |
64 _controller.close(); | 63 _controller.close(); |
65 } | 64 } |
66 | 65 |
67 _tick(Timer timer) { | 66 _tick(Timer timer) { |
68 var t = remaining; | 67 var t = remaining; |
69 _controller.add(this); | 68 _controller.add(this); |
70 // timers may have a 4ms resolution | 69 // timers may have a 4ms resolution |
71 if (t.inMilliseconds < _THRESHOLD_MS) { | 70 if (t.inMilliseconds < _THRESHOLD_MS) { |
72 cancel(); | 71 cancel(); |
73 } | 72 } |
74 } | 73 } |
75 } | 74 } |
OLD | NEW |