-
Notifications
You must be signed in to change notification settings - Fork 318
/
MapboxLifecycleExtensions.kt
128 lines (110 loc) · 4.12 KB
/
MapboxLifecycleExtensions.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
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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
package com.mapbox.navigation.core.internal.extensions
import androidx.lifecycle.DefaultLifecycleObserver
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleEventObserver
import androidx.lifecycle.LifecycleOwner
import com.mapbox.navigation.base.ExperimentalPreviewMapboxNavigationAPI
import com.mapbox.navigation.core.MapboxNavigation
import com.mapbox.navigation.core.lifecycle.MapboxNavigationApp
import com.mapbox.navigation.core.lifecycle.MapboxNavigationObserver
@ExperimentalPreviewMapboxNavigationAPI
fun <T : MapboxNavigationObserver> LifecycleOwner.attachCreated(vararg observers: T) = apply {
lifecycle.addObserver(object : DefaultLifecycleObserver {
override fun onCreate(owner: LifecycleOwner) {
observers.forEach { MapboxNavigationApp.registerObserver(it) }
}
override fun onDestroy(owner: LifecycleOwner) {
observers.forEach { MapboxNavigationApp.unregisterObserver(it) }
}
})
}
@ExperimentalPreviewMapboxNavigationAPI
fun <T : MapboxNavigationObserver> LifecycleOwner.attachStarted(vararg observers: T) = apply {
lifecycle.addObserver(object : DefaultLifecycleObserver {
override fun onStart(owner: LifecycleOwner) {
observers.forEach { MapboxNavigationApp.registerObserver(it) }
}
override fun onStop(owner: LifecycleOwner) {
observers.forEach { MapboxNavigationApp.unregisterObserver(it) }
}
override fun onDestroy(owner: LifecycleOwner) {
observers.forEach { MapboxNavigationApp.unregisterObserver(it) }
}
})
}
@ExperimentalPreviewMapboxNavigationAPI
fun <T : MapboxNavigationObserver> LifecycleOwner.attachResumed(vararg observers: T) = apply {
lifecycle.addObserver(object : DefaultLifecycleObserver {
override fun onResume(owner: LifecycleOwner) {
observers.forEach { MapboxNavigationApp.registerObserver(it) }
}
override fun onPause(owner: LifecycleOwner) {
observers.forEach { MapboxNavigationApp.unregisterObserver(it) }
}
override fun onDestroy(owner: LifecycleOwner) {
observers.forEach { MapboxNavigationApp.unregisterObserver(it) }
}
})
}
@ExperimentalPreviewMapboxNavigationAPI
fun LifecycleOwner.attachCreated(
mapboxNavigation: MapboxNavigation,
observer: MapboxNavigationObserver
) = attachOnLifecycle(
Lifecycle.Event.ON_CREATE,
Lifecycle.Event.ON_DESTROY,
mapboxNavigation,
observer
)
@ExperimentalPreviewMapboxNavigationAPI
fun LifecycleOwner.attachStarted(
mapboxNavigation: MapboxNavigation,
observer: MapboxNavigationObserver
) = attachOnLifecycle(
Lifecycle.Event.ON_START,
Lifecycle.Event.ON_STOP,
mapboxNavigation,
observer
)
@ExperimentalPreviewMapboxNavigationAPI
fun LifecycleOwner.attachResumed(
mapboxNavigation: MapboxNavigation,
observer: MapboxNavigationObserver
) = attachOnLifecycle(
Lifecycle.Event.ON_RESUME,
Lifecycle.Event.ON_PAUSE,
mapboxNavigation,
observer
)
@ExperimentalPreviewMapboxNavigationAPI
fun LifecycleOwner.attachOnLifecycle(
attachEvent: Lifecycle.Event,
detachEvent: Lifecycle.Event,
mapboxNavigation: MapboxNavigation,
observer: MapboxNavigationObserver
) {
lifecycle.addObserver(AttachOnLifecycle(attachEvent, detachEvent, mapboxNavigation, observer))
}
@ExperimentalPreviewMapboxNavigationAPI
internal class AttachOnLifecycle(
private val attachEvent: Lifecycle.Event,
private val detachEvent: Lifecycle.Event,
private val mapboxNavigation: MapboxNavigation,
private val observer: MapboxNavigationObserver
) : LifecycleEventObserver {
private var attached = false
override fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event) {
if (event == attachEvent) attach()
if (event == detachEvent || event == Lifecycle.Event.ON_DESTROY) detach()
}
private fun attach() {
if (attached) return
attached = true
observer.onAttached(mapboxNavigation)
}
private fun detach() {
if (!attached) return
attached = false
observer.onDetached(mapboxNavigation)
}
}