2
0
Эх сурвалжийг харах

image caching improvement

Milan Jurkulak 3 жил өмнө
parent
commit
8f93076d83

+ 4 - 0
app/build.gradle.kts

@@ -270,6 +270,10 @@ dependencies {
     implementation("androidx.media3:media3-common:1.1.1")
     // images
     implementation("io.coil-kt:coil-base:2.4.0")
+    implementation("io.coil-kt:coil-gif:2.4.0")
+    implementation("io.coil-kt:coil-svg:2.4.0")
+    implementation("io.coil-kt:coil-video:2.4.0")
+    implementation("io.coil-kt:coil-compose:2.4.0")
     implementation("com.github.skydoves:landscapist-coil:2.2.10")
     // libs mismatch
     constraints {

+ 1 - 0
app/src/main/kotlin/org/mjdev/tvapp/activity/MainActivity.kt

@@ -30,4 +30,5 @@ class MainActivity : TvActivity() {
         screen(route = MainScreen(), isHomeScreen = true)
 
     }
+
 }

+ 61 - 5
app/src/main/kotlin/org/mjdev/tvapp/app/Application.kt

@@ -8,22 +8,78 @@
 
 package org.mjdev.tvapp.app
 
+import android.os.Build
+import coil.ImageLoader
+import coil.decode.GifDecoder
+import coil.decode.ImageDecoderDecoder
+import coil.decode.SvgDecoder
+import coil.decode.VideoFrameDecoder
+import coil.disk.DiskCache
+import coil.request.CachePolicy
 import dagger.hilt.android.HiltAndroidApp
+import okhttp3.Cache
+import okhttp3.OkHttpClient
+import okhttp3.logging.HttpLoggingInterceptor
 import org.mjdev.tvapp.sync.SyncService
 import org.mjdev.tvapp.sync.SyncService.Companion.createSyncAccount
 import org.mjdev.tvlib.application.TvApplication
 import org.mjdev.tvlib.extensions.GlobalExt.postDelayed
+import org.mjdev.tvlib.helpers.coil.AlbumArtDecoder
+import org.mjdev.tvlib.network.CacheInterceptor
+import java.io.File
 
 @HiltAndroidApp
 class Application : TvApplication() {
 
+    private val imageLoader by lazy {
+        ImageLoader.Builder(this)
+            .allowHardware(false)
+//            .allowRgb565(true)
+            .addLastModifiedToFileCacheKey(false)
+            .crossfade(false)
+            .diskCachePolicy(CachePolicy.ENABLED)
+            .memoryCachePolicy(CachePolicy.ENABLED)
+            .respectCacheHeaders(false)
+            .networkObserverEnabled(false)
+            .okHttpClient {
+                OkHttpClient.Builder()
+                    .cache(
+                        Cache(
+                            directory = File(
+                                cacheDir,
+                                "http_cache"
+                            ),
+                            maxSize = 1024L * 1024L * 1024L
+                        )
+                    )
+                    .addNetworkInterceptor(HttpLoggingInterceptor().apply {
+                        level = HttpLoggingInterceptor.Level.BODY
+                    })
+                    .addNetworkInterceptor(CacheInterceptor())
+                    .build()
+            }
+            .diskCache {
+                DiskCache.Builder()
+                    .directory(cacheDir.resolve("image_cache"))
+                    .maxSizePercent(0.7)
+                    .build()
+            }
+            .components {
+                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
+                    add(ImageDecoderDecoder.Factory())
+                } else {
+                    add(GifDecoder.Factory())
+                }
+                add(AlbumArtDecoder.Factory())
+                add(VideoFrameDecoder.Factory())
+                add(SvgDecoder.Factory())
+            }.build()
+    }
+
     override fun onCreate() {
         super.onCreate()
-        createSyncAccount()?.also { account ->
-            postDelayed(20000) {
-                SyncService.requestSync(account)
-            }
-        }
+
     }
 
+    override fun createImageLoader(): ImageLoader = imageLoader
 }

+ 13 - 1
app/src/main/kotlin/org/mjdev/tvapp/helpers/SyncAdapterInitializer.kt

@@ -10,13 +10,25 @@ package org.mjdev.tvapp.helpers
 
 import android.content.Context
 import androidx.startup.Initializer
+import org.mjdev.tvapp.sync.SyncService
+import org.mjdev.tvapp.sync.SyncService.Companion.createSyncAccount
+import org.mjdev.tvlib.extensions.GlobalExt.postDelayed
+import timber.log.Timber
 
-// todo
 @Suppress("unused")
 class SyncAdapterInitializer : Initializer<Unit> {
+
     override fun create(context: Context) {
+        Timber.d("Sync started.")
+        context.createSyncAccount()?.also { account ->
+            postDelayed(20000) {
+                SyncService.requestSync(account)
+            }
+        }
     }
+
     override fun dependencies(): List<Class<out Initializer<*>>> {
         return emptyList()
     }
+
 }

+ 4 - 0
tvlib/src/main/kotlin/org/mjdev/tvlib/activity/ComposableActivity.kt

@@ -33,6 +33,7 @@ import coil.ImageLoader
 import com.github.anrwatchdog.ANRWatchDog
 import org.mjdev.tvlib.BuildConfig
 import org.mjdev.tvlib.annotations.Previews
+import org.mjdev.tvlib.application.TvApplication
 import org.mjdev.tvlib.extensions.ComposeExt.createImageLoader
 import org.mjdev.tvlib.extensions.ModifierExt.swipeGestures
 import org.mjdev.tvlib.extensions.NavExt.navControllerEx
@@ -176,4 +177,7 @@ open class ComposableActivity : ComponentActivity() {
         }
     }
 
+    open fun createImageLoader(): ImageLoader? =
+        (application as? TvApplication)?.createImageLoader()
+
 }

+ 3 - 0
tvlib/src/main/kotlin/org/mjdev/tvlib/application/TvApplication.kt

@@ -11,10 +11,13 @@
 package org.mjdev.tvlib.application
 
 import android.app.Application
+import coil.ImageLoader
 
 open class TvApplication : Application() {
     override fun onCreate() {
         super.onCreate()
 //        DynamicColors.applyToActivitiesIfAvailable(this)
     }
+
+    open fun createImageLoader(): ImageLoader? = null
 }

+ 1 - 1
tvlib/src/main/kotlin/org/mjdev/tvlib/extensions/ComposeExt.kt

@@ -195,7 +195,7 @@ object ComposeExt {
         val activity = runCatching { context.activity<ComposableActivity>() }.getOrNull()
         val cachedImageLoader = activity?.imageLoader
         return cachedImageLoader ?: remember(context) {
-            createImageLoader(context)
+            activity?.createImageLoader() ?: createImageLoader(context)
         }
     }