Switch Injekt to Koin-Injekt bridge and implement InjektRegistrar bridge

This commit is contained in:
Jobobby04 2024-10-14 11:59:02 -04:00
parent dea38912fc
commit 2f8efe0526
11 changed files with 119 additions and 58 deletions

View File

@ -279,6 +279,10 @@ dependencies {
// Google drive // Google drive
implementation(sylibs.google.api.services.drive) implementation(sylibs.google.api.services.drive)
implementation(sylibs.google.api.client.oauth) implementation(sylibs.google.api.client.oauth)
// Koin
implementation(sylibs.koin.core)
implementation(sylibs.koin.android)
} }
androidComponents { androidComponents {

View File

@ -23,6 +23,9 @@ import eu.kanade.domain.track.interactor.AddTracks
import eu.kanade.domain.track.interactor.RefreshTracks import eu.kanade.domain.track.interactor.RefreshTracks
import eu.kanade.domain.track.interactor.SyncChapterProgressWithTrack import eu.kanade.domain.track.interactor.SyncChapterProgressWithTrack
import eu.kanade.domain.track.interactor.TrackChapter 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.data.repository.ExtensionRepoRepositoryImpl
import mihon.domain.chapter.interactor.FilterChaptersForDownload import mihon.domain.chapter.interactor.FilterChaptersForDownload
import mihon.domain.extensionrepo.interactor.CreateExtensionRepo 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.track.repository.TrackRepository
import tachiyomi.domain.updates.interactor.GetUpdates import tachiyomi.domain.updates.interactor.GetUpdates
import tachiyomi.domain.updates.repository.UpdatesRepository import tachiyomi.domain.updates.repository.UpdatesRepository
import uy.kohesive.injekt.api.InjektModule
import uy.kohesive.injekt.api.InjektRegistrar 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 { class DomainModule : InjektModule {

View File

@ -14,6 +14,9 @@ import eu.kanade.domain.source.interactor.GetSourceCategories
import eu.kanade.domain.source.interactor.RenameSourceCategory import eu.kanade.domain.source.interactor.RenameSourceCategory
import eu.kanade.domain.source.interactor.SetSourceCategories import eu.kanade.domain.source.interactor.SetSourceCategories
import eu.kanade.domain.source.interactor.ToggleExcludeFromDataSaver 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 eu.kanade.tachiyomi.source.online.MetadataSource
import exh.search.SearchEngine import exh.search.SearchEngine
import tachiyomi.data.manga.CustomMangaRepositoryImpl 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.FeedSavedSearchRepository
import tachiyomi.domain.source.repository.SavedSearchRepository import tachiyomi.domain.source.repository.SavedSearchRepository
import tachiyomi.domain.track.interactor.IsTrackUnfollowed import tachiyomi.domain.track.interactor.IsTrackUnfollowed
import uy.kohesive.injekt.api.InjektModule
import uy.kohesive.injekt.api.InjektRegistrar 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 import xyz.nulldev.ts.api.http.serializer.FilterSerializer
class SYDomainModule : InjektModule { class SYDomainModule : InjektModule {

View File

@ -29,32 +29,24 @@ import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Surface import androidx.compose.material3.Surface
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.alpha import androidx.compose.ui.draw.alpha
import androidx.compose.ui.draw.clip import androidx.compose.ui.draw.clip
import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.PreviewLightDark
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.core.app.ActivityCompat import androidx.core.app.ActivityCompat
import eu.kanade.domain.ui.UiPreferences
import eu.kanade.domain.ui.model.AppTheme import eu.kanade.domain.ui.model.AppTheme
import eu.kanade.presentation.manga.components.MangaCover import eu.kanade.presentation.manga.components.MangaCover
import eu.kanade.presentation.theme.TachiyomiTheme import eu.kanade.presentation.theme.TachiyomiTheme
import eu.kanade.tachiyomi.util.system.DeviceUtil import eu.kanade.tachiyomi.util.system.DeviceUtil
import eu.kanade.tachiyomi.util.system.isDynamicColorAvailable import eu.kanade.tachiyomi.util.system.isDynamicColorAvailable
import tachiyomi.core.common.preference.InMemoryPreferenceStore
import tachiyomi.i18n.MR import tachiyomi.i18n.MR
import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.components.material.padding
import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.i18n.stringResource
import tachiyomi.presentation.core.util.secondaryItemAlpha import tachiyomi.presentation.core.util.secondaryItemAlpha
import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.fullType
@Composable @Composable
internal fun AppThemePreferenceWidget( internal fun AppThemePreferenceWidget(
@ -257,18 +249,18 @@ fun AppThemePreviewItem(
} }
} }
@PreviewLightDark // @PreviewLightDark
@Composable // @Composable
private fun AppThemesListPreview() { // private fun AppThemesListPreview() {
var appTheme by remember { mutableStateOf(AppTheme.DEFAULT) } // var appTheme by remember { mutableStateOf(AppTheme.DEFAULT) }
Injekt.addSingleton(fullType<UiPreferences>(), UiPreferences(InMemoryPreferenceStore())) // Injekt.addSingleton(fullType<UiPreferences>(), UiPreferences(InMemoryPreferenceStore()))
TachiyomiTheme(appTheme = appTheme) { // TachiyomiTheme(appTheme = appTheme) {
Surface { // Surface {
AppThemesList( // AppThemesList(
currentTheme = appTheme, // currentTheme = appTheme,
amoled = false, // amoled = false,
onItemClick = { appTheme = it }, // onItemClick = { appTheme = it },
) // )
} // }
} // }
} // }

View File

@ -48,8 +48,11 @@ import eu.kanade.tachiyomi.data.coil.TachiyomiImageDecoder
import eu.kanade.tachiyomi.data.notification.Notifications import eu.kanade.tachiyomi.data.notification.Notifications
import eu.kanade.tachiyomi.data.sync.SyncDataJob import eu.kanade.tachiyomi.data.sync.SyncDataJob
import eu.kanade.tachiyomi.di.AppModule import eu.kanade.tachiyomi.di.AppModule
import eu.kanade.tachiyomi.di.InjektKoinBridge
import eu.kanade.tachiyomi.di.PreferenceModule import eu.kanade.tachiyomi.di.PreferenceModule
import eu.kanade.tachiyomi.di.SYPreferenceModule 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.NetworkHelper
import eu.kanade.tachiyomi.network.NetworkPreferences import eu.kanade.tachiyomi.network.NetworkPreferences
import eu.kanade.tachiyomi.ui.base.delegate.SecureActivityDelegate import eu.kanade.tachiyomi.ui.base.delegate.SecureActivityDelegate
@ -123,6 +126,8 @@ class App : Application(), DefaultLifecycleObserver, SingletonImageLoader.Factor
// SY --> // SY -->
Injekt.importModule(SYPreferenceModule(this)) Injekt.importModule(SYPreferenceModule(this))
Injekt.importModule(SYDomainModule()) Injekt.importModule(SYDomainModule())
InjektKoinBridge.startKoin(this)
initExpensiveComponents(this)
// SY <-- // SY <--
setupExhLogging() // EXH logging setupExhLogging() // EXH logging

View File

@ -47,10 +47,8 @@ import tachiyomi.domain.source.service.SourceManager
import tachiyomi.domain.storage.service.StorageManager import tachiyomi.domain.storage.service.StorageManager
import tachiyomi.source.local.image.LocalCoverManager import tachiyomi.source.local.image.LocalCoverManager
import tachiyomi.source.local.io.LocalSourceFileSystem 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.InjektRegistrar
import uy.kohesive.injekt.api.addSingleton
import uy.kohesive.injekt.api.addSingletonFactory
import uy.kohesive.injekt.api.get import uy.kohesive.injekt.api.get
import uy.kohesive.injekt.injectLazy import uy.kohesive.injekt.injectLazy
@ -170,23 +168,25 @@ class AppModule(val app: Application) : InjektModule {
addSingletonFactory { EHentaiUpdateHelper(app) } addSingletonFactory { EHentaiUpdateHelper(app) }
addSingletonFactory { PagePreviewCache(app) } addSingletonFactory { PagePreviewCache(app) }
// SY <--
// Asynchronously init expensive components for a faster cold start
ContextCompat.getMainExecutor(app).execute {
get<NetworkHelper>()
get<SourceManager>()
get<Database>()
get<DownloadManager>()
// SY -->
get<GetCustomMangaInfo>()
// SY <--
}
addSingletonFactory { GoogleDriveService(app) } addSingletonFactory { GoogleDriveService(app) }
// SY <--
}
}
fun initExpensiveComponents(app: Application) {
// Asynchronously init expensive components for a faster cold start
ContextCompat.getMainExecutor(app).execute {
Injekt.get<NetworkHelper>()
Injekt.get<SourceManager>()
Injekt.get<Database>()
Injekt.get<DownloadManager>()
// SY -->
Injekt.get<GetCustomMangaInfo>()
// SY <--
} }
} }

View File

@ -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<InjektModule, Module>()
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 <reified T> InjektModule.addSingleton(instance: T) {
val module = InjektKoinBridge.getModule(this)
module.single<T> { instance }
}
inline fun <reified T> InjektModule.addSingletonFactory(crossinline instance: Scope.() -> T) {
val module = InjektKoinBridge.getModule(this)
module.single<T> { instance() }
}
inline fun <reified T> InjektModule.addFactory(crossinline instance: Scope.() -> T) {
val module = InjektKoinBridge.getModule(this)
module.factory<T> { instance() }
}
fun InjektScope.importModule(injektModule: InjektModule) {
with(injektModule) { registrar.registerInjectables() }
}

View File

@ -17,10 +17,7 @@ import tachiyomi.domain.backup.service.BackupPreferences
import tachiyomi.domain.download.service.DownloadPreferences import tachiyomi.domain.download.service.DownloadPreferences
import tachiyomi.domain.library.service.LibraryPreferences import tachiyomi.domain.library.service.LibraryPreferences
import tachiyomi.domain.storage.service.StoragePreferences import tachiyomi.domain.storage.service.StoragePreferences
import uy.kohesive.injekt.api.InjektModule
import uy.kohesive.injekt.api.InjektRegistrar import uy.kohesive.injekt.api.InjektRegistrar
import uy.kohesive.injekt.api.addSingletonFactory
import uy.kohesive.injekt.api.get
class PreferenceModule(val app: Application) : InjektModule { class PreferenceModule(val app: Application) : InjektModule {

View File

@ -3,10 +3,7 @@ package eu.kanade.tachiyomi.di
import android.app.Application import android.app.Application
import exh.pref.DelegateSourcePreferences import exh.pref.DelegateSourcePreferences
import tachiyomi.domain.UnsortedPreferences import tachiyomi.domain.UnsortedPreferences
import uy.kohesive.injekt.api.InjektModule
import uy.kohesive.injekt.api.InjektRegistrar import uy.kohesive.injekt.api.InjektRegistrar
import uy.kohesive.injekt.api.addSingletonFactory
import uy.kohesive.injekt.api.get
class SYPreferenceModule(val application: Application) : InjektModule { class SYPreferenceModule(val application: Application) : InjektModule {

View File

@ -40,7 +40,7 @@ sqlite-android = "com.github.requery:sqlite-android:3.45.0"
preferencektx = "androidx.preference:preference-ktx:1.2.1" 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-bom = { module = "io.coil-kt.coil3:coil-bom", version = "3.0.0-alpha10" }
coil-core = { module = "io.coil-kt.coil3:coil" } coil-core = { module = "io.coil-kt.coil3:coil" }

View File

@ -1,4 +1,5 @@
[versions] [versions]
koin = "4.0.0"
[libraries] [libraries]
firebase-analytics = "com.google.firebase:firebase-analytics:22.0.2" firebase-analytics = "com.google.firebase:firebase-analytics:22.0.2"
@ -19,3 +20,6 @@ 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-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" 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" }