diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 7417a8f0..6e2bd0c0 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -100,4 +100,5 @@ dependencies { implementation(libs.bundles.retrofit) implementation(platform(libs.okhttp.bom)) implementation(libs.bundles.okhttp) + implementation(libs.bundles.coil) } diff --git a/app/src/main/java/com/threegap/bitnagil/BitnagilApplication.kt b/app/src/main/java/com/threegap/bitnagil/BitnagilApplication.kt index 0676666e..392de4eb 100644 --- a/app/src/main/java/com/threegap/bitnagil/BitnagilApplication.kt +++ b/app/src/main/java/com/threegap/bitnagil/BitnagilApplication.kt @@ -1,16 +1,51 @@ package com.threegap.bitnagil import android.app.Application +import coil3.ImageLoader +import coil3.PlatformContext +import coil3.SingletonImageLoader +import coil3.disk.DiskCache +import coil3.memory.MemoryCache +import coil3.network.okhttp.OkHttpNetworkFetcherFactory +import coil3.request.crossfade +import coil3.util.DebugLogger import com.kakao.sdk.common.KakaoSdk +import com.threegap.bitnagil.di.core.CoilEntryPoint +import dagger.hilt.EntryPoints import dagger.hilt.android.HiltAndroidApp +import okio.Path.Companion.toOkioPath @HiltAndroidApp -class BitnagilApplication : Application() { +class BitnagilApplication : Application(), SingletonImageLoader.Factory { + override fun onCreate() { super.onCreate() initKakaoSdk() } + override fun newImageLoader(context: PlatformContext): ImageLoader { + val okHttpClient = EntryPoints + .get(this, CoilEntryPoint::class.java) + .noneAuthOkHttpClient() + + return ImageLoader.Builder(context) + .components { add(OkHttpNetworkFetcherFactory(callFactory = { okHttpClient })) } + .memoryCache { + MemoryCache.Builder() + .maxSizePercent(context, percent = 0.25) + .build() + } + .diskCache { + DiskCache.Builder() + .directory(cacheDir.resolve("image_cache").toOkioPath()) + .maxSizeBytes(50L * 1024 * 1024) + .build() + } + .crossfade(true) + .logger(if (BuildConfig.DEBUG) DebugLogger() else null) + .build() + } + private fun initKakaoSdk() { KakaoSdk.init(this, BuildConfig.KAKAO_NATIVE_APP_KEY) } diff --git a/app/src/main/java/com/threegap/bitnagil/di/core/CoilEntryPoint.kt b/app/src/main/java/com/threegap/bitnagil/di/core/CoilEntryPoint.kt new file mode 100644 index 00000000..c2cc7278 --- /dev/null +++ b/app/src/main/java/com/threegap/bitnagil/di/core/CoilEntryPoint.kt @@ -0,0 +1,14 @@ +package com.threegap.bitnagil.di.core + +import com.threegap.bitnagil.network.NoneAuth +import dagger.hilt.EntryPoint +import dagger.hilt.InstallIn +import dagger.hilt.components.SingletonComponent +import okhttp3.OkHttpClient + +@EntryPoint +@InstallIn(SingletonComponent::class) +interface CoilEntryPoint { + @NoneAuth + fun noneAuthOkHttpClient(): OkHttpClient +} diff --git a/presentation/src/main/java/com/threegap/bitnagil/presentation/screen/home/component/template/CollapsibleHeader.kt b/presentation/src/main/java/com/threegap/bitnagil/presentation/screen/home/component/template/CollapsibleHeader.kt index c1969480..dff8a893 100644 --- a/presentation/src/main/java/com/threegap/bitnagil/presentation/screen/home/component/template/CollapsibleHeader.kt +++ b/presentation/src/main/java/com/threegap/bitnagil/presentation/screen/home/component/template/CollapsibleHeader.kt @@ -14,6 +14,7 @@ import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.LineHeightStyle import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp +import androidx.compose.foundation.Image import coil3.compose.AsyncImage import com.threegap.bitnagil.designsystem.BitnagilTheme import com.threegap.bitnagil.designsystem.R @@ -53,15 +54,24 @@ fun CollapsibleHeader( ) } - AsyncImage( - model = dailyEmotion.imageUrl, - modifier = Modifier - .align(Alignment.TopEnd) - .size(baseImageWidth, baseImageHeight), - contentDescription = null, - placeholder = painterResource(R.drawable.default_emotion), - error = painterResource(R.drawable.default_emotion), - ) + if (dailyEmotion.imageUrl.isEmpty()) { + Image( + painter = painterResource(R.drawable.default_emotion), + modifier = Modifier + .align(Alignment.TopEnd) + .size(baseImageWidth, baseImageHeight), + contentDescription = null, + ) + } else { + AsyncImage( + model = dailyEmotion.imageUrl, + modifier = Modifier + .align(Alignment.TopEnd) + .size(baseImageWidth, baseImageHeight), + contentDescription = null, + error = painterResource(R.drawable.default_emotion), + ) + } } }