Add SavedStateHandle support to LinkPreviewViewModelV2.

This commit is contained in:
Alex Hart
2023-09-29 08:25:17 -04:00
committed by GitHub
parent f18a03ee6d
commit d46daed49a
21 changed files with 500 additions and 143 deletions

View File

@@ -1,11 +1,16 @@
package org.thoughtcrime.securesms.util
import androidx.activity.ComponentActivity
import androidx.activity.viewModels
import androidx.annotation.MainThread
import androidx.fragment.app.Fragment
import androidx.fragment.app.activityViewModels
import androidx.fragment.app.viewModels
import androidx.lifecycle.AbstractSavedStateViewModelFactory
import androidx.lifecycle.SavedStateHandle
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import androidx.savedstate.SavedStateRegistryOwner
/**
* Simplifies [ViewModel] creation by providing default implementations of [ViewModelProvider.Factory]
@@ -28,6 +33,25 @@ class ViewModelFactory<MODEL : ViewModel>(private val create: () -> MODEL) : Vie
}
}
class SavedStateViewModelFactory<MODEL : ViewModel>(
private val create: (SavedStateHandle) -> MODEL,
registryOwner: SavedStateRegistryOwner
) : AbstractSavedStateViewModelFactory(registryOwner, null) {
@Suppress("UNCHECKED_CAST")
override fun <T : ViewModel> create(key: String, modelClass: Class<T>, handle: SavedStateHandle): T {
return create(handle) as T
}
companion object {
fun <MODEL : ViewModel> factoryProducer(
create: (SavedStateHandle) -> MODEL,
registryOwnerProducer: () -> SavedStateRegistryOwner
): () -> ViewModelProvider.Factory {
return { SavedStateViewModelFactory(create, registryOwnerProducer()) }
}
}
}
@MainThread
inline fun <reified VM : ViewModel> Fragment.viewModel(
noinline create: () -> VM
@@ -37,6 +61,33 @@ inline fun <reified VM : ViewModel> Fragment.viewModel(
)
}
@MainThread
inline fun <reified VM : ViewModel> Fragment.savedStateViewModel(
noinline create: (SavedStateHandle) -> VM
): Lazy<VM> {
return viewModels(
factoryProducer = SavedStateViewModelFactory.factoryProducer(create) { this }
)
}
@MainThread
inline fun <reified VM : ViewModel> Fragment.activitySavedStateViewModel(
noinline create: (SavedStateHandle) -> VM
): Lazy<VM> {
return viewModels(
factoryProducer = SavedStateViewModelFactory.factoryProducer(create) { requireActivity() }
)
}
@MainThread
inline fun <reified VM : ViewModel> ComponentActivity.savedStateViewModel(
noinline create: (SavedStateHandle) -> VM
): Lazy<VM> {
return viewModels(
factoryProducer = SavedStateViewModelFactory.factoryProducer(create) { this }
)
}
@MainThread
inline fun <reified VM : ViewModel> Fragment.activityViewModel(
noinline create: () -> VM