diff --git a/app/src/main/java/eu/kanade/presentation/more/settings/screen/AboutScreen.kt b/app/src/main/java/eu/kanade/presentation/more/settings/screen/AboutScreen.kt index dd447d9f95..655e97e85e 100644 --- a/app/src/main/java/eu/kanade/presentation/more/settings/screen/AboutScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/more/settings/screen/AboutScreen.kt @@ -1,14 +1,21 @@ package eu.kanade.presentation.more.settings.screen import android.content.Context +import androidx.compose.animation.AnimatedVisibility import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size import androidx.compose.material.icons.Icons import androidx.compose.material.icons.outlined.Public +import androidx.compose.material3.CircularProgressIndicator import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalUriHandler @@ -62,6 +69,7 @@ object AboutScreen : Screen() { val uriHandler = LocalUriHandler.current val handleBack = LocalBackPress.current val navigator = LocalNavigator.currentOrThrow + var isCheckingUpdates by remember { mutableStateOf(false) } Scaffold( topBar = { scrollBehavior -> @@ -94,22 +102,41 @@ object AboutScreen : Screen() { item { TextPreferenceWidget( title = stringResource(R.string.check_for_updates), + widget = { + AnimatedVisibility(visible = isCheckingUpdates) { + CircularProgressIndicator( + modifier = Modifier.size(28.dp), + strokeWidth = 3.dp, + ) + } + }, onPreferenceClick = { - scope.launch { - checkVersion(context) { result -> - val updateScreen = NewUpdateScreen( - versionName = result.release.version, - changelogInfo = result.release.info, - releaseLink = result.release.releaseLink, - downloadLink = result.release.getDownloadLink(), + if (!isCheckingUpdates) { + scope.launch { + isCheckingUpdates = true + + checkVersion( + context = context, + onAvailableUpdate = { result -> + val updateScreen = NewUpdateScreen( + versionName = result.release.version, + changelogInfo = result.release.info, + releaseLink = result.release.releaseLink, + downloadLink = result.release.getDownloadLink(), + ) + navigator.push(updateScreen) + }, + onFinish = { + isCheckingUpdates = false + }, ) - navigator.push(updateScreen) } } }, ) } } + if (!BuildConfig.DEBUG) { item { TextPreferenceWidget( @@ -186,10 +213,13 @@ object AboutScreen : Screen() { /** * Checks version and shows a user prompt if an update is available. */ - private suspend fun checkVersion(context: Context, onAvailableUpdate: (GetApplicationRelease.Result.NewUpdate) -> Unit) { + private suspend fun checkVersion( + context: Context, + onAvailableUpdate: (GetApplicationRelease.Result.NewUpdate) -> Unit, + onFinish: () -> Unit, + ) { val updateChecker = AppUpdateChecker() withUIContext { - context.toast(R.string.update_check_look_for_updates) try { when (val result = withIOContext { updateChecker.checkForUpdate(context, forceCheck = true) }) { is GetApplicationRelease.Result.NewUpdate -> { @@ -203,6 +233,8 @@ object AboutScreen : Screen() { } catch (e: Exception) { context.toast(e.message) logcat(LogPriority.ERROR, e) + } finally { + onFinish() } } } diff --git a/i18n/src/main/res/values/strings.xml b/i18n/src/main/res/values/strings.xml index e5c419059a..03783484e8 100644 --- a/i18n/src/main/res/values/strings.xml +++ b/i18n/src/main/res/values/strings.xml @@ -899,7 +899,6 @@ This Android version is no longer supported No new updates available - Searching for updates… Downloading…