/
ProgressLooper.kt
67 lines (54 loc) · 1.52 KB
/
ProgressLooper.kt
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
package expo.modules.av.progress
typealias TimeMachineTick = () -> Unit
interface TimeMachine {
fun scheduleAt(intervalMillis: Long, callback: TimeMachineTick)
val time: Long
}
typealias PlayerProgressListener = () -> Unit
class ProgressLooper(private val timeMachine: TimeMachine) {
private var interval = 0L
private var nextExpectedTick = -1L
private var waiting = false
private var shouldLoop: Boolean
get() = interval > 0 && nextExpectedTick >= 0 && !waiting
set(value) {
if (!value) {
interval = 0L
nextExpectedTick = -1L
waiting = false
}
}
private var listener: PlayerProgressListener? = null
fun setListener(listener: PlayerProgressListener) {
this.listener = listener
}
fun loop(interval: Long, listener: PlayerProgressListener) {
this.listener = listener
this.interval = interval
scheduleNextTick()
}
fun stopLooping() {
this.shouldLoop = false
this.listener = null
}
private fun scheduleNextTick() {
if (nextExpectedTick == -1L) {
nextExpectedTick = timeMachine.time
}
if (shouldLoop) {
nextExpectedTick += calculateNextInterval()
waiting = true
timeMachine.scheduleAt(nextExpectedTick - timeMachine.time) {
waiting = false
listener?.invoke()
scheduleNextTick()
}
}
}
private fun calculateNextInterval() =
if (nextExpectedTick > timeMachine.time) {
interval
} else {
(((timeMachine.time - nextExpectedTick) / interval) + 1) * interval
}
}