forked from GitHub-Mirror/riotX-android
Send file: improve UI feedback
This commit is contained in:
@ -28,10 +28,11 @@ interface ContentUploadStateTracker {
|
||||
|
||||
sealed class State {
|
||||
object Idle : State()
|
||||
object EncryptingThumbnail : State()
|
||||
data class ProgressThumbnailData(val current: Long, val total: Long) : State()
|
||||
object Encrypting : State()
|
||||
data class ProgressData(val current: Long, val total: Long) : State()
|
||||
object Success : State()
|
||||
object Failure : State()
|
||||
data class Failure(val throwable: Throwable) : State()
|
||||
}
|
||||
|
||||
|
||||
}
|
@ -43,8 +43,8 @@ internal class DefaultContentUploadStateTracker @Inject constructor() : ContentU
|
||||
}
|
||||
}
|
||||
|
||||
internal fun setFailure(key: String) {
|
||||
val failure = ContentUploadStateTracker.State.Failure
|
||||
internal fun setFailure(key: String, throwable: Throwable) {
|
||||
val failure = ContentUploadStateTracker.State.Failure(throwable)
|
||||
updateState(key, failure)
|
||||
}
|
||||
|
||||
@ -53,6 +53,21 @@ internal class DefaultContentUploadStateTracker @Inject constructor() : ContentU
|
||||
updateState(key, success)
|
||||
}
|
||||
|
||||
internal fun setEncryptingThumbnail(key: String) {
|
||||
val progressData = ContentUploadStateTracker.State.EncryptingThumbnail
|
||||
updateState(key, progressData)
|
||||
}
|
||||
|
||||
internal fun setProgressThumbnail(key: String, current: Long, total: Long) {
|
||||
val progressData = ContentUploadStateTracker.State.ProgressThumbnailData(current, total)
|
||||
updateState(key, progressData)
|
||||
}
|
||||
|
||||
internal fun setEncrypting(key: String) {
|
||||
val progressData = ContentUploadStateTracker.State.Encrypting
|
||||
updateState(key, progressData)
|
||||
}
|
||||
|
||||
internal fun setProgress(key: String, current: Long, total: Long) {
|
||||
val progressData = ContentUploadStateTracker.State.ProgressData(current, total)
|
||||
updateState(key, progressData)
|
||||
|
@ -73,7 +73,7 @@ internal class UploadContentWorker(context: Context, params: WorkerParameters) :
|
||||
File(attachment.path)
|
||||
} catch (e: Exception) {
|
||||
Timber.e(e)
|
||||
contentUploadStateTracker.setFailure(params.event.eventId)
|
||||
contentUploadStateTracker.setFailure(params.event.eventId, e)
|
||||
return Result.success(
|
||||
WorkerParamsFactory.toData(params.copy(
|
||||
lastFailureMessage = e.localizedMessage
|
||||
@ -85,18 +85,31 @@ internal class UploadContentWorker(context: Context, params: WorkerParameters) :
|
||||
var uploadedThumbnailEncryptedFileInfo: EncryptedFileInfo? = null
|
||||
|
||||
ThumbnailExtractor.extractThumbnail(params.attachment)?.let { thumbnailData ->
|
||||
val thumbnailProgressListener = object : ProgressRequestBody.Listener {
|
||||
override fun onProgress(current: Long, total: Long) {
|
||||
contentUploadStateTracker.setProgressThumbnail(eventId, current, total)
|
||||
}
|
||||
}
|
||||
|
||||
val contentUploadResponse = if (params.isRoomEncrypted) {
|
||||
Timber.v("Encrypt thumbnail")
|
||||
contentUploadStateTracker.setEncryptingThumbnail(eventId)
|
||||
MXEncryptedAttachments.encryptAttachment(ByteArrayInputStream(thumbnailData.bytes), thumbnailData.mimeType)
|
||||
.flatMap { encryptionResult ->
|
||||
uploadedThumbnailEncryptedFileInfo = encryptionResult.encryptedFileInfo
|
||||
|
||||
fileUploader
|
||||
.uploadByteArray(encryptionResult.encryptedByteArray, "thumb_${attachment.name}", "application/octet-stream")
|
||||
.uploadByteArray(encryptionResult.encryptedByteArray,
|
||||
"thumb_${attachment.name}",
|
||||
"application/octet-stream",
|
||||
thumbnailProgressListener)
|
||||
}
|
||||
} else {
|
||||
fileUploader
|
||||
.uploadByteArray(thumbnailData.bytes, "thumb_${attachment.name}", thumbnailData.mimeType)
|
||||
.uploadByteArray(thumbnailData.bytes,
|
||||
"thumb_${attachment.name}",
|
||||
thumbnailData.mimeType,
|
||||
thumbnailProgressListener)
|
||||
}
|
||||
|
||||
contentUploadResponse
|
||||
@ -116,6 +129,7 @@ internal class UploadContentWorker(context: Context, params: WorkerParameters) :
|
||||
|
||||
val contentUploadResponse = if (params.isRoomEncrypted) {
|
||||
Timber.v("Encrypt file")
|
||||
contentUploadStateTracker.setEncrypting(eventId)
|
||||
|
||||
MXEncryptedAttachments.encryptAttachment(FileInputStream(attachmentFile), attachment.mimeType)
|
||||
.flatMap { encryptionResult ->
|
||||
@ -137,7 +151,7 @@ internal class UploadContentWorker(context: Context, params: WorkerParameters) :
|
||||
}
|
||||
|
||||
private fun handleFailure(params: Params, failure: Throwable): Result {
|
||||
contentUploadStateTracker.setFailure(params.event.eventId!!)
|
||||
contentUploadStateTracker.setFailure(params.event.eventId!!, failure)
|
||||
return Result.success(
|
||||
WorkerParamsFactory.toData(
|
||||
params.copy(
|
||||
|
Reference in New Issue
Block a user