mirror of
https://github.com/signalapp/Signal-Android.git
synced 2026-04-23 18:30:20 +01:00
Add SavedStateHandle support to LinkPreviewViewModelV2.
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user