From 7c53c03ef3df22539b4e88e653975c1667366007 Mon Sep 17 00:00:00 2001 From: Alex Hart Date: Thu, 6 Aug 2026 14:23:05 -0300 Subject: [PATCH] Add in progress dialog for v3 sending. --- app/build.gradle.kts | 3 --- .../signal/mediasend/MediaSendNavigation.kt | 24 +++++++++++++++++++ 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 6f5cb3e38f..a5e1d047e6 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -4,8 +4,6 @@ import com.android.build.api.artifact.ArtifactTransformationRequest import com.android.build.api.artifact.SingleArtifact import com.android.build.api.variant.HasAndroidTest import org.gradle.api.tasks.testing.logging.TestExceptionFormat -import org.gradle.process.ExecOperations -import org.gradle.work.DisableCachingByDefault import org.jetbrains.kotlin.gradle.dsl.JvmTarget import org.jetbrains.kotlin.gradle.dsl.KotlinAndroidProjectExtension import java.time.Instant @@ -13,7 +11,6 @@ import java.time.ZoneOffset import java.time.format.DateTimeFormatter import java.util.Locale import java.util.Properties -import javax.inject.Inject plugins { alias(libs.plugins.android.application) diff --git a/feature/media-send/src/main/java/org/signal/mediasend/MediaSendNavigation.kt b/feature/media-send/src/main/java/org/signal/mediasend/MediaSendNavigation.kt index ab10dbf59b..0c98343df4 100644 --- a/feature/media-send/src/main/java/org/signal/mediasend/MediaSendNavigation.kt +++ b/feature/media-send/src/main/java/org/signal/mediasend/MediaSendNavigation.kt @@ -25,13 +25,18 @@ import androidx.navigation3.runtime.rememberSaveableStateHolderNavEntryDecorator import androidx.navigation3.ui.NavDisplay import kotlinx.coroutines.delay import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.collectLatest +import kotlinx.coroutines.flow.distinctUntilChanged +import kotlinx.coroutines.flow.map +import org.signal.core.ui.compose.Dialogs import org.signal.core.ui.compose.Snackbars import org.signal.core.ui.compose.showSnackbar import org.signal.mediasend.screens.capture.MediaCaptureScreen import org.signal.mediasend.screens.edit.MediaEditScreen import org.signal.mediasend.screens.select.MediaSelectScreen import org.signal.mediasend.screens.select.MediaSelectViewModel +import kotlin.time.Duration.Companion.milliseconds import kotlin.time.Duration.Companion.seconds /** @@ -126,10 +131,29 @@ internal fun MediaSendNavigation( Snackbar(viewModel.snackbarEvents) Toast(viewModel.toastEvents) + SendProgress(viewModel.state) } } private val TOAST_DURATION = 3.seconds +private val SEND_PROGRESS_DELAY = 300.milliseconds + +/** + * Covers the whole flow while a send is in flight, so that the media on its way out cannot be edited or resent. Sends + * that resolve immediately never show it. + */ +@Composable +private fun SendProgress( + state: StateFlow +) { + val isSending by remember(state) { state.map { it.isSending }.distinctUntilChanged() } + .collectAsStateWithLifecycle(initialValue = false) + + Dialogs.IndeterminateProgressDialog( + visible = isSending, + delayDuration = SEND_PROGRESS_DELAY + ) +} /** * Shows each [ToastEvent] over the middle of the screen for [TOAST_DURATION]. A new event replaces whatever is showing