diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/MediaSendActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/mediasend/MediaSendActivity.kt index bd5ed3b00f..5379f4f6c0 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/MediaSendActivity.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/MediaSendActivity.kt @@ -252,7 +252,7 @@ class MediaSendActivity : ScreenLockActionBarActivity(), MediaPickerFolderCompos overridePendingTransition(R.anim.stationary, R.anim.camera_slide_to_bottom) } - override fun onNoMediaAvailable() { + private fun onNoMediaAvailable() { setResult(RESULT_CANCELED) finish() } @@ -323,6 +323,8 @@ class MediaSendActivity : ScreenLockActionBarActivity(), MediaPickerFolderCompos effect.message, Toast.LENGTH_LONG ).show() + + is MediaSendViewModel.MediaSendEffect.NoMediaAvailable -> onNoMediaAvailable() } } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/MediaSendFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/mediasend/MediaSendFragment.kt index 25e89eaf29..31a0f8ae48 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/MediaSendFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/MediaSendFragment.kt @@ -224,9 +224,8 @@ class MediaSendFragment : Fragment(), RailItemListener, InputBarDelegate { viewModel.getSelectedMedia().observe( this - ) { media: List? -> - if (media.isNullOrEmpty()) { - controller.onNoMediaAvailable() + ) { media: List -> + if (media.isEmpty()) { return@observe } @@ -406,7 +405,6 @@ class MediaSendFragment : Fragment(), RailItemListener, InputBarDelegate { interface Controller { fun onAddMediaClicked(bucketId: String) fun onSendClicked(media: List, body: String) - fun onNoMediaAvailable() } companion object { diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/MediaSendViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/mediasend/MediaSendViewModel.kt index cf234bf18a..7e1aab6701 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/MediaSendViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/MediaSendViewModel.kt @@ -60,8 +60,8 @@ class MediaSendViewModel @Inject constructor( val effects: SharedFlow = _effects.asSharedFlow() // Legacy LiveData bridges (delete later once all UI is Flow/Compose) - private val selectedMediaLiveData: LiveData?> = - uiState.map { it.selectedMedia.ifEmpty { null } }.asLiveData() + private val selectedMediaLiveData: LiveData> = + uiState.map { it.selectedMedia }.asLiveData() private val bucketIdLiveData: LiveData = uiState.map { it.bucketId }.asLiveData() @@ -158,6 +158,8 @@ class MediaSendViewModel @Inject constructor( countVisibility = newVisibility, ) } + + leaveIfNoMediaAvailable() } } } @@ -192,6 +194,8 @@ class MediaSendViewModel @Inject constructor( countVisibility = CountButtonState.Visibility.FORCED_OFF, ) } + + leaveIfNoMediaAvailable() } } } @@ -260,6 +264,12 @@ class MediaSendViewModel @Inject constructor( _uiState.update { it.copy(position = position) } } + private fun leaveIfNoMediaAvailable(){ + if(selectedMedia.isEmpty()){ + _effects.tryEmit(MediaSendEffect.NoMediaAvailable) + } + } + fun onMediaItemRemoved(position: Int) { val current = selectedMedia if (position < 0 || position >= current.size) { @@ -283,6 +293,8 @@ class MediaSendViewModel @Inject constructor( else state.position.coerceIn(0, updatedList.lastIndex) state.copy(selectedMedia = updatedList, position = newPos) } + + leaveIfNoMediaAvailable() } fun onImageCaptured(media: Media) { @@ -308,6 +320,8 @@ class MediaSendViewModel @Inject constructor( countVisibility = newVisibility ) } + + leaveIfNoMediaAvailable() } fun onImageCaptureUndo() { @@ -325,6 +339,8 @@ class MediaSendViewModel @Inject constructor( ) } + leaveIfNoMediaAvailable() + if (BlobUtils.isAuthority(last.uri)) { BlobUtils.getInstance().delete(context, last.uri) } @@ -352,7 +368,7 @@ class MediaSendViewModel @Inject constructor( val drawState: Map get() = savedDrawState - fun getSelectedMedia(): LiveData?> { + fun getSelectedMedia(): LiveData> { return selectedMediaLiveData } @@ -519,6 +535,7 @@ class MediaSendViewModel @Inject constructor( data class ShowError(val error: Error) : MediaSendEffect data class Toast(val messageRes: Int) : MediaSendEffect data class ToastText(val message: String) : MediaSendEffect + data object NoMediaAvailable : MediaSendEffect } companion object {