diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 9363877d4..a972cb5f3 100755 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -153,6 +153,7 @@ dependencies { implementation(projects.core.data.impl) implementation(projects.core.playback) implementation(projects.core.scanner) + implementation(projects.core.initializer) implementation(projects.features.playbackScreen) implementation(projects.navigation) implementation(projects.core.sleeptimer.api) @@ -171,7 +172,6 @@ dependencies { implementation(libs.appCompat) implementation(libs.material) implementation(libs.datastore) - implementation(libs.appStartup) implementation(libs.navigation3.ui) @@ -198,9 +198,6 @@ dependencies { testImplementation(libs.junit) testImplementation(libs.mockk) - implementation(libs.leakcanary.plumber) - debugImplementation(libs.leakcanary.android) - implementation(libs.media3.exoplayer) implementation(libs.media3.session) diff --git a/app/src/main/kotlin/voice/app/di/App.kt b/app/src/main/kotlin/voice/app/di/App.kt index 4697071c1..e1e9ff266 100644 --- a/app/src/main/kotlin/voice/app/di/App.kt +++ b/app/src/main/kotlin/voice/app/di/App.kt @@ -14,6 +14,7 @@ import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.launch import voice.core.common.rootGraph import voice.core.data.store.DarkThemeStore +import voice.core.initializer.AppInitializer import voice.core.scanner.MediaScanTrigger import voice.core.sleeptimer.AutoEnableSleepTimer import voice.core.ui.DARK_THEME_SETTABLE @@ -30,6 +31,9 @@ open class App : Application() { @Inject lateinit var autoEnableSleepTimer: AutoEnableSleepTimer + @Inject + lateinit var appInitializers: Set + @field:[ Inject DarkThemeStore @@ -62,6 +66,9 @@ open class App : Application() { } } + appInitializers.forEach { + it.onAppStart(this) + } mediaScanner.scan() triggerWidgetOnChange.init() autoEnableSleepTimer.startMonitoring() diff --git a/core/initializer/build.gradle.kts b/core/initializer/build.gradle.kts new file mode 100644 index 000000000..e7bcd7360 --- /dev/null +++ b/core/initializer/build.gradle.kts @@ -0,0 +1,3 @@ +plugins { + id("voice.library") +} diff --git a/core/initializer/src/main/kotlin/voice/core/initializer/AppInitializer.kt b/core/initializer/src/main/kotlin/voice/core/initializer/AppInitializer.kt new file mode 100644 index 000000000..44b699c67 --- /dev/null +++ b/core/initializer/src/main/kotlin/voice/core/initializer/AppInitializer.kt @@ -0,0 +1,8 @@ +package voice.core.initializer + +import android.app.Application + +interface AppInitializer { + + fun onAppStart(application: Application) +} diff --git a/core/logging/crashlytics/build.gradle.kts b/core/logging/crashlytics/build.gradle.kts index 683225baa..50b2286f6 100644 --- a/core/logging/crashlytics/build.gradle.kts +++ b/core/logging/crashlytics/build.gradle.kts @@ -1,8 +1,9 @@ plugins { id("voice.library") + alias(libs.plugins.metro) } dependencies { - implementation(libs.appStartup) + implementation(projects.core.initializer) implementation(libs.firebase.crashlytics) } diff --git a/core/logging/crashlytics/src/main/AndroidManifest.xml b/core/logging/crashlytics/src/main/AndroidManifest.xml deleted file mode 100644 index a2461e4cd..000000000 --- a/core/logging/crashlytics/src/main/AndroidManifest.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - diff --git a/core/logging/crashlytics/src/main/kotlin/voice/core/logging/crashlytics/CrashlyticsLogWriterInitializer.kt b/core/logging/crashlytics/src/main/kotlin/voice/core/logging/crashlytics/CrashlyticsLogWriterInitializer.kt index e216c8261..f92d6ecd4 100644 --- a/core/logging/crashlytics/src/main/kotlin/voice/core/logging/crashlytics/CrashlyticsLogWriterInitializer.kt +++ b/core/logging/crashlytics/src/main/kotlin/voice/core/logging/crashlytics/CrashlyticsLogWriterInitializer.kt @@ -1,15 +1,17 @@ package voice.core.logging.crashlytics -import android.content.Context -import androidx.startup.Initializer +import android.app.Application +import dev.zacsweers.metro.AppScope +import dev.zacsweers.metro.ContributesIntoSet +import dev.zacsweers.metro.Inject +import voice.core.initializer.AppInitializer import voice.core.logging.core.Logger -@Suppress("unused") -class CrashlyticsLogWriterInitializer : Initializer { +@ContributesIntoSet(AppScope::class) +@Inject +class CrashlyticsLogWriterInitializer : AppInitializer { - override fun create(context: Context) { + override fun onAppStart(application: Application) { Logger.install(CrashlyticsLogWriter()) } - - override fun dependencies(): List>> = emptyList() } diff --git a/core/logging/debug/build.gradle.kts b/core/logging/debug/build.gradle.kts index 4b69b10f6..0fd2e4c50 100644 --- a/core/logging/debug/build.gradle.kts +++ b/core/logging/debug/build.gradle.kts @@ -1,7 +1,8 @@ plugins { id("voice.library") + alias(libs.plugins.metro) } dependencies { - implementation(libs.appStartup) + implementation(projects.core.initializer) } diff --git a/core/logging/debug/src/main/AndroidManifest.xml b/core/logging/debug/src/main/AndroidManifest.xml deleted file mode 100644 index fb304434a..000000000 --- a/core/logging/debug/src/main/AndroidManifest.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - diff --git a/core/logging/debug/src/main/kotlin/voice/core/logging/debug/DebugLogWriterInitializer.kt b/core/logging/debug/src/main/kotlin/voice/core/logging/debug/DebugLogWriterInitializer.kt index 164ac5b2e..c90204130 100644 --- a/core/logging/debug/src/main/kotlin/voice/core/logging/debug/DebugLogWriterInitializer.kt +++ b/core/logging/debug/src/main/kotlin/voice/core/logging/debug/DebugLogWriterInitializer.kt @@ -1,15 +1,17 @@ package voice.core.logging.debug -import android.content.Context -import androidx.startup.Initializer +import android.app.Application +import dev.zacsweers.metro.AppScope +import dev.zacsweers.metro.ContributesIntoSet +import dev.zacsweers.metro.Inject +import voice.core.initializer.AppInitializer import voice.core.logging.core.Logger -@Suppress("unused") -class DebugLogWriterInitializer : Initializer { +@ContributesIntoSet(AppScope::class) +@Inject +class DebugLogWriterInitializer : AppInitializer { - override fun create(context: Context) { + override fun onAppStart(application: Application) { Logger.install(DebugLogWriter()) } - - override fun dependencies(): List>> = emptyList() } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 7e984fa8c..b899a9423 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,5 +1,4 @@ [versions] -leakcanary = "2.14" versionCode = "3603049" versionName = "8.6.2" @@ -20,8 +19,6 @@ metro = "0.6.3" [libraries] androidPluginForGradle = { module = "com.android.tools.build:gradle", version.ref = "agp" } -leakcanary-android = { module = "com.squareup.leakcanary:leakcanary-android-startup", version.ref = "leakcanary" } -leakcanary-plumber = { module = "com.squareup.leakcanary:plumber-android-startup", version.ref = "leakcanary" } material = "com.google.android.material:material:1.12.0" junit = "junit:junit:4.13.2" mockk = "io.mockk:mockk:1.14.5" @@ -40,7 +37,6 @@ documentFile = "androidx.documentfile:documentfile:1.1.0" koTest-assert = "io.kotest:kotest-assertions-core:6.0.1" datastore = "androidx.datastore:datastore-preferences:1.1.7" seismic = "com.squareup:seismic:1.0.3" -appStartup = "androidx.startup:startup-runtime:1.2.0" turbine = "app.cash.turbine:turbine:1.2.1" molecule = "app.cash.molecule:molecule-runtime:2.1.0" immutable = "org.jetbrains.kotlinx:kotlinx-collections-immutable:0.4.0" diff --git a/settings.gradle.kts b/settings.gradle.kts index bb39b6e22..e3a77a891 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -66,6 +66,7 @@ include(":core:scanner") include(":core:search") include(":core:strings") include(":core:ui") +include(":core:initializer") include(":features:bookOverview") include(":features:bookmark") @@ -79,4 +80,4 @@ include(":features:settings") include(":features:sleepTimer") include(":features:widget") include(":core:sleeptimer:api") -include(":core:sleeptimer:impl") \ No newline at end of file +include(":core:sleeptimer:impl")