From a948a71fa56b1198d11fedeac5b6b0c1274bfdcb Mon Sep 17 00:00:00 2001 From: Bryan Van Deusen Date: Thu, 21 May 2026 21:58:30 -0400 Subject: [PATCH] feat(android): Hilt application + AppModule (Json + ApplicationScope) M8 phase 1.3. Plants the Hilt entrypoint so the rest of the modules (NetworkModule, DatabaseModule, PlayerModule) can land in subsequent phases. WorkerFactory wired so HiltWorker can be used directly later. Restores @AndroidEntryPoint on MainActivity (deferred from 1.2 since Hilt KSP errors without an annotated Application class). Co-Authored-By: Claude Opus 4.7 (1M context) --- .../com/fabledsword/minstrel/MainActivity.kt | 4 +-- .../minstrel/MinstrelApplication.kt | 23 +++++++++++++ .../com/fabledsword/minstrel/di/AppModule.kt | 33 +++++++++++++++++++ 3 files changed, 58 insertions(+), 2 deletions(-) create mode 100644 android/app/src/main/java/com/fabledsword/minstrel/MinstrelApplication.kt create mode 100644 android/app/src/main/java/com/fabledsword/minstrel/di/AppModule.kt diff --git a/android/app/src/main/java/com/fabledsword/minstrel/MainActivity.kt b/android/app/src/main/java/com/fabledsword/minstrel/MainActivity.kt index b413a0d6..97e9824d 100644 --- a/android/app/src/main/java/com/fabledsword/minstrel/MainActivity.kt +++ b/android/app/src/main/java/com/fabledsword/minstrel/MainActivity.kt @@ -10,9 +10,9 @@ import androidx.compose.material3.Scaffold import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier +import dagger.hilt.android.AndroidEntryPoint -// @AndroidEntryPoint added in Task 1.3 alongside @HiltAndroidApp on MinstrelApplication -// (Hilt KSP errors without an annotated Application class). +@AndroidEntryPoint class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) diff --git a/android/app/src/main/java/com/fabledsword/minstrel/MinstrelApplication.kt b/android/app/src/main/java/com/fabledsword/minstrel/MinstrelApplication.kt new file mode 100644 index 00000000..34f149c5 --- /dev/null +++ b/android/app/src/main/java/com/fabledsword/minstrel/MinstrelApplication.kt @@ -0,0 +1,23 @@ +package com.fabledsword.minstrel + +import android.app.Application +import androidx.hilt.work.HiltWorkerFactory +import androidx.work.Configuration +import dagger.hilt.android.HiltAndroidApp +import timber.log.Timber +import javax.inject.Inject + +@HiltAndroidApp +class MinstrelApplication : Application(), Configuration.Provider { + @Inject lateinit var workerFactory: HiltWorkerFactory + + override fun onCreate() { + super.onCreate() + if (BuildConfig.DEBUG) Timber.plant(Timber.DebugTree()) + } + + override val workManagerConfiguration: Configuration + get() = Configuration.Builder() + .setWorkerFactory(workerFactory) + .build() +} diff --git a/android/app/src/main/java/com/fabledsword/minstrel/di/AppModule.kt b/android/app/src/main/java/com/fabledsword/minstrel/di/AppModule.kt new file mode 100644 index 00000000..1add2f76 --- /dev/null +++ b/android/app/src/main/java/com/fabledsword/minstrel/di/AppModule.kt @@ -0,0 +1,33 @@ +package com.fabledsword.minstrel.di + +import dagger.Module +import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.components.SingletonComponent +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.SupervisorJob +import kotlinx.serialization.json.Json +import javax.inject.Qualifier +import javax.inject.Singleton + +@Qualifier +@Retention(AnnotationRetention.BINARY) +annotation class ApplicationScope + +@Module +@InstallIn(SingletonComponent::class) +object AppModule { + @Provides + @Singleton + fun provideJson(): Json = Json { + ignoreUnknownKeys = true + explicitNulls = false + coerceInputValues = true + } + + @Provides + @Singleton + @ApplicationScope + fun provideAppScope(): CoroutineScope = CoroutineScope(SupervisorJob() + Dispatchers.Default) +}