Skip to content

Instantly share code, notes, and snippets.

@cuber5566
Created December 27, 2017 10:13
Show Gist options
  • Save cuber5566/a9be75c08d65cff5216ddb579f80d9aa to your computer and use it in GitHub Desktop.
Save cuber5566/a9be75c08d65cff5216ddb579f80d9aa to your computer and use it in GitHub Desktop.
class ViewModelFactory(
private val application: Application,
private val schedulerProvider: SchedulerProvider,
private val authRepository: AuthRepository,
private val loginRepository: LoginRepository,
private val forumRepository: ForumSource,
private val postRepository: PostSource,
private val commentRepository: CommentRepository
) : ViewModelProvider.NewInstanceFactory() {
@Suppress("UNCHECKED_CAST")
override fun <T : ViewModel?> create(modelClass: Class<T>): T {
return with(modelClass) {
when {
isAssignableFrom(MainViewModel::class.java) ->
MainViewModel(application, schedulerProvider, authRepository, loginRepository, forumRepository)
isAssignableFrom(PostListViewModel::class.java) ->
PostListViewModel(application, schedulerProvider, postRepository)
isAssignableFrom(PostDetailViewModel::class.java) ->
PostDetailViewModel(application, schedulerProvider, postRepository, commentRepository)
isAssignableFrom(LoginViewModel::class.java) ->
LoginViewModel(application, schedulerProvider, loginRepository)
else ->
throw IllegalArgumentException("Unknown ViewModel class: ${modelClass.name}")
}
} as T
}
companion object {
@SuppressLint("StaticFieldLeak")
@Volatile private var INSTANCE: ViewModelFactory? = null
fun getInstance(
application: Application,
schedulerProvider: SchedulerProvider = SchedulerProvider.getInstance(),
authRepository: AuthRepository = AuthRepository.getInstance(),
loginRepository: LoginRepository = LoginRepository.getInstance(),
forumRepository: ForumRepository = ForumRepository.getInstance(),
postRepository: PostRepository = PostRepository.getInstance(),
commentRepository: CommentRepository = CommentRepository.getInstance()
) = INSTANCE ?: synchronized(ViewModelFactory::class.java) {
INSTANCE ?: ViewModelFactory(
application = application,
schedulerProvider = schedulerProvider,
authRepository = authRepository,
loginRepository = loginRepository,
forumRepository = forumRepository,
postRepository = postRepository,
commentRepository = commentRepository
).also { INSTANCE = it }
}
@VisibleForTesting
fun destroyInstance() {
INSTANCE = null
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment