feat(update): UpToDate-Status mit temporärem Feedback anzeigen

- Neuer UpdateStatus.UpToDate State
- Button zeigt 'Keine Updates gefunden' für 5 Sekunden
- Mindestens 1s Checking-Anzeige (vermeidet Flicker bei schneller Antwort)
- UpdateBanner blendet UpToDate-Status aus
This commit is contained in:
Jens Reinemann 2026-05-18 13:04:12 +02:00
parent f93b4d0b72
commit e43c0ebbb5
4 changed files with 27 additions and 2 deletions

View file

@ -458,6 +458,21 @@ internal fun SettingsScreen(
Text("Suche nach Updates…")
}
}
is UpdateStatus.UpToDate -> {
OutlinedButton(
onClick = {},
enabled = false,
modifier = Modifier.fillMaxWidth()
) {
Icon(
imageVector = Icons.Default.SystemUpdate,
contentDescription = null,
modifier = Modifier.size(18.dp)
)
Spacer(modifier = Modifier.width(8.dp))
Text("Keine Updates gefunden")
}
}
is UpdateStatus.Available -> {
Button(
onClick = updateViewModel::startDownload,

View file

@ -32,7 +32,8 @@ internal fun UpdateBanner(
onDismiss: () -> Unit,
modifier: Modifier = Modifier
) {
val isVisible = status !is UpdateStatus.Hidden && status !is UpdateStatus.Checking && status !is UpdateStatus.Available
val isVisible = status !is UpdateStatus.Hidden && status !is UpdateStatus.Checking
&& status !is UpdateStatus.Available && status !is UpdateStatus.UpToDate
AnimatedVisibility(
visible = isVisible,

View file

@ -7,6 +7,7 @@ internal data class UpdateUiState(
internal sealed interface UpdateStatus {
data object Hidden : UpdateStatus
data object Checking : UpdateStatus
data object UpToDate : UpdateStatus
data class Available(val versionName: String, val versionCode: Int, val apkUrl: String) : UpdateStatus
data class Downloading(val progress: Float) : UpdateStatus
data class ReadyToInstall(val versionName: String, val versionCode: Int) : UpdateStatus

View file

@ -10,6 +10,7 @@ import de.bollwerk.app.domain.model.UpdateCheckResult
import de.bollwerk.app.domain.repository.UpdateRepository
import de.bollwerk.app.domain.usecase.ApkInstaller
import de.bollwerk.app.domain.usecase.CheckForUpdateUseCase
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asStateFlow
@ -36,7 +37,12 @@ internal class UpdateViewModel @Inject constructor(
fun checkForUpdate() {
viewModelScope.launch {
_uiState.update { it.copy(status = UpdateStatus.Checking) }
when (val result = checkForUpdateUseCase(BuildConfig.VERSION_CODE)) {
val startTime = System.currentTimeMillis()
val result = checkForUpdateUseCase(BuildConfig.VERSION_CODE)
val elapsed = System.currentTimeMillis() - startTime
if (elapsed < 1000) delay(1000 - elapsed)
when (result) {
is UpdateCheckResult.UpdateAvailable -> {
_uiState.update {
it.copy(
@ -50,6 +56,8 @@ internal class UpdateViewModel @Inject constructor(
}
is UpdateCheckResult.UpToDate,
is UpdateCheckResult.NotConfigured -> {
_uiState.update { it.copy(status = UpdateStatus.UpToDate) }
delay(5000)
_uiState.update { it.copy(status = UpdateStatus.Hidden) }
}
is UpdateCheckResult.Error -> {