package eu.kanade.tachiyomi import android.app.Application import android.os.Build import androidx.core.content.ContextCompat import androidx.sqlite.db.SupportSQLiteDatabase import androidx.sqlite.db.framework.FrameworkSQLiteOpenHelperFactory import com.squareup.sqldelight.android.AndroidSqliteDriver import com.squareup.sqldelight.db.SqlDriver import data.Categories import data.History import data.Mangas import eu.kanade.data.AndroidDatabaseHandler import eu.kanade.data.DatabaseHandler import eu.kanade.data.dateAdapter import eu.kanade.data.listOfLongsAdapter import eu.kanade.data.listOfStringsAdapter import eu.kanade.data.listOfStringsAndAdapter import eu.kanade.tachiyomi.data.cache.ChapterCache import eu.kanade.tachiyomi.data.cache.CoverCache import eu.kanade.tachiyomi.data.cache.PagePreviewCache import eu.kanade.tachiyomi.data.download.DownloadManager import eu.kanade.tachiyomi.data.library.CustomMangaManager import eu.kanade.tachiyomi.data.preference.PreferencesHelper import eu.kanade.tachiyomi.data.saver.ImageSaver import eu.kanade.tachiyomi.data.track.TrackManager import eu.kanade.tachiyomi.data.track.job.DelayedTrackingStore import eu.kanade.tachiyomi.extension.ExtensionManager import eu.kanade.tachiyomi.network.NetworkHelper import eu.kanade.tachiyomi.source.SourceManager import exh.eh.EHentaiUpdateHelper import io.requery.android.database.sqlite.RequerySQLiteOpenHelperFactory import kotlinx.serialization.json.Json import uy.kohesive.injekt.api.InjektModule import uy.kohesive.injekt.api.InjektRegistrar import uy.kohesive.injekt.api.addSingleton import uy.kohesive.injekt.api.addSingletonFactory import uy.kohesive.injekt.api.get class AppModule(val app: Application) : InjektModule { override fun InjektRegistrar.registerInjectables() { addSingleton(app) addSingletonFactory { AndroidSqliteDriver( schema = Database.Schema, context = app, name = "tachiyomi.db", factory = if (BuildConfig.DEBUG && Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { // Support database inspector in Android Studio FrameworkSQLiteOpenHelperFactory() } else { RequerySQLiteOpenHelperFactory() }, callback = object : AndroidSqliteDriver.Callback(Database.Schema) { override fun onOpen(db: SupportSQLiteDatabase) { super.onOpen(db) setPragma(db, "foreign_keys = ON") setPragma(db, "journal_mode = WAL") setPragma(db, "synchronous = NORMAL") } private fun setPragma(db: SupportSQLiteDatabase, pragma: String) { val cursor = db.query("PRAGMA $pragma") cursor.moveToFirst() cursor.close() } }, ) } addSingletonFactory { Database( driver = get(), historyAdapter = History.Adapter( last_readAdapter = dateAdapter, ), mangasAdapter = Mangas.Adapter( genreAdapter = listOfStringsAdapter, // SY --> filtered_scanlatorsAdapter = listOfStringsAndAdapter, // SY <-- ), // SY --> categoriesAdapter = Categories.Adapter( manga_orderAdapter = listOfLongsAdapter, ), // SY <-- ) } addSingletonFactory { AndroidDatabaseHandler(get(), get()) } addSingletonFactory { Json { ignoreUnknownKeys = true } } addSingletonFactory { PreferencesHelper(app) } addSingletonFactory { ChapterCache(app) } addSingletonFactory { CoverCache(app) } addSingletonFactory { NetworkHelper(app) } addSingletonFactory { ExtensionManager(app) } addSingletonFactory { SourceManager(app, get(), get()) } addSingletonFactory { DownloadManager(app) } addSingletonFactory { TrackManager(app) } addSingletonFactory { DelayedTrackingStore(app) } addSingletonFactory { ImageSaver(app) } // SY --> addSingletonFactory { CustomMangaManager(app) } addSingletonFactory { EHentaiUpdateHelper(app) } addSingletonFactory { PagePreviewCache(app) } // SY <-- // Asynchronously init expensive components for a faster cold start ContextCompat.getMainExecutor(app).execute { get() get() get() get() get() // SY --> get() // SY <-- } } }