Properly handle media validation errors.

fork-5.53.8
Greyson Parrelli 2021-10-11 16:17:11 -04:00
rodzic ffc9e8caff
commit 6cbc2f684d
5 zmienionych plików z 45 dodań i 3 usunięć

Wyświetl plik

@ -99,6 +99,14 @@ class MediaSelectionActivity :
overridePendingTransition(R.anim.stationary, R.anim.camera_slide_to_bottom)
}
override fun onNoMediaSelected() {
Log.w(TAG, "No media selected. Exiting.")
setResult(RESULT_CANCELED)
finish()
overridePendingTransition(R.anim.stationary, R.anim.camera_slide_to_bottom)
}
override fun onPopFromReview() {
if (isCameraFirst()) {
viewModel.removeCameraFirstCapture()

Wyświetl plik

@ -20,6 +20,7 @@ import org.thoughtcrime.securesms.mms.SentMediaQuality
import org.thoughtcrime.securesms.recipients.Recipient
import org.thoughtcrime.securesms.recipients.RecipientId
import org.thoughtcrime.securesms.scribbles.ImageEditorFragment
import org.thoughtcrime.securesms.util.SingleLiveEvent
import org.thoughtcrime.securesms.util.Util
import org.thoughtcrime.securesms.util.livedata.Store
import java.util.Collections
@ -48,8 +49,8 @@ class MediaSelectionViewModel(
val state: LiveData<MediaSelectionState> = store.stateLiveData
private val internalHudCommands = PublishSubject.create<HudCommand>()
private val internalFilterErrors = PublishSubject.create<MediaValidator.FilterError>()
val mediaErrors: SingleLiveEvent<MediaValidator.FilterError> = SingleLiveEvent()
val hudCommands: Observable<HudCommand> = internalHudCommands
private val disposables = CompositeDisposable()
@ -125,7 +126,7 @@ class MediaSelectionViewModel(
}
if (filterResult.filterError != null) {
internalFilterErrors.onNext(filterResult.filterError)
mediaErrors.postValue(filterResult.filterError)
}
}
)
@ -197,7 +198,7 @@ class MediaSelectionViewModel(
}
if (newMediaList.isEmpty()) {
internalFilterErrors.onNext(MediaValidator.FilterError.NO_ITEMS)
mediaErrors.postValue(MediaValidator.FilterError.NO_ITEMS)
}
repository.deleteBlobs(listOf(media))

Wyświetl plik

@ -2,15 +2,18 @@ package org.thoughtcrime.securesms.mediasend.v2.gallery
import android.os.Bundle
import android.view.View
import android.widget.Toast
import androidx.activity.OnBackPressedCallback
import androidx.fragment.app.Fragment
import androidx.fragment.app.viewModels
import androidx.recyclerview.widget.ItemTouchHelper
import app.cash.exhaustive.Exhaustive
import org.thoughtcrime.securesms.R
import org.thoughtcrime.securesms.mediasend.Media
import org.thoughtcrime.securesms.mediasend.v2.MediaSelectionNavigator
import org.thoughtcrime.securesms.mediasend.v2.MediaSelectionNavigator.Companion.requestPermissionsForCamera
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.permissions.Permissions
@ -47,6 +50,16 @@ 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 -> {}
}
}
}
private fun ensureMediaGalleryFragment(): MediaGalleryFragment {

Wyświetl plik

@ -8,6 +8,7 @@ import android.view.View
import android.widget.ImageView
import android.widget.ProgressBar
import android.widget.TextView
import android.widget.Toast
import android.widget.ViewSwitcher
import androidx.activity.OnBackPressedCallback
import androidx.constraintlayout.widget.ConstraintLayout
@ -18,6 +19,7 @@ import androidx.fragment.app.viewModels
import androidx.recyclerview.widget.ItemTouchHelper
import androidx.recyclerview.widget.RecyclerView
import androidx.viewpager2.widget.ViewPager2
import app.cash.exhaustive.Exhaustive
import io.reactivex.rxjava3.disposables.CompositeDisposable
import org.thoughtcrime.securesms.R
import org.thoughtcrime.securesms.conversation.mutiselect.forward.MultiselectForwardFragment
@ -30,6 +32,7 @@ import org.thoughtcrime.securesms.mediasend.v2.MediaSelectionNavigator
import org.thoughtcrime.securesms.mediasend.v2.MediaSelectionNavigator.Companion.requestPermissionsForGallery
import org.thoughtcrime.securesms.mediasend.v2.MediaSelectionState
import org.thoughtcrime.securesms.mediasend.v2.MediaSelectionViewModel
import org.thoughtcrime.securesms.mediasend.v2.MediaValidator
import org.thoughtcrime.securesms.mms.SentMediaQuality
import org.thoughtcrime.securesms.permissions.Permissions
import org.thoughtcrime.securesms.recipients.RecipientId
@ -201,6 +204,19 @@ 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()
}
}
}
requireActivity().onBackPressedDispatcher.addCallback(
viewLifecycleOwner,
object : OnBackPressedCallback(true) {
@ -449,6 +465,7 @@ class MediaReviewFragment : Fragment(R.layout.v2_media_review_fragment) {
fun onSentWithResult(mediaSendActivityResult: MediaSendActivityResult)
fun onSentWithoutResult()
fun onSendError(error: Throwable)
fun onNoMediaSelected()
fun onPopFromReview()
}
}

Wyświetl plik

@ -3822,6 +3822,9 @@
<string name="MediaReviewFragment__add_a_reply">Add a reply</string>
<string name="MediaReviewFragment__send_to">Send to</string>
<string name="MediaReviewFragment__view_once_message">View once message</string>
<string name="MediaReviewFragment__one_or_more_items_were_too_large">One or more items were too large</string>
<string name="MediaReviewFragment__one_or_more_items_were_invalid">One or more items were invalid</string>
<string name="MediaReviewFragment__too_many_items_selected">Too many items selected</string>
<string name="ImageEditorHud__cancel">Cancel</string>
<string name="ImageEditorHud__draw">Draw</string>