Skip to content

Commit 62d592e

Browse files
authored
Merge pull request #210 from YAPP-Github/feat/#209-coil-image-loader-setup
[Feature/#209] Coil3 커스텀 ImageLoader 설정 추가
2 parents ae9b324 + bdf825c commit 62d592e

File tree

4 files changed

+70
-10
lines changed

4 files changed

+70
-10
lines changed

app/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,4 +100,5 @@ dependencies {
100100
implementation(libs.bundles.retrofit)
101101
implementation(platform(libs.okhttp.bom))
102102
implementation(libs.bundles.okhttp)
103+
implementation(libs.bundles.coil)
103104
}

app/src/main/java/com/threegap/bitnagil/BitnagilApplication.kt

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,51 @@
11
package com.threegap.bitnagil
22

33
import android.app.Application
4+
import coil3.ImageLoader
5+
import coil3.PlatformContext
6+
import coil3.SingletonImageLoader
7+
import coil3.disk.DiskCache
8+
import coil3.memory.MemoryCache
9+
import coil3.network.okhttp.OkHttpNetworkFetcherFactory
10+
import coil3.request.crossfade
11+
import coil3.util.DebugLogger
412
import com.kakao.sdk.common.KakaoSdk
13+
import com.threegap.bitnagil.di.core.CoilEntryPoint
14+
import dagger.hilt.EntryPoints
515
import dagger.hilt.android.HiltAndroidApp
16+
import okio.Path.Companion.toOkioPath
617

718
@HiltAndroidApp
8-
class BitnagilApplication : Application() {
19+
class BitnagilApplication : Application(), SingletonImageLoader.Factory {
20+
921
override fun onCreate() {
1022
super.onCreate()
1123
initKakaoSdk()
1224
}
1325

26+
override fun newImageLoader(context: PlatformContext): ImageLoader {
27+
val okHttpClient = EntryPoints
28+
.get(this, CoilEntryPoint::class.java)
29+
.noneAuthOkHttpClient()
30+
31+
return ImageLoader.Builder(context)
32+
.components { add(OkHttpNetworkFetcherFactory(callFactory = { okHttpClient })) }
33+
.memoryCache {
34+
MemoryCache.Builder()
35+
.maxSizePercent(context, percent = 0.25)
36+
.build()
37+
}
38+
.diskCache {
39+
DiskCache.Builder()
40+
.directory(cacheDir.resolve("image_cache").toOkioPath())
41+
.maxSizeBytes(50L * 1024 * 1024)
42+
.build()
43+
}
44+
.crossfade(true)
45+
.logger(if (BuildConfig.DEBUG) DebugLogger() else null)
46+
.build()
47+
}
48+
1449
private fun initKakaoSdk() {
1550
KakaoSdk.init(this, BuildConfig.KAKAO_NATIVE_APP_KEY)
1651
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package com.threegap.bitnagil.di.core
2+
3+
import com.threegap.bitnagil.network.NoneAuth
4+
import dagger.hilt.EntryPoint
5+
import dagger.hilt.InstallIn
6+
import dagger.hilt.components.SingletonComponent
7+
import okhttp3.OkHttpClient
8+
9+
@EntryPoint
10+
@InstallIn(SingletonComponent::class)
11+
interface CoilEntryPoint {
12+
@NoneAuth
13+
fun noneAuthOkHttpClient(): OkHttpClient
14+
}

presentation/src/main/java/com/threegap/bitnagil/presentation/screen/home/component/template/CollapsibleHeader.kt

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import androidx.compose.ui.text.font.FontWeight
1414
import androidx.compose.ui.text.style.LineHeightStyle
1515
import androidx.compose.ui.tooling.preview.Preview
1616
import androidx.compose.ui.unit.dp
17+
import androidx.compose.foundation.Image
1718
import coil3.compose.AsyncImage
1819
import com.threegap.bitnagil.designsystem.BitnagilTheme
1920
import com.threegap.bitnagil.designsystem.R
@@ -53,15 +54,24 @@ fun CollapsibleHeader(
5354
)
5455
}
5556

56-
AsyncImage(
57-
model = dailyEmotion.imageUrl,
58-
modifier = Modifier
59-
.align(Alignment.TopEnd)
60-
.size(baseImageWidth, baseImageHeight),
61-
contentDescription = null,
62-
placeholder = painterResource(R.drawable.default_emotion),
63-
error = painterResource(R.drawable.default_emotion),
64-
)
57+
if (dailyEmotion.imageUrl.isEmpty()) {
58+
Image(
59+
painter = painterResource(R.drawable.default_emotion),
60+
modifier = Modifier
61+
.align(Alignment.TopEnd)
62+
.size(baseImageWidth, baseImageHeight),
63+
contentDescription = null,
64+
)
65+
} else {
66+
AsyncImage(
67+
model = dailyEmotion.imageUrl,
68+
modifier = Modifier
69+
.align(Alignment.TopEnd)
70+
.size(baseImageWidth, baseImageHeight),
71+
contentDescription = null,
72+
error = painterResource(R.drawable.default_emotion),
73+
)
74+
}
6575
}
6676
}
6777

0 commit comments

Comments
 (0)