diff --git a/README.md b/README.md index 74f7a9f8c..2580f7932 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,9 @@ TvManiac ------------------------- -![Check](https://github.com/c0de-wizard/tv-maniac/actions/workflows/build.yml/badge.svg) -![android](http://img.shields.io/badge/platform-android-6EDB8D.svg?style=flat) ![ios](http://img.shields.io/badge/platform-ios-CDCDCD.svg?style=flat) +![Check](https://github.com/thomaskioko/tv-maniac/actions/workflows/ci.yml/badge.svg) +![kmp](https://img.shields.io/badge/multiplatform-%237F52FF.svg?style=for-the-badge&logo=kotlin&logoColor=white) +![compose](https://img.shields.io/badge/jetpack_compose-2bab6b.svg?style=for-the-badge&logo=android&logoColor=white) +![swiftui](https://img.shields.io/badge/swiftui-%23000000.svg?style=for-the-badge&logo=swift&logoColor=white) [![TvManiac Debug](https://img.shields.io/badge/Debug--Apk-download-green?style=for-the-badge&logo=android)](https://github.com/c0de-wizard/tv-maniac/releases/latest/download/app-debug.apk) **TvManiac** is a personalized entertainment tracking and recommendation Multiplatform app. By utilizing @@ -119,7 +121,7 @@ This is my playground for learning Kotlin Multiplatform. With that said, I'm sur * [DateTime](https://github.com/Kotlin/kotlinx-datetime) - Date & Time * [Decompose](https://arkivanov.github.io/Decompose/) - Kotlin Multiplatform library for breaking down your code into lifecycle-aware business logic components (aka BLoC). * [Kermit](https://kermit.touchlab.co/) - Logging -* [kotlin-inject](https://github.com/evant/kotlin-inject) - Injection library. +* [kotlin-inject-anvil](https://github.com/amzn/kotlin-inject-anvil?tab=readme-ov-file) - Dependency Injection library. * [Kotlinx Serialization](https://ktor.io/docs/kotlin-serialization.html) - De/Serializing JSON * [Ktor](https://ktor.io/) - Networking * [Kotest Assertions](https://kotest.io/docs/assertions/assertions.html) - Testing diff --git a/android/app/build.gradle.kts b/android/app/build.gradle.kts index 71ae3e7bb..0256c8165 100644 --- a/android/app/build.gradle.kts +++ b/android/app/build.gradle.kts @@ -14,7 +14,6 @@ dependencies { implementation(projects.android.ui.seasonDetails) implementation(projects.android.ui.showDetails) implementation(projects.android.ui.trailers) - implementation(projects.shared) implementation(projects.core.base) implementation(projects.core.util) implementation(projects.traktAuth.api) @@ -38,6 +37,8 @@ dependencies { implementation(projects.data.requestManager.api) implementation(projects.data.requestManager.api) implementation(projects.data.requestManager.implementation) + implementation(projects.data.search.api) + implementation(projects.data.search.implementation) implementation(projects.data.seasondetails.api) implementation(projects.data.seasondetails.implementation) implementation(projects.data.seasons.api) @@ -81,8 +82,9 @@ dependencies { implementation(libs.decompose.decompose) implementation(libs.decompose.extensions.compose) - implementation(libs.kotlinInject.runtime) + implementation(libs.bundles.kotlinInject) ksp(libs.kotlinInject.compiler) + ksp(libs.kotlinInject.anvil.compiler) implementation(libs.androidx.datastore.core) implementation(libs.androidx.savedstate) @@ -94,5 +96,3 @@ dependencies { implementation(libs.coroutines.core) implementation(libs.ktor.core) } - -ksp { arg("me.tatarka.inject.generateCompanionExtensions", "true") } diff --git a/android/app/src/main/kotlin/com/thomaskioko/tvmaniac/MainActivity.kt b/android/app/src/main/kotlin/com/thomaskioko/tvmaniac/MainActivity.kt index 22e02d9c8..37fd7d54c 100644 --- a/android/app/src/main/kotlin/com/thomaskioko/tvmaniac/MainActivity.kt +++ b/android/app/src/main/kotlin/com/thomaskioko/tvmaniac/MainActivity.kt @@ -16,7 +16,6 @@ import androidx.core.view.WindowCompat import com.thomaskioko.tvmaniac.compose.theme.TvManiacTheme import com.thomaskioko.tvmaniac.datastore.api.AppTheme import com.thomaskioko.tvmaniac.inject.ActivityComponent -import com.thomaskioko.tvmaniac.inject.create import com.thomaskioko.tvmaniac.navigation.ThemeState class MainActivity : ComponentActivity() { diff --git a/android/app/src/main/kotlin/com/thomaskioko/tvmaniac/TvManicApplication.kt b/android/app/src/main/kotlin/com/thomaskioko/tvmaniac/TvManicApplication.kt index 137e351fb..47e912640 100644 --- a/android/app/src/main/kotlin/com/thomaskioko/tvmaniac/TvManicApplication.kt +++ b/android/app/src/main/kotlin/com/thomaskioko/tvmaniac/TvManicApplication.kt @@ -6,10 +6,12 @@ import com.thomaskioko.tvmaniac.inject.ApplicationComponent import com.thomaskioko.tvmaniac.inject.create class TvManicApplication : Application() { - private val component: ApplicationComponent by unsafeLazy { ApplicationComponent.create(this) } + private val component: ApplicationComponent by unsafeLazy { ApplicationComponent::class.create(this) } override fun onCreate() { super.onCreate() component.initializers.init() } + + fun getApplicationComponent() = component } diff --git a/android/app/src/main/kotlin/com/thomaskioko/tvmaniac/initializers/AppInitializers.kt b/android/app/src/main/kotlin/com/thomaskioko/tvmaniac/initializers/AppInitializers.kt index e3c1510f8..d471c0661 100644 --- a/android/app/src/main/kotlin/com/thomaskioko/tvmaniac/initializers/AppInitializers.kt +++ b/android/app/src/main/kotlin/com/thomaskioko/tvmaniac/initializers/AppInitializers.kt @@ -1,9 +1,12 @@ package com.thomaskioko.tvmaniac.initializers import com.thomaskioko.tvmaniac.core.base.AppInitializer +import software.amazon.lastmile.kotlin.inject.anvil.AppScope import me.tatarka.inject.annotations.Inject +import software.amazon.lastmile.kotlin.inject.anvil.SingleIn @Inject +@SingleIn(AppScope::class) class AppInitializers( private val initializers: Set, ) { diff --git a/android/app/src/main/kotlin/com/thomaskioko/tvmaniac/inject/ActivityComponent.kt b/android/app/src/main/kotlin/com/thomaskioko/tvmaniac/inject/ActivityComponent.kt index 0147fc510..23d42c672 100644 --- a/android/app/src/main/kotlin/com/thomaskioko/tvmaniac/inject/ActivityComponent.kt +++ b/android/app/src/main/kotlin/com/thomaskioko/tvmaniac/inject/ActivityComponent.kt @@ -3,25 +3,38 @@ package com.thomaskioko.tvmaniac.inject import androidx.activity.ComponentActivity import com.arkivanov.decompose.ComponentContext import com.arkivanov.decompose.defaultComponentContext +import com.thomaskioko.tvmaniac.TvManicApplication import com.thomaskioko.tvmaniac.core.base.annotations.ActivityScope import com.thomaskioko.tvmaniac.navigation.RootPresenter -import com.thomaskioko.tvmaniac.navigation.di.NavigatorComponent import com.thomaskioko.tvmaniac.traktauth.api.TraktAuthManager -import com.thomaskioko.tvmaniac.traktauth.implementation.TraktAuthManagerComponent -import me.tatarka.inject.annotations.Component import me.tatarka.inject.annotations.Provides +import software.amazon.lastmile.kotlin.inject.anvil.AppScope +import software.amazon.lastmile.kotlin.inject.anvil.ContributesSubcomponent +import software.amazon.lastmile.kotlin.inject.anvil.SingleIn -@ActivityScope -@Component -abstract class ActivityComponent( - @get:Provides val activity: ComponentActivity, - @get:Provides val componentContext: ComponentContext = activity.defaultComponentContext(), - @Component - val applicationComponent: ApplicationComponent = - ApplicationComponent.create(activity.application), -) : NavigatorComponent, TraktAuthManagerComponent { - abstract val traktAuthManager: TraktAuthManager - abstract val rootPresenter: RootPresenter +@ContributesSubcomponent(ActivityScope::class) +@SingleIn(ActivityScope::class) +interface ActivityComponent { + @Provides + fun provideComponentContext( + activity: ComponentActivity + ): ComponentContext = activity.defaultComponentContext() - companion object + val traktAuthManager: TraktAuthManager + val rootPresenter: RootPresenter + + @ContributesSubcomponent.Factory(AppScope::class) + interface Factory { + fun createComponent( + activity: ComponentActivity + ): ActivityComponent + } + + companion object { + fun create(activity: ComponentActivity): ActivityComponent = + (activity.application as TvManicApplication) + .getApplicationComponent() + .activityComponentFactory + .createComponent(activity) + } } diff --git a/android/app/src/main/kotlin/com/thomaskioko/tvmaniac/inject/ApplicationComponent.kt b/android/app/src/main/kotlin/com/thomaskioko/tvmaniac/inject/ApplicationComponent.kt index 295de45dd..a80af2103 100644 --- a/android/app/src/main/kotlin/com/thomaskioko/tvmaniac/inject/ApplicationComponent.kt +++ b/android/app/src/main/kotlin/com/thomaskioko/tvmaniac/inject/ApplicationComponent.kt @@ -1,19 +1,19 @@ package com.thomaskioko.tvmaniac.inject import android.app.Application -import com.thomaskioko.tvmaniac.core.base.annotations.ApplicationScope import com.thomaskioko.tvmaniac.initializers.AppInitializers -import com.thomaskioko.tvmaniac.shared.SharedComponent -import com.thomaskioko.tvmaniac.traktauth.implementation.TraktAuthComponent -import me.tatarka.inject.annotations.Component import me.tatarka.inject.annotations.Provides +import software.amazon.lastmile.kotlin.inject.anvil.AppScope +import software.amazon.lastmile.kotlin.inject.anvil.MergeComponent +import software.amazon.lastmile.kotlin.inject.anvil.SingleIn -@Component -@ApplicationScope +@MergeComponent(AppScope::class) +@SingleIn(AppScope::class) abstract class ApplicationComponent( @get:Provides val application: Application, -) : SharedComponent(), TraktAuthComponent { +) : ActivityComponent.Factory { abstract val initializers: AppInitializers + abstract val activityComponentFactory: ActivityComponent.Factory companion object } diff --git a/build-plugins/src/main/kotlin/com/thomaskioko/tvmaniac/plugins/KotlinMultiplatformConventionPlugin.kt b/build-plugins/src/main/kotlin/com/thomaskioko/tvmaniac/plugins/KotlinMultiplatformConventionPlugin.kt index d80b542d3..03fc8c6e2 100644 --- a/build-plugins/src/main/kotlin/com/thomaskioko/tvmaniac/plugins/KotlinMultiplatformConventionPlugin.kt +++ b/build-plugins/src/main/kotlin/com/thomaskioko/tvmaniac/plugins/KotlinMultiplatformConventionPlugin.kt @@ -10,9 +10,8 @@ import org.gradle.kotlin.dsl.findByType import org.gradle.kotlin.dsl.getByType import org.gradle.kotlin.dsl.withType import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension -import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget -import org.jetbrains.kotlin.gradle.tasks.KotlinCompile +import java.util.Locale class KotlinMultiplatformConventionPlugin : Plugin { override fun apply(target: Project) = with(target) { @@ -88,7 +87,7 @@ class KotlinMultiplatformConventionPlugin : Plugin { "androidTestFixtures", "androidTestFixturesDebug", "androidTestFixturesRelease", - "androidTestFixturesDemo" + "androidTestFixturesDemo", ).contains(it.name) } } @@ -96,7 +95,7 @@ class KotlinMultiplatformConventionPlugin : Plugin { } } -fun Project.addLanguageArgs(vararg args: String){ +fun Project.addLanguageArgs(vararg args: String) { extensions.configure { sourceSets.all { languageSettings { @@ -112,18 +111,19 @@ private fun Project.addKspDependencyForAllTargets( dependencyNotation: Any, ) { val kmpExtension = extensions.getByType() + val kspTargets = kmpExtension.targets.names.map { targetName -> + targetName.replaceFirstChar { + if (it.isLowerCase()) it.titlecase(Locale.US) else it.toString() + } + } dependencies { - kmpExtension.targets + kspTargets .asSequence() - .filter { target -> - // Don't add KSP for common target, only final platforms - target.platformType != KotlinPlatformType.common + .map { target -> + if (target == "Metadata") "CommonMainMetadata" else target } - .forEach { target -> - add( - "ksp${target.name.replaceFirstChar(Char::uppercaseChar)}$configurationNameSuffix", - dependencyNotation, - ) + .forEach { targetConfigSuffix -> + add("ksp${targetConfigSuffix}$configurationNameSuffix", dependencyNotation) } } } diff --git a/core/base/build.gradle.kts b/core/base/build.gradle.kts index 126da8bb0..b6dc72e36 100644 --- a/core/base/build.gradle.kts +++ b/core/base/build.gradle.kts @@ -1,9 +1,11 @@ +import com.thomaskioko.tvmaniac.plugins.addKspDependencyForAllTargets import com.thomaskioko.tvmaniac.plugins.addLanguageArgs plugins { alias(libs.plugins.tvmaniac.android.library) alias(libs.plugins.tvmaniac.multiplatform) alias(libs.plugins.serialization) + alias(libs.plugins.ksp) } kotlin { @@ -11,7 +13,7 @@ kotlin { commonMain.dependencies { implementation(libs.coroutines.core) implementation(libs.decompose.decompose) - implementation(libs.kotlinInject.runtime) + implementation(libs.bundles.kotlinInject) implementation(libs.ktor.serialization) } } @@ -22,3 +24,6 @@ android { namespace = "com.thomaskioko.tvmaniac.core.base" } addLanguageArgs( "kotlinx.coroutines.InternalCoroutinesApi", ) + +addKspDependencyForAllTargets(libs.kotlinInject.compiler) +addKspDependencyForAllTargets(libs.kotlinInject.anvil.compiler) diff --git a/core/base/src/androidMain/kotlin/com/thomaskioko/tvmaniac/core/base/di/BaseComponent.kt b/core/base/src/androidMain/kotlin/com/thomaskioko/tvmaniac/core/base/di/BaseAndroidComponent.kt similarity index 60% rename from core/base/src/androidMain/kotlin/com/thomaskioko/tvmaniac/core/base/di/BaseComponent.kt rename to core/base/src/androidMain/kotlin/com/thomaskioko/tvmaniac/core/base/di/BaseAndroidComponent.kt index 2f717235e..55bf62089 100644 --- a/core/base/src/androidMain/kotlin/com/thomaskioko/tvmaniac/core/base/di/BaseComponent.kt +++ b/core/base/src/androidMain/kotlin/com/thomaskioko/tvmaniac/core/base/di/BaseAndroidComponent.kt @@ -1,25 +1,16 @@ package com.thomaskioko.tvmaniac.core.base.di -import com.thomaskioko.tvmaniac.core.base.annotations.ApplicationScope import com.thomaskioko.tvmaniac.core.base.model.AppCoroutineDispatchers import com.thomaskioko.tvmaniac.core.base.model.AppCoroutineScope import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job import me.tatarka.inject.annotations.Provides +import software.amazon.lastmile.kotlin.inject.anvil.AppScope +import software.amazon.lastmile.kotlin.inject.anvil.ContributesTo -actual interface BaseComponent { +@ContributesTo(AppScope::class) +interface BaseAndroidComponent { - @ApplicationScope - @Provides - fun provideCoroutineDispatchers(): AppCoroutineDispatchers = - AppCoroutineDispatchers( - io = Dispatchers.IO, - computation = Dispatchers.Default, - main = Dispatchers.Main, - ) - - @ApplicationScope @Provides fun provideCoroutineScope(dispatchers: AppCoroutineDispatchers): AppCoroutineScope = AppCoroutineScope( diff --git a/core/base/src/commonMain/kotlin/com/thomaskioko/tvmaniac/core/base/annotations/Scopes.kt b/core/base/src/commonMain/kotlin/com/thomaskioko/tvmaniac/core/base/annotations/Scopes.kt index 39eb5c2ce..07aaf03b9 100644 --- a/core/base/src/commonMain/kotlin/com/thomaskioko/tvmaniac/core/base/annotations/Scopes.kt +++ b/core/base/src/commonMain/kotlin/com/thomaskioko/tvmaniac/core/base/annotations/Scopes.kt @@ -2,6 +2,4 @@ package com.thomaskioko.tvmaniac.core.base.annotations import me.tatarka.inject.annotations.Scope -@Scope annotation class ApplicationScope - @Scope annotation class ActivityScope diff --git a/core/base/src/commonMain/kotlin/com/thomaskioko/tvmaniac/core/base/di/BaseComponent.kt b/core/base/src/commonMain/kotlin/com/thomaskioko/tvmaniac/core/base/di/BaseComponent.kt index fdaa11765..c097490c2 100644 --- a/core/base/src/commonMain/kotlin/com/thomaskioko/tvmaniac/core/base/di/BaseComponent.kt +++ b/core/base/src/commonMain/kotlin/com/thomaskioko/tvmaniac/core/base/di/BaseComponent.kt @@ -1,3 +1,19 @@ package com.thomaskioko.tvmaniac.core.base.di -expect interface BaseComponent +import com.thomaskioko.tvmaniac.core.base.model.AppCoroutineDispatchers +import kotlinx.coroutines.Dispatchers +import me.tatarka.inject.annotations.Provides +import software.amazon.lastmile.kotlin.inject.anvil.AppScope +import software.amazon.lastmile.kotlin.inject.anvil.ContributesTo + +@ContributesTo(AppScope::class) +interface BaseComponent { + + @Provides + fun provideCoroutineDispatchers(): AppCoroutineDispatchers = + AppCoroutineDispatchers( + io = Dispatchers.Default, + computation = Dispatchers.Default, + main = Dispatchers.Main, + ) +} diff --git a/core/base/src/iosMain/kotlin/com/thomaskioko/tvmaniac/core/base/di/BaseComponent.kt b/core/base/src/iosMain/kotlin/com/thomaskioko/tvmaniac/core/base/di/BaseIosComponent.kt similarity index 62% rename from core/base/src/iosMain/kotlin/com/thomaskioko/tvmaniac/core/base/di/BaseComponent.kt rename to core/base/src/iosMain/kotlin/com/thomaskioko/tvmaniac/core/base/di/BaseIosComponent.kt index d8da01b82..88f7c3efe 100644 --- a/core/base/src/iosMain/kotlin/com/thomaskioko/tvmaniac/core/base/di/BaseComponent.kt +++ b/core/base/src/iosMain/kotlin/com/thomaskioko/tvmaniac/core/base/di/BaseIosComponent.kt @@ -1,26 +1,17 @@ package com.thomaskioko.tvmaniac.core.base.di -import com.thomaskioko.tvmaniac.core.base.annotations.ApplicationScope import com.thomaskioko.tvmaniac.core.base.model.AppCoroutineDispatchers import com.thomaskioko.tvmaniac.core.base.model.AppCoroutineScope import com.thomaskioko.tvmaniac.core.base.scope.NsQueueCoroutineScope import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job import me.tatarka.inject.annotations.Provides +import software.amazon.lastmile.kotlin.inject.anvil.AppScope +import software.amazon.lastmile.kotlin.inject.anvil.ContributesTo -actual interface BaseComponent { +@ContributesTo(AppScope::class) +interface BaseIosComponent { - @ApplicationScope - @Provides - fun provideCoroutineDispatchers(): AppCoroutineDispatchers = - AppCoroutineDispatchers( - io = Dispatchers.Default, - computation = Dispatchers.Default, - main = Dispatchers.Main, - ) - - @ApplicationScope @Provides fun provideAppCoroutineScope(dispatchers: AppCoroutineDispatchers): AppCoroutineScope = AppCoroutineScope( diff --git a/core/base/src/jvmMain/kotlin/com/thomaskioko/tvmaniac/core/base/di/BaseComponent.jvm.kt b/core/base/src/jvmMain/kotlin/com/thomaskioko/tvmaniac/core/base/di/BaseComponent.jvm.kt deleted file mode 100644 index d87805733..000000000 --- a/core/base/src/jvmMain/kotlin/com/thomaskioko/tvmaniac/core/base/di/BaseComponent.jvm.kt +++ /dev/null @@ -1,3 +0,0 @@ -package com.thomaskioko.tvmaniac.core.base.di - -actual interface BaseComponent diff --git a/core/logger/build.gradle.kts b/core/logger/build.gradle.kts index 130c9dd1f..77a419626 100644 --- a/core/logger/build.gradle.kts +++ b/core/logger/build.gradle.kts @@ -1,3 +1,5 @@ +import com.thomaskioko.tvmaniac.plugins.addKspDependencyForAllTargets + plugins { alias(libs.plugins.tvmaniac.multiplatform) alias(libs.plugins.ksp) @@ -9,7 +11,10 @@ kotlin { implementation(projects.core.base) implementation(libs.kermit) implementation(libs.napier) - implementation(libs.kotlinInject.runtime) + implementation(libs.bundles.kotlinInject) } } } + +addKspDependencyForAllTargets(libs.kotlinInject.compiler) +addKspDependencyForAllTargets(libs.kotlinInject.anvil.compiler) diff --git a/core/logger/src/commonMain/kotlin/com/thomaskioko/tvmaniac/core/logger/LoggingInitializer.kt b/core/logger/src/commonMain/kotlin/com/thomaskioko/tvmaniac/core/logger/LoggingInitializer.kt index 542568dc1..f51fa470c 100644 --- a/core/logger/src/commonMain/kotlin/com/thomaskioko/tvmaniac/core/logger/LoggingInitializer.kt +++ b/core/logger/src/commonMain/kotlin/com/thomaskioko/tvmaniac/core/logger/LoggingInitializer.kt @@ -4,8 +4,11 @@ import com.thomaskioko.tvmaniac.core.base.AppInitializer import io.github.aakira.napier.DebugAntilog import io.github.aakira.napier.Napier import me.tatarka.inject.annotations.Inject +import software.amazon.lastmile.kotlin.inject.anvil.AppScope +import software.amazon.lastmile.kotlin.inject.anvil.ContributesBinding @Inject +@ContributesBinding(AppScope::class, multibinding = true) class LoggingInitializer : AppInitializer { override fun init() { diff --git a/core/logger/src/commonMain/kotlin/com/thomaskioko/tvmaniac/core/logger/inject/LoggingComponent.kt b/core/logger/src/commonMain/kotlin/com/thomaskioko/tvmaniac/core/logger/inject/LoggingComponent.kt index bc0fe92cd..1264e78c2 100644 --- a/core/logger/src/commonMain/kotlin/com/thomaskioko/tvmaniac/core/logger/inject/LoggingComponent.kt +++ b/core/logger/src/commonMain/kotlin/com/thomaskioko/tvmaniac/core/logger/inject/LoggingComponent.kt @@ -1,21 +1,14 @@ package com.thomaskioko.tvmaniac.core.logger.inject -import com.thomaskioko.tvmaniac.core.base.AppInitializer -import com.thomaskioko.tvmaniac.core.base.annotations.ApplicationScope import com.thomaskioko.tvmaniac.core.base.model.Configs import com.thomaskioko.tvmaniac.core.logger.KermitLogger -import com.thomaskioko.tvmaniac.core.logger.LoggingInitializer -import me.tatarka.inject.annotations.IntoSet import me.tatarka.inject.annotations.Provides +import software.amazon.lastmile.kotlin.inject.anvil.AppScope +import software.amazon.lastmile.kotlin.inject.anvil.ContributesTo +@ContributesTo(AppScope::class) interface LoggingComponent { - @IntoSet - @Provides - @ApplicationScope - fun providesLoggingInitializer(bind: LoggingInitializer): AppInitializer = bind - - @ApplicationScope @Provides fun provideKermitLogger( configs: Configs, diff --git a/core/network-util/build.gradle.kts b/core/network-util/build.gradle.kts index d9c13c93b..39e90d5ef 100644 --- a/core/network-util/build.gradle.kts +++ b/core/network-util/build.gradle.kts @@ -1,7 +1,10 @@ +import com.thomaskioko.tvmaniac.plugins.addKspDependencyForAllTargets + plugins { alias(libs.plugins.tvmaniac.android.library) alias(libs.plugins.tvmaniac.multiplatform) alias(libs.plugins.serialization) + alias(libs.plugins.ksp) } kotlin { @@ -12,7 +15,7 @@ kotlin { implementation(projects.core.base) implementation(libs.androidx.paging.common) implementation(libs.coroutines.core) - implementation(libs.kotlinInject.runtime) + implementation(libs.bundles.kotlinInject) implementation(libs.ktor.core) implementation(libs.store5) } @@ -20,3 +23,6 @@ kotlin { } android { namespace = "com.thomaskioko.tvmaniac.core.networkutil" } + +addKspDependencyForAllTargets(libs.kotlinInject.compiler) +addKspDependencyForAllTargets(libs.kotlinInject.anvil.compiler) diff --git a/core/network-util/src/androidMain/kotlin/com/thomaskioko/tvmaniac/core/networkutil/AndroidNetworkExceptionHandlerUtil.kt b/core/network-util/src/androidMain/kotlin/com/thomaskioko/tvmaniac/core/networkutil/AndroidNetworkExceptionHandlerUtil.kt index ad4f787ed..ab8b83243 100644 --- a/core/network-util/src/androidMain/kotlin/com/thomaskioko/tvmaniac/core/networkutil/AndroidNetworkExceptionHandlerUtil.kt +++ b/core/network-util/src/androidMain/kotlin/com/thomaskioko/tvmaniac/core/networkutil/AndroidNetworkExceptionHandlerUtil.kt @@ -7,8 +7,13 @@ import io.ktor.serialization.JsonConvertException import java.net.UnknownHostException import kotlinx.serialization.SerializationException import me.tatarka.inject.annotations.Inject +import software.amazon.lastmile.kotlin.inject.anvil.AppScope +import software.amazon.lastmile.kotlin.inject.anvil.ContributesBinding +import software.amazon.lastmile.kotlin.inject.anvil.SingleIn @Inject +@SingleIn(AppScope::class) +@ContributesBinding(AppScope::class) class AndroidNetworkExceptionHandlerUtil( private val configs: Configs, ) : NetworkExceptionHandler { diff --git a/core/network-util/src/androidMain/kotlin/com/thomaskioko/tvmaniac/core/networkutil/di/NetworkUtilPlatformComponent.kt b/core/network-util/src/androidMain/kotlin/com/thomaskioko/tvmaniac/core/networkutil/di/NetworkUtilPlatformComponent.kt deleted file mode 100644 index 5ce33c356..000000000 --- a/core/network-util/src/androidMain/kotlin/com/thomaskioko/tvmaniac/core/networkutil/di/NetworkUtilPlatformComponent.kt +++ /dev/null @@ -1,15 +0,0 @@ -package com.thomaskioko.tvmaniac.core.networkutil.di - -import com.thomaskioko.tvmaniac.core.base.annotations.ApplicationScope -import com.thomaskioko.tvmaniac.core.networkutil.AndroidNetworkExceptionHandlerUtil -import com.thomaskioko.tvmaniac.core.networkutil.NetworkExceptionHandler -import me.tatarka.inject.annotations.Provides - -actual interface NetworkUtilPlatformComponent { - - @ApplicationScope - @Provides - fun provideNetworkExceptionHandler( - bind: AndroidNetworkExceptionHandlerUtil, - ): NetworkExceptionHandler = bind -} diff --git a/core/network-util/src/commonMain/kotlin/com/thomaskioko/tvmaniac/core/networkutil/di/NetworkUtilPlatformComponent.kt b/core/network-util/src/commonMain/kotlin/com/thomaskioko/tvmaniac/core/networkutil/di/NetworkUtilPlatformComponent.kt deleted file mode 100644 index 361499b04..000000000 --- a/core/network-util/src/commonMain/kotlin/com/thomaskioko/tvmaniac/core/networkutil/di/NetworkUtilPlatformComponent.kt +++ /dev/null @@ -1,3 +0,0 @@ -package com.thomaskioko.tvmaniac.core.networkutil.di - -expect interface NetworkUtilPlatformComponent diff --git a/core/network-util/src/iosMain/kotlin/com/thomaskioko/tvmaniac/core/networkutil/IosExceptionHandler.kt b/core/network-util/src/iosMain/kotlin/com/thomaskioko/tvmaniac/core/networkutil/IosExceptionHandler.kt index 23e81ac2f..28a569998 100644 --- a/core/network-util/src/iosMain/kotlin/com/thomaskioko/tvmaniac/core/networkutil/IosExceptionHandler.kt +++ b/core/network-util/src/iosMain/kotlin/com/thomaskioko/tvmaniac/core/networkutil/IosExceptionHandler.kt @@ -6,8 +6,13 @@ import io.ktor.client.plugins.ClientRequestException import io.ktor.serialization.JsonConvertException import kotlinx.serialization.SerializationException import me.tatarka.inject.annotations.Inject +import software.amazon.lastmile.kotlin.inject.anvil.AppScope +import software.amazon.lastmile.kotlin.inject.anvil.ContributesBinding +import software.amazon.lastmile.kotlin.inject.anvil.SingleIn @Inject +@SingleIn(AppScope::class) +@ContributesBinding(AppScope::class) class IosExceptionHandler( private val configs: Configs, ) : NetworkExceptionHandler { diff --git a/core/network-util/src/iosMain/kotlin/com/thomaskioko/tvmaniac/core/networkutil/di/NetworkUtilPlatformComponent.kt b/core/network-util/src/iosMain/kotlin/com/thomaskioko/tvmaniac/core/networkutil/di/NetworkUtilPlatformComponent.kt deleted file mode 100644 index 12471de0b..000000000 --- a/core/network-util/src/iosMain/kotlin/com/thomaskioko/tvmaniac/core/networkutil/di/NetworkUtilPlatformComponent.kt +++ /dev/null @@ -1,13 +0,0 @@ -package com.thomaskioko.tvmaniac.core.networkutil.di - -import com.thomaskioko.tvmaniac.core.base.annotations.ApplicationScope -import com.thomaskioko.tvmaniac.core.networkutil.IosExceptionHandler -import com.thomaskioko.tvmaniac.core.networkutil.NetworkExceptionHandler -import me.tatarka.inject.annotations.Provides - -actual interface NetworkUtilPlatformComponent { - - @ApplicationScope - @Provides - fun provideExceptionHandler(bind: IosExceptionHandler): NetworkExceptionHandler = bind -} diff --git a/core/network-util/src/jvmMain/kotlin/com/thomaskioko/tvmaniac/core/networkutil/di/NetworkUtilPlatformComponent.jvm.kt b/core/network-util/src/jvmMain/kotlin/com/thomaskioko/tvmaniac/core/networkutil/di/NetworkUtilPlatformComponent.jvm.kt deleted file mode 100644 index c13bbb7dc..000000000 --- a/core/network-util/src/jvmMain/kotlin/com/thomaskioko/tvmaniac/core/networkutil/di/NetworkUtilPlatformComponent.jvm.kt +++ /dev/null @@ -1,3 +0,0 @@ -package com.thomaskioko.tvmaniac.core.networkutil.di - -actual interface NetworkUtilPlatformComponent diff --git a/core/util/build.gradle.kts b/core/util/build.gradle.kts index 0015cd56e..4b0722d67 100644 --- a/core/util/build.gradle.kts +++ b/core/util/build.gradle.kts @@ -18,7 +18,7 @@ kotlin { implementation(libs.coroutines.core) implementation(libs.kermit) implementation(libs.kotlinx.datetime) - implementation(libs.kotlinInject.runtime) + implementation(libs.bundles.kotlinInject) implementation(libs.ktor.core) implementation(libs.yamlkt) } @@ -36,6 +36,7 @@ android { } addKspDependencyForAllTargets(libs.kotlinInject.compiler) +addKspDependencyForAllTargets(libs.kotlinInject.anvil.compiler) addLanguageArgs( "kotlinx.coroutines.ExperimentalCoroutinesApi", diff --git a/core/util/src/androidMain/kotlin/com/thomaskioko/tvmaniac/util/AndroidAppUtils.kt b/core/util/src/androidMain/kotlin/com/thomaskioko/tvmaniac/util/AndroidAppUtils.kt index a6180cf76..ad37c70c5 100644 --- a/core/util/src/androidMain/kotlin/com/thomaskioko/tvmaniac/util/AndroidAppUtils.kt +++ b/core/util/src/androidMain/kotlin/com/thomaskioko/tvmaniac/util/AndroidAppUtils.kt @@ -5,8 +5,13 @@ import android.content.pm.PackageManager import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.flow import me.tatarka.inject.annotations.Inject +import software.amazon.lastmile.kotlin.inject.anvil.AppScope +import software.amazon.lastmile.kotlin.inject.anvil.ContributesBinding +import software.amazon.lastmile.kotlin.inject.anvil.SingleIn @Inject +@SingleIn(AppScope::class) +@ContributesBinding(AppScope::class) class AndroidAppUtils( private val context: Application, ) : AppUtils { diff --git a/core/util/src/androidMain/kotlin/com/thomaskioko/tvmaniac/util/AndroidFormatterUtil.kt b/core/util/src/androidMain/kotlin/com/thomaskioko/tvmaniac/util/AndroidFormatterUtil.kt index ae6c3e8fd..eaff44890 100644 --- a/core/util/src/androidMain/kotlin/com/thomaskioko/tvmaniac/util/AndroidFormatterUtil.kt +++ b/core/util/src/androidMain/kotlin/com/thomaskioko/tvmaniac/util/AndroidFormatterUtil.kt @@ -6,10 +6,15 @@ import kotlin.math.floor import kotlin.math.log10 import kotlin.math.pow import me.tatarka.inject.annotations.Inject +import software.amazon.lastmile.kotlin.inject.anvil.AppScope +import software.amazon.lastmile.kotlin.inject.anvil.ContributesBinding +import software.amazon.lastmile.kotlin.inject.anvil.SingleIn const val POSTER_PATH = "https://image.tmdb.org/t/p/original%s" @Inject +@SingleIn(AppScope::class) +@ContributesBinding(AppScope::class) class AndroidFormatterUtil : FormatterUtil { override fun formatTmdbPosterPath(imageUrl: String): String = String.format(POSTER_PATH, imageUrl) diff --git a/core/util/src/androidMain/kotlin/com/thomaskioko/tvmaniac/util/ClasspathResourceReader.kt b/core/util/src/androidMain/kotlin/com/thomaskioko/tvmaniac/util/ClasspathResourceReader.kt index 8714d8e12..9cecbe88a 100644 --- a/core/util/src/androidMain/kotlin/com/thomaskioko/tvmaniac/util/ClasspathResourceReader.kt +++ b/core/util/src/androidMain/kotlin/com/thomaskioko/tvmaniac/util/ClasspathResourceReader.kt @@ -2,8 +2,13 @@ package com.thomaskioko.tvmaniac.util import java.io.InputStreamReader import me.tatarka.inject.annotations.Inject +import software.amazon.lastmile.kotlin.inject.anvil.AppScope +import software.amazon.lastmile.kotlin.inject.anvil.ContributesBinding +import software.amazon.lastmile.kotlin.inject.anvil.SingleIn @Inject +@SingleIn(AppScope::class) +@ContributesBinding(AppScope::class) class ClasspathResourceReader : ResourceReader { override fun readResource(name: String): String { return javaClass.classLoader?.getResourceAsStream(name).use { stream -> diff --git a/core/util/src/androidMain/kotlin/com/thomaskioko/tvmaniac/util/inject/UtilPlatformComponent.kt b/core/util/src/androidMain/kotlin/com/thomaskioko/tvmaniac/util/inject/UtilPlatformComponent.kt index 74fac1dc7..01c5f09f0 100644 --- a/core/util/src/androidMain/kotlin/com/thomaskioko/tvmaniac/util/inject/UtilPlatformComponent.kt +++ b/core/util/src/androidMain/kotlin/com/thomaskioko/tvmaniac/util/inject/UtilPlatformComponent.kt @@ -1,30 +1,15 @@ package com.thomaskioko.tvmaniac.util.inject -import com.thomaskioko.tvmaniac.core.base.annotations.ApplicationScope import com.thomaskioko.tvmaniac.core.base.model.Configs -import com.thomaskioko.tvmaniac.util.AndroidAppUtils -import com.thomaskioko.tvmaniac.util.AndroidFormatterUtil -import com.thomaskioko.tvmaniac.util.AppUtils -import com.thomaskioko.tvmaniac.util.ClasspathResourceReader -import com.thomaskioko.tvmaniac.util.FormatterUtil -import com.thomaskioko.tvmaniac.util.ResourceReader import com.thomaskioko.tvmaniac.util.YamlResourceReader import me.tatarka.inject.annotations.Provides +import software.amazon.lastmile.kotlin.inject.anvil.AppScope +import software.amazon.lastmile.kotlin.inject.anvil.ContributesTo -actual interface UtilPlatformComponent { +@ContributesTo(AppScope::class) +interface UtilPlatformComponent { - @ApplicationScope - @Provides - fun provideAndroidFormatterUtil(bind: AndroidFormatterUtil): FormatterUtil = bind - - @ApplicationScope @Provides fun provideAppUtils(bind: AndroidAppUtils): AppUtils = bind - - @ApplicationScope @Provides fun provideConfigs(resourceReader: YamlResourceReader): Configs = resourceReader.readAndDecodeResource("config.yaml", Configs.serializer()) - - @ApplicationScope - @Provides - fun provideResourceReader(bind: ClasspathResourceReader): ResourceReader = bind } diff --git a/core/util/src/commonMain/kotlin/com/thomaskioko/tvmaniac/util/ResourceReader.kt b/core/util/src/commonMain/kotlin/com/thomaskioko/tvmaniac/util/ResourceReader.kt index bef199e84..ca16e2364 100644 --- a/core/util/src/commonMain/kotlin/com/thomaskioko/tvmaniac/util/ResourceReader.kt +++ b/core/util/src/commonMain/kotlin/com/thomaskioko/tvmaniac/util/ResourceReader.kt @@ -3,12 +3,15 @@ package com.thomaskioko.tvmaniac.util import kotlinx.serialization.DeserializationStrategy import me.tatarka.inject.annotations.Inject import net.mamoe.yamlkt.Yaml +import software.amazon.lastmile.kotlin.inject.anvil.AppScope +import software.amazon.lastmile.kotlin.inject.anvil.SingleIn interface ResourceReader { fun readResource(name: String): String } @Inject +@SingleIn(AppScope::class) class YamlResourceReader( private val resourceReader: ResourceReader, ) { diff --git a/core/util/src/commonMain/kotlin/com/thomaskioko/tvmaniac/util/inject/UtilPlatformComponent.kt b/core/util/src/commonMain/kotlin/com/thomaskioko/tvmaniac/util/inject/UtilPlatformComponent.kt deleted file mode 100644 index 647e8b183..000000000 --- a/core/util/src/commonMain/kotlin/com/thomaskioko/tvmaniac/util/inject/UtilPlatformComponent.kt +++ /dev/null @@ -1,3 +0,0 @@ -package com.thomaskioko.tvmaniac.util.inject - -expect interface UtilPlatformComponent diff --git a/core/util/src/iosMain/kotlin/com/thomaskioko/tvmaniac/util/BundleResourceReader.kt b/core/util/src/iosMain/kotlin/com/thomaskioko/tvmaniac/util/BundleResourceReader.kt index 789eaf896..576b1c3c1 100644 --- a/core/util/src/iosMain/kotlin/com/thomaskioko/tvmaniac/util/BundleResourceReader.kt +++ b/core/util/src/iosMain/kotlin/com/thomaskioko/tvmaniac/util/BundleResourceReader.kt @@ -13,8 +13,13 @@ import platform.Foundation.NSUTF8StringEncoding import platform.Foundation.stringWithContentsOfFile import platform.darwin.NSObject import platform.darwin.NSObjectMeta +import software.amazon.lastmile.kotlin.inject.anvil.AppScope +import software.amazon.lastmile.kotlin.inject.anvil.ContributesBinding +import software.amazon.lastmile.kotlin.inject.anvil.SingleIn @Inject +@SingleIn(AppScope::class) +@ContributesBinding(AppScope::class) class BundleResourceReader( private val bundle: NSBundle = NSBundle.bundleForClass(BundleMarker), ) : ResourceReader { diff --git a/core/util/src/iosMain/kotlin/com/thomaskioko/tvmaniac/util/IosAppUtils.kt b/core/util/src/iosMain/kotlin/com/thomaskioko/tvmaniac/util/IosAppUtils.kt index d095b7a40..7312a8f05 100644 --- a/core/util/src/iosMain/kotlin/com/thomaskioko/tvmaniac/util/IosAppUtils.kt +++ b/core/util/src/iosMain/kotlin/com/thomaskioko/tvmaniac/util/IosAppUtils.kt @@ -3,8 +3,13 @@ package com.thomaskioko.tvmaniac.util import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.flowOf import me.tatarka.inject.annotations.Inject +import software.amazon.lastmile.kotlin.inject.anvil.AppScope +import software.amazon.lastmile.kotlin.inject.anvil.ContributesBinding +import software.amazon.lastmile.kotlin.inject.anvil.SingleIn @Inject +@SingleIn(AppScope::class) +@ContributesBinding(AppScope::class) class IosAppUtils : AppUtils { override fun isYoutubePlayerInstalled(): Flow = flowOf(false) diff --git a/core/util/src/iosMain/kotlin/com/thomaskioko/tvmaniac/util/IosFormatterUtil.kt b/core/util/src/iosMain/kotlin/com/thomaskioko/tvmaniac/util/IosFormatterUtil.kt index e64e4298e..65c44074d 100644 --- a/core/util/src/iosMain/kotlin/com/thomaskioko/tvmaniac/util/IosFormatterUtil.kt +++ b/core/util/src/iosMain/kotlin/com/thomaskioko/tvmaniac/util/IosFormatterUtil.kt @@ -5,10 +5,15 @@ import kotlin.math.sign import me.tatarka.inject.annotations.Inject import platform.Foundation.NSNumber import platform.Foundation.NSNumberFormatter +import software.amazon.lastmile.kotlin.inject.anvil.AppScope +import software.amazon.lastmile.kotlin.inject.anvil.ContributesBinding +import software.amazon.lastmile.kotlin.inject.anvil.SingleIn const val POSTER_PATH = "https://image.tmdb.org/t/p/original" @Inject +@SingleIn(AppScope::class) +@ContributesBinding(AppScope::class) class IosFormatterUtil : FormatterUtil { override fun formatTmdbPosterPath(imageUrl: String): String { diff --git a/core/util/src/iosMain/kotlin/com/thomaskioko/tvmaniac/util/inject/UtilPlatformComponent.kt b/core/util/src/iosMain/kotlin/com/thomaskioko/tvmaniac/util/inject/UtilPlatformComponent.kt index f1ec4febc..a87853e90 100644 --- a/core/util/src/iosMain/kotlin/com/thomaskioko/tvmaniac/util/inject/UtilPlatformComponent.kt +++ b/core/util/src/iosMain/kotlin/com/thomaskioko/tvmaniac/util/inject/UtilPlatformComponent.kt @@ -1,36 +1,16 @@ package com.thomaskioko.tvmaniac.util.inject -import com.thomaskioko.tvmaniac.core.base.annotations.ApplicationScope import com.thomaskioko.tvmaniac.core.base.model.Configs -import com.thomaskioko.tvmaniac.util.AppUtils -import com.thomaskioko.tvmaniac.util.BundleProvider -import com.thomaskioko.tvmaniac.util.BundleResourceReader -import com.thomaskioko.tvmaniac.util.FormatterUtil -import com.thomaskioko.tvmaniac.util.IosAppUtils -import com.thomaskioko.tvmaniac.util.IosFormatterUtil -import com.thomaskioko.tvmaniac.util.ResourceReader import com.thomaskioko.tvmaniac.util.YamlResourceReader import me.tatarka.inject.annotations.Provides -import platform.Foundation.NSBundle +import software.amazon.lastmile.kotlin.inject.anvil.AppScope +import software.amazon.lastmile.kotlin.inject.anvil.ContributesTo -actual interface UtilPlatformComponent { +@ContributesTo(AppScope::class) +interface UtilPlatformComponent { - @ApplicationScope - @Provides - fun provideIosFormatterUtil(bind: IosFormatterUtil): FormatterUtil = bind - - @ApplicationScope @Provides fun provideAppUtils(bind: IosAppUtils): AppUtils = bind - - @ApplicationScope - @Provides - fun provideBundleProvider(): BundleProvider = BundleProvider(NSBundle.mainBundle) - - @ApplicationScope @Provides fun provideConfigs(resourceReader: YamlResourceReader): Configs = resourceReader.readAndDecodeResource("config.yaml", Configs.serializer()) - @ApplicationScope - @Provides - fun provideResourceReader(bind: BundleResourceReader): ResourceReader = bind } diff --git a/core/util/src/jvmMain/kotlin/com/thomaskioko/tvmaniac/util/inject/UtilPlatformComponent.kt b/core/util/src/jvmMain/kotlin/com/thomaskioko/tvmaniac/util/inject/UtilPlatformComponent.kt deleted file mode 100644 index 7fa8c4749..000000000 --- a/core/util/src/jvmMain/kotlin/com/thomaskioko/tvmaniac/util/inject/UtilPlatformComponent.kt +++ /dev/null @@ -1,3 +0,0 @@ -package com.thomaskioko.tvmaniac.util.inject - -actual interface UtilPlatformComponent diff --git a/data/cast/implementation/build.gradle.kts b/data/cast/implementation/build.gradle.kts index 89e2609dc..436c0565f 100644 --- a/data/cast/implementation/build.gradle.kts +++ b/data/cast/implementation/build.gradle.kts @@ -13,7 +13,7 @@ kotlin { implementation(projects.database) implementation(projects.data.cast.api) - implementation(libs.kotlinInject.runtime) + implementation(libs.bundles.kotlinInject) implementation(libs.sqldelight.extensions) implementation(libs.kotlinx.atomicfu) implementation(libs.store5) @@ -23,3 +23,4 @@ kotlin { } addKspDependencyForAllTargets(libs.kotlinInject.compiler) +addKspDependencyForAllTargets(libs.kotlinInject.anvil.compiler) diff --git a/data/cast/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/data/cast/implementation/CastComponent.kt b/data/cast/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/data/cast/implementation/CastComponent.kt deleted file mode 100644 index c70c3cd7c..000000000 --- a/data/cast/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/data/cast/implementation/CastComponent.kt +++ /dev/null @@ -1,15 +0,0 @@ -package com.thomaskioko.tvmaniac.data.cast.implementation - -import com.thomaskioko.tvmaniac.core.base.annotations.ApplicationScope -import com.thomaskioko.tvmaniac.data.cast.api.CastDao -import com.thomaskioko.tvmaniac.data.cast.api.CastRepository -import me.tatarka.inject.annotations.Provides - -interface CastComponent { - - @ApplicationScope @Provides fun provideCastDao(bind: DefaultCastDao): CastDao = bind - - @ApplicationScope - @Provides - fun provideCastRepository(bind: DefaultCastRepository): CastRepository = bind -} diff --git a/data/cast/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/data/cast/implementation/DefaultCastDao.kt b/data/cast/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/data/cast/implementation/DefaultCastDao.kt index cb84d75b9..304363ec5 100644 --- a/data/cast/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/data/cast/implementation/DefaultCastDao.kt +++ b/data/cast/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/data/cast/implementation/DefaultCastDao.kt @@ -11,8 +11,13 @@ import com.thomaskioko.tvmaniac.data.cast.api.CastDao import com.thomaskioko.tvmaniac.db.Id import kotlinx.coroutines.flow.Flow import me.tatarka.inject.annotations.Inject +import software.amazon.lastmile.kotlin.inject.anvil.AppScope +import software.amazon.lastmile.kotlin.inject.anvil.ContributesBinding +import software.amazon.lastmile.kotlin.inject.anvil.SingleIn @Inject +@SingleIn(AppScope::class) +@ContributesBinding(AppScope::class) class DefaultCastDao( private val database: TvManiacDatabase, private val dispatcher: AppCoroutineDispatchers, diff --git a/data/cast/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/data/cast/implementation/DefaultCastRepository.kt b/data/cast/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/data/cast/implementation/DefaultCastRepository.kt index 7a4ee967b..c832247a8 100644 --- a/data/cast/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/data/cast/implementation/DefaultCastRepository.kt +++ b/data/cast/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/data/cast/implementation/DefaultCastRepository.kt @@ -6,8 +6,13 @@ import com.thomaskioko.tvmaniac.data.cast.api.CastDao import com.thomaskioko.tvmaniac.data.cast.api.CastRepository import kotlinx.coroutines.flow.Flow import me.tatarka.inject.annotations.Inject +import software.amazon.lastmile.kotlin.inject.anvil.AppScope +import software.amazon.lastmile.kotlin.inject.anvil.ContributesBinding +import software.amazon.lastmile.kotlin.inject.anvil.SingleIn @Inject +@SingleIn(AppScope::class) +@ContributesBinding(AppScope::class) class DefaultCastRepository( private val dao: CastDao, ) : CastRepository { diff --git a/data/episodes/implementation/build.gradle.kts b/data/episodes/implementation/build.gradle.kts index 1c869c443..25935da22 100644 --- a/data/episodes/implementation/build.gradle.kts +++ b/data/episodes/implementation/build.gradle.kts @@ -14,7 +14,7 @@ kotlin { implementation(projects.data.shows.api) implementation(projects.tmdbApi.api) - implementation(libs.kotlinInject.runtime) + implementation(libs.bundles.kotlinInject) implementation(libs.sqldelight.extensions) } } @@ -24,3 +24,4 @@ kotlin { } addKspDependencyForAllTargets(libs.kotlinInject.compiler) +addKspDependencyForAllTargets(libs.kotlinInject.anvil.compiler) diff --git a/data/episodes/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/episodes/implementation/DefaultEpisodeRepository.kt b/data/episodes/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/episodes/implementation/DefaultEpisodeRepository.kt new file mode 100644 index 000000000..12f5200bd --- /dev/null +++ b/data/episodes/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/episodes/implementation/DefaultEpisodeRepository.kt @@ -0,0 +1,12 @@ +package com.thomaskioko.tvmaniac.episodes.implementation + +import com.thomaskioko.tvmaniac.episodes.api.EpisodeRepository +import me.tatarka.inject.annotations.Inject +import software.amazon.lastmile.kotlin.inject.anvil.AppScope +import software.amazon.lastmile.kotlin.inject.anvil.ContributesBinding +import software.amazon.lastmile.kotlin.inject.anvil.SingleIn + +@Inject +@SingleIn(AppScope::class) +@ContributesBinding(AppScope::class) +class DefaultEpisodeRepository : EpisodeRepository diff --git a/data/episodes/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/episodes/implementation/EpisodesDaoImpl.kt b/data/episodes/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/episodes/implementation/DefaultEpisodesDao.kt similarity index 80% rename from data/episodes/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/episodes/implementation/EpisodesDaoImpl.kt rename to data/episodes/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/episodes/implementation/DefaultEpisodesDao.kt index 94c53f792..c0d5a79b6 100644 --- a/data/episodes/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/episodes/implementation/EpisodesDaoImpl.kt +++ b/data/episodes/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/episodes/implementation/DefaultEpisodesDao.kt @@ -5,9 +5,14 @@ import com.thomaskioko.tvmaniac.core.db.TvManiacDatabase import com.thomaskioko.tvmaniac.db.Id import com.thomaskioko.tvmaniac.episodes.api.EpisodesDao import me.tatarka.inject.annotations.Inject +import software.amazon.lastmile.kotlin.inject.anvil.AppScope +import software.amazon.lastmile.kotlin.inject.anvil.ContributesBinding +import software.amazon.lastmile.kotlin.inject.anvil.SingleIn @Inject -class EpisodesDaoImpl( +@SingleIn(AppScope::class) +@ContributesBinding(AppScope::class) +class DefaultEpisodesDao( private val database: TvManiacDatabase, ) : EpisodesDao { diff --git a/data/episodes/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/episodes/implementation/EpisodeComponent.kt b/data/episodes/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/episodes/implementation/EpisodeComponent.kt deleted file mode 100644 index eef5bf3c9..000000000 --- a/data/episodes/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/episodes/implementation/EpisodeComponent.kt +++ /dev/null @@ -1,15 +0,0 @@ -package com.thomaskioko.tvmaniac.episodes.implementation - -import com.thomaskioko.tvmaniac.core.base.annotations.ApplicationScope -import com.thomaskioko.tvmaniac.episodes.api.EpisodeRepository -import com.thomaskioko.tvmaniac.episodes.api.EpisodesDao -import me.tatarka.inject.annotations.Provides - -interface EpisodeComponent { - - @ApplicationScope @Provides fun provideEpisodesDao(bind: EpisodesDaoImpl): EpisodesDao = bind - - @ApplicationScope - @Provides - fun provideEpisodeRepository(bind: EpisodeRepositoryImpl): EpisodeRepository = bind -} diff --git a/data/episodes/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/episodes/implementation/EpisodeRepositoryImpl.kt b/data/episodes/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/episodes/implementation/EpisodeRepositoryImpl.kt deleted file mode 100644 index cf4ce9e49..000000000 --- a/data/episodes/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/episodes/implementation/EpisodeRepositoryImpl.kt +++ /dev/null @@ -1,6 +0,0 @@ -package com.thomaskioko.tvmaniac.episodes.implementation - -import com.thomaskioko.tvmaniac.episodes.api.EpisodeRepository -import me.tatarka.inject.annotations.Inject - -@Inject class EpisodeRepositoryImpl : EpisodeRepository diff --git a/data/featuredshows/implementation/build.gradle.kts b/data/featuredshows/implementation/build.gradle.kts index 9fa6201f5..8d7fb5e86 100644 --- a/data/featuredshows/implementation/build.gradle.kts +++ b/data/featuredshows/implementation/build.gradle.kts @@ -1,3 +1,5 @@ +import com.thomaskioko.tvmaniac.plugins.addKspDependencyForAllTargets + plugins { alias(libs.plugins.tvmaniac.multiplatform) alias(libs.plugins.ksp) @@ -18,7 +20,7 @@ kotlin { api(libs.coroutines.core) - implementation(libs.kotlinInject.runtime) + implementation(libs.bundles.kotlinInject) implementation(libs.kotlinx.atomicfu) implementation(libs.sqldelight.extensions) implementation(libs.store5) @@ -27,7 +29,5 @@ kotlin { } } -dependencies { - add("kspIosX64", libs.kotlinInject.compiler) - add("kspIosArm64", libs.kotlinInject.compiler) -} +addKspDependencyForAllTargets(libs.kotlinInject.compiler) +addKspDependencyForAllTargets(libs.kotlinInject.anvil.compiler) diff --git a/data/featuredshows/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/data/featuredshows/implementation/DefaultFeaturedShowsDao.kt b/data/featuredshows/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/data/featuredshows/implementation/DefaultFeaturedShowsDao.kt index 846f868fb..3823fdff8 100644 --- a/data/featuredshows/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/data/featuredshows/implementation/DefaultFeaturedShowsDao.kt +++ b/data/featuredshows/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/data/featuredshows/implementation/DefaultFeaturedShowsDao.kt @@ -10,8 +10,13 @@ import com.thomaskioko.tvmaniac.db.Id import com.thomaskioko.tvmaniac.shows.api.ShowEntity import kotlinx.coroutines.flow.Flow import me.tatarka.inject.annotations.Inject +import software.amazon.lastmile.kotlin.inject.anvil.AppScope +import software.amazon.lastmile.kotlin.inject.anvil.ContributesBinding +import software.amazon.lastmile.kotlin.inject.anvil.SingleIn @Inject +@SingleIn(AppScope::class) +@ContributesBinding(AppScope::class) class DefaultFeaturedShowsDao( database: TvManiacDatabase, private val dispatchers: AppCoroutineDispatchers, diff --git a/data/featuredshows/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/data/featuredshows/implementation/DefaultFeaturedShowsRepository.kt b/data/featuredshows/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/data/featuredshows/implementation/DefaultFeaturedShowsRepository.kt index f4e5c7c5b..5e4260d48 100644 --- a/data/featuredshows/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/data/featuredshows/implementation/DefaultFeaturedShowsRepository.kt +++ b/data/featuredshows/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/data/featuredshows/implementation/DefaultFeaturedShowsRepository.kt @@ -13,8 +13,13 @@ import kotlinx.coroutines.flow.flowOn import me.tatarka.inject.annotations.Inject import org.mobilenativefoundation.store.store5.StoreReadRequest import org.mobilenativefoundation.store.store5.impl.extensions.get +import software.amazon.lastmile.kotlin.inject.anvil.AppScope +import software.amazon.lastmile.kotlin.inject.anvil.ContributesBinding +import software.amazon.lastmile.kotlin.inject.anvil.SingleIn @Inject +@SingleIn(AppScope::class) +@ContributesBinding(AppScope::class) class DefaultFeaturedShowsRepository( private val store: FeaturedShowsStore, private val requestManagerRepository: RequestManagerRepository, diff --git a/data/featuredshows/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/data/featuredshows/implementation/FeaturedShowsComponent.kt b/data/featuredshows/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/data/featuredshows/implementation/FeaturedShowsComponent.kt deleted file mode 100644 index dac415b0f..000000000 --- a/data/featuredshows/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/data/featuredshows/implementation/FeaturedShowsComponent.kt +++ /dev/null @@ -1,19 +0,0 @@ -package com.thomaskioko.tvmaniac.data.featuredshows.implementation - -import com.thomaskioko.tvmaniac.core.base.annotations.ApplicationScope -import com.thomaskioko.tvmaniac.data.featuredshows.api.FeaturedShowsDao -import com.thomaskioko.tvmaniac.data.featuredshows.api.FeaturedShowsRepository -import me.tatarka.inject.annotations.Provides - -interface FeaturedShowsComponent { - - @ApplicationScope - @Provides - fun provideFeaturedShowsDao(bind: DefaultFeaturedShowsDao): FeaturedShowsDao = bind - - @ApplicationScope - @Provides - fun provideFeaturedShowsRepository( - bind: DefaultFeaturedShowsRepository, - ): FeaturedShowsRepository = bind -} diff --git a/data/library/implementation/build.gradle.kts b/data/library/implementation/build.gradle.kts index 65a04b159..3a694d93a 100644 --- a/data/library/implementation/build.gradle.kts +++ b/data/library/implementation/build.gradle.kts @@ -18,7 +18,7 @@ kotlin { implementation(projects.core.util) implementation(projects.data.library.api) - implementation(libs.kotlinInject.runtime) + implementation(libs.bundles.kotlinInject) implementation(libs.sqldelight.extensions) } } @@ -26,3 +26,4 @@ kotlin { } addKspDependencyForAllTargets(libs.kotlinInject.compiler) +addKspDependencyForAllTargets(libs.kotlinInject.anvil.compiler) diff --git a/data/library/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/watchlist/implementation/LibraryDaoImpl.kt b/data/library/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/watchlist/implementation/DefaultLibraryDao.kt similarity index 82% rename from data/library/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/watchlist/implementation/LibraryDaoImpl.kt rename to data/library/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/watchlist/implementation/DefaultLibraryDao.kt index 05f7a459c..a6c9c63d3 100644 --- a/data/library/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/watchlist/implementation/LibraryDaoImpl.kt +++ b/data/library/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/watchlist/implementation/DefaultLibraryDao.kt @@ -10,9 +10,14 @@ import com.thomaskioko.tvmaniac.db.Id import com.thomaskioko.tvmaniac.shows.api.LibraryDao import kotlinx.coroutines.flow.Flow import me.tatarka.inject.annotations.Inject +import software.amazon.lastmile.kotlin.inject.anvil.AppScope +import software.amazon.lastmile.kotlin.inject.anvil.ContributesBinding +import software.amazon.lastmile.kotlin.inject.anvil.SingleIn @Inject -class LibraryDaoImpl( +@SingleIn(AppScope::class) +@ContributesBinding(AppScope::class) +class DefaultLibraryDao( private val database: TvManiacDatabase, private val dispatchers: AppCoroutineDispatchers, ) : LibraryDao { diff --git a/data/library/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/watchlist/implementation/DefaultLibraryRepository.kt b/data/library/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/watchlist/implementation/DefaultLibraryRepository.kt index ed247bc32..0a8724260 100644 --- a/data/library/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/watchlist/implementation/DefaultLibraryRepository.kt +++ b/data/library/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/watchlist/implementation/DefaultLibraryRepository.kt @@ -15,8 +15,13 @@ import kotlinx.coroutines.flow.catch import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.map import me.tatarka.inject.annotations.Inject +import software.amazon.lastmile.kotlin.inject.anvil.AppScope +import software.amazon.lastmile.kotlin.inject.anvil.ContributesBinding +import software.amazon.lastmile.kotlin.inject.anvil.SingleIn @Inject +@SingleIn(AppScope::class) +@ContributesBinding(AppScope::class) class DefaultLibraryRepository( private val libraryDao: LibraryDao, private val dateFormatter: PlatformDateFormatter, diff --git a/data/library/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/watchlist/implementation/LibraryComponent.kt b/data/library/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/watchlist/implementation/LibraryComponent.kt deleted file mode 100644 index d6b041a9e..000000000 --- a/data/library/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/watchlist/implementation/LibraryComponent.kt +++ /dev/null @@ -1,15 +0,0 @@ -package com.thomaskioko.tvmaniac.watchlist.implementation - -import com.thomaskioko.tvmaniac.core.base.annotations.ApplicationScope -import com.thomaskioko.tvmaniac.shows.api.LibraryDao -import com.thomaskioko.tvmaniac.shows.api.LibraryRepository -import me.tatarka.inject.annotations.Provides - -interface LibraryComponent { - - @ApplicationScope @Provides fun provideWatchlistDao(bind: LibraryDaoImpl): LibraryDao = bind - - @ApplicationScope - @Provides - fun provideWatchlist(bind: DefaultLibraryRepository): LibraryRepository = bind -} diff --git a/data/popularshows/implementation/build.gradle.kts b/data/popularshows/implementation/build.gradle.kts index 7bba0021b..4cb8f7a32 100644 --- a/data/popularshows/implementation/build.gradle.kts +++ b/data/popularshows/implementation/build.gradle.kts @@ -1,3 +1,4 @@ +import com.thomaskioko.tvmaniac.plugins.addKspDependencyForAllTargets import com.thomaskioko.tvmaniac.plugins.addLanguageArgs plugins { @@ -21,7 +22,7 @@ kotlin { api(libs.coroutines.core) - implementation(libs.kotlinInject.runtime) + implementation(libs.bundles.kotlinInject) implementation(libs.sqldelight.extensions) implementation(libs.kotlinx.atomicfu) implementation(libs.store5) @@ -35,3 +36,6 @@ kotlin { addLanguageArgs( "androidx.paging.ExperimentalPagingApi", ) + +addKspDependencyForAllTargets(libs.kotlinInject.compiler) +addKspDependencyForAllTargets(libs.kotlinInject.anvil.compiler) diff --git a/data/popularshows/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/data/popularshows/implementation/DefaultPopularShowsDao.kt b/data/popularshows/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/data/popularshows/implementation/DefaultPopularShowsDao.kt index 87e886881..2a6c24caa 100644 --- a/data/popularshows/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/data/popularshows/implementation/DefaultPopularShowsDao.kt +++ b/data/popularshows/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/data/popularshows/implementation/DefaultPopularShowsDao.kt @@ -12,8 +12,13 @@ import com.thomaskioko.tvmaniac.db.Id import com.thomaskioko.tvmaniac.shows.api.ShowEntity import kotlinx.coroutines.flow.Flow import me.tatarka.inject.annotations.Inject +import software.amazon.lastmile.kotlin.inject.anvil.AppScope +import software.amazon.lastmile.kotlin.inject.anvil.ContributesBinding +import software.amazon.lastmile.kotlin.inject.anvil.SingleIn @Inject +@SingleIn(AppScope::class) +@ContributesBinding(AppScope::class) class DefaultPopularShowsDao( database: TvManiacDatabase, private val dispatchers: AppCoroutineDispatchers, diff --git a/data/popularshows/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/data/popularshows/implementation/DefaultPopularShowsRepository.kt b/data/popularshows/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/data/popularshows/implementation/DefaultPopularShowsRepository.kt index e7ffd3109..3fed2c40f 100644 --- a/data/popularshows/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/data/popularshows/implementation/DefaultPopularShowsRepository.kt +++ b/data/popularshows/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/data/popularshows/implementation/DefaultPopularShowsRepository.kt @@ -23,8 +23,13 @@ import me.tatarka.inject.annotations.Inject import org.mobilenativefoundation.store.store5.StoreReadRequest import org.mobilenativefoundation.store.store5.impl.extensions.fresh import org.mobilenativefoundation.store.store5.impl.extensions.get +import software.amazon.lastmile.kotlin.inject.anvil.AppScope +import software.amazon.lastmile.kotlin.inject.anvil.ContributesBinding +import software.amazon.lastmile.kotlin.inject.anvil.SingleIn @Inject +@SingleIn(AppScope::class) +@ContributesBinding(AppScope::class) class DefaultPopularShowsRepository( private val store: PopularShowsStore, private val popularShowsDao: PopularShowsDao, diff --git a/data/popularshows/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/data/popularshows/implementation/PopularShowsComponent.kt b/data/popularshows/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/data/popularshows/implementation/PopularShowsComponent.kt deleted file mode 100644 index 1bc2037f6..000000000 --- a/data/popularshows/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/data/popularshows/implementation/PopularShowsComponent.kt +++ /dev/null @@ -1,18 +0,0 @@ -package com.thomaskioko.tvmaniac.data.popularshows.implementation - -import com.thomaskioko.tvmaniac.core.base.annotations.ApplicationScope -import com.thomaskioko.tvmaniac.data.popularshows.api.PopularShowsDao -import com.thomaskioko.tvmaniac.data.popularshows.api.PopularShowsRepository -import me.tatarka.inject.annotations.Provides - -interface PopularShowsComponent { - - @ApplicationScope - @Provides - fun provideTopRatedShowsDao(bind: DefaultPopularShowsDao): PopularShowsDao = bind - - @ApplicationScope - @Provides - fun provideTopRatedShowsRepository(bind: DefaultPopularShowsRepository): PopularShowsRepository = - bind -} diff --git a/data/recommendedshows/implementation/build.gradle.kts b/data/recommendedshows/implementation/build.gradle.kts index 5859a8188..23b80300b 100644 --- a/data/recommendedshows/implementation/build.gradle.kts +++ b/data/recommendedshows/implementation/build.gradle.kts @@ -1,3 +1,5 @@ +import com.thomaskioko.tvmaniac.plugins.addKspDependencyForAllTargets + plugins { alias(libs.plugins.tvmaniac.multiplatform) alias(libs.plugins.ksp) @@ -16,7 +18,7 @@ kotlin { implementation(projects.data.shows.api) implementation(projects.tmdbApi.api) - implementation(libs.kotlinInject.runtime) + implementation(libs.bundles.kotlinInject) implementation(libs.sqldelight.extensions) implementation(libs.kotlinx.atomicfu) implementation(libs.store5) @@ -26,3 +28,6 @@ kotlin { commonTest { dependencies { implementation(libs.bundles.unittest) } } } } + +addKspDependencyForAllTargets(libs.kotlinInject.compiler) +addKspDependencyForAllTargets(libs.kotlinInject.anvil.compiler) diff --git a/data/recommendedshows/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/data/recommendedshows/implementation/DefaultRecommendedShowsDao.kt b/data/recommendedshows/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/data/recommendedshows/implementation/DefaultRecommendedShowsDao.kt index 0cc438833..a5c345970 100644 --- a/data/recommendedshows/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/data/recommendedshows/implementation/DefaultRecommendedShowsDao.kt +++ b/data/recommendedshows/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/data/recommendedshows/implementation/DefaultRecommendedShowsDao.kt @@ -9,8 +9,13 @@ import com.thomaskioko.tvmaniac.data.recommendedshows.api.RecommendedShowsDao import com.thomaskioko.tvmaniac.db.Id import kotlinx.coroutines.flow.Flow import me.tatarka.inject.annotations.Inject +import software.amazon.lastmile.kotlin.inject.anvil.AppScope +import software.amazon.lastmile.kotlin.inject.anvil.ContributesBinding +import software.amazon.lastmile.kotlin.inject.anvil.SingleIn @Inject +@SingleIn(AppScope::class) +@ContributesBinding(AppScope::class) class DefaultRecommendedShowsDao( private val database: TvManiacDatabase, private val dispatchers: AppCoroutineDispatchers, diff --git a/data/recommendedshows/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/data/recommendedshows/implementation/DefaultRecommendedShowsRepository.kt b/data/recommendedshows/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/data/recommendedshows/implementation/DefaultRecommendedShowsRepository.kt index fc48c70e0..4c2064551 100644 --- a/data/recommendedshows/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/data/recommendedshows/implementation/DefaultRecommendedShowsRepository.kt +++ b/data/recommendedshows/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/data/recommendedshows/implementation/DefaultRecommendedShowsRepository.kt @@ -14,9 +14,13 @@ import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.flowOn import me.tatarka.inject.annotations.Inject import org.mobilenativefoundation.store.store5.StoreReadRequest -import org.mobilenativefoundation.store.store5.impl.extensions.get +import software.amazon.lastmile.kotlin.inject.anvil.AppScope +import software.amazon.lastmile.kotlin.inject.anvil.ContributesBinding +import software.amazon.lastmile.kotlin.inject.anvil.SingleIn @Inject +@SingleIn(AppScope::class) +@ContributesBinding(AppScope::class) class DefaultRecommendedShowsRepository( private val store: RecommendedShowStore, private val requestManagerRepository: RequestManagerRepository, diff --git a/data/recommendedshows/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/data/recommendedshows/implementation/RecommendedShowStore.kt b/data/recommendedshows/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/data/recommendedshows/implementation/RecommendedShowStore.kt index af56884dc..baebada1f 100644 --- a/data/recommendedshows/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/data/recommendedshows/implementation/RecommendedShowStore.kt +++ b/data/recommendedshows/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/data/recommendedshows/implementation/RecommendedShowStore.kt @@ -17,8 +17,11 @@ import org.mobilenativefoundation.store.store5.Fetcher import org.mobilenativefoundation.store.store5.SourceOfTruth import org.mobilenativefoundation.store.store5.Store import org.mobilenativefoundation.store.store5.StoreBuilder +import software.amazon.lastmile.kotlin.inject.anvil.AppScope +import software.amazon.lastmile.kotlin.inject.anvil.SingleIn @Inject +@SingleIn(AppScope::class) class RecommendedShowStore( private val networkDataSource: TmdbShowDetailsNetworkDataSource, private val tvShowsDao: TvShowsDao, diff --git a/data/recommendedshows/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/data/recommendedshows/implementation/RecommendedShowsComponent.kt b/data/recommendedshows/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/data/recommendedshows/implementation/RecommendedShowsComponent.kt deleted file mode 100644 index 9622a5f65..000000000 --- a/data/recommendedshows/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/data/recommendedshows/implementation/RecommendedShowsComponent.kt +++ /dev/null @@ -1,19 +0,0 @@ -package com.thomaskioko.tvmaniac.data.recommendedshows.implementation - -import com.thomaskioko.tvmaniac.core.base.annotations.ApplicationScope -import com.thomaskioko.tvmaniac.data.recommendedshows.api.RecommendedShowsDao -import com.thomaskioko.tvmaniac.data.recommendedshows.api.RecommendedShowsRepository -import me.tatarka.inject.annotations.Provides - -interface RecommendedShowsComponent { - - @ApplicationScope - @Provides - fun provideRecommendedShowsDao(bind: DefaultRecommendedShowsDao): RecommendedShowsDao = bind - - @ApplicationScope - @Provides - fun provideRecommendedShowsRepository( - bind: DefaultRecommendedShowsRepository, - ): RecommendedShowsRepository = bind -} diff --git a/data/request-manager/implementation/build.gradle.kts b/data/request-manager/implementation/build.gradle.kts index 9f8dde5fd..b18a81ca8 100644 --- a/data/request-manager/implementation/build.gradle.kts +++ b/data/request-manager/implementation/build.gradle.kts @@ -13,7 +13,7 @@ kotlin { implementation(projects.data.requestManager.api) implementation(libs.kotlinx.datetime) - implementation(libs.kotlinInject.runtime) + implementation(libs.bundles.kotlinInject) implementation(libs.sqldelight.extensions) } } @@ -30,3 +30,4 @@ kotlin { } addKspDependencyForAllTargets(libs.kotlinInject.compiler) +addKspDependencyForAllTargets(libs.kotlinInject.anvil.compiler) diff --git a/data/request-manager/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/resourcemanager/implementation/DefaultRequestManagerRepository.kt b/data/request-manager/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/resourcemanager/implementation/DefaultRequestManagerRepository.kt index 5579059d0..7f1cccd14 100644 --- a/data/request-manager/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/resourcemanager/implementation/DefaultRequestManagerRepository.kt +++ b/data/request-manager/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/resourcemanager/implementation/DefaultRequestManagerRepository.kt @@ -7,8 +7,13 @@ import kotlin.time.Duration import kotlinx.datetime.Clock import kotlinx.datetime.Instant import me.tatarka.inject.annotations.Inject +import software.amazon.lastmile.kotlin.inject.anvil.AppScope +import software.amazon.lastmile.kotlin.inject.anvil.ContributesBinding +import software.amazon.lastmile.kotlin.inject.anvil.SingleIn @Inject +@SingleIn(AppScope::class) +@ContributesBinding(AppScope::class) class DefaultRequestManagerRepository( private val database: TvManiacDatabase, ) : RequestManagerRepository { diff --git a/data/request-manager/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/resourcemanager/implementation/RequestManagerComponent.kt b/data/request-manager/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/resourcemanager/implementation/RequestManagerComponent.kt deleted file mode 100644 index 7f8c6ec1e..000000000 --- a/data/request-manager/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/resourcemanager/implementation/RequestManagerComponent.kt +++ /dev/null @@ -1,14 +0,0 @@ -package com.thomaskioko.tvmaniac.resourcemanager.implementation - -import com.thomaskioko.tvmaniac.core.base.annotations.ApplicationScope -import com.thomaskioko.tvmaniac.resourcemanager.api.RequestManagerRepository -import me.tatarka.inject.annotations.Provides - -interface RequestManagerComponent { - - @ApplicationScope - @Provides - fun provideRequestManagerRepository( - bind: DefaultRequestManagerRepository, - ): RequestManagerRepository = bind -} diff --git a/data/search/implementation/build.gradle.kts b/data/search/implementation/build.gradle.kts index 556fd417a..1eba67959 100644 --- a/data/search/implementation/build.gradle.kts +++ b/data/search/implementation/build.gradle.kts @@ -18,7 +18,7 @@ kotlin { implementation(projects.data.search.api) implementation(projects.tmdbApi.api) - implementation(libs.kotlinInject.runtime) + implementation(libs.bundles.kotlinInject) implementation(libs.sqldelight.extensions) implementation(libs.store5) } @@ -27,3 +27,4 @@ kotlin { } addKspDependencyForAllTargets(libs.kotlinInject.compiler) +addKspDependencyForAllTargets(libs.kotlinInject.anvil.compiler) diff --git a/data/search/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/search/implementation/DefaultSearchRepository.kt b/data/search/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/search/implementation/DefaultSearchRepository.kt index 54b7e8748..c3751dc94 100644 --- a/data/search/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/search/implementation/DefaultSearchRepository.kt +++ b/data/search/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/search/implementation/DefaultSearchRepository.kt @@ -13,10 +13,15 @@ import kotlinx.coroutines.flow.flowOn import me.tatarka.inject.annotations.Inject import org.mobilenativefoundation.store.store5.StoreReadRequest import org.mobilenativefoundation.store.store5.impl.extensions.get +import software.amazon.lastmile.kotlin.inject.anvil.AppScope +import software.amazon.lastmile.kotlin.inject.anvil.ContributesBinding +import software.amazon.lastmile.kotlin.inject.anvil.SingleIn private const val MIN_SHOW_COUNT = 10 @Inject +@SingleIn(AppScope::class) +@ContributesBinding(AppScope::class) class DefaultSearchRepository( private val tvShowsDao: TvShowsDao, private val store: SearchShowStore, diff --git a/data/search/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/search/implementation/SearchComponent.kt b/data/search/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/search/implementation/SearchComponent.kt deleted file mode 100644 index 3a7d8c656..000000000 --- a/data/search/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/search/implementation/SearchComponent.kt +++ /dev/null @@ -1,13 +0,0 @@ -package com.thomaskioko.tvmaniac.search.implementation - -import com.thomaskioko.tvmaniac.core.base.annotations.ApplicationScope -import com.thomaskioko.tvmaniac.search.api.SearchRepository -import me.tatarka.inject.annotations.Provides - -interface SearchComponent { - @ApplicationScope - @Provides - fun provideTopRatedShowsRepository( - bind: DefaultSearchRepository, - ): SearchRepository = bind -} diff --git a/data/seasondetails/implementation/build.gradle.kts b/data/seasondetails/implementation/build.gradle.kts index a2dc095de..2f86838cd 100644 --- a/data/seasondetails/implementation/build.gradle.kts +++ b/data/seasondetails/implementation/build.gradle.kts @@ -20,7 +20,7 @@ kotlin { implementation(projects.data.seasondetails.api) implementation(projects.data.seasons.api) - implementation(libs.kotlinInject.runtime) + implementation(libs.bundles.kotlinInject) implementation(libs.kotlinx.atomicfu) implementation(libs.sqldelight.extensions) implementation(libs.store5) @@ -30,3 +30,4 @@ kotlin { } addKspDependencyForAllTargets(libs.kotlinInject.compiler) +addKspDependencyForAllTargets(libs.kotlinInject.anvil.compiler) diff --git a/data/seasondetails/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/seasondetails/implementation/DefaultSeasonDetailsDao.kt b/data/seasondetails/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/seasondetails/implementation/DefaultSeasonDetailsDao.kt index 4c97ba37e..ef702afe7 100644 --- a/data/seasondetails/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/seasondetails/implementation/DefaultSeasonDetailsDao.kt +++ b/data/seasondetails/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/seasondetails/implementation/DefaultSeasonDetailsDao.kt @@ -13,8 +13,13 @@ import com.thomaskioko.tvmaniac.seasondetails.api.model.SeasonDetailsWithEpisode import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.map import me.tatarka.inject.annotations.Inject +import software.amazon.lastmile.kotlin.inject.anvil.AppScope +import software.amazon.lastmile.kotlin.inject.anvil.ContributesBinding +import software.amazon.lastmile.kotlin.inject.anvil.SingleIn @Inject +@SingleIn(AppScope::class) +@ContributesBinding(AppScope::class) class DefaultSeasonDetailsDao( private val database: TvManiacDatabase, private val dispatcher: AppCoroutineDispatchers, diff --git a/data/seasondetails/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/seasondetails/implementation/DefaultSeasonDetailsRepository.kt b/data/seasondetails/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/seasondetails/implementation/DefaultSeasonDetailsRepository.kt index 9404f083f..bbc94822f 100644 --- a/data/seasondetails/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/seasondetails/implementation/DefaultSeasonDetailsRepository.kt +++ b/data/seasondetails/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/seasondetails/implementation/DefaultSeasonDetailsRepository.kt @@ -13,9 +13,13 @@ import com.thomaskioko.tvmaniac.seasondetails.api.model.SeasonDetailsWithEpisode import kotlinx.coroutines.flow.Flow import me.tatarka.inject.annotations.Inject import org.mobilenativefoundation.store.store5.StoreReadRequest -import org.mobilenativefoundation.store.store5.impl.extensions.get +import software.amazon.lastmile.kotlin.inject.anvil.AppScope +import software.amazon.lastmile.kotlin.inject.anvil.ContributesBinding +import software.amazon.lastmile.kotlin.inject.anvil.SingleIn @Inject +@SingleIn(AppScope::class) +@ContributesBinding(AppScope::class) class DefaultSeasonDetailsRepository( private val seasonDetailsStore: SeasonDetailsStore, private val seasonDetailsDao: SeasonDetailsDao, diff --git a/data/seasondetails/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/seasondetails/implementation/SeasonDetailsComponent.kt b/data/seasondetails/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/seasondetails/implementation/SeasonDetailsComponent.kt deleted file mode 100644 index 73f5c325e..000000000 --- a/data/seasondetails/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/seasondetails/implementation/SeasonDetailsComponent.kt +++ /dev/null @@ -1,19 +0,0 @@ -package com.thomaskioko.tvmaniac.seasondetails.implementation - -import com.thomaskioko.tvmaniac.core.base.annotations.ApplicationScope -import com.thomaskioko.tvmaniac.seasondetails.api.SeasonDetailsDao -import com.thomaskioko.tvmaniac.seasondetails.api.SeasonDetailsRepository -import me.tatarka.inject.annotations.Provides - -interface SeasonDetailsComponent { - - @ApplicationScope - @Provides - fun provideSeasonDetailsRepository( - bind: DefaultSeasonDetailsRepository, - ): SeasonDetailsRepository = bind - - @ApplicationScope - @Provides - fun provideSeasonDetailsDa(bind: DefaultSeasonDetailsDao): SeasonDetailsDao = bind -} diff --git a/data/seasons/implementation/build.gradle.kts b/data/seasons/implementation/build.gradle.kts index ecb35ad98..8e163e5df 100644 --- a/data/seasons/implementation/build.gradle.kts +++ b/data/seasons/implementation/build.gradle.kts @@ -16,7 +16,7 @@ kotlin { implementation(projects.data.requestManager.api) implementation(projects.data.seasons.api) - implementation(libs.kotlinInject.runtime) + implementation(libs.bundles.kotlinInject) implementation(libs.sqldelight.extensions) implementation(libs.kotlinx.atomicfu) implementation(libs.store5) @@ -26,3 +26,4 @@ kotlin { } addKspDependencyForAllTargets(libs.kotlinInject.compiler) +addKspDependencyForAllTargets(libs.kotlinInject.anvil.compiler) diff --git a/data/seasons/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/seasons/implementation/SeasonsDaoImpl.kt b/data/seasons/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/seasons/implementation/DefaultSeasonsDao.kt similarity index 85% rename from data/seasons/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/seasons/implementation/SeasonsDaoImpl.kt rename to data/seasons/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/seasons/implementation/DefaultSeasonsDao.kt index eb75eea67..30125c900 100644 --- a/data/seasons/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/seasons/implementation/SeasonsDaoImpl.kt +++ b/data/seasons/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/seasons/implementation/DefaultSeasonsDao.kt @@ -10,9 +10,14 @@ import com.thomaskioko.tvmaniac.db.Id import com.thomaskioko.tvmaniac.seasons.api.SeasonsDao import kotlinx.coroutines.flow.Flow import me.tatarka.inject.annotations.Inject +import software.amazon.lastmile.kotlin.inject.anvil.AppScope +import software.amazon.lastmile.kotlin.inject.anvil.ContributesBinding +import software.amazon.lastmile.kotlin.inject.anvil.SingleIn @Inject -class SeasonsDaoImpl( +@SingleIn(AppScope::class) +@ContributesBinding(AppScope::class) +class DefaultSeasonsDao( private val database: TvManiacDatabase, private val dispatcher: AppCoroutineDispatchers, ) : SeasonsDao { diff --git a/data/seasons/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/seasons/implementation/DefaultSeasonsRepository.kt b/data/seasons/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/seasons/implementation/DefaultSeasonsRepository.kt index 9a200dcf1..1de614642 100644 --- a/data/seasons/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/seasons/implementation/DefaultSeasonsRepository.kt +++ b/data/seasons/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/seasons/implementation/DefaultSeasonsRepository.kt @@ -11,8 +11,13 @@ import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.flow.map import me.tatarka.inject.annotations.Inject +import software.amazon.lastmile.kotlin.inject.anvil.AppScope +import software.amazon.lastmile.kotlin.inject.anvil.ContributesBinding +import software.amazon.lastmile.kotlin.inject.anvil.SingleIn @Inject +@SingleIn(AppScope::class) +@ContributesBinding(AppScope::class) class DefaultSeasonsRepository( private val seasonsDao: SeasonsDao, private val dispatcher: AppCoroutineDispatchers, diff --git a/data/seasons/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/seasons/implementation/SeasonsComponent.kt b/data/seasons/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/seasons/implementation/SeasonsComponent.kt deleted file mode 100644 index 28f587f0e..000000000 --- a/data/seasons/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/seasons/implementation/SeasonsComponent.kt +++ /dev/null @@ -1,15 +0,0 @@ -package com.thomaskioko.tvmaniac.seasons.implementation - -import com.thomaskioko.tvmaniac.core.base.annotations.ApplicationScope -import com.thomaskioko.tvmaniac.seasons.api.SeasonsDao -import com.thomaskioko.tvmaniac.seasons.api.SeasonsRepository -import me.tatarka.inject.annotations.Provides - -interface SeasonsComponent { - - @ApplicationScope - @Provides - fun provideSeasonsRepository(bind: DefaultSeasonsRepository): SeasonsRepository = bind - - @ApplicationScope @Provides fun provideSeasonsDao(bind: SeasonsDaoImpl): SeasonsDao = bind -} diff --git a/data/showdetails/implementation/build.gradle.kts b/data/showdetails/implementation/build.gradle.kts index 8d2b80aba..6ac29af0a 100644 --- a/data/showdetails/implementation/build.gradle.kts +++ b/data/showdetails/implementation/build.gradle.kts @@ -21,7 +21,7 @@ kotlin { api(libs.coroutines.core) - implementation(libs.kotlinInject.runtime) + implementation(libs.bundles.kotlinInject) implementation(libs.sqldelight.extensions) implementation(libs.kotlinx.atomicfu) implementation(libs.store5) @@ -31,3 +31,4 @@ kotlin { } addKspDependencyForAllTargets(libs.kotlinInject.compiler) +addKspDependencyForAllTargets(libs.kotlinInject.anvil.compiler) diff --git a/data/showdetails/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/data/showdetails/implementation/DefaultShowDetailsDao.kt b/data/showdetails/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/data/showdetails/implementation/DefaultShowDetailsDao.kt index fe51edf09..377582040 100644 --- a/data/showdetails/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/data/showdetails/implementation/DefaultShowDetailsDao.kt +++ b/data/showdetails/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/data/showdetails/implementation/DefaultShowDetailsDao.kt @@ -9,8 +9,13 @@ import com.thomaskioko.tvmaniac.data.showdetails.api.ShowDetailsDao import com.thomaskioko.tvmaniac.db.Id import kotlinx.coroutines.flow.Flow import me.tatarka.inject.annotations.Inject +import software.amazon.lastmile.kotlin.inject.anvil.AppScope +import software.amazon.lastmile.kotlin.inject.anvil.ContributesBinding +import software.amazon.lastmile.kotlin.inject.anvil.SingleIn @Inject +@SingleIn(AppScope::class) +@ContributesBinding(AppScope::class) class DefaultShowDetailsDao( database: TvManiacDatabase, private val dispatchers: AppCoroutineDispatchers, diff --git a/data/showdetails/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/data/showdetails/implementation/DefaultShowDetailsRepository.kt b/data/showdetails/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/data/showdetails/implementation/DefaultShowDetailsRepository.kt index 04020b70d..f118c09b4 100644 --- a/data/showdetails/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/data/showdetails/implementation/DefaultShowDetailsRepository.kt +++ b/data/showdetails/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/data/showdetails/implementation/DefaultShowDetailsRepository.kt @@ -12,9 +12,13 @@ import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.flowOn import me.tatarka.inject.annotations.Inject import org.mobilenativefoundation.store.store5.StoreReadRequest -import org.mobilenativefoundation.store.store5.impl.extensions.get +import software.amazon.lastmile.kotlin.inject.anvil.AppScope +import software.amazon.lastmile.kotlin.inject.anvil.ContributesBinding +import software.amazon.lastmile.kotlin.inject.anvil.SingleIn @Inject +@SingleIn(AppScope::class) +@ContributesBinding(AppScope::class) class DefaultShowDetailsRepository( private val showStore: ShowDetailsStore, private val requestManagerRepository: RequestManagerRepository, diff --git a/data/showdetails/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/data/showdetails/implementation/ShowDetailsComponent.kt b/data/showdetails/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/data/showdetails/implementation/ShowDetailsComponent.kt deleted file mode 100644 index c61836fb7..000000000 --- a/data/showdetails/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/data/showdetails/implementation/ShowDetailsComponent.kt +++ /dev/null @@ -1,17 +0,0 @@ -package com.thomaskioko.tvmaniac.data.showdetails.implementation - -import com.thomaskioko.tvmaniac.core.base.annotations.ApplicationScope -import com.thomaskioko.tvmaniac.data.showdetails.api.ShowDetailsDao -import com.thomaskioko.tvmaniac.data.showdetails.api.ShowDetailsRepository -import me.tatarka.inject.annotations.Provides - -interface ShowDetailsComponent { - - @ApplicationScope - @Provides - fun provideShowDetailsDao(bind: DefaultShowDetailsDao): ShowDetailsDao = bind - - @ApplicationScope - @Provides - fun provideShowDetailsRepository(bind: DefaultShowDetailsRepository): ShowDetailsRepository = bind -} diff --git a/data/shows/implementation/build.gradle.kts b/data/shows/implementation/build.gradle.kts index f6af6a4a3..3f70cc85d 100644 --- a/data/shows/implementation/build.gradle.kts +++ b/data/shows/implementation/build.gradle.kts @@ -16,7 +16,7 @@ kotlin { api(libs.coroutines.core) - implementation(libs.kotlinInject.runtime) + implementation(libs.bundles.kotlinInject) implementation(libs.sqldelight.extensions) implementation(libs.kotlinx.atomicfu) implementation(libs.store5) @@ -26,3 +26,4 @@ kotlin { } addKspDependencyForAllTargets(libs.kotlinInject.compiler) +addKspDependencyForAllTargets(libs.kotlinInject.anvil.compiler) diff --git a/data/shows/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/shows/implementation/DefaultTvShowsDao.kt b/data/shows/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/shows/implementation/DefaultTvShowsDao.kt index 0795b8d48..05246278c 100644 --- a/data/shows/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/shows/implementation/DefaultTvShowsDao.kt +++ b/data/shows/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/shows/implementation/DefaultTvShowsDao.kt @@ -10,8 +10,13 @@ import com.thomaskioko.tvmaniac.shows.api.ShowEntity import com.thomaskioko.tvmaniac.shows.api.TvShowsDao import kotlinx.coroutines.flow.Flow import me.tatarka.inject.annotations.Inject +import software.amazon.lastmile.kotlin.inject.anvil.AppScope +import software.amazon.lastmile.kotlin.inject.anvil.ContributesBinding +import software.amazon.lastmile.kotlin.inject.anvil.SingleIn @Inject +@SingleIn(AppScope::class) +@ContributesBinding(AppScope::class) class DefaultTvShowsDao( database: TvManiacDatabase, private val dispatchers: AppCoroutineDispatchers, diff --git a/data/shows/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/shows/implementation/DiscoverComponent.kt b/data/shows/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/shows/implementation/DiscoverComponent.kt deleted file mode 100644 index add8f4dc5..000000000 --- a/data/shows/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/shows/implementation/DiscoverComponent.kt +++ /dev/null @@ -1,10 +0,0 @@ -package com.thomaskioko.tvmaniac.shows.implementation - -import com.thomaskioko.tvmaniac.core.base.annotations.ApplicationScope -import com.thomaskioko.tvmaniac.shows.api.TvShowsDao -import me.tatarka.inject.annotations.Provides - -interface DiscoverComponent { - - @ApplicationScope @Provides fun provideTvShowsDao(bind: DefaultTvShowsDao): TvShowsDao = bind -} diff --git a/data/similar/implementation/build.gradle.kts b/data/similar/implementation/build.gradle.kts index d3facf0f6..1986368e3 100644 --- a/data/similar/implementation/build.gradle.kts +++ b/data/similar/implementation/build.gradle.kts @@ -17,7 +17,7 @@ kotlin { implementation(projects.data.similar.api) implementation(projects.tmdbApi.api) - implementation(libs.kotlinInject.runtime) + implementation(libs.bundles.kotlinInject) implementation(libs.sqldelight.extensions) implementation(libs.kotlinx.atomicfu) implementation(libs.store5) @@ -29,3 +29,4 @@ kotlin { } addKspDependencyForAllTargets(libs.kotlinInject.compiler) +addKspDependencyForAllTargets(libs.kotlinInject.anvil.compiler) diff --git a/data/similar/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/similar/implementation/SimilarShowsDaoImpl.kt b/data/similar/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/similar/implementation/DefaultSimilarShowsDao.kt similarity index 81% rename from data/similar/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/similar/implementation/SimilarShowsDaoImpl.kt rename to data/similar/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/similar/implementation/DefaultSimilarShowsDao.kt index 103d17327..fe7cdb588 100644 --- a/data/similar/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/similar/implementation/SimilarShowsDaoImpl.kt +++ b/data/similar/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/similar/implementation/DefaultSimilarShowsDao.kt @@ -9,9 +9,14 @@ import com.thomaskioko.tvmaniac.db.Id import com.thomaskioko.tvmaniac.similar.api.SimilarShowsDao import kotlinx.coroutines.flow.Flow import me.tatarka.inject.annotations.Inject +import software.amazon.lastmile.kotlin.inject.anvil.AppScope +import software.amazon.lastmile.kotlin.inject.anvil.ContributesBinding +import software.amazon.lastmile.kotlin.inject.anvil.SingleIn @Inject -class SimilarShowsDaoImpl( +@SingleIn(AppScope::class) +@ContributesBinding(AppScope::class) +class DefaultSimilarShowsDao( private val database: TvManiacDatabase, private val dispatchers: AppCoroutineDispatchers, ) : SimilarShowsDao { diff --git a/data/similar/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/similar/implementation/DefaultSimilarShowsRepository.kt b/data/similar/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/similar/implementation/DefaultSimilarShowsRepository.kt index 6b15ce374..e3e01393a 100644 --- a/data/similar/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/similar/implementation/DefaultSimilarShowsRepository.kt +++ b/data/similar/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/similar/implementation/DefaultSimilarShowsRepository.kt @@ -13,9 +13,13 @@ import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.flowOn import me.tatarka.inject.annotations.Inject import org.mobilenativefoundation.store.store5.StoreReadRequest -import org.mobilenativefoundation.store.store5.impl.extensions.get +import software.amazon.lastmile.kotlin.inject.anvil.AppScope +import software.amazon.lastmile.kotlin.inject.anvil.ContributesBinding +import software.amazon.lastmile.kotlin.inject.anvil.SingleIn @Inject +@SingleIn(AppScope::class) +@ContributesBinding(AppScope::class) class DefaultSimilarShowsRepository( private val store: SimilarShowStore, private val requestManagerRepository: RequestManagerRepository, diff --git a/data/similar/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/similar/implementation/SimilarShowsComponent.kt b/data/similar/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/similar/implementation/SimilarShowsComponent.kt deleted file mode 100644 index c828b95e5..000000000 --- a/data/similar/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/similar/implementation/SimilarShowsComponent.kt +++ /dev/null @@ -1,18 +0,0 @@ -package com.thomaskioko.tvmaniac.similar.implementation - -import com.thomaskioko.tvmaniac.core.base.annotations.ApplicationScope -import com.thomaskioko.tvmaniac.similar.api.SimilarShowsDao -import com.thomaskioko.tvmaniac.similar.api.SimilarShowsRepository -import me.tatarka.inject.annotations.Provides - -interface SimilarShowsComponent { - - @ApplicationScope - @Provides - fun provideSimilarShowsDao(bind: SimilarShowsDaoImpl): SimilarShowsDao = bind - - @ApplicationScope - @Provides - fun provideSimilarShowsRepository(bind: DefaultSimilarShowsRepository): SimilarShowsRepository = - bind -} diff --git a/data/topratedshows/implementation/build.gradle.kts b/data/topratedshows/implementation/build.gradle.kts index e556de3fb..076ec4425 100644 --- a/data/topratedshows/implementation/build.gradle.kts +++ b/data/topratedshows/implementation/build.gradle.kts @@ -1,3 +1,4 @@ +import com.thomaskioko.tvmaniac.plugins.addKspDependencyForAllTargets import com.thomaskioko.tvmaniac.plugins.addLanguageArgs plugins { @@ -20,7 +21,7 @@ kotlin { api(libs.coroutines.core) - implementation(libs.kotlinInject.runtime) + implementation(libs.bundles.kotlinInject) implementation(libs.sqldelight.extensions) implementation(libs.kotlinx.atomicfu) implementation(libs.store5) @@ -32,3 +33,6 @@ kotlin { addLanguageArgs( "androidx.paging.ExperimentalPagingApi", ) + +addKspDependencyForAllTargets(libs.kotlinInject.compiler) +addKspDependencyForAllTargets(libs.kotlinInject.anvil.compiler) diff --git a/data/topratedshows/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/toprated/data/implementation/DefaultTopRatedShowsDao.kt b/data/topratedshows/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/toprated/data/implementation/DefaultTopRatedShowsDao.kt index 3b043bb57..cc1d35072 100644 --- a/data/topratedshows/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/toprated/data/implementation/DefaultTopRatedShowsDao.kt +++ b/data/topratedshows/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/toprated/data/implementation/DefaultTopRatedShowsDao.kt @@ -13,8 +13,13 @@ import com.thomaskioko.tvmaniac.shows.api.ShowEntity import com.thomaskioko.tvmaniac.topratedshows.data.api.TopRatedShowsDao import kotlinx.coroutines.flow.Flow import me.tatarka.inject.annotations.Inject +import software.amazon.lastmile.kotlin.inject.anvil.AppScope +import software.amazon.lastmile.kotlin.inject.anvil.ContributesBinding +import software.amazon.lastmile.kotlin.inject.anvil.SingleIn @Inject +@SingleIn(AppScope::class) +@ContributesBinding(AppScope::class) class DefaultTopRatedShowsDao( database: TvManiacDatabase, private val dispatchers: AppCoroutineDispatchers, diff --git a/data/topratedshows/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/toprated/data/implementation/DefaultTopRatedShowsRepository.kt b/data/topratedshows/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/toprated/data/implementation/DefaultTopRatedShowsRepository.kt index 348a2438d..33aa5cf62 100644 --- a/data/topratedshows/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/toprated/data/implementation/DefaultTopRatedShowsRepository.kt +++ b/data/topratedshows/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/toprated/data/implementation/DefaultTopRatedShowsRepository.kt @@ -23,8 +23,13 @@ import me.tatarka.inject.annotations.Inject import org.mobilenativefoundation.store.store5.StoreReadRequest import org.mobilenativefoundation.store.store5.impl.extensions.fresh import org.mobilenativefoundation.store.store5.impl.extensions.get +import software.amazon.lastmile.kotlin.inject.anvil.AppScope +import software.amazon.lastmile.kotlin.inject.anvil.ContributesBinding +import software.amazon.lastmile.kotlin.inject.anvil.SingleIn @Inject +@SingleIn(AppScope::class) +@ContributesBinding(AppScope::class) class DefaultTopRatedShowsRepository( private val store: TopRatedShowsStore, private val requestManagerRepository: RequestManagerRepository, diff --git a/data/topratedshows/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/toprated/data/implementation/TopRatedShowsComponent.kt b/data/topratedshows/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/toprated/data/implementation/TopRatedShowsComponent.kt deleted file mode 100644 index fe867623b..000000000 --- a/data/topratedshows/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/toprated/data/implementation/TopRatedShowsComponent.kt +++ /dev/null @@ -1,19 +0,0 @@ -package com.thomaskioko.tvmaniac.toprated.data.implementation - -import com.thomaskioko.tvmaniac.core.base.annotations.ApplicationScope -import com.thomaskioko.tvmaniac.topratedshows.data.api.TopRatedShowsDao -import com.thomaskioko.tvmaniac.topratedshows.data.api.TopRatedShowsRepository -import me.tatarka.inject.annotations.Provides - -interface TopRatedShowsComponent { - - @ApplicationScope - @Provides - fun provideTopRatedShowsDao(bind: DefaultTopRatedShowsDao): TopRatedShowsDao = bind - - @ApplicationScope - @Provides - fun provideTopRatedShowsRepository( - bind: DefaultTopRatedShowsRepository, - ): TopRatedShowsRepository = bind -} diff --git a/data/trailers/implementation/build.gradle.kts b/data/trailers/implementation/build.gradle.kts index faf899c01..3b6de03fd 100644 --- a/data/trailers/implementation/build.gradle.kts +++ b/data/trailers/implementation/build.gradle.kts @@ -16,7 +16,7 @@ kotlin { implementation(projects.data.trailers.api) implementation(projects.tmdbApi.api) - implementation(libs.kotlinInject.runtime) + implementation(libs.bundles.kotlinInject) implementation(libs.sqldelight.extensions) implementation(libs.kotlinx.atomicfu) implementation(libs.store5) @@ -26,3 +26,4 @@ kotlin { } addKspDependencyForAllTargets(libs.kotlinInject.compiler) +addKspDependencyForAllTargets(libs.kotlinInject.anvil.compiler) diff --git a/data/trailers/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/data/trailers/implementation/TrailerDaoImpl.kt b/data/trailers/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/data/trailers/implementation/DefaultTrailerDao.kt similarity index 83% rename from data/trailers/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/data/trailers/implementation/TrailerDaoImpl.kt rename to data/trailers/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/data/trailers/implementation/DefaultTrailerDao.kt index 79288e0f6..0f8733a7c 100644 --- a/data/trailers/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/data/trailers/implementation/TrailerDaoImpl.kt +++ b/data/trailers/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/data/trailers/implementation/DefaultTrailerDao.kt @@ -8,9 +8,14 @@ import com.thomaskioko.tvmaniac.core.db.TvManiacDatabase import com.thomaskioko.tvmaniac.db.Id import kotlinx.coroutines.flow.Flow import me.tatarka.inject.annotations.Inject +import software.amazon.lastmile.kotlin.inject.anvil.AppScope +import software.amazon.lastmile.kotlin.inject.anvil.ContributesBinding +import software.amazon.lastmile.kotlin.inject.anvil.SingleIn @Inject -class TrailerDaoImpl( +@SingleIn(AppScope::class) +@ContributesBinding(AppScope::class) +class DefaultTrailerDao( private val database: TvManiacDatabase, private val dispatchers: AppCoroutineDispatchers, ) : TrailerDao { diff --git a/data/trailers/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/data/trailers/implementation/DefaultTrailerRepository.kt b/data/trailers/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/data/trailers/implementation/DefaultTrailerRepository.kt index 2da31c7ef..fbf67bb94 100644 --- a/data/trailers/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/data/trailers/implementation/DefaultTrailerRepository.kt +++ b/data/trailers/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/data/trailers/implementation/DefaultTrailerRepository.kt @@ -10,8 +10,13 @@ import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.flow.map import me.tatarka.inject.annotations.Inject +import software.amazon.lastmile.kotlin.inject.anvil.AppScope +import software.amazon.lastmile.kotlin.inject.anvil.ContributesBinding +import software.amazon.lastmile.kotlin.inject.anvil.SingleIn @Inject +@SingleIn(AppScope::class) +@ContributesBinding(AppScope::class) class DefaultTrailerRepository( private val appUtils: AppUtils, private val trailerDao: TrailerDao, diff --git a/data/trailers/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/data/trailers/implementation/TrailerComponent.kt b/data/trailers/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/data/trailers/implementation/TrailerComponent.kt deleted file mode 100644 index cc883231b..000000000 --- a/data/trailers/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/data/trailers/implementation/TrailerComponent.kt +++ /dev/null @@ -1,13 +0,0 @@ -package com.thomaskioko.tvmaniac.data.trailers.implementation - -import com.thomaskioko.tvmaniac.core.base.annotations.ApplicationScope -import me.tatarka.inject.annotations.Provides - -interface TrailerComponent { - - @ApplicationScope @Provides fun provideTrailerDao(bind: TrailerDaoImpl): TrailerDao = bind - - @ApplicationScope - @Provides - fun provideTrailerRepository(bind: DefaultTrailerRepository): TrailerRepository = bind -} diff --git a/data/trendingshows/implementation/build.gradle.kts b/data/trendingshows/implementation/build.gradle.kts index 0d7c15342..d141b80c2 100644 --- a/data/trendingshows/implementation/build.gradle.kts +++ b/data/trendingshows/implementation/build.gradle.kts @@ -1,3 +1,4 @@ +import com.thomaskioko.tvmaniac.plugins.addKspDependencyForAllTargets import com.thomaskioko.tvmaniac.plugins.addLanguageArgs plugins { @@ -20,7 +21,7 @@ kotlin { api(libs.coroutines.core) - implementation(libs.kotlinInject.runtime) + implementation(libs.bundles.kotlinInject) implementation(libs.sqldelight.extensions) implementation(libs.kotlinx.atomicfu) implementation(libs.store5) @@ -32,3 +33,6 @@ kotlin { addLanguageArgs( "androidx.paging.ExperimentalPagingApi", ) + +addKspDependencyForAllTargets(libs.kotlinInject.compiler) +addKspDependencyForAllTargets(libs.kotlinInject.anvil.compiler) diff --git a/data/trendingshows/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/discover/implementation/DefaultTrendingShowsDao.kt b/data/trendingshows/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/discover/implementation/DefaultTrendingShowsDao.kt index 1541fdd5d..b7c0f92e3 100644 --- a/data/trendingshows/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/discover/implementation/DefaultTrendingShowsDao.kt +++ b/data/trendingshows/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/discover/implementation/DefaultTrendingShowsDao.kt @@ -12,8 +12,13 @@ import com.thomaskioko.tvmaniac.discover.api.TrendingShowsDao import com.thomaskioko.tvmaniac.shows.api.ShowEntity import kotlinx.coroutines.flow.Flow import me.tatarka.inject.annotations.Inject +import software.amazon.lastmile.kotlin.inject.anvil.AppScope +import software.amazon.lastmile.kotlin.inject.anvil.ContributesBinding +import software.amazon.lastmile.kotlin.inject.anvil.SingleIn @Inject +@SingleIn(AppScope::class) +@ContributesBinding(AppScope::class) class DefaultTrendingShowsDao( database: TvManiacDatabase, private val dispatchers: AppCoroutineDispatchers, diff --git a/data/trendingshows/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/discover/implementation/DefaultTrendingShowsRepository.kt b/data/trendingshows/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/discover/implementation/DefaultTrendingShowsRepository.kt index f8eece56b..12df82289 100644 --- a/data/trendingshows/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/discover/implementation/DefaultTrendingShowsRepository.kt +++ b/data/trendingshows/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/discover/implementation/DefaultTrendingShowsRepository.kt @@ -25,8 +25,13 @@ import me.tatarka.inject.annotations.Inject import org.mobilenativefoundation.store.store5.StoreReadRequest import org.mobilenativefoundation.store.store5.impl.extensions.fresh import org.mobilenativefoundation.store.store5.impl.extensions.get +import software.amazon.lastmile.kotlin.inject.anvil.AppScope +import software.amazon.lastmile.kotlin.inject.anvil.ContributesBinding +import software.amazon.lastmile.kotlin.inject.anvil.SingleIn @Inject +@SingleIn(AppScope::class) +@ContributesBinding(AppScope::class) class DefaultTrendingShowsRepository( private val store: TrendingShowsStore, private val requestManagerRepository: RequestManagerRepository, diff --git a/data/trendingshows/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/discover/implementation/TrendingShowsComponent.kt b/data/trendingshows/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/discover/implementation/TrendingShowsComponent.kt deleted file mode 100644 index 171181d3d..000000000 --- a/data/trendingshows/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/discover/implementation/TrendingShowsComponent.kt +++ /dev/null @@ -1,19 +0,0 @@ -package com.thomaskioko.tvmaniac.discover.implementation - -import com.thomaskioko.tvmaniac.core.base.annotations.ApplicationScope -import com.thomaskioko.tvmaniac.discover.api.TrendingShowsDao -import com.thomaskioko.tvmaniac.discover.api.TrendingShowsRepository -import me.tatarka.inject.annotations.Provides - -interface TrendingShowsComponent { - - @ApplicationScope - @Provides - fun provideTrendingShowsDao(bind: DefaultTrendingShowsDao): TrendingShowsDao = bind - - @ApplicationScope - @Provides - fun provideTrendingShowsRepository( - bind: DefaultTrendingShowsRepository, - ): TrendingShowsRepository = bind -} diff --git a/data/upcomingshows/implementation/build.gradle.kts b/data/upcomingshows/implementation/build.gradle.kts index dcd661a3f..ca8062d62 100644 --- a/data/upcomingshows/implementation/build.gradle.kts +++ b/data/upcomingshows/implementation/build.gradle.kts @@ -1,3 +1,4 @@ +import com.thomaskioko.tvmaniac.plugins.addKspDependencyForAllTargets import com.thomaskioko.tvmaniac.plugins.addLanguageArgs plugins { @@ -20,7 +21,7 @@ kotlin { api(libs.coroutines.core) - implementation(libs.kotlinInject.runtime) + implementation(libs.bundles.kotlinInject) implementation(libs.kotlinx.atomicfu) implementation(libs.sqldelight.extensions) implementation(libs.store5) @@ -32,3 +33,6 @@ kotlin { addLanguageArgs( "androidx.paging.ExperimentalPagingApi", ) + +addKspDependencyForAllTargets(libs.kotlinInject.compiler) +addKspDependencyForAllTargets(libs.kotlinInject.anvil.compiler) diff --git a/data/upcomingshows/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/data/upcomingshows/implementation/DefaultUpcomingShowsDao.kt b/data/upcomingshows/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/data/upcomingshows/implementation/DefaultUpcomingShowsDao.kt index bb69de6b6..8543253b2 100644 --- a/data/upcomingshows/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/data/upcomingshows/implementation/DefaultUpcomingShowsDao.kt +++ b/data/upcomingshows/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/data/upcomingshows/implementation/DefaultUpcomingShowsDao.kt @@ -12,8 +12,13 @@ import com.thomaskioko.tvmaniac.db.Id import com.thomaskioko.tvmaniac.shows.api.ShowEntity import kotlinx.coroutines.flow.Flow import me.tatarka.inject.annotations.Inject +import software.amazon.lastmile.kotlin.inject.anvil.AppScope +import software.amazon.lastmile.kotlin.inject.anvil.ContributesBinding +import software.amazon.lastmile.kotlin.inject.anvil.SingleIn @Inject +@SingleIn(AppScope::class) +@ContributesBinding(AppScope::class) class DefaultUpcomingShowsDao( database: TvManiacDatabase, private val dispatchers: AppCoroutineDispatchers, diff --git a/data/upcomingshows/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/data/upcomingshows/implementation/DefaultUpcomingShowsRepository.kt b/data/upcomingshows/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/data/upcomingshows/implementation/DefaultUpcomingShowsRepository.kt index 9421a2061..74ab5bf37 100644 --- a/data/upcomingshows/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/data/upcomingshows/implementation/DefaultUpcomingShowsRepository.kt +++ b/data/upcomingshows/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/data/upcomingshows/implementation/DefaultUpcomingShowsRepository.kt @@ -27,8 +27,13 @@ import me.tatarka.inject.annotations.Inject import org.mobilenativefoundation.store.store5.StoreReadRequest import org.mobilenativefoundation.store.store5.impl.extensions.fresh import org.mobilenativefoundation.store.store5.impl.extensions.get +import software.amazon.lastmile.kotlin.inject.anvil.AppScope +import software.amazon.lastmile.kotlin.inject.anvil.ContributesBinding +import software.amazon.lastmile.kotlin.inject.anvil.SingleIn @Inject +@SingleIn(AppScope::class) +@ContributesBinding(AppScope::class) class DefaultUpcomingShowsRepository( private val dateFormatter: PlatformDateFormatter, private val store: UpcomingShowsStore, diff --git a/data/upcomingshows/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/data/upcomingshows/implementation/UpcomingShowsComponent.kt b/data/upcomingshows/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/data/upcomingshows/implementation/UpcomingShowsComponent.kt deleted file mode 100644 index aa2d8e4bd..000000000 --- a/data/upcomingshows/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/data/upcomingshows/implementation/UpcomingShowsComponent.kt +++ /dev/null @@ -1,19 +0,0 @@ -package com.thomaskioko.tvmaniac.data.upcomingshows.implementation - -import com.thomaskioko.tvmaniac.core.base.annotations.ApplicationScope -import com.thomaskioko.tvmaniac.data.upcomingshows.api.UpcomingShowsDao -import com.thomaskioko.tvmaniac.data.upcomingshows.api.UpcomingShowsRepository -import me.tatarka.inject.annotations.Provides - -interface UpcomingShowsComponent { - - @ApplicationScope - @Provides - fun provideUpcomingShowsDao(bind: DefaultUpcomingShowsDao): UpcomingShowsDao = bind - - @ApplicationScope - @Provides - fun provideUpcomingShowsRepository( - bind: DefaultUpcomingShowsRepository, - ): UpcomingShowsRepository = bind -} diff --git a/data/watchproviders/implementation/build.gradle.kts b/data/watchproviders/implementation/build.gradle.kts index f478326bd..042274c04 100644 --- a/data/watchproviders/implementation/build.gradle.kts +++ b/data/watchproviders/implementation/build.gradle.kts @@ -18,7 +18,7 @@ kotlin { api(libs.coroutines.core) - implementation(libs.kotlinInject.runtime) + implementation(libs.bundles.kotlinInject) implementation(libs.sqldelight.extensions) implementation(libs.kotlinx.atomicfu) implementation(libs.store5) @@ -28,3 +28,4 @@ kotlin { } addKspDependencyForAllTargets(libs.kotlinInject.compiler) +addKspDependencyForAllTargets(libs.kotlinInject.anvil.compiler) diff --git a/data/watchproviders/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/data/watchproviders/implementation/DefaultWatchProviderDao.kt b/data/watchproviders/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/data/watchproviders/implementation/DefaultWatchProviderDao.kt index c39b4a118..1cc683dd4 100644 --- a/data/watchproviders/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/data/watchproviders/implementation/DefaultWatchProviderDao.kt +++ b/data/watchproviders/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/data/watchproviders/implementation/DefaultWatchProviderDao.kt @@ -10,8 +10,13 @@ import com.thomaskioko.tvmaniac.data.watchproviders.api.WatchProviderDao import com.thomaskioko.tvmaniac.db.Id import kotlinx.coroutines.flow.Flow import me.tatarka.inject.annotations.Inject +import software.amazon.lastmile.kotlin.inject.anvil.AppScope +import software.amazon.lastmile.kotlin.inject.anvil.ContributesBinding +import software.amazon.lastmile.kotlin.inject.anvil.SingleIn @Inject +@SingleIn(AppScope::class) +@ContributesBinding(AppScope::class) class DefaultWatchProviderDao( private val database: TvManiacDatabase, private val dispatcher: AppCoroutineDispatchers, diff --git a/data/watchproviders/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/data/watchproviders/implementation/DefaultWatchProviderRepository.kt b/data/watchproviders/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/data/watchproviders/implementation/DefaultWatchProviderRepository.kt index 0f2ec9e50..21f851461 100644 --- a/data/watchproviders/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/data/watchproviders/implementation/DefaultWatchProviderRepository.kt +++ b/data/watchproviders/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/data/watchproviders/implementation/DefaultWatchProviderRepository.kt @@ -12,9 +12,13 @@ import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.flowOn import me.tatarka.inject.annotations.Inject import org.mobilenativefoundation.store.store5.StoreReadRequest -import org.mobilenativefoundation.store.store5.impl.extensions.get +import software.amazon.lastmile.kotlin.inject.anvil.AppScope +import software.amazon.lastmile.kotlin.inject.anvil.ContributesBinding +import software.amazon.lastmile.kotlin.inject.anvil.SingleIn @Inject +@SingleIn(AppScope::class) +@ContributesBinding(AppScope::class) class DefaultWatchProviderRepository( private val store: WatchProvidersStore, private val requestManagerRepository: RequestManagerRepository, diff --git a/data/watchproviders/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/data/watchproviders/implementation/WatchProviderComponent.kt b/data/watchproviders/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/data/watchproviders/implementation/WatchProviderComponent.kt deleted file mode 100644 index a1464c203..000000000 --- a/data/watchproviders/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/data/watchproviders/implementation/WatchProviderComponent.kt +++ /dev/null @@ -1,19 +0,0 @@ -package com.thomaskioko.tvmaniac.data.watchproviders.implementation - -import com.thomaskioko.tvmaniac.core.base.annotations.ApplicationScope -import com.thomaskioko.tvmaniac.data.watchproviders.api.WatchProviderDao -import com.thomaskioko.tvmaniac.data.watchproviders.api.WatchProviderRepository -import me.tatarka.inject.annotations.Provides - -interface WatchProviderComponent { - - @ApplicationScope - @Provides - fun provideWatchProviderDao(bind: DefaultWatchProviderDao): WatchProviderDao = bind - - @ApplicationScope - @Provides - fun provideWatchProviderRepository( - bind: DefaultWatchProviderRepository, - ): WatchProviderRepository = bind -} diff --git a/database/build.gradle.kts b/database/build.gradle.kts index 089be3919..1c9299719 100644 --- a/database/build.gradle.kts +++ b/database/build.gradle.kts @@ -15,7 +15,7 @@ kotlin { dependencies { implementation(projects.core.base) implementation(libs.sqldelight.primitive.adapters) - implementation(libs.kotlinInject.runtime) + implementation(libs.bundles.kotlinInject) implementation(libs.kotlinx.datetime) } } @@ -34,6 +34,7 @@ kotlin { } addKspDependencyForAllTargets(libs.kotlinInject.compiler) +addKspDependencyForAllTargets(libs.kotlinInject.anvil.compiler) android { namespace = "com.thomaskioko.tvmaniac.db" } diff --git a/database/src/androidMain/kotlin/com/thomaskioko/tvmaniac/db/DatabasePlatformComponent.kt b/database/src/androidMain/kotlin/com/thomaskioko/tvmaniac/db/DatabasePlatformComponent.kt index 793c70024..93574f7aa 100644 --- a/database/src/androidMain/kotlin/com/thomaskioko/tvmaniac/db/DatabasePlatformComponent.kt +++ b/database/src/androidMain/kotlin/com/thomaskioko/tvmaniac/db/DatabasePlatformComponent.kt @@ -3,13 +3,14 @@ package com.thomaskioko.tvmaniac.db import android.app.Application import app.cash.sqldelight.db.SqlDriver import app.cash.sqldelight.driver.android.AndroidSqliteDriver -import com.thomaskioko.tvmaniac.core.base.annotations.ApplicationScope import com.thomaskioko.tvmaniac.core.db.TvManiacDatabase import me.tatarka.inject.annotations.Provides +import software.amazon.lastmile.kotlin.inject.anvil.AppScope +import software.amazon.lastmile.kotlin.inject.anvil.ContributesTo -actual interface DatabasePlatformComponent { +@ContributesTo(AppScope::class) +interface DatabasePlatformComponent { - @ApplicationScope @Provides fun provideSqlDriver(application: Application): SqlDriver = AndroidSqliteDriver( diff --git a/database/src/commonMain/kotlin/com.thomaskioko.tvmaniac.db/DatabasePlatformComponent.kt b/database/src/commonMain/kotlin/com.thomaskioko.tvmaniac.db/DatabaseComponent.kt similarity index 92% rename from database/src/commonMain/kotlin/com.thomaskioko.tvmaniac.db/DatabasePlatformComponent.kt rename to database/src/commonMain/kotlin/com.thomaskioko.tvmaniac.db/DatabaseComponent.kt index d32b658af..9aca9581f 100644 --- a/database/src/commonMain/kotlin/com.thomaskioko.tvmaniac.db/DatabasePlatformComponent.kt +++ b/database/src/commonMain/kotlin/com.thomaskioko.tvmaniac.db/DatabaseComponent.kt @@ -1,7 +1,6 @@ package com.thomaskioko.tvmaniac.db import app.cash.sqldelight.db.SqlDriver -import com.thomaskioko.tvmaniac.core.base.annotations.ApplicationScope import com.thomaskioko.tvmaniac.core.db.Casts import com.thomaskioko.tvmaniac.core.db.Episode import com.thomaskioko.tvmaniac.core.db.Episode_image @@ -23,11 +22,13 @@ import com.thomaskioko.tvmaniac.core.db.Tvshows import com.thomaskioko.tvmaniac.core.db.Upcoming_shows import com.thomaskioko.tvmaniac.core.db.Watch_providers import me.tatarka.inject.annotations.Provides +import software.amazon.lastmile.kotlin.inject.anvil.AppScope +import software.amazon.lastmile.kotlin.inject.anvil.ContributesTo -expect interface DatabasePlatformComponent -interface DatabaseComponent : DatabasePlatformComponent { - @ApplicationScope +@ContributesTo(AppScope::class) +interface DatabaseComponent { + @Provides fun provideTvManiacDatabase(sqlDriver: SqlDriver): TvManiacDatabase = TvManiacDatabase( @@ -124,8 +125,4 @@ interface DatabaseComponent : DatabasePlatformComponent { idAdapter = IdAdapter(), ), ) - - @ApplicationScope - @Provides - fun provideDbTransactionRunner(bind: DbTransactionRunner): DatabaseTransactionRunner = bind } diff --git a/database/src/commonMain/kotlin/com.thomaskioko.tvmaniac.db/DbTransactionRunner.kt b/database/src/commonMain/kotlin/com.thomaskioko.tvmaniac.db/DbTransactionRunner.kt index 33867f8e6..625515be2 100644 --- a/database/src/commonMain/kotlin/com.thomaskioko.tvmaniac.db/DbTransactionRunner.kt +++ b/database/src/commonMain/kotlin/com.thomaskioko.tvmaniac.db/DbTransactionRunner.kt @@ -2,12 +2,17 @@ package com.thomaskioko.tvmaniac.db import com.thomaskioko.tvmaniac.core.db.TvManiacDatabase import me.tatarka.inject.annotations.Inject +import software.amazon.lastmile.kotlin.inject.anvil.AppScope +import software.amazon.lastmile.kotlin.inject.anvil.ContributesBinding +import software.amazon.lastmile.kotlin.inject.anvil.SingleIn interface DatabaseTransactionRunner { operator fun invoke(block: () -> T): T } @Inject +@SingleIn(AppScope::class) +@ContributesBinding(AppScope::class) class DbTransactionRunner(private val db: TvManiacDatabase) : DatabaseTransactionRunner { override fun invoke(block: () -> T): T { return db.transactionWithResult { block() } diff --git a/database/src/iosMain/kotlin/com/thomaskioko/tvmaniac/db/DatabasePlatformComponent.kt b/database/src/iosMain/kotlin/com/thomaskioko/tvmaniac/db/DatabasePlatformComponent.kt index ff94f19d4..22fe15124 100644 --- a/database/src/iosMain/kotlin/com/thomaskioko/tvmaniac/db/DatabasePlatformComponent.kt +++ b/database/src/iosMain/kotlin/com/thomaskioko/tvmaniac/db/DatabasePlatformComponent.kt @@ -2,13 +2,14 @@ package com.thomaskioko.tvmaniac.db import app.cash.sqldelight.db.SqlDriver import app.cash.sqldelight.driver.native.NativeSqliteDriver -import com.thomaskioko.tvmaniac.core.base.annotations.ApplicationScope import com.thomaskioko.tvmaniac.core.db.TvManiacDatabase import me.tatarka.inject.annotations.Provides +import software.amazon.lastmile.kotlin.inject.anvil.AppScope +import software.amazon.lastmile.kotlin.inject.anvil.ContributesTo -actual interface DatabasePlatformComponent { +@ContributesTo(AppScope::class) +interface DatabasePlatformComponent { - @ApplicationScope @Provides fun provideSqlDriver(): SqlDriver = NativeSqliteDriver(TvManiacDatabase.Schema, "tvShows.db") } diff --git a/database/src/jvmMain/kotlin/com/thomaskioko/tvmaniac/db/DatabasePlatformComponent.kt b/database/src/jvmMain/kotlin/com/thomaskioko/tvmaniac/db/DatabasePlatformComponent.kt deleted file mode 100644 index 952dcb6ec..000000000 --- a/database/src/jvmMain/kotlin/com/thomaskioko/tvmaniac/db/DatabasePlatformComponent.kt +++ /dev/null @@ -1,3 +0,0 @@ -package com.thomaskioko.tvmaniac.db - -actual interface DatabasePlatformComponent diff --git a/datastore/implementation/build.gradle.kts b/datastore/implementation/build.gradle.kts index f6b318690..d11da82d1 100644 --- a/datastore/implementation/build.gradle.kts +++ b/datastore/implementation/build.gradle.kts @@ -16,7 +16,7 @@ kotlin { api(libs.androidx.datastore.preference) - implementation(libs.kotlinInject.runtime) + implementation(libs.bundles.kotlinInject) } } @@ -25,6 +25,7 @@ kotlin { } addKspDependencyForAllTargets(libs.kotlinInject.compiler) +addKspDependencyForAllTargets(libs.kotlinInject.anvil.compiler) android { namespace = "com.thomaskioko.tvmaniac.shared.domain.datastore.implementation" } diff --git a/datastore/implementation/src/androidMain/kotlin/com/thomaskioko/tvmaniac/datastore/implementation/DataStorePlatformComponent.kt b/datastore/implementation/src/androidMain/kotlin/com/thomaskioko/tvmaniac/datastore/implementation/DataStorePlatformComponent.kt index d58154769..1cd665859 100644 --- a/datastore/implementation/src/androidMain/kotlin/com/thomaskioko/tvmaniac/datastore/implementation/DataStorePlatformComponent.kt +++ b/datastore/implementation/src/androidMain/kotlin/com/thomaskioko/tvmaniac/datastore/implementation/DataStorePlatformComponent.kt @@ -3,13 +3,14 @@ package com.thomaskioko.tvmaniac.datastore.implementation import android.app.Application import androidx.datastore.core.DataStore import androidx.datastore.preferences.core.Preferences -import com.thomaskioko.tvmaniac.core.base.annotations.ApplicationScope import com.thomaskioko.tvmaniac.core.base.model.AppCoroutineScope import me.tatarka.inject.annotations.Provides +import software.amazon.lastmile.kotlin.inject.anvil.AppScope +import software.amazon.lastmile.kotlin.inject.anvil.ContributesTo -actual interface DataStorePlatformComponent { +@ContributesTo(AppScope::class) +interface DataStorePlatformComponent { - @ApplicationScope @Provides fun provideDataStore(context: Application, scope: AppCoroutineScope): DataStore = createDataStore( diff --git a/datastore/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/datastore/implementation/DataStorePlatformComponent.kt b/datastore/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/datastore/implementation/DataStorePlatformComponent.kt deleted file mode 100644 index 05b4e6e41..000000000 --- a/datastore/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/datastore/implementation/DataStorePlatformComponent.kt +++ /dev/null @@ -1,14 +0,0 @@ -package com.thomaskioko.tvmaniac.datastore.implementation - -import com.thomaskioko.tvmaniac.core.base.annotations.ApplicationScope -import com.thomaskioko.tvmaniac.datastore.api.DatastoreRepository -import me.tatarka.inject.annotations.Provides - -expect interface DataStorePlatformComponent - -interface DataStoreComponent : DataStorePlatformComponent { - - @ApplicationScope - @Provides - fun provideDatastoreRepository(bind: DefaultDatastoreRepository): DatastoreRepository = bind -} diff --git a/datastore/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/datastore/implementation/DefaultDatastoreRepository.kt b/datastore/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/datastore/implementation/DefaultDatastoreRepository.kt index 472b3938d..fdb95439b 100644 --- a/datastore/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/datastore/implementation/DefaultDatastoreRepository.kt +++ b/datastore/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/datastore/implementation/DefaultDatastoreRepository.kt @@ -14,8 +14,13 @@ import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.map import kotlinx.coroutines.launch import me.tatarka.inject.annotations.Inject +import software.amazon.lastmile.kotlin.inject.anvil.AppScope +import software.amazon.lastmile.kotlin.inject.anvil.ContributesBinding +import software.amazon.lastmile.kotlin.inject.anvil.SingleIn @Inject +@SingleIn(AppScope::class) +@ContributesBinding(AppScope::class) class DefaultDatastoreRepository( private val coroutineScope: AppCoroutineScope, private val dataStore: DataStore, diff --git a/datastore/implementation/src/iosMain/kotlin/com/thomaskioko/tvmaniac/datastore/implementation/DataStorePlatformComponent.kt b/datastore/implementation/src/iosMain/kotlin/com/thomaskioko/tvmaniac/datastore/implementation/DataStorePlatformComponent.kt index 01e65bcac..5b4bd760c 100644 --- a/datastore/implementation/src/iosMain/kotlin/com/thomaskioko/tvmaniac/datastore/implementation/DataStorePlatformComponent.kt +++ b/datastore/implementation/src/iosMain/kotlin/com/thomaskioko/tvmaniac/datastore/implementation/DataStorePlatformComponent.kt @@ -2,17 +2,19 @@ package com.thomaskioko.tvmaniac.datastore.implementation import androidx.datastore.core.DataStore import androidx.datastore.preferences.core.Preferences -import com.thomaskioko.tvmaniac.core.base.annotations.ApplicationScope import com.thomaskioko.tvmaniac.core.base.model.AppCoroutineScope import me.tatarka.inject.annotations.Provides import platform.Foundation.NSDocumentDirectory import platform.Foundation.NSFileManager import platform.Foundation.NSURL import platform.Foundation.NSUserDomainMask +import software.amazon.lastmile.kotlin.inject.anvil.AppScope +import software.amazon.lastmile.kotlin.inject.anvil.ContributesTo +import software.amazon.lastmile.kotlin.inject.anvil.SingleIn -actual interface DataStorePlatformComponent { +@ContributesTo(AppScope::class) +interface DataStorePlatformComponent { - @ApplicationScope @Provides fun provideDataStore(dispatchers: AppCoroutineScope): DataStore = createDataStore( diff --git a/datastore/implementation/src/jvmMain/kotlin/com/thomaskioko/tvmaniac/datastore/implementation/DataStorePlatformComponent.kt b/datastore/implementation/src/jvmMain/kotlin/com/thomaskioko/tvmaniac/datastore/implementation/DataStorePlatformComponent.kt deleted file mode 100644 index d50aace6c..000000000 --- a/datastore/implementation/src/jvmMain/kotlin/com/thomaskioko/tvmaniac/datastore/implementation/DataStorePlatformComponent.kt +++ /dev/null @@ -1,3 +0,0 @@ -package com.thomaskioko.tvmaniac.datastore.implementation - -actual interface DataStorePlatformComponent diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index ebd608e05..eb743d5cb 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -33,6 +33,7 @@ kermit = "2.0.5" kotest = "5.9.1" kotlin = "2.1.0" kotlininject = "0.7.2" +kotlin-inject-anvil = "0.1.1" kotlinx-collections = "0.3.8" ksp = "2.1.0-1.0.29" ktfmt = "0.44" @@ -99,6 +100,10 @@ kotest-assertions = { module = "io.kotest:kotest-assertions-core", version.ref = kotlinInject-compiler = { module = "me.tatarka.inject:kotlin-inject-compiler-ksp", version.ref = "kotlininject" } kotlinInject-runtime = { module = "me.tatarka.inject:kotlin-inject-runtime", version.ref = "kotlininject" } +kotlinInject-anvil-compiler = { group = "software.amazon.lastmile.kotlin.inject.anvil", name = "compiler", version.ref = "kotlin-inject-anvil" } +kotlinInject-anvil-runtime = { group = "software.amazon.lastmile.kotlin.inject.anvil", name = "runtime", version.ref = "kotlin-inject-anvil" } +kotlinInject-anvil-runtime-optional = { group = "software.amazon.lastmile.kotlin.inject.anvil", name = "runtime-optional", version.ref = "kotlin-inject-anvil" } + kotlinx-atomicfu = { module = "org.jetbrains.kotlinx:atomicfu", version.ref = "atomicfu" } kotlinx-collections = { module = "org.jetbrains.kotlinx:kotlinx-collections-immutable", version.ref = "kotlinx-collections" } kotlinx-datetime = { module = "org.jetbrains.kotlinx:kotlinx-datetime", version.ref = "datetime" } @@ -169,6 +174,11 @@ tvmaniac-root = { id = "plugin.tvmaniac.root" } tvmaniac-xcframework = { id = "plugin.tvmaniac.xcframework" } [bundles] +kotlinInject = [ + "kotlinInject-runtime", + "kotlinInject-anvil-runtime", + "kotlinInject-anvil-runtime-optional" +] unittest = [ "coroutines-test", "kotest-assertions", diff --git a/ios/ios/AppDelegate.swift b/ios/ios/AppDelegate.swift index fd658a5af..9298766c2 100644 --- a/ios/ios/AppDelegate.swift +++ b/ios/ios/AppDelegate.swift @@ -11,13 +11,14 @@ import UIKit import TvManiac class AppDelegate: NSObject, UIApplicationDelegate { - lazy var presenterComponent: IosViewPresenterComponent = IosViewPresenterComponent.companion.create( - componentContext: DefaultComponentContext( - lifecycle: ApplicationLifecycle(), - stateKeeper: nil, - instanceKeeper: nil, - backHandler: nil - ), - applicationComponent: ApplicationComponent.companion.create() + private lazy var appComponent = IosApplicationComponent.companion.create() + + lazy var presenterComponent: IosViewPresenterComponent = appComponent.componentFactory.createComponent( + componentContext: DefaultComponentContext( + lifecycle: ApplicationLifecycle(), + stateKeeper: nil, + instanceKeeper: nil, + backHandler: nil ) + ) } diff --git a/navigation/api/build.gradle.kts b/navigation/api/build.gradle.kts index 2650b5bd0..bdd4fe2fb 100644 --- a/navigation/api/build.gradle.kts +++ b/navigation/api/build.gradle.kts @@ -1,5 +1,8 @@ +import com.thomaskioko.tvmaniac.plugins.addKspDependencyForAllTargets + plugins { alias(libs.plugins.tvmaniac.multiplatform) + alias(libs.plugins.ksp) alias(libs.plugins.serialization) } @@ -10,6 +13,7 @@ kotlin { api(libs.decompose.decompose) api(libs.essenty.lifecycle) + implementation(projects.core.base) implementation(projects.datastore.api) implementation(projects.presenter.discover) implementation(projects.presenter.home) @@ -21,8 +25,12 @@ kotlin { implementation(projects.presenter.showDetails) implementation(projects.presenter.trailers) + implementation(libs.bundles.kotlinInject) implementation(libs.coroutines.core) } } } } + +addKspDependencyForAllTargets(libs.kotlinInject.compiler) +addKspDependencyForAllTargets(libs.kotlinInject.anvil.compiler) diff --git a/navigation/build.gradle.kts b/navigation/build.gradle.kts index 83f9edf62..28c522d47 100644 --- a/navigation/build.gradle.kts +++ b/navigation/build.gradle.kts @@ -1,6 +1,9 @@ +import com.thomaskioko.tvmaniac.plugins.addKspDependencyForAllTargets + plugins { id("plugin.tvmaniac.multiplatform") alias(libs.plugins.serialization) + alias(libs.plugins.ksp) } kotlin { @@ -18,7 +21,7 @@ kotlin { implementation(projects.presenter.showDetails) implementation(projects.presenter.trailers) - implementation(libs.kotlinInject.runtime) + implementation(libs.bundles.kotlinInject) api(libs.decompose.decompose) api(libs.essenty.lifecycle) @@ -46,3 +49,6 @@ kotlin { } } } + +addKspDependencyForAllTargets(libs.kotlinInject.compiler) +addKspDependencyForAllTargets(libs.kotlinInject.anvil.compiler) diff --git a/navigation/implementation/build.gradle.kts b/navigation/implementation/build.gradle.kts index 4fdd2e759..8355e5f07 100644 --- a/navigation/implementation/build.gradle.kts +++ b/navigation/implementation/build.gradle.kts @@ -1,5 +1,8 @@ +import com.thomaskioko.tvmaniac.plugins.addKspDependencyForAllTargets + plugins { - id("plugin.tvmaniac.multiplatform") + alias(libs.plugins.tvmaniac.multiplatform) + alias(libs.plugins.ksp) alias(libs.plugins.serialization) } @@ -20,7 +23,7 @@ kotlin { implementation(projects.presenter.showDetails) implementation(projects.presenter.trailers) - implementation(libs.kotlinInject.runtime) + implementation(libs.bundles.kotlinInject) } commonTest.dependencies { @@ -47,3 +50,6 @@ kotlin { } } } + +addKspDependencyForAllTargets(libs.kotlinInject.compiler) +addKspDependencyForAllTargets(libs.kotlinInject.anvil.compiler) diff --git a/navigation/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/navigation/DefaultRootPresenter.kt b/navigation/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/navigation/DefaultRootPresenter.kt index c78206602..de39e8b19 100644 --- a/navigation/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/navigation/DefaultRootPresenter.kt +++ b/navigation/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/navigation/DefaultRootPresenter.kt @@ -29,9 +29,12 @@ import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.launch import me.tatarka.inject.annotations.Inject +import software.amazon.lastmile.kotlin.inject.anvil.ContributesBinding +import software.amazon.lastmile.kotlin.inject.anvil.SingleIn @Inject -@ActivityScope +@SingleIn(ActivityScope::class) +@ContributesBinding(ActivityScope::class, RootPresenter::class) class DefaultRootPresenter( componentContext: ComponentContext, private val homePresenterFactory: HomePresenterFactory, diff --git a/navigation/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/navigation/di/NavigatorComponent.kt b/navigation/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/navigation/di/NavigatorComponent.kt deleted file mode 100644 index b45886f9c..000000000 --- a/navigation/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/navigation/di/NavigatorComponent.kt +++ /dev/null @@ -1,13 +0,0 @@ -package com.thomaskioko.tvmaniac.navigation.di - -import com.thomaskioko.tvmaniac.core.base.annotations.ActivityScope -import com.thomaskioko.tvmaniac.navigation.DefaultRootPresenter -import com.thomaskioko.tvmaniac.navigation.RootPresenter -import me.tatarka.inject.annotations.Provides - -interface NavigatorComponent { - - @ActivityScope - @Provides - fun provideRootComponent(bind: DefaultRootPresenter): RootPresenter = bind -} diff --git a/presenter/discover/build.gradle.kts b/presenter/discover/build.gradle.kts index a79566869..db3b052a3 100644 --- a/presenter/discover/build.gradle.kts +++ b/presenter/discover/build.gradle.kts @@ -19,7 +19,7 @@ kotlin { api(libs.essenty.lifecycle) api(libs.kotlinx.collections) - implementation(libs.kotlinInject.runtime) + implementation(libs.bundles.kotlinInject) } } diff --git a/presenter/home/build.gradle.kts b/presenter/home/build.gradle.kts index eb5954096..926fcb863 100644 --- a/presenter/home/build.gradle.kts +++ b/presenter/home/build.gradle.kts @@ -18,7 +18,7 @@ kotlin { implementation(libs.decompose.decompose) implementation(libs.essenty.lifecycle) - implementation(libs.kotlinInject.runtime) + implementation(libs.bundles.kotlinInject) } } diff --git a/presenter/library/build.gradle.kts b/presenter/library/build.gradle.kts index 23e882cda..de1aa27cf 100644 --- a/presenter/library/build.gradle.kts +++ b/presenter/library/build.gradle.kts @@ -11,7 +11,7 @@ kotlin { api(libs.essenty.lifecycle) api(libs.kotlinx.collections) - implementation(libs.kotlinInject.runtime) + implementation(libs.bundles.kotlinInject) } } diff --git a/presenter/more-shows/build.gradle.kts b/presenter/more-shows/build.gradle.kts index 8d6660a51..4893893c8 100644 --- a/presenter/more-shows/build.gradle.kts +++ b/presenter/more-shows/build.gradle.kts @@ -14,7 +14,7 @@ kotlin { api(libs.essenty.lifecycle) api(libs.kotlinx.collections) - implementation(libs.kotlinInject.runtime) + implementation(libs.bundles.kotlinInject) } } diff --git a/presenter/search/build.gradle.kts b/presenter/search/build.gradle.kts index bc5038ab0..4541abf34 100644 --- a/presenter/search/build.gradle.kts +++ b/presenter/search/build.gradle.kts @@ -18,7 +18,7 @@ kotlin { api(libs.kotlinx.collections) implementation(libs.coroutines.core) - implementation(libs.kotlinInject.runtime) + implementation(libs.bundles.kotlinInject) } } diff --git a/presenter/seasondetails/build.gradle.kts b/presenter/seasondetails/build.gradle.kts index d7a70c26a..e8eeb5ee2 100644 --- a/presenter/seasondetails/build.gradle.kts +++ b/presenter/seasondetails/build.gradle.kts @@ -17,7 +17,7 @@ kotlin { api(libs.essenty.lifecycle) api(libs.kotlinx.collections) - implementation(libs.kotlinInject.runtime) + implementation(libs.bundles.kotlinInject) } } diff --git a/presenter/settings/build.gradle.kts b/presenter/settings/build.gradle.kts index 87e22161d..a489c9952 100644 --- a/presenter/settings/build.gradle.kts +++ b/presenter/settings/build.gradle.kts @@ -11,7 +11,7 @@ kotlin { api(libs.decompose.decompose) api(libs.essenty.lifecycle) - implementation(libs.kotlinInject.runtime) + implementation(libs.bundles.kotlinInject) } } diff --git a/presenter/show-details/build.gradle.kts b/presenter/show-details/build.gradle.kts index 6c1bb1379..cc475de49 100644 --- a/presenter/show-details/build.gradle.kts +++ b/presenter/show-details/build.gradle.kts @@ -22,7 +22,7 @@ kotlin { api(libs.essenty.lifecycle) api(libs.kotlinx.collections) - implementation(libs.kotlinInject.runtime) + implementation(libs.bundles.kotlinInject) } } diff --git a/presenter/trailers/build.gradle.kts b/presenter/trailers/build.gradle.kts index fa0360429..908d7cab7 100644 --- a/presenter/trailers/build.gradle.kts +++ b/presenter/trailers/build.gradle.kts @@ -12,7 +12,7 @@ kotlin { api(libs.essenty.lifecycle) api(libs.kotlinx.collections) - implementation(libs.kotlinInject.runtime) + implementation(libs.bundles.kotlinInject) } } diff --git a/shared/build.gradle.kts b/shared/build.gradle.kts index a928dbc4f..e5391d989 100644 --- a/shared/build.gradle.kts +++ b/shared/build.gradle.kts @@ -119,6 +119,8 @@ kotlin { api(libs.decompose.decompose) api(libs.essenty.lifecycle) + + implementation(libs.bundles.kotlinInject) } } } @@ -126,9 +128,8 @@ kotlin { android { namespace = "com.thomaskioko.tvmaniac.shared" } -ksp { arg("me.tatarka.inject.generateCompanionExtensions", "true") } - addKspDependencyForAllTargets(libs.kotlinInject.compiler) +addKspDependencyForAllTargets(libs.kotlinInject.anvil.compiler) kotlin.sourceSets.all { languageSettings.optIn("kotlin.experimental.ExperimentalObjCName") } diff --git a/shared/src/commonMain/kotlin/com/thomaskioko/tvmaniac/shared/SharedComponent.kt b/shared/src/commonMain/kotlin/com/thomaskioko/tvmaniac/shared/SharedComponent.kt deleted file mode 100644 index 475c1bee5..000000000 --- a/shared/src/commonMain/kotlin/com/thomaskioko/tvmaniac/shared/SharedComponent.kt +++ /dev/null @@ -1,58 +0,0 @@ -package com.thomaskioko.tvmaniac.shared - -import com.thomaskioko.trakt.service.implementation.inject.TraktComponent -import com.thomaskioko.tvmaniac.core.base.di.BaseComponent -import com.thomaskioko.tvmaniac.core.logger.inject.LoggingComponent -import com.thomaskioko.tvmaniac.core.networkutil.di.NetworkUtilPlatformComponent -import com.thomaskioko.tvmaniac.data.cast.implementation.CastComponent -import com.thomaskioko.tvmaniac.data.featuredshows.implementation.FeaturedShowsComponent -import com.thomaskioko.tvmaniac.data.popularshows.implementation.PopularShowsComponent -import com.thomaskioko.tvmaniac.data.recommendedshows.implementation.RecommendedShowsComponent -import com.thomaskioko.tvmaniac.data.showdetails.implementation.ShowDetailsComponent -import com.thomaskioko.tvmaniac.data.trailers.implementation.TrailerComponent -import com.thomaskioko.tvmaniac.data.upcomingshows.implementation.UpcomingShowsComponent -import com.thomaskioko.tvmaniac.data.watchproviders.implementation.WatchProviderComponent -import com.thomaskioko.tvmaniac.datastore.implementation.DataStoreComponent -import com.thomaskioko.tvmaniac.db.DatabaseComponent -import com.thomaskioko.tvmaniac.discover.implementation.TrendingShowsComponent -import com.thomaskioko.tvmaniac.episodes.implementation.EpisodeComponent -import com.thomaskioko.tvmaniac.resourcemanager.implementation.RequestManagerComponent -import com.thomaskioko.tvmaniac.search.implementation.SearchComponent -import com.thomaskioko.tvmaniac.seasondetails.implementation.SeasonDetailsComponent -import com.thomaskioko.tvmaniac.seasons.implementation.SeasonsComponent -import com.thomaskioko.tvmaniac.shows.implementation.DiscoverComponent -import com.thomaskioko.tvmaniac.similar.implementation.SimilarShowsComponent -import com.thomaskioko.tvmaniac.tmdb.implementation.TmdbComponent -import com.thomaskioko.tvmaniac.toprated.data.implementation.TopRatedShowsComponent -import com.thomaskioko.tvmaniac.traktauth.implementation.TraktAuthenticationComponent -import com.thomaskioko.tvmaniac.util.inject.UtilPlatformComponent -import com.thomaskioko.tvmaniac.watchlist.implementation.LibraryComponent - -abstract class SharedComponent : - BaseComponent, - CastComponent, - DataStoreComponent, - DatabaseComponent, - DiscoverComponent, - EpisodeComponent, - FeaturedShowsComponent, - LibraryComponent, - LoggingComponent, - NetworkUtilPlatformComponent, - PopularShowsComponent, - RequestManagerComponent, - RecommendedShowsComponent, - SeasonDetailsComponent, - SeasonsComponent, - SearchComponent, - ShowDetailsComponent, - SimilarShowsComponent, - TmdbComponent, - TopRatedShowsComponent, - TrailerComponent, - TraktAuthenticationComponent, - TraktComponent, - TrendingShowsComponent, - UtilPlatformComponent, - UpcomingShowsComponent, - WatchProviderComponent diff --git a/shared/src/iosMain/kotlin/com.thomaskioko.tvmaniac.shared/ApplicationComponent.kt b/shared/src/iosMain/kotlin/com.thomaskioko.tvmaniac.shared/ApplicationComponent.kt deleted file mode 100644 index ab394a58e..000000000 --- a/shared/src/iosMain/kotlin/com.thomaskioko.tvmaniac.shared/ApplicationComponent.kt +++ /dev/null @@ -1,10 +0,0 @@ -package com.thomaskioko.tvmaniac.shared - -import com.thomaskioko.tvmaniac.core.base.annotations.ApplicationScope -import me.tatarka.inject.annotations.Component - -@Component -@ApplicationScope -abstract class ApplicationComponent : SharedComponent() { - companion object -} diff --git a/shared/src/iosMain/kotlin/com.thomaskioko.tvmaniac.shared/IosApplicationComponent.kt b/shared/src/iosMain/kotlin/com.thomaskioko.tvmaniac.shared/IosApplicationComponent.kt new file mode 100644 index 000000000..792d564c9 --- /dev/null +++ b/shared/src/iosMain/kotlin/com.thomaskioko.tvmaniac.shared/IosApplicationComponent.kt @@ -0,0 +1,24 @@ +package com.thomaskioko.tvmaniac.shared + +import software.amazon.lastmile.kotlin.inject.anvil.AppScope +import software.amazon.lastmile.kotlin.inject.anvil.MergeComponent +import software.amazon.lastmile.kotlin.inject.anvil.MergeComponent.CreateComponent +import software.amazon.lastmile.kotlin.inject.anvil.SingleIn +import kotlin.reflect.KClass + +@MergeComponent(AppScope::class) +@SingleIn(AppScope::class) +abstract class IosApplicationComponent : IosViewPresenterComponent.Factory { + abstract val componentFactory: IosViewPresenterComponent.Factory + + companion object { + fun create() = IosApplicationComponent::class.createComponent() + } +} + +/** + * The `actual fun` will be generated for each iOS specific target. See [MergeComponent] for more + * details. + */ +@CreateComponent +expect fun KClass.createComponent(): IosApplicationComponent diff --git a/shared/src/iosMain/kotlin/com.thomaskioko.tvmaniac.shared/IosViewPresenterComponent.kt b/shared/src/iosMain/kotlin/com.thomaskioko.tvmaniac.shared/IosViewPresenterComponent.kt index 7f71e8577..0ff3fb7af 100644 --- a/shared/src/iosMain/kotlin/com.thomaskioko.tvmaniac.shared/IosViewPresenterComponent.kt +++ b/shared/src/iosMain/kotlin/com.thomaskioko.tvmaniac.shared/IosViewPresenterComponent.kt @@ -3,18 +3,19 @@ package com.thomaskioko.tvmaniac.shared import com.arkivanov.decompose.ComponentContext import com.thomaskioko.tvmaniac.core.base.annotations.ActivityScope import com.thomaskioko.tvmaniac.navigation.RootPresenter -import com.thomaskioko.tvmaniac.navigation.di.NavigatorComponent -import com.thomaskioko.tvmaniac.traktauth.implementation.TraktAuthManagerComponent -import me.tatarka.inject.annotations.Component -import me.tatarka.inject.annotations.Provides +import software.amazon.lastmile.kotlin.inject.anvil.AppScope +import software.amazon.lastmile.kotlin.inject.anvil.ContributesSubcomponent +import software.amazon.lastmile.kotlin.inject.anvil.SingleIn -@Component -@ActivityScope -abstract class IosViewPresenterComponent( - @get:Provides val componentContext: ComponentContext, - @Component val applicationComponent: ApplicationComponent, -) : NavigatorComponent, TraktAuthManagerComponent { - abstract val rootPresenter: RootPresenter +@ContributesSubcomponent(ActivityScope::class) +@SingleIn(ActivityScope::class) +interface IosViewPresenterComponent { + val rootPresenter: RootPresenter - companion object + @ContributesSubcomponent.Factory(AppScope::class) + interface Factory { + fun createComponent( + componentContext: ComponentContext, + ): IosViewPresenterComponent + } } diff --git a/tmdb-api/implementation/build.gradle.kts b/tmdb-api/implementation/build.gradle.kts index 4b24a5203..73b1e2cbe 100644 --- a/tmdb-api/implementation/build.gradle.kts +++ b/tmdb-api/implementation/build.gradle.kts @@ -17,7 +17,7 @@ kotlin { implementation(projects.core.logger) implementation(projects.tmdbApi.api) - implementation(libs.kotlinInject.runtime) + implementation(libs.bundles.kotlinInject) implementation(libs.ktor.core) implementation(libs.ktor.logging) implementation(libs.ktor.negotiation) @@ -41,3 +41,4 @@ kotlin { android { namespace = "com.thomaskioko.tvmaniac.tmdb.implementation" } addKspDependencyForAllTargets(libs.kotlinInject.compiler) +addKspDependencyForAllTargets(libs.kotlinInject.anvil.compiler) diff --git a/tmdb-api/implementation/src/androidMain/kotlin/com/thomaskioko/tvmaniac/tmdb/implementation/TmdbPlatformComponent.kt b/tmdb-api/implementation/src/androidMain/kotlin/com/thomaskioko/tvmaniac/tmdb/implementation/TmdbPlatformComponent.kt index fe3785151..d12c1a322 100644 --- a/tmdb-api/implementation/src/androidMain/kotlin/com/thomaskioko/tvmaniac/tmdb/implementation/TmdbPlatformComponent.kt +++ b/tmdb-api/implementation/src/androidMain/kotlin/com/thomaskioko/tvmaniac/tmdb/implementation/TmdbPlatformComponent.kt @@ -1,12 +1,13 @@ package com.thomaskioko.tvmaniac.tmdb.implementation -import com.thomaskioko.tvmaniac.core.base.annotations.ApplicationScope import io.ktor.client.engine.okhttp.OkHttp import me.tatarka.inject.annotations.Provides +import software.amazon.lastmile.kotlin.inject.anvil.AppScope +import software.amazon.lastmile.kotlin.inject.anvil.ContributesTo -actual interface TmdbPlatformComponent { +@ContributesTo(AppScope::class) +interface TmdbPlatformComponent { - @ApplicationScope @Provides fun provideTmdbHttpClientEngine(): TmdbHttpClientEngine = OkHttp.create() } diff --git a/tmdb-api/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/tmdb/implementation/DefaultTmdbSeasonDetailsNetworkDataSource.kt b/tmdb-api/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/tmdb/implementation/DefaultTmdbSeasonDetailsNetworkDataSource.kt index 894fbe891..bbf7bc0af 100644 --- a/tmdb-api/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/tmdb/implementation/DefaultTmdbSeasonDetailsNetworkDataSource.kt +++ b/tmdb-api/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/tmdb/implementation/DefaultTmdbSeasonDetailsNetworkDataSource.kt @@ -8,8 +8,13 @@ import io.ktor.client.request.parameter import io.ktor.http.HttpMethod import io.ktor.http.path import me.tatarka.inject.annotations.Inject +import software.amazon.lastmile.kotlin.inject.anvil.AppScope +import software.amazon.lastmile.kotlin.inject.anvil.ContributesBinding +import software.amazon.lastmile.kotlin.inject.anvil.SingleIn @Inject +@SingleIn(AppScope::class) +@ContributesBinding(AppScope::class) class DefaultTmdbSeasonDetailsNetworkDataSource( private val httpClient: TmdbHttpClient, ) : TmdbSeasonDetailsNetworkDataSource { diff --git a/tmdb-api/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/tmdb/implementation/DefaultTmdbShowDetailsNetworkDataSource.kt b/tmdb-api/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/tmdb/implementation/DefaultTmdbShowDetailsNetworkDataSource.kt index 1082321ed..d591629bb 100644 --- a/tmdb-api/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/tmdb/implementation/DefaultTmdbShowDetailsNetworkDataSource.kt +++ b/tmdb-api/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/tmdb/implementation/DefaultTmdbShowDetailsNetworkDataSource.kt @@ -10,8 +10,13 @@ import io.ktor.client.request.parameter import io.ktor.http.HttpMethod import io.ktor.http.path import me.tatarka.inject.annotations.Inject +import software.amazon.lastmile.kotlin.inject.anvil.AppScope +import software.amazon.lastmile.kotlin.inject.anvil.ContributesBinding +import software.amazon.lastmile.kotlin.inject.anvil.SingleIn @Inject +@SingleIn(AppScope::class) +@ContributesBinding(AppScope::class) class DefaultTmdbShowDetailsNetworkDataSource( private val httpClient: TmdbHttpClient, ) : TmdbShowDetailsNetworkDataSource { diff --git a/tmdb-api/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/tmdb/implementation/DefaultTmdbShowsNetworkDataSource.kt b/tmdb-api/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/tmdb/implementation/DefaultTmdbShowsNetworkDataSource.kt index 147a589f9..5e3453343 100644 --- a/tmdb-api/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/tmdb/implementation/DefaultTmdbShowsNetworkDataSource.kt +++ b/tmdb-api/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/tmdb/implementation/DefaultTmdbShowsNetworkDataSource.kt @@ -8,8 +8,13 @@ import io.ktor.client.request.parameter import io.ktor.http.HttpMethod import io.ktor.http.path import me.tatarka.inject.annotations.Inject +import software.amazon.lastmile.kotlin.inject.anvil.AppScope +import software.amazon.lastmile.kotlin.inject.anvil.ContributesBinding +import software.amazon.lastmile.kotlin.inject.anvil.SingleIn @Inject +@SingleIn(AppScope::class) +@ContributesBinding(AppScope::class) class DefaultTmdbShowsNetworkDataSource( private val httpClient: TmdbHttpClient, ) : TmdbShowsNetworkDataSource { diff --git a/tmdb-api/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/tmdb/implementation/TmdbComponent.kt b/tmdb-api/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/tmdb/implementation/TmdbComponent.kt index b05e90d2e..9b0f1e86c 100644 --- a/tmdb-api/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/tmdb/implementation/TmdbComponent.kt +++ b/tmdb-api/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/tmdb/implementation/TmdbComponent.kt @@ -1,6 +1,5 @@ package com.thomaskioko.tvmaniac.tmdb.implementation -import com.thomaskioko.tvmaniac.core.base.annotations.ApplicationScope import com.thomaskioko.tvmaniac.core.base.model.Configs import com.thomaskioko.tvmaniac.core.logger.KermitLogger import com.thomaskioko.tvmaniac.tmdb.api.TmdbSeasonDetailsNetworkDataSource @@ -10,6 +9,8 @@ import io.ktor.client.HttpClient import io.ktor.client.engine.HttpClientEngine import kotlinx.serialization.json.Json import me.tatarka.inject.annotations.Provides +import software.amazon.lastmile.kotlin.inject.anvil.AppScope +import software.amazon.lastmile.kotlin.inject.anvil.ContributesTo typealias TmdbHttpClient = HttpClient @@ -17,11 +18,9 @@ typealias TmdbHttpClientEngine = HttpClientEngine typealias TmdbJson = Json -expect interface TmdbPlatformComponent +@ContributesTo(AppScope::class) +interface TmdbComponent { -interface TmdbComponent : TmdbPlatformComponent { - - @ApplicationScope @Provides fun provideTmdbJson(): TmdbJson = Json { isLenient = true @@ -30,7 +29,6 @@ interface TmdbComponent : TmdbPlatformComponent { explicitNulls = false } - @ApplicationScope @Provides fun provideTmdbHttpClient( configs: Configs, @@ -45,19 +43,4 @@ interface TmdbComponent : TmdbPlatformComponent { kermitLogger = logger, isDebug = configs.isDebug, ) - - @Provides - fun provideTmdbShowsNetworkDataSource( - bind: DefaultTmdbShowsNetworkDataSource, - ): TmdbShowsNetworkDataSource = bind - - @Provides - fun provideTmdbShowDetailsNetworkDataSource( - bind: DefaultTmdbShowDetailsNetworkDataSource, - ): TmdbShowDetailsNetworkDataSource = bind - - @Provides - fun provideTmdbSeasonDetailsNetworkDataSource( - bind: DefaultTmdbSeasonDetailsNetworkDataSource, - ): TmdbSeasonDetailsNetworkDataSource = bind } diff --git a/tmdb-api/implementation/src/iosMain/kotlin/com/thomaskioko/tvmaniac/tmdb/implementation/TmdbPlatformComponent.kt b/tmdb-api/implementation/src/iosMain/kotlin/com/thomaskioko/tvmaniac/tmdb/implementation/TmdbPlatformComponent.kt index 7f2e0bbef..2f7f55462 100644 --- a/tmdb-api/implementation/src/iosMain/kotlin/com/thomaskioko/tvmaniac/tmdb/implementation/TmdbPlatformComponent.kt +++ b/tmdb-api/implementation/src/iosMain/kotlin/com/thomaskioko/tvmaniac/tmdb/implementation/TmdbPlatformComponent.kt @@ -1,12 +1,13 @@ package com.thomaskioko.tvmaniac.tmdb.implementation -import com.thomaskioko.tvmaniac.core.base.annotations.ApplicationScope import io.ktor.client.engine.darwin.Darwin import me.tatarka.inject.annotations.Provides +import software.amazon.lastmile.kotlin.inject.anvil.AppScope +import software.amazon.lastmile.kotlin.inject.anvil.ContributesTo -actual interface TmdbPlatformComponent { +@ContributesTo(AppScope::class) +interface TmdbPlatformComponent { - @ApplicationScope @Provides fun provideTmdbHttpClientEngine(): TmdbHttpClientEngine = Darwin.create() } diff --git a/tmdb-api/implementation/src/jvmMain/kotlin/com/thomaskioko/tvmaniac/tmdb/implementation/TmdbPlatformComponent.kt b/tmdb-api/implementation/src/jvmMain/kotlin/com/thomaskioko/tvmaniac/tmdb/implementation/TmdbPlatformComponent.kt deleted file mode 100644 index fbd673b97..000000000 --- a/tmdb-api/implementation/src/jvmMain/kotlin/com/thomaskioko/tvmaniac/tmdb/implementation/TmdbPlatformComponent.kt +++ /dev/null @@ -1,3 +0,0 @@ -package com.thomaskioko.tvmaniac.tmdb.implementation - -actual interface TmdbPlatformComponent diff --git a/trakt-api/implementation/build.gradle.kts b/trakt-api/implementation/build.gradle.kts index 2a295b5ca..e3932bc9c 100644 --- a/trakt-api/implementation/build.gradle.kts +++ b/trakt-api/implementation/build.gradle.kts @@ -27,7 +27,7 @@ kotlin { implementation(libs.ktor.logging) implementation(libs.ktor.negotiation) implementation(libs.ktor.serialization.json) - implementation(libs.kotlinInject.runtime) + implementation(libs.bundles.kotlinInject) implementation(libs.sqldelight.extensions) } } @@ -43,5 +43,6 @@ kotlin { } addKspDependencyForAllTargets(libs.kotlinInject.compiler) +addKspDependencyForAllTargets(libs.kotlinInject.anvil.compiler) android { namespace = "com.thomaskioko.trakt.api.implementation" } diff --git a/trakt-api/implementation/src/androidMain/kotlin/com/thomaskioko/trakt/service/implementation/TraktPlatformComponent.kt b/trakt-api/implementation/src/androidMain/kotlin/com/thomaskioko/trakt/service/implementation/TraktPlatformComponent.kt new file mode 100644 index 000000000..690f02f5c --- /dev/null +++ b/trakt-api/implementation/src/androidMain/kotlin/com/thomaskioko/trakt/service/implementation/TraktPlatformComponent.kt @@ -0,0 +1,14 @@ +package com.thomaskioko.trakt.service.implementation + +import io.ktor.client.engine.okhttp.OkHttp +import me.tatarka.inject.annotations.Provides +import software.amazon.lastmile.kotlin.inject.anvil.AppScope +import software.amazon.lastmile.kotlin.inject.anvil.ContributesTo + +@ContributesTo(AppScope::class) +interface TraktPlatformComponent { + + @Provides + fun provideTraktHttpClientEngine(interceptor: TraktAuthInterceptor): TraktHttpClientEngine = + OkHttp.create { addInterceptor(interceptor) } +} diff --git a/trakt-api/implementation/src/androidMain/kotlin/com/thomaskioko/trakt/service/implementation/inject/TraktPlatformComponent.kt b/trakt-api/implementation/src/androidMain/kotlin/com/thomaskioko/trakt/service/implementation/inject/TraktPlatformComponent.kt deleted file mode 100644 index a22a4bbec..000000000 --- a/trakt-api/implementation/src/androidMain/kotlin/com/thomaskioko/trakt/service/implementation/inject/TraktPlatformComponent.kt +++ /dev/null @@ -1,14 +0,0 @@ -package com.thomaskioko.trakt.service.implementation.inject - -import com.thomaskioko.trakt.service.implementation.TraktAuthInterceptor -import com.thomaskioko.tvmaniac.core.base.annotations.ApplicationScope -import io.ktor.client.engine.okhttp.OkHttp -import me.tatarka.inject.annotations.Provides - -actual interface TraktPlatformComponent { - - @ApplicationScope - @Provides - fun provideTraktHttpClientEngine(interceptor: TraktAuthInterceptor): TraktHttpClientEngine = - OkHttp.create { addInterceptor(interceptor) } -} diff --git a/trakt-api/implementation/src/commonMain/kotlin/com/thomaskioko/trakt/service/implementation/TraktComponent.kt b/trakt-api/implementation/src/commonMain/kotlin/com/thomaskioko/trakt/service/implementation/TraktComponent.kt new file mode 100644 index 000000000..2dd3798c7 --- /dev/null +++ b/trakt-api/implementation/src/commonMain/kotlin/com/thomaskioko/trakt/service/implementation/TraktComponent.kt @@ -0,0 +1,40 @@ +package com.thomaskioko.trakt.service.implementation + +import com.thomaskioko.tvmaniac.core.base.model.Configs +import com.thomaskioko.tvmaniac.core.logger.KermitLogger +import io.ktor.client.HttpClient +import io.ktor.client.engine.HttpClientEngine +import kotlinx.serialization.json.Json +import me.tatarka.inject.annotations.Provides +import software.amazon.lastmile.kotlin.inject.anvil.AppScope +import software.amazon.lastmile.kotlin.inject.anvil.ContributesTo + +typealias TraktHttpClient = HttpClient +typealias TraktHttpClientEngine = HttpClientEngine +typealias TraktJson = Json + +@ContributesTo(AppScope::class) +interface TraktComponent { + + @Provides + fun provideJson(): TraktJson = Json { + ignoreUnknownKeys = true + prettyPrint = true + encodeDefaults = true + } + + @Provides + fun provideHttpClient( + configs: Configs, + json: TraktJson, + httpClientEngine: TraktHttpClientEngine, + logger: KermitLogger, + ): TraktHttpClient = + traktHttpClient( + isDebug = configs.isDebug, + traktClientId = configs.traktClientId, + json = json, + httpClientEngine = httpClientEngine, + kermitLogger = logger, + ) +} diff --git a/trakt-api/implementation/src/commonMain/kotlin/com/thomaskioko/trakt/service/implementation/TraktHttpClient.kt b/trakt-api/implementation/src/commonMain/kotlin/com/thomaskioko/trakt/service/implementation/TraktHttpClient.kt index e8ee81b5c..c104f1c7a 100644 --- a/trakt-api/implementation/src/commonMain/kotlin/com/thomaskioko/trakt/service/implementation/TraktHttpClient.kt +++ b/trakt-api/implementation/src/commonMain/kotlin/com/thomaskioko/trakt/service/implementation/TraktHttpClient.kt @@ -1,7 +1,5 @@ package com.thomaskioko.trakt.service.implementation -import com.thomaskioko.trakt.service.implementation.inject.TraktHttpClientEngine -import com.thomaskioko.trakt.service.implementation.inject.TraktJson import com.thomaskioko.tvmaniac.core.logger.KermitLogger import com.thomaskioko.tvmaniac.core.networkutil.model.HttpExceptions import io.ktor.client.HttpClient diff --git a/trakt-api/implementation/src/commonMain/kotlin/com/thomaskioko/trakt/service/implementation/TraktListRemoteDataSourceImpl.kt b/trakt-api/implementation/src/commonMain/kotlin/com/thomaskioko/trakt/service/implementation/api/DefaultTraktListRemoteDataSource.kt similarity index 90% rename from trakt-api/implementation/src/commonMain/kotlin/com/thomaskioko/trakt/service/implementation/TraktListRemoteDataSourceImpl.kt rename to trakt-api/implementation/src/commonMain/kotlin/com/thomaskioko/trakt/service/implementation/api/DefaultTraktListRemoteDataSource.kt index 37943bc6a..d25885fd9 100644 --- a/trakt-api/implementation/src/commonMain/kotlin/com/thomaskioko/trakt/service/implementation/TraktListRemoteDataSourceImpl.kt +++ b/trakt-api/implementation/src/commonMain/kotlin/com/thomaskioko/trakt/service/implementation/api/DefaultTraktListRemoteDataSource.kt @@ -1,6 +1,6 @@ -package com.thomaskioko.trakt.service.implementation +package com.thomaskioko.trakt.service.implementation.api -import com.thomaskioko.trakt.service.implementation.inject.TraktHttpClient +import com.thomaskioko.trakt.service.implementation.TraktHttpClient import com.thomaskioko.tvmaniac.core.networkutil.model.ApiResponse import com.thomaskioko.tvmaniac.core.networkutil.model.safeRequest import com.thomaskioko.tvmaniac.trakt.api.TraktListRemoteDataSource @@ -24,9 +24,14 @@ import io.ktor.http.HttpMethod import io.ktor.http.contentType import io.ktor.http.path import me.tatarka.inject.annotations.Inject +import software.amazon.lastmile.kotlin.inject.anvil.AppScope +import software.amazon.lastmile.kotlin.inject.anvil.ContributesBinding +import software.amazon.lastmile.kotlin.inject.anvil.SingleIn @Inject -class TraktListRemoteDataSourceImpl( +@SingleIn(AppScope::class) +@ContributesBinding(AppScope::class) +class DefaultTraktListRemoteDataSource( private val httpClient: TraktHttpClient, ) : TraktListRemoteDataSource { diff --git a/trakt-api/implementation/src/commonMain/kotlin/com/thomaskioko/trakt/service/implementation/TraktTokenRemoteDataSourceImpl.kt b/trakt-api/implementation/src/commonMain/kotlin/com/thomaskioko/trakt/service/implementation/api/DefaultTraktTokenRemoteDataSource.kt similarity index 80% rename from trakt-api/implementation/src/commonMain/kotlin/com/thomaskioko/trakt/service/implementation/TraktTokenRemoteDataSourceImpl.kt rename to trakt-api/implementation/src/commonMain/kotlin/com/thomaskioko/trakt/service/implementation/api/DefaultTraktTokenRemoteDataSource.kt index 2b5d01dad..ad5c7b3ef 100644 --- a/trakt-api/implementation/src/commonMain/kotlin/com/thomaskioko/trakt/service/implementation/TraktTokenRemoteDataSourceImpl.kt +++ b/trakt-api/implementation/src/commonMain/kotlin/com/thomaskioko/trakt/service/implementation/api/DefaultTraktTokenRemoteDataSource.kt @@ -1,6 +1,6 @@ -package com.thomaskioko.trakt.service.implementation +package com.thomaskioko.trakt.service.implementation.api -import com.thomaskioko.trakt.service.implementation.inject.TraktHttpClient +import com.thomaskioko.trakt.service.implementation.TraktHttpClient import com.thomaskioko.tvmaniac.core.base.model.Configs import com.thomaskioko.tvmaniac.trakt.api.TraktTokenRemoteDataSource import com.thomaskioko.tvmaniac.trakt.api.model.AccessTokenBody @@ -11,9 +11,14 @@ import io.ktor.client.call.body import io.ktor.client.request.post import io.ktor.client.request.setBody import me.tatarka.inject.annotations.Inject +import software.amazon.lastmile.kotlin.inject.anvil.AppScope +import software.amazon.lastmile.kotlin.inject.anvil.ContributesBinding +import software.amazon.lastmile.kotlin.inject.anvil.SingleIn @Inject -class TraktTokenRemoteDataSourceImpl( +@SingleIn(AppScope::class) +@ContributesBinding(AppScope::class) +class DefaultTraktTokenRemoteDataSource( private val configs: Configs, private val httpClient: TraktHttpClient, ) : TraktTokenRemoteDataSource { diff --git a/trakt-api/implementation/src/commonMain/kotlin/com/thomaskioko/trakt/service/implementation/TraktUserRemoteDataSourceImpl.kt b/trakt-api/implementation/src/commonMain/kotlin/com/thomaskioko/trakt/service/implementation/api/DefaultTraktUserRemoteDataSource.kt similarity index 70% rename from trakt-api/implementation/src/commonMain/kotlin/com/thomaskioko/trakt/service/implementation/TraktUserRemoteDataSourceImpl.kt rename to trakt-api/implementation/src/commonMain/kotlin/com/thomaskioko/trakt/service/implementation/api/DefaultTraktUserRemoteDataSource.kt index b8fdaa4b3..635c7dbb7 100644 --- a/trakt-api/implementation/src/commonMain/kotlin/com/thomaskioko/trakt/service/implementation/TraktUserRemoteDataSourceImpl.kt +++ b/trakt-api/implementation/src/commonMain/kotlin/com/thomaskioko/trakt/service/implementation/api/DefaultTraktUserRemoteDataSource.kt @@ -1,6 +1,6 @@ -package com.thomaskioko.trakt.service.implementation +package com.thomaskioko.trakt.service.implementation.api -import com.thomaskioko.trakt.service.implementation.inject.TraktHttpClient +import com.thomaskioko.trakt.service.implementation.TraktHttpClient import com.thomaskioko.tvmaniac.core.networkutil.model.ApiResponse import com.thomaskioko.tvmaniac.core.networkutil.model.safeRequest import com.thomaskioko.tvmaniac.trakt.api.TraktUserRemoteDataSource @@ -12,9 +12,14 @@ import io.ktor.client.request.parameter import io.ktor.http.HttpMethod import io.ktor.http.path import me.tatarka.inject.annotations.Inject +import software.amazon.lastmile.kotlin.inject.anvil.AppScope +import software.amazon.lastmile.kotlin.inject.anvil.ContributesBinding +import software.amazon.lastmile.kotlin.inject.anvil.SingleIn @Inject -class TraktUserRemoteDataSourceImpl( +@SingleIn(AppScope::class) +@ContributesBinding(AppScope::class) +class DefaultTraktUserRemoteDataSource( private val httpClient: TraktHttpClient, ) : TraktUserRemoteDataSource { diff --git a/trakt-api/implementation/src/commonMain/kotlin/com/thomaskioko/trakt/service/implementation/inject/TraktComponent.kt b/trakt-api/implementation/src/commonMain/kotlin/com/thomaskioko/trakt/service/implementation/inject/TraktComponent.kt deleted file mode 100644 index 89ac96cc1..000000000 --- a/trakt-api/implementation/src/commonMain/kotlin/com/thomaskioko/trakt/service/implementation/inject/TraktComponent.kt +++ /dev/null @@ -1,64 +0,0 @@ -package com.thomaskioko.trakt.service.implementation.inject - -import com.thomaskioko.trakt.service.implementation.TraktListRemoteDataSourceImpl -import com.thomaskioko.trakt.service.implementation.TraktTokenRemoteDataSourceImpl -import com.thomaskioko.trakt.service.implementation.TraktUserRemoteDataSourceImpl -import com.thomaskioko.trakt.service.implementation.traktHttpClient -import com.thomaskioko.tvmaniac.core.base.annotations.ApplicationScope -import com.thomaskioko.tvmaniac.core.base.model.Configs -import com.thomaskioko.tvmaniac.core.logger.KermitLogger -import com.thomaskioko.tvmaniac.trakt.api.TraktListRemoteDataSource -import com.thomaskioko.tvmaniac.trakt.api.TraktTokenRemoteDataSource -import com.thomaskioko.tvmaniac.trakt.api.TraktUserRemoteDataSource -import io.ktor.client.HttpClient -import kotlinx.serialization.json.Json -import me.tatarka.inject.annotations.Provides - -typealias TraktHttpClient = HttpClient - -typealias TraktJson = Json - -interface TraktComponent : TraktPlatformComponent { - - @ApplicationScope - @Provides - fun provideJson(): TraktJson = Json { - ignoreUnknownKeys = true - prettyPrint = true - encodeDefaults = true - } - - @ApplicationScope - @Provides - fun provideHttpClient( - configs: Configs, - json: TraktJson, - httpClientEngine: TraktHttpClientEngine, - logger: KermitLogger, - ): TraktHttpClient = - traktHttpClient( - isDebug = configs.isDebug, - traktClientId = configs.traktClientId, - json = json, - httpClientEngine = httpClientEngine, - kermitLogger = logger, - ) - - @ApplicationScope - @Provides - fun provideTraktListRemoteDataSource( - bind: TraktListRemoteDataSourceImpl, - ): TraktListRemoteDataSource = bind - - @ApplicationScope - @Provides - fun provideTraktTokenRemoteDataSource( - bind: TraktTokenRemoteDataSourceImpl, - ): TraktTokenRemoteDataSource = bind - - @ApplicationScope - @Provides - fun provideTraktUserRemoteDataSource( - bind: TraktUserRemoteDataSourceImpl, - ): TraktUserRemoteDataSource = bind -} diff --git a/trakt-api/implementation/src/commonMain/kotlin/com/thomaskioko/trakt/service/implementation/inject/TraktPlatformComponent.kt b/trakt-api/implementation/src/commonMain/kotlin/com/thomaskioko/trakt/service/implementation/inject/TraktPlatformComponent.kt deleted file mode 100644 index 7aac55fb4..000000000 --- a/trakt-api/implementation/src/commonMain/kotlin/com/thomaskioko/trakt/service/implementation/inject/TraktPlatformComponent.kt +++ /dev/null @@ -1,7 +0,0 @@ -package com.thomaskioko.trakt.service.implementation.inject - -import io.ktor.client.engine.HttpClientEngine - -typealias TraktHttpClientEngine = HttpClientEngine - -expect interface TraktPlatformComponent diff --git a/trakt-api/implementation/src/iosMain/kotlin/com/thomaskioko/trakt/service/implementation/TraktPlatformComponent.kt b/trakt-api/implementation/src/iosMain/kotlin/com/thomaskioko/trakt/service/implementation/TraktPlatformComponent.kt new file mode 100644 index 000000000..56923212e --- /dev/null +++ b/trakt-api/implementation/src/iosMain/kotlin/com/thomaskioko/trakt/service/implementation/TraktPlatformComponent.kt @@ -0,0 +1,13 @@ +package com.thomaskioko.trakt.service.implementation + +import io.ktor.client.engine.darwin.Darwin +import me.tatarka.inject.annotations.Provides +import software.amazon.lastmile.kotlin.inject.anvil.AppScope +import software.amazon.lastmile.kotlin.inject.anvil.ContributesTo + +@ContributesTo(AppScope::class) +interface TraktPlatformComponent { + + @Provides + fun provideTraktHttpClientEngine(): TraktHttpClientEngine = Darwin.create() +} diff --git a/trakt-api/implementation/src/iosMain/kotlin/com/thomaskioko/trakt/service/implementation/inject/TraktPlatformComponent.kt b/trakt-api/implementation/src/iosMain/kotlin/com/thomaskioko/trakt/service/implementation/inject/TraktPlatformComponent.kt deleted file mode 100644 index 9cd48db51..000000000 --- a/trakt-api/implementation/src/iosMain/kotlin/com/thomaskioko/trakt/service/implementation/inject/TraktPlatformComponent.kt +++ /dev/null @@ -1,12 +0,0 @@ -package com.thomaskioko.trakt.service.implementation.inject - -import com.thomaskioko.tvmaniac.core.base.annotations.ApplicationScope -import io.ktor.client.engine.darwin.Darwin -import me.tatarka.inject.annotations.Provides - -actual interface TraktPlatformComponent { - - @ApplicationScope - @Provides - fun provideTraktHttpClientEngine(): TraktHttpClientEngine = Darwin.create() -} diff --git a/trakt-api/implementation/src/jvmMain/kotlin/com/thomaskioko/trakt/service/implementation/inject/TraktPlatformComponent.kt b/trakt-api/implementation/src/jvmMain/kotlin/com/thomaskioko/trakt/service/implementation/inject/TraktPlatformComponent.kt deleted file mode 100644 index 7813e0456..000000000 --- a/trakt-api/implementation/src/jvmMain/kotlin/com/thomaskioko/trakt/service/implementation/inject/TraktPlatformComponent.kt +++ /dev/null @@ -1,3 +0,0 @@ -package com.thomaskioko.trakt.service.implementation.inject - -actual interface TraktPlatformComponent diff --git a/trakt-auth/implementation/build.gradle.kts b/trakt-auth/implementation/build.gradle.kts index f4bdc70fc..53472ec2c 100644 --- a/trakt-auth/implementation/build.gradle.kts +++ b/trakt-auth/implementation/build.gradle.kts @@ -23,7 +23,7 @@ kotlin { implementation(projects.core.base) implementation(projects.core.logger) implementation(projects.traktAuth.api) - implementation(libs.kotlinInject.runtime) + implementation(libs.bundles.kotlinInject) } } } @@ -32,3 +32,4 @@ kotlin { android { namespace = "com.thomaskioko.tvmaniac.traktauth.implementation" } addKspDependencyForAllTargets(libs.kotlinInject.compiler) +addKspDependencyForAllTargets(libs.kotlinInject.anvil.compiler) diff --git a/trakt-auth/implementation/src/androidMain/kotlin/com/thomaskioko/tvmaniac/traktauth/implementation/DefaultTraktAuthManager.kt b/trakt-auth/implementation/src/androidMain/kotlin/com/thomaskioko/tvmaniac/traktauth/implementation/DefaultTraktAuthManager.kt index b1348c103..8da7a55b3 100644 --- a/trakt-auth/implementation/src/androidMain/kotlin/com/thomaskioko/tvmaniac/traktauth/implementation/DefaultTraktAuthManager.kt +++ b/trakt-auth/implementation/src/androidMain/kotlin/com/thomaskioko/tvmaniac/traktauth/implementation/DefaultTraktAuthManager.kt @@ -2,6 +2,7 @@ package com.thomaskioko.tvmaniac.traktauth.implementation import androidx.activity.ComponentActivity import androidx.activity.result.ActivityResultLauncher +import com.thomaskioko.tvmaniac.core.base.annotations.ActivityScope import com.thomaskioko.tvmaniac.core.logger.KermitLogger import com.thomaskioko.tvmaniac.traktauth.api.TraktAuthManager import com.thomaskioko.tvmaniac.traktauth.api.TraktAuthRepository @@ -9,9 +10,13 @@ import me.tatarka.inject.annotations.Inject import net.openid.appauth.AuthState import net.openid.appauth.AuthorizationService import net.openid.appauth.ClientAuthentication +import software.amazon.lastmile.kotlin.inject.anvil.ContributesBinding +import software.amazon.lastmile.kotlin.inject.anvil.SingleIn @Inject -actual class DefaultTraktAuthManager( +@SingleIn(ActivityScope::class) +@ContributesBinding(ActivityScope::class) +class DefaultTraktAuthManager( private val activity: ComponentActivity, private val traktActivityResultContract: TraktActivityResultContract, private val traktAuthRepository: TraktAuthRepository, @@ -22,7 +27,7 @@ actual class DefaultTraktAuthManager( private lateinit var launcher: ActivityResultLauncher - actual override fun registerResult() { + override fun registerResult() { launcher = activity.registerForActivityResult(traktActivityResultContract) { result -> if (result != null) { @@ -31,7 +36,7 @@ actual class DefaultTraktAuthManager( } } - actual override fun launchWebView() = launcher.launch(Unit) + override fun launchWebView() = launcher.launch(Unit) private fun onLoginResult(result: TraktActivityResultContract.Result) { val (response, error) = result diff --git a/trakt-auth/implementation/src/androidMain/kotlin/com/thomaskioko/tvmaniac/traktauth/implementation/TraktAuthComponent.kt b/trakt-auth/implementation/src/androidMain/kotlin/com/thomaskioko/tvmaniac/traktauth/implementation/TraktAuthAndroidComponent.kt similarity index 71% rename from trakt-auth/implementation/src/androidMain/kotlin/com/thomaskioko/tvmaniac/traktauth/implementation/TraktAuthComponent.kt rename to trakt-auth/implementation/src/androidMain/kotlin/com/thomaskioko/tvmaniac/traktauth/implementation/TraktAuthAndroidComponent.kt index 21179d33d..dacb93cea 100644 --- a/trakt-auth/implementation/src/androidMain/kotlin/com/thomaskioko/tvmaniac/traktauth/implementation/TraktAuthComponent.kt +++ b/trakt-auth/implementation/src/androidMain/kotlin/com/thomaskioko/tvmaniac/traktauth/implementation/TraktAuthAndroidComponent.kt @@ -3,7 +3,7 @@ package com.thomaskioko.tvmaniac.traktauth.implementation import android.app.Application import android.net.Uri import androidx.core.net.toUri -import com.thomaskioko.tvmaniac.core.base.annotations.ApplicationScope +import com.thomaskioko.tvmaniac.core.base.annotations.ActivityScope import com.thomaskioko.tvmaniac.core.base.model.Configs import me.tatarka.inject.annotations.Provides import net.openid.appauth.AuthorizationRequest @@ -12,11 +12,14 @@ import net.openid.appauth.AuthorizationServiceConfiguration import net.openid.appauth.ClientAuthentication import net.openid.appauth.ClientSecretBasic import net.openid.appauth.ResponseTypeValues +import software.amazon.lastmile.kotlin.inject.anvil.ContributesTo +import software.amazon.lastmile.kotlin.inject.anvil.SingleIn -interface TraktAuthComponent { +@ContributesTo(ActivityScope::class) +interface TraktAuthAndroidComponent { - @ApplicationScope @Provides + @SingleIn(ActivityScope::class) fun provideAuthConfig(): AuthorizationServiceConfiguration { return AuthorizationServiceConfiguration( Uri.parse("https://trakt.tv/oauth/authorize"), @@ -25,26 +28,27 @@ interface TraktAuthComponent { } @Provides + @SingleIn(ActivityScope::class) fun provideAuthRequest( configuration: AuthorizationServiceConfiguration, configs: Configs, ): AuthorizationRequest = AuthorizationRequest.Builder( - configuration, - configs.traktClientId, - ResponseTypeValues.CODE, - configs.traktRedirectUri.toUri(), - ) + configuration, + configs.traktClientId, + ResponseTypeValues.CODE, + configs.traktRedirectUri.toUri(), + ) .apply { setCodeVerifier(null) } .build() - @ApplicationScope @Provides fun provideClientAuth(configs: Configs): ClientAuthentication = ClientSecretBasic(configs.traktClientSecret) - @ApplicationScope @Provides + @SingleIn(ActivityScope::class) fun provideAuthorizationService(application: Application): AuthorizationService = AuthorizationService(application) + } diff --git a/trakt-auth/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/traktauth/implementation/DefaultTraktAuthManager.kt b/trakt-auth/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/traktauth/implementation/DefaultTraktAuthManager.kt deleted file mode 100644 index d4ca1ffab..000000000 --- a/trakt-auth/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/traktauth/implementation/DefaultTraktAuthManager.kt +++ /dev/null @@ -1,10 +0,0 @@ -package com.thomaskioko.tvmaniac.traktauth.implementation - -import com.thomaskioko.tvmaniac.traktauth.api.TraktAuthManager - -expect class DefaultTraktAuthManager : TraktAuthManager { - - override fun launchWebView() - - override fun registerResult() -} diff --git a/trakt-auth/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/traktauth/implementation/TraktAuthRepositoryImpl.kt b/trakt-auth/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/traktauth/implementation/DefaultTraktAuthRepository.kt similarity index 86% rename from trakt-auth/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/traktauth/implementation/TraktAuthRepositoryImpl.kt rename to trakt-auth/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/traktauth/implementation/DefaultTraktAuthRepository.kt index f16c47402..c50758c6d 100644 --- a/trakt-auth/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/traktauth/implementation/TraktAuthRepositoryImpl.kt +++ b/trakt-auth/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/traktauth/implementation/DefaultTraktAuthRepository.kt @@ -12,9 +12,14 @@ import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import me.tatarka.inject.annotations.Inject +import software.amazon.lastmile.kotlin.inject.anvil.AppScope +import software.amazon.lastmile.kotlin.inject.anvil.ContributesBinding +import software.amazon.lastmile.kotlin.inject.anvil.SingleIn @Inject -class TraktAuthRepositoryImpl( +@SingleIn(AppScope::class) +@ContributesBinding(AppScope::class) +class DefaultTraktAuthRepository( private val datastoreRepository: DatastoreRepository, private val dispatchers: AppCoroutineDispatchers, ) : TraktAuthRepository { diff --git a/trakt-auth/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/traktauth/implementation/TraktAuthManagerComponent.kt b/trakt-auth/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/traktauth/implementation/TraktAuthManagerComponent.kt deleted file mode 100644 index afa045fd0..000000000 --- a/trakt-auth/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/traktauth/implementation/TraktAuthManagerComponent.kt +++ /dev/null @@ -1,12 +0,0 @@ -package com.thomaskioko.tvmaniac.traktauth.implementation - -import com.thomaskioko.tvmaniac.core.base.annotations.ActivityScope -import com.thomaskioko.tvmaniac.traktauth.api.TraktAuthManager -import me.tatarka.inject.annotations.Provides - -interface TraktAuthManagerComponent { - - @ActivityScope - @Provides - fun provideTraktAuthManager(bind: DefaultTraktAuthManager): TraktAuthManager = bind -} diff --git a/trakt-auth/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/traktauth/implementation/TraktAuthenticationComponent.kt b/trakt-auth/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/traktauth/implementation/TraktAuthenticationComponent.kt deleted file mode 100644 index a4f66884d..000000000 --- a/trakt-auth/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/traktauth/implementation/TraktAuthenticationComponent.kt +++ /dev/null @@ -1,12 +0,0 @@ -package com.thomaskioko.tvmaniac.traktauth.implementation - -import com.thomaskioko.tvmaniac.core.base.annotations.ApplicationScope -import com.thomaskioko.tvmaniac.traktauth.api.TraktAuthRepository -import me.tatarka.inject.annotations.Provides - -interface TraktAuthenticationComponent { - - @ApplicationScope - @Provides - fun provideTraktAuthRepository(bind: TraktAuthRepositoryImpl): TraktAuthRepository = bind -} diff --git a/trakt-auth/implementation/src/iosMain/kotlin/com/thomaskioko/tvmaniac/traktauth/implementation/DefaultIOSTraktAuthManager.kt b/trakt-auth/implementation/src/iosMain/kotlin/com/thomaskioko/tvmaniac/traktauth/implementation/DefaultIOSTraktAuthManager.kt new file mode 100644 index 000000000..bccce6c5e --- /dev/null +++ b/trakt-auth/implementation/src/iosMain/kotlin/com/thomaskioko/tvmaniac/traktauth/implementation/DefaultIOSTraktAuthManager.kt @@ -0,0 +1,20 @@ +package com.thomaskioko.tvmaniac.traktauth.implementation + +import com.thomaskioko.tvmaniac.traktauth.api.TraktAuthManager +import me.tatarka.inject.annotations.Inject +import software.amazon.lastmile.kotlin.inject.anvil.AppScope +import software.amazon.lastmile.kotlin.inject.anvil.ContributesBinding +import software.amazon.lastmile.kotlin.inject.anvil.SingleIn + +@Inject +@SingleIn(AppScope::class) +@ContributesBinding(AppScope::class) +class DefaultIOSTraktAuthManager : TraktAuthManager { + + override fun launchWebView() { + } + + override fun registerResult() { + } + +} diff --git a/trakt-auth/implementation/src/iosMain/kotlin/com/thomaskioko/tvmaniac/traktauth/implementation/DefaultTraktAuthManager.kt b/trakt-auth/implementation/src/iosMain/kotlin/com/thomaskioko/tvmaniac/traktauth/implementation/DefaultTraktAuthManager.kt deleted file mode 100644 index 721130947..000000000 --- a/trakt-auth/implementation/src/iosMain/kotlin/com/thomaskioko/tvmaniac/traktauth/implementation/DefaultTraktAuthManager.kt +++ /dev/null @@ -1,17 +0,0 @@ -package com.thomaskioko.tvmaniac.traktauth.implementation - -import com.thomaskioko.tvmaniac.traktauth.api.TraktAuthManager -import me.tatarka.inject.annotations.Inject - -// TODO:: Replace with actual typealias. See https://youtrack.jetbrains.com/issue/KT-61573 -@Inject -actual class DefaultTraktAuthManager : TraktAuthManager { - - actual override fun launchWebView() { - // NO OP - } - - actual override fun registerResult() { - // NO OP - } -} diff --git a/trakt-auth/implementation/src/jvmMain/kotlin/com/thomaskioko/tvmaniac/traktauth/implementation/DefaultTraktAuthManager.kt b/trakt-auth/implementation/src/jvmMain/kotlin/com/thomaskioko/tvmaniac/traktauth/implementation/DefaultTraktAuthManager.kt deleted file mode 100644 index 4603b04fa..000000000 --- a/trakt-auth/implementation/src/jvmMain/kotlin/com/thomaskioko/tvmaniac/traktauth/implementation/DefaultTraktAuthManager.kt +++ /dev/null @@ -1,15 +0,0 @@ -package com.thomaskioko.tvmaniac.traktauth.implementation - -import com.thomaskioko.tvmaniac.traktauth.api.TraktAuthManager -import me.tatarka.inject.annotations.Inject - -@Inject -actual class DefaultTraktAuthManager : TraktAuthManager { - actual override fun launchWebView() { - // NO OP - } - - actual override fun registerResult() { - // NO OP - } -}