Add in progress dialog for v3 sending.

This commit is contained in:
Alex Hart
2026-08-10 16:32:55 -04:00
committed by Greyson Parrelli
parent 85af2f883c
commit 7c53c03ef3
2 changed files with 24 additions and 3 deletions
-3
View File
@@ -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)
@@ -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<MediaSendFlowState>
) {
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