diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/MediaSelectionViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/MediaSelectionViewModel.kt index ff97aac86..df1f6ca4e 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/MediaSelectionViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/MediaSelectionViewModel.kt @@ -202,7 +202,7 @@ class MediaSelectionViewModel( } if (newMediaList.isEmpty() && !suppressEmptyError) { - mediaErrors.postValue(MediaValidator.FilterError.NO_ITEMS) + mediaErrors.postValue(MediaValidator.FilterError.NoItems()) } repository.deleteBlobs(listOf(media)) diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/MediaValidator.kt b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/MediaValidator.kt index 552da83d4..fc0c25d66 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/MediaValidator.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/MediaValidator.kt @@ -15,14 +15,14 @@ object MediaValidator { var error: FilterError? = null if (!isAllMediaValid) { error = if (media.all { MediaUtil.isImageOrVideoType(it.mimeType) }) { - FilterError.ITEM_TOO_LARGE + FilterError.ItemTooLarge } else { - FilterError.ITEM_INVALID_TYPE + FilterError.ItemInvalidType } } if (filteredMedia.size > maxSelection) { - error = FilterError.TOO_MANY_ITEMS + error = FilterError.TooManyItems } val truncatedMedia = filteredMedia.take(maxSelection) @@ -39,7 +39,7 @@ object MediaValidator { } if (truncatedMedia.isEmpty()) { - error = FilterError.NO_ITEMS + error = FilterError.NoItems(error) } return FilterResult(truncatedMedia, error, bucketId) @@ -67,10 +67,14 @@ object MediaValidator { data class FilterResult(val filteredMedia: List, val filterError: FilterError?, val bucketId: String?) - enum class FilterError { - ITEM_TOO_LARGE, - ITEM_INVALID_TYPE, - TOO_MANY_ITEMS, - NO_ITEMS + sealed class FilterError { + object ItemTooLarge : FilterError() + object ItemInvalidType : FilterError() + object TooManyItems : FilterError() + class NoItems(val cause: FilterError? = null) : FilterError() { + init { + require(cause !is NoItems) + } + } } } 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 0fa68fa31..07a942f1f 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 @@ -52,13 +52,21 @@ class MediaSelectionGalleryFragment : Fragment(R.layout.fragment_container), Med ) } - sharedViewModel.mediaErrors.observe(viewLifecycleOwner) { error: MediaValidator.FilterError -> - @Exhaustive - when (error) { - MediaValidator.FilterError.ITEM_TOO_LARGE -> Toast.makeText(requireContext(), R.string.MediaReviewFragment__one_or_more_items_were_too_large, Toast.LENGTH_SHORT).show() - MediaValidator.FilterError.ITEM_INVALID_TYPE -> Toast.makeText(requireContext(), R.string.MediaReviewFragment__one_or_more_items_were_invalid, Toast.LENGTH_SHORT).show() - MediaValidator.FilterError.TOO_MANY_ITEMS -> Toast.makeText(requireContext(), R.string.MediaReviewFragment__too_many_items_selected, Toast.LENGTH_SHORT).show() - MediaValidator.FilterError.NO_ITEMS -> {} + sharedViewModel.mediaErrors.observe(viewLifecycleOwner, this::handleError) + } + + private fun handleError(error: MediaValidator.FilterError) { + @Exhaustive + when (error) { + 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) + } else { + Toast.makeText(requireContext(), R.string.MediaReviewFragment__one_or_more_items_were_invalid, Toast.LENGTH_SHORT).show() + } } } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/review/MediaReviewFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/review/MediaReviewFragment.kt index 7ae8b7d13..b811a5b90 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/review/MediaReviewFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/review/MediaReviewFragment.kt @@ -206,18 +206,7 @@ class MediaReviewFragment : Fragment(R.layout.v2_media_review_fragment) { computeViewStateAndAnimate(state) } - sharedViewModel.mediaErrors.observe(viewLifecycleOwner) { error: MediaValidator.FilterError -> - @Exhaustive - when (error) { - MediaValidator.FilterError.ITEM_TOO_LARGE -> Toast.makeText(requireContext(), R.string.MediaReviewFragment__one_or_more_items_were_too_large, Toast.LENGTH_SHORT).show() - MediaValidator.FilterError.ITEM_INVALID_TYPE -> Toast.makeText(requireContext(), R.string.MediaReviewFragment__one_or_more_items_were_invalid, Toast.LENGTH_SHORT).show() - MediaValidator.FilterError.TOO_MANY_ITEMS -> Toast.makeText(requireContext(), R.string.MediaReviewFragment__too_many_items_selected, Toast.LENGTH_SHORT).show() - MediaValidator.FilterError.NO_ITEMS -> { - Toast.makeText(requireContext(), R.string.MediaReviewFragment__one_or_more_items_were_invalid, Toast.LENGTH_SHORT).show() - callback.onNoMediaSelected() - } - } - } + sharedViewModel.mediaErrors.observe(viewLifecycleOwner, this::handleMediaValidatorFilterError) requireActivity().onBackPressedDispatcher.addCallback( viewLifecycleOwner, @@ -243,6 +232,23 @@ class MediaReviewFragment : Fragment(R.layout.v2_media_review_fragment) { super.onDestroyView() } + private fun handleMediaValidatorFilterError(error: MediaValidator.FilterError) { + @Exhaustive + when (error) { + 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) + } else { + Toast.makeText(requireContext(), R.string.MediaReviewFragment__one_or_more_items_were_invalid, Toast.LENGTH_SHORT).show() + } + callback.onNoMediaSelected() + } + } + } + private fun launchGallery() { val controller = findNavController() requestPermissionsForGallery {