Migrate to Metro DI (#3608)

Assisted-by: Claude:claude-opus-5
This commit is contained in:
AntsyLich
2026-08-17 00:47:48 +06:00
committed by GitHub
parent 1e5b1dc5e7
commit b2015d1ef3
314 changed files with 2416 additions and 2010 deletions
+4
View File
@@ -2,6 +2,7 @@ plugins {
alias(mihonx.plugins.android.library)
alias(mihonx.plugins.spotless)
alias(libs.plugins.metro)
alias(libs.plugins.kotlin.serialization)
}
@@ -19,6 +20,7 @@ kotlin {
}
dependencies {
implementation(projects.core.metro)
implementation(projects.i18n)
api(libs.logcat)
@@ -53,4 +55,6 @@ dependencies {
testImplementation(libs.bundles.test)
testRuntimeOnly(libs.junit.platform.launcher)
implementation(libs.metro.runtime)
}
@@ -1,8 +1,13 @@
package eu.kanade.tachiyomi.core.security
import dev.zacsweers.metro.AppScope
import dev.zacsweers.metro.Inject
import dev.zacsweers.metro.SingleIn
import tachiyomi.core.common.preference.Preference
import tachiyomi.core.common.preference.PreferenceStore
@Inject
@SingleIn(AppScope::class)
class PrivacyPreferences(
preferenceStore: PreferenceStore,
) {
@@ -1,11 +1,16 @@
package eu.kanade.tachiyomi.core.security
import dev.icerock.moko.resources.StringResource
import dev.zacsweers.metro.AppScope
import dev.zacsweers.metro.Inject
import dev.zacsweers.metro.SingleIn
import tachiyomi.core.common.preference.Preference
import tachiyomi.core.common.preference.PreferenceStore
import tachiyomi.core.common.preference.getEnum
import tachiyomi.i18n.MR
@Inject
@SingleIn(AppScope::class)
class SecurityPreferences(
preferenceStore: PreferenceStore,
) {
@@ -2,12 +2,17 @@ package eu.kanade.tachiyomi.network
import android.content.Context
import app.cash.quickjs.QuickJs
import dev.zacsweers.metro.AppScope
import dev.zacsweers.metro.Inject
import dev.zacsweers.metro.SingleIn
import tachiyomi.core.common.util.lang.withIOContext
/**
* Util for evaluating JavaScript in sources.
*/
@Suppress("UNUSED", "UNCHECKED_CAST")
@Inject
@SingleIn(AppScope::class)
class JavaScriptEngine(context: Context) {
/**
@@ -1,6 +1,9 @@
package eu.kanade.tachiyomi.network
import android.content.Context
import dev.zacsweers.metro.AppScope
import dev.zacsweers.metro.Inject
import dev.zacsweers.metro.SingleIn
import eu.kanade.tachiyomi.network.interceptor.CloudflareInterceptor
import eu.kanade.tachiyomi.network.interceptor.UncaughtExceptionInterceptor
import eu.kanade.tachiyomi.network.interceptor.UserAgentInterceptor
@@ -11,6 +14,8 @@ import java.io.File
import kotlin.time.Duration.Companion.minutes
import kotlin.time.Duration.Companion.seconds
@Inject
@SingleIn(AppScope::class)
class NetworkHelper(
private val context: Context,
private val preferences: NetworkPreferences,
@@ -1,14 +1,23 @@
package eu.kanade.tachiyomi.network
import dev.zacsweers.metro.AppScope
import dev.zacsweers.metro.Inject
import dev.zacsweers.metro.SingleIn
import mihon.core.metro.IsDebugBuild
import tachiyomi.core.common.preference.Preference
import tachiyomi.core.common.preference.PreferenceStore
@Inject
@SingleIn(AppScope::class)
class NetworkPreferences(
preferenceStore: PreferenceStore,
verboseLoggingDefault: Boolean = false,
@IsDebugBuild isDebugBuild: Boolean,
) {
val verboseLogging: Preference<Boolean> = preferenceStore.getBoolean("verbose_logging", verboseLoggingDefault)
val verboseLogging: Preference<Boolean> = preferenceStore.getBoolean(
"verbose_logging",
isDebugBuild,
)
val dohProvider: Preference<Int> = preferenceStore.getInt("doh_provider", -1)
@@ -3,6 +3,10 @@ package tachiyomi.core.common.preference
import android.content.Context
import android.content.SharedPreferences
import androidx.preference.PreferenceManager
import dev.zacsweers.metro.AppScope
import dev.zacsweers.metro.ContributesBinding
import dev.zacsweers.metro.Inject
import dev.zacsweers.metro.SingleIn
import kotlinx.coroutines.channels.awaitClose
import kotlinx.coroutines.flow.callbackFlow
import tachiyomi.core.common.preference.AndroidPreference.BooleanPrimitive
@@ -15,10 +19,11 @@ import tachiyomi.core.common.preference.AndroidPreference.ObjectSetAsStringSet
import tachiyomi.core.common.preference.AndroidPreference.StringPrimitive
import tachiyomi.core.common.preference.AndroidPreference.StringSetPrimitive
class AndroidPreferenceStore(
context: Context,
private val sharedPreferences: SharedPreferences = PreferenceManager.getDefaultSharedPreferences(context),
) : PreferenceStore {
@SingleIn(AppScope::class)
@ContributesBinding(AppScope::class)
class AndroidPreferenceStore(private val sharedPreferences: SharedPreferences) : PreferenceStore {
@Inject constructor(context: Context) : this(PreferenceManager.getDefaultSharedPreferences(context))
private val keyFlow = sharedPreferences.keyFlow
@@ -3,10 +3,17 @@ package tachiyomi.core.common.storage
import android.content.Context
import android.os.Environment
import androidx.core.net.toUri
import dev.zacsweers.metro.AppScope
import dev.zacsweers.metro.ContributesBinding
import dev.zacsweers.metro.Inject
import dev.zacsweers.metro.SingleIn
import tachiyomi.core.common.i18n.stringResource
import tachiyomi.i18n.MR
import java.io.File
@Inject
@SingleIn(AppScope::class)
@ContributesBinding(AppScope::class)
class AndroidStorageFolderProvider(
private val context: Context,
) : FolderProvider {
+14
View File
@@ -0,0 +1,14 @@
plugins {
alias(mihonx.plugins.android.library)
alias(mihonx.plugins.spotless)
alias(libs.plugins.metro)
}
android {
namespace = "mihon.core.metro"
}
dependencies {
implementation(libs.metro.runtime)
}
+2
View File
@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest />
@@ -0,0 +1,5 @@
package mihon.core.metro
interface GraphProvider<T> {
val graph: T
}
@@ -0,0 +1,8 @@
package mihon.core.metro
import dev.zacsweers.metro.Qualifier
@Qualifier
@Target(AnnotationTarget.VALUE_PARAMETER, AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY_GETTER)
@Retention(AnnotationRetention.RUNTIME)
annotation class IsDebugBuild
@@ -0,0 +1,6 @@
package mihon.core.metro
import android.content.Context
@Suppress("UNCHECKED_CAST")
fun <T> Context.metroGraph(): T = (applicationContext as GraphProvider<T>).graph