diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationFragment.kt index 7f4a3d210f..502d451289 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationFragment.kt @@ -65,6 +65,7 @@ import androidx.lifecycle.DefaultLifecycleObserver import androidx.lifecycle.Lifecycle import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.Observer +import androidx.lifecycle.createSavedStateHandle import androidx.lifecycle.flowWithLifecycle import androidx.lifecycle.lifecycleScope import androidx.lifecycle.repeatOnLifecycle @@ -347,7 +348,6 @@ import org.thoughtcrime.securesms.util.hasLinkPreview import org.thoughtcrime.securesms.util.hasNonTextSlide import org.thoughtcrime.securesms.util.isValidReactionTarget import org.thoughtcrime.securesms.util.padding -import org.thoughtcrime.securesms.util.savedStateViewModel import org.thoughtcrime.securesms.util.setIncognitoKeyboardEnabled import org.thoughtcrime.securesms.util.toMillis import org.thoughtcrime.securesms.util.viewModel @@ -453,8 +453,8 @@ class ConversationFragment : ) } - private val linkPreviewViewModel: LinkPreviewViewModelV2 by savedStateViewModel { - LinkPreviewViewModelV2(it, enablePlaceholder = false) + private val linkPreviewViewModel: LinkPreviewViewModelV2 by viewModel { + LinkPreviewViewModelV2(it.createSavedStateHandle(), enablePlaceholder = false) } private val groupCallViewModel: ConversationGroupCallViewModel by viewModel { diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/text/TextStoryPostCreationFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/text/TextStoryPostCreationFragment.kt index 4d0c318c18..abf61f4932 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/text/TextStoryPostCreationFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/text/TextStoryPostCreationFragment.kt @@ -11,6 +11,7 @@ import androidx.core.view.postDelayed import androidx.core.view.updateLayoutParams import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels +import androidx.lifecycle.createSavedStateHandle import androidx.navigation.fragment.findNavController import com.google.android.material.dialog.MaterialAlertDialogBuilder import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers @@ -32,7 +33,7 @@ import org.thoughtcrime.securesms.mediasend.v2.text.send.TextStoryPostSendReposi import org.thoughtcrime.securesms.mediasend.v2.text.send.TextStoryPostSendResult import org.thoughtcrime.securesms.safety.SafetyNumberBottomSheet import org.thoughtcrime.securesms.stories.Stories -import org.thoughtcrime.securesms.util.activitySavedStateViewModel +import org.thoughtcrime.securesms.util.activityViewModel import org.thoughtcrime.securesms.util.visible import java.util.Optional @@ -56,8 +57,8 @@ class TextStoryPostCreationFragment : Fragment(R.layout.stories_text_post_creati } ) - private val linkPreviewViewModel: LinkPreviewViewModelV2 by activitySavedStateViewModel { handle -> - LinkPreviewViewModelV2(handle, enablePlaceholder = true) + private val linkPreviewViewModel: LinkPreviewViewModelV2 by activityViewModel { extras -> + LinkPreviewViewModelV2(extras.createSavedStateHandle(), enablePlaceholder = true) } private val lifecycleDisposable = LifecycleDisposable() diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/ViewModelFactory.kt b/app/src/main/java/org/thoughtcrime/securesms/util/ViewModelFactory.kt index 40de3c5f47..8d64ccba68 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/util/ViewModelFactory.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/util/ViewModelFactory.kt @@ -6,11 +6,9 @@ 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 +import androidx.lifecycle.viewmodel.CreationExtras /** * Simplifies [ViewModel] creation by providing default implementations of [ViewModelProvider.Factory] @@ -20,41 +18,22 @@ import androidx.savedstate.SavedStateRegistryOwner * * private val viewModel: MyViewModel by viewModels(factoryProducer = ViewModelFactory.factoryProducer { MyViewModel(inputParams) }) */ -class ViewModelFactory(private val create: () -> MODEL) : ViewModelProvider.Factory { +class ViewModelFactory(private val create: (CreationExtras) -> MODEL) : ViewModelProvider.Factory { @Suppress("UNCHECKED_CAST") - override fun create(modelClass: Class): T { - return create() as T + override fun create(modelClass: Class, extras: CreationExtras): T { + return create(extras) as T } companion object { - fun factoryProducer(create: () -> MODEL): () -> ViewModelProvider.Factory { + fun factoryProducer(create: (CreationExtras) -> MODEL): () -> ViewModelProvider.Factory { return { ViewModelFactory(create) } } } } -class SavedStateViewModelFactory( - private val create: (SavedStateHandle) -> MODEL, - registryOwner: SavedStateRegistryOwner -) : AbstractSavedStateViewModelFactory(registryOwner, null) { - @Suppress("UNCHECKED_CAST") - override fun create(key: String, modelClass: Class, handle: SavedStateHandle): T { - return create(handle) as T - } - - companion object { - fun factoryProducer( - create: (SavedStateHandle) -> MODEL, - registryOwnerProducer: () -> SavedStateRegistryOwner - ): () -> ViewModelProvider.Factory { - return { SavedStateViewModelFactory(create, registryOwnerProducer()) } - } - } -} - @MainThread inline fun ComponentActivity.viewModel( - noinline create: () -> VM + noinline create: (CreationExtras) -> VM ): Lazy { return viewModels( factoryProducer = ViewModelFactory.factoryProducer(create) @@ -63,51 +42,18 @@ inline fun ComponentActivity.viewModel( @MainThread inline fun Fragment.viewModel( - noinline create: () -> VM + noinline create: (CreationExtras) -> VM ): Lazy { return viewModels( factoryProducer = ViewModelFactory.factoryProducer(create) ) } -@MainThread -inline fun Fragment.savedStateViewModel( - noinline create: (SavedStateHandle) -> VM -): Lazy { - return viewModels( - factoryProducer = SavedStateViewModelFactory.factoryProducer(create) { this } - ) -} - -@MainThread -inline fun Fragment.activitySavedStateViewModel( - noinline create: (SavedStateHandle) -> VM -): Lazy { - return activityViewModels( - factoryProducer = SavedStateViewModelFactory.factoryProducer(create) { requireActivity() } - ) -} - -@MainThread -inline fun ComponentActivity.savedStateViewModel( - noinline create: (SavedStateHandle) -> VM -): Lazy { - return viewModels( - factoryProducer = SavedStateViewModelFactory.factoryProducer(create) { this } - ) -} - @MainThread inline fun Fragment.activityViewModel( - noinline create: () -> VM + noinline create: (CreationExtras) -> VM ): Lazy { return activityViewModels( factoryProducer = ViewModelFactory.factoryProducer(create) ) } - -@Suppress("ReplaceGetOrSet") -@MainThread -inline fun Fragment.createActivityViewModel(noinline create: () -> VM): VM { - return ViewModelProvider(requireActivity().viewModelStore, ViewModelFactory { create() }).get(VM::class.java) -}