diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/MediaSelectionActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/MediaSelectionActivity.kt index 695f4affe6..ae26dfbe11 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/MediaSelectionActivity.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/MediaSelectionActivity.kt @@ -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() 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 07c412ed3b..7ba4eb903e 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 @@ -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 = store.stateLiveData private val internalHudCommands = PublishSubject.create() - private val internalFilterErrors = PublishSubject.create() + val mediaErrors: SingleLiveEvent = SingleLiveEvent() val hudCommands: Observable = 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)) 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 4b5d3a0952..8184bb915c 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 @@ -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 { 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 63e017fbcd..dc5c408bc1 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 @@ -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() } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index d7ffb49fe6..5ec8678a7c 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -3822,6 +3822,9 @@ Add a reply Send to View once message + One or more items were too large + One or more items were invalid + Too many items selected Cancel Draw