From 642484a9a9411c182092fe3e183c782b95962d46 Mon Sep 17 00:00:00 2001 From: Rahul Krishna Date: Sat, 7 May 2022 14:01:19 +0530 Subject: [PATCH] android: use AsyncImage for images * Coil recommends using clip instead of CircleCropTransformation for compose. * Enable crossfade by default * Allow caching images * Run spotlessApply Closes #320 Signed-off-by: Rahul Krishna --- android/build.gradle.kts | 1 + .../msfjarvis/claw/android/ClawApplication.kt | 20 +++++++++++++++- .../msfjarvis/claw/common/ui/composables.kt | 23 +++++-------------- gradle/libs.versions.toml | 4 +++- 4 files changed, 29 insertions(+), 19 deletions(-) diff --git a/android/build.gradle.kts b/android/build.gradle.kts index 6e254fd3..ccde16cc 100644 --- a/android/build.gradle.kts +++ b/android/build.gradle.kts @@ -35,6 +35,7 @@ dependencies { implementation(libs.androidx.lifecycle.compose) implementation(libs.androidx.navigation.compose) implementation(libs.androidx.paging.compose) + implementation(libs.coil) implementation(libs.copydown) implementation(libs.dagger.hilt.android) implementation(libs.material.motion.core) diff --git a/android/src/main/kotlin/dev/msfjarvis/claw/android/ClawApplication.kt b/android/src/main/kotlin/dev/msfjarvis/claw/android/ClawApplication.kt index 6038eac6..3fa86438 100644 --- a/android/src/main/kotlin/dev/msfjarvis/claw/android/ClawApplication.kt +++ b/android/src/main/kotlin/dev/msfjarvis/claw/android/ClawApplication.kt @@ -5,11 +5,15 @@ import android.os.StrictMode import android.util.Log import androidx.hilt.work.HiltWorkerFactory import androidx.work.Configuration +import coil.ImageLoader +import coil.ImageLoaderFactory +import coil.disk.DiskCache +import coil.memory.MemoryCache import dagger.hilt.android.HiltAndroidApp import javax.inject.Inject @HiltAndroidApp -class ClawApplication : Application(), Configuration.Provider { +class ClawApplication : Application(), Configuration.Provider, ImageLoaderFactory { @Inject lateinit var workerFactory: HiltWorkerFactory override fun onCreate() { @@ -26,4 +30,18 @@ class ClawApplication : Application(), Configuration.Provider { .setWorkerFactory(workerFactory) .build() } + + override fun newImageLoader(): ImageLoader { + return ImageLoader.Builder(this) + .memoryCache { MemoryCache.Builder(this).maxSizePercent(0.25).build() } + .diskCache { + DiskCache.Builder() + .directory(cacheDir.resolve("image_cache")) + .maxSizeBytes(25L * 1024 * 1024) // 25 MB + .build() + } + // Show a short crossfade when loading images asynchronously. + .crossfade(true) + .build() + } } diff --git a/common/src/androidMain/kotlin/dev/msfjarvis/claw/common/ui/composables.kt b/common/src/androidMain/kotlin/dev/msfjarvis/claw/common/ui/composables.kt index 304bf39c..ded14377 100644 --- a/common/src/androidMain/kotlin/dev/msfjarvis/claw/common/ui/composables.kt +++ b/common/src/androidMain/kotlin/dev/msfjarvis/claw/common/ui/composables.kt @@ -1,31 +1,20 @@ package dev.msfjarvis.claw.common.ui -import androidx.compose.foundation.Image +import androidx.compose.foundation.shape.CircleShape import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier -import androidx.compose.ui.platform.LocalContext -import coil.annotation.ExperimentalCoilApi -import coil.compose.rememberAsyncImagePainter -import coil.request.ImageRequest -import coil.transform.CircleCropTransformation +import androidx.compose.ui.draw.clip +import coil.compose.AsyncImage @Composable -@OptIn(ExperimentalCoilApi::class) actual fun NetworkImage( url: String, contentDescription: String, modifier: Modifier, ) { - Image( - painter = - rememberAsyncImagePainter( - ImageRequest.Builder(LocalContext.current) - .data(data = url) - .transformations(CircleCropTransformation()) - .crossfade(true) - .build() - ), + AsyncImage( + model = url, contentDescription = contentDescription, - modifier = modifier, + modifier = modifier.clip(CircleShape) ) } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index fe7d2ce4..19579c38 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,6 +1,7 @@ [versions] accompanist = "0.24.6-alpha" aurora = "1.1.0" +coil = "2.0.0-rc03" coroutines = "1.6.1" dagger = "2.41" hilt = "1.0.0" @@ -35,7 +36,8 @@ build-kotlin-serialization = { module = "org.jetbrains.kotlin:kotlin-serializati build-spotless = "com.diffplug.spotless:spotless-plugin-gradle:6.5.2" build-vcu = "nl.littlerobots.version-catalog-update:nl.littlerobots.version-catalog-update.gradle.plugin:0.3.1" build-versions = "com.github.ben-manes:gradle-versions-plugin:0.42.0" -coil-compose = "io.coil-kt:coil-compose:2.0.0-rc03" +coil = { module = "io.coil-kt:coil", version.ref = "coil" } +coil-compose = { module = "io.coil-kt:coil-compose", version.ref = "coil" } compose-richtext-markdown = { module = "com.halilibo.compose-richtext:richtext-commonmark", version.ref = "richtext" } compose-richtext-material = { module = "com.halilibo.compose-richtext:richtext-ui-material", version.ref = "richtext" } compose-richtext-ui = { module = "com.halilibo.compose-richtext:richtext-ui", version.ref = "richtext" }