Handle missing external application when trying to Record a Video or on other cases.

https://github.com/matrix-org/element-android-rageshakes/issues/42362
This commit is contained in:
Benoit Marty 2022-08-29 17:27:53 +02:00 committed by Benoit Marty
parent 98ce9899ff
commit 36e3abece6
3 changed files with 23 additions and 6 deletions

View File

@ -16,6 +16,7 @@
package im.vector.app.core.error
import android.content.ActivityNotFoundException
import im.vector.app.R
import im.vector.app.core.resources.StringProvider
import im.vector.app.features.call.dialpad.DialPadLookup
@ -134,6 +135,8 @@ class DefaultErrorFormatter @Inject constructor(
is MatrixIdFailure.InvalidMatrixId ->
stringProvider.getString(R.string.login_signin_matrix_id_error_invalid_matrix_id)
is VoiceFailure -> voiceMessageError(throwable)
is ActivityNotFoundException ->
stringProvider.getString(R.string.error_no_external_application_found)
else -> throwable.localizedMessage
}
?: stringProvider.getString(R.string.unknown_error)

View File

@ -16,6 +16,7 @@
package im.vector.app.features.attachments
import android.app.Activity
import android.content.ActivityNotFoundException
import android.content.Context
import android.content.Intent
import android.net.Uri
@ -44,6 +45,7 @@ class AttachmentsHelper(
interface Callback {
fun onContactAttachmentReady(contactAttachment: ContactAttachment)
fun onContentAttachmentsReady(attachments: List<ContentAttachmentData>)
fun onAttachmentError(throwable: Throwable)
}
// Capture path allows to handle camera image picking. It must be restored if the activity gets killed.
@ -73,21 +75,21 @@ class AttachmentsHelper(
/**
* Starts the process for handling file picking.
*/
fun selectFile(activityResultLauncher: ActivityResultLauncher<Intent>) {
fun selectFile(activityResultLauncher: ActivityResultLauncher<Intent>) = doSafe {
MultiPicker.get(MultiPicker.FILE).startWith(activityResultLauncher)
}
/**
* Starts the process for handling image/video picking.
*/
fun selectGallery(activityResultLauncher: ActivityResultLauncher<Intent>) {
fun selectGallery(activityResultLauncher: ActivityResultLauncher<Intent>) = doSafe {
MultiPicker.get(MultiPicker.MEDIA).startWith(activityResultLauncher)
}
/**
* Starts the process for handling audio picking.
*/
fun selectAudio(activityResultLauncher: ActivityResultLauncher<Intent>) {
fun selectAudio(activityResultLauncher: ActivityResultLauncher<Intent>) = doSafe {
MultiPicker.get(MultiPicker.AUDIO).startWith(activityResultLauncher)
}
@ -101,11 +103,11 @@ class AttachmentsHelper(
cameraVideoActivityResultLauncher: ActivityResultLauncher<Intent>
) {
PhotoOrVideoDialog(activity, vectorPreferences).show(object : PhotoOrVideoDialog.PhotoOrVideoDialogListener {
override fun takePhoto() {
override fun takePhoto() = doSafe {
captureUri = MultiPicker.get(MultiPicker.CAMERA).startWithExpectingFile(context, cameraActivityResultLauncher)
}
override fun takeVideo() {
override fun takeVideo() = doSafe {
captureUri = MultiPicker.get(MultiPicker.CAMERA_VIDEO).startWithExpectingFile(context, cameraVideoActivityResultLauncher)
}
})
@ -114,10 +116,18 @@ class AttachmentsHelper(
/**
* Starts the process for handling contact picking.
*/
fun selectContact(activityResultLauncher: ActivityResultLauncher<Intent>) {
fun selectContact(activityResultLauncher: ActivityResultLauncher<Intent>) = doSafe {
MultiPicker.get(MultiPicker.CONTACT).startWith(activityResultLauncher)
}
private fun doSafe(function: () -> Unit) {
try {
function()
} catch (activityNotFound: ActivityNotFoundException) {
callback.onAttachmentError(activityNotFound)
}
}
/**
* This methods aims to handle the result data.
*/

View File

@ -2658,6 +2658,10 @@ class TimelineFragment :
messageComposerViewModel.handle(MessageComposerAction.SendMessage(formattedContact, false))
}
override fun onAttachmentError(throwable: Throwable) {
showFailure(throwable)
}
private fun onViewWidgetsClicked() {
RoomWidgetsBottomSheet.newInstance()
.show(childFragmentManager, "ROOM_WIDGETS_BOTTOM_SHEET")