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:
parent
98ce9899ff
commit
36e3abece6
|
@ -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)
|
||||
|
|
|
@ -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.
|
||||
*/
|
||||
|
|
|
@ -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")
|
||||
|
|
Loading…
Reference in New Issue