-
Notifications
You must be signed in to change notification settings - Fork 174
/
scopes.kt
46 lines (39 loc) · 1.57 KB
/
scopes.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
package org.kodein.di.android.x
import androidx.lifecycle.DefaultLifecycleObserver
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleEventObserver
import androidx.lifecycle.LifecycleOwner
import org.kodein.di.bindings.*
import org.kodein.di.internal.synchronizedIfNull
import java.util.*
open class AndroidLifecycleScope private constructor(
private val newRegistry: () -> ScopeRegistry
) : Scope<LifecycleOwner>, DefaultLifecycleObserver {
companion object multiItem : AndroidLifecycleScope(::StandardScopeRegistry)
object singleItem : AndroidLifecycleScope(::SingleItemScopeRegistry)
private val map = HashMap<LifecycleOwner, ScopeRegistry>()
override fun getRegistry(context: LifecycleOwner): ScopeRegistry {
return synchronizedIfNull(
lock = map,
predicate = { map[context] },
ifNotNull = { it },
ifNull = {
val registry = newRegistry()
map[context] = registry
context.lifecycle.addObserver(
LifecycleEventObserver { _, event ->
if (event == Lifecycle.Event.ON_DESTROY) {
context.lifecycle.removeObserver(this)
registry.clear()
map.remove(context)
}
}
)
registry
}
)
}
override fun onDestroy(owner: LifecycleOwner) {
super.onDestroy(owner)
}
}