diff --git a/app/src/main/java/kr/co/vividnext/sodalive/app/SodaLiveApp.kt b/app/src/main/java/kr/co/vividnext/sodalive/app/SodaLiveApp.kt index 1d11857..5adc6a5 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/app/SodaLiveApp.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/app/SodaLiveApp.kt @@ -8,6 +8,7 @@ import androidx.appcompat.app.AppCompatDelegate import com.orhanobut.logger.AndroidLogAdapter import com.orhanobut.logger.Logger import kr.co.vividnext.sodalive.BuildConfig +import kr.co.vividnext.sodalive.common.ImageLoaderProvider import kr.co.vividnext.sodalive.common.SharedPreferenceManager import kr.co.vividnext.sodalive.di.AppDI @@ -26,6 +27,8 @@ class SodaLiveApp : Application() { AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES) SharedPreferenceManager.init(applicationContext) + + ImageLoaderProvider.init(applicationContext) } private fun isDebuggable(): Boolean { diff --git a/app/src/main/java/kr/co/vividnext/sodalive/common/ImageLoaderProvider.kt b/app/src/main/java/kr/co/vividnext/sodalive/common/ImageLoaderProvider.kt new file mode 100644 index 0000000..1d9aa05 --- /dev/null +++ b/app/src/main/java/kr/co/vividnext/sodalive/common/ImageLoaderProvider.kt @@ -0,0 +1,32 @@ +package kr.co.vividnext.sodalive.common + +import android.content.Context +import coil.ImageLoader +import okhttp3.Cache +import okhttp3.OkHttpClient +import java.io.File + +object ImageLoaderProvider { + lateinit var imageLoader: ImageLoader + private set + + val isInitialized: Boolean + get() = ::imageLoader.isInitialized + fun init(context: Context) { + val cacheSize = 250L * 1024L * 1024L // 250 MB + val cacheDirectory = File( + context.cacheDir, + "image_cache" + ).apply { mkdirs() } + + val cache = Cache(cacheDirectory, cacheSize) + + imageLoader = ImageLoader.Builder(context) + .okHttpClient { + OkHttpClient().newBuilder() + .cache(cache) + .build() + } + .build() + } +} diff --git a/app/src/main/java/kr/co/vividnext/sodalive/extensions/ImageExtensions.kt b/app/src/main/java/kr/co/vividnext/sodalive/extensions/ImageExtensions.kt new file mode 100644 index 0000000..514eda9 --- /dev/null +++ b/app/src/main/java/kr/co/vividnext/sodalive/extensions/ImageExtensions.kt @@ -0,0 +1,14 @@ +package kr.co.vividnext.sodalive.extensions + +import android.widget.ImageView +import coil.load +import coil.request.ImageRequest +import kr.co.vividnext.sodalive.common.ImageLoaderProvider +import kr.co.vividnext.sodalive.common.ImageLoaderProvider.imageLoader + +fun ImageView.loadUrl(url: String?, builder: ImageRequest.Builder.() -> Unit = {}) { + if (!ImageLoaderProvider.isInitialized) { + throw IllegalStateException("ImageLoaderProvider is not initialized") + } + this.load(url, imageLoader, builder) +} diff --git a/app/src/main/java/kr/co/vividnext/sodalive/live/room/LiveRoomActivity.kt b/app/src/main/java/kr/co/vividnext/sodalive/live/room/LiveRoomActivity.kt index 16f070d..e29b268 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/live/room/LiveRoomActivity.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/live/room/LiveRoomActivity.kt @@ -57,6 +57,7 @@ import kr.co.vividnext.sodalive.common.SodaLiveService import kr.co.vividnext.sodalive.databinding.ActivityLiveRoomBinding import kr.co.vividnext.sodalive.dialog.LiveDialog import kr.co.vividnext.sodalive.extensions.dpToPx +import kr.co.vividnext.sodalive.extensions.loadUrl import kr.co.vividnext.sodalive.extensions.moneyFormat import kr.co.vividnext.sodalive.live.room.chat.LiveRoomChatAdapter import kr.co.vividnext.sodalive.live.room.chat.LiveRoomChatRawMessage @@ -674,13 +675,7 @@ class LiveRoomActivity : BaseActivity(ActivityLiveRoomB } binding.tvTitle.text = response.title - binding.ivCover.load( - response.coverImageUrl, - imageLoader = ImageLoader.Builder(applicationContext) - .memoryCachePolicy(CachePolicy.ENABLED) - .diskCachePolicy(CachePolicy.ENABLED) - .build() - ) + binding.ivCover.loadUrl(response.coverImageUrl) binding.flDonation.visibility = if (response.creatorId != SharedPreferenceManager.userId) { @@ -797,7 +792,7 @@ class LiveRoomActivity : BaseActivity(ActivityLiveRoomB setNoticeAndClickableUrl(binding.tvNotice, response.notice) binding.tvCreatorNickname.text = response.creatorNickname - binding.ivCreatorProfile.load(response.creatorProfileUrl) { + binding.ivCreatorProfile.loadUrl(response.creatorProfileUrl) { crossfade(true) placeholder(R.drawable.ic_place_holder) transformations(CircleCropTransformation()) diff --git a/app/src/main/java/kr/co/vividnext/sodalive/live/room/profile/LiveRoomProfileListAdapter.kt b/app/src/main/java/kr/co/vividnext/sodalive/live/room/profile/LiveRoomProfileListAdapter.kt index d92d12f..67ff8e1 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/live/room/profile/LiveRoomProfileListAdapter.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/live/room/profile/LiveRoomProfileListAdapter.kt @@ -10,6 +10,7 @@ import coil.transform.RoundedCornersTransformation import kr.co.vividnext.sodalive.R import kr.co.vividnext.sodalive.databinding.ItemLiveRoomProfileBinding import kr.co.vividnext.sodalive.extensions.dpToPx +import kr.co.vividnext.sodalive.extensions.loadUrl import kr.co.vividnext.sodalive.live.room.info.LiveRoomMember class LiveRoomProfileListAdapter : RecyclerView.Adapter() { @@ -17,7 +18,7 @@ class LiveRoomProfileListAdapter : RecyclerView.Adapter