From bc711e4ef9c434a14afff217ea3a63b0fcdce879 Mon Sep 17 00:00:00 2001 From: Tobi Oyelekan Date: Mon, 29 Dec 2025 02:42:05 +0100 Subject: [PATCH 01/11] migrate :designsystem, :model to kmp dependency version upgrade --- .idea/kotlinc.xml | 2 +- README.md | 2 +- app/build.gradle.kts | 11 ++- build.gradle.kts | 9 +-- core/common/build.gradle.kts | 2 +- core/database/build.gradle.kts | 2 +- core/designsystem/.gitignore | 1 - core/designsystem/build.gradle.kts | 64 +++++++++++------- core/designsystem/consumer-rules.pro | 0 core/designsystem/proguard-rules.pro | 21 ------ .../drawable/ic_dog_placeholder.webp | Bin 0 -> 1440 bytes .../core/designsystem/components/DogAppBar.kt | 6 +- .../designsystem/components/DogBreedItem.kt | 20 +++--- .../designsystem/components/ErrorState.kt | 0 .../components/LoadingIndicator.kt | 0 .../designsystem/components/SubBreedCard.kt | 22 +++--- .../dogbreed/core/designsystem/theme/Color.kt | 0 .../dogbreed/core/designsystem/theme/Theme.kt | 25 ------- .../dogbreed/core/designsystem/theme/Type.kt | 0 .../designsystem/src/main/AndroidManifest.xml | 4 -- .../main/res/drawable/ic_dog_placeholder.png | Bin 3227 -> 0 bytes core/model/.gitignore | 1 - core/model/build.gradle.kts | 16 ++++- core/model/consumer-rules.pro | 0 core/model/proguard-rules.pro | 21 ------ .../dogbreed/core/model/DogBreed.kt | 0 .../dogbreed/core/model/SubBreedImage.kt | 0 core/model/src/main/AndroidManifest.xml | 4 -- core/network/.gitignore | 1 - core/network/build.gradle.kts | 4 +- core/network/consumer-rules.pro | 0 core/network/proguard-rules.pro | 21 ------ core/testing/build.gradle.kts | 2 +- feature/allbreeds/data/build.gradle.kts | 2 +- feature/allbreeds/ui/build.gradle.kts | 8 +-- .../feature/allbreeds/AllBreedsScreen.kt | 4 +- feature/breedDetails/data/build.gradle.kts | 2 +- feature/breedDetails/ui/build.gradle.kts | 8 +-- .../breedDetails/DogBreedDetailScreen.kt | 15 ++-- .../main/res/drawable/ic_dog_placeholder.webp | Bin 0 -> 1440 bytes feature/favorites/ui/build.gradle.kts | 6 +- .../feature/favorites/FavoriteBreedScreen.kt | 4 +- feature/subbreeds/data/build.gradle.kts | 2 +- feature/subbreeds/ui/build.gradle.kts | 6 +- .../feature/subbreeds/SubBreedsScreen.kt | 12 ++-- .../main/res/drawable/ic_dog_placeholder.webp | Bin 0 -> 1440 bytes gradle/libs.versions.toml | 34 +++++++--- settings.gradle.kts | 2 +- 48 files changed, 161 insertions(+), 205 deletions(-) delete mode 100644 core/designsystem/.gitignore delete mode 100644 core/designsystem/consumer-rules.pro delete mode 100644 core/designsystem/proguard-rules.pro create mode 100644 core/designsystem/src/commonMain/composeResources/drawable/ic_dog_placeholder.webp rename core/designsystem/src/{main/java => commonMain/kotlin}/com/tobioyelekan/dogbreed/core/designsystem/components/DogAppBar.kt (90%) rename core/designsystem/src/{main/java => commonMain/kotlin}/com/tobioyelekan/dogbreed/core/designsystem/components/DogBreedItem.kt (71%) rename core/designsystem/src/{main/java => commonMain/kotlin}/com/tobioyelekan/dogbreed/core/designsystem/components/ErrorState.kt (100%) rename core/designsystem/src/{main/java => commonMain/kotlin}/com/tobioyelekan/dogbreed/core/designsystem/components/LoadingIndicator.kt (100%) rename core/designsystem/src/{main/java => commonMain/kotlin}/com/tobioyelekan/dogbreed/core/designsystem/components/SubBreedCard.kt (73%) rename core/designsystem/src/{main/java => commonMain/kotlin}/com/tobioyelekan/dogbreed/core/designsystem/theme/Color.kt (100%) rename core/designsystem/src/{main/java => commonMain/kotlin}/com/tobioyelekan/dogbreed/core/designsystem/theme/Theme.kt (53%) rename core/designsystem/src/{main/java => commonMain/kotlin}/com/tobioyelekan/dogbreed/core/designsystem/theme/Type.kt (100%) delete mode 100644 core/designsystem/src/main/AndroidManifest.xml delete mode 100644 core/designsystem/src/main/res/drawable/ic_dog_placeholder.png delete mode 100644 core/model/.gitignore delete mode 100644 core/model/consumer-rules.pro delete mode 100644 core/model/proguard-rules.pro rename core/model/src/{main/java => commonMain/kotlin}/com/tobioyelekan/dogbreed/core/model/DogBreed.kt (100%) rename core/model/src/{main/java => commonMain/kotlin}/com/tobioyelekan/dogbreed/core/model/SubBreedImage.kt (100%) delete mode 100644 core/model/src/main/AndroidManifest.xml delete mode 100644 core/network/.gitignore delete mode 100644 core/network/consumer-rules.pro delete mode 100644 core/network/proguard-rules.pro create mode 100644 feature/breedDetails/ui/src/main/res/drawable/ic_dog_placeholder.webp create mode 100644 feature/subbreeds/ui/src/main/res/drawable/ic_dog_placeholder.webp diff --git a/.idea/kotlinc.xml b/.idea/kotlinc.xml index f8467b4..3efb2d8 100644 --- a/.idea/kotlinc.xml +++ b/.idea/kotlinc.xml @@ -1,6 +1,6 @@ - \ No newline at end of file diff --git a/README.md b/README.md index 1541379..b39a758 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ To build this project, you require: * From Android Studio Giraffe upward * Gradle 8.0 -* Kotlin 1.9.20 +* Kotlin 2.2.20 * Android Gradle Plugin 8.1.0 ## Features 🎨 diff --git a/app/build.gradle.kts b/app/build.gradle.kts index ca0fd31..4afbd4e 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -3,16 +3,17 @@ plugins { id("org.jetbrains.kotlin.android") id("dagger.hilt.android.plugin") id("com.google.devtools.ksp") + alias(libs.plugins.compose.compiler) } android { namespace = "com.tobioyelekan.dogbreed" - compileSdk = 34 + compileSdk = 35 defaultConfig { applicationId = "com.tobioyelekan.dogbreed" minSdk = 24 - targetSdk = 34 + targetSdk = 35 versionCode = 1 versionName = "1.0" @@ -49,9 +50,6 @@ android { buildConfig = true compose = true } - composeOptions { - kotlinCompilerExtensionVersion = "1.5.3" - } packaging { resources { excludes += setOf( @@ -60,7 +58,8 @@ android { "META-INF/LICENSE-notice.md", "META-INF/DEPENDENCIES", "META-INF/NOTICE", - "META-INF/LICENSE" + "META-INF/LICENSE", + "META-INF/versions/9/OSGI-INF/MANIFEST.MF" ) } } diff --git a/build.gradle.kts b/build.gradle.kts index fa9998b..e0ff0b1 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,16 +1,17 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. plugins { id("com.android.application") version "8.11.1" apply false - id("org.jetbrains.kotlin.android") version "1.9.10" apply false + id("org.jetbrains.kotlin.android") version "2.2.20" apply false id("com.android.library") version "8.11.1" apply false - id("com.google.devtools.ksp") version "1.9.0-1.0.13" apply false - id("org.jetbrains.kotlin.plugin.serialization") version "1.8.10" apply false + id("com.google.devtools.ksp") version "2.2.20-2.0.4" apply false + id("org.jetbrains.kotlin.plugin.serialization") version "2.2.20" apply false alias(libs.plugins.jetbrains.kotlin.jvm) apply false + alias(libs.plugins.compose.compiler) apply false } buildscript { dependencies { classpath(libs.hilt.android.gradle.plugin) - classpath("org.jetbrains.kotlin:kotlin-serialization:1.9.10") + classpath("org.jetbrains.kotlin:kotlin-serialization:2.2.20") } } \ No newline at end of file diff --git a/core/common/build.gradle.kts b/core/common/build.gradle.kts index b201744..d58d368 100644 --- a/core/common/build.gradle.kts +++ b/core/common/build.gradle.kts @@ -7,7 +7,7 @@ plugins { android { namespace = "com.tobioyelekan.dogbreed.core.common" - compileSdk = 34 + compileSdk = 35 defaultConfig { minSdk = 24 diff --git a/core/database/build.gradle.kts b/core/database/build.gradle.kts index cbf8b86..6cf719c 100644 --- a/core/database/build.gradle.kts +++ b/core/database/build.gradle.kts @@ -7,7 +7,7 @@ plugins { android { namespace = "com.tobioyelekan.dogbreed.core.database" - compileSdk = 34 + compileSdk = 35 defaultConfig { minSdk = 24 diff --git a/core/designsystem/.gitignore b/core/designsystem/.gitignore deleted file mode 100644 index 42afabf..0000000 --- a/core/designsystem/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/build \ No newline at end of file diff --git a/core/designsystem/build.gradle.kts b/core/designsystem/build.gradle.kts index 51c9ca7..3914812 100644 --- a/core/designsystem/build.gradle.kts +++ b/core/designsystem/build.gradle.kts @@ -1,11 +1,47 @@ plugins { - id("com.android.library") - id("org.jetbrains.kotlin.android") + kotlin("multiplatform") + alias(libs.plugins.android.library) + alias(libs.plugins.jetbrainsCompose) + alias(libs.plugins.compose.compiler) +} + +kotlin { + jvmToolchain(17) + androidTarget() + jvm() + iosX64() + iosArm64() + iosSimulatorArm64() + + sourceSets { + commonMain.dependencies { + api(compose.ui) + api(compose.material3) + api(compose.materialIconsExtended) + api(compose.components.uiToolingPreview) + api(compose.components.resources) + api(libs.bundles.coil) + } + + androidMain.dependencies { + implementation(libs.ktor.okhttp) + } + + iosMain.dependencies { + implementation(libs.ktor.darwin) + } + } +} + +compose.resources{ + publicResClass = true + packageOfResClass = "com.tobioyelekan.dogbreed.core.designsystem" + generateResClass = auto } android { namespace = "com.tobioyelekan.dogbreed.core.designsystem" - compileSdk = 34 + compileSdk = 35 defaultConfig { minSdk = 24 @@ -24,25 +60,7 @@ android { } } compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - buildFeatures { - compose = true + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 } - composeOptions { - kotlinCompilerExtensionVersion = "1.5.3" - } - kotlinOptions { - jvmTarget = "1.8" - } -} - -dependencies { - implementation(libs.core) - api(libs.hilt.compose) - api(libs.compose.lifecycle.runtime) - api(libs.compose.material3) - api(libs.compose.ui.tooling) - api(libs.coil.compose) } \ No newline at end of file diff --git a/core/designsystem/consumer-rules.pro b/core/designsystem/consumer-rules.pro deleted file mode 100644 index e69de29..0000000 diff --git a/core/designsystem/proguard-rules.pro b/core/designsystem/proguard-rules.pro deleted file mode 100644 index 481bb43..0000000 --- a/core/designsystem/proguard-rules.pro +++ /dev/null @@ -1,21 +0,0 @@ -# Add project specific ProGuard rules here. -# You can control the set of applied configuration files using the -# proguardFiles setting in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} - -# Uncomment this to preserve the line number information for -# debugging stack traces. -#-keepattributes SourceFile,LineNumberTable - -# If you keep the line number information, uncomment this to -# hide the original source file name. -#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/core/designsystem/src/commonMain/composeResources/drawable/ic_dog_placeholder.webp b/core/designsystem/src/commonMain/composeResources/drawable/ic_dog_placeholder.webp new file mode 100644 index 0000000000000000000000000000000000000000..501e1bd48a1e68a2b523ef82f754574a668c4a3a GIT binary patch literal 1440 zcmV;R1z-A7Nk&GP1pok7MM6+kP&gor1pokWF#w$bD&YX(06vjMno1?4A|a@_sUWZt z32AQpe3&urr%``gdouFg!tS|S%(S$i%{R#l*MD#ZtTyL>TTB~sz%1*hEe%-!G;&fm0U}!dKYe8=>*p@ha%D|mbmb~LB|5o#oZx{o;GT%@nRrvb0 zB%9I>qiGeu1y8X{0`H)O{;9l90$A_k z)*3eo<$agGOvnP5HhN6~NbZ(;+Z&*Z&HmfxtmOxS2c4a6@-A(zBmYWYm|-|xGcWr) zFGo%neS0Uj_*d-Bv{`((@9xDixiEh@xQi_kf)nDsanCzAnh-K7tzW2Tf#Xqw#^do( z`2D%xt;x`OpCs}T0r&DmjFw(60f;;tp>eu%+8=}_w71!X z6Hl=Mp8+%Nsd#KbuH2^@qn)y*5qY`UEi_{yjj|)JSmHX(2dI*e^YB9=;qNG0DI+H! zMM(bdUFiJnOH|;So`H3=*_w(tyeESF^vz~IEZftCY{|M9>SDLBch=0%b9#+&t&jpw z6O21P0pJn)s*iuM>YkwS`G?W>@35So87VAI>3QmaUANRJiTxKeAKPbbBm-AdeDRAX zKx)=|Pyr?W&7uc5(hP582Fj0;#@kqqo!5_Jp;H@`pX(8{)3cPGG(i4pb7QsrkU#V; z8J=7{$#!r%4>I(AVF5j1d4JjRfqPGu1qi6xy^Q6MS3new z-7W6rK_#o&KsIhQ0f7^R7_Hgh-k+JIw$b5DAO)a9QWV1AVFVH{Dm4 zEjPUoyP{7n&)k0d*g9-P3_Gf4~4B%_!-MEuO?!w{LTWW*`?&$4BivEo5KMPI&J89yd>0+|WV(aN&MWjx@e-FF z5S%c@R^&D7Gq3Hpdfqr1wug+$9GFI|S2iDtn*^p!Vj?Q^@EW6M>r!YqrcmPFvC@O= zS!!HHn7%GL_X#$uc#M8_z!Go~FXK3WL!mWbVAXHaW(nLl-COqQ-QE-jo_niZ**yfp z3!_TTkK!i7lcRUNA34+))!J*unP9NHqpa;7K0XLMKkT?G#^o~#gWf2SedUWfNmoydb5PCf4>Z2H>vi;kAcmB@k*=P!od2Pvk7TeXZ} zt#qA=g>Vd!JmF)>AHhE=A}NjvWx&oBB<82^+=*R9_nRIh=5#h0tD`*M=RFvwX5^X& zr&$_>^|#b`9c(fLbEAPkpdoBTUTDMxRS;_R#MJN$_5c6?0000Ap~gx8 literal 0 HcmV?d00001 diff --git a/core/designsystem/src/main/java/com/tobioyelekan/dogbreed/core/designsystem/components/DogAppBar.kt b/core/designsystem/src/commonMain/kotlin/com/tobioyelekan/dogbreed/core/designsystem/components/DogAppBar.kt similarity index 90% rename from core/designsystem/src/main/java/com/tobioyelekan/dogbreed/core/designsystem/components/DogAppBar.kt rename to core/designsystem/src/commonMain/kotlin/com/tobioyelekan/dogbreed/core/designsystem/components/DogAppBar.kt index 98ed4d2..81e344f 100644 --- a/core/designsystem/src/main/java/com/tobioyelekan/dogbreed/core/designsystem/components/DogAppBar.kt +++ b/core/designsystem/src/commonMain/kotlin/com/tobioyelekan/dogbreed/core/designsystem/components/DogAppBar.kt @@ -5,7 +5,7 @@ import androidx.compose.foundation.layout.RowScope import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.padding import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.ArrowBack +import androidx.compose.material.icons.automirrored.filled.ArrowBack import androidx.compose.material.icons.outlined.FavoriteBorder import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Icon @@ -15,7 +15,7 @@ import androidx.compose.material3.Text import androidx.compose.material3.TopAppBar import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier -import androidx.compose.ui.tooling.preview.Preview +import org.jetbrains.compose.ui.tooling.preview.Preview @OptIn(ExperimentalMaterial3Api::class) @Composable @@ -36,7 +36,7 @@ fun DogAppBar( navigationIcon = { IconButton(onClick = { onBackClicked() }) { Icon( - imageVector = Icons.Filled.ArrowBack, + imageVector = Icons.AutoMirrored.Filled.ArrowBack, contentDescription = "navUp" ) } diff --git a/core/designsystem/src/main/java/com/tobioyelekan/dogbreed/core/designsystem/components/DogBreedItem.kt b/core/designsystem/src/commonMain/kotlin/com/tobioyelekan/dogbreed/core/designsystem/components/DogBreedItem.kt similarity index 71% rename from core/designsystem/src/main/java/com/tobioyelekan/dogbreed/core/designsystem/components/DogBreedItem.kt rename to core/designsystem/src/commonMain/kotlin/com/tobioyelekan/dogbreed/core/designsystem/components/DogBreedItem.kt index 91238ba..e018f31 100644 --- a/core/designsystem/src/main/java/com/tobioyelekan/dogbreed/core/designsystem/components/DogBreedItem.kt +++ b/core/designsystem/src/commonMain/kotlin/com/tobioyelekan/dogbreed/core/designsystem/components/DogBreedItem.kt @@ -13,13 +13,15 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Color import androidx.compose.ui.layout.ContentScale -import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.testTag -import androidx.compose.ui.res.painterResource import androidx.compose.ui.unit.dp -import coil.compose.AsyncImage -import coil.request.ImageRequest -import com.tobioyelekan.dogbreed.core.designsystem.R +import coil3.compose.AsyncImage +import coil3.compose.LocalPlatformContext +import coil3.request.ImageRequest +import coil3.request.crossfade +import com.tobioyelekan.dogbreed.core.designsystem.Res +import com.tobioyelekan.dogbreed.core.designsystem.ic_dog_placeholder +import org.jetbrains.compose.resources.painterResource @Composable fun DogBreedItem( @@ -27,15 +29,17 @@ fun DogBreedItem( imgUrl: String, onBreedClicked: () -> Unit ) { - val model = ImageRequest.Builder(LocalContext.current).data(imgUrl).crossfade(true).build() + val model = ImageRequest.Builder(LocalPlatformContext.current) + .data(imgUrl) + .crossfade(true).build() Box(Modifier.testTag("Item")) { AsyncImage( model = model, contentScale = ContentScale.Crop, contentDescription = null, - placeholder = painterResource(id = R.drawable.ic_dog_placeholder), - error = painterResource(id = R.drawable.ic_dog_placeholder), + placeholder = painterResource(Res.drawable.ic_dog_placeholder), + error = painterResource(Res.drawable.ic_dog_placeholder), modifier = Modifier .fillMaxHeight() .aspectRatio(1f) diff --git a/core/designsystem/src/main/java/com/tobioyelekan/dogbreed/core/designsystem/components/ErrorState.kt b/core/designsystem/src/commonMain/kotlin/com/tobioyelekan/dogbreed/core/designsystem/components/ErrorState.kt similarity index 100% rename from core/designsystem/src/main/java/com/tobioyelekan/dogbreed/core/designsystem/components/ErrorState.kt rename to core/designsystem/src/commonMain/kotlin/com/tobioyelekan/dogbreed/core/designsystem/components/ErrorState.kt diff --git a/core/designsystem/src/main/java/com/tobioyelekan/dogbreed/core/designsystem/components/LoadingIndicator.kt b/core/designsystem/src/commonMain/kotlin/com/tobioyelekan/dogbreed/core/designsystem/components/LoadingIndicator.kt similarity index 100% rename from core/designsystem/src/main/java/com/tobioyelekan/dogbreed/core/designsystem/components/LoadingIndicator.kt rename to core/designsystem/src/commonMain/kotlin/com/tobioyelekan/dogbreed/core/designsystem/components/LoadingIndicator.kt diff --git a/core/designsystem/src/main/java/com/tobioyelekan/dogbreed/core/designsystem/components/SubBreedCard.kt b/core/designsystem/src/commonMain/kotlin/com/tobioyelekan/dogbreed/core/designsystem/components/SubBreedCard.kt similarity index 73% rename from core/designsystem/src/main/java/com/tobioyelekan/dogbreed/core/designsystem/components/SubBreedCard.kt rename to core/designsystem/src/commonMain/kotlin/com/tobioyelekan/dogbreed/core/designsystem/components/SubBreedCard.kt index e7954c6..f51ea48 100644 --- a/core/designsystem/src/main/java/com/tobioyelekan/dogbreed/core/designsystem/components/SubBreedCard.kt +++ b/core/designsystem/src/commonMain/kotlin/com/tobioyelekan/dogbreed/core/designsystem/components/SubBreedCard.kt @@ -18,17 +18,21 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.layout.ContentScale -import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.res.painterResource import androidx.compose.ui.unit.dp -import coil.compose.AsyncImage -import coil.request.ImageRequest -import com.tobioyelekan.dogbreed.core.designsystem.R +import coil3.compose.AsyncImage +import coil3.compose.LocalPlatformContext +import coil3.request.ImageRequest +import coil3.request.crossfade +import com.tobioyelekan.dogbreed.core.designsystem.Res +import com.tobioyelekan.dogbreed.core.designsystem.ic_dog_placeholder +import org.jetbrains.compose.resources.painterResource @Composable fun SubBreedCard(imageUrl: String, subBreedName: String) { val model = - ImageRequest.Builder(LocalContext.current).data(imageUrl).crossfade(true).build() + ImageRequest.Builder(LocalPlatformContext.current) + .data(imageUrl) + .crossfade(true).build() Card(border = BorderStroke(1.dp, Color.Gray)) { Row { @@ -36,8 +40,8 @@ fun SubBreedCard(imageUrl: String, subBreedName: String) { model = model, contentScale = ContentScale.Crop, contentDescription = null, - placeholder = painterResource(id = R.drawable.ic_dog_placeholder), - error = painterResource(id = R.drawable.ic_dog_placeholder), + placeholder = painterResource(Res.drawable.ic_dog_placeholder), + error = painterResource(Res.drawable.ic_dog_placeholder), modifier = Modifier.size(100.dp) ) @@ -48,7 +52,7 @@ fun SubBreedCard(imageUrl: String, subBreedName: String) { Spacer(modifier = Modifier.height(15.dp)) - Row (verticalAlignment = Alignment.CenterVertically){ + Row(verticalAlignment = Alignment.CenterVertically) { Text(text = "Add as Favorite") Spacer(modifier = Modifier.width(10.dp)) diff --git a/core/designsystem/src/main/java/com/tobioyelekan/dogbreed/core/designsystem/theme/Color.kt b/core/designsystem/src/commonMain/kotlin/com/tobioyelekan/dogbreed/core/designsystem/theme/Color.kt similarity index 100% rename from core/designsystem/src/main/java/com/tobioyelekan/dogbreed/core/designsystem/theme/Color.kt rename to core/designsystem/src/commonMain/kotlin/com/tobioyelekan/dogbreed/core/designsystem/theme/Color.kt diff --git a/core/designsystem/src/main/java/com/tobioyelekan/dogbreed/core/designsystem/theme/Theme.kt b/core/designsystem/src/commonMain/kotlin/com/tobioyelekan/dogbreed/core/designsystem/theme/Theme.kt similarity index 53% rename from core/designsystem/src/main/java/com/tobioyelekan/dogbreed/core/designsystem/theme/Theme.kt rename to core/designsystem/src/commonMain/kotlin/com/tobioyelekan/dogbreed/core/designsystem/theme/Theme.kt index 6658bc7..6df186f 100644 --- a/core/designsystem/src/main/java/com/tobioyelekan/dogbreed/core/designsystem/theme/Theme.kt +++ b/core/designsystem/src/commonMain/kotlin/com/tobioyelekan/dogbreed/core/designsystem/theme/Theme.kt @@ -1,19 +1,10 @@ package com.tobioyelekan.dogbreed.core.designsystem.theme -import android.app.Activity -import android.os.Build import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.material3.MaterialTheme import androidx.compose.material3.darkColorScheme -import androidx.compose.material3.dynamicDarkColorScheme -import androidx.compose.material3.dynamicLightColorScheme import androidx.compose.material3.lightColorScheme import androidx.compose.runtime.Composable -import androidx.compose.runtime.SideEffect -import androidx.compose.ui.graphics.toArgb -import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.platform.LocalView -import androidx.core.view.WindowCompat private val DarkColorScheme = darkColorScheme( primary = Purple80, @@ -40,28 +31,12 @@ private val LightColorScheme = lightColorScheme( @Composable fun DogBreedTheme( darkTheme: Boolean = isSystemInDarkTheme(), - // Dynamic color is available on Android 12+ - dynamicColor: Boolean = true, content: @Composable () -> Unit ) { val colorScheme = when { - dynamicColor && Build.VERSION.SDK_INT >= Build.VERSION_CODES.S -> { - val context = LocalContext.current - if (darkTheme) dynamicDarkColorScheme(context) else dynamicLightColorScheme(context) - } - darkTheme -> DarkColorScheme else -> LightColorScheme } - val view = LocalView.current - if (!view.isInEditMode) { - SideEffect { - val window = (view.context as Activity).window - window.statusBarColor = colorScheme.primary.toArgb() - WindowCompat.getInsetsController(window, view).isAppearanceLightStatusBars = darkTheme - } - } - MaterialTheme( colorScheme = colorScheme, typography = Typography, diff --git a/core/designsystem/src/main/java/com/tobioyelekan/dogbreed/core/designsystem/theme/Type.kt b/core/designsystem/src/commonMain/kotlin/com/tobioyelekan/dogbreed/core/designsystem/theme/Type.kt similarity index 100% rename from core/designsystem/src/main/java/com/tobioyelekan/dogbreed/core/designsystem/theme/Type.kt rename to core/designsystem/src/commonMain/kotlin/com/tobioyelekan/dogbreed/core/designsystem/theme/Type.kt diff --git a/core/designsystem/src/main/AndroidManifest.xml b/core/designsystem/src/main/AndroidManifest.xml deleted file mode 100644 index a5918e6..0000000 --- a/core/designsystem/src/main/AndroidManifest.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/core/designsystem/src/main/res/drawable/ic_dog_placeholder.png b/core/designsystem/src/main/res/drawable/ic_dog_placeholder.png deleted file mode 100644 index 2eb0227fae755dd5e161a7ecadb96d900119c382..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3227 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 - - - \ No newline at end of file diff --git a/core/network/.gitignore b/core/network/.gitignore deleted file mode 100644 index 42afabf..0000000 --- a/core/network/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/build \ No newline at end of file diff --git a/core/network/build.gradle.kts b/core/network/build.gradle.kts index b925c20..3d8e112 100644 --- a/core/network/build.gradle.kts +++ b/core/network/build.gradle.kts @@ -3,12 +3,12 @@ plugins { id("org.jetbrains.kotlin.android") id("com.google.devtools.ksp") id("dagger.hilt.android.plugin") - kotlin("plugin.serialization") version "1.8.10" + kotlin("plugin.serialization") version "2.2.20" } android { namespace = "com.tobioyelekan.dogbreed.core.network" - compileSdk = 34 + compileSdk = 35 defaultConfig { minSdk = 24 diff --git a/core/network/consumer-rules.pro b/core/network/consumer-rules.pro deleted file mode 100644 index e69de29..0000000 diff --git a/core/network/proguard-rules.pro b/core/network/proguard-rules.pro deleted file mode 100644 index 481bb43..0000000 --- a/core/network/proguard-rules.pro +++ /dev/null @@ -1,21 +0,0 @@ -# Add project specific ProGuard rules here. -# You can control the set of applied configuration files using the -# proguardFiles setting in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} - -# Uncomment this to preserve the line number information for -# debugging stack traces. -#-keepattributes SourceFile,LineNumberTable - -# If you keep the line number information, uncomment this to -# hide the original source file name. -#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/core/testing/build.gradle.kts b/core/testing/build.gradle.kts index 2dcf8b7..f3f005e 100644 --- a/core/testing/build.gradle.kts +++ b/core/testing/build.gradle.kts @@ -14,7 +14,7 @@ kotlin { //android { // namespace = "com.tobioyelekan.dogbreed.testing" -// compileSdk = 34 +// compileSdk = 35 // // defaultConfig { // minSdk = 24 diff --git a/feature/allbreeds/data/build.gradle.kts b/feature/allbreeds/data/build.gradle.kts index 1f6e64d..4f300c6 100644 --- a/feature/allbreeds/data/build.gradle.kts +++ b/feature/allbreeds/data/build.gradle.kts @@ -7,7 +7,7 @@ plugins { android { namespace = "com.tobioyelekan.dogbreed.data.allbreeds" - compileSdk = 34 + compileSdk = 35 defaultConfig { minSdk = 24 diff --git a/feature/allbreeds/ui/build.gradle.kts b/feature/allbreeds/ui/build.gradle.kts index e23803c..4fc3246 100644 --- a/feature/allbreeds/ui/build.gradle.kts +++ b/feature/allbreeds/ui/build.gradle.kts @@ -3,11 +3,12 @@ plugins { id("org.jetbrains.kotlin.android") id("dagger.hilt.android.plugin") id("com.google.devtools.ksp") + alias(libs.plugins.compose.compiler) } android { namespace = "com.tobioyelekan.dogbreed.feature.allbreeds" - compileSdk = 34 + compileSdk = 35 defaultConfig { minSdk = 24 @@ -35,9 +36,6 @@ android { buildFeatures { compose = true } - composeOptions { - kotlinCompilerExtensionVersion = "1.5.3" - } packaging { resources.excludes.add("META-INF/*") } @@ -52,7 +50,7 @@ dependencies { implementation(libs.kotlin.coroutine) implementation(libs.hilt.core) ksp(libs.hilt.compiler) - + implementation(libs.hilt.compose) implementation(projects.feature.allbreeds.domain) implementation(projects.feature.allbreeds.data) implementation(projects.core.designsystem) diff --git a/feature/allbreeds/ui/src/main/kotlin/com/tobioyelekan/dogbreed/feature/allbreeds/AllBreedsScreen.kt b/feature/allbreeds/ui/src/main/kotlin/com/tobioyelekan/dogbreed/feature/allbreeds/AllBreedsScreen.kt index 6196ebd..eff4454 100644 --- a/feature/allbreeds/ui/src/main/kotlin/com/tobioyelekan/dogbreed/feature/allbreeds/AllBreedsScreen.kt +++ b/feature/allbreeds/ui/src/main/kotlin/com/tobioyelekan/dogbreed/feature/allbreeds/AllBreedsScreen.kt @@ -9,14 +9,14 @@ import androidx.compose.foundation.lazy.grid.rememberLazyGridState import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.ui.Modifier -import androidx.compose.ui.tooling.preview.Preview -import androidx.hilt.navigation.compose.hiltViewModel +import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.tobioyelekan.dogbreed.core.designsystem.components.DogBreedItem import com.tobioyelekan.dogbreed.core.designsystem.components.ErrorState import com.tobioyelekan.dogbreed.core.designsystem.components.LoadingIndicator import com.tobioyelekan.dogbreed.core.designsystem.theme.DogBreedTheme import com.tobioyelekan.dogbreed.core.model.DogBreed +import org.jetbrains.compose.ui.tooling.preview.Preview @Composable fun AllBreedsScreen( diff --git a/feature/breedDetails/data/build.gradle.kts b/feature/breedDetails/data/build.gradle.kts index 290ba19..790aa72 100644 --- a/feature/breedDetails/data/build.gradle.kts +++ b/feature/breedDetails/data/build.gradle.kts @@ -7,7 +7,7 @@ plugins { android { namespace = "com.tobioyelekan.dogbreed.data.allbreeds" - compileSdk = 34 + compileSdk = 35 defaultConfig { minSdk = 24 diff --git a/feature/breedDetails/ui/build.gradle.kts b/feature/breedDetails/ui/build.gradle.kts index 4e495e0..7ff1120 100644 --- a/feature/breedDetails/ui/build.gradle.kts +++ b/feature/breedDetails/ui/build.gradle.kts @@ -2,11 +2,12 @@ plugins { id("com.android.library") id("org.jetbrains.kotlin.android") id("com.google.devtools.ksp") + alias(libs.plugins.compose.compiler) } android { namespace = "com.tobioyelekan.dogbreed.feature.breedDetails" - compileSdk = 34 + compileSdk = 35 defaultConfig { minSdk = 24 @@ -34,9 +35,6 @@ android { buildFeatures { compose = true } - composeOptions { - kotlinCompilerExtensionVersion = "1.5.3" - } packaging { resources.excludes.add("META-INF/*") } @@ -51,7 +49,7 @@ dependencies { implementation(libs.hilt.core) ksp(libs.hilt.compiler) implementation(libs.kotlin.coroutine) - + implementation(libs.hilt.compose) implementation(projects.feature.breedDetails.data) implementation(projects.feature.breedDetails.domain) implementation(projects.core.designsystem) diff --git a/feature/breedDetails/ui/src/main/kotlin/com/tobioyelekan/dogbreed/feature/breedDetails/DogBreedDetailScreen.kt b/feature/breedDetails/ui/src/main/kotlin/com/tobioyelekan/dogbreed/feature/breedDetails/DogBreedDetailScreen.kt index 973b20e..b9439c4 100644 --- a/feature/breedDetails/ui/src/main/kotlin/com/tobioyelekan/dogbreed/feature/breedDetails/DogBreedDetailScreen.kt +++ b/feature/breedDetails/ui/src/main/kotlin/com/tobioyelekan/dogbreed/feature/breedDetails/DogBreedDetailScreen.kt @@ -32,19 +32,19 @@ import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.testTag import androidx.compose.ui.res.painterResource -import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp -import androidx.hilt.navigation.compose.hiltViewModel +import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle -import coil.compose.AsyncImage -import coil.request.ImageRequest -import com.tobioyelekan.dogbreed.core.designsystem.R +import coil3.compose.AsyncImage +import coil3.request.ImageRequest +import coil3.request.crossfade import com.tobioyelekan.dogbreed.core.designsystem.components.DogAppBar import com.tobioyelekan.dogbreed.core.designsystem.components.ErrorState import com.tobioyelekan.dogbreed.core.designsystem.components.LoadingIndicator import com.tobioyelekan.dogbreed.core.designsystem.theme.DogBreedTheme import com.tobioyelekan.dogbreed.core.model.DogBreed import com.tobioyelekan.dogbreed.feature.breedDetails.DogBreedDetailsViewModel.* +import org.jetbrains.compose.ui.tooling.preview.Preview @Composable internal fun DogBreedDetailScreen( @@ -130,7 +130,10 @@ private fun DogBreedDetailsContent( onSubBreedClicked: (subBreedName: String) -> Unit ) { val model = - ImageRequest.Builder(LocalContext.current).data(details.imageUrl).crossfade(true).build() + ImageRequest.Builder(LocalContext.current) + .data(details.imageUrl) + .crossfade(true) + .build() Column( Modifier diff --git a/feature/breedDetails/ui/src/main/res/drawable/ic_dog_placeholder.webp b/feature/breedDetails/ui/src/main/res/drawable/ic_dog_placeholder.webp new file mode 100644 index 0000000000000000000000000000000000000000..501e1bd48a1e68a2b523ef82f754574a668c4a3a GIT binary patch literal 1440 zcmV;R1z-A7Nk&GP1pok7MM6+kP&gor1pokWF#w$bD&YX(06vjMno1?4A|a@_sUWZt z32AQpe3&urr%``gdouFg!tS|S%(S$i%{R#l*MD#ZtTyL>TTB~sz%1*hEe%-!G;&fm0U}!dKYe8=>*p@ha%D|mbmb~LB|5o#oZx{o;GT%@nRrvb0 zB%9I>qiGeu1y8X{0`H)O{;9l90$A_k z)*3eo<$agGOvnP5HhN6~NbZ(;+Z&*Z&HmfxtmOxS2c4a6@-A(zBmYWYm|-|xGcWr) zFGo%neS0Uj_*d-Bv{`((@9xDixiEh@xQi_kf)nDsanCzAnh-K7tzW2Tf#Xqw#^do( z`2D%xt;x`OpCs}T0r&DmjFw(60f;;tp>eu%+8=}_w71!X z6Hl=Mp8+%Nsd#KbuH2^@qn)y*5qY`UEi_{yjj|)JSmHX(2dI*e^YB9=;qNG0DI+H! zMM(bdUFiJnOH|;So`H3=*_w(tyeESF^vz~IEZftCY{|M9>SDLBch=0%b9#+&t&jpw z6O21P0pJn)s*iuM>YkwS`G?W>@35So87VAI>3QmaUANRJiTxKeAKPbbBm-AdeDRAX zKx)=|Pyr?W&7uc5(hP582Fj0;#@kqqo!5_Jp;H@`pX(8{)3cPGG(i4pb7QsrkU#V; z8J=7{$#!r%4>I(AVF5j1d4JjRfqPGu1qi6xy^Q6MS3new z-7W6rK_#o&KsIhQ0f7^R7_Hgh-k+JIw$b5DAO)a9QWV1AVFVH{Dm4 zEjPUoyP{7n&)k0d*g9-P3_Gf4~4B%_!-MEuO?!w{LTWW*`?&$4BivEo5KMPI&J89yd>0+|WV(aN&MWjx@e-FF z5S%c@R^&D7Gq3Hpdfqr1wug+$9GFI|S2iDtn*^p!Vj?Q^@EW6M>r!YqrcmPFvC@O= zS!!HHn7%GL_X#$uc#M8_z!Go~FXK3WL!mWbVAXHaW(nLl-COqQ-QE-jo_niZ**yfp z3!_TTkK!i7lcRUNA34+))!J*unP9NHqpa;7K0XLMKkT?G#^o~#gWf2SedUWfNmoydb5PCf4>Z2H>vi;kAcmB@k*=P!od2Pvk7TeXZ} zt#qA=g>Vd!JmF)>AHhE=A}NjvWx&oBB<82^+=*R9_nRIh=5#h0tD`*M=RFvwX5^X& zr&$_>^|#b`9c(fLbEAPkpdoBTUTDMxRS;_R#MJN$_5c6?0000Ap~gx8 literal 0 HcmV?d00001 diff --git a/feature/favorites/ui/build.gradle.kts b/feature/favorites/ui/build.gradle.kts index 8992567..50c3cb2 100644 --- a/feature/favorites/ui/build.gradle.kts +++ b/feature/favorites/ui/build.gradle.kts @@ -2,11 +2,12 @@ plugins { id("com.android.library") id("org.jetbrains.kotlin.android") id("com.google.devtools.ksp") + alias(libs.plugins.compose.compiler) } android { namespace = "com.tobioyelekan.dogbreed.feature.favorites" - compileSdk = 34 + compileSdk = 35 defaultConfig { minSdk = 24 @@ -34,9 +35,6 @@ android { buildFeatures { compose = true } - composeOptions { - kotlinCompilerExtensionVersion = "1.5.3" - } packaging { resources.excludes.add("META-INF/*") } diff --git a/feature/favorites/ui/src/main/kotlin/com/tobioyelekan/dogbreed/feature/favorites/FavoriteBreedScreen.kt b/feature/favorites/ui/src/main/kotlin/com/tobioyelekan/dogbreed/feature/favorites/FavoriteBreedScreen.kt index 086e4a1..a8c5a91 100644 --- a/feature/favorites/ui/src/main/kotlin/com/tobioyelekan/dogbreed/feature/favorites/FavoriteBreedScreen.kt +++ b/feature/favorites/ui/src/main/kotlin/com/tobioyelekan/dogbreed/feature/favorites/FavoriteBreedScreen.kt @@ -14,14 +14,14 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.testTag import androidx.compose.ui.text.style.TextAlign -import androidx.compose.ui.tooling.preview.Preview -import androidx.hilt.navigation.compose.hiltViewModel +import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.tobioyelekan.dogbreed.core.designsystem.components.DogBreedItem import com.tobioyelekan.dogbreed.core.designsystem.components.ErrorState import com.tobioyelekan.dogbreed.core.designsystem.components.LoadingIndicator import com.tobioyelekan.dogbreed.core.designsystem.theme.DogBreedTheme import com.tobioyelekan.dogbreed.core.model.DogBreed +import org.jetbrains.compose.ui.tooling.preview.Preview @Composable internal fun FavoriteBreedScreen( diff --git a/feature/subbreeds/data/build.gradle.kts b/feature/subbreeds/data/build.gradle.kts index 24fa009..9b6c9d8 100644 --- a/feature/subbreeds/data/build.gradle.kts +++ b/feature/subbreeds/data/build.gradle.kts @@ -7,7 +7,7 @@ plugins { android { namespace = "com.tobioyelekan.dogbreed.data.allbreeds" - compileSdk = 34 + compileSdk = 35 defaultConfig { minSdk = 24 diff --git a/feature/subbreeds/ui/build.gradle.kts b/feature/subbreeds/ui/build.gradle.kts index 6da1de6..2a50af0 100644 --- a/feature/subbreeds/ui/build.gradle.kts +++ b/feature/subbreeds/ui/build.gradle.kts @@ -2,11 +2,12 @@ plugins { id("com.android.library") id("org.jetbrains.kotlin.android") id("com.google.devtools.ksp") + alias(libs.plugins.compose.compiler) } android { namespace = "com.tobioyelekan.dogbreed.feature.subbreeds" - compileSdk = 34 + compileSdk = 35 defaultConfig { minSdk = 24 @@ -34,9 +35,6 @@ android { buildFeatures { compose = true } - composeOptions { - kotlinCompilerExtensionVersion = "1.5.3" - } packaging { resources.excludes.add("META-INF/*") } diff --git a/feature/subbreeds/ui/src/main/kotlin/com/tobioyelekan/dogbreed/feature/subbreeds/SubBreedsScreen.kt b/feature/subbreeds/ui/src/main/kotlin/com/tobioyelekan/dogbreed/feature/subbreeds/SubBreedsScreen.kt index 8b3a3ae..1595217 100644 --- a/feature/subbreeds/ui/src/main/kotlin/com/tobioyelekan/dogbreed/feature/subbreeds/SubBreedsScreen.kt +++ b/feature/subbreeds/ui/src/main/kotlin/com/tobioyelekan/dogbreed/feature/subbreeds/SubBreedsScreen.kt @@ -17,15 +17,15 @@ import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.testTag import androidx.compose.ui.res.painterResource import androidx.compose.ui.unit.dp -import androidx.hilt.navigation.compose.hiltViewModel +import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle -import coil.compose.AsyncImage -import coil.request.ImageRequest +import coil3.compose.AsyncImage +import coil3.request.ImageRequest +import coil3.request.crossfade import com.tobioyelekan.dogbreed.core.designsystem.components.DogAppBar import com.tobioyelekan.dogbreed.core.designsystem.components.ErrorState import com.tobioyelekan.dogbreed.core.designsystem.components.LoadingIndicator import com.tobioyelekan.dogbreed.core.model.SubBreedImage -import com.tobioyelekan.dogbreed.core.designsystem.R @Composable internal fun SubBreedsScreen( @@ -75,7 +75,9 @@ private fun SubBreedsListContent( ) { items(subBreeds) { item -> val model = - ImageRequest.Builder(LocalContext.current).data(item.imageUrl).crossfade(true) + ImageRequest.Builder(LocalContext.current) + .data(item.imageUrl) + .crossfade(true) .build() AsyncImage( diff --git a/feature/subbreeds/ui/src/main/res/drawable/ic_dog_placeholder.webp b/feature/subbreeds/ui/src/main/res/drawable/ic_dog_placeholder.webp new file mode 100644 index 0000000000000000000000000000000000000000..501e1bd48a1e68a2b523ef82f754574a668c4a3a GIT binary patch literal 1440 zcmV;R1z-A7Nk&GP1pok7MM6+kP&gor1pokWF#w$bD&YX(06vjMno1?4A|a@_sUWZt z32AQpe3&urr%``gdouFg!tS|S%(S$i%{R#l*MD#ZtTyL>TTB~sz%1*hEe%-!G;&fm0U}!dKYe8=>*p@ha%D|mbmb~LB|5o#oZx{o;GT%@nRrvb0 zB%9I>qiGeu1y8X{0`H)O{;9l90$A_k z)*3eo<$agGOvnP5HhN6~NbZ(;+Z&*Z&HmfxtmOxS2c4a6@-A(zBmYWYm|-|xGcWr) zFGo%neS0Uj_*d-Bv{`((@9xDixiEh@xQi_kf)nDsanCzAnh-K7tzW2Tf#Xqw#^do( z`2D%xt;x`OpCs}T0r&DmjFw(60f;;tp>eu%+8=}_w71!X z6Hl=Mp8+%Nsd#KbuH2^@qn)y*5qY`UEi_{yjj|)JSmHX(2dI*e^YB9=;qNG0DI+H! zMM(bdUFiJnOH|;So`H3=*_w(tyeESF^vz~IEZftCY{|M9>SDLBch=0%b9#+&t&jpw z6O21P0pJn)s*iuM>YkwS`G?W>@35So87VAI>3QmaUANRJiTxKeAKPbbBm-AdeDRAX zKx)=|Pyr?W&7uc5(hP582Fj0;#@kqqo!5_Jp;H@`pX(8{)3cPGG(i4pb7QsrkU#V; z8J=7{$#!r%4>I(AVF5j1d4JjRfqPGu1qi6xy^Q6MS3new z-7W6rK_#o&KsIhQ0f7^R7_Hgh-k+JIw$b5DAO)a9QWV1AVFVH{Dm4 zEjPUoyP{7n&)k0d*g9-P3_Gf4~4B%_!-MEuO?!w{LTWW*`?&$4BivEo5KMPI&J89yd>0+|WV(aN&MWjx@e-FF z5S%c@R^&D7Gq3Hpdfqr1wug+$9GFI|S2iDtn*^p!Vj?Q^@EW6M>r!YqrcmPFvC@O= zS!!HHn7%GL_X#$uc#M8_z!Go~FXK3WL!mWbVAXHaW(nLl-COqQ-QE-jo_niZ**yfp z3!_TTkK!i7lcRUNA34+))!J*unP9NHqpa;7K0XLMKkT?G#^o~#gWf2SedUWfNmoydb5PCf4>Z2H>vi;kAcmB@k*=P!od2Pvk7TeXZ} zt#qA=g>Vd!JmF)>AHhE=A}NjvWx&oBB<82^+=*R9_nRIh=5#h0tD`*M=RFvwX5^X& zr&$_>^|#b`9c(fLbEAPkpdoBTUTDMxRS;_R#MJN$_5c6?0000Ap~gx8 literal 0 HcmV?d00001 diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 94ed854..87673e2 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -10,12 +10,12 @@ compose-tooling-preview = "1.5.0" compose-junit-ui-test = "1.5.0" compose-test-manifest = "1.5.0" material3 = "1.2.0-alpha11" -coil = "2.4.0" +coil3 = "3.3.0" retrofit = "2.9.0" moshi = "1.15.0" -room = "2.6.1" -hilt = "2.48.1" -hilt-compose = "1.1.0" +room = "2.8.4" +hilt = "2.57.1" +hilt-compose = "1.3.0" kotlin-serialization = "1.5.1" kotlin-jakewharton-serialization = "1.0.0" http-logging = "4.11.0" @@ -31,8 +31,10 @@ coroutine-test = "1.5.2" androidx-test-core = "1.7.0" androidx-test-runner = "1.7.0" androidx-test = "1.7.0" -jetbrains-kotlin-jvm = "1.9.10" robolectric = "4.16" +composeMultiplatform = "1.8.0" +kotlin = "2.2.20" +ktor = "3.0.1" [libraries] core = { module = "androidx.core:core-ktx", version.ref = "core" } @@ -47,9 +49,15 @@ compose-ui = { module = "androidx.compose.ui:ui", version.ref = "compose-ui" } compose-ui-graphics = { module = "androidx.compose.ui:ui-graphics", version.ref = "compose-ui-graphics" } compose-material3 = { module = "androidx.compose.material3:material3", version.ref = "material3" } +#Ktor +ktor-okhttp = { group = "io.ktor", name = "ktor-client-okhttp", version.ref = "ktor" } +ktor-darwin = { group = "io.ktor", name = "ktor-client-darwin", version.ref = "ktor" } + # Coil -coil-core = { module = "io.coil-kt:coil", version.ref = "coil" } -coil-compose = { module = "io.coil-kt:coil-compose", version.ref = "coil" } +coil-core = { module = "io.coil-kt.coil3:coil", version.ref = "coil3" } +coil-compose = { module = "io.coil-kt.coil3:coil-compose", version.ref = "coil3" } +coil-compose-core = { module = "io.coil-kt.coil3:coil-compose-core", version.ref = "coil3" } +coil-network-ktor3 = { module = "io.coil-kt.coil3:coil-network-ktor3", version.ref = "coil3" } # Retrofit hilt-android-gradle-plugin = { module = "com.google.dagger:hilt-android-gradle-plugin", version.ref = "hilt" } @@ -97,9 +105,19 @@ androidx-test-runner = { module = "androidx.test:runner", version.ref = "android androidx-test-rules = { group = "androidx.test", name = "rules", version.ref = "androidx-test" } robolectric = { group = "org.robolectric", name = "robolectric", version.ref = "robolectric" } +[bundles] +coil = [ + "coil-core", + "coil-compose", + "coil-compose-core", + "coil-network-ktor3" +] + [plugins] android-library = { id = "com.android.library" } kotlin-android = { id = "org.jetbrains.kotlin.android" } dagger-hilt = { id = "com.google.dagger.hilt.android" } kotlin-kapt = { id = "kotlin-kapt" } -jetbrains-kotlin-jvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "jetbrains-kotlin-jvm" } +jetbrains-kotlin-jvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" } +jetbrainsCompose = { id = "org.jetbrains.compose", version.ref = "composeMultiplatform" } +compose-compiler = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" } diff --git a/settings.gradle.kts b/settings.gradle.kts index 2e59773..217d77f 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -6,7 +6,7 @@ pluginManagement { } } dependencyResolutionManagement { - repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) + repositoriesMode.set(RepositoriesMode.PREFER_PROJECT) repositories { google() mavenCentral() From d9cdb52541bd39d5ea490098ebeff3b7ee9219e6 Mon Sep 17 00:00:00 2001 From: Tobi Oyelekan Date: Mon, 29 Dec 2025 21:25:38 +0100 Subject: [PATCH 02/11] migrate :network to kmp, replace retrofit with ktor --- .idea/gradle.xml | 2 + app/build.gradle.kts | 3 + core/network/api/build.gradle.kts | 18 ++++++ .../core/network/api/DogBreedApiService.kt | 14 +++++ .../core/network/model/BreedImageApiModel.kt | 0 .../core/network/model/DogBreedsApiModel.kt | 0 .../network/model/SubBreedImageApiModel.kt | 0 .../{ => implementation}/build.gradle.kts | 50 ++++++++-------- .../core/network/HttpClient.android.kt.kt | 23 ++++++++ .../dogbreed/core/network/NetworkModule.kt | 23 ++++++++ .../dogbreed/core/network/HttpClient.kt | 19 ++++++ .../core/network/KtorDogBreedApiService.kt | 32 ++++++++++ .../dogbreed/core/network/HttpClient.ios.kt | 6 ++ .../dogbreed/core/network/HttpClient.jvm.kt | 5 ++ core/network/src/main/AndroidManifest.xml | 4 -- .../core/network/DogBreedApiService.kt | 23 -------- .../core/network/FakeDogBreedApiService.kt | 48 --------------- .../dogbreed/core/network/di/NetworkModule.kt | 58 ------------------- .../core/network/di/TestNetworkModule.kt | 22 ------- feature/allbreeds/data/build.gradle.kts | 2 +- .../repository/DogBreedRepositoryImpl.kt | 6 +- .../feature/allbreeds/di/AllBreedsUiModule.kt | 1 - feature/breedDetails/data/build.gradle.kts | 3 +- feature/subbreeds/data/build.gradle.kts | 2 +- .../repository/DogSubBreedRepositoryImpl.kt | 16 +++-- gradle/libs.versions.toml | 27 ++++----- settings.gradle.kts | 3 +- 27 files changed, 198 insertions(+), 212 deletions(-) create mode 100644 core/network/api/build.gradle.kts create mode 100644 core/network/api/src/commonMain/kotlin/com/tobioyelekan/dogbreed/core/network/api/DogBreedApiService.kt rename core/network/{src/main/java => api/src/commonMain/kotlin}/com/tobioyelekan/dogbreed/core/network/model/BreedImageApiModel.kt (100%) rename core/network/{src/main/java => api/src/commonMain/kotlin}/com/tobioyelekan/dogbreed/core/network/model/DogBreedsApiModel.kt (100%) rename core/network/{src/main/java => api/src/commonMain/kotlin}/com/tobioyelekan/dogbreed/core/network/model/SubBreedImageApiModel.kt (100%) rename core/network/{ => implementation}/build.gradle.kts (52%) create mode 100644 core/network/implementation/src/androidMain/kotlin/com/tobioyelekan/dogbreed/core/network/HttpClient.android.kt.kt create mode 100644 core/network/implementation/src/androidMain/kotlin/com/tobioyelekan/dogbreed/core/network/NetworkModule.kt create mode 100644 core/network/implementation/src/commonMain/kotlin/com/tobioyelekan/dogbreed/core/network/HttpClient.kt create mode 100644 core/network/implementation/src/commonMain/kotlin/com/tobioyelekan/dogbreed/core/network/KtorDogBreedApiService.kt create mode 100644 core/network/implementation/src/iosMain/kotlin/com/tobioyelekan/dogbreed/core/network/HttpClient.ios.kt create mode 100644 core/network/implementation/src/jvmMain/kotlin/com/tobioyelekan/dogbreed/core/network/HttpClient.jvm.kt delete mode 100644 core/network/src/main/AndroidManifest.xml delete mode 100644 core/network/src/main/java/com/tobioyelekan/dogbreed/core/network/DogBreedApiService.kt delete mode 100644 core/network/src/main/java/com/tobioyelekan/dogbreed/core/network/FakeDogBreedApiService.kt delete mode 100644 core/network/src/main/java/com/tobioyelekan/dogbreed/core/network/di/NetworkModule.kt delete mode 100644 core/network/src/main/java/com/tobioyelekan/dogbreed/core/network/di/TestNetworkModule.kt diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 1e3bae8..63c4253 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -17,6 +17,8 @@