Remove duplicate error handling in MediaSelection.

This commit is contained in:
Sagar
2025-04-09 19:24:53 +05:30
committed by Michelle Tang
parent d81616d23c
commit 6afeb45f43
3 changed files with 26 additions and 54 deletions

View File

@@ -8,6 +8,7 @@ import android.os.Bundle
import android.view.KeyEvent import android.view.KeyEvent
import android.widget.FrameLayout import android.widget.FrameLayout
import android.widget.TextView import android.widget.TextView
import android.widget.Toast
import androidx.activity.OnBackPressedCallback import androidx.activity.OnBackPressedCallback
import androidx.activity.viewModels import androidx.activity.viewModels
import androidx.appcompat.app.AppCompatDelegate import androidx.appcompat.app.AppCompatDelegate
@@ -21,8 +22,10 @@ import androidx.navigation.fragment.NavHostFragment
import androidx.transition.AutoTransition import androidx.transition.AutoTransition
import androidx.transition.TransitionManager import androidx.transition.TransitionManager
import com.google.android.material.animation.ArgbEvaluatorCompat import com.google.android.material.animation.ArgbEvaluatorCompat
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
import org.signal.core.util.BreakIteratorCompat import org.signal.core.util.BreakIteratorCompat
import org.signal.core.util.OVERRIDE_TRANSITION_CLOSE_COMPAT import org.signal.core.util.OVERRIDE_TRANSITION_CLOSE_COMPAT
import org.signal.core.util.concurrent.LifecycleDisposable
import org.signal.core.util.getParcelableArrayListExtraCompat import org.signal.core.util.getParcelableArrayListExtraCompat
import org.signal.core.util.getParcelableExtraCompat import org.signal.core.util.getParcelableExtraCompat
import org.signal.core.util.logging.Log import org.signal.core.util.logging.Log
@@ -64,6 +67,8 @@ class MediaSelectionActivity :
lateinit var viewModel: MediaSelectionViewModel lateinit var viewModel: MediaSelectionViewModel
private val lifecycleDisposable = LifecycleDisposable()
private val textViewModel: TextStoryPostCreationViewModel by viewModels( private val textViewModel: TextStoryPostCreationViewModel by viewModels(
factoryProducer = { factoryProducer = {
TextStoryPostCreationViewModel.Factory(TextStoryPostSendRepository()) TextStoryPostCreationViewModel.Factory(TextStoryPostSendRepository())
@@ -172,9 +177,30 @@ class MediaSelectionActivity :
} }
} }
lifecycleDisposable.bindTo(this)
lifecycleDisposable += viewModel.mediaErrors
.observeOn(AndroidSchedulers.mainThread())
.subscribe(this::handleError)
onBackPressedDispatcher.addCallback(OnBackPressed()) onBackPressedDispatcher.addCallback(OnBackPressed())
} }
private fun handleError(error: MediaValidator.FilterError) {
when (error) {
MediaValidator.FilterError.None -> return
MediaValidator.FilterError.ItemTooLarge -> Toast.makeText(this, R.string.MediaReviewFragment__one_or_more_items_were_too_large, Toast.LENGTH_SHORT).show()
MediaValidator.FilterError.ItemInvalidType -> Toast.makeText(this, R.string.MediaReviewFragment__one_or_more_items_were_invalid, Toast.LENGTH_SHORT).show()
MediaValidator.FilterError.TooManyItems -> Toast.makeText(this, R.string.MediaReviewFragment__too_many_items_selected, Toast.LENGTH_SHORT).show()
is MediaValidator.FilterError.NoItems -> {
if (error.cause != null) {
handleError(error.cause)
}
}
}
viewModel.clearMediaErrors()
}
private fun animateTextStyling(selectedSwitch: TextView, unselectedSwitch: TextView, duration: Long) { private fun animateTextStyling(selectedSwitch: TextView, unselectedSwitch: TextView, duration: Long) {
val offTextColor = ContextCompat.getColor(this, R.color.signal_colorOnSurface) val offTextColor = ContextCompat.getColor(this, R.color.signal_colorOnSurface)
val onTextColor = ContextCompat.getColor(this, R.color.signal_colorSecondaryContainer) val onTextColor = ContextCompat.getColor(this, R.color.signal_colorSecondaryContainer)

View File

@@ -2,20 +2,16 @@ package org.thoughtcrime.securesms.mediasend.v2.gallery
import android.os.Bundle import android.os.Bundle
import android.view.View import android.view.View
import android.widget.Toast
import androidx.activity.OnBackPressedCallback import androidx.activity.OnBackPressedCallback
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.fragment.app.viewModels import androidx.fragment.app.viewModels
import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.findNavController
import androidx.recyclerview.widget.ItemTouchHelper 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.R
import org.thoughtcrime.securesms.mediasend.Media import org.thoughtcrime.securesms.mediasend.Media
import org.thoughtcrime.securesms.mediasend.v2.MediaSelectionNavigator import org.thoughtcrime.securesms.mediasend.v2.MediaSelectionNavigator
import org.thoughtcrime.securesms.mediasend.v2.MediaSelectionNavigator.Companion.requestPermissionsForCamera import org.thoughtcrime.securesms.mediasend.v2.MediaSelectionNavigator.Companion.requestPermissionsForCamera
import org.thoughtcrime.securesms.mediasend.v2.MediaSelectionViewModel import org.thoughtcrime.securesms.mediasend.v2.MediaSelectionViewModel
import org.thoughtcrime.securesms.mediasend.v2.MediaValidator
import org.thoughtcrime.securesms.mediasend.v2.review.MediaSelectionItemTouchHelper import org.thoughtcrime.securesms.mediasend.v2.review.MediaSelectionItemTouchHelper
import org.thoughtcrime.securesms.permissions.Permissions import org.thoughtcrime.securesms.permissions.Permissions
@@ -25,8 +21,6 @@ class MediaSelectionGalleryFragment : Fragment(R.layout.fragment_container), Med
private lateinit var mediaGalleryFragment: MediaGalleryFragment private lateinit var mediaGalleryFragment: MediaGalleryFragment
private val lifecycleDisposable = LifecycleDisposable()
private val navigator = MediaSelectionNavigator( private val navigator = MediaSelectionNavigator(
toCamera = R.id.action_mediaGalleryFragment_to_mediaCaptureFragment toCamera = R.id.action_mediaGalleryFragment_to_mediaCaptureFragment
) )
@@ -61,27 +55,6 @@ class MediaSelectionGalleryFragment : Fragment(R.layout.fragment_container), Med
} }
} }
) )
lifecycleDisposable.bindTo(viewLifecycleOwner)
lifecycleDisposable += sharedViewModel.mediaErrors
.observeOn(AndroidSchedulers.mainThread())
.subscribe(this::handleError)
}
private fun handleError(error: MediaValidator.FilterError) {
when (error) {
MediaValidator.FilterError.None -> return
MediaValidator.FilterError.ItemTooLarge -> Toast.makeText(requireContext(), R.string.MediaReviewFragment__one_or_more_items_were_too_large, Toast.LENGTH_SHORT).show()
MediaValidator.FilterError.ItemInvalidType -> Toast.makeText(requireContext(), R.string.MediaReviewFragment__one_or_more_items_were_invalid, Toast.LENGTH_SHORT).show()
MediaValidator.FilterError.TooManyItems -> Toast.makeText(requireContext(), R.string.MediaReviewFragment__too_many_items_selected, Toast.LENGTH_SHORT).show()
is MediaValidator.FilterError.NoItems -> {
if (error.cause != null) {
handleError(error.cause)
}
}
}
sharedViewModel.clearMediaErrors()
} }
private fun ensureMediaGalleryFragment(): MediaGalleryFragment { private fun ensureMediaGalleryFragment(): MediaGalleryFragment {

View File

@@ -16,7 +16,6 @@ import android.view.ViewGroup
import android.widget.ImageView import android.widget.ImageView
import android.widget.ProgressBar import android.widget.ProgressBar
import android.widget.TextView import android.widget.TextView
import android.widget.Toast
import android.widget.ViewSwitcher import android.widget.ViewSwitcher
import androidx.activity.OnBackPressedCallback import androidx.activity.OnBackPressedCallback
import androidx.constraintlayout.widget.ConstraintLayout import androidx.constraintlayout.widget.ConstraintLayout
@@ -32,7 +31,6 @@ import androidx.recyclerview.widget.RecyclerView
import androidx.viewpager2.widget.ViewPager2 import androidx.viewpager2.widget.ViewPager2
import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.google.android.material.imageview.ShapeableImageView import com.google.android.material.imageview.ShapeableImageView
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
import org.signal.core.util.bytes import org.signal.core.util.bytes
import org.signal.core.util.concurrent.LifecycleDisposable import org.signal.core.util.concurrent.LifecycleDisposable
import org.signal.core.util.concurrent.SimpleTask import org.signal.core.util.concurrent.SimpleTask
@@ -53,7 +51,6 @@ import org.thoughtcrime.securesms.mediasend.v2.MediaAnimations
import org.thoughtcrime.securesms.mediasend.v2.MediaSelectionNavigator import org.thoughtcrime.securesms.mediasend.v2.MediaSelectionNavigator
import org.thoughtcrime.securesms.mediasend.v2.MediaSelectionState import org.thoughtcrime.securesms.mediasend.v2.MediaSelectionState
import org.thoughtcrime.securesms.mediasend.v2.MediaSelectionViewModel import org.thoughtcrime.securesms.mediasend.v2.MediaSelectionViewModel
import org.thoughtcrime.securesms.mediasend.v2.MediaValidator
import org.thoughtcrime.securesms.mediasend.v2.stories.StoriesMultiselectForwardActivity import org.thoughtcrime.securesms.mediasend.v2.stories.StoriesMultiselectForwardActivity
import org.thoughtcrime.securesms.mms.MediaConstraints import org.thoughtcrime.securesms.mms.MediaConstraints
import org.thoughtcrime.securesms.mms.SentMediaQuality import org.thoughtcrime.securesms.mms.SentMediaQuality
@@ -368,11 +365,6 @@ class MediaReviewFragment : Fragment(R.layout.v2_media_review_fragment), Schedul
computeViewStateAndAnimate(state) computeViewStateAndAnimate(state)
} }
disposables.bindTo(viewLifecycleOwner)
disposables += sharedViewModel.mediaErrors
.observeOn(AndroidSchedulers.mainThread())
.subscribe(this::handleMediaValidatorFilterError)
requireActivity().onBackPressedDispatcher.addCallback( requireActivity().onBackPressedDispatcher.addCallback(
viewLifecycleOwner, viewLifecycleOwner,
object : OnBackPressedCallback(true) { object : OnBackPressedCallback(true) {
@@ -442,25 +434,6 @@ class MediaReviewFragment : Fragment(R.layout.v2_media_review_fragment), Schedul
Permissions.onRequestPermissionsResult(this, requestCode, permissions, grantResults) Permissions.onRequestPermissionsResult(this, requestCode, permissions, grantResults)
} }
private fun handleMediaValidatorFilterError(error: MediaValidator.FilterError) {
when (error) {
MediaValidator.FilterError.None -> return
MediaValidator.FilterError.ItemTooLarge -> Toast.makeText(requireContext(), R.string.MediaReviewFragment__one_or_more_items_were_too_large, Toast.LENGTH_SHORT).show()
MediaValidator.FilterError.ItemInvalidType -> Toast.makeText(requireContext(), R.string.MediaReviewFragment__one_or_more_items_were_invalid, Toast.LENGTH_SHORT).show()
MediaValidator.FilterError.TooManyItems -> Toast.makeText(requireContext(), R.string.MediaReviewFragment__too_many_items_selected, Toast.LENGTH_SHORT).show()
is MediaValidator.FilterError.NoItems -> {
if (error.cause != null) {
handleMediaValidatorFilterError(error.cause)
} else {
Toast.makeText(requireContext(), R.string.MediaReviewFragment__one_or_more_items_were_invalid, Toast.LENGTH_SHORT).show()
}
callback.onNoMediaSelected()
}
}
sharedViewModel.clearMediaErrors()
}
private fun launchGallery() { private fun launchGallery() {
val controller = findNavController() val controller = findNavController()
navigator.goToGallery(controller) navigator.goToGallery(controller)