Fix MediaSelectionViewModel crash.

This commit is contained in:
Sagar
2025-04-28 19:30:58 +05:30
committed by GitHub
parent b6cc702107
commit a7ebe41570
2 changed files with 17 additions and 19 deletions

View File

@@ -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<ConstraintLayout.LayoutParams> {
@@ -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
}

View File

@@ -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) {