/* * Copyright (C) 2020 Conny Duck * * This file is part of Pixelcat. * * Pixelcat is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Pixelcat is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ // from https://proandroiddev.com/viewmodel-with-dagger2-architecture-components-2e06f06c9455 package at.connyduck.pixelcat.dagger import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider import at.connyduck.pixelcat.components.compose.ComposeViewModel import at.connyduck.pixelcat.components.login.LoginViewModel import at.connyduck.pixelcat.components.main.MainViewModel import at.connyduck.pixelcat.components.notifications.NotificationsViewModel import at.connyduck.pixelcat.components.profile.ProfileViewModel import at.connyduck.pixelcat.components.search.SearchViewModel import at.connyduck.pixelcat.components.timeline.TimelineViewModel import dagger.Binds import dagger.MapKey import dagger.Module import dagger.multibindings.IntoMap import javax.inject.Inject import javax.inject.Provider import javax.inject.Singleton import kotlin.reflect.KClass @Singleton class ViewModelFactory @Inject constructor(private val viewModels: MutableMap, Provider>) : ViewModelProvider.Factory { @Suppress("UNCHECKED_CAST") override fun create(modelClass: Class): T = viewModels[modelClass]?.get() as T } @Target(AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY_GETTER, AnnotationTarget.PROPERTY_SETTER) @Retention(AnnotationRetention.RUNTIME) @MapKey internal annotation class ViewModelKey(val value: KClass) @Module abstract class ViewModelModule { @Binds internal abstract fun bindViewModelFactory(factory: ViewModelFactory): ViewModelProvider.Factory @Binds @IntoMap @ViewModelKey(LoginViewModel::class) internal abstract fun loginViewModel(viewModel: LoginViewModel): ViewModel @Binds @IntoMap @ViewModelKey(MainViewModel::class) internal abstract fun mainViewModel(viewModel: MainViewModel): ViewModel @Binds @IntoMap @ViewModelKey(TimelineViewModel::class) internal abstract fun timelineViewModel(viewModel: TimelineViewModel): ViewModel @Binds @IntoMap @ViewModelKey(SearchViewModel::class) internal abstract fun searchViewModel(viewModel: SearchViewModel): ViewModel @Binds @IntoMap @ViewModelKey(NotificationsViewModel::class) internal abstract fun notificationsViewModel(viewModel: NotificationsViewModel): ViewModel @Binds @IntoMap @ViewModelKey(ProfileViewModel::class) internal abstract fun profileViewModel(viewModel: ProfileViewModel): ViewModel @Binds @IntoMap @ViewModelKey(ComposeViewModel::class) internal abstract fun composeViewModel(viewModel: ComposeViewModel): ViewModel // Add more ViewModels here }