From a7ebe4157095cbc45f2cab9f69c0bb1ee99f8c3c Mon Sep 17 00:00:00 2001 From: Sagar <85388413+Sagar0-0@users.noreply.github.com> Date: Mon, 28 Apr 2025 19:30:58 +0530 Subject: [PATCH] Fix MediaSelectionViewModel crash. --- .../v2/gallery/MediaGalleryFragment.kt | 25 +++++-------------- .../gallery/MediaSelectionGalleryFragment.kt | 11 ++++++++ 2 files changed, 17 insertions(+), 19 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/gallery/MediaGalleryFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/gallery/MediaGalleryFragment.kt index d31f332e2e..d4d5e9f09e 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/gallery/MediaGalleryFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/gallery/MediaGalleryFragment.kt @@ -15,9 +15,7 @@ import androidx.lifecycle.MutableLiveData import androidx.lifecycle.map import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.ItemTouchHelper -import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import org.signal.core.util.Stopwatch -import org.signal.core.util.concurrent.LifecycleDisposable import org.thoughtcrime.securesms.R import org.thoughtcrime.securesms.components.recyclerview.GridDividerDecoration import org.thoughtcrime.securesms.conversation.ManageContextMenu @@ -25,7 +23,6 @@ import org.thoughtcrime.securesms.databinding.V2MediaGalleryFragmentBinding import org.thoughtcrime.securesms.mediasend.Media import org.thoughtcrime.securesms.mediasend.MediaRepository import org.thoughtcrime.securesms.mediasend.camerax.CameraXUtil -import org.thoughtcrime.securesms.mediasend.v2.MediaSelectionViewModel import org.thoughtcrime.securesms.mediasend.v2.review.MediaGalleryGridItemTouchListener import org.thoughtcrime.securesms.permissions.PermissionCompat import org.thoughtcrime.securesms.permissions.Permissions @@ -48,10 +45,6 @@ class MediaGalleryFragment : Fragment(R.layout.v2_media_gallery_fragment) { factoryProducer = { MediaGalleryViewModel.Factory(null, null, MediaGalleryRepository(requireContext(), MediaRepository())) } ) - private val sharedViewModel: MediaSelectionViewModel by viewModels( - ownerProducer = { requireActivity() } - ) - private lateinit var callbacks: Callbacks private var selectedMediaTouchHelper: ItemTouchHelper? = null @@ -59,11 +52,10 @@ class MediaGalleryFragment : Fragment(R.layout.v2_media_gallery_fragment) { private val galleryAdapter = MappingAdapter() private val selectedAdapter = MappingAdapter() + private val mediaGalleryGridItemTouchListener = MediaGalleryGridItemTouchListener() private val viewStateLiveData = MutableLiveData(ViewState()) - private val lifecycleDisposable = LifecycleDisposable() - private val onBackPressedCallback: OnBackPressedCallback = object : OnBackPressedCallback(false) { override fun handleOnBackPressed() { onBack() @@ -74,8 +66,6 @@ class MediaGalleryFragment : Fragment(R.layout.v2_media_gallery_fragment) { callbacks = requireListener() val binding = V2MediaGalleryFragmentBinding.bind(view) - lifecycleDisposable.bindTo(this) - SystemWindowInsetsSetter.attach(view, viewLifecycleOwner, WindowInsetsCompat.Type.navigationBars()) binding.mediaGalleryToolbar.updateLayoutParams { @@ -142,7 +132,6 @@ class MediaGalleryFragment : Fragment(R.layout.v2_media_gallery_fragment) { binding.mediaGallerySelected.adapter = selectedAdapter selectedMediaTouchHelper?.attachToRecyclerView(binding.mediaGallerySelected) - val mediaGalleryGridItemTouchListener = MediaGalleryGridItemTouchListener() val onDragSelectListener = object : MediaGalleryGridItemTouchListener.OnDragSelectListener { override fun onSelectionStarted(start: Int) { galleryAdapter.getModel(start).ifPresent { @@ -262,13 +251,6 @@ class MediaGalleryFragment : Fragment(R.layout.v2_media_gallery_fragment) { } requireActivity().onBackPressedDispatcher.addCallback(viewLifecycleOwner, onBackPressedCallback) - - lifecycleDisposable += sharedViewModel.mediaErrors - .observeOn(AndroidSchedulers.mainThread()) - .subscribe { - mediaGalleryGridItemTouchListener.stopAutoScroll() - mediaGalleryGridItemTouchListener.setIsActive(false) - } } override fun onResume() { @@ -330,6 +312,11 @@ class MediaGalleryFragment : Fragment(R.layout.v2_media_gallery_fragment) { viewStateLiveData.value = state } + fun onMediaErrorOccurred() { + mediaGalleryGridItemTouchListener.stopAutoScroll() + mediaGalleryGridItemTouchListener.setIsActive(false) + } + fun bindSelectedMediaItemDragHelper(helper: ItemTouchHelper) { selectedMediaTouchHelper = helper } diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/gallery/MediaSelectionGalleryFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/gallery/MediaSelectionGalleryFragment.kt index a3cb746e7b..2335275e38 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/gallery/MediaSelectionGalleryFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/gallery/MediaSelectionGalleryFragment.kt @@ -7,6 +7,8 @@ import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels import androidx.navigation.fragment.findNavController import androidx.recyclerview.widget.ItemTouchHelper +import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers +import org.signal.core.util.concurrent.LifecycleDisposable import org.thoughtcrime.securesms.R import org.thoughtcrime.securesms.mediasend.Media import org.thoughtcrime.securesms.mediasend.v2.MediaSelectionNavigator @@ -29,6 +31,8 @@ class MediaSelectionGalleryFragment : Fragment(R.layout.fragment_container), Med ownerProducer = { requireActivity() } ) + private val lifecycleDisposable = LifecycleDisposable() + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { val args = arguments val isFirst = when { @@ -38,6 +42,7 @@ class MediaSelectionGalleryFragment : Fragment(R.layout.fragment_container), Med else -> false } + lifecycleDisposable.bindTo(this) sharedViewModel.setSuppressEmptyError(isFirst) mediaGalleryFragment = ensureMediaGalleryFragment() @@ -47,6 +52,12 @@ class MediaSelectionGalleryFragment : Fragment(R.layout.fragment_container), Med mediaGalleryFragment.onViewStateUpdated(MediaGalleryFragment.ViewState(state.selectedMedia)) } + lifecycleDisposable += sharedViewModel.mediaErrors + .observeOn(AndroidSchedulers.mainThread()) + .subscribe { + mediaGalleryFragment.onMediaErrorOccurred() + } + requireActivity().onBackPressedDispatcher.addCallback( viewLifecycleOwner, object : OnBackPressedCallback(true) {