From 0d082afdd79c69f2d699650e00b10fd18d67c6e5 Mon Sep 17 00:00:00 2001 From: Santiago Mattiauda Date: Tue, 11 Feb 2025 21:20:48 -0300 Subject: [PATCH 01/10] [poc] kotzilla plugin --- .gitignore | 1 + app/build.gradle.kts | 2 ++ app/src/main/AndroidManifest.xml | 23 ++++++++++++++++--- .../santimattius/template/MainApplication.kt | 2 ++ .../template/koin/KoinInitializer.kt | 11 +++++++++ .../template/koin/KotzillaInitializer.kt | 15 ++++++++++++ build.gradle.kts | 1 + 7 files changed, 52 insertions(+), 3 deletions(-) create mode 100644 app/src/main/java/com/santimattius/template/koin/KoinInitializer.kt create mode 100644 app/src/main/java/com/santimattius/template/koin/KotzillaInitializer.kt diff --git a/.gitignore b/.gitignore index 73b4ff2..af33ba9 100644 --- a/.gitignore +++ b/.gitignore @@ -15,3 +15,4 @@ local.properties /.kotlin/ /.idea/ +/app/kotzilla.json \ No newline at end of file diff --git a/app/build.gradle.kts b/app/build.gradle.kts index ffdfd69..74a68d4 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -8,6 +8,7 @@ plugins { alias(libs.plugins.detekt) alias(libs.plugins.google.secrets.gradle.plugin) alias(libs.plugins.automattic.measure.builds) + id("io.kotzilla.kotzilla-plugin") } apply("$rootDir/gradle/report.gradle") @@ -147,6 +148,7 @@ dependencies { implementation(libs.koin.android) implementation(libs.koin.androidx.compose) implementation(libs.koin.androidx.startup) + implementation("io.kotzilla:kotzilla-sdk:0.13.6") compileOnly(libs.koin.annotations.core) ksp(libs.koin.annotations.compiler) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 9374963..42c89c9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,5 +1,6 @@ - + @@ -12,6 +13,22 @@ android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/Theme.EntertainmentApp"> + + + + + + + android:exported="true" + android:label="@string/title_activity_home_view" /> \ No newline at end of file diff --git a/app/src/main/java/com/santimattius/template/MainApplication.kt b/app/src/main/java/com/santimattius/template/MainApplication.kt index 552e0c5..9bf0beb 100644 --- a/app/src/main/java/com/santimattius/template/MainApplication.kt +++ b/app/src/main/java/com/santimattius/template/MainApplication.kt @@ -1,6 +1,7 @@ package com.santimattius.template import android.app.Application +import io.kotzilla.sdk.analytics.koin.analyticsLogger import org.koin.android.ext.koin.androidContext import org.koin.android.logger.AndroidLogger import org.koin.androix.startup.KoinStartup @@ -15,6 +16,7 @@ class MainApplication : Application(), KoinStartup { override fun onKoinStartup(): KoinConfiguration { return KoinConfiguration { androidContext(this@MainApplication) + analyticsLogger() logger(AndroidLogger()) modules( com_santimattius_template_di_DataModule, diff --git a/app/src/main/java/com/santimattius/template/koin/KoinInitializer.kt b/app/src/main/java/com/santimattius/template/koin/KoinInitializer.kt new file mode 100644 index 0000000..450d395 --- /dev/null +++ b/app/src/main/java/com/santimattius/template/koin/KoinInitializer.kt @@ -0,0 +1,11 @@ +package com.santimattius.template.koin + +import androidx.startup.Initializer +import org.koin.core.Koin +import org.koin.androix.startup.KoinInitializer as KoinOriginalInitializer + +class KoinInitializer : Initializer by KoinOriginalInitializer() { + override fun dependencies(): MutableList>> { + return mutableListOf(KotzillaInitializer::class.java) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/santimattius/template/koin/KotzillaInitializer.kt b/app/src/main/java/com/santimattius/template/koin/KotzillaInitializer.kt new file mode 100644 index 0000000..1cafc8c --- /dev/null +++ b/app/src/main/java/com/santimattius/template/koin/KotzillaInitializer.kt @@ -0,0 +1,15 @@ +package com.santimattius.template.koin + +import android.content.Context +import androidx.startup.Initializer +import io.kotzilla.sdk.KotzillaSDK + +class KotzillaInitializer : Initializer { + override fun create(context: Context) { + KotzillaSDK.setup(context) + } + + override fun dependencies(): List>> { + return emptyList() + } +} \ No newline at end of file diff --git a/build.gradle.kts b/build.gradle.kts index 7c820fd..24cb70e 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -14,5 +14,6 @@ plugins { buildscript { dependencies { classpath(libs.dep.google.secrets.gradle.plugin) + classpath("io.kotzilla:kotzilla-plugin:0.13.6") } } \ No newline at end of file From bd8e8aeb7ca6ff4f0d0163d41b40aa24ee19bfce Mon Sep 17 00:00:00 2001 From: Santiago Mattiauda Date: Wed, 12 Feb 2025 20:38:08 -0300 Subject: [PATCH 02/10] [improvement] kotzilla plugin init --- app/src/main/AndroidManifest.xml | 19 +------------------ .../santimattius/template/MainApplication.kt | 3 ++- .../template/koin/KoinInitializer.kt | 11 ----------- .../template/koin/KotzillaInitializer.kt | 15 --------------- 4 files changed, 3 insertions(+), 45 deletions(-) delete mode 100644 app/src/main/java/com/santimattius/template/koin/KoinInitializer.kt delete mode 100644 app/src/main/java/com/santimattius/template/koin/KotzillaInitializer.kt diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 42c89c9..8210655 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,6 +1,5 @@ - + @@ -13,22 +12,6 @@ android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/Theme.EntertainmentApp"> - - - - - - by KoinOriginalInitializer() { - override fun dependencies(): MutableList>> { - return mutableListOf(KotzillaInitializer::class.java) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/santimattius/template/koin/KotzillaInitializer.kt b/app/src/main/java/com/santimattius/template/koin/KotzillaInitializer.kt deleted file mode 100644 index 1cafc8c..0000000 --- a/app/src/main/java/com/santimattius/template/koin/KotzillaInitializer.kt +++ /dev/null @@ -1,15 +0,0 @@ -package com.santimattius.template.koin - -import android.content.Context -import androidx.startup.Initializer -import io.kotzilla.sdk.KotzillaSDK - -class KotzillaInitializer : Initializer { - override fun create(context: Context) { - KotzillaSDK.setup(context) - } - - override fun dependencies(): List>> { - return emptyList() - } -} \ No newline at end of file From db687be7a1f25a4d47847e16d513c75093287e3f Mon Sep 17 00:00:00 2001 From: Santiago Mattiauda Date: Thu, 24 Jul 2025 20:44:32 -0300 Subject: [PATCH 03/10] [improvement] update poc --- .../santimattius/template/MainApplication.kt | 3 +- .../ui/compose/HomeComposeActivity.kt | 7 ++- .../template/ui/xml/components/Extensions.kt | 8 +-- gradle/libs.versions.toml | 50 +++++++++---------- gradle/wrapper/gradle-wrapper.properties | 2 +- 5 files changed, 37 insertions(+), 33 deletions(-) diff --git a/app/src/main/java/com/santimattius/template/MainApplication.kt b/app/src/main/java/com/santimattius/template/MainApplication.kt index 8c5d200..6835de0 100644 --- a/app/src/main/java/com/santimattius/template/MainApplication.kt +++ b/app/src/main/java/com/santimattius/template/MainApplication.kt @@ -1,6 +1,7 @@ package com.santimattius.template import android.app.Application +import android.util.Log import io.kotzilla.sdk.analytics.koin.analytics import io.kotzilla.sdk.analytics.koin.analyticsLogger import org.koin.android.ext.koin.androidContext @@ -15,10 +16,10 @@ import org.koin.ksp.generated.defaultModule @OptIn(KoinExperimentalAPI::class) class MainApplication : Application(), KoinStartup { override fun onKoinStartup(): KoinConfiguration { + Log.d(this::class.simpleName, "onKoinStartup: ${Thread.currentThread().name}") return KoinConfiguration { androidContext(this@MainApplication) analytics(this@MainApplication) - logger(AndroidLogger()) modules( com_santimattius_template_di_DataModule, com_santimattius_template_di_AppModule, diff --git a/app/src/main/java/com/santimattius/template/ui/compose/HomeComposeActivity.kt b/app/src/main/java/com/santimattius/template/ui/compose/HomeComposeActivity.kt index a66cd77..5f81acd 100644 --- a/app/src/main/java/com/santimattius/template/ui/compose/HomeComposeActivity.kt +++ b/app/src/main/java/com/santimattius/template/ui/compose/HomeComposeActivity.kt @@ -39,9 +39,12 @@ import com.santimattius.template.ui.compose.ui.components.snackbar.SnackBarVisua import com.santimattius.template.ui.compose.ui.theme.AndroidTestingTheme import com.santimattius.template.ui.xml.home.HomeViewActivity import org.koin.androidx.compose.koinViewModel +import org.koin.androidx.viewmodel.ext.android.viewModel class HomeComposeActivity : ComponentActivity() { + val viewModel: HomeComposeViewModel by viewModel() + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { @@ -50,7 +53,7 @@ class HomeComposeActivity : ComponentActivity() { modifier = Modifier.fillMaxSize(), color = MaterialTheme.colorScheme.background ) { - HomeRoute() + HomeRoute(viewModel) } } } @@ -59,7 +62,7 @@ class HomeComposeActivity : ComponentActivity() { @Composable fun HomeRoute( - viewModel: HomeComposeViewModel = koinViewModel() + viewModel: HomeComposeViewModel ) { val snackBarHostState = remember { SnackbarHostState() } Scaffold( diff --git a/app/src/main/java/com/santimattius/template/ui/xml/components/Extensions.kt b/app/src/main/java/com/santimattius/template/ui/xml/components/Extensions.kt index a827025..17e146d 100644 --- a/app/src/main/java/com/santimattius/template/ui/xml/components/Extensions.kt +++ b/app/src/main/java/com/santimattius/template/ui/xml/components/Extensions.kt @@ -55,7 +55,7 @@ fun ImageView.load(url: String, onComplete: () -> Unit = {}) { override fun onLoadFailed( e: GlideException?, model: Any?, - target: Target?, + target: Target, isFirstResource: Boolean, ): Boolean { onComplete() @@ -63,10 +63,10 @@ fun ImageView.load(url: String, onComplete: () -> Unit = {}) { } override fun onResourceReady( - resource: Drawable?, - model: Any?, + resource: Drawable, + model: Any, target: Target?, - dataSource: DataSource?, + dataSource: DataSource, isFirstResource: Boolean, ): Boolean { onComplete() diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 2fdab18..71131d1 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,37 +1,37 @@ [versions] # Plugins -androidGradlePlugin = "8.8.0" -hamcrest = "2.2" -kotlin = "2.1.10" -detektGradlePlugin = "1.23.7" -ksp = "2.1.10-1.0.29" +androidGradlePlugin = "8.11.1" +hamcrest = "3.0" +kotlin = "2.2.0" +detektGradlePlugin = "1.23.8" +ksp = "2.2.0-2.0.2" googleSecretsPlugin = "2.0.1" -automatticMeasureBuilds = "3.1.1" +automatticMeasureBuilds = "3.2.1" # Define the dependency versions -coreKtx = "1.15.0" +coreKtx = "1.16.0" legacySupport = "1.0.0" -appCompat = "1.7.0" -fragmentKtx = "1.8.5" -constraintLayout = "2.2.0" +appCompat = "1.7.1" +fragmentKtx = "1.8.8" +constraintLayout = "2.2.1" recyclerView = "1.4.0" materialVersion = "1.12.0" -lifecycle = "2.9.0-alpha09" +lifecycle = "2.9.2" -retrofit = "2.11.0" -okHttp = "4.12.0" +retrofit = "3.0.0" +okHttp = "5.1.0" -coroutine = "1.10.1" -gson = "2.11.0" -glide = "4.12.0" +coroutine = "1.10.2" +gson = "2.13.1" +glide = "4.16.0" coil = "2.7.0" -room = "2.6.1" +room = "2.7.2" -androidxComposeBom = "2025.01.01" -activityCompose = "1.10.0" +androidxComposeBom = "2025.07.00" +activityCompose = "1.10.1" -koinBom = "4.1.0-Beta5" -koinAnnotations = "2.0.0-RC1" +koinBom = "4.1.0" +koinAnnotations = "2.1.0" #Testing junit = "4.13.2" @@ -44,10 +44,10 @@ fragmentTesting = "1.8.5" espressoCore = "3.6.1" okhttp3IdlingResource = "1.0.0" -mockk = "1.12.3" -robolectric = "4.12.2" -turbine = "0.12.3" -mockitoKotlin = "5.4.0" +mockk = "1.14.5" +robolectric = "4.15.1" +turbine = "1.2.1" +mockitoKotlin = "6.0.0" [libraries] # Define the libraries diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 349ffa5..fc48e3a 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-all.zip From 299cf53191fa885bd0e0b7fad909007cf400c713 Mon Sep 17 00:00:00 2001 From: Santiago Mattiauda Date: Sat, 30 Aug 2025 14:15:12 -0300 Subject: [PATCH 04/10] [improvement] update branch --- core/build.gradle.kts | 7 +------ gradle.properties | 12 ++++++------ gradle/libs.versions.toml | 30 +++++++++++++++--------------- gradle/report.gradle | 4 ---- shared-test/build.gradle.kts | 2 +- 5 files changed, 23 insertions(+), 32 deletions(-) diff --git a/core/build.gradle.kts b/core/build.gradle.kts index 469e6f4..74f026a 100644 --- a/core/build.gradle.kts +++ b/core/build.gradle.kts @@ -9,7 +9,7 @@ apply("$rootDir/gradle/report.gradle") android { namespace = "com.santimattius.core" - compileSdk = 35 + compileSdk = 36 defaultConfig { minSdk = 24 @@ -43,11 +43,6 @@ android { isReturnDefaultValues = true isIncludeAndroidResources = true } - unitTests.all { - testCoverage { - version = "0.8.8" - } - } } libraryVariants.forEach { variant -> diff --git a/gradle.properties b/gradle.properties index 61f4b93..f237e40 100644 --- a/gradle.properties +++ b/gradle.properties @@ -19,13 +19,13 @@ android.useAndroidX=true android.enableJetifier=true # Kotlin code style for this project: "official" or "obsolete": kotlin.code.style=official +#Android +android.defaults.buildfeatures.buildconfig=true +android.nonTransitiveRClass=false +android.nonFinalResIds=false ## Project application_id=com.santimattius.entertainment -build_tools_version=30.0.3 min_sdk_version=24 -target_sdk_version=35 +target_sdk_version=36 version_code=1 -version_name=1.0 -android.defaults.buildfeatures.buildconfig=true -android.nonTransitiveRClass=false -android.nonFinalResIds=false \ No newline at end of file +version_name=1.0 \ No newline at end of file diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 71131d1..8adc0f3 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,33 +1,33 @@ [versions] # Plugins -androidGradlePlugin = "8.11.1" +androidGradlePlugin = "8.12.2" hamcrest = "3.0" -kotlin = "2.2.0" +kotlin = "2.2.10" detektGradlePlugin = "1.23.8" -ksp = "2.2.0-2.0.2" +ksp = "2.2.10-2.0.2" googleSecretsPlugin = "2.0.1" automatticMeasureBuilds = "3.2.1" # Define the dependency versions -coreKtx = "1.16.0" +coreKtx = "1.17.0" legacySupport = "1.0.0" appCompat = "1.7.1" -fragmentKtx = "1.8.8" +fragmentKtx = "1.8.9" constraintLayout = "2.2.1" recyclerView = "1.4.0" materialVersion = "1.12.0" -lifecycle = "2.9.2" +lifecycle = "2.9.3" retrofit = "3.0.0" okHttp = "5.1.0" coroutine = "1.10.2" gson = "2.13.1" -glide = "4.16.0" +glide = "5.0.0-rc01" coil = "2.7.0" room = "2.7.2" -androidxComposeBom = "2025.07.00" +androidxComposeBom = "2025.08.01" activityCompose = "1.10.1" koinBom = "4.1.0" @@ -35,17 +35,17 @@ koinAnnotations = "2.1.0" #Testing junit = "4.13.2" -junitExt = "1.2.1" -testRunner = "1.6.2" -testRule = "1.6.1" -coreKtxVersion = "1.6.1" +junitExt = "1.3.0" +testRunner = "1.7.0" +testRule = "1.7.0" +coreKtxVersion = "1.7.0" coreTesting = "2.2.0" -fragmentTesting = "1.8.5" -espressoCore = "3.6.1" +fragmentTesting = "1.8.9" +espressoCore = "3.7.0" okhttp3IdlingResource = "1.0.0" mockk = "1.14.5" -robolectric = "4.15.1" +robolectric = "4.16" turbine = "1.2.1" mockitoKotlin = "6.0.0" diff --git a/gradle/report.gradle b/gradle/report.gradle index 5c8b632..5c15c09 100644 --- a/gradle/report.gradle +++ b/gradle/report.gradle @@ -1,9 +1,5 @@ apply plugin: 'jacoco' -jacoco { - toolVersion = "0.8.8" -} - project.afterEvaluate { if (android.hasProperty("applicationVariants")) { android.applicationVariants.all { variant -> diff --git a/shared-test/build.gradle.kts b/shared-test/build.gradle.kts index 68f031e..854e40a 100644 --- a/shared-test/build.gradle.kts +++ b/shared-test/build.gradle.kts @@ -8,7 +8,7 @@ plugins { android { namespace = "com.santimattius.shared_test" - compileSdk = 34 + compileSdk = 36 defaultConfig { minSdk = 24 From bff8ab3cf31746843ed8825e290cf3b5e3179f32 Mon Sep 17 00:00:00 2001 From: Santiago Mattiauda Date: Sat, 30 Aug 2025 15:56:00 -0300 Subject: [PATCH 05/10] [improvement] update branch --- .gitignore | 3 ++- app/build.gradle.kts | 2 +- build.gradle.kts | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index af33ba9..08afcb7 100644 --- a/.gitignore +++ b/.gitignore @@ -15,4 +15,5 @@ local.properties /.kotlin/ /.idea/ -/app/kotzilla.json \ No newline at end of file +/app/kotzilla.json +/app/src/main/assets/kotzilla.key diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 74a68d4..3e1323e 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -148,7 +148,7 @@ dependencies { implementation(libs.koin.android) implementation(libs.koin.androidx.compose) implementation(libs.koin.androidx.startup) - implementation("io.kotzilla:kotzilla-sdk:0.13.6") + implementation("io.kotzilla:kotzilla-sdk:1.2.1") compileOnly(libs.koin.annotations.core) ksp(libs.koin.annotations.compiler) diff --git a/build.gradle.kts b/build.gradle.kts index 24cb70e..de5ab2b 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -14,6 +14,6 @@ plugins { buildscript { dependencies { classpath(libs.dep.google.secrets.gradle.plugin) - classpath("io.kotzilla:kotzilla-plugin:0.13.6") + classpath("io.kotzilla:kotzilla-plugin:1.2.1") } } \ No newline at end of file From a6282c13c788dee1d007771b3a872dba0c084be4 Mon Sep 17 00:00:00 2001 From: Santiago Mattiauda Date: Wed, 3 Sep 2025 21:23:05 -0300 Subject: [PATCH 06/10] [improvement] fixed version --- app/src/main/AndroidManifest.xml | 14 +++++- .../santimattius/template/MainApplication.kt | 3 +- .../com/santimattius/template/di/AppModule.kt | 29 +++++++----- .../santimattius/template/di/DataModule.kt | 8 ++-- .../startup/RetrofitServiceInitializer.kt | 23 ++++++++++ .../ui/compose/HomeComposeActivity.kt | 6 ++- .../ui/compose/HomeComposeViewModel.kt | 2 +- .../data/client/database/TheMovieDataBase.kt | 12 ++++- .../client/network/RetrofitServiceCreator.kt | 46 +++++++++++++++---- gradle.properties | 4 +- 10 files changed, 115 insertions(+), 32 deletions(-) create mode 100644 app/src/main/java/com/santimattius/template/startup/RetrofitServiceInitializer.kt diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 8210655..cc6d54f 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,5 +1,6 @@ - + @@ -12,6 +13,17 @@ android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/Theme.EntertainmentApp"> + + + + + { + + override fun create(context: Context): TheMovieDBService { + return RetrofitServiceCreator.createService( + baseUrl = "https://api.themoviedb.org", + BuildConfig.apiKey) + } + + @OptIn(KoinExperimentalAPI::class) + override fun dependencies(): List?>?> { + return listOf(KoinInitializer::class.java) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/santimattius/template/ui/compose/HomeComposeActivity.kt b/app/src/main/java/com/santimattius/template/ui/compose/HomeComposeActivity.kt index 746fa70..b35d840 100644 --- a/app/src/main/java/com/santimattius/template/ui/compose/HomeComposeActivity.kt +++ b/app/src/main/java/com/santimattius/template/ui/compose/HomeComposeActivity.kt @@ -40,6 +40,7 @@ import com.santimattius.template.ui.compose.ui.components.snackbar.SnackBarVisua import com.santimattius.template.ui.compose.ui.theme.AndroidTestingTheme import com.santimattius.template.ui.xml.home.HomeViewActivity import org.koin.androidx.compose.koinViewModel +import org.koin.androidx.viewmodel.ext.android.viewModel import org.koin.compose.LocalKoinApplication import org.koin.compose.LocalKoinScope import org.koin.core.annotation.KoinInternalApi @@ -47,6 +48,7 @@ import org.koin.mp.KoinPlatformTools class HomeComposeActivity : ComponentActivity() { + private val viewModel: HomeComposeViewModel by viewModel() @OptIn(KoinInternalApi::class) override fun onCreate(savedInstanceState: Bundle?) { @@ -64,7 +66,7 @@ class HomeComposeActivity : ComponentActivity() { modifier = Modifier.fillMaxSize(), color = MaterialTheme.colorScheme.background ) { - HomeRoute() + HomeRoute(viewModel) } } } @@ -74,7 +76,7 @@ class HomeComposeActivity : ComponentActivity() { @Composable fun HomeRoute( - viewModel: HomeComposeViewModel = koinViewModel() + viewModel: HomeComposeViewModel ) { val snackBarHostState = remember { SnackbarHostState() } Scaffold( diff --git a/app/src/main/java/com/santimattius/template/ui/compose/HomeComposeViewModel.kt b/app/src/main/java/com/santimattius/template/ui/compose/HomeComposeViewModel.kt index 31e5d14..0ddc0a9 100644 --- a/app/src/main/java/com/santimattius/template/ui/compose/HomeComposeViewModel.kt +++ b/app/src/main/java/com/santimattius/template/ui/compose/HomeComposeViewModel.kt @@ -29,7 +29,7 @@ class HomeComposeViewModel( if (newMovies != state.movies) { state.copy(movies = newMovies, isLoading = false) } else { - state // Si no ha cambiado nada, retorna el mismo estado + state } }.onStart { movieRepository.refresh() diff --git a/core/src/main/java/com/santimattius/core/data/client/database/TheMovieDataBase.kt b/core/src/main/java/com/santimattius/core/data/client/database/TheMovieDataBase.kt index 4197c26..b04cf97 100644 --- a/core/src/main/java/com/santimattius/core/data/client/database/TheMovieDataBase.kt +++ b/core/src/main/java/com/santimattius/core/data/client/database/TheMovieDataBase.kt @@ -13,7 +13,17 @@ abstract class TheMovieDataBase : RoomDatabase() { private const val DATABASE_NAME = "tmdb_database" - fun get(context: Context) = + /*@Volatile + private var INSTANCE: TheMovieDataBase? = null + + fun get(context: Context) = INSTANCE ?: synchronized(this) { + INSTANCE ?: create(context).also { INSTANCE = it } + } + */ + + fun get(context: Context) = create(context) + + private fun create(context: Context) = Room.databaseBuilder(context, TheMovieDataBase::class.java, DATABASE_NAME) .build() } diff --git a/core/src/main/java/com/santimattius/core/data/client/network/RetrofitServiceCreator.kt b/core/src/main/java/com/santimattius/core/data/client/network/RetrofitServiceCreator.kt index 4d1f1bd..12075f2 100644 --- a/core/src/main/java/com/santimattius/core/data/client/network/RetrofitServiceCreator.kt +++ b/core/src/main/java/com/santimattius/core/data/client/network/RetrofitServiceCreator.kt @@ -5,17 +5,47 @@ import retrofit2.Retrofit import retrofit2.converter.gson.GsonConverterFactory class RetrofitServiceCreator(baseUrl: String, apiKey: String) { - val client = OkHttpClient().newBuilder() - .addInterceptor(RequestInterceptor(apiKey)) - .build() - private val retrofit: Retrofit = Retrofit.Builder() - .baseUrl(baseUrl) - .client(client) - .addConverterFactory(GsonConverterFactory.create()) - .build() + // Use 'by lazy' for client + val client: OkHttpClient by lazy { // <--- Made lazy + OkHttpClient().newBuilder() + .addInterceptor(RequestInterceptor(apiKey)) + .build() + } + + // Use 'by lazy' for retrofit instance + private val retrofit: Retrofit by lazy { // <--- Made lazy + Retrofit.Builder() + .baseUrl(baseUrl) + .client(client) // 'client' will be initialized on first access here + .addConverterFactory(GsonConverterFactory.create()) + .build() + } fun createService(serviceClass: Class): T { return retrofit.create(serviceClass) } + + companion object { + private val services: TheMovieDBService? = null + private var instance: RetrofitServiceCreator? = null + + fun getInstance(baseUrl: String, apiKey: String): RetrofitServiceCreator { + if (instance == null) { + instance = RetrofitServiceCreator(baseUrl, apiKey) + } + return instance!! + } + + + fun createService(baseUrl: String, apiKey: String): TheMovieDBService { + if (services == null) { + return getInstance( + baseUrl, + apiKey, + ).createService(TheMovieDBService::class.java) + } + return services + } + } } \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index f237e40..ee4a0a5 100644 --- a/gradle.properties +++ b/gradle.properties @@ -27,5 +27,5 @@ android.nonFinalResIds=false application_id=com.santimattius.entertainment min_sdk_version=24 target_sdk_version=36 -version_code=1 -version_name=1.0 \ No newline at end of file +version_code=2 +version_name=1.3 \ No newline at end of file From bad703a960ae69b94024fe7f75c9e4fdcecef3a2 Mon Sep 17 00:00:00 2001 From: Santiago Mattiauda Date: Wed, 3 Sep 2025 21:40:51 -0300 Subject: [PATCH 07/10] [improvement] fixed version (#11) --- .idea/compiler.xml | 2 +- app/src/main/AndroidManifest.xml | 11 ----- .../santimattius/template/MainApplication.kt | 4 +- .../com/santimattius/template/di/AppModule.kt | 35 +++------------ .../startup/RetrofitServiceInitializer.kt | 23 ---------- core/build.gradle.kts | 2 + .../java/com/santimattius/core/CoreModule.kt | 44 +++++++++++++++++++ .../client/network/RetrofitServiceCreator.kt | 24 +--------- gradle.properties | 2 +- 9 files changed, 57 insertions(+), 90 deletions(-) delete mode 100644 app/src/main/java/com/santimattius/template/startup/RetrofitServiceInitializer.kt create mode 100644 core/src/main/java/com/santimattius/core/CoreModule.kt diff --git a/.idea/compiler.xml b/.idea/compiler.xml index b589d56..b86273d 100644 --- a/.idea/compiler.xml +++ b/.idea/compiler.xml @@ -1,6 +1,6 @@ - + \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index cc6d54f..7ce5aaf 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -13,17 +13,6 @@ android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/Theme.EntertainmentApp"> - - - - - { - - override fun create(context: Context): TheMovieDBService { - return RetrofitServiceCreator.createService( - baseUrl = "https://api.themoviedb.org", - BuildConfig.apiKey) - } - - @OptIn(KoinExperimentalAPI::class) - override fun dependencies(): List?>?> { - return listOf(KoinInitializer::class.java) - } -} \ No newline at end of file diff --git a/core/build.gradle.kts b/core/build.gradle.kts index 74f026a..c9f30c4 100644 --- a/core/build.gradle.kts +++ b/core/build.gradle.kts @@ -72,6 +72,8 @@ dependencies { implementation(platform(libs.koin.bom)) implementation(libs.koin.android) implementation(libs.koin.androidx.compose) + compileOnly(libs.koin.annotations.core) + ksp(libs.koin.annotations.compiler) testImplementation(project(path = ":shared-test")) testImplementation(libs.bundles.unitTesting) diff --git a/core/src/main/java/com/santimattius/core/CoreModule.kt b/core/src/main/java/com/santimattius/core/CoreModule.kt new file mode 100644 index 0000000..14c81e0 --- /dev/null +++ b/core/src/main/java/com/santimattius/core/CoreModule.kt @@ -0,0 +1,44 @@ +package com.santimattius.core + +import android.content.Context +import com.santimattius.core.data.client.database.TheMovieDataBase +import com.santimattius.core.data.client.network.RequestInterceptor +import com.santimattius.core.data.client.network.TheMovieDBService +import okhttp3.OkHttpClient +import org.koin.core.annotation.Module +import org.koin.core.annotation.Named +import org.koin.core.annotation.Single +import retrofit2.Retrofit +import retrofit2.converter.gson.GsonConverterFactory + +@Module +class CoreModule { + + @Single(createdAtStart = true) + fun provideOkHttpClient(@Named("apiKey") apiKey: String): OkHttpClient { + return OkHttpClient().newBuilder() + .addInterceptor(RequestInterceptor(apiKey)) + .build() + } + + @Single(createdAtStart = true) + fun provideRetrofit( + @Named("baseUrl") baseUrl: String, + client: OkHttpClient + ): Retrofit { + return Retrofit.Builder() + .baseUrl(baseUrl) + .client(client) + .addConverterFactory(GsonConverterFactory.create()) + .build() + } + + @Single(createdAtStart = true) + fun provideService(retrofit: Retrofit): TheMovieDBService { + return retrofit.create(TheMovieDBService::class.java) + } + + @Single(createdAtStart = true) + fun provideAppDatabase(context: Context): TheMovieDataBase = + TheMovieDataBase.get(context) +} \ No newline at end of file diff --git a/core/src/main/java/com/santimattius/core/data/client/network/RetrofitServiceCreator.kt b/core/src/main/java/com/santimattius/core/data/client/network/RetrofitServiceCreator.kt index 12075f2..0a2f173 100644 --- a/core/src/main/java/com/santimattius/core/data/client/network/RetrofitServiceCreator.kt +++ b/core/src/main/java/com/santimattius/core/data/client/network/RetrofitServiceCreator.kt @@ -4,6 +4,7 @@ import okhttp3.OkHttpClient import retrofit2.Retrofit import retrofit2.converter.gson.GsonConverterFactory +//TODO:only for testing class RetrofitServiceCreator(baseUrl: String, apiKey: String) { // Use 'by lazy' for client @@ -25,27 +26,4 @@ class RetrofitServiceCreator(baseUrl: String, apiKey: String) { fun createService(serviceClass: Class): T { return retrofit.create(serviceClass) } - - companion object { - private val services: TheMovieDBService? = null - private var instance: RetrofitServiceCreator? = null - - fun getInstance(baseUrl: String, apiKey: String): RetrofitServiceCreator { - if (instance == null) { - instance = RetrofitServiceCreator(baseUrl, apiKey) - } - return instance!! - } - - - fun createService(baseUrl: String, apiKey: String): TheMovieDBService { - if (services == null) { - return getInstance( - baseUrl, - apiKey, - ).createService(TheMovieDBService::class.java) - } - return services - } - } } \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index ee4a0a5..291e71e 100644 --- a/gradle.properties +++ b/gradle.properties @@ -28,4 +28,4 @@ application_id=com.santimattius.entertainment min_sdk_version=24 target_sdk_version=36 version_code=2 -version_name=1.3 \ No newline at end of file +version_name=1.3.1 \ No newline at end of file From 7b38ea6d9372e939ab9486977e19c79d2f2ddee3 Mon Sep 17 00:00:00 2001 From: Santiago Mattiauda Date: Tue, 23 Sep 2025 21:20:19 -0300 Subject: [PATCH 08/10] [improvement] test prompt --- core/src/main/java/com/santimattius/core/CoreModule.kt | 8 ++++---- gradle.properties | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/core/src/main/java/com/santimattius/core/CoreModule.kt b/core/src/main/java/com/santimattius/core/CoreModule.kt index 14c81e0..c673bc4 100644 --- a/core/src/main/java/com/santimattius/core/CoreModule.kt +++ b/core/src/main/java/com/santimattius/core/CoreModule.kt @@ -14,14 +14,14 @@ import retrofit2.converter.gson.GsonConverterFactory @Module class CoreModule { - @Single(createdAtStart = true) + @Single fun provideOkHttpClient(@Named("apiKey") apiKey: String): OkHttpClient { return OkHttpClient().newBuilder() .addInterceptor(RequestInterceptor(apiKey)) .build() } - @Single(createdAtStart = true) + @Single fun provideRetrofit( @Named("baseUrl") baseUrl: String, client: OkHttpClient @@ -33,12 +33,12 @@ class CoreModule { .build() } - @Single(createdAtStart = true) + @Single fun provideService(retrofit: Retrofit): TheMovieDBService { return retrofit.create(TheMovieDBService::class.java) } - @Single(createdAtStart = true) + @Single fun provideAppDatabase(context: Context): TheMovieDataBase = TheMovieDataBase.get(context) } \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index 291e71e..2be2282 100644 --- a/gradle.properties +++ b/gradle.properties @@ -28,4 +28,4 @@ application_id=com.santimattius.entertainment min_sdk_version=24 target_sdk_version=36 version_code=2 -version_name=1.3.1 \ No newline at end of file +version_name=1.3.2 \ No newline at end of file From fb67988858e5f3d5fc502ecc3bb0d6238fbcb678 Mon Sep 17 00:00:00 2001 From: Santiago Mattiauda Date: Tue, 23 Sep 2025 21:43:37 -0300 Subject: [PATCH 09/10] [improvement] test prompt --- core/src/main/java/com/santimattius/core/CoreModule.kt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/core/src/main/java/com/santimattius/core/CoreModule.kt b/core/src/main/java/com/santimattius/core/CoreModule.kt index c673bc4..14c81e0 100644 --- a/core/src/main/java/com/santimattius/core/CoreModule.kt +++ b/core/src/main/java/com/santimattius/core/CoreModule.kt @@ -14,14 +14,14 @@ import retrofit2.converter.gson.GsonConverterFactory @Module class CoreModule { - @Single + @Single(createdAtStart = true) fun provideOkHttpClient(@Named("apiKey") apiKey: String): OkHttpClient { return OkHttpClient().newBuilder() .addInterceptor(RequestInterceptor(apiKey)) .build() } - @Single + @Single(createdAtStart = true) fun provideRetrofit( @Named("baseUrl") baseUrl: String, client: OkHttpClient @@ -33,12 +33,12 @@ class CoreModule { .build() } - @Single + @Single(createdAtStart = true) fun provideService(retrofit: Retrofit): TheMovieDBService { return retrofit.create(TheMovieDBService::class.java) } - @Single + @Single(createdAtStart = true) fun provideAppDatabase(context: Context): TheMovieDataBase = TheMovieDataBase.get(context) } \ No newline at end of file From 58d541cca27826c7a462bbd01c2d431f13b259e4 Mon Sep 17 00:00:00 2001 From: Santiago Mattiauda Date: Sat, 7 Mar 2026 13:06:27 -0300 Subject: [PATCH 10/10] [annotations] update annotations (#12) * [annotations] update annotations * [annotations] update annotations --- app/build.gradle.kts | 8 ++++- .../santimattius/template/MainApplication.kt | 33 ++++++++++++------- .../com/santimattius/template/di/AppModule.kt | 2 ++ .../santimattius/template/di/DataModule.kt | 2 ++ .../ui/compose/HomeComposeActivity.kt | 25 +++++++------- .../ui/compose/HomeComposeViewModel.kt | 4 +++ build.gradle.kts | 3 +- .../java/com/santimattius/core/CoreModule.kt | 2 ++ gradle/libs.versions.toml | 31 ++++++++--------- 9 files changed, 69 insertions(+), 41 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 3e1323e..05d8449 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -8,6 +8,7 @@ plugins { alias(libs.plugins.detekt) alias(libs.plugins.google.secrets.gradle.plugin) alias(libs.plugins.automattic.measure.builds) + alias(libs.plugins.allopen) id("io.kotzilla.kotzilla-plugin") } apply("$rootDir/gradle/report.gradle") @@ -114,6 +115,10 @@ ksp { arg("KOIN_CONFIG_CHECK", "true") } +allOpen { + annotation("org.koin.core.annotation.Monitor") +} + dependencies { implementation(project(":core")) implementation(libs.kotlin.stdlib) @@ -148,7 +153,8 @@ dependencies { implementation(libs.koin.android) implementation(libs.koin.androidx.compose) implementation(libs.koin.androidx.startup) - implementation("io.kotzilla:kotzilla-sdk:1.2.1") + implementation("io.kotzilla:kotzilla-sdk:1.2.3") + //implementation("io.kotzilla:kotzilla-sdk-compose:1.2.3") compileOnly(libs.koin.annotations.core) ksp(libs.koin.annotations.compiler) diff --git a/app/src/main/java/com/santimattius/template/MainApplication.kt b/app/src/main/java/com/santimattius/template/MainApplication.kt index d9bce5e..e247c95 100644 --- a/app/src/main/java/com/santimattius/template/MainApplication.kt +++ b/app/src/main/java/com/santimattius/template/MainApplication.kt @@ -2,30 +2,39 @@ package com.santimattius.template import android.app.Application import android.util.Log +import com.santimattius.core.CoreModule +import com.santimattius.template.di.AppModule +import com.santimattius.template.di.DataModule import io.kotzilla.sdk.analytics.koin.analytics import org.koin.android.ext.koin.androidContext import org.koin.androix.startup.KoinStartup +import org.koin.core.annotation.KoinApplication import org.koin.core.annotation.KoinExperimentalAPI import org.koin.dsl.KoinConfiguration -import org.koin.ksp.generated.com_santimattius_core_CoreModule -import org.koin.ksp.generated.com_santimattius_template_di_AppModule -import org.koin.ksp.generated.com_santimattius_template_di_DataModule -import org.koin.ksp.generated.defaultModule +import org.koin.dsl.module +import org.koin.ksp.generated.defineComSantimattiusTemplateUiComposeHomeComposeViewModel +import org.koin.ksp.generated.defineComSantimattiusTemplateUiXmlHomeHomeViewModel +import org.koin.ksp.generated.koinConfiguration + +@KoinApplication( + configurations = ["default"], + modules = [CoreModule::class, DataModule::class, AppModule::class] +) +object MainKoinApplication @OptIn(KoinExperimentalAPI::class) class MainApplication : Application(), KoinStartup { override fun onKoinStartup(): KoinConfiguration { Log.d(this::class.simpleName, "onKoinStartup: ${Thread.currentThread().name}") - return KoinConfiguration { + val configuration = MainKoinApplication.koinConfiguration { androidContext(this@MainApplication) analytics() - modules( - com_santimattius_core_CoreModule, - com_santimattius_template_di_DataModule, - com_santimattius_template_di_AppModule, - defaultModule - ) + modules(modules = module { + defineComSantimattiusTemplateUiComposeHomeComposeViewModel() + defineComSantimattiusTemplateUiXmlHomeHomeViewModel() + }) } + return KoinConfiguration(configuration) } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/santimattius/template/di/AppModule.kt b/app/src/main/java/com/santimattius/template/di/AppModule.kt index 2f6020b..1553dc3 100644 --- a/app/src/main/java/com/santimattius/template/di/AppModule.kt +++ b/app/src/main/java/com/santimattius/template/di/AppModule.kt @@ -1,12 +1,14 @@ package com.santimattius.template.di import com.santimattius.template.BuildConfig +import org.koin.core.annotation.Configuration import org.koin.core.annotation.Module import org.koin.core.annotation.Named import org.koin.core.annotation.Single @Module +@Configuration class AppModule { @Single(createdAtStart = true) diff --git a/app/src/main/java/com/santimattius/template/di/DataModule.kt b/app/src/main/java/com/santimattius/template/di/DataModule.kt index 1b532e8..b5e60b5 100644 --- a/app/src/main/java/com/santimattius/template/di/DataModule.kt +++ b/app/src/main/java/com/santimattius/template/di/DataModule.kt @@ -8,10 +8,12 @@ import com.santimattius.core.data.datasources.implementation.RetrofitMovieNetwor import com.santimattius.core.data.datasources.implementation.RoomMovieLocalDataSource import com.santimattius.core.data.repositories.TMDbRepository import com.santimattius.core.domain.repositories.MovieRepository +import org.koin.core.annotation.Configuration import org.koin.core.annotation.Module import org.koin.core.annotation.Single @Module +@Configuration class DataModule { @Single diff --git a/app/src/main/java/com/santimattius/template/ui/compose/HomeComposeActivity.kt b/app/src/main/java/com/santimattius/template/ui/compose/HomeComposeActivity.kt index b35d840..72f6e4f 100644 --- a/app/src/main/java/com/santimattius/template/ui/compose/HomeComposeActivity.kt +++ b/app/src/main/java/com/santimattius/template/ui/compose/HomeComposeActivity.kt @@ -56,18 +56,19 @@ class HomeComposeActivity : ComponentActivity() { setContent { // This shouldn't be needed, but allows robolectric tests to run successfully // TODO remove once a solution is found or a fix in koin? - CompositionLocalProvider( - LocalKoinScope provides KoinPlatformTools.defaultContext() - .get().scopeRegistry.rootScope, - LocalKoinApplication provides KoinPlatformTools.defaultContext().get() - ) { - AndroidTestingTheme { - Surface( - modifier = Modifier.fillMaxSize(), - color = MaterialTheme.colorScheme.background - ) { - HomeRoute(viewModel) - } +// CompositionLocalProvider( +// LocalKoinScope provides KoinPlatformTools.defaultContext() +// .get().scopeRegistry.rootScope, +// LocalKoinApplication provides KoinPlatformTools.defaultContext().get() +// ) { +// +// } + AndroidTestingTheme { + Surface( + modifier = Modifier.fillMaxSize(), + color = MaterialTheme.colorScheme.background + ) { + HomeRoute(viewModel) } } } diff --git a/app/src/main/java/com/santimattius/template/ui/compose/HomeComposeViewModel.kt b/app/src/main/java/com/santimattius/template/ui/compose/HomeComposeViewModel.kt index 0ddc0a9..7970f6b 100644 --- a/app/src/main/java/com/santimattius/template/ui/compose/HomeComposeViewModel.kt +++ b/app/src/main/java/com/santimattius/template/ui/compose/HomeComposeViewModel.kt @@ -17,8 +17,12 @@ import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch import org.koin.android.annotation.KoinViewModel +import org.koin.core.annotation.Configuration +import org.koin.core.annotation.Monitor @KoinViewModel +@Monitor +@Configuration class HomeComposeViewModel( private val movieRepository: MovieRepository, ) : ViewModel() { diff --git a/build.gradle.kts b/build.gradle.kts index de5ab2b..033a144 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -8,12 +8,13 @@ plugins { alias(libs.plugins.detekt) apply false alias(libs.plugins.google.secrets.gradle.plugin) apply false alias(libs.plugins.automattic.measure.builds) apply false + alias(libs.plugins.allopen) apply false alias(libs.plugins.room) apply false } buildscript { dependencies { classpath(libs.dep.google.secrets.gradle.plugin) - classpath("io.kotzilla:kotzilla-plugin:1.2.1") + classpath("io.kotzilla:kotzilla-plugin:1.2.3") } } \ No newline at end of file diff --git a/core/src/main/java/com/santimattius/core/CoreModule.kt b/core/src/main/java/com/santimattius/core/CoreModule.kt index 14c81e0..f3b84c4 100644 --- a/core/src/main/java/com/santimattius/core/CoreModule.kt +++ b/core/src/main/java/com/santimattius/core/CoreModule.kt @@ -5,6 +5,7 @@ import com.santimattius.core.data.client.database.TheMovieDataBase import com.santimattius.core.data.client.network.RequestInterceptor import com.santimattius.core.data.client.network.TheMovieDBService import okhttp3.OkHttpClient +import org.koin.core.annotation.Configuration import org.koin.core.annotation.Module import org.koin.core.annotation.Named import org.koin.core.annotation.Single @@ -12,6 +13,7 @@ import retrofit2.Retrofit import retrofit2.converter.gson.GsonConverterFactory @Module +@Configuration class CoreModule { @Single(createdAtStart = true) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 8adc0f3..9006a85 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,10 +1,10 @@ [versions] # Plugins -androidGradlePlugin = "8.12.2" +androidGradlePlugin = "8.13.0" hamcrest = "3.0" -kotlin = "2.2.10" +kotlin = "2.2.20" detektGradlePlugin = "1.23.8" -ksp = "2.2.10-2.0.2" +ksp = "2.2.20-2.0.2" googleSecretsPlugin = "2.0.1" automatticMeasureBuilds = "3.2.1" @@ -15,23 +15,23 @@ appCompat = "1.7.1" fragmentKtx = "1.8.9" constraintLayout = "2.2.1" recyclerView = "1.4.0" -materialVersion = "1.12.0" -lifecycle = "2.9.3" +materialVersion = "1.13.0" +lifecycle = "2.9.4" retrofit = "3.0.0" -okHttp = "5.1.0" +okHttp = "5.2.0" coroutine = "1.10.2" -gson = "2.13.1" -glide = "5.0.0-rc01" +gson = "2.13.2" +glide = "5.0.5" coil = "2.7.0" -room = "2.7.2" +room = "2.8.1" -androidxComposeBom = "2025.08.01" -activityCompose = "1.10.1" +androidxComposeBom = "2025.09.01" +activityCompose = "1.11.0" -koinBom = "4.1.0" -koinAnnotations = "2.1.0" +koinBom = "4.1.1" +koinAnnotations = "2.2.0" #Testing junit = "4.13.2" @@ -44,10 +44,10 @@ fragmentTesting = "1.8.9" espressoCore = "3.7.0" okhttp3IdlingResource = "1.0.0" -mockk = "1.14.5" +mockk = "1.14.6" robolectric = "4.16" turbine = "1.2.1" -mockitoKotlin = "6.0.0" +mockitoKotlin = "6.1.0" [libraries] # Define the libraries @@ -153,6 +153,7 @@ kotlin = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" } room = { id = "androidx.room", version.ref = "room"} ksp = { id = "com.google.devtools.ksp", version.ref = "ksp" } compose-compiler = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" } +allopen = { id = "org.jetbrains.kotlin.plugin.allopen", version.ref = "kotlin" } detekt = { id = "io.gitlab.arturbosch.detekt", version.ref = "detektGradlePlugin" } google-secrets-gradle-plugin = { id = "com.google.android.libraries.mapsplatform.secrets-gradle-plugin", version.ref = "googleSecretsPlugin" } automattic-measure-builds = { id = "com.automattic.android.measure-builds", version.ref = "automatticMeasureBuilds" }