From 2f8efe052650ae9c9f43a9b2d5736303b46962bc Mon Sep 17 00:00:00 2001 From: Jobobby04 Date: Mon, 14 Oct 2024 11:59:02 -0400 Subject: [PATCH] Switch Injekt to Koin-Injekt bridge and implement InjektRegistrar bridge --- app/build.gradle.kts | 4 ++ .../java/eu/kanade/domain/DomainModule.kt | 7 +- .../java/eu/kanade/domain/SYDomainModule.kt | 7 +- .../widget/AppThemePreferenceWidget.kt | 38 +++++------ app/src/main/java/eu/kanade/tachiyomi/App.kt | 5 ++ .../java/eu/kanade/tachiyomi/di/AppModule.kt | 38 +++++------ .../kanade/tachiyomi/di/InjektKoinBridge.kt | 64 +++++++++++++++++++ .../kanade/tachiyomi/di/PreferenceModule.kt | 3 - .../kanade/tachiyomi/di/SYPreferenceModule.kt | 3 - gradle/libs.versions.toml | 2 +- gradle/sy.versions.toml | 6 +- 11 files changed, 119 insertions(+), 58 deletions(-) create mode 100644 app/src/main/java/eu/kanade/tachiyomi/di/InjektKoinBridge.kt diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 0371a3d32..43204b2cb 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -279,6 +279,10 @@ dependencies { // Google drive implementation(sylibs.google.api.services.drive) implementation(sylibs.google.api.client.oauth) + + // Koin + implementation(sylibs.koin.core) + implementation(sylibs.koin.android) } androidComponents { diff --git a/app/src/main/java/eu/kanade/domain/DomainModule.kt b/app/src/main/java/eu/kanade/domain/DomainModule.kt index eba1fe6a2..d41e7b899 100644 --- a/app/src/main/java/eu/kanade/domain/DomainModule.kt +++ b/app/src/main/java/eu/kanade/domain/DomainModule.kt @@ -23,6 +23,9 @@ import eu.kanade.domain.track.interactor.AddTracks import eu.kanade.domain.track.interactor.RefreshTracks import eu.kanade.domain.track.interactor.SyncChapterProgressWithTrack import eu.kanade.domain.track.interactor.TrackChapter +import eu.kanade.tachiyomi.di.InjektModule +import eu.kanade.tachiyomi.di.addFactory +import eu.kanade.tachiyomi.di.addSingletonFactory import mihon.data.repository.ExtensionRepoRepositoryImpl import mihon.domain.chapter.interactor.FilterChaptersForDownload import mihon.domain.extensionrepo.interactor.CreateExtensionRepo @@ -91,11 +94,7 @@ import tachiyomi.domain.track.interactor.InsertTrack import tachiyomi.domain.track.repository.TrackRepository import tachiyomi.domain.updates.interactor.GetUpdates import tachiyomi.domain.updates.repository.UpdatesRepository -import uy.kohesive.injekt.api.InjektModule import uy.kohesive.injekt.api.InjektRegistrar -import uy.kohesive.injekt.api.addFactory -import uy.kohesive.injekt.api.addSingletonFactory -import uy.kohesive.injekt.api.get class DomainModule : InjektModule { diff --git a/app/src/main/java/eu/kanade/domain/SYDomainModule.kt b/app/src/main/java/eu/kanade/domain/SYDomainModule.kt index 33656b7e4..023ab3139 100644 --- a/app/src/main/java/eu/kanade/domain/SYDomainModule.kt +++ b/app/src/main/java/eu/kanade/domain/SYDomainModule.kt @@ -14,6 +14,9 @@ import eu.kanade.domain.source.interactor.GetSourceCategories import eu.kanade.domain.source.interactor.RenameSourceCategory import eu.kanade.domain.source.interactor.SetSourceCategories import eu.kanade.domain.source.interactor.ToggleExcludeFromDataSaver +import eu.kanade.tachiyomi.di.InjektModule +import eu.kanade.tachiyomi.di.addFactory +import eu.kanade.tachiyomi.di.addSingletonFactory import eu.kanade.tachiyomi.source.online.MetadataSource import exh.search.SearchEngine import tachiyomi.data.manga.CustomMangaRepositoryImpl @@ -71,11 +74,7 @@ import tachiyomi.domain.source.interactor.InsertSavedSearch import tachiyomi.domain.source.repository.FeedSavedSearchRepository import tachiyomi.domain.source.repository.SavedSearchRepository import tachiyomi.domain.track.interactor.IsTrackUnfollowed -import uy.kohesive.injekt.api.InjektModule import uy.kohesive.injekt.api.InjektRegistrar -import uy.kohesive.injekt.api.addFactory -import uy.kohesive.injekt.api.addSingletonFactory -import uy.kohesive.injekt.api.get import xyz.nulldev.ts.api.http.serializer.FilterSerializer class SYDomainModule : InjektModule { diff --git a/app/src/main/java/eu/kanade/presentation/more/settings/widget/AppThemePreferenceWidget.kt b/app/src/main/java/eu/kanade/presentation/more/settings/widget/AppThemePreferenceWidget.kt index 5e3f76efe..9a66ee696 100644 --- a/app/src/main/java/eu/kanade/presentation/more/settings/widget/AppThemePreferenceWidget.kt +++ b/app/src/main/java/eu/kanade/presentation/more/settings/widget/AppThemePreferenceWidget.kt @@ -29,32 +29,24 @@ import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.runtime.Composable -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember -import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.alpha import androidx.compose.ui.draw.clip import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.text.style.TextAlign -import androidx.compose.ui.tooling.preview.PreviewLightDark import androidx.compose.ui.unit.dp import androidx.core.app.ActivityCompat -import eu.kanade.domain.ui.UiPreferences import eu.kanade.domain.ui.model.AppTheme import eu.kanade.presentation.manga.components.MangaCover import eu.kanade.presentation.theme.TachiyomiTheme import eu.kanade.tachiyomi.util.system.DeviceUtil import eu.kanade.tachiyomi.util.system.isDynamicColorAvailable -import tachiyomi.core.common.preference.InMemoryPreferenceStore import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.util.secondaryItemAlpha -import uy.kohesive.injekt.Injekt -import uy.kohesive.injekt.api.fullType @Composable internal fun AppThemePreferenceWidget( @@ -257,18 +249,18 @@ fun AppThemePreviewItem( } } -@PreviewLightDark -@Composable -private fun AppThemesListPreview() { - var appTheme by remember { mutableStateOf(AppTheme.DEFAULT) } - Injekt.addSingleton(fullType(), UiPreferences(InMemoryPreferenceStore())) - TachiyomiTheme(appTheme = appTheme) { - Surface { - AppThemesList( - currentTheme = appTheme, - amoled = false, - onItemClick = { appTheme = it }, - ) - } - } -} +// @PreviewLightDark +// @Composable +// private fun AppThemesListPreview() { +// var appTheme by remember { mutableStateOf(AppTheme.DEFAULT) } +// Injekt.addSingleton(fullType(), UiPreferences(InMemoryPreferenceStore())) +// TachiyomiTheme(appTheme = appTheme) { +// Surface { +// AppThemesList( +// currentTheme = appTheme, +// amoled = false, +// onItemClick = { appTheme = it }, +// ) +// } +// } +// } diff --git a/app/src/main/java/eu/kanade/tachiyomi/App.kt b/app/src/main/java/eu/kanade/tachiyomi/App.kt index 6c96f2cd1..eecbd877a 100755 --- a/app/src/main/java/eu/kanade/tachiyomi/App.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/App.kt @@ -48,8 +48,11 @@ import eu.kanade.tachiyomi.data.coil.TachiyomiImageDecoder import eu.kanade.tachiyomi.data.notification.Notifications import eu.kanade.tachiyomi.data.sync.SyncDataJob import eu.kanade.tachiyomi.di.AppModule +import eu.kanade.tachiyomi.di.InjektKoinBridge import eu.kanade.tachiyomi.di.PreferenceModule import eu.kanade.tachiyomi.di.SYPreferenceModule +import eu.kanade.tachiyomi.di.importModule +import eu.kanade.tachiyomi.di.initExpensiveComponents import eu.kanade.tachiyomi.network.NetworkHelper import eu.kanade.tachiyomi.network.NetworkPreferences import eu.kanade.tachiyomi.ui.base.delegate.SecureActivityDelegate @@ -123,6 +126,8 @@ class App : Application(), DefaultLifecycleObserver, SingletonImageLoader.Factor // SY --> Injekt.importModule(SYPreferenceModule(this)) Injekt.importModule(SYDomainModule()) + InjektKoinBridge.startKoin(this) + initExpensiveComponents(this) // SY <-- setupExhLogging() // EXH logging diff --git a/app/src/main/java/eu/kanade/tachiyomi/di/AppModule.kt b/app/src/main/java/eu/kanade/tachiyomi/di/AppModule.kt index 0e80d4ff1..86ed42a32 100755 --- a/app/src/main/java/eu/kanade/tachiyomi/di/AppModule.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/di/AppModule.kt @@ -47,10 +47,8 @@ import tachiyomi.domain.source.service.SourceManager import tachiyomi.domain.storage.service.StorageManager import tachiyomi.source.local.image.LocalCoverManager import tachiyomi.source.local.io.LocalSourceFileSystem -import uy.kohesive.injekt.api.InjektModule +import uy.kohesive.injekt.Injekt 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 @@ -170,23 +168,25 @@ class AppModule(val app: Application) : InjektModule { 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 <-- - } addSingletonFactory { GoogleDriveService(app) } + // SY <-- + } +} + +fun initExpensiveComponents(app: Application) { + // Asynchronously init expensive components for a faster cold start + ContextCompat.getMainExecutor(app).execute { + Injekt.get() + + Injekt.get() + + Injekt.get() + + Injekt.get() + + // SY --> + Injekt.get() + // SY <-- } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/di/InjektKoinBridge.kt b/app/src/main/java/eu/kanade/tachiyomi/di/InjektKoinBridge.kt new file mode 100644 index 000000000..6de439758 --- /dev/null +++ b/app/src/main/java/eu/kanade/tachiyomi/di/InjektKoinBridge.kt @@ -0,0 +1,64 @@ +package eu.kanade.tachiyomi.di + +import android.content.Context +import logcat.LogPriority +import logcat.logcat +import org.koin.android.ext.koin.androidContext +import org.koin.core.context.startKoin +import org.koin.core.logger.Level +import org.koin.core.logger.Logger +import org.koin.core.logger.MESSAGE +import org.koin.core.module.Module +import org.koin.core.scope.Scope +import uy.kohesive.injekt.api.InjektRegistrar +import uy.kohesive.injekt.api.InjektScope + +object InjektKoinBridge { + private val modules = mutableMapOf() + fun getModule(injektModule: InjektModule) = modules.getOrPut(injektModule) { Module() } + + fun startKoin(context: Context) { + startKoin { + logger( + object : Logger() { + override fun display(level: Level, msg: MESSAGE) { + logcat( + when (level) { + Level.DEBUG -> LogPriority.DEBUG + Level.INFO -> LogPriority.INFO + Level.WARNING -> LogPriority.WARN + Level.ERROR -> LogPriority.ERROR + Level.NONE -> LogPriority.VERBOSE + }, + ) { msg } + } + }, + ) + androidContext(context) + modules(modules.values.toList()) + } + } +} + +interface InjektModule { + fun InjektRegistrar.registerInjectables() +} + +inline fun InjektModule.addSingleton(instance: T) { + val module = InjektKoinBridge.getModule(this) + module.single { instance } +} + +inline fun InjektModule.addSingletonFactory(crossinline instance: Scope.() -> T) { + val module = InjektKoinBridge.getModule(this) + module.single { instance() } +} + +inline fun InjektModule.addFactory(crossinline instance: Scope.() -> T) { + val module = InjektKoinBridge.getModule(this) + module.factory { instance() } +} + +fun InjektScope.importModule(injektModule: InjektModule) { + with(injektModule) { registrar.registerInjectables() } +} diff --git a/app/src/main/java/eu/kanade/tachiyomi/di/PreferenceModule.kt b/app/src/main/java/eu/kanade/tachiyomi/di/PreferenceModule.kt index f358f8ff5..5cec2bd39 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/di/PreferenceModule.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/di/PreferenceModule.kt @@ -17,10 +17,7 @@ import tachiyomi.domain.backup.service.BackupPreferences import tachiyomi.domain.download.service.DownloadPreferences import tachiyomi.domain.library.service.LibraryPreferences import tachiyomi.domain.storage.service.StoragePreferences -import uy.kohesive.injekt.api.InjektModule import uy.kohesive.injekt.api.InjektRegistrar -import uy.kohesive.injekt.api.addSingletonFactory -import uy.kohesive.injekt.api.get class PreferenceModule(val app: Application) : InjektModule { diff --git a/app/src/main/java/eu/kanade/tachiyomi/di/SYPreferenceModule.kt b/app/src/main/java/eu/kanade/tachiyomi/di/SYPreferenceModule.kt index 7ca8c4f75..d31669516 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/di/SYPreferenceModule.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/di/SYPreferenceModule.kt @@ -3,10 +3,7 @@ package eu.kanade.tachiyomi.di import android.app.Application import exh.pref.DelegateSourcePreferences import tachiyomi.domain.UnsortedPreferences -import uy.kohesive.injekt.api.InjektModule import uy.kohesive.injekt.api.InjektRegistrar -import uy.kohesive.injekt.api.addSingletonFactory -import uy.kohesive.injekt.api.get class SYPreferenceModule(val application: Application) : InjektModule { diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 3db9b54f7..58f3babe7 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -40,7 +40,7 @@ sqlite-android = "com.github.requery:sqlite-android:3.45.0" preferencektx = "androidx.preference:preference-ktx:1.2.1" -injekt-core = "com.github.inorichi.injekt:injekt-core:65b0440" +injekt-core = "com.github.null2264:injekt-koin:ee267b2e27" coil-bom = { module = "io.coil-kt.coil3:coil-bom", version = "3.0.0-alpha10" } coil-core = { module = "io.coil-kt.coil3:coil" } diff --git a/gradle/sy.versions.toml b/gradle/sy.versions.toml index c4c1ad8e7..5fb5c0eab 100644 --- a/gradle/sy.versions.toml +++ b/gradle/sy.versions.toml @@ -1,4 +1,5 @@ [versions] +koin = "4.0.0" [libraries] firebase-analytics = "com.google.firebase:firebase-analytics:22.0.2" @@ -18,4 +19,7 @@ sqlcipher = "net.zetetic:sqlcipher-android:4.6.0" exifinterface = "androidx.exifinterface:exifinterface:1.3.7" google-api-services-drive = "com.google.apis:google-api-services-drive:v3-rev197-1.25.0" -google-api-client-oauth = "com.google.oauth-client:google-oauth-client:1.36.0" \ No newline at end of file +google-api-client-oauth = "com.google.oauth-client:google-oauth-client:1.36.0" + +koin-core = { module = "io.insert-koin:koin-core", version.ref = "koin" } +koin-android = { module = "io.insert-koin:koin-android", version.ref = "koin" } \ No newline at end of file