From 42b248bc1d0b3b0ebb63a3f1ffcba734077481a9 Mon Sep 17 00:00:00 2001 From: Goooler Date: Wed, 6 May 2026 14:36:49 +0800 Subject: [PATCH 01/10] Private mainActivityClass --- glue/src/main/kotlin/com/github/kr328/clash/util/Intent.kt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/glue/src/main/kotlin/com/github/kr328/clash/util/Intent.kt b/glue/src/main/kotlin/com/github/kr328/clash/util/Intent.kt index e1e722c1f3..bb7256ab05 100644 --- a/glue/src/main/kotlin/com/github/kr328/clash/util/Intent.kt +++ b/glue/src/main/kotlin/com/github/kr328/clash/util/Intent.kt @@ -3,5 +3,7 @@ package com.github.kr328.clash.util import android.content.Context import android.content.Intent +private val mainActivityClass = Class.forName("com.github.kr328.clash.MainActivity") + fun mainIntent(context: Context, action: String? = null) = - Intent(context, Class.forName("com.github.kr328.clash.MainActivity")).setAction(action) + Intent(context, mainActivityClass).setAction(action) From 2ba59859efba6a2cd757acaf910554b25577aa7f Mon Sep 17 00:00:00 2001 From: Goooler Date: Wed, 6 May 2026 14:35:58 +0800 Subject: [PATCH 02/10] Land Metro --- app/build.gradle.kts | 1 + .../main/kotlin/com/github/kr328/clash/AppGraph.kt | 9 +++++++++ .../kr328/clash/MainActivityClassProviderImpl.kt | 9 +++++++++ .../com/github/kr328/clash/MainApplication.kt | 2 ++ build.gradle.kts | 1 + glue/build.gradle.kts | 5 ++++- .../kr328/clash/MainActivityClassProvider.kt | 14 ++++++++++++++ .../kotlin/com/github/kr328/clash/util/Intent.kt | 5 ++--- gradle/libs.versions.toml | 4 ++++ 9 files changed, 46 insertions(+), 4 deletions(-) create mode 100644 app/src/main/kotlin/com/github/kr328/clash/AppGraph.kt create mode 100644 app/src/main/kotlin/com/github/kr328/clash/MainActivityClassProviderImpl.kt create mode 100644 glue/src/main/kotlin/com/github/kr328/clash/MainActivityClassProvider.kt diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 3490db4d30..b37227c06b 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -7,6 +7,7 @@ plugins { alias(libs.plugins.kotlin.compose) alias(libs.plugins.kotlin.serialization) alias(libs.plugins.download) + alias(libs.plugins.metro) } android { diff --git a/app/src/main/kotlin/com/github/kr328/clash/AppGraph.kt b/app/src/main/kotlin/com/github/kr328/clash/AppGraph.kt new file mode 100644 index 0000000000..1ebe8d58e1 --- /dev/null +++ b/app/src/main/kotlin/com/github/kr328/clash/AppGraph.kt @@ -0,0 +1,9 @@ +package com.github.kr328.clash + +import dev.zacsweers.metro.AppScope +import dev.zacsweers.metro.DependencyGraph + +@DependencyGraph(AppScope::class) +interface AppGraph { + val mainActivityClassProvider: MainActivityClassProvider +} diff --git a/app/src/main/kotlin/com/github/kr328/clash/MainActivityClassProviderImpl.kt b/app/src/main/kotlin/com/github/kr328/clash/MainActivityClassProviderImpl.kt new file mode 100644 index 0000000000..961a82235a --- /dev/null +++ b/app/src/main/kotlin/com/github/kr328/clash/MainActivityClassProviderImpl.kt @@ -0,0 +1,9 @@ +package com.github.kr328.clash + +import dev.zacsweers.metro.AppScope +import dev.zacsweers.metro.ContributesBinding + +@ContributesBinding(AppScope::class) +object MainActivityClassProviderImpl : MainActivityClassProvider { + override val mainActivityClass: Class<*> = MainActivity::class.java +} diff --git a/app/src/main/kotlin/com/github/kr328/clash/MainApplication.kt b/app/src/main/kotlin/com/github/kr328/clash/MainApplication.kt index dcb99834df..ed40715596 100644 --- a/app/src/main/kotlin/com/github/kr328/clash/MainApplication.kt +++ b/app/src/main/kotlin/com/github/kr328/clash/MainApplication.kt @@ -14,6 +14,7 @@ import com.github.kr328.clash.remote.Remote import com.github.kr328.clash.service.util.sendServiceRecreated import com.github.kr328.clash.store.UiStore import com.github.kr328.clash.util.clashDir +import dev.zacsweers.metro.createGraph import java.io.File class MainApplication : Application() { @@ -23,6 +24,7 @@ class MainApplication : Application() { super.attachBaseContext(base) Global.init(this) + initMainActivityClassProvider(createGraph().mainActivityClassProvider) } override fun onCreate() { diff --git a/build.gradle.kts b/build.gradle.kts index 6f70075be4..19f28c8d30 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -16,6 +16,7 @@ plugins { alias(libs.plugins.ksp) apply false alias(libs.plugins.golang) apply false alias(libs.plugins.spotless) apply false + alias(libs.plugins.metro) apply false } allprojects { diff --git a/glue/build.gradle.kts b/glue/build.gradle.kts index 1c059c7667..d4f36fc958 100644 --- a/glue/build.gradle.kts +++ b/glue/build.gradle.kts @@ -1,4 +1,7 @@ -plugins { alias(libs.plugins.android.library) } +plugins { + alias(libs.plugins.android.library) + alias(libs.plugins.metro) +} dependencies { api(projects.core) diff --git a/glue/src/main/kotlin/com/github/kr328/clash/MainActivityClassProvider.kt b/glue/src/main/kotlin/com/github/kr328/clash/MainActivityClassProvider.kt new file mode 100644 index 0000000000..09d255513b --- /dev/null +++ b/glue/src/main/kotlin/com/github/kr328/clash/MainActivityClassProvider.kt @@ -0,0 +1,14 @@ +package com.github.kr328.clash + +interface MainActivityClassProvider { + val mainActivityClass: Class<*> +} + +private var _mainActivityClassProvider: MainActivityClassProvider? = null + +val mainActivityClassProvider: MainActivityClassProvider + get() = _mainActivityClassProvider ?: error("MainActivityClassProvider has not been initialized") + +fun initMainActivityClassProvider(provider: MainActivityClassProvider) { + _mainActivityClassProvider = provider +} diff --git a/glue/src/main/kotlin/com/github/kr328/clash/util/Intent.kt b/glue/src/main/kotlin/com/github/kr328/clash/util/Intent.kt index bb7256ab05..a830c08e0e 100644 --- a/glue/src/main/kotlin/com/github/kr328/clash/util/Intent.kt +++ b/glue/src/main/kotlin/com/github/kr328/clash/util/Intent.kt @@ -2,8 +2,7 @@ package com.github.kr328.clash.util import android.content.Context import android.content.Intent - -private val mainActivityClass = Class.forName("com.github.kr328.clash.MainActivity") +import com.github.kr328.clash.mainActivityClassProvider fun mainIntent(context: Context, action: String? = null) = - Intent(context, mainActivityClass).setAction(action) + Intent(context, mainActivityClassProvider.mainActivityClass).setAction(action) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 4579761720..430b02e41f 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,6 +1,7 @@ [versions] agp = "9.2.1" kotlin = "2.3.21" +metro = "1.0.0" androidx-lifecycle = "2.11.0-beta01" kaidl = "0.2.0" room = "2.8.4" @@ -40,6 +41,8 @@ bytesize = "me.saket.bytesize:bytesize:2.2.1" composePreference = "me.zhanghai.compose.preference:preference:2.2.0" +metro-runtime = { module = "dev.zacsweers.metro:runtime", version.ref = "metro" } + # Dummy to get renovate updates, the version is used in rootProject build.gradle with spotless. ktfmt = "com.facebook:ktfmt:0.62" @@ -53,3 +56,4 @@ ksp = "com.google.devtools.ksp:2.3.7" golang = "io.github.goooler.golang:0.2.1" download = "de.undercouch.download:5.7.0" spotless = "com.diffplug.spotless:8.4.0" +metro = { id = "dev.zacsweers.metro", version.ref = "metro" } From b955a6745ada8618f89aea1a7dd66408fb0ed417 Mon Sep 17 00:00:00 2001 From: Goooler Date: Wed, 6 May 2026 14:36:58 +0800 Subject: [PATCH 03/10] Revert "Land Metro" This reverts commit 2ba59859efba6a2cd757acaf910554b25577aa7f. --- app/build.gradle.kts | 1 - .../main/kotlin/com/github/kr328/clash/AppGraph.kt | 9 --------- .../kr328/clash/MainActivityClassProviderImpl.kt | 9 --------- .../com/github/kr328/clash/MainApplication.kt | 2 -- build.gradle.kts | 1 - glue/build.gradle.kts | 5 +---- .../kr328/clash/MainActivityClassProvider.kt | 14 -------------- .../kotlin/com/github/kr328/clash/util/Intent.kt | 5 +++-- gradle/libs.versions.toml | 4 ---- 9 files changed, 4 insertions(+), 46 deletions(-) delete mode 100644 app/src/main/kotlin/com/github/kr328/clash/AppGraph.kt delete mode 100644 app/src/main/kotlin/com/github/kr328/clash/MainActivityClassProviderImpl.kt delete mode 100644 glue/src/main/kotlin/com/github/kr328/clash/MainActivityClassProvider.kt diff --git a/app/build.gradle.kts b/app/build.gradle.kts index b37227c06b..3490db4d30 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -7,7 +7,6 @@ plugins { alias(libs.plugins.kotlin.compose) alias(libs.plugins.kotlin.serialization) alias(libs.plugins.download) - alias(libs.plugins.metro) } android { diff --git a/app/src/main/kotlin/com/github/kr328/clash/AppGraph.kt b/app/src/main/kotlin/com/github/kr328/clash/AppGraph.kt deleted file mode 100644 index 1ebe8d58e1..0000000000 --- a/app/src/main/kotlin/com/github/kr328/clash/AppGraph.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.github.kr328.clash - -import dev.zacsweers.metro.AppScope -import dev.zacsweers.metro.DependencyGraph - -@DependencyGraph(AppScope::class) -interface AppGraph { - val mainActivityClassProvider: MainActivityClassProvider -} diff --git a/app/src/main/kotlin/com/github/kr328/clash/MainActivityClassProviderImpl.kt b/app/src/main/kotlin/com/github/kr328/clash/MainActivityClassProviderImpl.kt deleted file mode 100644 index 961a82235a..0000000000 --- a/app/src/main/kotlin/com/github/kr328/clash/MainActivityClassProviderImpl.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.github.kr328.clash - -import dev.zacsweers.metro.AppScope -import dev.zacsweers.metro.ContributesBinding - -@ContributesBinding(AppScope::class) -object MainActivityClassProviderImpl : MainActivityClassProvider { - override val mainActivityClass: Class<*> = MainActivity::class.java -} diff --git a/app/src/main/kotlin/com/github/kr328/clash/MainApplication.kt b/app/src/main/kotlin/com/github/kr328/clash/MainApplication.kt index ed40715596..dcb99834df 100644 --- a/app/src/main/kotlin/com/github/kr328/clash/MainApplication.kt +++ b/app/src/main/kotlin/com/github/kr328/clash/MainApplication.kt @@ -14,7 +14,6 @@ import com.github.kr328.clash.remote.Remote import com.github.kr328.clash.service.util.sendServiceRecreated import com.github.kr328.clash.store.UiStore import com.github.kr328.clash.util.clashDir -import dev.zacsweers.metro.createGraph import java.io.File class MainApplication : Application() { @@ -24,7 +23,6 @@ class MainApplication : Application() { super.attachBaseContext(base) Global.init(this) - initMainActivityClassProvider(createGraph().mainActivityClassProvider) } override fun onCreate() { diff --git a/build.gradle.kts b/build.gradle.kts index 19f28c8d30..6f70075be4 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -16,7 +16,6 @@ plugins { alias(libs.plugins.ksp) apply false alias(libs.plugins.golang) apply false alias(libs.plugins.spotless) apply false - alias(libs.plugins.metro) apply false } allprojects { diff --git a/glue/build.gradle.kts b/glue/build.gradle.kts index d4f36fc958..1c059c7667 100644 --- a/glue/build.gradle.kts +++ b/glue/build.gradle.kts @@ -1,7 +1,4 @@ -plugins { - alias(libs.plugins.android.library) - alias(libs.plugins.metro) -} +plugins { alias(libs.plugins.android.library) } dependencies { api(projects.core) diff --git a/glue/src/main/kotlin/com/github/kr328/clash/MainActivityClassProvider.kt b/glue/src/main/kotlin/com/github/kr328/clash/MainActivityClassProvider.kt deleted file mode 100644 index 09d255513b..0000000000 --- a/glue/src/main/kotlin/com/github/kr328/clash/MainActivityClassProvider.kt +++ /dev/null @@ -1,14 +0,0 @@ -package com.github.kr328.clash - -interface MainActivityClassProvider { - val mainActivityClass: Class<*> -} - -private var _mainActivityClassProvider: MainActivityClassProvider? = null - -val mainActivityClassProvider: MainActivityClassProvider - get() = _mainActivityClassProvider ?: error("MainActivityClassProvider has not been initialized") - -fun initMainActivityClassProvider(provider: MainActivityClassProvider) { - _mainActivityClassProvider = provider -} diff --git a/glue/src/main/kotlin/com/github/kr328/clash/util/Intent.kt b/glue/src/main/kotlin/com/github/kr328/clash/util/Intent.kt index a830c08e0e..bb7256ab05 100644 --- a/glue/src/main/kotlin/com/github/kr328/clash/util/Intent.kt +++ b/glue/src/main/kotlin/com/github/kr328/clash/util/Intent.kt @@ -2,7 +2,8 @@ package com.github.kr328.clash.util import android.content.Context import android.content.Intent -import com.github.kr328.clash.mainActivityClassProvider + +private val mainActivityClass = Class.forName("com.github.kr328.clash.MainActivity") fun mainIntent(context: Context, action: String? = null) = - Intent(context, mainActivityClassProvider.mainActivityClass).setAction(action) + Intent(context, mainActivityClass).setAction(action) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 430b02e41f..4579761720 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,7 +1,6 @@ [versions] agp = "9.2.1" kotlin = "2.3.21" -metro = "1.0.0" androidx-lifecycle = "2.11.0-beta01" kaidl = "0.2.0" room = "2.8.4" @@ -41,8 +40,6 @@ bytesize = "me.saket.bytesize:bytesize:2.2.1" composePreference = "me.zhanghai.compose.preference:preference:2.2.0" -metro-runtime = { module = "dev.zacsweers.metro:runtime", version.ref = "metro" } - # Dummy to get renovate updates, the version is used in rootProject build.gradle with spotless. ktfmt = "com.facebook:ktfmt:0.62" @@ -56,4 +53,3 @@ ksp = "com.google.devtools.ksp:2.3.7" golang = "io.github.goooler.golang:0.2.1" download = "de.undercouch.download:5.7.0" spotless = "com.diffplug.spotless:8.4.0" -metro = { id = "dev.zacsweers.metro", version.ref = "metro" } From 9d7f42caa2c25f04c41e79ee94625ccd9413df0d Mon Sep 17 00:00:00 2001 From: Goooler Date: Wed, 6 May 2026 15:02:01 +0800 Subject: [PATCH 04/10] New MainActivityClassProvider --- .../main/kotlin/com/github/kr328/clash/MainApplication.kt | 3 ++- .../com/github/kr328/clash/MainActivityClassProvider.kt | 5 +++++ glue/src/main/kotlin/com/github/kr328/clash/util/Intent.kt | 6 +++--- 3 files changed, 10 insertions(+), 4 deletions(-) create mode 100644 glue/src/main/kotlin/com/github/kr328/clash/MainActivityClassProvider.kt diff --git a/app/src/main/kotlin/com/github/kr328/clash/MainApplication.kt b/app/src/main/kotlin/com/github/kr328/clash/MainApplication.kt index dcb99834df..31418f16aa 100644 --- a/app/src/main/kotlin/com/github/kr328/clash/MainApplication.kt +++ b/app/src/main/kotlin/com/github/kr328/clash/MainApplication.kt @@ -16,7 +16,8 @@ import com.github.kr328.clash.store.UiStore import com.github.kr328.clash.util.clashDir import java.io.File -class MainApplication : Application() { +class MainApplication : Application(), MainActivityClassProvider { + override val mainActivityClass: Class<*> = MainActivity::class.java private val uiStore by lazy(LazyThreadSafetyMode.NONE) { UiStore(this) } override fun attachBaseContext(base: Context?) { diff --git a/glue/src/main/kotlin/com/github/kr328/clash/MainActivityClassProvider.kt b/glue/src/main/kotlin/com/github/kr328/clash/MainActivityClassProvider.kt new file mode 100644 index 0000000000..ea3be126fe --- /dev/null +++ b/glue/src/main/kotlin/com/github/kr328/clash/MainActivityClassProvider.kt @@ -0,0 +1,5 @@ +package com.github.kr328.clash + +interface MainActivityClassProvider { + val mainActivityClass: Class<*> +} diff --git a/glue/src/main/kotlin/com/github/kr328/clash/util/Intent.kt b/glue/src/main/kotlin/com/github/kr328/clash/util/Intent.kt index bb7256ab05..d4be022138 100644 --- a/glue/src/main/kotlin/com/github/kr328/clash/util/Intent.kt +++ b/glue/src/main/kotlin/com/github/kr328/clash/util/Intent.kt @@ -2,8 +2,8 @@ package com.github.kr328.clash.util import android.content.Context import android.content.Intent - -private val mainActivityClass = Class.forName("com.github.kr328.clash.MainActivity") +import com.github.kr328.clash.MainActivityClassProvider fun mainIntent(context: Context, action: String? = null) = - Intent(context, mainActivityClass).setAction(action) + Intent(context, (context.applicationContext as MainActivityClassProvider).mainActivityClass) + .setAction(action) From 5e891cd3019f756ac21c0846376d420219f34c05 Mon Sep 17 00:00:00 2001 From: Goooler Date: Wed, 6 May 2026 15:25:41 +0800 Subject: [PATCH 05/10] Try Koin --- app/build.gradle.kts | 2 ++ .../main/kotlin/com/github/kr328/clash/AppModule.kt | 10 ++++++++++ .../kotlin/com/github/kr328/clash/MainApplication.kt | 10 ++++++++-- glue/build.gradle.kts | 2 ++ .../main/kotlin/com/github/kr328/clash/util/Intent.kt | 3 ++- gradle/libs.versions.toml | 4 ++++ 6 files changed, 28 insertions(+), 3 deletions(-) create mode 100644 app/src/main/kotlin/com/github/kr328/clash/AppModule.kt diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 3490db4d30..298d274401 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -85,6 +85,8 @@ dependencies { implementation(libs.androidx.core) implementation(libs.androidx.activity.compose) + implementation(platform(libs.koin.bom)) + implementation(libs.koin.android) } val downloadGeoFiles by diff --git a/app/src/main/kotlin/com/github/kr328/clash/AppModule.kt b/app/src/main/kotlin/com/github/kr328/clash/AppModule.kt new file mode 100644 index 0000000000..c60322fdc2 --- /dev/null +++ b/app/src/main/kotlin/com/github/kr328/clash/AppModule.kt @@ -0,0 +1,10 @@ +package com.github.kr328.clash + +import com.github.kr328.clash.MainActivityClassProvider +import org.koin.dsl.module + +val appModule = module { single { MainActivityClassProviderImpl } } + +private object MainActivityClassProviderImpl : MainActivityClassProvider { + override val mainActivityClass: Class<*> = MainActivity::class.java +} diff --git a/app/src/main/kotlin/com/github/kr328/clash/MainApplication.kt b/app/src/main/kotlin/com/github/kr328/clash/MainApplication.kt index 31418f16aa..a6a844ca9b 100644 --- a/app/src/main/kotlin/com/github/kr328/clash/MainApplication.kt +++ b/app/src/main/kotlin/com/github/kr328/clash/MainApplication.kt @@ -15,9 +15,10 @@ import com.github.kr328.clash.service.util.sendServiceRecreated import com.github.kr328.clash.store.UiStore import com.github.kr328.clash.util.clashDir import java.io.File +import org.koin.android.ext.koin.androidContext +import org.koin.core.context.startKoin -class MainApplication : Application(), MainActivityClassProvider { - override val mainActivityClass: Class<*> = MainActivity::class.java +class MainApplication : Application() { private val uiStore by lazy(LazyThreadSafetyMode.NONE) { UiStore(this) } override fun attachBaseContext(base: Context?) { @@ -29,6 +30,11 @@ class MainApplication : Application(), MainActivityClassProvider { override fun onCreate() { super.onCreate() + startKoin { + androidContext(this@MainApplication) + modules(appModule) + } + val processName = getProcessName() extractGeoFiles() diff --git a/glue/build.gradle.kts b/glue/build.gradle.kts index 1c059c7667..ddf593748f 100644 --- a/glue/build.gradle.kts +++ b/glue/build.gradle.kts @@ -7,4 +7,6 @@ dependencies { implementation(libs.kotlin.coroutine) implementation(libs.androidx.core) + implementation(platform(libs.koin.bom)) + implementation(libs.koin.core) } diff --git a/glue/src/main/kotlin/com/github/kr328/clash/util/Intent.kt b/glue/src/main/kotlin/com/github/kr328/clash/util/Intent.kt index d4be022138..8b5f830340 100644 --- a/glue/src/main/kotlin/com/github/kr328/clash/util/Intent.kt +++ b/glue/src/main/kotlin/com/github/kr328/clash/util/Intent.kt @@ -3,7 +3,8 @@ package com.github.kr328.clash.util import android.content.Context import android.content.Intent import com.github.kr328.clash.MainActivityClassProvider +import org.koin.core.context.KoinPlatform fun mainIntent(context: Context, action: String? = null) = - Intent(context, (context.applicationContext as MainActivityClassProvider).mainActivityClass) + Intent(context, KoinPlatform.getKoin().get().mainActivityClass) .setAction(action) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 4579761720..80ee208b8a 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,6 +1,7 @@ [versions] agp = "9.2.1" kotlin = "2.3.21" +koin-bom = "4.2.0" androidx-lifecycle = "2.11.0-beta01" kaidl = "0.2.0" room = "2.8.4" @@ -42,6 +43,9 @@ composePreference = "me.zhanghai.compose.preference:preference:2.2.0" # Dummy to get renovate updates, the version is used in rootProject build.gradle with spotless. ktfmt = "com.facebook:ktfmt:0.62" +koin-bom = { module = "io.insert-koin:koin-bom", version.ref = "koin-bom" } +koin-core = { module = "io.insert-koin:koin-core" } +koin-android = { module = "io.insert-koin:koin-android" } [plugins] android-application = { id = "com.android.application", version.ref = "agp" } From e8b5d72acb02e6201b7da55109fefff9bc88ec3b Mon Sep 17 00:00:00 2001 From: Goooler Date: Wed, 6 May 2026 15:29:15 +0800 Subject: [PATCH 06/10] Apply the Compiler plugin --- app/build.gradle.kts | 2 ++ app/src/main/kotlin/com/github/kr328/clash/AppModule.kt | 1 - app/src/main/kotlin/com/github/kr328/clash/MainApplication.kt | 2 ++ glue/src/main/kotlin/com/github/kr328/clash/util/Intent.kt | 2 +- gradle/libs.versions.toml | 2 ++ 5 files changed, 7 insertions(+), 2 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 298d274401..ccf011d3da 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -7,6 +7,7 @@ plugins { alias(libs.plugins.kotlin.compose) alias(libs.plugins.kotlin.serialization) alias(libs.plugins.download) + alias(libs.plugins.koin.compiler) } android { @@ -87,6 +88,7 @@ dependencies { implementation(libs.androidx.activity.compose) implementation(platform(libs.koin.bom)) implementation(libs.koin.android) + implementation(libs.koin.annotations) } val downloadGeoFiles by diff --git a/app/src/main/kotlin/com/github/kr328/clash/AppModule.kt b/app/src/main/kotlin/com/github/kr328/clash/AppModule.kt index c60322fdc2..2b45c1899e 100644 --- a/app/src/main/kotlin/com/github/kr328/clash/AppModule.kt +++ b/app/src/main/kotlin/com/github/kr328/clash/AppModule.kt @@ -1,6 +1,5 @@ package com.github.kr328.clash -import com.github.kr328.clash.MainActivityClassProvider import org.koin.dsl.module val appModule = module { single { MainActivityClassProviderImpl } } diff --git a/app/src/main/kotlin/com/github/kr328/clash/MainApplication.kt b/app/src/main/kotlin/com/github/kr328/clash/MainApplication.kt index a6a844ca9b..37c46f1e3b 100644 --- a/app/src/main/kotlin/com/github/kr328/clash/MainApplication.kt +++ b/app/src/main/kotlin/com/github/kr328/clash/MainApplication.kt @@ -16,6 +16,7 @@ import com.github.kr328.clash.store.UiStore import com.github.kr328.clash.util.clashDir import java.io.File import org.koin.android.ext.koin.androidContext +import org.koin.android.logger.AndroidLogger import org.koin.core.context.startKoin class MainApplication : Application() { @@ -31,6 +32,7 @@ class MainApplication : Application() { super.onCreate() startKoin { + AndroidLogger() androidContext(this@MainApplication) modules(appModule) } diff --git a/glue/src/main/kotlin/com/github/kr328/clash/util/Intent.kt b/glue/src/main/kotlin/com/github/kr328/clash/util/Intent.kt index 8b5f830340..67cddf80fd 100644 --- a/glue/src/main/kotlin/com/github/kr328/clash/util/Intent.kt +++ b/glue/src/main/kotlin/com/github/kr328/clash/util/Intent.kt @@ -3,7 +3,7 @@ package com.github.kr328.clash.util import android.content.Context import android.content.Intent import com.github.kr328.clash.MainActivityClassProvider -import org.koin.core.context.KoinPlatform +import org.koin.mp.KoinPlatform fun mainIntent(context: Context, action: String? = null) = Intent(context, KoinPlatform.getKoin().get().mainActivityClass) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 80ee208b8a..820295cf52 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -46,6 +46,7 @@ ktfmt = "com.facebook:ktfmt:0.62" koin-bom = { module = "io.insert-koin:koin-bom", version.ref = "koin-bom" } koin-core = { module = "io.insert-koin:koin-core" } koin-android = { module = "io.insert-koin:koin-android" } +koin-annotations = { module = "io.insert-koin:koin-annotations" } [plugins] android-application = { id = "com.android.application", version.ref = "agp" } @@ -57,3 +58,4 @@ ksp = "com.google.devtools.ksp:2.3.7" golang = "io.github.goooler.golang:0.2.1" download = "de.undercouch.download:5.7.0" spotless = "com.diffplug.spotless:8.4.0" +koin-compiler = "io.insert-koin.compiler.plugin:1.0.0-RC2" From bd64d38cf6cb934066cf16ebca2e2265d85b0c3b Mon Sep 17 00:00:00 2001 From: Goooler Date: Wed, 6 May 2026 15:49:36 +0800 Subject: [PATCH 07/10] Cleanups --- app/build.gradle.kts | 2 +- .../kotlin/com/github/kr328/clash/AppModule.kt | 1 + .../com/github/kr328/clash/MainApplication.kt | 14 +++++++++----- glue/build.gradle.kts | 1 + .../kr328/clash/MainActivityClassProvider.kt | 5 ----- .../kotlin/com/github/kr328/clash/util/Intent.kt | 11 ++++++++--- gradle/libs.versions.toml | 9 ++++----- 7 files changed, 24 insertions(+), 19 deletions(-) delete mode 100644 glue/src/main/kotlin/com/github/kr328/clash/MainActivityClassProvider.kt diff --git a/app/build.gradle.kts b/app/build.gradle.kts index ccf011d3da..9a0f44c82d 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -86,9 +86,9 @@ dependencies { implementation(libs.androidx.core) implementation(libs.androidx.activity.compose) + implementation(platform(libs.koin.bom)) implementation(libs.koin.android) - implementation(libs.koin.annotations) } val downloadGeoFiles by diff --git a/app/src/main/kotlin/com/github/kr328/clash/AppModule.kt b/app/src/main/kotlin/com/github/kr328/clash/AppModule.kt index 2b45c1899e..da890088fc 100644 --- a/app/src/main/kotlin/com/github/kr328/clash/AppModule.kt +++ b/app/src/main/kotlin/com/github/kr328/clash/AppModule.kt @@ -1,5 +1,6 @@ package com.github.kr328.clash +import com.github.kr328.clash.util.MainActivityClassProvider import org.koin.dsl.module val appModule = module { single { MainActivityClassProviderImpl } } diff --git a/app/src/main/kotlin/com/github/kr328/clash/MainApplication.kt b/app/src/main/kotlin/com/github/kr328/clash/MainApplication.kt index 37c46f1e3b..fab0da8a3e 100644 --- a/app/src/main/kotlin/com/github/kr328/clash/MainApplication.kt +++ b/app/src/main/kotlin/com/github/kr328/clash/MainApplication.kt @@ -31,11 +31,7 @@ class MainApplication : Application() { override fun onCreate() { super.onCreate() - startKoin { - AndroidLogger() - androidContext(this@MainApplication) - modules(appModule) - } + koin() val processName = getProcessName() extractGeoFiles() @@ -50,6 +46,14 @@ class MainApplication : Application() { } } + private fun koin() { + startKoin { + AndroidLogger() + androidContext(this@MainApplication) + modules(appModule) + } + } + private fun setupShortcuts() { if (uiStore.hideAppIcon) { // Prevent launcher activity not found. diff --git a/glue/build.gradle.kts b/glue/build.gradle.kts index ddf593748f..37d387815b 100644 --- a/glue/build.gradle.kts +++ b/glue/build.gradle.kts @@ -7,6 +7,7 @@ dependencies { implementation(libs.kotlin.coroutine) implementation(libs.androidx.core) + implementation(platform(libs.koin.bom)) implementation(libs.koin.core) } diff --git a/glue/src/main/kotlin/com/github/kr328/clash/MainActivityClassProvider.kt b/glue/src/main/kotlin/com/github/kr328/clash/MainActivityClassProvider.kt deleted file mode 100644 index ea3be126fe..0000000000 --- a/glue/src/main/kotlin/com/github/kr328/clash/MainActivityClassProvider.kt +++ /dev/null @@ -1,5 +0,0 @@ -package com.github.kr328.clash - -interface MainActivityClassProvider { - val mainActivityClass: Class<*> -} diff --git a/glue/src/main/kotlin/com/github/kr328/clash/util/Intent.kt b/glue/src/main/kotlin/com/github/kr328/clash/util/Intent.kt index 67cddf80fd..6c8d7cfca8 100644 --- a/glue/src/main/kotlin/com/github/kr328/clash/util/Intent.kt +++ b/glue/src/main/kotlin/com/github/kr328/clash/util/Intent.kt @@ -2,9 +2,14 @@ package com.github.kr328.clash.util import android.content.Context import android.content.Intent -import com.github.kr328.clash.MainActivityClassProvider import org.koin.mp.KoinPlatform +interface MainActivityClassProvider { + val mainActivityClass: Class<*> +} + +private val mainActivityClass = + KoinPlatform.getKoin().get().mainActivityClass + fun mainIntent(context: Context, action: String? = null) = - Intent(context, KoinPlatform.getKoin().get().mainActivityClass) - .setAction(action) + Intent(context, mainActivityClass).setAction(action) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 820295cf52..7780a77478 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,7 +1,6 @@ [versions] agp = "9.2.1" kotlin = "2.3.21" -koin-bom = "4.2.0" androidx-lifecycle = "2.11.0-beta01" kaidl = "0.2.0" room = "2.8.4" @@ -39,14 +38,14 @@ okhttp-client = { module = "com.squareup.okhttp3:okhttp", version.ref = "okhttp" okhttp-interceptor = { module = "com.squareup.okhttp3:logging-interceptor", version.ref = "okhttp" } bytesize = "me.saket.bytesize:bytesize:2.2.1" +koin-bom = "io.insert-koin:koin-bom:4.2.1" +koin-core = { module = "io.insert-koin:koin-core" } +koin-android = { module = "io.insert-koin:koin-android" } + composePreference = "me.zhanghai.compose.preference:preference:2.2.0" # Dummy to get renovate updates, the version is used in rootProject build.gradle with spotless. ktfmt = "com.facebook:ktfmt:0.62" -koin-bom = { module = "io.insert-koin:koin-bom", version.ref = "koin-bom" } -koin-core = { module = "io.insert-koin:koin-core" } -koin-android = { module = "io.insert-koin:koin-android" } -koin-annotations = { module = "io.insert-koin:koin-annotations" } [plugins] android-application = { id = "com.android.application", version.ref = "agp" } From 6786944be8cd39c4d3bb75eec250fc8813e7dbf3 Mon Sep 17 00:00:00 2001 From: Zongle Wang Date: Wed, 6 May 2026 16:09:14 +0800 Subject: [PATCH 08/10] Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- app/build.gradle.kts | 1 - 1 file changed, 1 deletion(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 9a0f44c82d..99f4780bb5 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -7,7 +7,6 @@ plugins { alias(libs.plugins.kotlin.compose) alias(libs.plugins.kotlin.serialization) alias(libs.plugins.download) - alias(libs.plugins.koin.compiler) } android { From 3d238c0427ac5e4bf3d0d482a49bbfd6a36417e2 Mon Sep 17 00:00:00 2001 From: Zongle Wang Date: Wed, 6 May 2026 16:09:24 +0800 Subject: [PATCH 09/10] Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- glue/src/main/kotlin/com/github/kr328/clash/util/Intent.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/glue/src/main/kotlin/com/github/kr328/clash/util/Intent.kt b/glue/src/main/kotlin/com/github/kr328/clash/util/Intent.kt index 6c8d7cfca8..5c75356916 100644 --- a/glue/src/main/kotlin/com/github/kr328/clash/util/Intent.kt +++ b/glue/src/main/kotlin/com/github/kr328/clash/util/Intent.kt @@ -1,11 +1,12 @@ package com.github.kr328.clash.util +import android.app.Activity import android.content.Context import android.content.Intent import org.koin.mp.KoinPlatform interface MainActivityClassProvider { - val mainActivityClass: Class<*> + val mainActivityClass: Class } private val mainActivityClass = From 5ab369ea238dc2c9a836db53f402cbe12bd3cd4f Mon Sep 17 00:00:00 2001 From: Goooler Date: Wed, 6 May 2026 16:07:45 +0800 Subject: [PATCH 10/10] Address comments --- app/src/main/kotlin/com/github/kr328/clash/AppModule.kt | 3 ++- .../kotlin/com/github/kr328/clash/MainApplication.kt | 7 +++---- .../main/kotlin/com/github/kr328/clash/util/Intent.kt | 9 ++++----- gradle/libs.versions.toml | 1 - 4 files changed, 9 insertions(+), 11 deletions(-) diff --git a/app/src/main/kotlin/com/github/kr328/clash/AppModule.kt b/app/src/main/kotlin/com/github/kr328/clash/AppModule.kt index da890088fc..e20c72a426 100644 --- a/app/src/main/kotlin/com/github/kr328/clash/AppModule.kt +++ b/app/src/main/kotlin/com/github/kr328/clash/AppModule.kt @@ -1,10 +1,11 @@ package com.github.kr328.clash +import android.app.Activity import com.github.kr328.clash.util.MainActivityClassProvider import org.koin.dsl.module val appModule = module { single { MainActivityClassProviderImpl } } private object MainActivityClassProviderImpl : MainActivityClassProvider { - override val mainActivityClass: Class<*> = MainActivity::class.java + override val mainActivityClass: Class = MainActivity::class.java } diff --git a/app/src/main/kotlin/com/github/kr328/clash/MainApplication.kt b/app/src/main/kotlin/com/github/kr328/clash/MainApplication.kt index fab0da8a3e..c4af0958f7 100644 --- a/app/src/main/kotlin/com/github/kr328/clash/MainApplication.kt +++ b/app/src/main/kotlin/com/github/kr328/clash/MainApplication.kt @@ -16,7 +16,7 @@ import com.github.kr328.clash.store.UiStore import com.github.kr328.clash.util.clashDir import java.io.File import org.koin.android.ext.koin.androidContext -import org.koin.android.logger.AndroidLogger +import org.koin.android.ext.koin.androidLogger import org.koin.core.context.startKoin class MainApplication : Application() { @@ -31,14 +31,13 @@ class MainApplication : Application() { override fun onCreate() { super.onCreate() - koin() - val processName = getProcessName() extractGeoFiles() Log.d("Process $processName started") if (processName == packageName) { + koin() Remote.launch() setupShortcuts() } else { @@ -48,7 +47,7 @@ class MainApplication : Application() { private fun koin() { startKoin { - AndroidLogger() + androidLogger() androidContext(this@MainApplication) modules(appModule) } diff --git a/glue/src/main/kotlin/com/github/kr328/clash/util/Intent.kt b/glue/src/main/kotlin/com/github/kr328/clash/util/Intent.kt index 5c75356916..c73c361a56 100644 --- a/glue/src/main/kotlin/com/github/kr328/clash/util/Intent.kt +++ b/glue/src/main/kotlin/com/github/kr328/clash/util/Intent.kt @@ -9,8 +9,7 @@ interface MainActivityClassProvider { val mainActivityClass: Class } -private val mainActivityClass = - KoinPlatform.getKoin().get().mainActivityClass - -fun mainIntent(context: Context, action: String? = null) = - Intent(context, mainActivityClass).setAction(action) +fun mainIntent(context: Context, action: String? = null): Intent { + val mainActivityClass = KoinPlatform.getKoin().get().mainActivityClass + return Intent(context, mainActivityClass).setAction(action) +} diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 7780a77478..ae6872f2aa 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -57,4 +57,3 @@ ksp = "com.google.devtools.ksp:2.3.7" golang = "io.github.goooler.golang:0.2.1" download = "de.undercouch.download:5.7.0" spotless = "com.diffplug.spotless:8.4.0" -koin-compiler = "io.insert-koin.compiler.plugin:1.0.0-RC2"