diff --git a/app/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt b/app/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt index 6b079d313..2d6cd4cfd 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt @@ -2,6 +2,7 @@ package com.vitorpamplona.amethyst.model import android.util.Log import androidx.lifecycle.LiveData +import com.baha.url.preview.UrlInfoItem import com.fasterxml.jackson.databind.DeserializationFeature import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper import com.vitorpamplona.amethyst.service.model.ReactionEvent @@ -103,6 +104,8 @@ object LocalCache { it.addReply(note) } + UrlCachedPreviewer.preloadPreviewsFor(note) + refreshObservers() } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/model/UrlCachedPreviewer.kt b/app/src/main/java/com/vitorpamplona/amethyst/model/UrlCachedPreviewer.kt new file mode 100644 index 000000000..718103ba8 --- /dev/null +++ b/app/src/main/java/com/vitorpamplona/amethyst/model/UrlCachedPreviewer.kt @@ -0,0 +1,55 @@ +package com.vitorpamplona.amethyst.model + +import com.baha.url.preview.BahaUrlPreview +import com.baha.url.preview.IUrlPreviewCallback +import com.baha.url.preview.UrlInfoItem +import com.vitorpamplona.amethyst.ui.components.imageExtension +import com.vitorpamplona.amethyst.ui.components.isValidURL +import com.vitorpamplona.amethyst.ui.components.noProtocolUrlValidator +import com.vitorpamplona.amethyst.ui.components.videoExtension +import java.util.concurrent.ConcurrentHashMap + +object UrlCachedPreviewer { + val cache = ConcurrentHashMap() + + fun previewInfo(url: String, callback: IUrlPreviewCallback? = null) { + cache[url]?.let { + callback?.onComplete(it) + return + } + + BahaUrlPreview(url, object : IUrlPreviewCallback { + override fun onComplete(urlInfo: UrlInfoItem) { + cache.put(url, urlInfo) + callback?.onComplete(urlInfo) + } + + override fun onFailed(throwable: Throwable) { + callback?.onFailed(throwable) + } + }).fetchUrlPreview() + } + + fun findUrlsInMessage(message: String): List { + return message.split('\n').map { paragraph -> + paragraph.split(' ').filter { word: String -> + isValidURL(word) || noProtocolUrlValidator.matcher(word).matches() + } + }.flatten() + } + + fun preloadPreviewsFor(note: Note) { + note.event?.content?.let { + findUrlsInMessage(it).forEach { + val removedParamsFromUrl = it.split("?")[0].toLowerCase() + if (imageExtension.matcher(removedParamsFromUrl).matches()) { + // Preload Images? Isn't this too heavy? + } else if (videoExtension.matcher(removedParamsFromUrl).matches()) { + // Do nothing for now. + } else { + previewInfo(it) + } + } + } + } +} \ No newline at end of file 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 610123e59..b8a1e229f 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 @@ -31,6 +31,7 @@ import coil.compose.AsyncImage import com.baha.url.preview.BahaUrlPreview import com.baha.url.preview.IUrlPreviewCallback import com.baha.url.preview.UrlInfoItem +import com.vitorpamplona.amethyst.model.UrlCachedPreviewer @Composable @@ -41,7 +42,7 @@ fun UrlPreview(url: String, urlText: String, showUrlIfError: Boolean = true) { // Doesn't use a viewModel because of viewModel reusing issues (too many UrlPreview are created). LaunchedEffect(url) { - BahaUrlPreview(url, object : IUrlPreviewCallback { + UrlCachedPreviewer.previewInfo(url, object : IUrlPreviewCallback { override fun onComplete(urlInfo: UrlInfoItem) { if (urlInfo.allFetchComplete() && urlInfo.url == url) urlPreviewState = UrlPreviewState.Loaded(urlInfo) @@ -52,7 +53,7 @@ fun UrlPreview(url: String, urlText: String, showUrlIfError: Boolean = true) { override fun onFailed(throwable: Throwable) { urlPreviewState = UrlPreviewState.Error("Error parsing preview for ${url}: ${throwable.message}") } - }).fetchUrlPreview() + }) } Crossfade(targetState = urlPreviewState) { state -> diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/VideoView.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/VideoView.kt index 2a0e86301..74447747f 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/VideoView.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/VideoView.kt @@ -40,7 +40,6 @@ fun VideoView(videoUri: String) { } } - println("CCC"+exoPlayer.videoFormat?.width) AndroidView( modifier = Modifier .fillMaxWidth(),