From 459e503c8ab1ca14e697cc86d536c6f38cba6338 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Wed, 1 Mar 2023 09:34:14 -0500 Subject: [PATCH] Avoids flickering the screen when the update from Loading to Loaded happens on cached objects. --- .../amethyst/ui/components/UrlPreview.kt | 37 ++++++++++--------- 1 file changed, 20 insertions(+), 17 deletions(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/UrlPreview.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/UrlPreview.kt index 8b15315a07..8157171dd8 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/UrlPreview.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/UrlPreview.kt @@ -16,24 +16,29 @@ import kotlinx.coroutines.withContext @Composable -fun UrlPreview(url: String, urlText: String, showUrlIfError: Boolean = true) { - var urlPreviewState by remember { mutableStateOf(UrlPreviewState.Loading) } +fun UrlPreview(url: String, urlText: String) { + val default = UrlCachedPreviewer.cache[url]?.let { UrlPreviewState.Loaded(it) } ?: UrlPreviewState.Loading + + var urlPreviewState by remember { mutableStateOf(default) } // Doesn't use a viewModel because of viewModel reusing issues (too many UrlPreview are created). LaunchedEffect(url) { - withContext(Dispatchers.IO) { - UrlCachedPreviewer.previewInfo(url, object : IUrlPreviewCallback { - override fun onComplete(urlInfo: UrlInfoItem) { - if (urlInfo.allFetchComplete() && urlInfo.url == url) - urlPreviewState = UrlPreviewState.Loaded(urlInfo) - else - urlPreviewState = UrlPreviewState.Empty - } + if (urlPreviewState == UrlPreviewState.Loading) { + withContext(Dispatchers.IO) { + UrlCachedPreviewer.previewInfo(url, object : IUrlPreviewCallback { + override fun onComplete(urlInfo: UrlInfoItem) { + if (urlInfo.allFetchComplete() && urlInfo.url == url) + urlPreviewState = UrlPreviewState.Loaded(urlInfo) + else + urlPreviewState = UrlPreviewState.Empty + } - override fun onFailed(throwable: Throwable) { - urlPreviewState = UrlPreviewState.Error("Error parsing preview for ${url}: ${throwable.message}") - } - }) + override fun onFailed(throwable: Throwable) { + urlPreviewState = + UrlPreviewState.Error("Error parsing preview for ${url}: ${throwable.message}") + } + }) + } } } @@ -43,9 +48,7 @@ fun UrlPreview(url: String, urlText: String, showUrlIfError: Boolean = true) { UrlPreviewCard(url, state.previewInfo) } else -> { - if (showUrlIfError) { - ClickableUrl(urlText, url) - } + ClickableUrl(urlText, url) } } }