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

Wyświetl plik

@ -2,15 +2,18 @@ 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.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.ItemTouchHelper
import app.cash.exhaustive.Exhaustive
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
@ -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 { private fun ensureMediaGalleryFragment(): MediaGalleryFragment {

Wyświetl plik

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

Wyświetl plik

@ -3822,6 +3822,9 @@
<string name="MediaReviewFragment__add_a_reply">Add a reply</string> <string name="MediaReviewFragment__add_a_reply">Add a reply</string>
<string name="MediaReviewFragment__send_to">Send to</string> <string name="MediaReviewFragment__send_to">Send to</string>
<string name="MediaReviewFragment__view_once_message">View once message</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__cancel">Cancel</string>
<string name="ImageEditorHud__draw">Draw</string> <string name="ImageEditorHud__draw">Draw</string>