From 66f136903fa206e0d260480abb26397679b51517 Mon Sep 17 00:00:00 2001 From: Alex Hart Date: Mon, 10 Nov 2025 12:58:45 -0400 Subject: [PATCH] Ensure gift flow can be created from any fragment it's initialised in. --- .../gifts/flow/GiftFlowConfirmationFragment.kt | 13 ++++++------- .../flow/GiftFlowRecipientSelectionFragment.kt | 10 ++++++---- .../badges/gifts/flow/GiftFlowStartFragment.kt | 12 +++++------- .../badges/gifts/flow/GiftFlowViewModel.kt | 17 ++--------------- 4 files changed, 19 insertions(+), 33 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/badges/gifts/flow/GiftFlowConfirmationFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/badges/gifts/flow/GiftFlowConfirmationFragment.kt index 4def578a30..11cf9b89fe 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/badges/gifts/flow/GiftFlowConfirmationFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/badges/gifts/flow/GiftFlowConfirmationFragment.kt @@ -6,8 +6,8 @@ import android.widget.ImageView import android.widget.TextView import androidx.activity.OnBackPressedCallback import androidx.appcompat.app.AlertDialog +import androidx.fragment.app.activityViewModels import androidx.fragment.app.setFragmentResultListener -import androidx.fragment.app.viewModels import androidx.navigation.fragment.findNavController import com.google.android.material.button.MaterialButton import com.google.android.material.dialog.MaterialAlertDialogBuilder @@ -40,6 +40,7 @@ import org.thoughtcrime.securesms.keyboard.emoji.search.EmojiSearchFragment import org.thoughtcrime.securesms.payments.FiatMoneyUtil import org.thoughtcrime.securesms.payments.currency.CurrencyUtil import org.thoughtcrime.securesms.util.Debouncer +import org.thoughtcrime.securesms.util.activityViewModel import org.thoughtcrime.securesms.util.adapter.mapping.MappingAdapter import org.thoughtcrime.securesms.util.navigation.safeNavigate import java.math.BigDecimal @@ -57,13 +58,11 @@ class GiftFlowConfirmationFragment : EmojiSearchFragment.Callback, InAppPaymentCheckoutDelegate.Callback { - private val viewModel: GiftFlowViewModel by viewModels( - ownerProducer = { requireActivity() } - ) + private val viewModel: GiftFlowViewModel by activityViewModel { + GiftFlowViewModel() + } - private val keyboardPagerViewModel: KeyboardPagerViewModel by viewModels( - ownerProducer = { requireActivity() } - ) + private val keyboardPagerViewModel: KeyboardPagerViewModel by activityViewModels() private lateinit var inputAwareLayout: InputAwareLayout private lateinit var emojiKeyboard: MediaKeyboard diff --git a/app/src/main/java/org/thoughtcrime/securesms/badges/gifts/flow/GiftFlowRecipientSelectionFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/badges/gifts/flow/GiftFlowRecipientSelectionFragment.kt index d1c362ec83..909d7271b5 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/badges/gifts/flow/GiftFlowRecipientSelectionFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/badges/gifts/flow/GiftFlowRecipientSelectionFragment.kt @@ -7,7 +7,6 @@ import android.view.ViewGroup import androidx.appcompat.widget.Toolbar import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentManager -import androidx.fragment.app.viewModels import androidx.navigation.fragment.findNavController import org.signal.core.util.getParcelableArrayListCompat import org.thoughtcrime.securesms.R @@ -18,16 +17,19 @@ import org.thoughtcrime.securesms.conversation.mutiselect.forward.MultiselectFor import org.thoughtcrime.securesms.conversation.mutiselect.forward.MultiselectForwardFragmentArgs import org.thoughtcrime.securesms.conversation.mutiselect.forward.SearchConfigurationProvider import org.thoughtcrime.securesms.database.RecipientTable +import org.thoughtcrime.securesms.util.activityViewModel import org.thoughtcrime.securesms.util.navigation.safeNavigate +import org.thoughtcrime.securesms.util.viewModel +import kotlin.getValue /** * Allows the user to select a recipient to send a gift to. */ class GiftFlowRecipientSelectionFragment : Fragment(R.layout.gift_flow_recipient_selection_fragment), MultiselectForwardFragment.Callback, SearchConfigurationProvider { - private val viewModel: GiftFlowViewModel by viewModels( - ownerProducer = { requireActivity() } - ) + private val viewModel: GiftFlowViewModel by activityViewModel { + GiftFlowViewModel() + } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { val toolbar = view.findViewById(R.id.toolbar) diff --git a/app/src/main/java/org/thoughtcrime/securesms/badges/gifts/flow/GiftFlowStartFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/badges/gifts/flow/GiftFlowStartFragment.kt index c87aa9cda0..8d8b7d5965 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/badges/gifts/flow/GiftFlowStartFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/badges/gifts/flow/GiftFlowStartFragment.kt @@ -1,7 +1,6 @@ package org.thoughtcrime.securesms.badges.gifts.flow import android.view.View -import androidx.fragment.app.viewModels import androidx.navigation.fragment.findNavController import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import org.signal.core.util.DimensionUnit @@ -17,8 +16,10 @@ import org.thoughtcrime.securesms.components.settings.configure import org.thoughtcrime.securesms.components.settings.models.IndeterminateLoadingCircle import org.thoughtcrime.securesms.components.settings.models.SplashImage import org.thoughtcrime.securesms.util.ViewUtil +import org.thoughtcrime.securesms.util.activityViewModel import org.thoughtcrime.securesms.util.adapter.mapping.MappingAdapter import org.thoughtcrime.securesms.util.navigation.safeNavigate +import org.thoughtcrime.securesms.util.viewModel import java.util.concurrent.TimeUnit /** @@ -28,12 +29,9 @@ class GiftFlowStartFragment : DSLSettingsFragment( layoutId = R.layout.gift_flow_start_fragment ) { - private val viewModel: GiftFlowViewModel by viewModels( - ownerProducer = { requireActivity() }, - factoryProducer = { - GiftFlowViewModel.Factory(GiftFlowRepository()) - } - ) + private val viewModel: GiftFlowViewModel by activityViewModel { + GiftFlowViewModel() + } private val lifecycleDisposable = LifecycleDisposable() diff --git a/app/src/main/java/org/thoughtcrime/securesms/badges/gifts/flow/GiftFlowViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/badges/gifts/flow/GiftFlowViewModel.kt index fe7fb42777..c49b354dc9 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/badges/gifts/flow/GiftFlowViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/badges/gifts/flow/GiftFlowViewModel.kt @@ -1,7 +1,6 @@ package org.thoughtcrime.securesms.badges.gifts.flow import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import io.reactivex.rxjava3.core.Flowable import io.reactivex.rxjava3.core.Observable @@ -27,7 +26,7 @@ import java.util.Currency * Maintains state as a user works their way through the gift flow. */ class GiftFlowViewModel( - private val giftFlowRepository: GiftFlowRepository + private val giftFlowRepository: GiftFlowRepository = GiftFlowRepository() ) : ViewModel() { private val store = RxStore( @@ -159,18 +158,6 @@ class GiftFlowViewModel( } companion object { - private val TAG = Log.tag(GiftFlowViewModel::class.java) - } - - class Factory( - private val repository: GiftFlowRepository - ) : ViewModelProvider.Factory { - override fun create(modelClass: Class): T { - return modelClass.cast( - GiftFlowViewModel( - repository - ) - ) as T - } + private val TAG = Log.tag(GiftFlowViewModel::class) } }