diff --git a/androidApp/src/main/java/com/livefast/eattrash/raccoonforlemmy/android/MainApplication.kt b/androidApp/src/main/java/com/livefast/eattrash/raccoonforlemmy/android/MainApplication.kt index a598fa4b0..2d1e29379 100644 --- a/androidApp/src/main/java/com/livefast/eattrash/raccoonforlemmy/android/MainApplication.kt +++ b/androidApp/src/main/java/com/livefast/eattrash/raccoonforlemmy/android/MainApplication.kt @@ -1,20 +1,16 @@ package com.livefast.eattrash.raccoonforlemmy.android import android.app.Application -import coil.ImageLoader -import coil.ImageLoaderFactory + import com.livefast.eattrash.raccoonforlemmy.core.utils.debug.CrashReportConfiguration import com.livefast.eattrash.raccoonforlemmy.core.utils.debug.CrashReportWriter -import com.livefast.eattrash.raccoonforlemmy.core.utils.imagepreload.getCoilImageLoader import com.livefast.eattrash.raccoonforlemmy.di.sharedHelperModule import org.koin.android.ext.android.inject import org.koin.android.ext.koin.androidContext import org.koin.android.ext.koin.androidLogger import org.koin.core.context.startKoin -class MainApplication : - Application(), - ImageLoaderFactory { +class MainApplication : Application() { override fun onCreate() { super.onCreate() @@ -40,6 +36,4 @@ class MainApplication : } } } - - override fun newImageLoader(): ImageLoader = getCoilImageLoader(this) } diff --git a/core/commonui/components/build.gradle.kts b/core/commonui/components/build.gradle.kts index f080f4425..5e5d28060 100644 --- a/core/commonui/components/build.gradle.kts +++ b/core/commonui/components/build.gradle.kts @@ -30,7 +30,6 @@ kotlin { sourceSets { val androidMain by getting { dependencies { - implementation(libs.coil.compose) implementation(libs.exoplayer) implementation(libs.exoplayer.dash) implementation(libs.exoplayer.ui) @@ -44,9 +43,11 @@ kotlin { implementation(compose.material3) implementation(compose.materialIconsExtended) - implementation(projects.core.utils) + implementation(libs.coil.compose) + implementation(projects.core.appearance) implementation(projects.core.l10n) + implementation(projects.core.utils) } } val commonTest by getting { @@ -54,18 +55,19 @@ kotlin { implementation(kotlin("test")) } } - val iosMain by getting { - dependencies { - implementation(libs.kamel) - } - } } } android { namespace = "com.livefast.eattrash.raccoonforlemmy.core.commonui.components" - compileSdk = libs.versions.android.targetSdk.get().toInt() + compileSdk = + libs.versions.android.targetSdk + .get() + .toInt() defaultConfig { - minSdk = libs.versions.android.minSdk.get().toInt() + minSdk = + libs.versions.android.minSdk + .get() + .toInt() } } diff --git a/core/commonui/components/src/androidMain/kotlin/com/livefast/eattrash/raccoonforlemmy/core/commonui/components/CustomImage.kt b/core/commonui/components/src/androidMain/kotlin/com/livefast/eattrash/raccoonforlemmy/core/commonui/components/CustomImage.kt deleted file mode 100644 index e8b19addb..000000000 --- a/core/commonui/components/src/androidMain/kotlin/com/livefast/eattrash/raccoonforlemmy/core/commonui/components/CustomImage.kt +++ /dev/null @@ -1,104 +0,0 @@ -package com.livefast.eattrash.raccoonforlemmy.core.commonui.components - -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.BoxScope -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.material3.Button -import androidx.compose.material3.Text -import androidx.compose.runtime.Composable -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember -import androidx.compose.runtime.setValue -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.draw.blur -import androidx.compose.ui.graphics.ColorFilter -import androidx.compose.ui.graphics.FilterQuality -import androidx.compose.ui.layout.ContentScale -import androidx.compose.ui.text.style.TextOverflow -import androidx.compose.ui.unit.dp -import coil.compose.AsyncImage -import coil.compose.AsyncImagePainter -import com.livefast.eattrash.raccoonforlemmy.core.l10n.messages.LocalStrings - -@Composable -actual fun CustomImage( - modifier: Modifier, - url: String, - autoload: Boolean, - blurred: Boolean, - loadButtonContent: @Composable (() -> Unit)?, - contentDescription: String?, - quality: FilterQuality, - contentScale: ContentScale, - alignment: Alignment, - contentAlignment: Alignment, - alpha: Float, - colorFilter: ColorFilter?, - onLoading: @Composable (BoxScope.(Float?) -> Unit)?, - onFailure: @Composable (BoxScope.(Throwable) -> Unit)?, -) { - var shouldBeRendered by remember(autoload) { mutableStateOf(autoload) } - var painterState: AsyncImagePainter.State by remember { - mutableStateOf(AsyncImagePainter.State.Empty) - } - Box( - modifier = modifier, - contentAlignment = Alignment.Center, - ) { - if (shouldBeRendered) { - AsyncImage( - modifier = - Modifier - .fillMaxSize() - .blur(radius = if (blurred) 60.dp else 0.dp), - model = url, - contentDescription = contentDescription, - filterQuality = quality, - contentScale = contentScale, - alignment = alignment, - alpha = alpha, - colorFilter = colorFilter, - onLoading = { - painterState = it - }, - onError = { - painterState = it - }, - onSuccess = { - painterState = it - }, - ) - - when (val state = painterState) { - AsyncImagePainter.State.Empty -> Unit - is AsyncImagePainter.State.Error -> { - onFailure?.invoke(this, state.result.throwable) - } - - is AsyncImagePainter.State.Loading -> { - onLoading?.invoke(this, null) - } - - else -> Unit - } - } else { - Button( - onClick = { - shouldBeRendered = true - }, - ) { - if (loadButtonContent != null) { - loadButtonContent.invoke() - } else { - Text( - text = LocalStrings.current.buttonLoad, - maxLines = 1, - overflow = TextOverflow.Ellipsis, - ) - } - } - } - } -} diff --git a/core/commonui/components/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/core/commonui/components/CustomImage.kt b/core/commonui/components/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/core/commonui/components/CustomImage.kt index de6ad92c2..46c725389 100644 --- a/core/commonui/components/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/core/commonui/components/CustomImage.kt +++ b/core/commonui/components/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/core/commonui/components/CustomImage.kt @@ -1,20 +1,35 @@ package com.livefast.eattrash.raccoonforlemmy.core.commonui.components +import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.BoxScope +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.material3.Button +import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.blur import androidx.compose.ui.graphics.ColorFilter import androidx.compose.ui.graphics.DefaultAlpha import androidx.compose.ui.graphics.FilterQuality import androidx.compose.ui.layout.ContentScale +import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.unit.dp +import coil3.compose.AsyncImage +import coil3.compose.AsyncImagePainter +import com.livefast.eattrash.raccoonforlemmy.core.l10n.messages.LocalStrings +import com.livefast.eattrash.raccoonforlemmy.core.utils.imageload.getImageLoaderProvider @Composable -expect fun CustomImage( +fun CustomImage( modifier: Modifier = Modifier, url: String, - autoload: Boolean = true, blurred: Boolean = false, + autoload: Boolean, loadButtonContent: @Composable (() -> Unit)? = null, contentDescription: String? = null, quality: FilterQuality = FilterQuality.Medium, @@ -25,4 +40,74 @@ expect fun CustomImage( colorFilter: ColorFilter? = null, onLoading: @Composable (BoxScope.(Float?) -> Unit)? = null, onFailure: @Composable (BoxScope.(Throwable) -> Unit)? = null, -) + onSuccess: @Composable (BoxScope.() -> Unit)? = null, +) { + val imageLoaderProvider = remember { getImageLoaderProvider() } + var painterState: AsyncImagePainter.State by remember { + mutableStateOf(AsyncImagePainter.State.Empty) + } + var shouldBeRendered by remember(autoload) { mutableStateOf(autoload) } + + Box( + modifier = modifier, + contentAlignment = contentAlignment, + ) { + if (shouldBeRendered) { + AsyncImage( + modifier = + Modifier + .fillMaxSize() + .blur(radius = if (blurred) 60.dp else 0.dp), + model = url, + contentDescription = contentDescription, + filterQuality = quality, + contentScale = contentScale, + alignment = alignment, + alpha = alpha, + colorFilter = colorFilter, + onState = { + painterState = it + }, + imageLoader = imageLoaderProvider.provideImageLoader(), + ) + } else { + Box( + modifier = Modifier.fillMaxSize(), + contentAlignment = Alignment.Center, + ) { + Button( + onClick = { + shouldBeRendered = true + }, + ) { + if (loadButtonContent != null) { + loadButtonContent.invoke() + } else { + Text( + text = LocalStrings.current.buttonLoad, + maxLines = 1, + overflow = TextOverflow.Ellipsis, + ) + } + } + } + } + + when (val state = painterState) { + AsyncImagePainter.State.Empty -> Unit + is AsyncImagePainter.State.Error -> { + onFailure?.invoke(this, state.result.throwable) + } + + is AsyncImagePainter.State.Loading -> { + onLoading?.invoke(this, null) + } + + is AsyncImagePainter.State.Success -> { + onSuccess?.invoke(this) + } + + else -> Unit + } + } +} diff --git a/core/commonui/components/src/iosMain/kotlin/com/livefast/eattrash/raccoonforlemmy/core/commonui/components/CustomImage.kt b/core/commonui/components/src/iosMain/kotlin/com/livefast/eattrash/raccoonforlemmy/core/commonui/components/CustomImage.kt deleted file mode 100644 index 0f38512ef..000000000 --- a/core/commonui/components/src/iosMain/kotlin/com/livefast/eattrash/raccoonforlemmy/core/commonui/components/CustomImage.kt +++ /dev/null @@ -1,86 +0,0 @@ -package com.livefast.eattrash.raccoonforlemmy.core.commonui.components - -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.BoxScope -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.material3.Button -import androidx.compose.material3.Text -import androidx.compose.runtime.Composable -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember -import androidx.compose.runtime.setValue -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.draw.blur -import androidx.compose.ui.graphics.ColorFilter -import androidx.compose.ui.graphics.FilterQuality -import androidx.compose.ui.layout.ContentScale -import androidx.compose.ui.text.style.TextOverflow -import androidx.compose.ui.unit.dp -import com.livefast.eattrash.raccoonforlemmy.core.l10n.messages.LocalStrings -import io.kamel.image.KamelImage -import io.kamel.image.asyncPainterResource - -@Composable -actual fun CustomImage( - modifier: Modifier, - url: String, - autoload: Boolean, - blurred: Boolean, - loadButtonContent: @Composable (() -> Unit)?, - contentDescription: String?, - quality: FilterQuality, - contentScale: ContentScale, - alignment: Alignment, - contentAlignment: Alignment, - alpha: Float, - colorFilter: ColorFilter?, - onLoading: @Composable (BoxScope.(Float?) -> Unit)?, - onFailure: @Composable (BoxScope.(Throwable) -> Unit)?, -) { - var shouldBeRendered by remember(autoload) { mutableStateOf(autoload) } - Box( - modifier = modifier, - contentAlignment = Alignment.Center, - ) { - if (shouldBeRendered) { - val painterResource = - asyncPainterResource( - data = url, - filterQuality = quality, - ) - KamelImage( - modifier = - Modifier - .fillMaxSize() - .blur(radius = if (blurred) 60.dp else 0.dp), - resource = painterResource, - contentDescription = contentDescription, - contentScale = contentScale, - alignment = alignment, - contentAlignment = contentAlignment, - alpha = alpha, - colorFilter = colorFilter, - onLoading = onLoading, - onFailure = onFailure, - ) - } else { - Button( - onClick = { - shouldBeRendered = true - }, - ) { - if (loadButtonContent != null) { - loadButtonContent() - } else { - Text( - text = LocalStrings.current.buttonLoad, - maxLines = 1, - overflow = TextOverflow.Ellipsis, - ) - } - } - } - } -} diff --git a/core/commonui/lemmyui/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/core/commonui/lemmyui/CommunityAndCreatorInfo.kt b/core/commonui/lemmyui/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/core/commonui/lemmyui/CommunityAndCreatorInfo.kt index 1f42eb331..695d22a2e 100644 --- a/core/commonui/lemmyui/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/core/commonui/lemmyui/CommunityAndCreatorInfo.kt +++ b/core/commonui/lemmyui/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/core/commonui/lemmyui/CommunityAndCreatorInfo.kt @@ -101,6 +101,7 @@ fun CommunityAndCreatorInfo( onDoubleClick = onDoubleClick ?: {}, ), url = communityIcon, + autoload = autoLoadImages, quality = FilterQuality.Low, contentScale = ContentScale.FillBounds, ) @@ -133,6 +134,7 @@ fun CommunityAndCreatorInfo( ), url = creatorAvatar, quality = FilterQuality.Low, + autoload = autoLoadImages, contentScale = ContentScale.FillBounds, ) } else { diff --git a/core/commonui/lemmyui/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/core/commonui/lemmyui/CommunityHeader.kt b/core/commonui/lemmyui/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/core/commonui/lemmyui/CommunityHeader.kt index b5bf1f671..1019d9720 100644 --- a/core/commonui/lemmyui/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/core/commonui/lemmyui/CommunityHeader.kt +++ b/core/commonui/lemmyui/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/core/commonui/lemmyui/CommunityHeader.kt @@ -64,6 +64,7 @@ fun CommunityHeader( CustomImage( modifier = Modifier.fillMaxSize(), url = banner, + autoload = autoLoadImages, contentScale = ContentScale.Crop, contentDescription = null, ) @@ -107,6 +108,7 @@ fun CommunityHeader( }, ), url = communityIcon, + autoload = autoLoadImages, quality = FilterQuality.Low, contentScale = ContentScale.FillBounds, ) @@ -181,7 +183,7 @@ fun CommunityHeader( IconButton( modifier = Modifier.padding(end = Spacing.s).size(iconSize), onClick = { - onInfo?.invoke() + onInfo.invoke() }, ) { Icon( diff --git a/core/commonui/lemmyui/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/core/commonui/lemmyui/CommunityItem.kt b/core/commonui/lemmyui/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/core/commonui/lemmyui/CommunityItem.kt index 263ebe286..add0d82aa 100644 --- a/core/commonui/lemmyui/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/core/commonui/lemmyui/CommunityItem.kt +++ b/core/commonui/lemmyui/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/core/commonui/lemmyui/CommunityItem.kt @@ -41,7 +41,6 @@ import com.livefast.eattrash.raccoonforlemmy.core.commonui.components.CustomDrop import com.livefast.eattrash.raccoonforlemmy.core.commonui.components.CustomImage import com.livefast.eattrash.raccoonforlemmy.core.commonui.components.PlaceholderImage import com.livefast.eattrash.raccoonforlemmy.core.utils.compose.buildAnnotatedStringWithHighlights -import com.livefast.eattrash.raccoonforlemmy.core.utils.compose.onClick import com.livefast.eattrash.raccoonforlemmy.core.utils.toLocalDp import com.livefast.eattrash.raccoonforlemmy.domain.lemmy.data.CommunityModel import com.livefast.eattrash.raccoonforlemmy.domain.lemmy.data.readableHandle @@ -93,6 +92,7 @@ fun CommunityItem( .size(iconSize) .clip(RoundedCornerShape(iconSize / 2)), url = communityIcon, + autoload = autoLoadImages, contentScale = ContentScale.FillBounds, ) } else { diff --git a/core/commonui/lemmyui/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/core/commonui/lemmyui/InboxReplySubtitle.kt b/core/commonui/lemmyui/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/core/commonui/lemmyui/InboxReplySubtitle.kt index aba183871..f9cb18895 100644 --- a/core/commonui/lemmyui/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/core/commonui/lemmyui/InboxReplySubtitle.kt +++ b/core/commonui/lemmyui/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/core/commonui/lemmyui/InboxReplySubtitle.kt @@ -128,6 +128,7 @@ fun InboxReplySubtitle( .size(iconSize) .clip(RoundedCornerShape(iconSize / 2)), url = creatorAvatar, + autoload = autoLoadImages, quality = FilterQuality.Low, contentScale = ContentScale.FillBounds, ) @@ -166,6 +167,7 @@ fun InboxReplySubtitle( .size(iconSize) .clip(RoundedCornerShape(iconSize / 2)), url = communityIcon, + autoload = autoLoadImages, quality = FilterQuality.Low, contentScale = ContentScale.FillBounds, ) diff --git a/core/commonui/lemmyui/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/core/commonui/lemmyui/MultiCommunityItem.kt b/core/commonui/lemmyui/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/core/commonui/lemmyui/MultiCommunityItem.kt index 66ce572dc..8a7e4e742 100644 --- a/core/commonui/lemmyui/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/core/commonui/lemmyui/MultiCommunityItem.kt +++ b/core/commonui/lemmyui/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/core/commonui/lemmyui/MultiCommunityItem.kt @@ -34,7 +34,6 @@ import com.livefast.eattrash.raccoonforlemmy.core.commonui.components.CustomDrop import com.livefast.eattrash.raccoonforlemmy.core.commonui.components.CustomImage import com.livefast.eattrash.raccoonforlemmy.core.commonui.components.PlaceholderImage import com.livefast.eattrash.raccoonforlemmy.core.persistence.data.MultiCommunityModel -import com.livefast.eattrash.raccoonforlemmy.core.utils.compose.onClick import com.livefast.eattrash.raccoonforlemmy.core.utils.toLocalDp @Composable @@ -67,6 +66,7 @@ fun MultiCommunityItem( .size(iconSize) .clip(RoundedCornerShape(iconSize / 2)), url = communityIcon, + autoload = autoLoadImages, contentScale = ContentScale.FillBounds, ) } else { diff --git a/core/commonui/lemmyui/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/core/commonui/lemmyui/SettingsImageInfo.kt b/core/commonui/lemmyui/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/core/commonui/lemmyui/SettingsImageInfo.kt index 0187318a9..38e3277f1 100644 --- a/core/commonui/lemmyui/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/core/commonui/lemmyui/SettingsImageInfo.kt +++ b/core/commonui/lemmyui/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/core/commonui/lemmyui/SettingsImageInfo.kt @@ -60,6 +60,7 @@ fun SettingsImageInfo( CustomImage( modifier = imageModifier, url = url, + autoload = true, quality = FilterQuality.Low, contentScale = contentScale, ) diff --git a/core/commonui/lemmyui/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/core/commonui/lemmyui/UserHeader.kt b/core/commonui/lemmyui/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/core/commonui/lemmyui/UserHeader.kt index 97aaaecad..ce4b968c4 100644 --- a/core/commonui/lemmyui/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/core/commonui/lemmyui/UserHeader.kt +++ b/core/commonui/lemmyui/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/core/commonui/lemmyui/UserHeader.kt @@ -67,6 +67,7 @@ fun UserHeader( CustomImage( modifier = Modifier.fillMaxSize(), url = banner, + autoload = autoLoadImages, quality = FilterQuality.Low, contentScale = ContentScale.Crop, ) @@ -107,6 +108,7 @@ fun UserHeader( }, ), url = userAvatar, + autoload = autoLoadImages, quality = FilterQuality.Low, contentScale = ContentScale.FillBounds, ) @@ -209,7 +211,7 @@ fun UserHeader( IconButton( modifier = Modifier.padding(end = Spacing.s).size(iconSize), onClick = { - onInfo?.invoke() + onInfo.invoke() }, ) { Icon( diff --git a/core/commonui/lemmyui/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/core/commonui/lemmyui/UserItem.kt b/core/commonui/lemmyui/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/core/commonui/lemmyui/UserItem.kt index 88716f9db..2daf6f0f1 100644 --- a/core/commonui/lemmyui/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/core/commonui/lemmyui/UserItem.kt +++ b/core/commonui/lemmyui/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/core/commonui/lemmyui/UserItem.kt @@ -38,7 +38,6 @@ import com.livefast.eattrash.raccoonforlemmy.core.commonui.components.CustomDrop import com.livefast.eattrash.raccoonforlemmy.core.commonui.components.CustomImage import com.livefast.eattrash.raccoonforlemmy.core.commonui.components.PlaceholderImage import com.livefast.eattrash.raccoonforlemmy.core.utils.compose.buildAnnotatedStringWithHighlights -import com.livefast.eattrash.raccoonforlemmy.core.utils.compose.onClick import com.livefast.eattrash.raccoonforlemmy.core.utils.toLocalDp import com.livefast.eattrash.raccoonforlemmy.domain.lemmy.data.UserModel import com.livefast.eattrash.raccoonforlemmy.domain.lemmy.data.readableHandle @@ -81,6 +80,7 @@ fun UserItem( .size(iconSize) .clip(RoundedCornerShape(iconSize / 2)), url = avatar, + autoload = autoLoadImages, quality = FilterQuality.Low, contentScale = ContentScale.FillBounds, ) diff --git a/core/markdown/build.gradle.kts b/core/markdown/build.gradle.kts index 385994ccb..a816389aa 100644 --- a/core/markdown/build.gradle.kts +++ b/core/markdown/build.gradle.kts @@ -30,7 +30,7 @@ kotlin { sourceSets { val androidMain by getting { dependencies { - implementation(libs.multiplatform.markdown.renderer.coil2) + implementation(libs.multiplatform.markdown.renderer.coil3) } } val commonMain by getting { @@ -41,6 +41,7 @@ kotlin { api(libs.multiplatform.markdown.renderer) api(libs.multiplatform.markdown.renderer.m3) + api(libs.multiplatform.markdown.renderer.coil3) implementation(projects.core.l10n) implementation(projects.core.commonui.components) @@ -57,8 +58,14 @@ kotlin { android { namespace = "com.livefast.eattrash.raccoonforlemmy.core.markdown" - compileSdk = libs.versions.android.targetSdk.get().toInt() + compileSdk = + libs.versions.android.targetSdk + .get() + .toInt() defaultConfig { - minSdk = libs.versions.android.minSdk.get().toInt() + minSdk = + libs.versions.android.minSdk + .get() + .toInt() } } diff --git a/core/markdown/src/androidMain/kotlin/com/livefast/eattrash/raccoonforlemmy/core/markdown/ProvideImageTransformer.kt b/core/markdown/src/androidMain/kotlin/com/livefast/eattrash/raccoonforlemmy/core/markdown/ProvideImageTransformer.kt deleted file mode 100644 index 5f540381e..000000000 --- a/core/markdown/src/androidMain/kotlin/com/livefast/eattrash/raccoonforlemmy/core/markdown/ProvideImageTransformer.kt +++ /dev/null @@ -1,6 +0,0 @@ -package com.livefast.eattrash.raccoonforlemmy.core.markdown - -import com.mikepenz.markdown.coil2.Coil2ImageTransformerImpl -import com.mikepenz.markdown.model.ImageTransformer - -actual fun provideImageTransformer(): ImageTransformer = Coil2ImageTransformerImpl diff --git a/core/markdown/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/core/markdown/ProvideImageTransformer.kt b/core/markdown/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/core/markdown/ProvideImageTransformer.kt index ac807793c..08b00c97d 100644 --- a/core/markdown/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/core/markdown/ProvideImageTransformer.kt +++ b/core/markdown/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/core/markdown/ProvideImageTransformer.kt @@ -1,5 +1,6 @@ package com.livefast.eattrash.raccoonforlemmy.core.markdown +import com.mikepenz.markdown.coil3.Coil3ImageTransformerImpl import com.mikepenz.markdown.model.ImageTransformer -expect fun provideImageTransformer(): ImageTransformer +internal fun provideImageTransformer(): ImageTransformer = Coil3ImageTransformerImpl diff --git a/core/markdown/src/iosMain/kotlin/com/livefast/eattrash/raccoonforlemmy/core/markdown/ProvideImageTransformer.kt b/core/markdown/src/iosMain/kotlin/com/livefast/eattrash/raccoonforlemmy/core/markdown/ProvideImageTransformer.kt deleted file mode 100644 index c463ae875..000000000 --- a/core/markdown/src/iosMain/kotlin/com/livefast/eattrash/raccoonforlemmy/core/markdown/ProvideImageTransformer.kt +++ /dev/null @@ -1,6 +0,0 @@ -package com.livefast.eattrash.raccoonforlemmy.core.markdown - -import com.mikepenz.markdown.model.ImageTransformer -import com.mikepenz.markdown.model.NoOpImageTransformerImpl - -actual fun provideImageTransformer(): ImageTransformer = NoOpImageTransformerImpl() diff --git a/core/utils/build.gradle.kts b/core/utils/build.gradle.kts index 9712dc9ee..09f39a395 100644 --- a/core/utils/build.gradle.kts +++ b/core/utils/build.gradle.kts @@ -36,6 +36,8 @@ kotlin { implementation(libs.koin.core) implementation(libs.ktor.cio) + implementation(libs.coil) + implementation(libs.coil.network.ktor) implementation(project.dependencies.platform(libs.kotlincrypto.bom)) implementation(libs.kotlincrypto.md5) @@ -48,7 +50,6 @@ kotlin { implementation(libs.androidx.activity) implementation(libs.androidx.browser) implementation(libs.ktor.android) - implementation(libs.coil) implementation(libs.coil.gif) } } @@ -71,8 +72,14 @@ kotlin { android { namespace = "com.livefast.eattrash.raccoonforlemmy.core.utils" - compileSdk = libs.versions.android.targetSdk.get().toInt() + compileSdk = + libs.versions.android.targetSdk + .get() + .toInt() defaultConfig { - minSdk = libs.versions.android.minSdk.get().toInt() + minSdk = + libs.versions.android.minSdk + .get() + .toInt() } } diff --git a/core/utils/src/androidMain/kotlin/com/livefast/eattrash/raccoonforlemmy/core/utils/di/Utils.kt b/core/utils/src/androidMain/kotlin/com/livefast/eattrash/raccoonforlemmy/core/utils/di/Utils.kt index 79b9624d6..66cab42e3 100644 --- a/core/utils/src/androidMain/kotlin/com/livefast/eattrash/raccoonforlemmy/core/utils/di/Utils.kt +++ b/core/utils/src/androidMain/kotlin/com/livefast/eattrash/raccoonforlemmy/core/utils/di/Utils.kt @@ -12,8 +12,6 @@ import com.livefast.eattrash.raccoonforlemmy.core.utils.fs.DefaultFileSystemMana import com.livefast.eattrash.raccoonforlemmy.core.utils.fs.FileSystemManager import com.livefast.eattrash.raccoonforlemmy.core.utils.gallery.DefaultGalleryHelper import com.livefast.eattrash.raccoonforlemmy.core.utils.gallery.GalleryHelper -import com.livefast.eattrash.raccoonforlemmy.core.utils.imagepreload.DefaultImagePreloadManager -import com.livefast.eattrash.raccoonforlemmy.core.utils.imagepreload.ImagePreloadManager import com.livefast.eattrash.raccoonforlemmy.core.utils.network.DefaultNetworkManager import com.livefast.eattrash.raccoonforlemmy.core.utils.network.NetworkManager import com.livefast.eattrash.raccoonforlemmy.core.utils.share.DefaultShareHelper @@ -24,15 +22,6 @@ import com.livefast.eattrash.raccoonforlemmy.core.utils.vibrate.DefaultHapticFee import com.livefast.eattrash.raccoonforlemmy.core.utils.vibrate.HapticFeedback import org.koin.dsl.module -actual val imagePreloadModule = - module { - single { - DefaultImagePreloadManager( - context = get(), - ) - } - } - actual val networkModule = module { single { diff --git a/core/utils/src/androidMain/kotlin/com/livefast/eattrash/raccoonforlemmy/core/utils/fs/DefaultFileSystemManager.kt b/core/utils/src/androidMain/kotlin/com/livefast/eattrash/raccoonforlemmy/core/utils/fs/DefaultFileSystemManager.kt index 8f713234c..6f5ad84e5 100644 --- a/core/utils/src/androidMain/kotlin/com/livefast/eattrash/raccoonforlemmy/core/utils/fs/DefaultFileSystemManager.kt +++ b/core/utils/src/androidMain/kotlin/com/livefast/eattrash/raccoonforlemmy/core/utils/fs/DefaultFileSystemManager.kt @@ -5,6 +5,8 @@ import androidx.activity.compose.rememberLauncherForActivityResult import androidx.activity.result.contract.ActivityResultContracts import androidx.compose.runtime.Composable import androidx.compose.runtime.SideEffect +import okio.FileSystem +import okio.Path import org.koin.java.KoinJavaComponent import java.io.InputStreamReader import java.io.OutputStreamWriter @@ -55,6 +57,8 @@ class DefaultFileSystemManager( launcher.launch(name) } } + + override fun getTempDir(): Path = FileSystem.SYSTEM_TEMPORARY_DIRECTORY } actual fun getFileSystemManager(): FileSystemManager { diff --git a/core/utils/src/androidMain/kotlin/com/livefast/eattrash/raccoonforlemmy/core/utils/imageload/ImageUtils.kt b/core/utils/src/androidMain/kotlin/com/livefast/eattrash/raccoonforlemmy/core/utils/imageload/ImageUtils.kt new file mode 100644 index 000000000..6a4c8c65a --- /dev/null +++ b/core/utils/src/androidMain/kotlin/com/livefast/eattrash/raccoonforlemmy/core/utils/imageload/ImageUtils.kt @@ -0,0 +1,33 @@ +package com.livefast.eattrash.raccoonforlemmy.core.utils.imageload + +import android.graphics.Bitmap +import android.graphics.BitmapFactory +import android.os.Build +import androidx.compose.ui.graphics.ImageBitmap +import androidx.compose.ui.graphics.asImageBitmap +import coil3.decode.Decoder +import coil3.gif.AnimatedImageDecoder +import coil3.gif.GifDecoder +import org.koin.java.KoinJavaComponent + +actual fun ByteArray.toComposeImageBitmap(): ImageBitmap = BitmapFactory.decodeByteArray(this, 0, size).asImageBitmap() + +actual fun IntArray.toComposeImageBitmap( + width: Int, + height: Int, +): ImageBitmap = Bitmap.createBitmap(this, width, height, Bitmap.Config.ARGB_8888).asImageBitmap() + +actual fun getNativeDecoders(): List = + buildList { + if (Build.VERSION.SDK_INT >= 28) { + AnimatedImageDecoder.Factory() + } else { + GifDecoder.Factory() + } + } + +actual fun getImageLoaderProvider(): ImageLoaderProvider { + val inject = KoinJavaComponent.inject(ImageLoaderProvider::class.java) + val res by inject + return res +} diff --git a/core/utils/src/androidMain/kotlin/com/livefast/eattrash/raccoonforlemmy/core/utils/imagepreload/DefaultImagePreloadManager.kt b/core/utils/src/androidMain/kotlin/com/livefast/eattrash/raccoonforlemmy/core/utils/imagepreload/DefaultImagePreloadManager.kt deleted file mode 100644 index ee78ebf5f..000000000 --- a/core/utils/src/androidMain/kotlin/com/livefast/eattrash/raccoonforlemmy/core/utils/imagepreload/DefaultImagePreloadManager.kt +++ /dev/null @@ -1,25 +0,0 @@ -package com.livefast.eattrash.raccoonforlemmy.core.utils.imagepreload - -import android.content.Context -import coil.annotation.ExperimentalCoilApi -import coil.imageLoader -import coil.memory.MemoryCache -import coil.request.ImageRequest - -class DefaultImagePreloadManager( - private val context: Context, -) : ImagePreloadManager { - override fun preload(url: String) { - val request = - ImageRequest.Builder(context) - .data(url) - .build() - context.imageLoader.enqueue(request) - } - - @OptIn(ExperimentalCoilApi::class) - override fun remove(url: String) { - context.imageLoader.memoryCache?.remove(MemoryCache.Key(url)) - context.imageLoader.diskCache?.remove(url) - } -} diff --git a/core/utils/src/androidMain/kotlin/com/livefast/eattrash/raccoonforlemmy/core/utils/imagepreload/GetCoilImageLoader.kt b/core/utils/src/androidMain/kotlin/com/livefast/eattrash/raccoonforlemmy/core/utils/imagepreload/GetCoilImageLoader.kt deleted file mode 100644 index 481e31521..000000000 --- a/core/utils/src/androidMain/kotlin/com/livefast/eattrash/raccoonforlemmy/core/utils/imagepreload/GetCoilImageLoader.kt +++ /dev/null @@ -1,32 +0,0 @@ -package com.livefast.eattrash.raccoonforlemmy.core.utils.imagepreload - -import android.content.Context -import android.os.Build -import coil.ImageLoader -import coil.decode.GifDecoder -import coil.decode.ImageDecoderDecoder -import coil.disk.DiskCache -import coil.memory.MemoryCache - -fun getCoilImageLoader(context: Context): ImageLoader = - ImageLoader.Builder(context) - .components { - if (Build.VERSION.SDK_INT >= 28) { - add(ImageDecoderDecoder.Factory()) - } else { - add(GifDecoder.Factory()) - } - } - .memoryCache { - MemoryCache.Builder(context) - .maxSizePercent(0.25) - .build() - } - .diskCache { - DiskCache.Builder() - .directory(context.cacheDir.resolve("image_cache")) - .maxSizePercent(0.02) - .build() - } - .crossfade(true) - .build() diff --git a/core/utils/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/core/utils/di/Utils.kt b/core/utils/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/core/utils/di/Utils.kt index 059fb22ce..aacc39cd5 100644 --- a/core/utils/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/core/utils/di/Utils.kt +++ b/core/utils/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/core/utils/di/Utils.kt @@ -2,8 +2,6 @@ package com.livefast.eattrash.raccoonforlemmy.core.utils.di import org.koin.core.module.Module -expect val imagePreloadModule: Module - expect val networkModule: Module expect val appIconModule: Module diff --git a/core/utils/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/core/utils/di/UtilsModule.kt b/core/utils/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/core/utils/di/UtilsModule.kt index 7acdac8b1..1c7517594 100644 --- a/core/utils/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/core/utils/di/UtilsModule.kt +++ b/core/utils/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/core/utils/di/UtilsModule.kt @@ -1,5 +1,9 @@ package com.livefast.eattrash.raccoonforlemmy.core.utils.di +import com.livefast.eattrash.raccoonforlemmy.core.utils.imageload.DefaultImageLoaderProvider +import com.livefast.eattrash.raccoonforlemmy.core.utils.imageload.DefaultImagePreloadManager +import com.livefast.eattrash.raccoonforlemmy.core.utils.imageload.ImageLoaderProvider +import com.livefast.eattrash.raccoonforlemmy.core.utils.imageload.ImagePreloadManager import com.livefast.eattrash.raccoonforlemmy.core.utils.zombiemode.DefaultZombieModeHelper import com.livefast.eattrash.raccoonforlemmy.core.utils.zombiemode.ZombieModeHelper import org.koin.dsl.module @@ -9,4 +13,17 @@ val utilsModule = factory { DefaultZombieModeHelper() } + single { + DefaultImageLoaderProvider( + context = get(), + fileSystemManager = get(), + ) + } + + single { + DefaultImagePreloadManager( + context = get(), + imageLoaderProvider = get(), + ) + } } diff --git a/core/utils/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/core/utils/fs/FileSystemManager.kt b/core/utils/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/core/utils/fs/FileSystemManager.kt index 743499f6b..03bec95bb 100644 --- a/core/utils/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/core/utils/fs/FileSystemManager.kt +++ b/core/utils/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/core/utils/fs/FileSystemManager.kt @@ -1,6 +1,7 @@ package com.livefast.eattrash.raccoonforlemmy.core.utils.fs import androidx.compose.runtime.Composable +import okio.Path interface FileSystemManager { val isSupported: Boolean @@ -18,6 +19,8 @@ interface FileSystemManager { data: String, callback: (Boolean) -> Unit, ) + + fun getTempDir(): Path } expect fun getFileSystemManager(): FileSystemManager diff --git a/core/utils/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/core/utils/imageload/DefaultImageLoaderProvider.kt b/core/utils/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/core/utils/imageload/DefaultImageLoaderProvider.kt new file mode 100644 index 000000000..c5d96ef49 --- /dev/null +++ b/core/utils/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/core/utils/imageload/DefaultImageLoaderProvider.kt @@ -0,0 +1,39 @@ +package com.livefast.eattrash.raccoonforlemmy.core.utils.imageload + +import coil3.ImageLoader +import coil3.PlatformContext +import coil3.disk.DiskCache +import coil3.memory.MemoryCache +import coil3.request.crossfade +import com.livefast.eattrash.raccoonforlemmy.core.utils.fs.FileSystemManager + +internal class DefaultImageLoaderProvider( + private val context: PlatformContext, + private val fileSystemManager: FileSystemManager, +) : ImageLoaderProvider { + private val imageLoader by lazy { + ImageLoader + .Builder(context) + .components { + val decoders = getNativeDecoders() + for (decoder in decoders) { + add(decoder) + } + }.memoryCache { + MemoryCache + .Builder() + .maxSizePercent(context, 0.25) + .build() + }.diskCache { + val path = fileSystemManager.getTempDir() + DiskCache + .Builder() + .directory(path) + .maxSizePercent(0.02) + .build() + }.crossfade(true) + .build() + } + + override fun provideImageLoader(): ImageLoader = imageLoader +} diff --git a/core/utils/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/core/utils/imageload/DefaultImagePreloadManager.kt b/core/utils/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/core/utils/imageload/DefaultImagePreloadManager.kt new file mode 100644 index 000000000..911ad1a97 --- /dev/null +++ b/core/utils/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/core/utils/imageload/DefaultImagePreloadManager.kt @@ -0,0 +1,26 @@ +package com.livefast.eattrash.raccoonforlemmy.core.utils.imageload + +import coil3.PlatformContext +import coil3.memory.MemoryCache +import coil3.request.ImageRequest + +internal class DefaultImagePreloadManager( + private val context: PlatformContext, + private val imageLoaderProvider: ImageLoaderProvider, +) : ImagePreloadManager { + override fun preload(url: String) { + val imageLoader = imageLoaderProvider.provideImageLoader() + val request = + ImageRequest + .Builder(context) + .data(url) + .build() + imageLoader.enqueue(request) + } + + override fun remove(url: String) { + val imageLoader = imageLoaderProvider.provideImageLoader() + imageLoader.memoryCache?.remove(MemoryCache.Key(url)) + imageLoader.diskCache?.remove(url) + } +} diff --git a/core/utils/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/core/utils/imageload/ImageLoaderProvider.kt b/core/utils/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/core/utils/imageload/ImageLoaderProvider.kt new file mode 100644 index 000000000..92f86cf95 --- /dev/null +++ b/core/utils/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/core/utils/imageload/ImageLoaderProvider.kt @@ -0,0 +1,7 @@ +package com.livefast.eattrash.raccoonforlemmy.core.utils.imageload + +import coil3.ImageLoader + +interface ImageLoaderProvider { + fun provideImageLoader(): ImageLoader +} diff --git a/core/utils/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/core/utils/imagepreload/ImagePreloadManager.kt b/core/utils/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/core/utils/imageload/ImagePreloadManager.kt similarity index 57% rename from core/utils/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/core/utils/imagepreload/ImagePreloadManager.kt rename to core/utils/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/core/utils/imageload/ImagePreloadManager.kt index a26d6807b..8010f7bc4 100644 --- a/core/utils/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/core/utils/imagepreload/ImagePreloadManager.kt +++ b/core/utils/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/core/utils/imageload/ImagePreloadManager.kt @@ -1,4 +1,4 @@ -package com.livefast.eattrash.raccoonforlemmy.core.utils.imagepreload +package com.livefast.eattrash.raccoonforlemmy.core.utils.imageload interface ImagePreloadManager { fun preload(url: String) diff --git a/core/utils/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/core/utils/imageload/ImageUtils.kt b/core/utils/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/core/utils/imageload/ImageUtils.kt new file mode 100644 index 000000000..6992afb24 --- /dev/null +++ b/core/utils/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/core/utils/imageload/ImageUtils.kt @@ -0,0 +1,15 @@ +package com.livefast.eattrash.raccoonforlemmy.core.utils.imageload + +import androidx.compose.ui.graphics.ImageBitmap +import coil3.decode.Decoder + +expect fun ByteArray.toComposeImageBitmap(): ImageBitmap + +expect fun IntArray.toComposeImageBitmap( + width: Int, + height: Int, +): ImageBitmap + +expect fun getNativeDecoders(): List + +expect fun getImageLoaderProvider(): ImageLoaderProvider diff --git a/core/utils/src/iosMain/kotlin/com/livefast/eattrash/raccoonforlemmy/core/utils/di/Utils.kt b/core/utils/src/iosMain/kotlin/com/livefast/eattrash/raccoonforlemmy/core/utils/di/Utils.kt index 726c993d2..3e44bd734 100644 --- a/core/utils/src/iosMain/kotlin/com/livefast/eattrash/raccoonforlemmy/core/utils/di/Utils.kt +++ b/core/utils/src/iosMain/kotlin/com/livefast/eattrash/raccoonforlemmy/core/utils/di/Utils.kt @@ -12,8 +12,6 @@ import com.livefast.eattrash.raccoonforlemmy.core.utils.fs.DefaultFileSystemMana import com.livefast.eattrash.raccoonforlemmy.core.utils.fs.FileSystemManager import com.livefast.eattrash.raccoonforlemmy.core.utils.gallery.DefaultGalleryHelper import com.livefast.eattrash.raccoonforlemmy.core.utils.gallery.GalleryHelper -import com.livefast.eattrash.raccoonforlemmy.core.utils.imagepreload.DefaultImagePreloadManager -import com.livefast.eattrash.raccoonforlemmy.core.utils.imagepreload.ImagePreloadManager import com.livefast.eattrash.raccoonforlemmy.core.utils.network.DefaultNetworkManager import com.livefast.eattrash.raccoonforlemmy.core.utils.network.NetworkManager import com.livefast.eattrash.raccoonforlemmy.core.utils.share.DefaultShareHelper @@ -24,13 +22,6 @@ import com.livefast.eattrash.raccoonforlemmy.core.utils.vibrate.DefaultHapticFee import com.livefast.eattrash.raccoonforlemmy.core.utils.vibrate.HapticFeedback import org.koin.dsl.module -actual val imagePreloadModule = - module { - single { - DefaultImagePreloadManager() - } - } - actual val networkModule = module { single { DefaultNetworkManager() } diff --git a/core/utils/src/iosMain/kotlin/com/livefast/eattrash/raccoonforlemmy/core/utils/fs/DefaultFileSystemManager.kt b/core/utils/src/iosMain/kotlin/com/livefast/eattrash/raccoonforlemmy/core/utils/fs/DefaultFileSystemManager.kt index 1d4d436be..42415b197 100644 --- a/core/utils/src/iosMain/kotlin/com/livefast/eattrash/raccoonforlemmy/core/utils/fs/DefaultFileSystemManager.kt +++ b/core/utils/src/iosMain/kotlin/com/livefast/eattrash/raccoonforlemmy/core/utils/fs/DefaultFileSystemManager.kt @@ -1,6 +1,8 @@ package com.livefast.eattrash.raccoonforlemmy.core.utils.fs import androidx.compose.runtime.Composable +import okio.FileSystem +import okio.Path import org.koin.core.component.KoinComponent import org.koin.core.component.inject @@ -24,6 +26,8 @@ class DefaultFileSystemManager : FileSystemManager { ) { callback(false) } + + override fun getTempDir(): Path = FileSystem.SYSTEM_TEMPORARY_DIRECTORY } object FileSystemManagerDiHelper : KoinComponent { diff --git a/core/utils/src/iosMain/kotlin/com/livefast/eattrash/raccoonforlemmy/core/utils/imageload/ImageUtils.kt b/core/utils/src/iosMain/kotlin/com/livefast/eattrash/raccoonforlemmy/core/utils/imageload/ImageUtils.kt new file mode 100644 index 000000000..cd9f0368d --- /dev/null +++ b/core/utils/src/iosMain/kotlin/com/livefast/eattrash/raccoonforlemmy/core/utils/imageload/ImageUtils.kt @@ -0,0 +1,33 @@ +package com.livefast.eattrash.raccoonforlemmy.core.utils.imageload + +import androidx.compose.ui.graphics.ImageBitmap +import androidx.compose.ui.graphics.asComposeImageBitmap +import androidx.compose.ui.graphics.toComposeImageBitmap +import coil3.decode.Decoder +import org.jetbrains.skia.Bitmap +import org.jetbrains.skia.ColorAlphaType +import org.jetbrains.skia.ColorType +import org.jetbrains.skia.Image +import org.jetbrains.skia.ImageInfo +import org.koin.core.component.KoinComponent +import org.koin.core.component.inject + +actual fun ByteArray.toComposeImageBitmap(): ImageBitmap = Image.makeFromEncoded(this).toComposeImageBitmap() + +actual fun IntArray.toComposeImageBitmap( + width: Int, + height: Int, +): ImageBitmap { + val bmp = Bitmap() + val info = ImageInfo(width, height, ColorType.RGBA_8888, ColorAlphaType.PREMUL) + bmp.installPixels(info, map { it.toByte() }.toByteArray(), info.minRowBytes) + return bmp.asComposeImageBitmap() +} + +actual fun getNativeDecoders(): List = emptyList() + +actual fun getImageLoaderProvider(): ImageLoaderProvider = ImageUtilsDiHelper.imageLoaderProvider + +internal object ImageUtilsDiHelper : KoinComponent { + val imageLoaderProvider: ImageLoaderProvider by inject() +} diff --git a/core/utils/src/iosMain/kotlin/com/livefast/eattrash/raccoonforlemmy/core/utils/imagepreload/DefaultImagePreloadManager.kt b/core/utils/src/iosMain/kotlin/com/livefast/eattrash/raccoonforlemmy/core/utils/imagepreload/DefaultImagePreloadManager.kt deleted file mode 100644 index b6fe7bda1..000000000 --- a/core/utils/src/iosMain/kotlin/com/livefast/eattrash/raccoonforlemmy/core/utils/imagepreload/DefaultImagePreloadManager.kt +++ /dev/null @@ -1,11 +0,0 @@ -package com.livefast.eattrash.raccoonforlemmy.core.utils.imagepreload - -class DefaultImagePreloadManager() : ImagePreloadManager { - override fun preload(url: String) { - // no-op - } - - override fun remove(url: String) { - // no-op - } -} diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index fe6e0c025..af0d8170c 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -8,7 +8,7 @@ androidx-media3 = "1.4.1" androidx-splashscreen = "1.0.1" androidx-work = "2.9.1" android-gradle = "8.5.2" -coil = "2.7.0" +coil = "3.0.0" colorpicker = "1.1.2" compose = "1.7.0" detekt = "1.23.7" @@ -47,16 +47,16 @@ androidx-security-crypto = { module = "androidx.security:security-crypto", versi androidx-splashscreen = { module = "androidx.core:core-splashscreen", version.ref = "androidx-splashscreen" } androidx-work-runtime = { module = "androidx.work:work-runtime-ktx", version.ref = "androidx-work" } -kamel = { module = "media.kamel:kamel-image", version.ref = "kamel" } -coil = { module = "io.coil-kt:coil", version.ref = "coil" } -coil-compose = { module = "io.coil-kt:coil-compose", version.ref = "coil" } -coil-gif = { module = "io.coil-kt:coil-gif", version.ref = "coil" } +coil = { module = "io.coil-kt.coil3:coil", version.ref = "coil" } +coil-network-ktor = { module = "io.coil-kt.coil3:coil-network-ktor3", version.ref = "coil" } +coil-compose = { module = "io.coil-kt.coil3:coil-compose-core", version.ref = "coil" } +coil-gif = { module = "io.coil-kt.coil3:coil-gif", version.ref = "coil" } compose-colorpicker = { module = "com.github.skydoves:colorpicker-compose", version.ref = "colorpicker" } multiplatform-markdown-renderer = { module = "com.mikepenz:multiplatform-markdown-renderer", version.ref = "multiplatform-markdown-renderer" } multiplatform-markdown-renderer-m3 = { module = "com.mikepenz:multiplatform-markdown-renderer-m3", version.ref = "multiplatform-markdown-renderer" } -multiplatform-markdown-renderer-coil2 = { module = "com.mikepenz:multiplatform-markdown-renderer-coil2", version.ref = "multiplatform-markdown-renderer" } +multiplatform-markdown-renderer-coil3= { module = "com.mikepenz:multiplatform-markdown-renderer-coil3", version.ref = "multiplatform-markdown-renderer" } multiplatform-settings = { module = "com.russhwolf:multiplatform-settings", version.ref = "multiplatform-settings" } diff --git a/shared/src/androidMain/kotlin/com/livefast/eattrash/raccoonforlemmy/di/DiHelper.kt b/shared/src/androidMain/kotlin/com/livefast/eattrash/raccoonforlemmy/di/DiHelper.kt index 9007ee3e5..81be45d99 100644 --- a/shared/src/androidMain/kotlin/com/livefast/eattrash/raccoonforlemmy/di/DiHelper.kt +++ b/shared/src/androidMain/kotlin/com/livefast/eattrash/raccoonforlemmy/di/DiHelper.kt @@ -17,7 +17,6 @@ import com.livefast.eattrash.raccoonforlemmy.core.utils.di.customTabsModule import com.livefast.eattrash.raccoonforlemmy.core.utils.di.fileSystemModule import com.livefast.eattrash.raccoonforlemmy.core.utils.di.galleryHelperModule import com.livefast.eattrash.raccoonforlemmy.core.utils.di.hapticFeedbackModule -import com.livefast.eattrash.raccoonforlemmy.core.utils.di.imagePreloadModule import com.livefast.eattrash.raccoonforlemmy.core.utils.di.networkModule import com.livefast.eattrash.raccoonforlemmy.core.utils.di.shareHelperModule import com.livefast.eattrash.raccoonforlemmy.core.utils.di.utilsModule @@ -79,7 +78,6 @@ val sharedHelperModule = repositoryModule, utilsModule, domainInboxModule, - imagePreloadModule, networkModule, coreNavigationModule, lemmyUiModule, diff --git a/shared/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/navigation/TabNavigationItem.kt b/shared/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/navigation/TabNavigationItem.kt index 1c97d4370..df3069ef6 100644 --- a/shared/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/navigation/TabNavigationItem.kt +++ b/shared/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/navigation/TabNavigationItem.kt @@ -81,12 +81,13 @@ internal fun RowScope.TabNavigationItem( val iconSize = IconSize.m CustomImage( - url = customIconUrl, modifier = Modifier .size(iconSize) .clip(RoundedCornerShape(iconSize / 2)) .then(pointerInputModifier), + url = customIconUrl, + autoload = true, ) } else { Icon( diff --git a/shared/src/iosMain/kotlin/com/livefast/eattrash/raccoonforlemmy/di/DiHelper.kt b/shared/src/iosMain/kotlin/com/livefast/eattrash/raccoonforlemmy/di/DiHelper.kt index d5644df64..d6d816100 100644 --- a/shared/src/iosMain/kotlin/com/livefast/eattrash/raccoonforlemmy/di/DiHelper.kt +++ b/shared/src/iosMain/kotlin/com/livefast/eattrash/raccoonforlemmy/di/DiHelper.kt @@ -17,7 +17,6 @@ import com.livefast.eattrash.raccoonforlemmy.core.utils.di.customTabsModule import com.livefast.eattrash.raccoonforlemmy.core.utils.di.fileSystemModule import com.livefast.eattrash.raccoonforlemmy.core.utils.di.galleryHelperModule import com.livefast.eattrash.raccoonforlemmy.core.utils.di.hapticFeedbackModule -import com.livefast.eattrash.raccoonforlemmy.core.utils.di.imagePreloadModule import com.livefast.eattrash.raccoonforlemmy.core.utils.di.networkModule import com.livefast.eattrash.raccoonforlemmy.core.utils.di.shareHelperModule import com.livefast.eattrash.raccoonforlemmy.core.utils.di.utilsModule @@ -79,7 +78,6 @@ fun initKoin() { repositoryModule, domainInboxModule, utilsModule, - imagePreloadModule, networkModule, coreNavigationModule, lemmyUiModule, diff --git a/unit/acknowledgements/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/unit/acknowledgements/components/AcknoledgementItem.kt b/unit/acknowledgements/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/unit/acknowledgements/components/AcknoledgementItem.kt index 3c15a44b8..c2cb3ed4a 100644 --- a/unit/acknowledgements/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/unit/acknowledgements/components/AcknoledgementItem.kt +++ b/unit/acknowledgements/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/unit/acknowledgements/components/AcknoledgementItem.kt @@ -47,6 +47,7 @@ fun AcknoledgementItem( .clip(RoundedCornerShape(iconSize / 2)), contentDescription = null, url = url, + autoload = true, ) } } else { diff --git a/unit/communitydetail/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/unit/communitydetail/CommunityDetailViewModel.kt b/unit/communitydetail/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/unit/communitydetail/CommunityDetailViewModel.kt index 1af365ea0..bdbed02d1 100644 --- a/unit/communitydetail/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/unit/communitydetail/CommunityDetailViewModel.kt +++ b/unit/communitydetail/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/unit/communitydetail/CommunityDetailViewModel.kt @@ -14,7 +14,7 @@ import com.livefast.eattrash.raccoonforlemmy.core.persistence.repository.Communi import com.livefast.eattrash.raccoonforlemmy.core.persistence.repository.CommunitySortRepository import com.livefast.eattrash.raccoonforlemmy.core.persistence.repository.FavoriteCommunityRepository import com.livefast.eattrash.raccoonforlemmy.core.persistence.repository.SettingsRepository -import com.livefast.eattrash.raccoonforlemmy.core.utils.imagepreload.ImagePreloadManager +import com.livefast.eattrash.raccoonforlemmy.core.utils.imageload.ImagePreloadManager import com.livefast.eattrash.raccoonforlemmy.core.utils.share.ShareHelper import com.livefast.eattrash.raccoonforlemmy.core.utils.vibrate.HapticFeedback import com.livefast.eattrash.raccoonforlemmy.core.utils.zombiemode.ZombieModeHelper diff --git a/unit/drawer/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/unit/drawer/components/DrawerCommunityItem.kt b/unit/drawer/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/unit/drawer/components/DrawerCommunityItem.kt index 731949f6c..4ced02169 100644 --- a/unit/drawer/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/unit/drawer/components/DrawerCommunityItem.kt +++ b/unit/drawer/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/unit/drawer/components/DrawerCommunityItem.kt @@ -45,6 +45,7 @@ internal fun DrawerCommunityItem( .size(iconSize) .clip(RoundedCornerShape(iconSize / 2)), url = url, + autoload = autoLoadImages, contentScale = ContentScale.FillBounds, ) } else { diff --git a/unit/explore/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/unit/explore/ExploreViewModel.kt b/unit/explore/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/unit/explore/ExploreViewModel.kt index 38a03b684..2d2575807 100644 --- a/unit/explore/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/unit/explore/ExploreViewModel.kt +++ b/unit/explore/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/unit/explore/ExploreViewModel.kt @@ -8,7 +8,7 @@ import com.livefast.eattrash.raccoonforlemmy.core.architecture.DefaultMviModel import com.livefast.eattrash.raccoonforlemmy.core.notifications.NotificationCenter import com.livefast.eattrash.raccoonforlemmy.core.notifications.NotificationCenterEvent import com.livefast.eattrash.raccoonforlemmy.core.persistence.repository.SettingsRepository -import com.livefast.eattrash.raccoonforlemmy.core.utils.imagepreload.ImagePreloadManager +import com.livefast.eattrash.raccoonforlemmy.core.utils.imageload.ImagePreloadManager import com.livefast.eattrash.raccoonforlemmy.core.utils.vibrate.HapticFeedback import com.livefast.eattrash.raccoonforlemmy.domain.identity.repository.ApiConfigurationRepository import com.livefast.eattrash.raccoonforlemmy.domain.identity.repository.IdentityRepository @@ -390,7 +390,10 @@ class ExploreViewModel( val results = paginationManager.loadNextPage() if (uiState.value.autoLoadImages) { results.forEach { res -> - (res as? SearchResult.Post)?.model?.imageUrl?.takeIf { it.isNotEmpty() } + (res as? SearchResult.Post) + ?.model + ?.imageUrl + ?.takeIf { it.isNotEmpty() } ?.also { url -> imagePreloadManager.preload(url) } diff --git a/unit/filteredcontents/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/unit/filteredcontents/FilteredContentsViewModel.kt b/unit/filteredcontents/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/unit/filteredcontents/FilteredContentsViewModel.kt index 2a72557a0..513ffec71 100644 --- a/unit/filteredcontents/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/unit/filteredcontents/FilteredContentsViewModel.kt +++ b/unit/filteredcontents/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/unit/filteredcontents/FilteredContentsViewModel.kt @@ -11,7 +11,7 @@ import com.livefast.eattrash.raccoonforlemmy.core.architecture.DefaultMviModel import com.livefast.eattrash.raccoonforlemmy.core.notifications.NotificationCenter import com.livefast.eattrash.raccoonforlemmy.core.notifications.NotificationCenterEvent import com.livefast.eattrash.raccoonforlemmy.core.persistence.repository.SettingsRepository -import com.livefast.eattrash.raccoonforlemmy.core.utils.imagepreload.ImagePreloadManager +import com.livefast.eattrash.raccoonforlemmy.core.utils.imageload.ImagePreloadManager import com.livefast.eattrash.raccoonforlemmy.core.utils.vibrate.HapticFeedback import com.livefast.eattrash.raccoonforlemmy.domain.identity.repository.IdentityRepository import com.livefast.eattrash.raccoonforlemmy.domain.lemmy.data.CommentModel diff --git a/unit/modlog/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/unit/modlog/components/InnerModlogItem.kt b/unit/modlog/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/unit/modlog/components/InnerModlogItem.kt index 3023f2206..115139394 100644 --- a/unit/modlog/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/unit/modlog/components/InnerModlogItem.kt +++ b/unit/modlog/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/unit/modlog/components/InnerModlogItem.kt @@ -175,6 +175,7 @@ private fun ModlogHeader( url = creatorAvatar, quality = FilterQuality.Low, contentScale = ContentScale.FillBounds, + autoload = autoLoadImages, ) } Text( @@ -197,7 +198,6 @@ private fun ModlogFooter( onOpen: (() -> Unit)? = null, onOptionSelected: ((OptionId) -> Unit)? = null, ) { - val buttonModifier = Modifier.size(IconSize.l).padding(3.dp) var optionsExpanded by remember { mutableStateOf(false) } var optionsOffset by remember { mutableStateOf(Offset.Zero) } val ancillaryColor = MaterialTheme.colorScheme.onBackground.copy(alpha = ancillaryTextAlpha) diff --git a/unit/multicommunity/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/unit/multicommunity/detail/MultiCommunityViewModel.kt b/unit/multicommunity/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/unit/multicommunity/detail/MultiCommunityViewModel.kt index 78b40d4e3..3587fe380 100644 --- a/unit/multicommunity/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/unit/multicommunity/detail/MultiCommunityViewModel.kt +++ b/unit/multicommunity/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/unit/multicommunity/detail/MultiCommunityViewModel.kt @@ -11,7 +11,7 @@ import com.livefast.eattrash.raccoonforlemmy.core.notifications.NotificationCent import com.livefast.eattrash.raccoonforlemmy.core.persistence.data.MultiCommunityModel import com.livefast.eattrash.raccoonforlemmy.core.persistence.repository.MultiCommunityRepository import com.livefast.eattrash.raccoonforlemmy.core.persistence.repository.SettingsRepository -import com.livefast.eattrash.raccoonforlemmy.core.utils.imagepreload.ImagePreloadManager +import com.livefast.eattrash.raccoonforlemmy.core.utils.imageload.ImagePreloadManager import com.livefast.eattrash.raccoonforlemmy.core.utils.share.ShareHelper import com.livefast.eattrash.raccoonforlemmy.core.utils.vibrate.HapticFeedback import com.livefast.eattrash.raccoonforlemmy.domain.identity.repository.IdentityRepository diff --git a/unit/multicommunity/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/unit/multicommunity/editor/MultiCommunityEditorScreen.kt b/unit/multicommunity/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/unit/multicommunity/editor/MultiCommunityEditorScreen.kt index 5f73265b6..bf0475056 100644 --- a/unit/multicommunity/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/unit/multicommunity/editor/MultiCommunityEditorScreen.kt +++ b/unit/multicommunity/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/unit/multicommunity/editor/MultiCommunityEditorScreen.kt @@ -160,8 +160,8 @@ class MultiCommunityEditorScreen( value = uiState.name, keyboardOptions = KeyboardOptions( + autoCorrectEnabled = false, keyboardType = KeyboardType.Text, - autoCorrect = false, imeAction = ImeAction.Next, ), onValueChange = { value -> @@ -227,6 +227,7 @@ class MultiCommunityEditorScreen( }, ), url = url, + autoload = uiState.autoLoadImages, contentScale = ContentScale.FillBounds, ) } diff --git a/unit/postlist/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/unit/postlist/PostListViewModel.kt b/unit/postlist/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/unit/postlist/PostListViewModel.kt index 9e7be07b8..d880da377 100644 --- a/unit/postlist/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/unit/postlist/PostListViewModel.kt +++ b/unit/postlist/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/unit/postlist/PostListViewModel.kt @@ -9,7 +9,7 @@ import com.livefast.eattrash.raccoonforlemmy.core.architecture.DefaultMviModel import com.livefast.eattrash.raccoonforlemmy.core.notifications.NotificationCenter import com.livefast.eattrash.raccoonforlemmy.core.notifications.NotificationCenterEvent import com.livefast.eattrash.raccoonforlemmy.core.persistence.repository.SettingsRepository -import com.livefast.eattrash.raccoonforlemmy.core.utils.imagepreload.ImagePreloadManager +import com.livefast.eattrash.raccoonforlemmy.core.utils.imageload.ImagePreloadManager import com.livefast.eattrash.raccoonforlemmy.core.utils.share.ShareHelper import com.livefast.eattrash.raccoonforlemmy.core.utils.vibrate.HapticFeedback import com.livefast.eattrash.raccoonforlemmy.core.utils.zombiemode.ZombieModeHelper diff --git a/unit/reportlist/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/unit/reportlist/components/InnerReportCard.kt b/unit/reportlist/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/unit/reportlist/components/InnerReportCard.kt index 77be5543d..1b6626995 100644 --- a/unit/reportlist/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/unit/reportlist/components/InnerReportCard.kt +++ b/unit/reportlist/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/unit/reportlist/components/InnerReportCard.kt @@ -171,6 +171,7 @@ private fun ReportHeader( url = creatorAvatar, quality = FilterQuality.Low, contentScale = ContentScale.FillBounds, + autoload = autoLoadImages, ) } Text( @@ -193,7 +194,6 @@ private fun ReportFooter( onOpenResolve: (() -> Unit)? = null, onOptionSelected: ((OptionId) -> Unit)? = null, ) { - val buttonModifier = Modifier.size(IconSize.l).padding(3.dp) var optionsExpanded by remember { mutableStateOf(false) } var optionsOffset by remember { mutableStateOf(Offset.Zero) } val ancillaryColor = MaterialTheme.colorScheme.onBackground.copy(alpha = ancillaryTextAlpha) diff --git a/unit/userdetail/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/unit/userdetail/UserDetailViewModel.kt b/unit/userdetail/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/unit/userdetail/UserDetailViewModel.kt index 45d5c78fc..0b12e55d7 100644 --- a/unit/userdetail/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/unit/userdetail/UserDetailViewModel.kt +++ b/unit/userdetail/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/unit/userdetail/UserDetailViewModel.kt @@ -12,7 +12,7 @@ import com.livefast.eattrash.raccoonforlemmy.core.commonui.lemmyui.UserDetailSec import com.livefast.eattrash.raccoonforlemmy.core.notifications.NotificationCenter import com.livefast.eattrash.raccoonforlemmy.core.notifications.NotificationCenterEvent import com.livefast.eattrash.raccoonforlemmy.core.persistence.repository.SettingsRepository -import com.livefast.eattrash.raccoonforlemmy.core.utils.imagepreload.ImagePreloadManager +import com.livefast.eattrash.raccoonforlemmy.core.utils.imageload.ImagePreloadManager import com.livefast.eattrash.raccoonforlemmy.core.utils.share.ShareHelper import com.livefast.eattrash.raccoonforlemmy.core.utils.vibrate.HapticFeedback import com.livefast.eattrash.raccoonforlemmy.domain.identity.repository.ApiConfigurationRepository diff --git a/unit/zoomableimage/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/unit/zoomableimage/ZoomableImageViewModel.kt b/unit/zoomableimage/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/unit/zoomableimage/ZoomableImageViewModel.kt index 935b506ba..4e34a8841 100644 --- a/unit/zoomableimage/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/unit/zoomableimage/ZoomableImageViewModel.kt +++ b/unit/zoomableimage/src/commonMain/kotlin/com/livefast/eattrash/raccoonforlemmy/unit/zoomableimage/ZoomableImageViewModel.kt @@ -9,7 +9,7 @@ import com.livefast.eattrash.raccoonforlemmy.core.persistence.repository.Setting import com.livefast.eattrash.raccoonforlemmy.core.utils.datetime.epochMillis import com.livefast.eattrash.raccoonforlemmy.core.utils.gallery.GalleryHelper import com.livefast.eattrash.raccoonforlemmy.core.utils.gallery.download -import com.livefast.eattrash.raccoonforlemmy.core.utils.imagepreload.ImagePreloadManager +import com.livefast.eattrash.raccoonforlemmy.core.utils.imageload.ImagePreloadManager import com.livefast.eattrash.raccoonforlemmy.core.utils.share.ShareHelper import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers