blob: 2685c735e8eb615a078a04c19103ea6257e9862f [file] [log] [blame]
package com.airbnb.lottie.sample.compose.dagger
import androidx.fragment.app.FragmentActivity
import com.airbnb.lottie.sample.compose.LottieComposeApplication
import com.airbnb.mvrx.MavericksViewModel
import com.airbnb.mvrx.MvRxState
import com.airbnb.mvrx.MvRxViewModelFactory
import com.airbnb.mvrx.ViewModelContext
abstract class DaggerMvRxViewModelFactory<VM : MavericksViewModel<S>, S : MvRxState>(
private val viewModelClass: Class<out MavericksViewModel<S>>
) : MvRxViewModelFactory<VM, S> {
override fun create(viewModelContext: ViewModelContext, state: S): VM? {
return createViewModel(viewModelContext.activity, state)
}
private fun <VM : MavericksViewModel<S>, S : MvRxState> createViewModel(fragmentActivity: FragmentActivity, 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
}
}