Merge pull request #721 from vector-im/feature/fga/media_upload_progress

Feature/fga/media upload progress
This commit is contained in:
ganfra 2023-06-29 18:01:50 +02:00 committed by GitHub
commit 84fce4bcc7
13 changed files with 170 additions and 58 deletions

View file

@ -25,6 +25,7 @@ import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material3.MaterialTheme
import androidx.compose.runtime.Composable
import androidx.compose.runtime.Immutable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.tooling.preview.Preview
@ -41,6 +42,7 @@ import io.element.android.libraries.designsystem.theme.components.Text
fun ProgressDialog(
modifier: Modifier = Modifier,
text: String? = null,
type: ProgressDialogType = ProgressDialogType.Indeterminate,
onDismiss: () -> Unit = {},
) {
Dialog(
@ -50,14 +52,40 @@ fun ProgressDialog(
ProgressDialogContent(
modifier = modifier,
text = text,
progressIndicator = {
when (type) {
is ProgressDialogType.Indeterminate -> {
CircularProgressIndicator(
color = MaterialTheme.colorScheme.primary
)
}
is ProgressDialogType.Determinate -> {
CircularProgressIndicator(
progress = type.progress,
color = MaterialTheme.colorScheme.primary
)
}
}
}
)
}
}
@Immutable
sealed interface ProgressDialogType {
data class Determinate(val progress: Float) : ProgressDialogType
object Indeterminate : ProgressDialogType
}
@Composable
private fun ProgressDialogContent(
modifier: Modifier = Modifier,
text: String? = null,
progressIndicator: @Composable () -> Unit = {
CircularProgressIndicator(
color = MaterialTheme.colorScheme.primary
)
}
) {
Box(
contentAlignment = Alignment.Center,
@ -71,9 +99,7 @@ private fun ProgressDialogContent(
horizontalAlignment = Alignment.CenterHorizontally,
modifier = Modifier.padding(top = 38.dp, bottom = 32.dp, start = 40.dp, end = 40.dp)
) {
CircularProgressIndicator(
color = MaterialTheme.colorScheme.primary
)
progressIndicator()
if (!text.isNullOrBlank()) {
Spacer(modifier = Modifier.height(22.dp))
Text(

View file

@ -34,6 +34,7 @@ import io.element.android.libraries.matrix.test.A_ROOM_ID
import io.element.android.libraries.matrix.test.A_SESSION_ID
import io.element.android.libraries.matrix.test.timeline.FakeMatrixTimeline
import io.element.android.tests.testutils.simulateLongTask
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import java.io.File
@ -78,6 +79,7 @@ class FakeMatrixRoom(
private var forwardEventResult = Result.success(Unit)
private var reportContentResult = Result.success(Unit)
private var sendLocationResult = Result.success(Unit)
private var progressCallbackValues = emptyList<Pair<Long, Long>>()
var sendMediaCount = 0
private set
@ -152,7 +154,7 @@ class FakeMatrixRoom(
return toggleReactionResult
}
if(_myReactions.contains(emoji)) {
if (_myReactions.contains(emoji)) {
_myReactions.remove(emoji)
} else {
_myReactions.add(emoji)
@ -229,20 +231,26 @@ class FakeMatrixRoom(
thumbnailFile: File,
imageInfo: ImageInfo,
progressCallback: ProgressCallback?
): Result<Unit> = fakeSendMedia()
): Result<Unit> = fakeSendMedia(progressCallback)
override suspend fun sendVideo(file: File, thumbnailFile: File, videoInfo: VideoInfo, progressCallback: ProgressCallback?): Result<Unit> = fakeSendMedia()
override suspend fun sendVideo(file: File, thumbnailFile: File, videoInfo: VideoInfo, progressCallback: ProgressCallback?): Result<Unit> = fakeSendMedia(
progressCallback
)
override suspend fun sendAudio(file: File, audioInfo: AudioInfo, progressCallback: ProgressCallback?): Result<Unit> = fakeSendMedia()
override suspend fun sendAudio(file: File, audioInfo: AudioInfo, progressCallback: ProgressCallback?): Result<Unit> = fakeSendMedia(progressCallback)
override suspend fun sendFile(file: File, fileInfo: FileInfo, progressCallback: ProgressCallback?): Result<Unit> = fakeSendMedia()
override suspend fun sendFile(file: File, fileInfo: FileInfo, progressCallback: ProgressCallback?): Result<Unit> = fakeSendMedia(progressCallback)
override suspend fun forwardEvent(eventId: EventId, rooms: List<RoomId>): Result<Unit> = simulateLongTask {
forwardEventResult
}
private suspend fun fakeSendMedia(): Result<Unit> = simulateLongTask {
private suspend fun fakeSendMedia(progressCallback: ProgressCallback?): Result<Unit> = simulateLongTask {
sendMediaResult.onSuccess {
progressCallbackValues.forEach { (current, total) ->
progressCallback?.onProgress(current, total)
delay(1)
}
sendMediaCount++
}
}
@ -381,4 +389,8 @@ class FakeMatrixRoom(
fun givenSendLocationResult(result: Result<Unit>) {
sendLocationResult = result
}
fun givenProgressCallbackValues(values: List<Pair<Long, Long>>) {
progressCallbackValues = values
}
}

View file

@ -18,6 +18,7 @@ package io.element.android.libraries.mediaupload.api
import android.net.Uri
import io.element.android.libraries.core.extensions.flatMap
import io.element.android.libraries.matrix.api.core.ProgressCallback
import io.element.android.libraries.matrix.api.room.MatrixRoom
import javax.inject.Inject
@ -26,7 +27,12 @@ class MediaSender @Inject constructor(
private val room: MatrixRoom,
) {
suspend fun sendMedia(uri: Uri, mimeType: String, compressIfPossible: Boolean): Result<Unit> {
suspend fun sendMedia(
uri: Uri,
mimeType: String,
compressIfPossible: Boolean,
progressCallback: ProgressCallback? = null
): Result<Unit> {
return preProcessor
.process(
uri = uri,
@ -35,12 +41,13 @@ class MediaSender @Inject constructor(
compressIfPossible = compressIfPossible
)
.flatMap { info ->
room.sendMedia(info)
room.sendMedia(info, progressCallback)
}
}
private suspend fun MatrixRoom.sendMedia(
info: MediaUploadInfo,
progressCallback: ProgressCallback?
): Result<Unit> {
return when (info) {
is MediaUploadInfo.Image -> {
@ -48,7 +55,7 @@ class MediaSender @Inject constructor(
file = info.file,
thumbnailFile = info.thumbnailFile,
imageInfo = info.info,
progressCallback = null
progressCallback = progressCallback
)
}
@ -57,7 +64,7 @@ class MediaSender @Inject constructor(
file = info.file,
thumbnailFile = info.thumbnailFile,
videoInfo = info.info,
progressCallback = null
progressCallback = progressCallback
)
}
@ -65,7 +72,7 @@ class MediaSender @Inject constructor(
sendFile(
file = info.file,
fileInfo = info.info,
progressCallback = null
progressCallback = progressCallback
)
}
else -> Result.failure(IllegalStateException("Unexpected MediaUploadInfo format: $info"))