@@ -24,11 +24,15 @@ import im.vector.matrix.android.api.session.content.ContentAttachmentData
24
24
import im.vector.matrix.android.api.session.events.model.Event
25
25
import im.vector.matrix.android.api.session.events.model.toContent
26
26
import im.vector.matrix.android.api.session.events.model.toModel
27
- import im.vector.matrix.android.api.session.room.model.message.*
27
+ import im.vector.matrix.android.api.session.room.model.message.MessageAudioContent
28
+ import im.vector.matrix.android.api.session.room.model.message.MessageContent
29
+ import im.vector.matrix.android.api.session.room.model.message.MessageFileContent
30
+ import im.vector.matrix.android.api.session.room.model.message.MessageImageContent
31
+ import im.vector.matrix.android.api.session.room.model.message.MessageVideoContent
28
32
import im.vector.matrix.android.internal.crypto.attachments.MXEncryptedAttachments
29
33
import im.vector.matrix.android.internal.crypto.model.rest.EncryptedFileInfo
30
34
import im.vector.matrix.android.internal.network.ProgressRequestBody
31
- import im.vector.matrix.android.internal.session.room.send.SendEventWorker
35
+ import im.vector.matrix.android.internal.session.room.send.MultipleEventSendingDispatcherWorker
32
36
import im.vector.matrix.android.internal.worker.SessionWorkerParams
33
37
import im.vector.matrix.android.internal.worker.WorkerParamsFactory
34
38
import im.vector.matrix.android.internal.worker.getSessionComponent
@@ -43,8 +47,7 @@ internal class UploadContentWorker(context: Context, params: WorkerParameters) :
43
47
@JsonClass(generateAdapter = true )
44
48
internal data class Params (
45
49
override val sessionId : String ,
46
- val roomId : String ,
47
- val event : Event ,
50
+ val events : List <Event >,
48
51
val attachment : ContentAttachmentData ,
49
52
val isRoomEncrypted : Boolean ,
50
53
val compressBeforeSending : Boolean ,
@@ -68,14 +71,17 @@ internal class UploadContentWorker(context: Context, params: WorkerParameters) :
68
71
val sessionComponent = getSessionComponent(params.sessionId) ? : return Result .success()
69
72
sessionComponent.inject(this )
70
73
71
- val eventId = params.event.eventId ? : return Result .success()
72
74
val attachment = params.attachment
73
75
74
76
val attachmentFile = try {
75
77
File (attachment.path)
76
78
} catch (e: Exception ) {
77
79
Timber .e(e)
78
- contentUploadStateTracker.setFailure(params.event.eventId, e)
80
+ params.events
81
+ .mapNotNull { it.eventId }
82
+ .forEach {
83
+ contentUploadStateTracker.setFailure(it, e)
84
+ }
79
85
return Result .success(
80
86
WorkerParamsFactory .toData(params.copy(
81
87
lastFailureMessage = e.localizedMessage
@@ -91,14 +97,22 @@ internal class UploadContentWorker(context: Context, params: WorkerParameters) :
91
97
ThumbnailExtractor .extractThumbnail(params.attachment)?.let { thumbnailData ->
92
98
val thumbnailProgressListener = object : ProgressRequestBody .Listener {
93
99
override fun onProgress (current : Long , total : Long ) {
94
- contentUploadStateTracker.setProgressThumbnail(eventId, current, total)
100
+ params.events
101
+ .mapNotNull { it.eventId }
102
+ .forEach {
103
+ contentUploadStateTracker.setProgressThumbnail(it, current, total)
104
+ }
95
105
}
96
106
}
97
107
98
108
try {
99
109
val contentUploadResponse = if (params.isRoomEncrypted) {
100
110
Timber .v(" Encrypt thumbnail" )
101
- contentUploadStateTracker.setEncryptingThumbnail(eventId)
111
+ params.events
112
+ .mapNotNull { it.eventId }
113
+ .forEach {
114
+ contentUploadStateTracker.setEncryptingThumbnail(it)
115
+ }
102
116
val encryptionResult = MXEncryptedAttachments .encryptAttachment(ByteArrayInputStream (thumbnailData.bytes), thumbnailData.mimeType)
103
117
uploadedThumbnailEncryptedFileInfo = encryptionResult.encryptedFileInfo
104
118
fileUploader.uploadByteArray(encryptionResult.encryptedByteArray,
@@ -121,11 +135,15 @@ internal class UploadContentWorker(context: Context, params: WorkerParameters) :
121
135
122
136
val progressListener = object : ProgressRequestBody .Listener {
123
137
override fun onProgress (current : Long , total : Long ) {
124
- if (isStopped) {
125
- contentUploadStateTracker.setFailure(eventId, Throwable (" Cancelled" ))
126
- } else {
127
- contentUploadStateTracker.setProgress(eventId, current, total)
128
- }
138
+ params.events
139
+ .mapNotNull { it.eventId }
140
+ .forEach {
141
+ if (isStopped) {
142
+ contentUploadStateTracker.setFailure(it, Throwable (" Cancelled" ))
143
+ } else {
144
+ contentUploadStateTracker.setProgress(it, current, total)
145
+ }
146
+ }
129
147
}
130
148
}
131
149
@@ -134,7 +152,11 @@ internal class UploadContentWorker(context: Context, params: WorkerParameters) :
134
152
return try {
135
153
val contentUploadResponse = if (params.isRoomEncrypted) {
136
154
Timber .v(" Encrypt file" )
137
- contentUploadStateTracker.setEncrypting(eventId)
155
+ params.events
156
+ .mapNotNull { it.eventId }
157
+ .forEach {
158
+ contentUploadStateTracker.setEncrypting(it)
159
+ }
138
160
139
161
val encryptionResult = MXEncryptedAttachments .encryptAttachment(FileInputStream (attachmentFile), attachment.mimeType)
140
162
uploadedFileEncryptedFileInfo = encryptionResult.encryptedFileInfo
@@ -154,7 +176,12 @@ internal class UploadContentWorker(context: Context, params: WorkerParameters) :
154
176
}
155
177
156
178
private fun handleFailure (params : Params , failure : Throwable ): Result {
157
- contentUploadStateTracker.setFailure(params.event.eventId!! , failure)
179
+ params.events
180
+ .mapNotNull { it.eventId }
181
+ .forEach {
182
+ contentUploadStateTracker.setFailure(it, failure)
183
+ }
184
+
158
185
return Result .success(
159
186
WorkerParamsFactory .toData(
160
187
params.copy(
@@ -170,9 +197,18 @@ internal class UploadContentWorker(context: Context, params: WorkerParameters) :
170
197
thumbnailUrl : String? ,
171
198
thumbnailEncryptedFileInfo : EncryptedFileInfo ? ): Result {
172
199
Timber .v(" handleSuccess $attachmentUrl , work is stopped $isStopped " )
173
- contentUploadStateTracker.setSuccess(params.event.eventId!! )
174
- val event = updateEvent(params.event, attachmentUrl, encryptedFileInfo, thumbnailUrl, thumbnailEncryptedFileInfo)
175
- val sendParams = SendEventWorker .Params (params.sessionId, params.roomId, event)
200
+ params.events
201
+ .mapNotNull { it.eventId }
202
+ .forEach {
203
+ contentUploadStateTracker.setSuccess(it)
204
+ }
205
+
206
+ val updatedEvents = params.events
207
+ .map {
208
+ updateEvent(it, attachmentUrl, encryptedFileInfo, thumbnailUrl, thumbnailEncryptedFileInfo)
209
+ }
210
+
211
+ val sendParams = MultipleEventSendingDispatcherWorker .Params (params.sessionId, updatedEvents, params.isRoomEncrypted)
176
212
return Result .success(WorkerParamsFactory .toData(sendParams))
177
213
}
178
214
0 commit comments