diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/attachments/MXEncryptedAttachments.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/attachments/MXEncryptedAttachments.kt index 7fe82421..02c8931f 100755 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/attachments/MXEncryptedAttachments.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/attachments/MXEncryptedAttachments.kt @@ -18,6 +18,7 @@ package im.vector.matrix.android.internal.crypto.attachments import android.text.TextUtils import android.util.Base64 +import arrow.core.Try import im.vector.matrix.android.internal.crypto.model.rest.EncryptedFileInfo import im.vector.matrix.android.internal.crypto.model.rest.EncryptedFileKey import timber.log.Timber @@ -51,7 +52,7 @@ object MXEncryptedAttachments { * @param mimetype the mime type * @return the encryption file info */ - fun encryptAttachment(attachmentStream: InputStream, mimetype: String): EncryptionResult? { + fun encryptAttachment(attachmentStream: InputStream, mimetype: String): Try { val t0 = System.currentTimeMillis() val secureRandom = SecureRandom() @@ -115,23 +116,21 @@ object MXEncryptedAttachments { encryptedByteArray = outStream.toByteArray() ) - outStream.close() - Timber.v("Encrypt in " + (System.currentTimeMillis() - t0) + " ms") - return result + return Try.just(result) } catch (oom: OutOfMemoryError) { - Timber.e(oom, "## encryptAttachment failed " + oom.message) + Timber.e(oom, "## encryptAttachment failed") + return Try.Failure(oom) } catch (e: Exception) { - Timber.e(e, "## encryptAttachment failed " + e.message) + Timber.e(e, "## encryptAttachment failed") + return Try.Failure(e) + } finally { + try { + outStream.close() + } catch (e: Exception) { + Timber.e(e, "## encryptAttachment() : fail to close outStream") + } } - - try { - outStream.close() - } catch (e: Exception) { - Timber.e(e, "## encryptAttachment() : fail to close outStream") - } - - return null } /** diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/content/UploadContentWorker.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/content/UploadContentWorker.kt index 5a8688ee..fd6b15f3 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/content/UploadContentWorker.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/content/UploadContentWorker.kt @@ -69,24 +69,30 @@ internal class UploadContentWorker(context: Context, params: WorkerParameters) : val eventId = params.event.eventId ?: return Result.success() val attachment = params.attachment - val isRoomEncrypted = params.isRoomEncrypted + val attachmentFile = try { + File(attachment.path) + } catch (e: Exception) { + Timber.e(e) + return Result.success( + WorkerParamsFactory.toData(params.copy( + lastFailureMessage = e.localizedMessage + )) + ) + } - - val thumbnailData = ThumbnailExtractor.extractThumbnail(params.attachment) - val attachmentFile = createAttachmentFile(attachment) ?: return Result.failure() var uploadedThumbnailUrl: String? = null var uploadedThumbnailEncryptedFileInfo: EncryptedFileInfo? = null - if (thumbnailData != null) { - val contentUploadResponse = if (isRoomEncrypted) { + ThumbnailExtractor.extractThumbnail(params.attachment)?.let { thumbnailData -> + val contentUploadResponse = if (params.isRoomEncrypted) { Timber.v("Encrypt thumbnail") - val encryptionResult = MXEncryptedAttachments.encryptAttachment(ByteArrayInputStream(thumbnailData.bytes), thumbnailData.mimeType) - ?: return Result.failure() + MXEncryptedAttachments.encryptAttachment(ByteArrayInputStream(thumbnailData.bytes), thumbnailData.mimeType) + .flatMap { encryptionResult -> + uploadedThumbnailEncryptedFileInfo = encryptionResult.encryptedFileInfo - uploadedThumbnailEncryptedFileInfo = encryptionResult.encryptedFileInfo - - fileUploader - .uploadByteArray(encryptionResult.encryptedByteArray, "thumb_${attachment.name}", "application/octet-stream") + fileUploader + .uploadByteArray(encryptionResult.encryptedByteArray, "thumb_${attachment.name}", "application/octet-stream") + } } else { fileUploader .uploadByteArray(thumbnailData.bytes, "thumb_${attachment.name}", thumbnailData.mimeType) @@ -107,16 +113,16 @@ internal class UploadContentWorker(context: Context, params: WorkerParameters) : var uploadedFileEncryptedFileInfo: EncryptedFileInfo? = null - val contentUploadResponse = if (isRoomEncrypted) { + val contentUploadResponse = if (params.isRoomEncrypted) { Timber.v("Encrypt file") - val encryptionResult = MXEncryptedAttachments.encryptAttachment(FileInputStream(attachmentFile), attachment.mimeType) - ?: return Result.failure() + MXEncryptedAttachments.encryptAttachment(FileInputStream(attachmentFile), attachment.mimeType) + .flatMap { encryptionResult -> + uploadedFileEncryptedFileInfo = encryptionResult.encryptedFileInfo - uploadedFileEncryptedFileInfo = encryptionResult.encryptedFileInfo - - fileUploader - .uploadByteArray(encryptionResult.encryptedByteArray, attachment.name, "application/octet-stream", progressListener) + fileUploader + .uploadByteArray(encryptionResult.encryptedByteArray, attachment.name, "application/octet-stream", progressListener) + } } else { fileUploader .uploadFile(attachmentFile, attachment.name, attachment.mimeType, progressListener) @@ -129,15 +135,6 @@ internal class UploadContentWorker(context: Context, params: WorkerParameters) : ) } - private fun createAttachmentFile(attachment: ContentAttachmentData): File? { - return try { - File(attachment.path) - } catch (e: Exception) { - Timber.e(e) - null - } - } - private fun handleFailure(params: Params, failure: Throwable): Result { contentUploadStateTracker.setFailure(params.event.eventId!!) return Result.success(