diff --git a/app/src/main/java/com/pixelized/biblib/ui/MainActivity.kt b/app/src/main/java/com/pixelized/biblib/ui/MainActivity.kt index d807041..117c299 100644 --- a/app/src/main/java/com/pixelized/biblib/ui/MainActivity.kt +++ b/app/src/main/java/com/pixelized/biblib/ui/MainActivity.kt @@ -1,6 +1,7 @@ package com.pixelized.biblib.ui import android.os.Bundle +import android.util.Log import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.activity.viewModels @@ -41,6 +42,8 @@ fun ContentComposable() { val navigationViewModel = viewModel() val main by navigationViewModel.screen.observeAsState() + Log.e("pouet", "Navigation State $main") + Crossfade(targetState = main) { when (it) { is Screen.SplashScreen -> SplashScreen() diff --git a/app/src/main/java/com/pixelized/biblib/ui/composable/common/Image.kt b/app/src/main/java/com/pixelized/biblib/ui/composable/common/Image.kt index 1bad7b8..2c54a05 100644 --- a/app/src/main/java/com/pixelized/biblib/ui/composable/common/Image.kt +++ b/app/src/main/java/com/pixelized/biblib/ui/composable/common/Image.kt @@ -1,16 +1,21 @@ package com.pixelized.biblib.ui.composable.items import androidx.compose.animation.Crossfade -import androidx.compose.runtime.Composable -import androidx.compose.runtime.getValue -import androidx.compose.runtime.remember +import androidx.compose.runtime.* import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.ColorFilter import androidx.compose.ui.graphics.DefaultAlpha +import androidx.compose.ui.graphics.asImageBitmap +import androidx.compose.ui.graphics.painter.BitmapPainter import androidx.compose.ui.graphics.painter.Painter import androidx.compose.ui.layout.ContentScale -import com.pixelized.biblib.utils.extention.toImage +import com.pixelized.biblib.ui.theme.Animation +import com.pixelized.biblib.utils.BitmapCache +import com.pixelized.biblib.utils.injection.get +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.delay +import kotlinx.coroutines.launch import java.net.URL @Composable @@ -26,7 +31,8 @@ fun Image( alpha: Float = DefaultAlpha, colorFilter: ColorFilter? = null ) { - val cover by remember { contentUrl.toImage(placeHolder) } + val coroutineScope = rememberCoroutineScope() + val cover by remember { download(placeHolder, coroutineScope, contentUrl) } Crossfade(modifier = modifier, targetState = cover) { if (it == placeHolder) { @@ -50,4 +56,29 @@ fun Image( ) } } +} + +private fun download( + placeHolder: Painter, + coroutineScope: CoroutineScope, + url: URL, +): State { + val state = mutableStateOf(placeHolder) + + coroutineScope.launch { + val cache: BitmapCache = get() + val resource = cache.readFromDisk(url)?.let { BitmapPainter(it.asImageBitmap()) } + if (resource != null) { + state.value = resource + } else { + cache.download(url) { downloaded -> + if (downloaded != null) { + cache.writeToDisk(url, downloaded) + state.value = BitmapPainter(downloaded.asImageBitmap()) + } + } + } + } + + return state } \ No newline at end of file diff --git a/app/src/main/java/com/pixelized/biblib/utils/BitmapCache.kt b/app/src/main/java/com/pixelized/biblib/utils/BitmapCache.kt index 598d08e..53299cc 100644 --- a/app/src/main/java/com/pixelized/biblib/utils/BitmapCache.kt +++ b/app/src/main/java/com/pixelized/biblib/utils/BitmapCache.kt @@ -4,10 +4,8 @@ import android.content.Context import android.graphics.Bitmap import android.graphics.BitmapFactory import android.util.Log -import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.Job -import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext import java.io.File import java.io.IOException import java.net.URL @@ -37,15 +35,15 @@ class BitmapCache(context: Context) { } } - fun download(url: URL, callback: (Bitmap?) -> Unit) { - CoroutineScope(Job() + Dispatchers.IO).launch { - val bitmap = try { + suspend fun download(url: URL, callback: suspend (Bitmap?) -> Unit) { + val bitmap = withContext(Dispatchers.IO) { + try { BitmapFactory.decodeStream(url.openStream()) } catch (e: IOException) { Log.e("BitmapCache", "BitmapFactory.decodeStream(URL) FAILED !", e) null } - callback.invoke(bitmap) } + callback.invoke(bitmap) } } \ No newline at end of file diff --git a/app/src/main/java/com/pixelized/biblib/utils/extention/UrlEx.kt b/app/src/main/java/com/pixelized/biblib/utils/extention/UrlEx.kt deleted file mode 100644 index 39be32a..0000000 --- a/app/src/main/java/com/pixelized/biblib/utils/extention/UrlEx.kt +++ /dev/null @@ -1,27 +0,0 @@ -package com.pixelized.biblib.utils.extention - -import androidx.compose.runtime.State -import androidx.compose.runtime.mutableStateOf -import androidx.compose.ui.graphics.asImageBitmap -import androidx.compose.ui.graphics.painter.BitmapPainter -import androidx.compose.ui.graphics.painter.Painter -import com.pixelized.biblib.utils.injection.get -import com.pixelized.biblib.utils.BitmapCache -import java.net.URL - -fun URL.toImage(placeHolder: Painter): State { - val cache: BitmapCache = get() - val resource = cache.readFromDisk(this)?.let { BitmapPainter(it.asImageBitmap()) } - val state = mutableStateOf(resource ?: placeHolder) - - if (resource == null) { - cache.download(url = this) { downloaded -> - if (downloaded != null) { - cache.writeToDisk(this, downloaded) - state.value = BitmapPainter(downloaded.asImageBitmap()) - } - } - } - - return state -} \ No newline at end of file