Coverage Summary for Class: RootViewModelImpl (com.vsevolodganin.clicktrack)
Class |
Method, %
|
Branch, %
|
Line, %
|
Instruction, %
|
RootViewModelImpl |
0%
(0/6)
|
|
0%
(0/20)
|
0%
(0/116)
|
RootViewModelImpl$implementDrawerBackCallback$1 |
0%
(0/1)
|
|
0%
(0/1)
|
0%
(0/24)
|
RootViewModelImpl$implementDrawerBackCallback$1$1 |
0%
(0/1)
|
|
0%
(0/1)
|
0%
(0/5)
|
RootViewModelImpl$implementScreenStackBackCallback$callback$1 |
0%
(0/1)
|
|
0%
(0/1)
|
0%
(0/5)
|
RootViewModelImpl$implementScreenStackBackCallback$callback$1$invoke$$inlined$pop$default$1 |
0%
(0/1)
|
|
RootViewModelImpl$implementScreenStackBackCallback$callback$1$invoke$$inlined$pop$default$2 |
0%
(0/1)
|
|
Total |
0%
(0/11)
|
|
0%
(0/23)
|
0%
(0/150)
|
package com.vsevolodganin.clicktrack
import com.arkivanov.decompose.ComponentContext
import com.arkivanov.decompose.router.stack.pop
import com.arkivanov.decompose.value.subscribe
import com.arkivanov.essenty.backhandler.BackCallback
import com.vsevolodganin.clicktrack.di.component.MainControllerScope
import com.vsevolodganin.clicktrack.drawer.DrawerNavigation
import com.vsevolodganin.clicktrack.drawer.DrawerViewModel
import com.vsevolodganin.clicktrack.utils.decompose.coroutineScope
import kotlinx.coroutines.CoroutineStart
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import me.tatarka.inject.annotations.Inject
@MainControllerScope
@Inject
class RootViewModelImpl(
private val componentContext: ComponentContext,
private val drawerViewModel: DrawerViewModel,
private val drawerNavigation: DrawerNavigation,
private val screenStackNavigation: ScreenStackNavigation,
private val screenStackState: ScreenStackState,
) : RootViewModel, ComponentContext by componentContext {
private val scope = coroutineScope()
override val drawer get() = drawerViewModel
override val screens get() = screenStackState
init {
// Order is important: latter takes higher precedence
implementScreenStackBackCallback()
implementDrawerBackCallback()
}
private fun implementScreenStackBackCallback() {
val callback = BackCallback(isEnabled = screenStackState.value.backStack.isNotEmpty(), onBack = screenStackNavigation::pop)
screenStackState.subscribe(lifecycle) { state ->
callback.isEnabled = state.backStack.isNotEmpty()
}
backHandler.register(callback)
}
private fun implementDrawerBackCallback() {
val callback = BackCallback(isEnabled = drawerViewModel.state.value.isOpened, onBack = drawerNavigation::closeDrawer)
scope.launch(context = Dispatchers.Unconfined, start = CoroutineStart.UNDISPATCHED) {
drawerViewModel.state.collect { state ->
callback.isEnabled = state.isOpened
}
}
backHandler.register(callback)
}
}