Fix gallery media toast when selected item is too large.

Fixes #12011
This commit is contained in:
Alex Hart 2022-03-04 12:21:41 -04:00
parent f0988f37f3
commit 4b23e60dd6
4 changed files with 47 additions and 29 deletions

View file

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

View file

@ -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<Media>, 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)
}
}
}
}

View file

@ -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()
}
}
}
}

View file

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