mirror of
https://github.com/null2264/yokai.git
synced 2025-06-21 10:44:42 +00:00
refactor: Move CoilSetup to App
This commit is contained in:
parent
7138f20e52
commit
1c798b3a25
3 changed files with 60 additions and 67 deletions
|
@ -2,6 +2,7 @@ package eu.kanade.tachiyomi
|
||||||
|
|
||||||
import android.Manifest
|
import android.Manifest
|
||||||
import android.annotation.SuppressLint
|
import android.annotation.SuppressLint
|
||||||
|
import android.app.ActivityManager
|
||||||
import android.app.Application
|
import android.app.Application
|
||||||
import android.app.PendingIntent
|
import android.app.PendingIntent
|
||||||
import android.content.BroadcastReceiver
|
import android.content.BroadcastReceiver
|
||||||
|
@ -15,6 +16,7 @@ import androidx.appcompat.app.AppCompatDelegate
|
||||||
import androidx.core.app.ActivityCompat
|
import androidx.core.app.ActivityCompat
|
||||||
import androidx.core.app.NotificationManagerCompat
|
import androidx.core.app.NotificationManagerCompat
|
||||||
import androidx.core.content.ContextCompat
|
import androidx.core.content.ContextCompat
|
||||||
|
import androidx.core.content.getSystemService
|
||||||
import androidx.lifecycle.DefaultLifecycleObserver
|
import androidx.lifecycle.DefaultLifecycleObserver
|
||||||
import androidx.lifecycle.LifecycleOwner
|
import androidx.lifecycle.LifecycleOwner
|
||||||
import androidx.lifecycle.ProcessLifecycleOwner
|
import androidx.lifecycle.ProcessLifecycleOwner
|
||||||
|
@ -23,13 +25,24 @@ import androidx.multidex.MultiDex
|
||||||
import coil3.ImageLoader
|
import coil3.ImageLoader
|
||||||
import coil3.PlatformContext
|
import coil3.PlatformContext
|
||||||
import coil3.SingletonImageLoader
|
import coil3.SingletonImageLoader
|
||||||
|
import coil3.memory.MemoryCache
|
||||||
|
import coil3.network.okhttp.OkHttpNetworkFetcherFactory
|
||||||
|
import coil3.request.allowHardware
|
||||||
|
import coil3.request.allowRgb565
|
||||||
|
import coil3.request.crossfade
|
||||||
|
import coil3.util.DebugLogger
|
||||||
import dev.yokai.domain.AppState
|
import dev.yokai.domain.AppState
|
||||||
import eu.kanade.tachiyomi.appwidget.TachiyomiWidgetManager
|
import eu.kanade.tachiyomi.appwidget.TachiyomiWidgetManager
|
||||||
import eu.kanade.tachiyomi.data.image.coil.CoilSetup
|
import eu.kanade.tachiyomi.data.image.coil.CoilDiskCache
|
||||||
|
import eu.kanade.tachiyomi.data.image.coil.InputStreamFetcher
|
||||||
|
import eu.kanade.tachiyomi.data.image.coil.MangaCoverFetcher
|
||||||
|
import eu.kanade.tachiyomi.data.image.coil.MangaCoverKeyer
|
||||||
|
import eu.kanade.tachiyomi.data.image.coil.TachiyomiImageDecoder
|
||||||
import eu.kanade.tachiyomi.data.notification.Notifications
|
import eu.kanade.tachiyomi.data.notification.Notifications
|
||||||
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
|
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
|
||||||
import eu.kanade.tachiyomi.di.AppModule
|
import eu.kanade.tachiyomi.di.AppModule
|
||||||
import eu.kanade.tachiyomi.di.PreferenceModule
|
import eu.kanade.tachiyomi.di.PreferenceModule
|
||||||
|
import eu.kanade.tachiyomi.network.NetworkHelper
|
||||||
import eu.kanade.tachiyomi.ui.library.LibraryPresenter
|
import eu.kanade.tachiyomi.ui.library.LibraryPresenter
|
||||||
import eu.kanade.tachiyomi.ui.recents.RecentsPresenter
|
import eu.kanade.tachiyomi.ui.recents.RecentsPresenter
|
||||||
import eu.kanade.tachiyomi.ui.security.SecureActivityDelegate
|
import eu.kanade.tachiyomi.ui.security.SecureActivityDelegate
|
||||||
|
@ -44,6 +57,7 @@ import kotlinx.coroutines.flow.onEach
|
||||||
import org.conscrypt.Conscrypt
|
import org.conscrypt.Conscrypt
|
||||||
import timber.log.Timber
|
import timber.log.Timber
|
||||||
import uy.kohesive.injekt.Injekt
|
import uy.kohesive.injekt.Injekt
|
||||||
|
import uy.kohesive.injekt.api.get
|
||||||
import uy.kohesive.injekt.injectLazy
|
import uy.kohesive.injekt.injectLazy
|
||||||
import java.security.Security
|
import java.security.Security
|
||||||
|
|
||||||
|
@ -175,7 +189,25 @@ open class App : Application(), DefaultLifecycleObserver, SingletonImageLoader.F
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun newImageLoader(context: PlatformContext): ImageLoader {
|
override fun newImageLoader(context: PlatformContext): ImageLoader {
|
||||||
return CoilSetup.setup(this@App)
|
return ImageLoader.Builder(this@App).apply {
|
||||||
|
val callFactoryLazy = lazy { Injekt.get<NetworkHelper>().client }
|
||||||
|
val diskCacheLazy = lazy { CoilDiskCache.get(this@App) }
|
||||||
|
components {
|
||||||
|
add(OkHttpNetworkFetcherFactory(callFactoryLazy::value))
|
||||||
|
add(TachiyomiImageDecoder.Factory())
|
||||||
|
add(MangaCoverFetcher.Factory(callFactoryLazy, diskCacheLazy))
|
||||||
|
add(MangaCoverKeyer())
|
||||||
|
add(InputStreamFetcher.Factory())
|
||||||
|
}
|
||||||
|
diskCache(diskCacheLazy::value)
|
||||||
|
memoryCache { MemoryCache.Builder().maxSizePercent(this@App, 0.40).build() }
|
||||||
|
crossfade(true)
|
||||||
|
allowRgb565(this@App.getSystemService<ActivityManager>()!!.isLowRamDevice)
|
||||||
|
allowHardware(true)
|
||||||
|
if (BuildConfig.DEBUG) {
|
||||||
|
logger(DebugLogger())
|
||||||
|
}
|
||||||
|
}.build()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,26 @@
|
||||||
|
package eu.kanade.tachiyomi.data.image.coil
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
|
import coil3.disk.DiskCache
|
||||||
|
import coil3.disk.directory
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Direct copy of Coil's internal SingletonDiskCache so that [MangaCoverFetcher] can access it.
|
||||||
|
*/
|
||||||
|
object CoilDiskCache {
|
||||||
|
|
||||||
|
private const val FOLDER_NAME = "image_cache"
|
||||||
|
private var instance: DiskCache? = null
|
||||||
|
|
||||||
|
@Synchronized
|
||||||
|
fun get(context: Context): DiskCache {
|
||||||
|
return instance ?: run {
|
||||||
|
val safeCacheDir = context.cacheDir.apply { mkdirs() }
|
||||||
|
// Create the singleton disk cache instance.
|
||||||
|
DiskCache.Builder()
|
||||||
|
.directory(safeCacheDir.resolve(FOLDER_NAME))
|
||||||
|
.build()
|
||||||
|
.also { instance = it }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,65 +0,0 @@
|
||||||
package eu.kanade.tachiyomi.data.image.coil
|
|
||||||
|
|
||||||
import android.app.ActivityManager
|
|
||||||
import android.content.Context
|
|
||||||
import androidx.core.content.getSystemService
|
|
||||||
import coil3.ImageLoader
|
|
||||||
import coil3.disk.DiskCache
|
|
||||||
import coil3.disk.directory
|
|
||||||
import coil3.memory.MemoryCache
|
|
||||||
import coil3.network.okhttp.OkHttpNetworkFetcherFactory
|
|
||||||
import coil3.request.allowHardware
|
|
||||||
import coil3.request.allowRgb565
|
|
||||||
import coil3.request.crossfade
|
|
||||||
import coil3.util.DebugLogger
|
|
||||||
import eu.kanade.tachiyomi.BuildConfig
|
|
||||||
import eu.kanade.tachiyomi.network.NetworkHelper
|
|
||||||
import uy.kohesive.injekt.Injekt
|
|
||||||
import uy.kohesive.injekt.api.get
|
|
||||||
|
|
||||||
class CoilSetup {
|
|
||||||
companion object {
|
|
||||||
fun setup(context: Context): ImageLoader {
|
|
||||||
return ImageLoader.Builder(context).apply {
|
|
||||||
val callFactoryLazy = lazy { Injekt.get<NetworkHelper>().client }
|
|
||||||
val diskCacheLazy = lazy { CoilDiskCache.get(context) }
|
|
||||||
components {
|
|
||||||
add(OkHttpNetworkFetcherFactory(callFactoryLazy::value))
|
|
||||||
add(TachiyomiImageDecoder.Factory())
|
|
||||||
add(MangaCoverFetcher.Factory(callFactoryLazy, diskCacheLazy))
|
|
||||||
add(MangaCoverKeyer())
|
|
||||||
add(InputStreamFetcher.Factory())
|
|
||||||
}
|
|
||||||
diskCache(diskCacheLazy::value)
|
|
||||||
memoryCache { MemoryCache.Builder().maxSizePercent(context, 0.40).build() }
|
|
||||||
crossfade(true)
|
|
||||||
allowRgb565(context.getSystemService<ActivityManager>()!!.isLowRamDevice)
|
|
||||||
allowHardware(true)
|
|
||||||
if (BuildConfig.DEBUG) {
|
|
||||||
logger(DebugLogger())
|
|
||||||
}
|
|
||||||
}.build()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Direct copy of Coil's internal SingletonDiskCache so that [MangaCoverFetcher] can access it.
|
|
||||||
*/
|
|
||||||
internal object CoilDiskCache {
|
|
||||||
|
|
||||||
private const val FOLDER_NAME = "image_cache"
|
|
||||||
private var instance: DiskCache? = null
|
|
||||||
|
|
||||||
@Synchronized
|
|
||||||
fun get(context: Context): DiskCache {
|
|
||||||
return instance ?: run {
|
|
||||||
val safeCacheDir = context.cacheDir.apply { mkdirs() }
|
|
||||||
// Create the singleton disk cache instance.
|
|
||||||
DiskCache.Builder()
|
|
||||||
.directory(safeCacheDir.resolve(FOLDER_NAME))
|
|
||||||
.build()
|
|
||||||
.also { instance = it }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
Add table
Add a link
Reference in a new issue