From c37925fed860baa2efb428918af16c2ab265362b Mon Sep 17 00:00:00 2001 From: Phil Oliver <3497406+poliver@users.noreply.github.com> Date: Tue, 23 Sep 2025 17:48:16 -0400 Subject: [PATCH] Move common dispatchers to `:core:di` (#3178) --- app/build.gradle.kts | 1 + .../java/com/geeksville/mesh/di/MapModule.kt | 17 --------- ...PreferencesCustomTileProviderRepository.kt | 2 +- core/di/build.gradle.kts | 25 ++++++++++++ .../org/meshtastic/core/di/AppModule.kt | 38 +++++++++++++++++++ .../core/di/annotation/DefaultDispatcher.kt | 24 ++++++++++++ .../core/di/annotation/IoDispatcher.kt | 24 ++++++++++++ settings.gradle.kts | 2 +- 8 files changed, 114 insertions(+), 19 deletions(-) create mode 100644 core/di/build.gradle.kts create mode 100644 core/di/src/main/kotlin/org/meshtastic/core/di/AppModule.kt create mode 100644 core/di/src/main/kotlin/org/meshtastic/core/di/annotation/DefaultDispatcher.kt create mode 100644 core/di/src/main/kotlin/org/meshtastic/core/di/annotation/IoDispatcher.kt diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 90bac9979..7b37e92d5 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -182,6 +182,7 @@ project.afterEvaluate { logger.lifecycle("Version code is set to: ${android.defa dependencies { implementation(projects.core.data) implementation(projects.core.datastore) + implementation(projects.core.di) implementation(projects.core.model) implementation(projects.core.navigation) implementation(projects.core.network) diff --git a/app/src/google/java/com/geeksville/mesh/di/MapModule.kt b/app/src/google/java/com/geeksville/mesh/di/MapModule.kt index 3351d083e..6576f1dc1 100644 --- a/app/src/google/java/com/geeksville/mesh/di/MapModule.kt +++ b/app/src/google/java/com/geeksville/mesh/di/MapModule.kt @@ -24,30 +24,13 @@ import dagger.Module import dagger.Provides import dagger.hilt.InstallIn import dagger.hilt.components.SingletonComponent -import kotlinx.coroutines.CoroutineDispatcher -import kotlinx.coroutines.Dispatchers import kotlinx.serialization.json.Json -import javax.inject.Qualifier import javax.inject.Singleton -@Qualifier -@Retention(AnnotationRetention.BINARY) -annotation class IoDispatcher - -@Qualifier -@Retention(AnnotationRetention.BINARY) -annotation class DefaultDispatcher - @Module @InstallIn(SingletonComponent::class) object MapModule { - @Provides @DefaultDispatcher - fun provideDefaultDispatcher(): CoroutineDispatcher = Dispatchers.Default - - @Provides @IoDispatcher - fun provideIoDispatcher(): CoroutineDispatcher = Dispatchers.IO - // Serialization Provider (from original SerializationModule) @Provides @Singleton fun provideJson(): Json = Json { prettyPrint = false } diff --git a/app/src/google/java/com/geeksville/mesh/repository/map/SharedPreferencesCustomTileProviderRepository.kt b/app/src/google/java/com/geeksville/mesh/repository/map/SharedPreferencesCustomTileProviderRepository.kt index d48034a37..8c768c16e 100644 --- a/app/src/google/java/com/geeksville/mesh/repository/map/SharedPreferencesCustomTileProviderRepository.kt +++ b/app/src/google/java/com/geeksville/mesh/repository/map/SharedPreferencesCustomTileProviderRepository.kt @@ -17,7 +17,6 @@ package com.geeksville.mesh.repository.map -import com.geeksville.mesh.di.IoDispatcher import com.geeksville.mesh.ui.map.CustomTileProviderConfig import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.flow.Flow @@ -26,6 +25,7 @@ import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.withContext import kotlinx.serialization.SerializationException import kotlinx.serialization.json.Json +import org.meshtastic.core.di.annotation.IoDispatcher import org.meshtastic.core.prefs.map.MapTileProviderPrefs import timber.log.Timber import javax.inject.Inject diff --git a/core/di/build.gradle.kts b/core/di/build.gradle.kts new file mode 100644 index 000000000..1442d4962 --- /dev/null +++ b/core/di/build.gradle.kts @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2025 Meshtastic LLC + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +plugins { + alias(libs.plugins.meshtastic.android.library) + alias(libs.plugins.meshtastic.hilt) +} + +android { namespace = "org.meshtastic.core.di" } + +dependencies {} diff --git a/core/di/src/main/kotlin/org/meshtastic/core/di/AppModule.kt b/core/di/src/main/kotlin/org/meshtastic/core/di/AppModule.kt new file mode 100644 index 000000000..c4a43371e --- /dev/null +++ b/core/di/src/main/kotlin/org/meshtastic/core/di/AppModule.kt @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2025 Meshtastic LLC + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package org.meshtastic.core.di + +import dagger.Module +import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.components.SingletonComponent +import kotlinx.coroutines.CoroutineDispatcher +import kotlinx.coroutines.Dispatchers +import org.meshtastic.core.di.annotation.DefaultDispatcher +import org.meshtastic.core.di.annotation.IoDispatcher + +@Module +@InstallIn(SingletonComponent::class) +object AppModule { + + @Provides @DefaultDispatcher + fun provideDefaultDispatcher(): CoroutineDispatcher = Dispatchers.Default + + @Provides @IoDispatcher + fun provideIoDispatcher(): CoroutineDispatcher = Dispatchers.IO +} diff --git a/core/di/src/main/kotlin/org/meshtastic/core/di/annotation/DefaultDispatcher.kt b/core/di/src/main/kotlin/org/meshtastic/core/di/annotation/DefaultDispatcher.kt new file mode 100644 index 000000000..e7452bf9d --- /dev/null +++ b/core/di/src/main/kotlin/org/meshtastic/core/di/annotation/DefaultDispatcher.kt @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2025 Meshtastic LLC + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package org.meshtastic.core.di.annotation + +import javax.inject.Qualifier + +@Qualifier +@Retention(AnnotationRetention.BINARY) +annotation class DefaultDispatcher diff --git a/core/di/src/main/kotlin/org/meshtastic/core/di/annotation/IoDispatcher.kt b/core/di/src/main/kotlin/org/meshtastic/core/di/annotation/IoDispatcher.kt new file mode 100644 index 000000000..c47e18797 --- /dev/null +++ b/core/di/src/main/kotlin/org/meshtastic/core/di/annotation/IoDispatcher.kt @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2025 Meshtastic LLC + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package org.meshtastic.core.di.annotation + +import javax.inject.Qualifier + +@Qualifier +@Retention(AnnotationRetention.BINARY) +annotation class IoDispatcher diff --git a/settings.gradle.kts b/settings.gradle.kts index 285e6551d..ccdeaa40e 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -17,7 +17,7 @@ import org.gradle.kotlin.dsl.maven * along with this program. If not, see . */ -include(":app", ":core:data", ":core:datastore", ":core:model", ":core:navigation", ":core:network", ":core:prefs", ":core:proto", +include(":app", ":core:data", ":core:datastore", ":core:di", ":core:model", ":core:navigation", ":core:network", ":core:prefs", ":core:proto", ":core:strings", ":feature:map", ":mesh_service_example") rootProject.name = "MeshtasticAndroid"