From 7991d2fbe59a97d55449f5d8e5f3717d290721a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mehmet=20Burak=20Akg=C3=BCn?= Date: Thu, 23 May 2024 19:24:18 +0200 Subject: [PATCH 1/3] Impl coil --- README-de.md | 2 +- README-tr.md | 2 +- README.md | 2 +- .../androidMain/kotlin/com/mbakgun/mj/App.kt | 2 - gradle/libs.versions.toml | 6 +- shared/build.gradle.kts | 5 +- .../androidMain/kotlin/util/ImageLoader.kt | 43 ----- .../src/commonMain/kotlin/ui/MjImagesApp.kt | 167 +++++++++--------- .../src/commonMain/kotlin/util/ImageLoader.kt | 19 +- shared/src/iosMain/kotlin/util/ImageLoader.kt | 42 ----- shared/src/jsMain/kotlin/util/ImageLoader.kt | 26 --- shared/src/jvmMain/kotlin/util/ImageLoader.kt | 66 ------- .../src/wasmJsMain/kotlin/util/ImageLoader.kt | 26 --- 13 files changed, 111 insertions(+), 297 deletions(-) delete mode 100644 shared/src/androidMain/kotlin/util/ImageLoader.kt delete mode 100644 shared/src/iosMain/kotlin/util/ImageLoader.kt delete mode 100644 shared/src/jsMain/kotlin/util/ImageLoader.kt delete mode 100644 shared/src/jvmMain/kotlin/util/ImageLoader.kt delete mode 100644 shared/src/wasmJsMain/kotlin/util/ImageLoader.kt diff --git a/README-de.md b/README-de.md index 33f2f8d..8559884 100644 --- a/README-de.md +++ b/README-de.md @@ -16,7 +16,7 @@ Die Anwendung wurde im MVVM-Konzept mit Kotlin und Jetpack Compose entwickelt. E - [Koin](https://insert-koin.io/) - [Kotlinx Serialization](https://kotlinlang.org/docs/serialization.html) - [Kotlinx Coroutines](https://kotlinlang.org/docs/coroutines-overview.html) -- [Compose ImageLoader](https://github.com/qdsfdhvh/compose-imageloader) +- [Coil](https://coil-kt.github.io/coil/) - [KMM-ViewModel](https://github.com/rickclephas/KMM-ViewModel) - [Multiplatform Settings](https://github.com/russhwolf/multiplatform-settings) diff --git a/README-tr.md b/README-tr.md index 6752830..d3bd2cd 100644 --- a/README-tr.md +++ b/README-tr.md @@ -17,7 +17,7 @@ Kotlin ve Jetpack Compose kullanılarak MVVM konseptinde geliştirtirildi. Netwo - [Koin](https://insert-koin.io/) - [Kotlinx Serialization](https://kotlinlang.org/docs/serialization.html) - [Kotlinx Coroutines](https://kotlinlang.org/docs/coroutines-overview.html) -- [Compose ImageLoader](https://github.com/qdsfdhvh/compose-imageloader) +- [Coil](https://coil-kt.github.io/coil/) - [KMM-ViewModel](https://github.com/rickclephas/KMM-ViewModel) - [Multiplatform Settings](https://github.com/russhwolf/multiplatform-settings) diff --git a/README.md b/README.md index a68d64f..a2dfffb 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ Application developed in the MVVM concept using Kotlin and Jetpack Compose. Netw - [Koin](https://insert-koin.io/) - [Kotlinx Serialization](https://kotlinlang.org/docs/serialization.html) - [Kotlinx Coroutines](https://kotlinlang.org/docs/coroutines-overview.html) -- [Compose ImageLoader](https://github.com/qdsfdhvh/compose-imageloader) +- [Coil](https://coil-kt.github.io/coil/) - [KMM-ViewModel](https://github.com/rickclephas/KMM-ViewModel) - [Multiplatform Settings](https://github.com/russhwolf/multiplatform-settings) diff --git a/androidApp/src/androidMain/kotlin/com/mbakgun/mj/App.kt b/androidApp/src/androidMain/kotlin/com/mbakgun/mj/App.kt index 2b9267b..b5c82a4 100644 --- a/androidApp/src/androidMain/kotlin/com/mbakgun/mj/App.kt +++ b/androidApp/src/androidMain/kotlin/com/mbakgun/mj/App.kt @@ -4,7 +4,6 @@ import android.app.Application import com.mbakgun.mj.di.viewModelModule import di.initKoin import org.koin.android.ext.koin.androidContext -import util.appContext class App : Application() { @@ -12,7 +11,6 @@ class App : Application() { super.onCreate() initKoin { androidContext(this@App) - appContext = this@App modules(viewModelModule) } } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 08600f3..6bde1c8 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -3,6 +3,7 @@ androidxUiTest = "1.6.7" koin = "3.6.0-wasm-alpha2" ktorClient = "3.0.0-wasm2" kotlinxCoroutines = "1.8.1" +coil3 = "3.0.0-alpha06" [plugins] detekt = { id = "io.gitlab.arturbosch.detekt", version = "1.23.6" } @@ -15,7 +16,10 @@ androidxUiTestJunit4 = { module = "androidx.compose.ui:ui-test-junit4", version. androidxUiTestManifest = { module = "androidx.compose.ui:ui-test-manifest", version.ref="androidxUiTest" } androidxCoreKtx = { module = "androidx.core:core-ktx", version="1.13.1" } kmmViewmodelCore = { module = "com.rickclephas.kmm:kmm-viewmodel-core", version="1.0.0-ALPHA-21" } -imageLoader = { module = "io.github.qdsfdhvh:image-loader", version="1.8.0" } +coil-compose = { module = "io.coil-kt.coil3:coil-compose", version.ref = "coil3" } +coil-compose-core = { module = "io.coil-kt.coil3:coil-compose-core", version.ref = "coil3" } +coil-network-ktor = { module = "io.coil-kt.coil3:coil-network-ktor", version.ref = "coil3" } +coil-mp = { module = "io.coil-kt.coil3:coil", version.ref = "coil3" } koin = { module = "io.insert-koin:koin-android", version.ref="koin" } koinCore = { module = "io.insert-koin:koin-core", version.ref="koin" } koinTest = { module = "io.insert-koin:koin-test", version.ref="koin" } diff --git a/shared/build.gradle.kts b/shared/build.gradle.kts index e6b79dc..18d54d7 100644 --- a/shared/build.gradle.kts +++ b/shared/build.gradle.kts @@ -63,7 +63,10 @@ kotlin { implementation(libs.kotlinxSerializationCore) //imageLoading - implementation(libs.imageLoader) + implementation(libs.coil.compose.core) + implementation(libs.coil.compose) + implementation(libs.coil.mp) + implementation(libs.coil.network.ktor) //coroutines implementation(libs.kotlinxCoroutinesCore) diff --git a/shared/src/androidMain/kotlin/util/ImageLoader.kt b/shared/src/androidMain/kotlin/util/ImageLoader.kt deleted file mode 100644 index 7ad082d..0000000 --- a/shared/src/androidMain/kotlin/util/ImageLoader.kt +++ /dev/null @@ -1,43 +0,0 @@ -package util - -import android.content.Context -import com.seiko.imageloader.ImageLoader -import com.seiko.imageloader.cache.memory.maxSizePercent -import com.seiko.imageloader.component.setupDefaultComponents -import com.seiko.imageloader.intercept.bitmapMemoryCacheConfig -import com.seiko.imageloader.intercept.imageMemoryCacheConfig -import com.seiko.imageloader.intercept.painterMemoryCacheConfig -import com.seiko.imageloader.option.androidContext -import okio.Path.Companion.toOkioPath - -lateinit var appContext: Context - -actual fun generateImageLoader(): ImageLoader { - return ImageLoader { - options { - playAnimate = false - premultipliedAlpha = false - retryIfDiskDecodeError = false - androidContext(appContext) - } - components { - setupDefaultComponents(appContext) - } - interceptor { - bitmapMemoryCacheConfig { - maxSizePercent(appContext, 0.25) - } - imageMemoryCacheConfig { - maxSize(50) - } - painterMemoryCacheConfig { - maxSize(50) - } - - diskCacheConfig { - directory(appContext.cacheDir.resolve("image_cache").toOkioPath()) - maxSizeBytes(512L * 1024 * 1024) - } - } - } -} diff --git a/shared/src/commonMain/kotlin/ui/MjImagesApp.kt b/shared/src/commonMain/kotlin/ui/MjImagesApp.kt index 171600f..27fd5f0 100644 --- a/shared/src/commonMain/kotlin/ui/MjImagesApp.kt +++ b/shared/src/commonMain/kotlin/ui/MjImagesApp.kt @@ -47,7 +47,6 @@ import androidx.compose.material.pullrefresh.pullRefresh import androidx.compose.material.pullrefresh.rememberPullRefreshState import androidx.compose.material.rememberScaffoldState import androidx.compose.runtime.Composable -import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState import androidx.compose.runtime.derivedStateOf @@ -74,10 +73,10 @@ import androidx.compose.ui.unit.IntOffset import androidx.compose.ui.unit.dp import androidx.compose.ui.window.Popup import androidx.compose.ui.window.PopupProperties -import com.seiko.imageloader.LocalImageLoader -import com.seiko.imageloader.model.ImageResult -import com.seiko.imageloader.rememberImageAction -import com.seiko.imageloader.rememberImageActionPainter +import coil3.annotation.ExperimentalCoilApi +import coil3.compose.AsyncImagePainter.State.Success +import coil3.compose.rememberAsyncImagePainter +import coil3.compose.setSingletonImageLoaderFactory import domain.model.MjImage import domain.model.MjImages import domain.model.State @@ -85,96 +84,95 @@ import kotlin.math.roundToInt import kotlinx.coroutines.launch import ui.theme.AppTheme import util.OnBottomReached -import util.generateImageLoader +import util.getAsyncImageLoader import util.getImageProvider -@OptIn(ExperimentalMaterialApi::class) +@OptIn(ExperimentalMaterialApi::class, ExperimentalCoilApi::class) @Composable fun MjImagesApp( viewModel: MjImagesViewModel ) { - CompositionLocalProvider( - LocalImageLoader provides remember { generateImageLoader() }, - ) { - val useDarkTheme by viewModel.useDarkTheme.collectAsState(false) - AppTheme(useDarkTheme = useDarkTheme) { + setSingletonImageLoaderFactory { context -> + getAsyncImageLoader(context) + } + val useDarkTheme by viewModel.useDarkTheme.collectAsState(false) + AppTheme(useDarkTheme = useDarkTheme) { - val images: MjImages by viewModel.images.collectAsState() - val state: State by viewModel.state.collectAsState() - val previewUrl by viewModel.dialogPreviewUrl.collectAsState() - val onRefresh = viewModel::refreshImages + val images: MjImages by viewModel.images.collectAsState() + val state: State by viewModel.state.collectAsState() + val previewUrl by viewModel.dialogPreviewUrl.collectAsState() + val onRefresh = viewModel::refreshImages - val scaffoldState: ScaffoldState = rememberScaffoldState() - val listState = rememberLazyStaggeredGridState() - val scope = rememberCoroutineScope() + val scaffoldState: ScaffoldState = rememberScaffoldState() + val listState = rememberLazyStaggeredGridState() + val scope = rememberCoroutineScope() - val showButton by remember { - derivedStateOf { - listState.firstVisibleItemIndex > 0 - } + val showButton by remember { + derivedStateOf { + listState.firstVisibleItemIndex > 0 } + } - LaunchedEffect(Unit) { - if (viewModel.isEligibleToShowSnackBar()) { - scaffoldState.snackbarHostState.showSnackbar(SNACK_MESSAGE) - viewModel.setSnackMessageShown() - } + LaunchedEffect(Unit) { + if (viewModel.isEligibleToShowSnackBar()) { + scaffoldState.snackbarHostState.showSnackbar(SNACK_MESSAGE) + viewModel.setSnackMessageShown() } + } - Scaffold(scaffoldState = scaffoldState) { - val isRefreshing = remember { - derivedStateOf { - state == State.LOADING + Scaffold(scaffoldState = scaffoldState) { + val isRefreshing = remember { + derivedStateOf { + state == State.LOADING + } + } + val pullRefreshState = rememberPullRefreshState(isRefreshing.value, onRefresh) + + Box( + Modifier + .fillMaxSize() + .pullRefresh(state = pullRefreshState) + ) { + when (state) { + State.ERROR -> ErrorScreen(onRefresh) + State.EMPTY -> EmptyScreen(onRefresh) + else -> MjImagesList( + onLoadMore = viewModel::loadMore, + images = images, + state = listState, + ) { imageUrl -> + viewModel.showPreviewDialog(imageUrl) } } - val pullRefreshState = rememberPullRefreshState(isRefreshing.value, onRefresh) - - Box( - Modifier - .fillMaxSize() - .pullRefresh(state = pullRefreshState) + PullRefreshIndicator( + refreshing = isRefreshing.value, + state = pullRefreshState, + modifier = Modifier.align(Alignment.TopCenter) + .semantics { contentDescription = "pullRefreshIndicator" } + .testTag("pullRefreshIndicator")) + + AnimatedVisibility( + visible = showButton, + enter = fadeIn(), + exit = fadeOut(), ) { - when (state) { - State.ERROR -> ErrorScreen(onRefresh) - State.EMPTY -> EmptyScreen(onRefresh) - else -> MjImagesList( - onLoadMore = viewModel::loadMore, - images = images, - state = listState, - ) { imageUrl -> - viewModel.showPreviewDialog(imageUrl) + ScrollToTopButton(onClick = { + scope.launch { + listState.animateScrollToItem(0) } - } - PullRefreshIndicator( - refreshing = isRefreshing.value, - state = pullRefreshState, - modifier = Modifier.align(Alignment.TopCenter) - .semantics { contentDescription = "pullRefreshIndicator" } - .testTag("pullRefreshIndicator")) - - AnimatedVisibility( - visible = showButton, - enter = fadeIn(), - exit = fadeOut(), - ) { - ScrollToTopButton(onClick = { - scope.launch { - listState.animateScrollToItem(0) - } - }) - } + }) + } - DraggableThemeSelection( - useDarkTheme, - viewModel::setDarkMode - ) + DraggableThemeSelection( + useDarkTheme, + viewModel::setDarkMode + ) - if (previewUrl.isNotEmpty()) { - PreviewDialog( - imageUrl = previewUrl, - onDismissed = viewModel::dismissPreviewDialog - ) - } + if (previewUrl.isNotEmpty()) { + PreviewDialog( + imageUrl = previewUrl, + onDismissed = viewModel::dismissPreviewDialog + ) } } } @@ -230,14 +228,13 @@ fun MjImageItem( shape = RoundedCornerShape(8.dp) ) { - val action by rememberImageAction( - url = image.imageUrl + val painter = rememberAsyncImagePainter( + model = image.imageUrl, + filterQuality = FilterQuality.None ) - val painter = rememberImageActionPainter(action, filterQuality = FilterQuality.None) - val transition by animateFloatAsState( - targetValue = if (action is ImageResult) 1f else 0f + targetValue = if (painter.state is Success) 1f else 0f ) Image(painter = painter, contentDescription = null, modifier = Modifier.graphicsLayer { @@ -345,13 +342,13 @@ fun PreviewDialog( @Composable fun PreviewImage(imageUrl: String) { - val action by rememberImageAction( - url = imageUrl + val painter = rememberAsyncImagePainter( + model = imageUrl, + filterQuality = FilterQuality.None ) - val painter = rememberImageActionPainter(action) val transition by animateFloatAsState( - targetValue = if (action is ImageResult) 1f else 0f + targetValue = if (painter.state is Success) 1f else 0f ) Image( diff --git a/shared/src/commonMain/kotlin/util/ImageLoader.kt b/shared/src/commonMain/kotlin/util/ImageLoader.kt index c0217d6..3758842 100644 --- a/shared/src/commonMain/kotlin/util/ImageLoader.kt +++ b/shared/src/commonMain/kotlin/util/ImageLoader.kt @@ -1,5 +1,20 @@ package util -import com.seiko.imageloader.ImageLoader +import coil3.ImageLoader +import coil3.PlatformContext +import coil3.disk.DiskCache +import coil3.request.CachePolicy +import coil3.util.DebugLogger +import okio.FileSystem -expect fun generateImageLoader(): ImageLoader +fun getAsyncImageLoader(context: PlatformContext) = + ImageLoader.Builder(context).diskCachePolicy(CachePolicy.ENABLED) + .networkCachePolicy(CachePolicy.ENABLED).diskCache { + newDiskCache() + }.logger(DebugLogger()).build() + +fun newDiskCache(): DiskCache { + return DiskCache.Builder().directory(FileSystem.SYSTEM_TEMPORARY_DIRECTORY / "image_cache") + .maxSizeBytes(512L * 1024 * 1024) + .build() +} diff --git a/shared/src/iosMain/kotlin/util/ImageLoader.kt b/shared/src/iosMain/kotlin/util/ImageLoader.kt deleted file mode 100644 index 60ad5f5..0000000 --- a/shared/src/iosMain/kotlin/util/ImageLoader.kt +++ /dev/null @@ -1,42 +0,0 @@ -package util - -import com.seiko.imageloader.ImageLoader -import com.seiko.imageloader.component.setupDefaultComponents -import com.seiko.imageloader.intercept.bitmapMemoryCacheConfig -import com.seiko.imageloader.intercept.imageMemoryCacheConfig -import com.seiko.imageloader.intercept.painterMemoryCacheConfig -import okio.Path.Companion.toPath -import platform.Foundation.NSCachesDirectory -import platform.Foundation.NSSearchPathForDirectoriesInDomains -import platform.Foundation.NSUserDomainMask - -actual fun generateImageLoader(): ImageLoader { - return ImageLoader { - components { - setupDefaultComponents() - } - interceptor { - bitmapMemoryCacheConfig { - maxSize(32 * 1024 * 1024) - } - imageMemoryCacheConfig { - maxSize(50) - } - painterMemoryCacheConfig { - maxSize(50) - } - diskCacheConfig { - directory(getCacheDir().toPath().resolve("image_cache")) - maxSizeBytes(512L * 1024 * 1024) // 512MB - } - } - } -} - -private fun getCacheDir(): String { - return NSSearchPathForDirectoriesInDomains( - NSCachesDirectory, - NSUserDomainMask, - true, - ).first() as String -} diff --git a/shared/src/jsMain/kotlin/util/ImageLoader.kt b/shared/src/jsMain/kotlin/util/ImageLoader.kt deleted file mode 100644 index fb0f7e1..0000000 --- a/shared/src/jsMain/kotlin/util/ImageLoader.kt +++ /dev/null @@ -1,26 +0,0 @@ -package util - -import com.seiko.imageloader.ImageLoader -import com.seiko.imageloader.component.setupDefaultComponents -import com.seiko.imageloader.intercept.bitmapMemoryCacheConfig -import com.seiko.imageloader.intercept.imageMemoryCacheConfig -import com.seiko.imageloader.intercept.painterMemoryCacheConfig - -actual fun generateImageLoader(): ImageLoader { - return ImageLoader { - components { - setupDefaultComponents() - } - interceptor { - bitmapMemoryCacheConfig { - maxSize(32 * 1024 * 1024) - } - imageMemoryCacheConfig { - maxSize(50) - } - painterMemoryCacheConfig { - maxSize(50) - } - } - } -} diff --git a/shared/src/jvmMain/kotlin/util/ImageLoader.kt b/shared/src/jvmMain/kotlin/util/ImageLoader.kt deleted file mode 100644 index b45683d..0000000 --- a/shared/src/jvmMain/kotlin/util/ImageLoader.kt +++ /dev/null @@ -1,66 +0,0 @@ -package util - -import com.seiko.imageloader.ImageLoader -import com.seiko.imageloader.component.setupDefaultComponents -import com.seiko.imageloader.intercept.bitmapMemoryCacheConfig -import com.seiko.imageloader.intercept.imageMemoryCacheConfig -import com.seiko.imageloader.intercept.painterMemoryCacheConfig -import okio.Path.Companion.toOkioPath -import java.io.File - -actual fun generateImageLoader(): ImageLoader { - return ImageLoader { - components { - setupDefaultComponents() - } - interceptor { - bitmapMemoryCacheConfig { - maxSize(32 * 1024 * 1024) - } - imageMemoryCacheConfig { - maxSize(50) - } - painterMemoryCacheConfig { - maxSize(50) - } - diskCacheConfig { - directory(getCacheDir().toOkioPath().resolve("image_cache")) - maxSizeBytes(512L * 1024 * 1024) // 512MB - } - } - } -} - -enum class OperatingSystem { - Windows, Linux, MacOS, Unknown -} - -private val currentOperatingSystem: OperatingSystem - get() { - val operSys = System.getProperty("os.name").lowercase() - return if (operSys.contains("win")) { - OperatingSystem.Windows - } else if (operSys.contains("nix") || operSys.contains("nux") || - operSys.contains("aix") - ) { - OperatingSystem.Linux - } else if (operSys.contains("mac")) { - OperatingSystem.MacOS - } else { - OperatingSystem.Unknown - } - } - -private fun getCacheDir(): File { - val appName = "MidJourneyImagesComposeMultiplatform" - return when (currentOperatingSystem) { - OperatingSystem.Windows -> File(System.getenv("AppData"), "$appName/cache") - OperatingSystem.Linux -> File(System.getProperty("user.home"), ".cache/$appName") - OperatingSystem.MacOS -> File( - System.getProperty("user.home"), - "Library/Caches/$appName" - ) - - else -> throw IllegalStateException("Unsupported operating system") - } -} diff --git a/shared/src/wasmJsMain/kotlin/util/ImageLoader.kt b/shared/src/wasmJsMain/kotlin/util/ImageLoader.kt deleted file mode 100644 index fb0f7e1..0000000 --- a/shared/src/wasmJsMain/kotlin/util/ImageLoader.kt +++ /dev/null @@ -1,26 +0,0 @@ -package util - -import com.seiko.imageloader.ImageLoader -import com.seiko.imageloader.component.setupDefaultComponents -import com.seiko.imageloader.intercept.bitmapMemoryCacheConfig -import com.seiko.imageloader.intercept.imageMemoryCacheConfig -import com.seiko.imageloader.intercept.painterMemoryCacheConfig - -actual fun generateImageLoader(): ImageLoader { - return ImageLoader { - components { - setupDefaultComponents() - } - interceptor { - bitmapMemoryCacheConfig { - maxSize(32 * 1024 * 1024) - } - imageMemoryCacheConfig { - maxSize(50) - } - painterMemoryCacheConfig { - maxSize(50) - } - } - } -} From 9e31ed79f344ba04ac340cd5eb2c6937b526894a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mehmet=20Burak=20Akg=C3=BCn?= Date: Thu, 23 May 2024 19:48:16 +0200 Subject: [PATCH 2/3] Fix failed detekt/ui tests --- shared/detekt-baseline.xml | 8 ++------ .../androidInstrumentedTest/kotlin/ui/ScreenTestUtil.kt | 3 --- 2 files changed, 2 insertions(+), 9 deletions(-) diff --git a/shared/detekt-baseline.xml b/shared/detekt-baseline.xml index 5bf008d..17dec69 100644 --- a/shared/detekt-baseline.xml +++ b/shared/detekt-baseline.xml @@ -11,10 +11,10 @@ FunctionNaming:MjImagesApp.kt$@Composable fun PreviewImage(imageUrl: String) FunctionNaming:MjImagesApp.kt$@Composable fun ScrollToTopButton( onClick: () -> Unit, modifier: Modifier = Modifier ) FunctionNaming:MjImagesApp.kt$@OptIn(ExperimentalFoundationApi::class) @Composable fun MjImageItem( image: MjImage, showPreviewDialog: (imageUrl: String) -> Unit, ) - FunctionNaming:MjImagesApp.kt$@OptIn(ExperimentalMaterialApi::class) @Composable fun MjImagesApp( viewModel: MjImagesViewModel ) + FunctionNaming:MjImagesApp.kt$@OptIn(ExperimentalMaterialApi::class, ExperimentalCoilApi::class) @Composable fun MjImagesApp( viewModel: MjImagesViewModel ) FunctionNaming:Theme.kt$@Composable fun AppTheme( useDarkTheme: Boolean = isSystemInDarkTheme(), content: @Composable () -> Unit ) FunctionNaming:main.ios.kt$fun MainViewController(viewModel: MjImagesViewModel): UIViewController - LongMethod:MjImagesApp.kt$@OptIn(ExperimentalMaterialApi::class) @Composable fun MjImagesApp( viewModel: MjImagesViewModel ) + LongMethod:MjImagesApp.kt$@OptIn(ExperimentalMaterialApi::class, ExperimentalCoilApi::class) @Composable fun MjImagesApp( viewModel: MjImagesViewModel ) MagicNumber:Colors.kt$0xFF1F1B16 MagicNumber:Colors.kt$0xFF3E2D16 MagicNumber:Colors.kt$0xFF452B00 @@ -28,10 +28,7 @@ MagicNumber:Colors.kt$0xFFFFB951 MagicNumber:Colors.kt$0xFFFFFBFF MagicNumber:Colors.kt$0xFFFFFFFF - MagicNumber:ImageLoader.kt$0.25 MagicNumber:ImageLoader.kt$1024 - MagicNumber:ImageLoader.kt$32 - MagicNumber:ImageLoader.kt$50 MagicNumber:ImageLoader.kt$512L MagicNumber:MjImagesApp.kt$.2f MagicNumber:MjImagesApp.kt$.8f @@ -43,6 +40,5 @@ UnusedPrivateProperty:build.gradle.kts$val jvmMain by getting { dependencies { implementation(project(":shared")) implementation(compose.desktop.currentOs) } } UnusedPrivateProperty:build.gradle.kts$val wasmJsMain by getting { dependencies { implementation(compose.runtime) implementation(compose.foundation) implementation(project(":shared")) } } UnusedPrivateProperty:build.gradle.kts$val wasmJsMain by getting { dependencies { implementation(libs.ktorClientWasmJs) } } - UseCheckOrError:ImageLoader.kt$throw IllegalStateException("Unsupported operating system") diff --git a/shared/src/androidInstrumentedTest/kotlin/ui/ScreenTestUtil.kt b/shared/src/androidInstrumentedTest/kotlin/ui/ScreenTestUtil.kt index c51d894..5e6fcb9 100644 --- a/shared/src/androidInstrumentedTest/kotlin/ui/ScreenTestUtil.kt +++ b/shared/src/androidInstrumentedTest/kotlin/ui/ScreenTestUtil.kt @@ -1,7 +1,6 @@ package ui import android.content.Context -import androidx.compose.ui.platform.LocalContext import data.source.MjImagesDataSource import data.source.remote.model.MjImageResponse import data.source.remote.model.MjImagesResponse @@ -9,7 +8,6 @@ import di.initKoin import org.koin.android.ext.koin.androidContext import org.koin.androidx.viewmodel.dsl.viewModel import org.koin.dsl.module -import util.appContext import java.io.IOException // setAppContext for ImageLoader &-init koin - mock response - return viewModel @@ -17,7 +15,6 @@ fun initAppAndMockViewModel( context: Context, dataSource: MjImagesDataSource.Remote? = null ): MjImagesViewModel { - appContext = context.applicationContext return initKoin { androidContext(androidContext = context) if (dataSource != null) { From 7943e76d970680c75951bf87c484f2a7e3f23bdf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mehmet=20Burak=20Akg=C3=BCn?= Date: Thu, 23 May 2024 19:52:58 +0200 Subject: [PATCH 3/3] Remove app context from android variants and remove disk cache (web/wasm) --- .../src/main/java/com/mbakgun/mj/ui/MainActivity.kt | 2 -- shared/src/commonMain/kotlin/util/ImageLoader.kt | 12 +----------- .../src/main/java/com/mbakgun/mj/ui/MainActivity.kt | 2 -- .../src/main/java/com/mbakgun/mj/ui/MainActivity.kt | 2 -- 4 files changed, 1 insertion(+), 17 deletions(-) diff --git a/automotiveApp/src/main/java/com/mbakgun/mj/ui/MainActivity.kt b/automotiveApp/src/main/java/com/mbakgun/mj/ui/MainActivity.kt index d81d77e..37d2b97 100644 --- a/automotiveApp/src/main/java/com/mbakgun/mj/ui/MainActivity.kt +++ b/automotiveApp/src/main/java/com/mbakgun/mj/ui/MainActivity.kt @@ -5,13 +5,11 @@ import androidx.activity.compose.setContent import androidx.appcompat.app.AppCompatActivity import org.koin.android.ext.android.get import ui.MjImagesApp -import util.appContext class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - appContext = applicationContext setComposable() } diff --git a/shared/src/commonMain/kotlin/util/ImageLoader.kt b/shared/src/commonMain/kotlin/util/ImageLoader.kt index 3758842..464b57b 100644 --- a/shared/src/commonMain/kotlin/util/ImageLoader.kt +++ b/shared/src/commonMain/kotlin/util/ImageLoader.kt @@ -2,19 +2,9 @@ package util import coil3.ImageLoader import coil3.PlatformContext -import coil3.disk.DiskCache import coil3.request.CachePolicy import coil3.util.DebugLogger -import okio.FileSystem fun getAsyncImageLoader(context: PlatformContext) = ImageLoader.Builder(context).diskCachePolicy(CachePolicy.ENABLED) - .networkCachePolicy(CachePolicy.ENABLED).diskCache { - newDiskCache() - }.logger(DebugLogger()).build() - -fun newDiskCache(): DiskCache { - return DiskCache.Builder().directory(FileSystem.SYSTEM_TEMPORARY_DIRECTORY / "image_cache") - .maxSizeBytes(512L * 1024 * 1024) - .build() -} + .networkCachePolicy(CachePolicy.ENABLED).logger(DebugLogger()).build() diff --git a/televisionApp/src/main/java/com/mbakgun/mj/ui/MainActivity.kt b/televisionApp/src/main/java/com/mbakgun/mj/ui/MainActivity.kt index d81d77e..37d2b97 100644 --- a/televisionApp/src/main/java/com/mbakgun/mj/ui/MainActivity.kt +++ b/televisionApp/src/main/java/com/mbakgun/mj/ui/MainActivity.kt @@ -5,13 +5,11 @@ import androidx.activity.compose.setContent import androidx.appcompat.app.AppCompatActivity import org.koin.android.ext.android.get import ui.MjImagesApp -import util.appContext class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - appContext = applicationContext setComposable() } diff --git a/wearApp/src/main/java/com/mbakgun/mj/ui/MainActivity.kt b/wearApp/src/main/java/com/mbakgun/mj/ui/MainActivity.kt index d81d77e..37d2b97 100644 --- a/wearApp/src/main/java/com/mbakgun/mj/ui/MainActivity.kt +++ b/wearApp/src/main/java/com/mbakgun/mj/ui/MainActivity.kt @@ -5,13 +5,11 @@ import androidx.activity.compose.setContent import androidx.appcompat.app.AppCompatActivity import org.koin.android.ext.android.get import ui.MjImagesApp -import util.appContext class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - appContext = applicationContext setComposable() }