package eu.kanade.tachiyomi.di 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 app.cash.sqldelight.db.SqlDriver import app.cash.sqldelight.driver.android.AndroidSqliteDriver import eu.kanade.domain.track.store.DelayedTrackingStore import eu.kanade.tachiyomi.BuildConfig import eu.kanade.tachiyomi.core.security.SecurityPreferences 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.DownloadCache import eu.kanade.tachiyomi.data.download.DownloadManager import eu.kanade.tachiyomi.data.download.DownloadProvider import eu.kanade.tachiyomi.data.saver.ImageSaver import eu.kanade.tachiyomi.data.track.TrackerManager import eu.kanade.tachiyomi.extension.ExtensionManager import eu.kanade.tachiyomi.network.JavaScriptEngine import eu.kanade.tachiyomi.network.NetworkHelper import eu.kanade.tachiyomi.source.AndroidSourceManager import eu.kanade.tachiyomi.util.storage.CbzCrypto import exh.eh.EHentaiUpdateHelper import exh.pref.DelegateSourcePreferences import io.requery.android.database.sqlite.RequerySQLiteOpenHelperFactory import kotlinx.serialization.json.Json import net.zetetic.database.sqlcipher.SupportOpenHelperFactory import nl.adaptivity.xmlutil.XmlDeclMode import nl.adaptivity.xmlutil.core.XmlVersion import nl.adaptivity.xmlutil.serialization.XML import tachiyomi.data.AndroidDatabaseHandler import tachiyomi.data.Database import tachiyomi.data.DatabaseHandler import tachiyomi.data.DateColumnAdapter import tachiyomi.data.History import tachiyomi.data.Mangas import tachiyomi.data.StringListColumnAdapter import tachiyomi.data.UpdateStrategyColumnAdapter import tachiyomi.domain.UnsortedPreferences import tachiyomi.domain.manga.interactor.GetCustomMangaInfo import tachiyomi.domain.source.service.SourceManager import tachiyomi.source.local.image.LocalCoverManager import tachiyomi.source.local.io.LocalSourceFileSystem 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 import uy.kohesive.injekt.injectLazy // SY --> private const val LEGACY_DATABASE_NAME = "tachiyomi.db" // SY <-- class AppModule(val app: Application) : InjektModule { // SY --> private val securityPreferences: SecurityPreferences by injectLazy() // SY <-- override fun InjektRegistrar.registerInjectables() { addSingleton(app) addSingletonFactory { // SY --> if (securityPreferences.encryptDatabase().get()) { System.loadLibrary("sqlcipher") } // SY <-- AndroidSqliteDriver( schema = Database.Schema, context = app, // SY --> name = if (securityPreferences.encryptDatabase().get()) { CbzCrypto.DATABASE_NAME } else { LEGACY_DATABASE_NAME }, factory = if (securityPreferences.encryptDatabase().get()) { SupportOpenHelperFactory(CbzCrypto.getDecryptedPasswordSql(), null, false, 25) } else if (BuildConfig.DEBUG && Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { // Support database inspector in Android Studio FrameworkSQLiteOpenHelperFactory() } else { RequerySQLiteOpenHelperFactory() }, // SY <-- 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 = DateColumnAdapter, ), mangasAdapter = Mangas.Adapter( genreAdapter = StringListColumnAdapter, update_strategyAdapter = UpdateStrategyColumnAdapter, ), ) } addSingletonFactory { AndroidDatabaseHandler(get(), get()) } addSingletonFactory { Json { ignoreUnknownKeys = true explicitNulls = false } } addSingletonFactory { XML { defaultPolicy { ignoreUnknownChildren() } autoPolymorphic = true xmlDeclMode = XmlDeclMode.Charset indent = 2 xmlVersion = XmlVersion.XML10 } } addSingletonFactory { ChapterCache(app) } addSingletonFactory { CoverCache(app) } addSingletonFactory { NetworkHelper(app, get()) } addSingletonFactory { JavaScriptEngine(app) } addSingletonFactory { AndroidSourceManager(app, get(), get()) } addSingletonFactory { ExtensionManager(app) } addSingletonFactory { DownloadProvider(app) } addSingletonFactory { DownloadManager(app) } addSingletonFactory { DownloadCache(app) } addSingletonFactory { TrackerManager() } addSingletonFactory { DelayedTrackingStore(app) } addSingletonFactory { ImageSaver(app) } addSingletonFactory { LocalSourceFileSystem(app) } addSingletonFactory { LocalCoverManager(app, get()) } // SY --> addSingletonFactory { EHentaiUpdateHelper(app) } addSingletonFactory { PagePreviewCache(app) } // SY <-- // Asynchronously init expensive components for a faster cold start ContextCompat.getMainExecutor(app).execute { get() get() get() get() // SY --> get() // SY <-- } } }