forked from splendo/kaluga
-
Notifications
You must be signed in to change notification settings - Fork 0
/
ViewModel.kt
79 lines (64 loc) · 2.38 KB
/
ViewModel.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
/*
Copyright 2020 Splendo Consulting B.V. The Netherlands
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package com.splendo.kaluga.architecture.viewmodel
import com.splendo.kaluga.architecture.navigation.NavigationAction
import com.splendo.kaluga.architecture.navigation.Navigator
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.SupervisorJob
import kotlinx.coroutines.cancelChildren
/**
* Simple ViewModel class
*/
expect open class ViewModel internal constructor(allowFreezing: Boolean = false) {
/**
* [CoroutineScope] of the ViewModel
*/
val coroutineScope: CoroutineScope
/**
* Called when the ViewModel is cleared
*/
protected open fun onCleared()
}
/**
* Default [ViewModel] implementation respecting the Lifecycle of the presenting view
*/
open class BaseViewModel(allowFreezing: Boolean = false) : ViewModel(allowFreezing) {
private val resumedJobs = SupervisorJob()
/**
* Function to be called when the presenting views lifecycle begins
*/
fun didResume() {
onResume(CoroutineScope(coroutineScope.coroutineContext + resumedJobs))
}
/**
* Custom handler when the presenting views lifecycle begins
* @param scope A [CoroutineScope] that lives during the lifecycle of the presenting view
*/
protected open fun onResume(scope: CoroutineScope) {}
/**
* Function to be called when the presenting views lifecycle ends
*/
fun didPause() {
onPause()
resumedJobs.cancelChildren()
}
/**
* Custom handler when the presenting views lifecycle ends
*/
protected open fun onPause() {}
}
/**
* Default [ViewModel] allowing navigation
* @param navigator The [Navigator] handling navigation
*/
open class NavigatingViewModel<A : NavigationAction<*>>(val navigator: Navigator<A>, allowFreezing: Boolean = false) : BaseViewModel(allowFreezing)