From b454c1b4699fbd8edb23faabedf849e8244acc48 Mon Sep 17 00:00:00 2001 From: AntsyLich <59261191+AntsyLich@users.noreply.github.com> Date: Sun, 11 Oct 2026 15:11:07 +0600 Subject: [PATCH] Keep the migration screen up for at least a second --- .../kanade/tachiyomi/ui/main/MainActivity.kt | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/main/MainActivity.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/main/MainActivity.kt index 18fc942f0..a7cfee26b 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/main/MainActivity.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/main/MainActivity.kt @@ -97,6 +97,7 @@ import eu.kanade.tachiyomi.util.system.updaterEnabled import eu.kanade.tachiyomi.util.view.setComposeContent import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.channels.awaitClose +import kotlinx.coroutines.delay import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.callbackFlow import kotlinx.coroutines.flow.collectLatest @@ -126,7 +127,9 @@ import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.util.collectAsState import kotlin.time.Clock import kotlin.time.Duration.Companion.days +import kotlin.time.Duration.Companion.seconds import kotlin.time.Instant +import kotlin.time.TimeSource import kotlin.time.times class MainActivity : BaseActivity() { @@ -181,7 +184,19 @@ class MainActivity : BaseActivity() { setComposeContent { val appMigrating by isAppMigrating.collectAsState() val databaseMigrating by databaseRepository.isMigrating.collectAsState() - if (appMigrating || databaseMigrating) { + val migrating = appMigrating || databaseMigrating + var migratingSince by remember { mutableStateOf(if (migrating) TimeSource.Monotonic.markNow() else null) } + LaunchedEffect(migrating) { + val since = migratingSince + if (migrating) { + if (since == null) migratingSince = TimeSource.Monotonic.markNow() + } else if (since != null) { + // A migration that finishes right away would otherwise only flash the screen + delay(MIGRATING_SCREEN_MIN_DURATION - since.elapsedNow()) + migratingSince = null + } + } + if (migrating || migratingSince != null) { AppMigratingScreen() // Release the splash screen so the reason for the wait shows LaunchedEffect(Unit) { ready = true } @@ -633,3 +648,5 @@ class MainActivity : BaseActivity() { private const val SPLASH_MIN_DURATION = 500 // ms private const val SPLASH_MAX_DURATION = 5000 // ms private const val SPLASH_EXIT_ANIM_DURATION = 400L // ms + +private val MIGRATING_SCREEN_MIN_DURATION = 1.seconds