• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 package com.airbnb.lottie.sample.compose.dagger
2 
3 import androidx.activity.ComponentActivity
4 import com.airbnb.lottie.sample.compose.LottieComposeApplication
5 import com.airbnb.mvrx.MavericksState
6 import com.airbnb.mvrx.MavericksViewModel
7 import com.airbnb.mvrx.MavericksViewModelFactory
8 import com.airbnb.mvrx.ViewModelContext
9 
daggerMavericksViewModelFactorynull10 inline fun <reified VM : MavericksViewModel<S>, S : MavericksState> daggerMavericksViewModelFactory() =
11     DaggerMavericksViewModelFactory<VM, S>(VM::class.java)
12 
13 
14 class DaggerMavericksViewModelFactory<VM : MavericksViewModel<S>, S : MavericksState>(
15     private val viewModelClass: Class<out MavericksViewModel<S>>
16 ) : MavericksViewModelFactory<VM, S> {
17 
18     override fun create(viewModelContext: ViewModelContext, state: S): VM {
19         return createViewModel(viewModelContext.activity, state)
20     }
21 
22     private fun <VM : MavericksViewModel<S>, S : MavericksState> createViewModel(
23         fragmentActivity: ComponentActivity,
24         initialState: S
25     ): VM {
26         val viewModelFactoryMap = (fragmentActivity.application as LottieComposeApplication).component.viewModelFactories()
27         val viewModelFactory = viewModelFactoryMap[viewModelClass]
28 
29         @Suppress("UNCHECKED_CAST")
30         val castedViewModelFactory = viewModelFactory as? AssistedViewModelFactory<VM, S>
31         val viewModel = castedViewModelFactory?.create(initialState)
32         return viewModel as VM
33     }
34 }