diff --git a/vector/src/main/java/im/vector/app/features/media/AttachmentProviderFactory.kt b/vector/src/main/java/im/vector/app/features/media/AttachmentProviderFactory.kt index b549e01551..f067cd7599 100644 --- a/vector/src/main/java/im/vector/app/features/media/AttachmentProviderFactory.kt +++ b/vector/src/main/java/im/vector/app/features/media/AttachmentProviderFactory.kt @@ -18,6 +18,7 @@ package im.vector.app.features.media import im.vector.app.core.date.VectorDateFormatter import im.vector.app.core.resources.StringProvider +import kotlinx.coroutines.CoroutineScope import org.matrix.android.sdk.api.session.Session import org.matrix.android.sdk.api.session.room.Room import org.matrix.android.sdk.api.session.room.timeline.TimelineEvent @@ -30,24 +31,31 @@ class AttachmentProviderFactory @Inject constructor( private val session: Session ) { - fun createProvider(attachments: List): RoomEventsAttachmentProvider { + fun createProvider(attachments: List, + coroutineScope: CoroutineScope + ): RoomEventsAttachmentProvider { return RoomEventsAttachmentProvider( - attachments, - imageContentRenderer, - vectorDateFormatter, - session.fileService(), - stringProvider + attachments = attachments, + imageContentRenderer = imageContentRenderer, + dateFormatter = vectorDateFormatter, + fileService = session.fileService(), + coroutineScope = coroutineScope, + stringProvider = stringProvider ) } - fun createProvider(attachments: List, room: Room?): DataAttachmentRoomProvider { + fun createProvider(attachments: List, + room: Room?, + coroutineScope: CoroutineScope + ): DataAttachmentRoomProvider { return DataAttachmentRoomProvider( - attachments, - room, - imageContentRenderer, - vectorDateFormatter, - session.fileService(), - stringProvider + attachments = attachments, + room = room, + imageContentRenderer = imageContentRenderer, + dateFormatter = vectorDateFormatter, + fileService = session.fileService(), + coroutineScope = coroutineScope, + stringProvider = stringProvider ) } } diff --git a/vector/src/main/java/im/vector/app/features/media/BaseAttachmentProvider.kt b/vector/src/main/java/im/vector/app/features/media/BaseAttachmentProvider.kt index b35ebfb503..ca469bfbcb 100644 --- a/vector/src/main/java/im/vector/app/features/media/BaseAttachmentProvider.kt +++ b/vector/src/main/java/im/vector/app/features/media/BaseAttachmentProvider.kt @@ -31,8 +31,8 @@ import im.vector.lib.attachmentviewer.AttachmentInfo import im.vector.lib.attachmentviewer.AttachmentSourceProvider import im.vector.lib.attachmentviewer.ImageLoaderTarget import im.vector.lib.attachmentviewer.VideoLoaderTarget +import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import org.matrix.android.sdk.api.session.events.model.isVideoMessage @@ -44,6 +44,7 @@ abstract class BaseAttachmentProvider( private val attachments: List, private val imageContentRenderer: ImageContentRenderer, protected val fileService: FileService, + private val coroutineScope: CoroutineScope, private val dateFormatter: VectorDateFormatter, private val stringProvider: StringProvider ) : AttachmentSourceProvider { @@ -155,7 +156,7 @@ abstract class BaseAttachmentProvider( target.onVideoURLReady(info.uid, data.url) } else { target.onVideoFileLoading(info.uid) - GlobalScope.launch(Dispatchers.Main) { + coroutineScope.launch(Dispatchers.IO) { val result = runCatching { fileService.downloadFile( fileName = data.filename, diff --git a/vector/src/main/java/im/vector/app/features/media/DataAttachmentRoomProvider.kt b/vector/src/main/java/im/vector/app/features/media/DataAttachmentRoomProvider.kt index 41fe82e797..31162f309f 100644 --- a/vector/src/main/java/im/vector/app/features/media/DataAttachmentRoomProvider.kt +++ b/vector/src/main/java/im/vector/app/features/media/DataAttachmentRoomProvider.kt @@ -19,6 +19,7 @@ package im.vector.app.features.media import im.vector.app.core.date.VectorDateFormatter import im.vector.app.core.resources.StringProvider import im.vector.lib.attachmentviewer.AttachmentInfo +import kotlinx.coroutines.CoroutineScope import org.matrix.android.sdk.api.extensions.tryOrNull import org.matrix.android.sdk.api.session.file.FileService import org.matrix.android.sdk.api.session.room.Room @@ -32,8 +33,16 @@ class DataAttachmentRoomProvider( imageContentRenderer: ImageContentRenderer, dateFormatter: VectorDateFormatter, fileService: FileService, + coroutineScope: CoroutineScope, stringProvider: StringProvider -) : BaseAttachmentProvider(attachments, imageContentRenderer, fileService, dateFormatter, stringProvider) { +) : BaseAttachmentProvider( + attachments = attachments, + imageContentRenderer = imageContentRenderer, + fileService = fileService, + coroutineScope = coroutineScope, + dateFormatter = dateFormatter, + stringProvider = stringProvider +) { override fun getAttachmentInfoAt(position: Int): AttachmentInfo { return getItem(position).let { diff --git a/vector/src/main/java/im/vector/app/features/media/RoomEventsAttachmentProvider.kt b/vector/src/main/java/im/vector/app/features/media/RoomEventsAttachmentProvider.kt index 43de84f19e..1e0a3a2ad9 100644 --- a/vector/src/main/java/im/vector/app/features/media/RoomEventsAttachmentProvider.kt +++ b/vector/src/main/java/im/vector/app/features/media/RoomEventsAttachmentProvider.kt @@ -19,6 +19,7 @@ package im.vector.app.features.media import im.vector.app.core.date.VectorDateFormatter import im.vector.app.core.resources.StringProvider import im.vector.lib.attachmentviewer.AttachmentInfo +import kotlinx.coroutines.CoroutineScope import org.matrix.android.sdk.api.extensions.tryOrNull import org.matrix.android.sdk.api.session.events.model.toModel import org.matrix.android.sdk.api.session.file.FileService @@ -38,8 +39,16 @@ class RoomEventsAttachmentProvider( imageContentRenderer: ImageContentRenderer, dateFormatter: VectorDateFormatter, fileService: FileService, + coroutineScope: CoroutineScope, stringProvider: StringProvider -) : BaseAttachmentProvider(attachments, imageContentRenderer, fileService, dateFormatter, stringProvider) { +) : BaseAttachmentProvider( + attachments = attachments, + imageContentRenderer = imageContentRenderer, + fileService = fileService, + coroutineScope = coroutineScope, + dateFormatter = dateFormatter, + stringProvider = stringProvider +) { override fun getAttachmentInfoAt(position: Int): AttachmentInfo { return getItem(position).let { diff --git a/vector/src/main/java/im/vector/app/features/media/VectorAttachmentViewerActivity.kt b/vector/src/main/java/im/vector/app/features/media/VectorAttachmentViewerActivity.kt index 5a62454566..bc3acf3eec 100644 --- a/vector/src/main/java/im/vector/app/features/media/VectorAttachmentViewerActivity.kt +++ b/vector/src/main/java/im/vector/app/features/media/VectorAttachmentViewerActivity.kt @@ -122,11 +122,11 @@ class VectorAttachmentViewerActivity : AttachmentViewerActivity(), BaseAttachmen val inMemoryData = intent.getParcelableArrayListExtra(EXTRA_IN_MEMORY_DATA) val sourceProvider = if (inMemoryData != null) { initialIndex = inMemoryData.indexOfFirst { it.eventId == args.eventId }.coerceAtLeast(0) - dataSourceFactory.createProvider(inMemoryData, room) + dataSourceFactory.createProvider(inMemoryData, room, lifecycleScope) } else { val events = room?.getAttachmentMessages().orEmpty() initialIndex = events.indexOfFirst { it.eventId == args.eventId }.coerceAtLeast(0) - dataSourceFactory.createProvider(events) + dataSourceFactory.createProvider(events, lifecycleScope) } sourceProvider.interactionListener = this setSourceProvider(sourceProvider)