blob: 4f1c3ae4bbd3d86e6c44e5cfd94751b04f1c7793 [file] [log] [blame]
package com.airbnb.lottie.sample.compose.dagger
import androidx.activity.ComponentActivity
import com.airbnb.lottie.sample.compose.LottieComposeApplication
import com.airbnb.mvrx.MavericksState
import com.airbnb.mvrx.MavericksViewModel
import com.airbnb.mvrx.MavericksViewModelFactory
import com.airbnb.mvrx.ViewModelContext
inline fun <reified VM : MavericksViewModel<S>, S : MavericksState> daggerMavericksViewModelFactory() =
DaggerMavericksViewModelFactory<VM, S>(VM::class.java)
class DaggerMavericksViewModelFactory<VM : MavericksViewModel<S>, S : MavericksState>(
private val viewModelClass: Class<out MavericksViewModel<S>>
) : MavericksViewModelFactory<VM, S> {
override fun create(viewModelContext: ViewModelContext, state: S): VM {
return createViewModel(viewModelContext.activity, state)
}
private fun <VM : MavericksViewModel<S>, S : MavericksState> createViewModel(
fragmentActivity: ComponentActivity,
initialState: S
): VM {
val viewModelFactoryMap = (fragmentActivity.application as LottieComposeApplication).component.viewModelFactories()
val viewModelFactory = viewModelFactoryMap[viewModelClass]
@Suppress("UNCHECKED_CAST")
val castedViewModelFactory = viewModelFactory as? AssistedViewModelFactory<VM, S>
val viewModel = castedViewModelFactory?.create(initialState)
return viewModel as VM
}
}