Avoid returning Result.failure() from appendable worker.

This commit is contained in:
Benoit Marty 2019-07-08 13:49:24 +02:00
parent 829e8da8dc
commit 2099965508
2 changed files with 38 additions and 42 deletions

View File

@ -18,6 +18,7 @@ package im.vector.matrix.android.internal.crypto.attachments
import android.text.TextUtils import android.text.TextUtils
import android.util.Base64 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.EncryptedFileInfo
import im.vector.matrix.android.internal.crypto.model.rest.EncryptedFileKey import im.vector.matrix.android.internal.crypto.model.rest.EncryptedFileKey
import timber.log.Timber import timber.log.Timber
@ -51,7 +52,7 @@ object MXEncryptedAttachments {
* @param mimetype the mime type * @param mimetype the mime type
* @return the encryption file info * @return the encryption file info
*/ */
fun encryptAttachment(attachmentStream: InputStream, mimetype: String): EncryptionResult? { fun encryptAttachment(attachmentStream: InputStream, mimetype: String): Try<EncryptionResult> {
val t0 = System.currentTimeMillis() val t0 = System.currentTimeMillis()
val secureRandom = SecureRandom() val secureRandom = SecureRandom()
@ -115,23 +116,21 @@ object MXEncryptedAttachments {
encryptedByteArray = outStream.toByteArray() encryptedByteArray = outStream.toByteArray()
) )
outStream.close()
Timber.v("Encrypt in " + (System.currentTimeMillis() - t0) + " ms") Timber.v("Encrypt in " + (System.currentTimeMillis() - t0) + " ms")
return result return Try.just(result)
} catch (oom: OutOfMemoryError) { } catch (oom: OutOfMemoryError) {
Timber.e(oom, "## encryptAttachment failed " + oom.message) Timber.e(oom, "## encryptAttachment failed")
return Try.Failure(oom)
} catch (e: Exception) { } catch (e: Exception) {
Timber.e(e, "## encryptAttachment failed " + e.message) Timber.e(e, "## encryptAttachment failed")
} return Try.Failure(e)
} finally {
try { try {
outStream.close() outStream.close()
} catch (e: Exception) { } catch (e: Exception) {
Timber.e(e, "## encryptAttachment() : fail to close outStream") Timber.e(e, "## encryptAttachment() : fail to close outStream")
} }
}
return null
} }
/** /**

View File

@ -69,24 +69,30 @@ internal class UploadContentWorker(context: Context, params: WorkerParameters) :
val eventId = params.event.eventId ?: return Result.success() val eventId = params.event.eventId ?: return Result.success()
val attachment = params.attachment 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 uploadedThumbnailUrl: String? = null
var uploadedThumbnailEncryptedFileInfo: EncryptedFileInfo? = null var uploadedThumbnailEncryptedFileInfo: EncryptedFileInfo? = null
if (thumbnailData != null) { ThumbnailExtractor.extractThumbnail(params.attachment)?.let { thumbnailData ->
val contentUploadResponse = if (isRoomEncrypted) { val contentUploadResponse = if (params.isRoomEncrypted) {
Timber.v("Encrypt thumbnail") Timber.v("Encrypt thumbnail")
val encryptionResult = MXEncryptedAttachments.encryptAttachment(ByteArrayInputStream(thumbnailData.bytes), thumbnailData.mimeType) MXEncryptedAttachments.encryptAttachment(ByteArrayInputStream(thumbnailData.bytes), thumbnailData.mimeType)
?: return Result.failure() .flatMap { encryptionResult ->
uploadedThumbnailEncryptedFileInfo = encryptionResult.encryptedFileInfo uploadedThumbnailEncryptedFileInfo = encryptionResult.encryptedFileInfo
fileUploader fileUploader
.uploadByteArray(encryptionResult.encryptedByteArray, "thumb_${attachment.name}", "application/octet-stream") .uploadByteArray(encryptionResult.encryptedByteArray, "thumb_${attachment.name}", "application/octet-stream")
}
} else { } else {
fileUploader fileUploader
.uploadByteArray(thumbnailData.bytes, "thumb_${attachment.name}", thumbnailData.mimeType) .uploadByteArray(thumbnailData.bytes, "thumb_${attachment.name}", thumbnailData.mimeType)
@ -107,16 +113,16 @@ internal class UploadContentWorker(context: Context, params: WorkerParameters) :
var uploadedFileEncryptedFileInfo: EncryptedFileInfo? = null var uploadedFileEncryptedFileInfo: EncryptedFileInfo? = null
val contentUploadResponse = if (isRoomEncrypted) { val contentUploadResponse = if (params.isRoomEncrypted) {
Timber.v("Encrypt file") Timber.v("Encrypt file")
val encryptionResult = MXEncryptedAttachments.encryptAttachment(FileInputStream(attachmentFile), attachment.mimeType) MXEncryptedAttachments.encryptAttachment(FileInputStream(attachmentFile), attachment.mimeType)
?: return Result.failure() .flatMap { encryptionResult ->
uploadedFileEncryptedFileInfo = encryptionResult.encryptedFileInfo uploadedFileEncryptedFileInfo = encryptionResult.encryptedFileInfo
fileUploader fileUploader
.uploadByteArray(encryptionResult.encryptedByteArray, attachment.name, "application/octet-stream", progressListener) .uploadByteArray(encryptionResult.encryptedByteArray, attachment.name, "application/octet-stream", progressListener)
}
} else { } else {
fileUploader fileUploader
.uploadFile(attachmentFile, attachment.name, attachment.mimeType, progressListener) .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 { private fun handleFailure(params: Params, failure: Throwable): Result {
contentUploadStateTracker.setFailure(params.event.eventId!!) contentUploadStateTracker.setFailure(params.event.eventId!!)
return Result.success( return Result.success(