From af653d9364054dd0fd5c35df20202ffdd2140cd1 Mon Sep 17 00:00:00 2001 From: Khairullo Date: Fri, 8 Sep 2023 13:11:51 +0200 Subject: [PATCH 01/48] Create github-actions --- github-actions | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 github-actions diff --git a/github-actions b/github-actions new file mode 100644 index 00000000..09d9233a --- /dev/null +++ b/github-actions @@ -0,0 +1,33 @@ +name: Build and Test + +on: + pull_request: + branches: + - main + types: + - opened + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v2 + + - name: Setup Java + uses: actions/setup-java@v2 + with: + java-version: 11 + + - name: Install Dependencies + run: ./gradlew clean assemble + + - name: Spotless Check + run: ./gradlew spotlessCheck + + - name: Detekt Check + run: ./gradlew detekt + + - name: Run Tests + run: ./gradlew test From 5324244d4ca7ea76346c7437cfcbfc45e6bff0fc Mon Sep 17 00:00:00 2001 From: Khairullo Date: Fri, 8 Sep 2023 13:38:14 +0200 Subject: [PATCH 02/48] Create github-actions --- .github/github-actions | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 .github/github-actions diff --git a/.github/github-actions b/.github/github-actions new file mode 100644 index 00000000..f6140a19 --- /dev/null +++ b/.github/github-actions @@ -0,0 +1,33 @@ +name: Build and Test + +on: + pull_request: + branches: + - main + types: + - opened + +jobs: + verify: + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v2 + + - name: Setup Java + uses: actions/setup-java@v2 + with: + java-version: 17 + + - name: Install Dependencies + run: ./gradlew clean assemble + + - name: Spotless Check + run: ./gradlew spotlessCheck + + - name: Detekt Check + run: ./gradlew detekt + + - name: Run Tests + run: ./gradlew test From 87e3c1332dfcc26cf1024e91c553dc301fb3029b Mon Sep 17 00:00:00 2001 From: khairullo Date: Fri, 8 Sep 2023 13:45:39 +0200 Subject: [PATCH 03/48] ci: replaced github-actions --- .github/{ => workflows}/github-actions | 4 +++- github-actions | 33 -------------------------- 2 files changed, 3 insertions(+), 34 deletions(-) rename .github/{ => workflows}/github-actions (92%) delete mode 100644 github-actions diff --git a/.github/github-actions b/.github/workflows/github-actions similarity index 92% rename from .github/github-actions rename to .github/workflows/github-actions index f6140a19..b8556d9b 100644 --- a/.github/github-actions +++ b/.github/workflows/github-actions @@ -6,9 +6,11 @@ on: - main types: - opened + - synchronize + - reopened jobs: - verify: + build: runs-on: ubuntu-latest steps: diff --git a/github-actions b/github-actions deleted file mode 100644 index 09d9233a..00000000 --- a/github-actions +++ /dev/null @@ -1,33 +0,0 @@ -name: Build and Test - -on: - pull_request: - branches: - - main - types: - - opened - -jobs: - build: - runs-on: ubuntu-latest - - steps: - - name: Checkout code - uses: actions/checkout@v2 - - - name: Setup Java - uses: actions/setup-java@v2 - with: - java-version: 11 - - - name: Install Dependencies - run: ./gradlew clean assemble - - - name: Spotless Check - run: ./gradlew spotlessCheck - - - name: Detekt Check - run: ./gradlew detekt - - - name: Run Tests - run: ./gradlew test From 269a08aef97a1f94032611ef7b57d547e05d5387 Mon Sep 17 00:00:00 2001 From: Khairullo Date: Fri, 8 Sep 2023 13:49:08 +0200 Subject: [PATCH 04/48] Update github-actions Changed setup-java@ version to 1 --- .github/workflows/github-actions | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/github-actions b/.github/workflows/github-actions index b8556d9b..1980a4d8 100644 --- a/.github/workflows/github-actions +++ b/.github/workflows/github-actions @@ -18,7 +18,7 @@ jobs: uses: actions/checkout@v2 - name: Setup Java - uses: actions/setup-java@v2 + uses: actions/setup-java@v1 with: java-version: 17 From c2befc9a124c938c99e887d1c3fbc9e41a697250 Mon Sep 17 00:00:00 2001 From: Khairullo Date: Fri, 8 Sep 2023 14:03:33 +0200 Subject: [PATCH 05/48] Update github-actions Removed unnecessary step from the actions --- .github/workflows/github-actions | 3 --- 1 file changed, 3 deletions(-) diff --git a/.github/workflows/github-actions b/.github/workflows/github-actions index 1980a4d8..30d46986 100644 --- a/.github/workflows/github-actions +++ b/.github/workflows/github-actions @@ -22,9 +22,6 @@ jobs: with: java-version: 17 - - name: Install Dependencies - run: ./gradlew clean assemble - - name: Spotless Check run: ./gradlew spotlessCheck From 7060931fc14780087cf1d96eed3619bd6488bf98 Mon Sep 17 00:00:00 2001 From: khairullo Date: Mon, 11 Sep 2023 16:11:57 +0200 Subject: [PATCH 06/48] feat: created a core module --- core/build.gradle.kts | 44 +++++++++++++++++++++++++++++++++++++++++++ settings.gradle.kts | 4 +++- 2 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 core/build.gradle.kts diff --git a/core/build.gradle.kts b/core/build.gradle.kts new file mode 100644 index 00000000..b1ca71cd --- /dev/null +++ b/core/build.gradle.kts @@ -0,0 +1,44 @@ +@Suppress("DSL_SCOPE_VIOLATION") // TODO: Remove once KTIJ-19369 is fixed +plugins { + id("com.android.library") + id("dagger.hilt.android.plugin") + id("org.jetbrains.kotlin.android") + id("org.jetbrains.kotlin.kapt") +} + +android { + compileSdk = 34 + namespace = "com.monstarlab.core" + flavorDimensions += "default" + defaultConfig { + minSdk = 23 + } + + composeOptions { + kotlinCompilerExtensionVersion = libs.versions.compose.compiler.get() + } + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } +} + +kotlin { + jvmToolchain { + languageVersion.set(JavaLanguageVersion.of(JavaVersion.VERSION_11.toString())) + } +} + +kapt { + correctErrorTypes = true +} + +dependencies { + // Kotlin + implementation(libs.bundles.kotlin) + + // Injection + implementation(libs.hilt.android) + kapt(libs.hilt.compiler) +} \ No newline at end of file diff --git a/settings.gradle.kts b/settings.gradle.kts index ff6d6c5d..b56e6c6f 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -12,5 +12,7 @@ dependencyResolutionManagement { mavenCentral() } } +rootProject.name = "android-template" + include(":app") -rootProject.name = "android-template" \ No newline at end of file +include(":core") \ No newline at end of file From 7f38bb40aa04931a44c3f8b7424558952e261084 Mon Sep 17 00:00:00 2001 From: khairullo Date: Mon, 11 Sep 2023 16:12:38 +0200 Subject: [PATCH 07/48] feat: added core module to the app --- app/build.gradle.kts | 1 + 1 file changed, 1 insertion(+) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 0ab8106b..70faffad 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -135,4 +135,5 @@ dependencies { testImplementation(libs.bundles.test) androidTestImplementation(libs.bundles.android.test) + implementation(project(":core")) } From 88c908616d10539a90aaf17e81b166d08080fa77 Mon Sep 17 00:00:00 2001 From: khairullo Date: Mon, 11 Sep 2023 16:14:10 +0200 Subject: [PATCH 08/48] refactor: moved error package to the core module --- .../com/monstarlab/core/network/errorhandling/ApiException.kt | 0 .../monstarlab/core/network/errorhandling}/error/ErrorModel.kt | 3 ++- .../errorhandling}/error/ErrorModelWithDisplayableMessage.kt | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) rename {app => core}/src/main/java/com/monstarlab/core/network/errorhandling/ApiException.kt (100%) rename {app/src/main/java/com/monstarlab/core => core/src/main/java/com/monstarlab/core/network/errorhandling}/error/ErrorModel.kt (93%) rename {app/src/main/java/com/monstarlab/core => core/src/main/java/com/monstarlab/core/network/errorhandling}/error/ErrorModelWithDisplayableMessage.kt (82%) diff --git a/app/src/main/java/com/monstarlab/core/network/errorhandling/ApiException.kt b/core/src/main/java/com/monstarlab/core/network/errorhandling/ApiException.kt similarity index 100% rename from app/src/main/java/com/monstarlab/core/network/errorhandling/ApiException.kt rename to core/src/main/java/com/monstarlab/core/network/errorhandling/ApiException.kt diff --git a/app/src/main/java/com/monstarlab/core/error/ErrorModel.kt b/core/src/main/java/com/monstarlab/core/network/errorhandling/error/ErrorModel.kt similarity index 93% rename from app/src/main/java/com/monstarlab/core/error/ErrorModel.kt rename to core/src/main/java/com/monstarlab/core/network/errorhandling/error/ErrorModel.kt index dd2482e4..5f1efffd 100644 --- a/app/src/main/java/com/monstarlab/core/error/ErrorModel.kt +++ b/core/src/main/java/com/monstarlab/core/network/errorhandling/error/ErrorModel.kt @@ -1,4 +1,4 @@ -package com.monstarlab.core.error +package com.monstarlab.core.network.errorhandling.error import com.monstarlab.core.network.errorhandling.ApiException import java.io.IOException @@ -14,6 +14,7 @@ sealed interface ErrorModel { object IOError : Connection() object UnknownHost : Connection() } + data class Unknown(val throwable: Throwable) : ErrorModel } diff --git a/app/src/main/java/com/monstarlab/core/error/ErrorModelWithDisplayableMessage.kt b/core/src/main/java/com/monstarlab/core/network/errorhandling/error/ErrorModelWithDisplayableMessage.kt similarity index 82% rename from app/src/main/java/com/monstarlab/core/error/ErrorModelWithDisplayableMessage.kt rename to core/src/main/java/com/monstarlab/core/network/errorhandling/error/ErrorModelWithDisplayableMessage.kt index c80c721a..008b0248 100644 --- a/app/src/main/java/com/monstarlab/core/error/ErrorModelWithDisplayableMessage.kt +++ b/core/src/main/java/com/monstarlab/core/network/errorhandling/error/ErrorModelWithDisplayableMessage.kt @@ -1,4 +1,4 @@ -package com.monstarlab.core.error +package com.monstarlab.core.network.errorhandling.error val ErrorModel.displayableMessage: String get() { From 7af479af410f23dc92b25e91c523028e330c2469 Mon Sep 17 00:00:00 2001 From: khairullo Date: Mon, 11 Sep 2023 16:15:06 +0200 Subject: [PATCH 09/48] refactor: moved extensions package to the core module --- .../core/network/errorhandling}/extensions/Extensions.kt | 2 +- .../core/network/errorhandling}/extensions/FlowExtensions.kt | 2 +- .../core/network/errorhandling}/extensions/StringExtensions.kt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) rename {app/src/main/java/com/monstarlab/core => core/src/main/java/com/monstarlab/core/network/errorhandling}/extensions/Extensions.kt (92%) rename {app/src/main/java/com/monstarlab/core => core/src/main/java/com/monstarlab/core/network/errorhandling}/extensions/FlowExtensions.kt (85%) rename {app/src/main/java/com/monstarlab/core => core/src/main/java/com/monstarlab/core/network/errorhandling}/extensions/StringExtensions.kt (64%) diff --git a/app/src/main/java/com/monstarlab/core/extensions/Extensions.kt b/core/src/main/java/com/monstarlab/core/network/errorhandling/extensions/Extensions.kt similarity index 92% rename from app/src/main/java/com/monstarlab/core/extensions/Extensions.kt rename to core/src/main/java/com/monstarlab/core/network/errorhandling/extensions/Extensions.kt index 33409467..6e2ce40f 100644 --- a/app/src/main/java/com/monstarlab/core/extensions/Extensions.kt +++ b/core/src/main/java/com/monstarlab/core/network/errorhandling/extensions/Extensions.kt @@ -1,4 +1,4 @@ -package com.monstarlab.core.extensions +package com.monstarlab.core.network.errorhandling.extensions import kotlinx.coroutines.CancellationException diff --git a/app/src/main/java/com/monstarlab/core/extensions/FlowExtensions.kt b/core/src/main/java/com/monstarlab/core/network/errorhandling/extensions/FlowExtensions.kt similarity index 85% rename from app/src/main/java/com/monstarlab/core/extensions/FlowExtensions.kt rename to core/src/main/java/com/monstarlab/core/network/errorhandling/extensions/FlowExtensions.kt index e313c2f9..a91cab26 100644 --- a/app/src/main/java/com/monstarlab/core/extensions/FlowExtensions.kt +++ b/core/src/main/java/com/monstarlab/core/network/errorhandling/extensions/FlowExtensions.kt @@ -1,4 +1,4 @@ -package com.monstarlab.core.extensions +package com.monstarlab.core.network.errorhandling.extensions import kotlinx.coroutines.delay import kotlinx.coroutines.flow.Flow diff --git a/app/src/main/java/com/monstarlab/core/extensions/StringExtensions.kt b/core/src/main/java/com/monstarlab/core/network/errorhandling/extensions/StringExtensions.kt similarity index 64% rename from app/src/main/java/com/monstarlab/core/extensions/StringExtensions.kt rename to core/src/main/java/com/monstarlab/core/network/errorhandling/extensions/StringExtensions.kt index 17f7efc8..9e98a3e4 100644 --- a/app/src/main/java/com/monstarlab/core/extensions/StringExtensions.kt +++ b/core/src/main/java/com/monstarlab/core/network/errorhandling/extensions/StringExtensions.kt @@ -1,4 +1,4 @@ -package com.monstarlab.core.extensions +package com.monstarlab.core.network.errorhandling.extensions fun String.without(value: String) = replace(value, "") From 13863da7546883413cd7ca06ce79a4b770308ced Mon Sep 17 00:00:00 2001 From: khairullo Date: Mon, 11 Sep 2023 16:15:53 +0200 Subject: [PATCH 10/48] refactor: moved injection package to the core module --- .../com/monstarlab/core/ui/extensions/ContextExtensions.kt | 2 +- .../features/login/domain/usecase/LoginUseCase.kt | 2 +- .../java/com/monstarlab/features/login/ui/LoginContract.kt | 2 +- .../java/com/monstarlab/features/login/ui/LoginScreen.kt | 2 +- .../java/com/monstarlab/features/login/ui/LoginViewModel.kt | 2 +- .../features/nstack/domain/usecase/SetupNstackUseCase.kt | 6 ++++-- .../resources/domain/usecase/GetResourcesUseCase.kt | 2 +- .../monstarlab/features/resources/ui/ResourcesContract.kt | 2 +- .../monstarlab/features/resources/ui/ResourcesViewModel.kt | 2 +- .../network/errorhandling}/injection/CoroutineQualifiers.kt | 2 +- .../network/errorhandling}/injection/CoroutinesModule.kt | 2 +- 11 files changed, 14 insertions(+), 12 deletions(-) rename {app/src/main/java/com/monstarlab/core => core/src/main/java/com/monstarlab/core/network/errorhandling}/injection/CoroutineQualifiers.kt (86%) rename {app/src/main/java/com/monstarlab/core => core/src/main/java/com/monstarlab/core/network/errorhandling}/injection/CoroutinesModule.kt (92%) diff --git a/app/src/main/java/com/monstarlab/core/ui/extensions/ContextExtensions.kt b/app/src/main/java/com/monstarlab/core/ui/extensions/ContextExtensions.kt index e17148bd..43c12674 100644 --- a/app/src/main/java/com/monstarlab/core/ui/extensions/ContextExtensions.kt +++ b/app/src/main/java/com/monstarlab/core/ui/extensions/ContextExtensions.kt @@ -11,7 +11,7 @@ import android.provider.Settings import android.widget.Toast import androidx.core.content.ContextCompat import androidx.core.net.toUri -import com.monstarlab.core.extensions.castAs +import com.monstarlab.core.network.errorhandling.extensions.castAs fun Context.openSettings() { val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS) diff --git a/app/src/main/java/com/monstarlab/features/login/domain/usecase/LoginUseCase.kt b/app/src/main/java/com/monstarlab/features/login/domain/usecase/LoginUseCase.kt index c80897e7..78b089a3 100644 --- a/app/src/main/java/com/monstarlab/features/login/domain/usecase/LoginUseCase.kt +++ b/app/src/main/java/com/monstarlab/features/login/domain/usecase/LoginUseCase.kt @@ -1,6 +1,6 @@ package com.monstarlab.features.login.domain.usecase -import com.monstarlab.core.extensions.suspendRunCatching +import com.monstarlab.core.network.errorhandling.extensions.suspendRunCatching import com.monstarlab.features.auth.domain.repository.AuthRepository import com.monstarlab.features.user.domain.repository.UserRepository import javax.inject.Inject diff --git a/app/src/main/java/com/monstarlab/features/login/ui/LoginContract.kt b/app/src/main/java/com/monstarlab/features/login/ui/LoginContract.kt index 7898a362..c6a0fd8c 100644 --- a/app/src/main/java/com/monstarlab/features/login/ui/LoginContract.kt +++ b/app/src/main/java/com/monstarlab/features/login/ui/LoginContract.kt @@ -1,6 +1,6 @@ package com.monstarlab.features.login.ui -import com.monstarlab.core.error.ErrorModel +import com.monstarlab.core.network.errorhandling.error.ErrorModel /** * UI State that represents LoginScreen diff --git a/app/src/main/java/com/monstarlab/features/login/ui/LoginScreen.kt b/app/src/main/java/com/monstarlab/features/login/ui/LoginScreen.kt index 18db7d10..18eca85a 100644 --- a/app/src/main/java/com/monstarlab/features/login/ui/LoginScreen.kt +++ b/app/src/main/java/com/monstarlab/features/login/ui/LoginScreen.kt @@ -14,7 +14,7 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.text.input.PasswordVisualTransformation -import com.monstarlab.core.error.displayableMessage +import com.monstarlab.core.network.errorhandling.error.displayableMessage import com.monstarlab.core.ui.previews.LightDarkPreview import com.monstarlab.designsystem.components.AppTopBar import com.monstarlab.designsystem.components.appbutton.AppButton diff --git a/app/src/main/java/com/monstarlab/features/login/ui/LoginViewModel.kt b/app/src/main/java/com/monstarlab/features/login/ui/LoginViewModel.kt index cf438a9a..f471e647 100644 --- a/app/src/main/java/com/monstarlab/features/login/ui/LoginViewModel.kt +++ b/app/src/main/java/com/monstarlab/features/login/ui/LoginViewModel.kt @@ -2,7 +2,7 @@ package com.monstarlab.features.login.ui import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import com.monstarlab.core.error.toError +import com.monstarlab.core.network.errorhandling.error.toError import com.monstarlab.features.login.domain.usecase.LoginUseCase import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.MutableStateFlow diff --git a/app/src/main/java/com/monstarlab/features/nstack/domain/usecase/SetupNstackUseCase.kt b/app/src/main/java/com/monstarlab/features/nstack/domain/usecase/SetupNstackUseCase.kt index 332cd4af..6c377bbd 100644 --- a/app/src/main/java/com/monstarlab/features/nstack/domain/usecase/SetupNstackUseCase.kt +++ b/app/src/main/java/com/monstarlab/features/nstack/domain/usecase/SetupNstackUseCase.kt @@ -1,12 +1,14 @@ package com.monstarlab.features.nstack.domain.usecase -import com.monstarlab.core.extensions.suspendRunCatching -import com.monstarlab.core.injection.IoDispatcher +import com.monstarlab.core.network.errorhandling.injection.IoDispatcher +import com.monstarlab.core.network.errorhandling.extensions.suspendRunCatching import dk.nodes.nstack.kotlin.NStack import dk.nodes.nstack.kotlin.models.AppOpenData import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.withContext import javax.inject.Inject +import kotlin.Exception +import kotlin.Result import dk.nodes.nstack.kotlin.models.Result as NstackResult class SetupNstackUseCase @Inject constructor( diff --git a/app/src/main/java/com/monstarlab/features/resources/domain/usecase/GetResourcesUseCase.kt b/app/src/main/java/com/monstarlab/features/resources/domain/usecase/GetResourcesUseCase.kt index 0fd5ad0d..39ad76f3 100644 --- a/app/src/main/java/com/monstarlab/features/resources/domain/usecase/GetResourcesUseCase.kt +++ b/app/src/main/java/com/monstarlab/features/resources/domain/usecase/GetResourcesUseCase.kt @@ -1,6 +1,6 @@ package com.monstarlab.features.resources.domain.usecase -import com.monstarlab.core.extensions.suspendRunCatching +import com.monstarlab.core.network.errorhandling.extensions.suspendRunCatching import com.monstarlab.features.resources.domain.repository.ResourceRepository import kotlinx.coroutines.delay import javax.inject.Inject diff --git a/app/src/main/java/com/monstarlab/features/resources/ui/ResourcesContract.kt b/app/src/main/java/com/monstarlab/features/resources/ui/ResourcesContract.kt index 97654fd0..b79ba04f 100644 --- a/app/src/main/java/com/monstarlab/features/resources/ui/ResourcesContract.kt +++ b/app/src/main/java/com/monstarlab/features/resources/ui/ResourcesContract.kt @@ -1,6 +1,6 @@ package com.monstarlab.features.resources.ui -import com.monstarlab.core.error.ErrorModel +import com.monstarlab.core.network.errorhandling.error.ErrorModel import com.monstarlab.features.resources.domain.model.Resource /** diff --git a/app/src/main/java/com/monstarlab/features/resources/ui/ResourcesViewModel.kt b/app/src/main/java/com/monstarlab/features/resources/ui/ResourcesViewModel.kt index 6d8b20ec..a305c367 100644 --- a/app/src/main/java/com/monstarlab/features/resources/ui/ResourcesViewModel.kt +++ b/app/src/main/java/com/monstarlab/features/resources/ui/ResourcesViewModel.kt @@ -2,7 +2,7 @@ package com.monstarlab.features.resources.ui import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import com.monstarlab.core.error.toError +import com.monstarlab.core.network.errorhandling.error.toError import com.monstarlab.features.resources.domain.usecase.GetResourcesUseCase import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.MutableStateFlow diff --git a/app/src/main/java/com/monstarlab/core/injection/CoroutineQualifiers.kt b/core/src/main/java/com/monstarlab/core/network/errorhandling/injection/CoroutineQualifiers.kt similarity index 86% rename from app/src/main/java/com/monstarlab/core/injection/CoroutineQualifiers.kt rename to core/src/main/java/com/monstarlab/core/network/errorhandling/injection/CoroutineQualifiers.kt index 1663a36a..3b96a6e6 100644 --- a/app/src/main/java/com/monstarlab/core/injection/CoroutineQualifiers.kt +++ b/core/src/main/java/com/monstarlab/core/network/errorhandling/injection/CoroutineQualifiers.kt @@ -1,4 +1,4 @@ -package com.monstarlab.core.injection +package com.monstarlab.core.network.errorhandling.injection import javax.inject.Qualifier diff --git a/app/src/main/java/com/monstarlab/core/injection/CoroutinesModule.kt b/core/src/main/java/com/monstarlab/core/network/errorhandling/injection/CoroutinesModule.kt similarity index 92% rename from app/src/main/java/com/monstarlab/core/injection/CoroutinesModule.kt rename to core/src/main/java/com/monstarlab/core/network/errorhandling/injection/CoroutinesModule.kt index 76fb89d6..b03c4fbc 100644 --- a/app/src/main/java/com/monstarlab/core/injection/CoroutinesModule.kt +++ b/core/src/main/java/com/monstarlab/core/network/errorhandling/injection/CoroutinesModule.kt @@ -1,4 +1,4 @@ -package com.monstarlab.core.injection +package com.monstarlab.core.network.errorhandling.injection import dagger.Module import dagger.Provides From e3bc4d8223eb14a98cee42aae2ee7303a00aee0b Mon Sep 17 00:00:00 2001 From: khairullo Date: Tue, 12 Sep 2023 09:02:03 +0200 Subject: [PATCH 11/48] feat: implemented AppModule di class to provide baseUrl from the app module to the core module --- app/src/main/java/com/monstarlab/AppModule.kt | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 app/src/main/java/com/monstarlab/AppModule.kt diff --git a/app/src/main/java/com/monstarlab/AppModule.kt b/app/src/main/java/com/monstarlab/AppModule.kt new file mode 100644 index 00000000..a7dd8e32 --- /dev/null +++ b/app/src/main/java/com/monstarlab/AppModule.kt @@ -0,0 +1,19 @@ +package com.monstarlab + +import dagger.Module +import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.components.SingletonComponent +import javax.inject.Singleton + +@InstallIn(SingletonComponent::class) +@Module +class AppModule { + + @Provides + @Singleton + fun provideBaseUrl(): String { + return BuildConfig.API_URL + } + +} \ No newline at end of file From 0fbe680f5311d657f70fe2d484cf95e440b3b4d1 Mon Sep 17 00:00:00 2001 From: khairullo Date: Tue, 12 Sep 2023 09:03:45 +0200 Subject: [PATCH 12/48] refactor: moved network package to the core module --- .../core/ui/extensions/ContextExtensions.kt | 2 +- .../features/login/domain/usecase/LoginUseCase.kt | 2 +- .../monstarlab/features/login/ui/LoginContract.kt | 2 +- .../com/monstarlab/features/login/ui/LoginScreen.kt | 2 +- .../monstarlab/features/login/ui/LoginViewModel.kt | 2 +- .../nstack/domain/usecase/SetupNstackUseCase.kt | 4 ++-- .../resources/domain/usecase/GetResourcesUseCase.kt | 2 +- .../features/resources/ui/ResourcesContract.kt | 2 +- .../features/resources/ui/ResourcesViewModel.kt | 2 +- core/build.gradle.kts | 12 ++++++++++++ .../{network/errorhandling => }/error/ErrorModel.kt | 2 +- .../error/ErrorModelWithDisplayableMessage.kt | 2 +- .../errorhandling => }/extensions/Extensions.kt | 2 +- .../errorhandling => }/extensions/FlowExtensions.kt | 2 +- .../extensions/StringExtensions.kt | 2 +- .../injection/CoroutineQualifiers.kt | 2 +- .../errorhandling => }/injection/CoroutinesModule.kt | 2 +- .../java/com/monstarlab/core/network/OkHttpModule.kt | 2 +- .../core/network/errorhandling/ApiErrorDTO.kt | 0 .../network/errorhandling/ApiErrorInterceptor.kt | 1 - 20 files changed, 30 insertions(+), 19 deletions(-) rename core/src/main/java/com/monstarlab/core/{network/errorhandling => }/error/ErrorModel.kt (93%) rename core/src/main/java/com/monstarlab/core/{network/errorhandling => }/error/ErrorModelWithDisplayableMessage.kt (82%) rename core/src/main/java/com/monstarlab/core/{network/errorhandling => }/extensions/Extensions.kt (92%) rename core/src/main/java/com/monstarlab/core/{network/errorhandling => }/extensions/FlowExtensions.kt (85%) rename core/src/main/java/com/monstarlab/core/{network/errorhandling => }/extensions/StringExtensions.kt (64%) rename core/src/main/java/com/monstarlab/core/{network/errorhandling => }/injection/CoroutineQualifiers.kt (86%) rename core/src/main/java/com/monstarlab/core/{network/errorhandling => }/injection/CoroutinesModule.kt (92%) rename {app => core}/src/main/java/com/monstarlab/core/network/OkHttpModule.kt (98%) rename {app => core}/src/main/java/com/monstarlab/core/network/errorhandling/ApiErrorDTO.kt (100%) rename {app => core}/src/main/java/com/monstarlab/core/network/errorhandling/ApiErrorInterceptor.kt (96%) diff --git a/app/src/main/java/com/monstarlab/core/ui/extensions/ContextExtensions.kt b/app/src/main/java/com/monstarlab/core/ui/extensions/ContextExtensions.kt index 43c12674..e17148bd 100644 --- a/app/src/main/java/com/monstarlab/core/ui/extensions/ContextExtensions.kt +++ b/app/src/main/java/com/monstarlab/core/ui/extensions/ContextExtensions.kt @@ -11,7 +11,7 @@ import android.provider.Settings import android.widget.Toast import androidx.core.content.ContextCompat import androidx.core.net.toUri -import com.monstarlab.core.network.errorhandling.extensions.castAs +import com.monstarlab.core.extensions.castAs fun Context.openSettings() { val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS) diff --git a/app/src/main/java/com/monstarlab/features/login/domain/usecase/LoginUseCase.kt b/app/src/main/java/com/monstarlab/features/login/domain/usecase/LoginUseCase.kt index 78b089a3..c80897e7 100644 --- a/app/src/main/java/com/monstarlab/features/login/domain/usecase/LoginUseCase.kt +++ b/app/src/main/java/com/monstarlab/features/login/domain/usecase/LoginUseCase.kt @@ -1,6 +1,6 @@ package com.monstarlab.features.login.domain.usecase -import com.monstarlab.core.network.errorhandling.extensions.suspendRunCatching +import com.monstarlab.core.extensions.suspendRunCatching import com.monstarlab.features.auth.domain.repository.AuthRepository import com.monstarlab.features.user.domain.repository.UserRepository import javax.inject.Inject diff --git a/app/src/main/java/com/monstarlab/features/login/ui/LoginContract.kt b/app/src/main/java/com/monstarlab/features/login/ui/LoginContract.kt index c6a0fd8c..7898a362 100644 --- a/app/src/main/java/com/monstarlab/features/login/ui/LoginContract.kt +++ b/app/src/main/java/com/monstarlab/features/login/ui/LoginContract.kt @@ -1,6 +1,6 @@ package com.monstarlab.features.login.ui -import com.monstarlab.core.network.errorhandling.error.ErrorModel +import com.monstarlab.core.error.ErrorModel /** * UI State that represents LoginScreen diff --git a/app/src/main/java/com/monstarlab/features/login/ui/LoginScreen.kt b/app/src/main/java/com/monstarlab/features/login/ui/LoginScreen.kt index 18eca85a..18db7d10 100644 --- a/app/src/main/java/com/monstarlab/features/login/ui/LoginScreen.kt +++ b/app/src/main/java/com/monstarlab/features/login/ui/LoginScreen.kt @@ -14,7 +14,7 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.text.input.PasswordVisualTransformation -import com.monstarlab.core.network.errorhandling.error.displayableMessage +import com.monstarlab.core.error.displayableMessage import com.monstarlab.core.ui.previews.LightDarkPreview import com.monstarlab.designsystem.components.AppTopBar import com.monstarlab.designsystem.components.appbutton.AppButton diff --git a/app/src/main/java/com/monstarlab/features/login/ui/LoginViewModel.kt b/app/src/main/java/com/monstarlab/features/login/ui/LoginViewModel.kt index f471e647..cf438a9a 100644 --- a/app/src/main/java/com/monstarlab/features/login/ui/LoginViewModel.kt +++ b/app/src/main/java/com/monstarlab/features/login/ui/LoginViewModel.kt @@ -2,7 +2,7 @@ package com.monstarlab.features.login.ui import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import com.monstarlab.core.network.errorhandling.error.toError +import com.monstarlab.core.error.toError import com.monstarlab.features.login.domain.usecase.LoginUseCase import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.MutableStateFlow diff --git a/app/src/main/java/com/monstarlab/features/nstack/domain/usecase/SetupNstackUseCase.kt b/app/src/main/java/com/monstarlab/features/nstack/domain/usecase/SetupNstackUseCase.kt index 6c377bbd..93cfbe2c 100644 --- a/app/src/main/java/com/monstarlab/features/nstack/domain/usecase/SetupNstackUseCase.kt +++ b/app/src/main/java/com/monstarlab/features/nstack/domain/usecase/SetupNstackUseCase.kt @@ -1,7 +1,7 @@ package com.monstarlab.features.nstack.domain.usecase -import com.monstarlab.core.network.errorhandling.injection.IoDispatcher -import com.monstarlab.core.network.errorhandling.extensions.suspendRunCatching +import com.monstarlab.core.injection.IoDispatcher +import com.monstarlab.core.extensions.suspendRunCatching import dk.nodes.nstack.kotlin.NStack import dk.nodes.nstack.kotlin.models.AppOpenData import kotlinx.coroutines.CoroutineDispatcher diff --git a/app/src/main/java/com/monstarlab/features/resources/domain/usecase/GetResourcesUseCase.kt b/app/src/main/java/com/monstarlab/features/resources/domain/usecase/GetResourcesUseCase.kt index 39ad76f3..0fd5ad0d 100644 --- a/app/src/main/java/com/monstarlab/features/resources/domain/usecase/GetResourcesUseCase.kt +++ b/app/src/main/java/com/monstarlab/features/resources/domain/usecase/GetResourcesUseCase.kt @@ -1,6 +1,6 @@ package com.monstarlab.features.resources.domain.usecase -import com.monstarlab.core.network.errorhandling.extensions.suspendRunCatching +import com.monstarlab.core.extensions.suspendRunCatching import com.monstarlab.features.resources.domain.repository.ResourceRepository import kotlinx.coroutines.delay import javax.inject.Inject diff --git a/app/src/main/java/com/monstarlab/features/resources/ui/ResourcesContract.kt b/app/src/main/java/com/monstarlab/features/resources/ui/ResourcesContract.kt index b79ba04f..97654fd0 100644 --- a/app/src/main/java/com/monstarlab/features/resources/ui/ResourcesContract.kt +++ b/app/src/main/java/com/monstarlab/features/resources/ui/ResourcesContract.kt @@ -1,6 +1,6 @@ package com.monstarlab.features.resources.ui -import com.monstarlab.core.network.errorhandling.error.ErrorModel +import com.monstarlab.core.error.ErrorModel import com.monstarlab.features.resources.domain.model.Resource /** diff --git a/app/src/main/java/com/monstarlab/features/resources/ui/ResourcesViewModel.kt b/app/src/main/java/com/monstarlab/features/resources/ui/ResourcesViewModel.kt index a305c367..6d8b20ec 100644 --- a/app/src/main/java/com/monstarlab/features/resources/ui/ResourcesViewModel.kt +++ b/app/src/main/java/com/monstarlab/features/resources/ui/ResourcesViewModel.kt @@ -2,7 +2,7 @@ package com.monstarlab.features.resources.ui import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import com.monstarlab.core.network.errorhandling.error.toError +import com.monstarlab.core.error.toError import com.monstarlab.features.resources.domain.usecase.GetResourcesUseCase import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.MutableStateFlow diff --git a/core/build.gradle.kts b/core/build.gradle.kts index b1ca71cd..3924df2f 100644 --- a/core/build.gradle.kts +++ b/core/build.gradle.kts @@ -4,6 +4,7 @@ plugins { id("dagger.hilt.android.plugin") id("org.jetbrains.kotlin.android") id("org.jetbrains.kotlin.kapt") + alias(libs.plugins.kotlin.serialization) } android { @@ -37,8 +38,19 @@ kapt { dependencies { // Kotlin implementation(libs.bundles.kotlin) + implementation(libs.kotlin.serialization.json) // Injection implementation(libs.hilt.android) kapt(libs.hilt.compiler) + + // Networking + implementation(libs.retrofit) + implementation(libs.retrofit.converter) + implementation(libs.okhttp.logger) + + // Other + implementation(libs.timber) + debugImplementation(libs.chucker.op) + releaseImplementation(libs.chucker.noop) } \ No newline at end of file diff --git a/core/src/main/java/com/monstarlab/core/network/errorhandling/error/ErrorModel.kt b/core/src/main/java/com/monstarlab/core/error/ErrorModel.kt similarity index 93% rename from core/src/main/java/com/monstarlab/core/network/errorhandling/error/ErrorModel.kt rename to core/src/main/java/com/monstarlab/core/error/ErrorModel.kt index 5f1efffd..6ddef76b 100644 --- a/core/src/main/java/com/monstarlab/core/network/errorhandling/error/ErrorModel.kt +++ b/core/src/main/java/com/monstarlab/core/error/ErrorModel.kt @@ -1,4 +1,4 @@ -package com.monstarlab.core.network.errorhandling.error +package com.monstarlab.core.error import com.monstarlab.core.network.errorhandling.ApiException import java.io.IOException diff --git a/core/src/main/java/com/monstarlab/core/network/errorhandling/error/ErrorModelWithDisplayableMessage.kt b/core/src/main/java/com/monstarlab/core/error/ErrorModelWithDisplayableMessage.kt similarity index 82% rename from core/src/main/java/com/monstarlab/core/network/errorhandling/error/ErrorModelWithDisplayableMessage.kt rename to core/src/main/java/com/monstarlab/core/error/ErrorModelWithDisplayableMessage.kt index 008b0248..c80c721a 100644 --- a/core/src/main/java/com/monstarlab/core/network/errorhandling/error/ErrorModelWithDisplayableMessage.kt +++ b/core/src/main/java/com/monstarlab/core/error/ErrorModelWithDisplayableMessage.kt @@ -1,4 +1,4 @@ -package com.monstarlab.core.network.errorhandling.error +package com.monstarlab.core.error val ErrorModel.displayableMessage: String get() { diff --git a/core/src/main/java/com/monstarlab/core/network/errorhandling/extensions/Extensions.kt b/core/src/main/java/com/monstarlab/core/extensions/Extensions.kt similarity index 92% rename from core/src/main/java/com/monstarlab/core/network/errorhandling/extensions/Extensions.kt rename to core/src/main/java/com/monstarlab/core/extensions/Extensions.kt index 6e2ce40f..33409467 100644 --- a/core/src/main/java/com/monstarlab/core/network/errorhandling/extensions/Extensions.kt +++ b/core/src/main/java/com/monstarlab/core/extensions/Extensions.kt @@ -1,4 +1,4 @@ -package com.monstarlab.core.network.errorhandling.extensions +package com.monstarlab.core.extensions import kotlinx.coroutines.CancellationException diff --git a/core/src/main/java/com/monstarlab/core/network/errorhandling/extensions/FlowExtensions.kt b/core/src/main/java/com/monstarlab/core/extensions/FlowExtensions.kt similarity index 85% rename from core/src/main/java/com/monstarlab/core/network/errorhandling/extensions/FlowExtensions.kt rename to core/src/main/java/com/monstarlab/core/extensions/FlowExtensions.kt index a91cab26..e313c2f9 100644 --- a/core/src/main/java/com/monstarlab/core/network/errorhandling/extensions/FlowExtensions.kt +++ b/core/src/main/java/com/monstarlab/core/extensions/FlowExtensions.kt @@ -1,4 +1,4 @@ -package com.monstarlab.core.network.errorhandling.extensions +package com.monstarlab.core.extensions import kotlinx.coroutines.delay import kotlinx.coroutines.flow.Flow diff --git a/core/src/main/java/com/monstarlab/core/network/errorhandling/extensions/StringExtensions.kt b/core/src/main/java/com/monstarlab/core/extensions/StringExtensions.kt similarity index 64% rename from core/src/main/java/com/monstarlab/core/network/errorhandling/extensions/StringExtensions.kt rename to core/src/main/java/com/monstarlab/core/extensions/StringExtensions.kt index 9e98a3e4..17f7efc8 100644 --- a/core/src/main/java/com/monstarlab/core/network/errorhandling/extensions/StringExtensions.kt +++ b/core/src/main/java/com/monstarlab/core/extensions/StringExtensions.kt @@ -1,4 +1,4 @@ -package com.monstarlab.core.network.errorhandling.extensions +package com.monstarlab.core.extensions fun String.without(value: String) = replace(value, "") diff --git a/core/src/main/java/com/monstarlab/core/network/errorhandling/injection/CoroutineQualifiers.kt b/core/src/main/java/com/monstarlab/core/injection/CoroutineQualifiers.kt similarity index 86% rename from core/src/main/java/com/monstarlab/core/network/errorhandling/injection/CoroutineQualifiers.kt rename to core/src/main/java/com/monstarlab/core/injection/CoroutineQualifiers.kt index 3b96a6e6..1663a36a 100644 --- a/core/src/main/java/com/monstarlab/core/network/errorhandling/injection/CoroutineQualifiers.kt +++ b/core/src/main/java/com/monstarlab/core/injection/CoroutineQualifiers.kt @@ -1,4 +1,4 @@ -package com.monstarlab.core.network.errorhandling.injection +package com.monstarlab.core.injection import javax.inject.Qualifier diff --git a/core/src/main/java/com/monstarlab/core/network/errorhandling/injection/CoroutinesModule.kt b/core/src/main/java/com/monstarlab/core/injection/CoroutinesModule.kt similarity index 92% rename from core/src/main/java/com/monstarlab/core/network/errorhandling/injection/CoroutinesModule.kt rename to core/src/main/java/com/monstarlab/core/injection/CoroutinesModule.kt index b03c4fbc..76fb89d6 100644 --- a/core/src/main/java/com/monstarlab/core/network/errorhandling/injection/CoroutinesModule.kt +++ b/core/src/main/java/com/monstarlab/core/injection/CoroutinesModule.kt @@ -1,4 +1,4 @@ -package com.monstarlab.core.network.errorhandling.injection +package com.monstarlab.core.injection import dagger.Module import dagger.Provides diff --git a/app/src/main/java/com/monstarlab/core/network/OkHttpModule.kt b/core/src/main/java/com/monstarlab/core/network/OkHttpModule.kt similarity index 98% rename from app/src/main/java/com/monstarlab/core/network/OkHttpModule.kt rename to core/src/main/java/com/monstarlab/core/network/OkHttpModule.kt index bed89fd4..cdbbeaec 100644 --- a/app/src/main/java/com/monstarlab/core/network/OkHttpModule.kt +++ b/core/src/main/java/com/monstarlab/core/network/OkHttpModule.kt @@ -3,7 +3,7 @@ package com.monstarlab.core.network import android.content.Context import com.chuckerteam.chucker.api.ChuckerInterceptor import com.jakewharton.retrofit2.converter.kotlinx.serialization.asConverterFactory -import com.monstarlab.BuildConfig +import com.monstarlab.core.BuildConfig import com.monstarlab.core.network.errorhandling.ApiErrorInterceptor import dagger.Module import dagger.Provides diff --git a/app/src/main/java/com/monstarlab/core/network/errorhandling/ApiErrorDTO.kt b/core/src/main/java/com/monstarlab/core/network/errorhandling/ApiErrorDTO.kt similarity index 100% rename from app/src/main/java/com/monstarlab/core/network/errorhandling/ApiErrorDTO.kt rename to core/src/main/java/com/monstarlab/core/network/errorhandling/ApiErrorDTO.kt diff --git a/app/src/main/java/com/monstarlab/core/network/errorhandling/ApiErrorInterceptor.kt b/core/src/main/java/com/monstarlab/core/network/errorhandling/ApiErrorInterceptor.kt similarity index 96% rename from app/src/main/java/com/monstarlab/core/network/errorhandling/ApiErrorInterceptor.kt rename to core/src/main/java/com/monstarlab/core/network/errorhandling/ApiErrorInterceptor.kt index d55c2575..16af9fe6 100644 --- a/app/src/main/java/com/monstarlab/core/network/errorhandling/ApiErrorInterceptor.kt +++ b/core/src/main/java/com/monstarlab/core/network/errorhandling/ApiErrorInterceptor.kt @@ -1,6 +1,5 @@ package com.monstarlab.core.network.errorhandling -import kotlinx.serialization.decodeFromString import kotlinx.serialization.json.Json import okhttp3.Interceptor import okhttp3.MediaType.Companion.toMediaType From ad2a43e918d036246a0ae08dd5db927660225f44 Mon Sep 17 00:00:00 2001 From: khairullo Date: Tue, 12 Sep 2023 09:04:30 +0200 Subject: [PATCH 13/48] feat: updated provideRetrofit fun to receive baseUrl as param instead of BuildConfig --- .../src/main/java/com/monstarlab/core/network/OkHttpModule.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/com/monstarlab/core/network/OkHttpModule.kt b/core/src/main/java/com/monstarlab/core/network/OkHttpModule.kt index cdbbeaec..78136cdb 100644 --- a/core/src/main/java/com/monstarlab/core/network/OkHttpModule.kt +++ b/core/src/main/java/com/monstarlab/core/network/OkHttpModule.kt @@ -47,10 +47,10 @@ class OkHttpModule { @ExperimentalSerializationApi @Provides @Singleton - fun provideRetrofit(client: OkHttpClient): Retrofit { + fun provideRetrofit(client: OkHttpClient, baseUrl: String): Retrofit { return Retrofit.Builder() .client(client) - .baseUrl(BuildConfig.API_URL) + .baseUrl(baseUrl) .addConverterFactory( json.asConverterFactory("application/json".toMediaType()) ) From 7c5469690f559516718dce436b0eac5f2e8e0a02 Mon Sep 17 00:00:00 2001 From: khairullo Date: Tue, 12 Sep 2023 09:17:30 +0200 Subject: [PATCH 14/48] refactor: moved persistence package to the core module --- core/build.gradle.kts | 3 +++ .../src/main/java/com/monstarlab/core/persistence/Data.md | 0 .../main/java/com/monstarlab/core/persistence/DataSource.kt | 0 .../monstarlab/core/persistence/SharedPreferenceDataStore.kt | 0 .../java/com/monstarlab/core/persistence/SingleDataSource.kt | 0 .../core/persistence/SingleSharedPreferenceDataStore.kt | 0 .../monstarlab/core/persistence/injection/DataStoreModule.kt | 0 7 files changed, 3 insertions(+) rename {app => core}/src/main/java/com/monstarlab/core/persistence/Data.md (100%) rename {app => core}/src/main/java/com/monstarlab/core/persistence/DataSource.kt (100%) rename {app => core}/src/main/java/com/monstarlab/core/persistence/SharedPreferenceDataStore.kt (100%) rename {app => core}/src/main/java/com/monstarlab/core/persistence/SingleDataSource.kt (100%) rename {app => core}/src/main/java/com/monstarlab/core/persistence/SingleSharedPreferenceDataStore.kt (100%) rename {app => core}/src/main/java/com/monstarlab/core/persistence/injection/DataStoreModule.kt (100%) diff --git a/core/build.gradle.kts b/core/build.gradle.kts index 3924df2f..588cddf0 100644 --- a/core/build.gradle.kts +++ b/core/build.gradle.kts @@ -40,6 +40,9 @@ dependencies { implementation(libs.bundles.kotlin) implementation(libs.kotlin.serialization.json) + // Android + implementation(libs.android.datastore.preferences) + // Injection implementation(libs.hilt.android) kapt(libs.hilt.compiler) diff --git a/app/src/main/java/com/monstarlab/core/persistence/Data.md b/core/src/main/java/com/monstarlab/core/persistence/Data.md similarity index 100% rename from app/src/main/java/com/monstarlab/core/persistence/Data.md rename to core/src/main/java/com/monstarlab/core/persistence/Data.md diff --git a/app/src/main/java/com/monstarlab/core/persistence/DataSource.kt b/core/src/main/java/com/monstarlab/core/persistence/DataSource.kt similarity index 100% rename from app/src/main/java/com/monstarlab/core/persistence/DataSource.kt rename to core/src/main/java/com/monstarlab/core/persistence/DataSource.kt diff --git a/app/src/main/java/com/monstarlab/core/persistence/SharedPreferenceDataStore.kt b/core/src/main/java/com/monstarlab/core/persistence/SharedPreferenceDataStore.kt similarity index 100% rename from app/src/main/java/com/monstarlab/core/persistence/SharedPreferenceDataStore.kt rename to core/src/main/java/com/monstarlab/core/persistence/SharedPreferenceDataStore.kt diff --git a/app/src/main/java/com/monstarlab/core/persistence/SingleDataSource.kt b/core/src/main/java/com/monstarlab/core/persistence/SingleDataSource.kt similarity index 100% rename from app/src/main/java/com/monstarlab/core/persistence/SingleDataSource.kt rename to core/src/main/java/com/monstarlab/core/persistence/SingleDataSource.kt diff --git a/app/src/main/java/com/monstarlab/core/persistence/SingleSharedPreferenceDataStore.kt b/core/src/main/java/com/monstarlab/core/persistence/SingleSharedPreferenceDataStore.kt similarity index 100% rename from app/src/main/java/com/monstarlab/core/persistence/SingleSharedPreferenceDataStore.kt rename to core/src/main/java/com/monstarlab/core/persistence/SingleSharedPreferenceDataStore.kt diff --git a/app/src/main/java/com/monstarlab/core/persistence/injection/DataStoreModule.kt b/core/src/main/java/com/monstarlab/core/persistence/injection/DataStoreModule.kt similarity index 100% rename from app/src/main/java/com/monstarlab/core/persistence/injection/DataStoreModule.kt rename to core/src/main/java/com/monstarlab/core/persistence/injection/DataStoreModule.kt From 0f09889c33a2200ab240b6fdceee48351f719d4e Mon Sep 17 00:00:00 2001 From: khairullo Date: Tue, 12 Sep 2023 09:43:15 +0200 Subject: [PATCH 15/48] refactor: moved ui package to the core module --- core/build.gradle.kts | 11 +++++++++-- .../java/com/monstarlab/core/ui/ComposeFragment.kt | 0 .../monstarlab/core/ui/effects/SystemUISideEffect.kt | 0 .../monstarlab/core/ui/extensions/ColorExtensions.kt | 0 .../core/ui/extensions/ContextExtensions.kt | 0 .../core/ui/extensions/LazyLayoutExtensions.kt | 0 .../core/ui/extensions/TextStyleExtensions.kt | 0 .../monstarlab/core/ui/layout/ColumnWithSeparators.kt | 0 .../monstarlab/core/ui/previews/LightDarkPreview.kt | 0 9 files changed, 9 insertions(+), 2 deletions(-) rename {app => core}/src/main/java/com/monstarlab/core/ui/ComposeFragment.kt (100%) rename {app => core}/src/main/java/com/monstarlab/core/ui/effects/SystemUISideEffect.kt (100%) rename {app => core}/src/main/java/com/monstarlab/core/ui/extensions/ColorExtensions.kt (100%) rename {app => core}/src/main/java/com/monstarlab/core/ui/extensions/ContextExtensions.kt (100%) rename {app => core}/src/main/java/com/monstarlab/core/ui/extensions/LazyLayoutExtensions.kt (100%) rename {app => core}/src/main/java/com/monstarlab/core/ui/extensions/TextStyleExtensions.kt (100%) rename {app => core}/src/main/java/com/monstarlab/core/ui/layout/ColumnWithSeparators.kt (100%) rename {app => core}/src/main/java/com/monstarlab/core/ui/previews/LightDarkPreview.kt (100%) diff --git a/core/build.gradle.kts b/core/build.gradle.kts index 588cddf0..7ded9f7d 100644 --- a/core/build.gradle.kts +++ b/core/build.gradle.kts @@ -14,11 +14,12 @@ android { defaultConfig { minSdk = 23 } - + buildFeatures { + compose = true + } composeOptions { kotlinCompilerExtensionVersion = libs.versions.compose.compiler.get() } - compileOptions { sourceCompatibility = JavaVersion.VERSION_11 targetCompatibility = JavaVersion.VERSION_11 @@ -43,6 +44,12 @@ dependencies { // Android implementation(libs.android.datastore.preferences) + // Compose + implementation(platform(libs.android.compose.bom)) + implementation(libs.bundles.android.compose.core) + implementation(libs.bundles.google.accompanist) + debugImplementation(libs.android.compose.ui.tooling) + // Injection implementation(libs.hilt.android) kapt(libs.hilt.compiler) diff --git a/app/src/main/java/com/monstarlab/core/ui/ComposeFragment.kt b/core/src/main/java/com/monstarlab/core/ui/ComposeFragment.kt similarity index 100% rename from app/src/main/java/com/monstarlab/core/ui/ComposeFragment.kt rename to core/src/main/java/com/monstarlab/core/ui/ComposeFragment.kt diff --git a/app/src/main/java/com/monstarlab/core/ui/effects/SystemUISideEffect.kt b/core/src/main/java/com/monstarlab/core/ui/effects/SystemUISideEffect.kt similarity index 100% rename from app/src/main/java/com/monstarlab/core/ui/effects/SystemUISideEffect.kt rename to core/src/main/java/com/monstarlab/core/ui/effects/SystemUISideEffect.kt diff --git a/app/src/main/java/com/monstarlab/core/ui/extensions/ColorExtensions.kt b/core/src/main/java/com/monstarlab/core/ui/extensions/ColorExtensions.kt similarity index 100% rename from app/src/main/java/com/monstarlab/core/ui/extensions/ColorExtensions.kt rename to core/src/main/java/com/monstarlab/core/ui/extensions/ColorExtensions.kt diff --git a/app/src/main/java/com/monstarlab/core/ui/extensions/ContextExtensions.kt b/core/src/main/java/com/monstarlab/core/ui/extensions/ContextExtensions.kt similarity index 100% rename from app/src/main/java/com/monstarlab/core/ui/extensions/ContextExtensions.kt rename to core/src/main/java/com/monstarlab/core/ui/extensions/ContextExtensions.kt diff --git a/app/src/main/java/com/monstarlab/core/ui/extensions/LazyLayoutExtensions.kt b/core/src/main/java/com/monstarlab/core/ui/extensions/LazyLayoutExtensions.kt similarity index 100% rename from app/src/main/java/com/monstarlab/core/ui/extensions/LazyLayoutExtensions.kt rename to core/src/main/java/com/monstarlab/core/ui/extensions/LazyLayoutExtensions.kt diff --git a/app/src/main/java/com/monstarlab/core/ui/extensions/TextStyleExtensions.kt b/core/src/main/java/com/monstarlab/core/ui/extensions/TextStyleExtensions.kt similarity index 100% rename from app/src/main/java/com/monstarlab/core/ui/extensions/TextStyleExtensions.kt rename to core/src/main/java/com/monstarlab/core/ui/extensions/TextStyleExtensions.kt diff --git a/app/src/main/java/com/monstarlab/core/ui/layout/ColumnWithSeparators.kt b/core/src/main/java/com/monstarlab/core/ui/layout/ColumnWithSeparators.kt similarity index 100% rename from app/src/main/java/com/monstarlab/core/ui/layout/ColumnWithSeparators.kt rename to core/src/main/java/com/monstarlab/core/ui/layout/ColumnWithSeparators.kt diff --git a/app/src/main/java/com/monstarlab/core/ui/previews/LightDarkPreview.kt b/core/src/main/java/com/monstarlab/core/ui/previews/LightDarkPreview.kt similarity index 100% rename from app/src/main/java/com/monstarlab/core/ui/previews/LightDarkPreview.kt rename to core/src/main/java/com/monstarlab/core/ui/previews/LightDarkPreview.kt From 4e672b28d9e89cecb3cdcb13d1960b6a0d86ecbb Mon Sep 17 00:00:00 2001 From: khairullo Date: Tue, 12 Sep 2023 10:03:37 +0200 Subject: [PATCH 16/48] feat: added gitignore to the core module --- core/.gitignore | 1 + 1 file changed, 1 insertion(+) create mode 100644 core/.gitignore diff --git a/core/.gitignore b/core/.gitignore new file mode 100644 index 00000000..42afabfd --- /dev/null +++ b/core/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file From c85a9f38fe263a1cedd07fca4d453226a1d01b75 Mon Sep 17 00:00:00 2001 From: khairullo Date: Tue, 12 Sep 2023 10:04:23 +0200 Subject: [PATCH 17/48] feat: implemented designsystem module --- app/build.gradle.kts | 1 + designsystem/.gitignore | 1 + designsystem/build.gradle.kts | 40 +++++++++++++++++++++++++++++++++++ settings.gradle.kts | 3 ++- 4 files changed, 44 insertions(+), 1 deletion(-) create mode 100644 designsystem/.gitignore create mode 100644 designsystem/build.gradle.kts diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 70faffad..4132a222 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -136,4 +136,5 @@ dependencies { androidTestImplementation(libs.bundles.android.test) implementation(project(":core")) + implementation(project(":designsystem")) } diff --git a/designsystem/.gitignore b/designsystem/.gitignore new file mode 100644 index 00000000..42afabfd --- /dev/null +++ b/designsystem/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/designsystem/build.gradle.kts b/designsystem/build.gradle.kts new file mode 100644 index 00000000..d47d941b --- /dev/null +++ b/designsystem/build.gradle.kts @@ -0,0 +1,40 @@ +@Suppress("DSL_SCOPE_VIOLATION") // TODO: Remove once KTIJ-19369 is fixed +plugins { + id("com.android.library") + id("org.jetbrains.kotlin.android") +} + +android { + compileSdk = 34 + namespace = "com.monstarlab.designsystem" + flavorDimensions += "default" + defaultConfig { + minSdk = 23 + } + buildFeatures { + compose = true + } + composeOptions { + kotlinCompilerExtensionVersion = libs.versions.compose.compiler.get() + } + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } +} + +kotlin { + jvmToolchain { + languageVersion.set(JavaLanguageVersion.of(JavaVersion.VERSION_11.toString())) + } +} + +dependencies { + + // Compose + implementation(platform(libs.android.compose.bom)) + implementation(libs.bundles.android.compose.core) + debugImplementation(libs.android.compose.ui.tooling) + + implementation(project(":core")) +} \ No newline at end of file diff --git a/settings.gradle.kts b/settings.gradle.kts index b56e6c6f..524ec184 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -15,4 +15,5 @@ dependencyResolutionManagement { rootProject.name = "android-template" include(":app") -include(":core") \ No newline at end of file +include(":core") +include(":designsystem") From b58e89d1d97f910775b2fc6078610fb0e73b03ff Mon Sep 17 00:00:00 2001 From: khairullo Date: Tue, 12 Sep 2023 10:05:21 +0200 Subject: [PATCH 18/48] refactor: moved all designsystem packages from app module to the designsystem module --- .../monstarlab/features/login/ui/LoginRoute.kt | 2 +- .../monstarlab/features/login/ui/LoginScreen.kt | 16 ++++++++-------- .../features/resources/ui/ResourcesRoute.kt | 2 +- .../features/resources/ui/ResourcesScreen.kt | 8 ++++---- .../resources/ui/components/ResourceItem.kt | 6 +++--- .../designsystem/components/AppTopBar.kt | 0 .../components/appbutton/AppButton.kt | 0 .../components/appbutton/AppButtonType.kt | 0 .../components/apptextfield/AppTextField.kt | 0 .../monstarlab/designsystem/theme/AppTheme.kt | 0 .../com/monstarlab/designsystem/theme/Colors.kt | 0 .../com/monstarlab/designsystem/theme/Shapes.kt | 0 .../designsystem/theme/dimensions/Dimensions.kt | 0 .../theme/dimensions/DimensionsProvider.kt | 0 .../theme/typography/AppTypography.kt | 0 .../theme/typography/AppTypographyProvider.kt | 0 .../designsystem/theme/typography/FontFamily.kt | 0 .../designsystem/theme/typography/Typography.kt | 0 18 files changed, 17 insertions(+), 17 deletions(-) rename {app => designsystem}/src/main/java/com/monstarlab/designsystem/components/AppTopBar.kt (100%) rename {app => designsystem}/src/main/java/com/monstarlab/designsystem/components/appbutton/AppButton.kt (100%) rename {app => designsystem}/src/main/java/com/monstarlab/designsystem/components/appbutton/AppButtonType.kt (100%) rename {app => designsystem}/src/main/java/com/monstarlab/designsystem/components/apptextfield/AppTextField.kt (100%) rename {app => designsystem}/src/main/java/com/monstarlab/designsystem/theme/AppTheme.kt (100%) rename {app => designsystem}/src/main/java/com/monstarlab/designsystem/theme/Colors.kt (100%) rename {app => designsystem}/src/main/java/com/monstarlab/designsystem/theme/Shapes.kt (100%) rename {app => designsystem}/src/main/java/com/monstarlab/designsystem/theme/dimensions/Dimensions.kt (100%) rename {app => designsystem}/src/main/java/com/monstarlab/designsystem/theme/dimensions/DimensionsProvider.kt (100%) rename {app => designsystem}/src/main/java/com/monstarlab/designsystem/theme/typography/AppTypography.kt (100%) rename {app => designsystem}/src/main/java/com/monstarlab/designsystem/theme/typography/AppTypographyProvider.kt (100%) rename {app => designsystem}/src/main/java/com/monstarlab/designsystem/theme/typography/FontFamily.kt (100%) rename {app => designsystem}/src/main/java/com/monstarlab/designsystem/theme/typography/Typography.kt (100%) diff --git a/app/src/main/java/com/monstarlab/features/login/ui/LoginRoute.kt b/app/src/main/java/com/monstarlab/features/login/ui/LoginRoute.kt index 3595aa6f..52be068b 100644 --- a/app/src/main/java/com/monstarlab/features/login/ui/LoginRoute.kt +++ b/app/src/main/java/com/monstarlab/features/login/ui/LoginRoute.kt @@ -25,7 +25,7 @@ fun LoginRoute( val actions = rememberLoginActions(coordinator) // UI Rendering - AppTheme { + com.monstarlab.designsystem.theme.AppTheme { LoginScreen(uiState, actions) } } diff --git a/app/src/main/java/com/monstarlab/features/login/ui/LoginScreen.kt b/app/src/main/java/com/monstarlab/features/login/ui/LoginScreen.kt index 18db7d10..351759c2 100644 --- a/app/src/main/java/com/monstarlab/features/login/ui/LoginScreen.kt +++ b/app/src/main/java/com/monstarlab/features/login/ui/LoginScreen.kt @@ -28,7 +28,7 @@ fun LoginScreen( actions: LoginActions = LoginActions(), ) = Scaffold( topBar = { - AppTopBar( + com.monstarlab.designsystem.components.AppTopBar( modifier = Modifier.systemBarsPadding(), title = "Login" ) @@ -38,21 +38,21 @@ fun LoginScreen( modifier = Modifier .padding(it) .fillMaxSize() - .padding(Theme.dimensions.big1) + .padding(com.monstarlab.designsystem.theme.Theme.dimensions.big1) .imePadding(), horizontalAlignment = Alignment.CenterHorizontally, verticalArrangement = Arrangement.Center ) { - AppTextField( + com.monstarlab.designsystem.components.apptextfield.AppTextField( value = state.email, onValueChange = actions.onEmailChange, modifier = Modifier.fillMaxWidth(), placeholder = "E-Mail" ) - Spacer(modifier = Modifier.size(Theme.dimensions.medium3)) + Spacer(modifier = Modifier.size(com.monstarlab.designsystem.theme.Theme.dimensions.medium3)) - AppTextField( + com.monstarlab.designsystem.components.apptextfield.AppTextField( value = state.password, onValueChange = actions.onPasswordChange, modifier = Modifier.fillMaxWidth(), @@ -60,9 +60,9 @@ fun LoginScreen( visualTransformation = PasswordVisualTransformation(), placeholder = "Password" ) - Spacer(modifier = Modifier.size(Theme.dimensions.medium3)) + Spacer(modifier = Modifier.size(com.monstarlab.designsystem.theme.Theme.dimensions.medium3)) - AppButton( + com.monstarlab.designsystem.components.appbutton.AppButton( text = "Login", onClick = actions.onLoginClick, modifier = Modifier.fillMaxWidth(), @@ -74,7 +74,7 @@ fun LoginScreen( @Composable @LightDarkPreview private fun LoginScreenPreview() { - AppTheme { + com.monstarlab.designsystem.theme.AppTheme { LoginScreen() } } diff --git a/app/src/main/java/com/monstarlab/features/resources/ui/ResourcesRoute.kt b/app/src/main/java/com/monstarlab/features/resources/ui/ResourcesRoute.kt index c938ae65..d5d86c95 100644 --- a/app/src/main/java/com/monstarlab/features/resources/ui/ResourcesRoute.kt +++ b/app/src/main/java/com/monstarlab/features/resources/ui/ResourcesRoute.kt @@ -17,7 +17,7 @@ fun ResourcesRoute( val actions = rememberResourcesActions(coordinator) // UI Rendering - AppTheme { + com.monstarlab.designsystem.theme.AppTheme { ResourcesScreen(uiState, actions) } } diff --git a/app/src/main/java/com/monstarlab/features/resources/ui/ResourcesScreen.kt b/app/src/main/java/com/monstarlab/features/resources/ui/ResourcesScreen.kt index e4197b62..8645e368 100644 --- a/app/src/main/java/com/monstarlab/features/resources/ui/ResourcesScreen.kt +++ b/app/src/main/java/com/monstarlab/features/resources/ui/ResourcesScreen.kt @@ -28,7 +28,7 @@ fun ResourcesScreen( ) { Scaffold( topBar = { - AppTopBar( + com.monstarlab.designsystem.components.AppTopBar( title = "Resources", modifier = Modifier.statusBarsPadding() ) @@ -38,9 +38,9 @@ fun ResourcesScreen( modifier = Modifier .padding(it) .fillMaxSize(), - contentPadding = PaddingValues(Theme.dimensions.medium1), + contentPadding = PaddingValues(com.monstarlab.designsystem.theme.Theme.dimensions.medium1), horizontalAlignment = Alignment.CenterHorizontally, - verticalArrangement = Arrangement.spacedBy(Theme.dimensions.medium1) + verticalArrangement = Arrangement.spacedBy(com.monstarlab.designsystem.theme.Theme.dimensions.medium1) ) { animatedVisibilityItem("progress-indicator", state.isLoading) { CircularProgressIndicator() @@ -61,7 +61,7 @@ fun ResourcesScreen( @Composable @LightDarkPreview private fun ResourcesScreenPreview() { - AppTheme { + com.monstarlab.designsystem.theme.AppTheme { ResourcesScreen(state = ResourcesState(resources = List(4) { Resource.Mock })) } } diff --git a/app/src/main/java/com/monstarlab/features/resources/ui/components/ResourceItem.kt b/app/src/main/java/com/monstarlab/features/resources/ui/components/ResourceItem.kt index 132205ea..d814a8c5 100644 --- a/app/src/main/java/com/monstarlab/features/resources/ui/components/ResourceItem.kt +++ b/app/src/main/java/com/monstarlab/features/resources/ui/components/ResourceItem.kt @@ -29,8 +29,8 @@ fun ResourceItem( ) { Card { Row( - modifier = modifier.fillMaxWidth().padding(Theme.dimensions.medium2), - horizontalArrangement = Arrangement.spacedBy(Theme.dimensions.medium1), + modifier = modifier.fillMaxWidth().padding(com.monstarlab.designsystem.theme.Theme.dimensions.medium2), + horizontalArrangement = Arrangement.spacedBy(com.monstarlab.designsystem.theme.Theme.dimensions.medium1), verticalAlignment = Alignment.CenterVertically ) { Box( @@ -57,7 +57,7 @@ fun ResourceItem( @Preview(name = "ResourceItem") @Composable private fun PreviewResourceItem() { - AppTheme { + com.monstarlab.designsystem.theme.AppTheme { ResourceItem(Resource.Mock) } } diff --git a/app/src/main/java/com/monstarlab/designsystem/components/AppTopBar.kt b/designsystem/src/main/java/com/monstarlab/designsystem/components/AppTopBar.kt similarity index 100% rename from app/src/main/java/com/monstarlab/designsystem/components/AppTopBar.kt rename to designsystem/src/main/java/com/monstarlab/designsystem/components/AppTopBar.kt diff --git a/app/src/main/java/com/monstarlab/designsystem/components/appbutton/AppButton.kt b/designsystem/src/main/java/com/monstarlab/designsystem/components/appbutton/AppButton.kt similarity index 100% rename from app/src/main/java/com/monstarlab/designsystem/components/appbutton/AppButton.kt rename to designsystem/src/main/java/com/monstarlab/designsystem/components/appbutton/AppButton.kt diff --git a/app/src/main/java/com/monstarlab/designsystem/components/appbutton/AppButtonType.kt b/designsystem/src/main/java/com/monstarlab/designsystem/components/appbutton/AppButtonType.kt similarity index 100% rename from app/src/main/java/com/monstarlab/designsystem/components/appbutton/AppButtonType.kt rename to designsystem/src/main/java/com/monstarlab/designsystem/components/appbutton/AppButtonType.kt diff --git a/app/src/main/java/com/monstarlab/designsystem/components/apptextfield/AppTextField.kt b/designsystem/src/main/java/com/monstarlab/designsystem/components/apptextfield/AppTextField.kt similarity index 100% rename from app/src/main/java/com/monstarlab/designsystem/components/apptextfield/AppTextField.kt rename to designsystem/src/main/java/com/monstarlab/designsystem/components/apptextfield/AppTextField.kt diff --git a/app/src/main/java/com/monstarlab/designsystem/theme/AppTheme.kt b/designsystem/src/main/java/com/monstarlab/designsystem/theme/AppTheme.kt similarity index 100% rename from app/src/main/java/com/monstarlab/designsystem/theme/AppTheme.kt rename to designsystem/src/main/java/com/monstarlab/designsystem/theme/AppTheme.kt diff --git a/app/src/main/java/com/monstarlab/designsystem/theme/Colors.kt b/designsystem/src/main/java/com/monstarlab/designsystem/theme/Colors.kt similarity index 100% rename from app/src/main/java/com/monstarlab/designsystem/theme/Colors.kt rename to designsystem/src/main/java/com/monstarlab/designsystem/theme/Colors.kt diff --git a/app/src/main/java/com/monstarlab/designsystem/theme/Shapes.kt b/designsystem/src/main/java/com/monstarlab/designsystem/theme/Shapes.kt similarity index 100% rename from app/src/main/java/com/monstarlab/designsystem/theme/Shapes.kt rename to designsystem/src/main/java/com/monstarlab/designsystem/theme/Shapes.kt diff --git a/app/src/main/java/com/monstarlab/designsystem/theme/dimensions/Dimensions.kt b/designsystem/src/main/java/com/monstarlab/designsystem/theme/dimensions/Dimensions.kt similarity index 100% rename from app/src/main/java/com/monstarlab/designsystem/theme/dimensions/Dimensions.kt rename to designsystem/src/main/java/com/monstarlab/designsystem/theme/dimensions/Dimensions.kt diff --git a/app/src/main/java/com/monstarlab/designsystem/theme/dimensions/DimensionsProvider.kt b/designsystem/src/main/java/com/monstarlab/designsystem/theme/dimensions/DimensionsProvider.kt similarity index 100% rename from app/src/main/java/com/monstarlab/designsystem/theme/dimensions/DimensionsProvider.kt rename to designsystem/src/main/java/com/monstarlab/designsystem/theme/dimensions/DimensionsProvider.kt diff --git a/app/src/main/java/com/monstarlab/designsystem/theme/typography/AppTypography.kt b/designsystem/src/main/java/com/monstarlab/designsystem/theme/typography/AppTypography.kt similarity index 100% rename from app/src/main/java/com/monstarlab/designsystem/theme/typography/AppTypography.kt rename to designsystem/src/main/java/com/monstarlab/designsystem/theme/typography/AppTypography.kt diff --git a/app/src/main/java/com/monstarlab/designsystem/theme/typography/AppTypographyProvider.kt b/designsystem/src/main/java/com/monstarlab/designsystem/theme/typography/AppTypographyProvider.kt similarity index 100% rename from app/src/main/java/com/monstarlab/designsystem/theme/typography/AppTypographyProvider.kt rename to designsystem/src/main/java/com/monstarlab/designsystem/theme/typography/AppTypographyProvider.kt diff --git a/app/src/main/java/com/monstarlab/designsystem/theme/typography/FontFamily.kt b/designsystem/src/main/java/com/monstarlab/designsystem/theme/typography/FontFamily.kt similarity index 100% rename from app/src/main/java/com/monstarlab/designsystem/theme/typography/FontFamily.kt rename to designsystem/src/main/java/com/monstarlab/designsystem/theme/typography/FontFamily.kt diff --git a/app/src/main/java/com/monstarlab/designsystem/theme/typography/Typography.kt b/designsystem/src/main/java/com/monstarlab/designsystem/theme/typography/Typography.kt similarity index 100% rename from app/src/main/java/com/monstarlab/designsystem/theme/typography/Typography.kt rename to designsystem/src/main/java/com/monstarlab/designsystem/theme/typography/Typography.kt From aea60f472dc04e8fd4c71a3973aef2da9e839394 Mon Sep 17 00:00:00 2001 From: khairullo Date: Tue, 12 Sep 2023 13:37:48 +0200 Subject: [PATCH 19/48] feat: implemented build-logic module --- build-logic/convention/build.gradle.kts | 27 +++++++++++++++++++++++++ build-logic/gradle.properties | 4 ++++ build-logic/settings.gradle.kts | 13 ++++++++++++ settings.gradle.kts | 3 ++- 4 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 build-logic/convention/build.gradle.kts create mode 100644 build-logic/gradle.properties create mode 100644 build-logic/settings.gradle.kts diff --git a/build-logic/convention/build.gradle.kts b/build-logic/convention/build.gradle.kts new file mode 100644 index 00000000..4b4158c7 --- /dev/null +++ b/build-logic/convention/build.gradle.kts @@ -0,0 +1,27 @@ +plugins { + `kotlin-dsl` +} + +group = "com.monstarlab.modularization.buildlogic" + +java { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 +} + +dependencies { + compileOnly(libs.android.gradle.plugin) + compileOnly(libs.kotlin.gradle.plugin) +} + +gradlePlugin { + /** + * Register convention plugins so they are available in the build scripts of the application + */ + plugins { + register("conventionAndroidLibrary") { + id = "convention.android.library" + implementationClass = "AndroidLibraryConventionPlugin" + } + } +} diff --git a/build-logic/gradle.properties b/build-logic/gradle.properties new file mode 100644 index 00000000..1c9073eb --- /dev/null +++ b/build-logic/gradle.properties @@ -0,0 +1,4 @@ +# Gradle properties are not passed to included builds https://github.com/gradle/gradle/issues/2534 +org.gradle.parallel=true +org.gradle.caching=true +org.gradle.configureondemand=true diff --git a/build-logic/settings.gradle.kts b/build-logic/settings.gradle.kts new file mode 100644 index 00000000..8d885091 --- /dev/null +++ b/build-logic/settings.gradle.kts @@ -0,0 +1,13 @@ +dependencyResolutionManagement { + repositories { + google() + mavenCentral() + } + versionCatalogs { + create("libs") { + from(files("../gradle/libs.versions.toml")) + } + } +} + +include(":convention") diff --git a/settings.gradle.kts b/settings.gradle.kts index 524ec184..b2242344 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,4 +1,5 @@ pluginManagement { + includeBuild("build-logic") repositories { gradlePluginPortal() google() @@ -16,4 +17,4 @@ rootProject.name = "android-template" include(":app") include(":core") -include(":designsystem") +include(":designsystem") \ No newline at end of file From 846120fe7e7d40b870c72973bd41270ea76fce57 Mon Sep 17 00:00:00 2001 From: khairullo Date: Tue, 12 Sep 2023 13:38:16 +0200 Subject: [PATCH 20/48] feat: added gitignore to build-logic module --- build-logic/convention/.gitignore | 1 + 1 file changed, 1 insertion(+) create mode 100644 build-logic/convention/.gitignore diff --git a/build-logic/convention/.gitignore b/build-logic/convention/.gitignore new file mode 100644 index 00000000..42afabfd --- /dev/null +++ b/build-logic/convention/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file From d5c0fc7ebf2dd8ba67e50d282a16b8a07f0e5d63 Mon Sep 17 00:00:00 2001 From: khairullo Date: Tue, 12 Sep 2023 13:38:32 +0200 Subject: [PATCH 21/48] feat: implemented AndroidLibraryConventionPlugin --- .../main/kotlin/AndroidLibraryConventionPlugin.kt | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 build-logic/convention/src/main/kotlin/AndroidLibraryConventionPlugin.kt diff --git a/build-logic/convention/src/main/kotlin/AndroidLibraryConventionPlugin.kt b/build-logic/convention/src/main/kotlin/AndroidLibraryConventionPlugin.kt new file mode 100644 index 00000000..b4d3d937 --- /dev/null +++ b/build-logic/convention/src/main/kotlin/AndroidLibraryConventionPlugin.kt @@ -0,0 +1,15 @@ +import com.android.build.gradle.LibraryExtension +import com.monstarlab.modularization.configureAndroid +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.kotlin.dsl.configure + +class AndroidLibraryConventionPlugin : Plugin { + override fun apply(target: Project) { + with(target) { + extensions.configure { + configureAndroid(this) + } + } + } +} From 6eba0992fe02e0167fe76707936c7605c01c6bb0 Mon Sep 17 00:00:00 2001 From: khairullo Date: Tue, 12 Sep 2023 13:38:54 +0200 Subject: [PATCH 22/48] feat: implemented Android configuration for the AndroidLibraryConventionPlugin --- .../com/monstarlab/modularization/Android.kt | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 build-logic/convention/src/main/kotlin/com/monstarlab/modularization/Android.kt diff --git a/build-logic/convention/src/main/kotlin/com/monstarlab/modularization/Android.kt b/build-logic/convention/src/main/kotlin/com/monstarlab/modularization/Android.kt new file mode 100644 index 00000000..b0f0ad0a --- /dev/null +++ b/build-logic/convention/src/main/kotlin/com/monstarlab/modularization/Android.kt @@ -0,0 +1,26 @@ +package com.monstarlab.modularization + +import com.android.build.api.dsl.CommonExtension +import org.gradle.api.JavaVersion + +internal fun configureAndroid(commonExtension: CommonExtension<*, *, *, *, *>) { + commonExtension.apply { + compileSdk = 34 + flavorDimensions += "default" + defaultConfig { + minSdk = 23 + } + buildFeatures { + compose = true + } + composeOptions { + kotlinCompilerExtensionVersion = "1.5.3" + } + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + buildFeatures.buildConfig = true + } +} From 7dcf63db632f7bbb0c9cfe3807e0ac7c9405065a Mon Sep 17 00:00:00 2001 From: khairullo Date: Tue, 12 Sep 2023 13:39:43 +0200 Subject: [PATCH 23/48] feat: added convention.android.library plugin to the project --- build.gradle.kts | 1 + gradle/libs.versions.toml | 1 + 2 files changed, 2 insertions(+) diff --git a/build.gradle.kts b/build.gradle.kts index 97e828f2..de61248a 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -11,6 +11,7 @@ buildscript { @Suppress("DSL_SCOPE_VIOLATION") plugins { alias(libs.plugins.kotlin.jvm) apply false + alias(libs.plugins.convention.android.library) apply false alias(libs.plugins.detekt) apply false alias(libs.plugins.spotless) } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index d92e126e..f1216494 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -24,6 +24,7 @@ kotlin_serialization = { id = "org.jetbrains.kotlin.plugin.serialization", versi android-application = { id = "com.android.application", version.ref = "android_gradle" } android_library = { id = "com.android.library", version.ref = "android_gradle" } kotlin_jvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" } +convention-android-library = { id = "convention.android.library", version = "unspecified" } [libraries] #------------------------- From 6c7d83bb684f6b98f85f92e23726bd7a14736d6c Mon Sep 17 00:00:00 2001 From: khairullo Date: Tue, 12 Sep 2023 13:40:29 +0200 Subject: [PATCH 24/48] feat: updated core module with convention android library plugin --- core/build.gradle.kts | 16 +--------------- 1 file changed, 1 insertion(+), 15 deletions(-) diff --git a/core/build.gradle.kts b/core/build.gradle.kts index 7ded9f7d..e0fabfd5 100644 --- a/core/build.gradle.kts +++ b/core/build.gradle.kts @@ -5,25 +5,11 @@ plugins { id("org.jetbrains.kotlin.android") id("org.jetbrains.kotlin.kapt") alias(libs.plugins.kotlin.serialization) + alias(libs.plugins.convention.android.library) } android { - compileSdk = 34 namespace = "com.monstarlab.core" - flavorDimensions += "default" - defaultConfig { - minSdk = 23 - } - buildFeatures { - compose = true - } - composeOptions { - kotlinCompilerExtensionVersion = libs.versions.compose.compiler.get() - } - compileOptions { - sourceCompatibility = JavaVersion.VERSION_11 - targetCompatibility = JavaVersion.VERSION_11 - } } kotlin { From 21173aadbd4834649bad7f2e7825abb9d9997465 Mon Sep 17 00:00:00 2001 From: khairullo Date: Tue, 12 Sep 2023 13:40:44 +0200 Subject: [PATCH 25/48] feat: updated designsystem module with convention android library plugin --- designsystem/build.gradle.kts | 17 +---------------- 1 file changed, 1 insertion(+), 16 deletions(-) diff --git a/designsystem/build.gradle.kts b/designsystem/build.gradle.kts index d47d941b..0d044ad2 100644 --- a/designsystem/build.gradle.kts +++ b/designsystem/build.gradle.kts @@ -2,25 +2,11 @@ plugins { id("com.android.library") id("org.jetbrains.kotlin.android") + alias(libs.plugins.convention.android.library) } android { - compileSdk = 34 namespace = "com.monstarlab.designsystem" - flavorDimensions += "default" - defaultConfig { - minSdk = 23 - } - buildFeatures { - compose = true - } - composeOptions { - kotlinCompilerExtensionVersion = libs.versions.compose.compiler.get() - } - compileOptions { - sourceCompatibility = JavaVersion.VERSION_11 - targetCompatibility = JavaVersion.VERSION_11 - } } kotlin { @@ -30,7 +16,6 @@ kotlin { } dependencies { - // Compose implementation(platform(libs.android.compose.bom)) implementation(libs.bundles.android.compose.core) From 449b2495445c3a144cf27917f3b61b18bcaaed9d Mon Sep 17 00:00:00 2001 From: khairullo Date: Mon, 18 Sep 2023 11:08:44 +0200 Subject: [PATCH 26/48] chore: removed empty line form the gradle --- app/build.gradle.kts | 1 - 1 file changed, 1 deletion(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index d89ad676..0985b5bf 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -1,4 +1,3 @@ - @file:Suppress("UnstableApiUsage") // TODO: Remove once https://youtrack.jetbrains.com/issue/KTIJ-19369 is fixed @Suppress("DSL_SCOPE_VIOLATION") From 24645e20a3eeba71cbe9287e6f816d857a1c8c0f Mon Sep 17 00:00:00 2001 From: khairullo Date: Mon, 18 Sep 2023 11:09:24 +0200 Subject: [PATCH 27/48] build: migrated core gradle to the ksp and versions catalogue --- core/build.gradle.kts | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/core/build.gradle.kts b/core/build.gradle.kts index e0fabfd5..a56dfca5 100644 --- a/core/build.gradle.kts +++ b/core/build.gradle.kts @@ -1,9 +1,9 @@ @Suppress("DSL_SCOPE_VIOLATION") // TODO: Remove once KTIJ-19369 is fixed plugins { - id("com.android.library") - id("dagger.hilt.android.plugin") - id("org.jetbrains.kotlin.android") - id("org.jetbrains.kotlin.kapt") + alias(libs.plugins.android.library) + alias(libs.plugins.kotlin.android) + alias(libs.plugins.hilt) + alias(libs.plugins.ksp) alias(libs.plugins.kotlin.serialization) alias(libs.plugins.convention.android.library) } @@ -18,10 +18,6 @@ kotlin { } } -kapt { - correctErrorTypes = true -} - dependencies { // Kotlin implementation(libs.bundles.kotlin) @@ -38,7 +34,7 @@ dependencies { // Injection implementation(libs.hilt.android) - kapt(libs.hilt.compiler) + ksp(libs.hilt.compiler) // Networking implementation(libs.retrofit) From 1532ecdd88ed772ffd0727e7c583cb79b2b92711 Mon Sep 17 00:00:00 2001 From: khairullo Date: Mon, 18 Sep 2023 11:09:47 +0200 Subject: [PATCH 28/48] build: migrated designsystem to the versions catalogue --- designsystem/build.gradle.kts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/designsystem/build.gradle.kts b/designsystem/build.gradle.kts index 0d044ad2..dc7d2b77 100644 --- a/designsystem/build.gradle.kts +++ b/designsystem/build.gradle.kts @@ -1,7 +1,7 @@ @Suppress("DSL_SCOPE_VIOLATION") // TODO: Remove once KTIJ-19369 is fixed plugins { - id("com.android.library") - id("org.jetbrains.kotlin.android") + alias(libs.plugins.android.library) + alias(libs.plugins.kotlin.android) alias(libs.plugins.convention.android.library) } From 2fe8e86315425bbbde4150071a210b91363943cf Mon Sep 17 00:00:00 2001 From: khairullo Date: Mon, 18 Sep 2023 11:10:17 +0200 Subject: [PATCH 29/48] build: added android library plugin to the project gradle --- build.gradle.kts | 1 + 1 file changed, 1 insertion(+) diff --git a/build.gradle.kts b/build.gradle.kts index e386ecb3..68337b95 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -11,6 +11,7 @@ buildscript { @Suppress("DSL_SCOPE_VIOLATION") plugins { alias(libs.plugins.android.application) apply false + alias(libs.plugins.android.library) apply false alias(libs.plugins.kotlin.android) apply false alias(libs.plugins.convention.android.library) apply false alias(libs.plugins.detekt) apply false From bd4c001b428f982d81456b0c0ec3eb52ba35e34a Mon Sep 17 00:00:00 2001 From: khairullo Date: Mon, 18 Sep 2023 11:10:36 +0200 Subject: [PATCH 30/48] build: added android library plugin to the versions catalogue --- gradle/libs.versions.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 26b40763..cdbd4125 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -23,6 +23,7 @@ spotless = { id = "com.diffplug.spotless", version = "6.20.0" } detekt = { id = "io.gitlab.arturbosch.detekt", version = "1.23.1" } kotlin_serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" } android-application = { id = "com.android.application", version.ref = "android_gradle" } +android_library = { id = "com.android.library", version.ref = "android_gradle" } kotlin_android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" } hilt = { id = "com.google.dagger.hilt.android", version.ref = "hilt" } ksp = { id = "com.google.devtools.ksp", version.ref = "ksp" } From 0d54f26c4845166d68fe5e905691a9c7872ddb7b Mon Sep 17 00:00:00 2001 From: khairullo Date: Mon, 18 Sep 2023 12:43:06 +0200 Subject: [PATCH 31/48] build: added android compose foundation and animation --- gradle/libs.versions.toml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index cdbd4125..af9904ca 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -75,6 +75,8 @@ android_compose_material = { module = "androidx.compose.material:material" } android_compose_ui_util = { module = "androidx.compose.ui:ui-util" } android_compose_ui_tooling = { module = "androidx.compose.ui:ui-tooling" } android_compose_ui_tooling_preview = { module = "androidx.compose.ui:ui-tooling-preview" } +android_compose_foundation = { module = "androidx.compose.animation:animation" } +android_compose_animation = { module = "androidx.compose.foundation:foundation" } android_compose_runtime = { module = "androidx.compose.runtime:runtime-livedata" } android_compose_ui_test = { module = "androidx.compose.ui:ui-test-junit4" } android_compose_ui_test_manifest = { module = "androidx.compose.ui:ui-test-manifest" } @@ -141,10 +143,10 @@ android_core = [ android_compose_core = [ "android_compose_ui", - "android_compose_material", + "android_compose_foundation", + "android_compose_animation", "android_compose_ui_util", "android_compose_runtime", - "android_compose_material_windowsize" ] android_lifecycle = [ From 585e97b3e08da45f8619ff3d1b70c47bb7efe137 Mon Sep 17 00:00:00 2001 From: khairullo Date: Mon, 18 Sep 2023 12:43:32 +0200 Subject: [PATCH 32/48] build: added commented gradle properties to speedup the build --- gradle.properties | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 8145fa7b..80f9b0b6 100644 --- a/gradle.properties +++ b/gradle.properties @@ -21,4 +21,12 @@ android.enableJetifier=true kotlin.code.style=official android.defaults.buildfeatures.buildconfig=true android.nonTransitiveRClass=false -android.nonFinalResIds=false \ No newline at end of file +android.nonFinalResIds=false +# +## Reduce size of R class +#android.nonTransitiveRClass=true +# +# Speed up the build +#org.gradle.caching=true +#org.gradle.parallel=true +##org.gradle.unsafe.configuration-cache=true \ No newline at end of file From 1a149d2803a597899c297fbcdf95071f1d82b79f Mon Sep 17 00:00:00 2001 From: khairullo Date: Mon, 18 Sep 2023 12:44:17 +0200 Subject: [PATCH 33/48] refactor: removed material from core module --- .../core/ui/layout/ColumnWithSeparators.kt | 15 ++------------- 1 file changed, 2 insertions(+), 13 deletions(-) diff --git a/core/src/main/java/com/monstarlab/core/ui/layout/ColumnWithSeparators.kt b/core/src/main/java/com/monstarlab/core/ui/layout/ColumnWithSeparators.kt index 1f27910e..9a0866ee 100644 --- a/core/src/main/java/com/monstarlab/core/ui/layout/ColumnWithSeparators.kt +++ b/core/src/main/java/com/monstarlab/core/ui/layout/ColumnWithSeparators.kt @@ -1,16 +1,13 @@ package com.monstarlab.core.ui.layout -import androidx.compose.material.Divider -import androidx.compose.material.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.layout.SubcomposeLayout -import androidx.compose.ui.tooling.preview.Preview @Composable fun ColumnWithSeparators( modifier: Modifier = Modifier, - separator: @Composable () -> Unit = { Divider() }, + separator: @Composable () -> Unit = {}, content: @Composable () -> Unit, ) { SubcomposeLayout(modifier) { constraints -> @@ -43,12 +40,4 @@ fun ColumnWithSeparators( } } -private data class ContentChild(val height: Int) - -@Preview(name = "Column With Separators", showBackground = true) -@Composable -private fun PreviewColumnWithSeparators() { - ColumnWithSeparators() { - repeat(10) { Text(text = "Hello $it") } - } -} +private data class ContentChild(val height: Int) \ No newline at end of file From 79fd442634db519f0116b31f8ffe5a400c69365b Mon Sep 17 00:00:00 2001 From: khairullo Date: Mon, 18 Sep 2023 12:44:48 +0200 Subject: [PATCH 34/48] build: added material to the designsystem module --- designsystem/build.gradle.kts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/designsystem/build.gradle.kts b/designsystem/build.gradle.kts index dc7d2b77..bfcf9cb9 100644 --- a/designsystem/build.gradle.kts +++ b/designsystem/build.gradle.kts @@ -19,6 +19,8 @@ dependencies { // Compose implementation(platform(libs.android.compose.bom)) implementation(libs.bundles.android.compose.core) + implementation(libs.android.compose.material) + implementation(libs.android.compose.material.windowsize) debugImplementation(libs.android.compose.ui.tooling) implementation(project(":core")) From 6a7233284ba51f8a5ad6042b4afadacdab52b958 Mon Sep 17 00:00:00 2001 From: khairullo Date: Mon, 18 Sep 2023 12:45:19 +0200 Subject: [PATCH 35/48] build: added material to the app module --- app/build.gradle.kts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 0985b5bf..d03e9cd9 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -108,6 +108,8 @@ dependencies { // Compose implementation(platform(libs.android.compose.bom)) implementation(libs.bundles.android.compose.core) + implementation(libs.android.compose.material) + implementation(libs.android.compose.material.windowsize) implementation(libs.android.activity.compose) implementation(libs.android.lifecycle.viewmodel.compose) implementation(libs.bundles.google.accompanist) From 89a0ffae8be318f156f52b4e886af2f2742ae5d9 Mon Sep 17 00:00:00 2001 From: khairullo Date: Mon, 18 Sep 2023 13:04:21 +0200 Subject: [PATCH 36/48] refactor: implemented NetworkConfig to be provided to the OkHttpModule in core module --- .../java/com/monstarlab/{ => injection}/AppModule.kt | 10 +++++----- .../java/com/monstarlab/core/network/NetworkConfig.kt | 5 +++++ .../java/com/monstarlab/core/network/OkHttpModule.kt | 4 ++-- 3 files changed, 12 insertions(+), 7 deletions(-) rename app/src/main/java/com/monstarlab/{ => injection}/AppModule.kt (54%) create mode 100644 core/src/main/java/com/monstarlab/core/network/NetworkConfig.kt diff --git a/app/src/main/java/com/monstarlab/AppModule.kt b/app/src/main/java/com/monstarlab/injection/AppModule.kt similarity index 54% rename from app/src/main/java/com/monstarlab/AppModule.kt rename to app/src/main/java/com/monstarlab/injection/AppModule.kt index a7dd8e32..c7c7f080 100644 --- a/app/src/main/java/com/monstarlab/AppModule.kt +++ b/app/src/main/java/com/monstarlab/injection/AppModule.kt @@ -1,5 +1,7 @@ -package com.monstarlab +package com.monstarlab.injection +import com.monstarlab.BuildConfig +import com.monstarlab.core.network.NetworkConfig import dagger.Module import dagger.Provides import dagger.hilt.InstallIn @@ -9,11 +11,9 @@ import javax.inject.Singleton @InstallIn(SingletonComponent::class) @Module class AppModule { - @Provides @Singleton - fun provideBaseUrl(): String { - return BuildConfig.API_URL + fun provideBaseUrl(): NetworkConfig { + return NetworkConfig(BuildConfig.API_URL) } - } \ No newline at end of file diff --git a/core/src/main/java/com/monstarlab/core/network/NetworkConfig.kt b/core/src/main/java/com/monstarlab/core/network/NetworkConfig.kt new file mode 100644 index 00000000..ccc21e03 --- /dev/null +++ b/core/src/main/java/com/monstarlab/core/network/NetworkConfig.kt @@ -0,0 +1,5 @@ +package com.monstarlab.core.network + +data class NetworkConfig( + val baseUrl: String +) \ No newline at end of file diff --git a/core/src/main/java/com/monstarlab/core/network/OkHttpModule.kt b/core/src/main/java/com/monstarlab/core/network/OkHttpModule.kt index 78136cdb..94a7f1b3 100644 --- a/core/src/main/java/com/monstarlab/core/network/OkHttpModule.kt +++ b/core/src/main/java/com/monstarlab/core/network/OkHttpModule.kt @@ -47,10 +47,10 @@ class OkHttpModule { @ExperimentalSerializationApi @Provides @Singleton - fun provideRetrofit(client: OkHttpClient, baseUrl: String): Retrofit { + fun provideRetrofit(client: OkHttpClient, networkConfig: NetworkConfig): Retrofit { return Retrofit.Builder() .client(client) - .baseUrl(baseUrl) + .baseUrl(networkConfig.baseUrl) .addConverterFactory( json.asConverterFactory("application/json".toMediaType()) ) From efca72567bb292c9cf805850254591351d2adfac Mon Sep 17 00:00:00 2001 From: khairullo Date: Mon, 18 Sep 2023 14:02:52 +0200 Subject: [PATCH 37/48] build: upgraded ktlint to the version 0.48.1 --- build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle.kts b/build.gradle.kts index 68337b95..f07ad631 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -35,7 +35,7 @@ subprojects { kotlin { target("**/*.kt") targetExclude("**/RateReminderActions.kt") - ktlint("0.40.0") + ktlint("0.48.1") } } } From 4f6f881e4d2b943afe8aae54a141a56fa20284be Mon Sep 17 00:00:00 2001 From: khairullo Date: Mon, 18 Sep 2023 14:04:37 +0200 Subject: [PATCH 38/48] chore: spotless applied --- .../features/auth/data/api/AuthApi.kt | 2 +- .../auth/data/api/dtos/TokenResponseDTO.kt | 2 +- .../features/auth/injection/ApiModule.kt | 2 +- .../login/domain/usecase/LoginUseCase.kt | 2 +- .../features/login/ui/LoginContract.kt | 4 ++-- .../features/login/ui/LoginCoordinator.kt | 4 ++-- .../monstarlab/features/login/ui/LoginRoute.kt | 4 ++-- .../features/login/ui/LoginScreen.kt | 18 +++++++++--------- .../features/login/ui/LoginViewModel.kt | 4 ++-- .../features/main/MainActivityViewModel.kt | 4 ++-- .../domain/usecase/SetupNstackUseCase.kt | 10 +++++----- .../resources/data/api/dtos/ResourceDTO.kt | 2 +- .../data/api/dtos/ResourcesResponseDTO.kt | 2 +- .../persistence/ResourcePreferenceStore.kt | 2 +- .../data/repository/ResourceRepositoryImpl.kt | 2 +- .../resources/domain/model/Resource.kt | 2 +- .../domain/usecase/GetResourcesUseCase.kt | 4 ++-- .../features/resources/injection/ApiModule.kt | 2 +- .../features/resources/ui/ResourcesContract.kt | 4 ++-- .../resources/ui/ResourcesCoordinator.kt | 4 ++-- .../features/resources/ui/ResourcesRoute.kt | 4 ++-- .../features/resources/ui/ResourcesScreen.kt | 14 +++++++++----- .../resources/ui/ResourcesViewModel.kt | 4 ++-- .../resources/ui/components/ResourceItem.kt | 12 ++++++++---- .../features/user/data/api/dtos/UserDTO.kt | 2 +- .../user/data/api/dtos/UserResponseDTO.kt | 2 +- .../data/persistence/UserPreferenceStore.kt | 2 +- .../user/data/repository/UserRepositoryImpl.kt | 2 +- .../features/user/domain/model/User.kt | 2 +- .../features/user/injection/ApiModule.kt | 2 +- .../java/com/monstarlab/injection/AppModule.kt | 2 +- .../features/auth/domain/AuthRepositoryTest.kt | 1 - .../core/extensions/FlowExtensions.kt | 2 +- .../monstarlab/core/network/NetworkConfig.kt | 2 +- .../monstarlab/core/network/OkHttpModule.kt | 4 ++-- .../errorhandling/ApiErrorInterceptor.kt | 4 ++-- .../core/network/errorhandling/ApiException.kt | 2 +- .../persistence/SharedPreferenceDataStore.kt | 4 ++-- .../SingleSharedPreferenceDataStore.kt | 4 ++-- .../com/monstarlab/core/ui/ComposeFragment.kt | 2 +- .../core/ui/extensions/ContextExtensions.kt | 2 +- .../core/ui/extensions/LazyLayoutExtensions.kt | 4 ++-- .../core/ui/layout/ColumnWithSeparators.kt | 4 ++-- .../monstarlab/designsystem/theme/AppTheme.kt | 2 +- .../theme/dimensions/Dimensions.kt | 2 +- .../theme/dimensions/DimensionsProvider.kt | 2 +- .../theme/typography/AppTypography.kt | 2 +- .../theme/typography/AppTypographyProvider.kt | 2 +- 48 files changed, 90 insertions(+), 83 deletions(-) diff --git a/app/src/main/java/com/monstarlab/features/auth/data/api/AuthApi.kt b/app/src/main/java/com/monstarlab/features/auth/data/api/AuthApi.kt index c10726b4..d9cd9a8c 100644 --- a/app/src/main/java/com/monstarlab/features/auth/data/api/AuthApi.kt +++ b/app/src/main/java/com/monstarlab/features/auth/data/api/AuthApi.kt @@ -11,6 +11,6 @@ interface AuthApi { @POST("login") suspend fun postLogin( @Field("email") email: String, - @Field("password") password: String, + @Field("password") password: String ): TokenResponseDTO } diff --git a/app/src/main/java/com/monstarlab/features/auth/data/api/dtos/TokenResponseDTO.kt b/app/src/main/java/com/monstarlab/features/auth/data/api/dtos/TokenResponseDTO.kt index c748233a..fa4e15c7 100644 --- a/app/src/main/java/com/monstarlab/features/auth/data/api/dtos/TokenResponseDTO.kt +++ b/app/src/main/java/com/monstarlab/features/auth/data/api/dtos/TokenResponseDTO.kt @@ -5,7 +5,7 @@ import kotlinx.serialization.Serializable @Serializable data class TokenResponseDTO( - val token: String, + val token: String ) fun TokenResponseDTO.toAuthToken() = AuthToken(token) diff --git a/app/src/main/java/com/monstarlab/features/auth/injection/ApiModule.kt b/app/src/main/java/com/monstarlab/features/auth/injection/ApiModule.kt index bcb3d853..e339fe1b 100644 --- a/app/src/main/java/com/monstarlab/features/auth/injection/ApiModule.kt +++ b/app/src/main/java/com/monstarlab/features/auth/injection/ApiModule.kt @@ -5,8 +5,8 @@ import dagger.Module import dagger.Provides import dagger.hilt.InstallIn import dagger.hilt.components.SingletonComponent -import retrofit2.Retrofit import javax.inject.Singleton +import retrofit2.Retrofit @Module @InstallIn(SingletonComponent::class) diff --git a/app/src/main/java/com/monstarlab/features/login/domain/usecase/LoginUseCase.kt b/app/src/main/java/com/monstarlab/features/login/domain/usecase/LoginUseCase.kt index f5ca85f9..6e91ea6e 100644 --- a/app/src/main/java/com/monstarlab/features/login/domain/usecase/LoginUseCase.kt +++ b/app/src/main/java/com/monstarlab/features/login/domain/usecase/LoginUseCase.kt @@ -7,7 +7,7 @@ import javax.inject.Inject class LoginUseCase @Inject constructor( private val authRepository: AuthRepository, - private val userRepository: UserRepository, + private val userRepository: UserRepository ) { suspend operator fun invoke(email: String, password: String) = suspendRunCatching { diff --git a/app/src/main/java/com/monstarlab/features/login/ui/LoginContract.kt b/app/src/main/java/com/monstarlab/features/login/ui/LoginContract.kt index 7898a362..b6698570 100644 --- a/app/src/main/java/com/monstarlab/features/login/ui/LoginContract.kt +++ b/app/src/main/java/com/monstarlab/features/login/ui/LoginContract.kt @@ -11,7 +11,7 @@ data class LoginState( val isLoading: Boolean = false, val error: ErrorModel? = null, val loginButtonEnabled: Boolean = false, - val isLoggedIn: Boolean = false, + val isLoggedIn: Boolean = false ) /** @@ -21,5 +21,5 @@ data class LoginState( data class LoginActions( val onPasswordChange: (String) -> Unit = {}, val onEmailChange: (String) -> Unit = {}, - val onLoginClick: () -> Unit = {}, + val onLoginClick: () -> Unit = {} ) diff --git a/app/src/main/java/com/monstarlab/features/login/ui/LoginCoordinator.kt b/app/src/main/java/com/monstarlab/features/login/ui/LoginCoordinator.kt index 46870ada..8ebc5aed 100644 --- a/app/src/main/java/com/monstarlab/features/login/ui/LoginCoordinator.kt +++ b/app/src/main/java/com/monstarlab/features/login/ui/LoginCoordinator.kt @@ -18,7 +18,7 @@ import kotlinx.coroutines.flow.onEach class LoginCoordinator( val viewModel: LoginViewModel, val navController: NavController, - val scope: CoroutineScope, + val scope: CoroutineScope ) { val screenStateFlow = viewModel.stateFlow @@ -40,7 +40,7 @@ class LoginCoordinator( fun rememberLoginCoordinator( viewModel: LoginViewModel, navController: NavController, - scope: CoroutineScope = rememberCoroutineScope(), + scope: CoroutineScope = rememberCoroutineScope() ): LoginCoordinator { return remember(viewModel, navController, scope) { LoginCoordinator( diff --git a/app/src/main/java/com/monstarlab/features/login/ui/LoginRoute.kt b/app/src/main/java/com/monstarlab/features/login/ui/LoginRoute.kt index 52be068b..579d36c1 100644 --- a/app/src/main/java/com/monstarlab/features/login/ui/LoginRoute.kt +++ b/app/src/main/java/com/monstarlab/features/login/ui/LoginRoute.kt @@ -11,7 +11,7 @@ import com.monstarlab.designsystem.theme.AppTheme @Composable fun LoginRoute( - coordinator: LoginCoordinator, + coordinator: LoginCoordinator ) { // State observing and declarations val uiState by coordinator.screenStateFlow.collectAsStateWithLifecycle(LoginState()) @@ -25,7 +25,7 @@ fun LoginRoute( val actions = rememberLoginActions(coordinator) // UI Rendering - com.monstarlab.designsystem.theme.AppTheme { + AppTheme { LoginScreen(uiState, actions) } } diff --git a/app/src/main/java/com/monstarlab/features/login/ui/LoginScreen.kt b/app/src/main/java/com/monstarlab/features/login/ui/LoginScreen.kt index 351759c2..3a2c4c52 100644 --- a/app/src/main/java/com/monstarlab/features/login/ui/LoginScreen.kt +++ b/app/src/main/java/com/monstarlab/features/login/ui/LoginScreen.kt @@ -25,10 +25,10 @@ import com.monstarlab.designsystem.theme.Theme @Composable fun LoginScreen( state: LoginState = LoginState(), - actions: LoginActions = LoginActions(), + actions: LoginActions = LoginActions() ) = Scaffold( topBar = { - com.monstarlab.designsystem.components.AppTopBar( + AppTopBar( modifier = Modifier.systemBarsPadding(), title = "Login" ) @@ -38,21 +38,21 @@ fun LoginScreen( modifier = Modifier .padding(it) .fillMaxSize() - .padding(com.monstarlab.designsystem.theme.Theme.dimensions.big1) + .padding(Theme.dimensions.big1) .imePadding(), horizontalAlignment = Alignment.CenterHorizontally, verticalArrangement = Arrangement.Center ) { - com.monstarlab.designsystem.components.apptextfield.AppTextField( + AppTextField( value = state.email, onValueChange = actions.onEmailChange, modifier = Modifier.fillMaxWidth(), placeholder = "E-Mail" ) - Spacer(modifier = Modifier.size(com.monstarlab.designsystem.theme.Theme.dimensions.medium3)) + Spacer(modifier = Modifier.size(Theme.dimensions.medium3)) - com.monstarlab.designsystem.components.apptextfield.AppTextField( + AppTextField( value = state.password, onValueChange = actions.onPasswordChange, modifier = Modifier.fillMaxWidth(), @@ -60,9 +60,9 @@ fun LoginScreen( visualTransformation = PasswordVisualTransformation(), placeholder = "Password" ) - Spacer(modifier = Modifier.size(com.monstarlab.designsystem.theme.Theme.dimensions.medium3)) + Spacer(modifier = Modifier.size(Theme.dimensions.medium3)) - com.monstarlab.designsystem.components.appbutton.AppButton( + AppButton( text = "Login", onClick = actions.onLoginClick, modifier = Modifier.fillMaxWidth(), @@ -74,7 +74,7 @@ fun LoginScreen( @Composable @LightDarkPreview private fun LoginScreenPreview() { - com.monstarlab.designsystem.theme.AppTheme { + AppTheme { LoginScreen() } } diff --git a/app/src/main/java/com/monstarlab/features/login/ui/LoginViewModel.kt b/app/src/main/java/com/monstarlab/features/login/ui/LoginViewModel.kt index 2631d8ac..9825108f 100644 --- a/app/src/main/java/com/monstarlab/features/login/ui/LoginViewModel.kt +++ b/app/src/main/java/com/monstarlab/features/login/ui/LoginViewModel.kt @@ -5,16 +5,16 @@ import androidx.lifecycle.viewModelScope import com.monstarlab.core.error.toError import com.monstarlab.features.login.domain.usecase.LoginUseCase import dagger.hilt.android.lifecycle.HiltViewModel +import javax.inject.Inject import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch -import javax.inject.Inject @HiltViewModel class LoginViewModel @Inject constructor( - private val loginUseCase: LoginUseCase, + private val loginUseCase: LoginUseCase ) : ViewModel() { private val _stateFlow: MutableStateFlow = MutableStateFlow(LoginState()) diff --git a/app/src/main/java/com/monstarlab/features/main/MainActivityViewModel.kt b/app/src/main/java/com/monstarlab/features/main/MainActivityViewModel.kt index 68414197..08d6f6c5 100644 --- a/app/src/main/java/com/monstarlab/features/main/MainActivityViewModel.kt +++ b/app/src/main/java/com/monstarlab/features/main/MainActivityViewModel.kt @@ -4,15 +4,15 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.monstarlab.features.nstack.domain.usecase.SetupNstackUseCase import dagger.hilt.android.lifecycle.HiltViewModel +import javax.inject.Inject import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch -import javax.inject.Inject @HiltViewModel class MainActivityViewModel @Inject constructor( - private val setupNstackUseCase: SetupNstackUseCase, + private val setupNstackUseCase: SetupNstackUseCase ) : ViewModel() { private val _stateFlow = MutableStateFlow(MainActivityState()) diff --git a/app/src/main/java/com/monstarlab/features/nstack/domain/usecase/SetupNstackUseCase.kt b/app/src/main/java/com/monstarlab/features/nstack/domain/usecase/SetupNstackUseCase.kt index edfcec99..e024fdb2 100644 --- a/app/src/main/java/com/monstarlab/features/nstack/domain/usecase/SetupNstackUseCase.kt +++ b/app/src/main/java/com/monstarlab/features/nstack/domain/usecase/SetupNstackUseCase.kt @@ -1,18 +1,18 @@ package com.monstarlab.features.nstack.domain.usecase -import com.monstarlab.core.injection.IoDispatcher import com.monstarlab.core.extensions.suspendRunCatching +import com.monstarlab.core.injection.IoDispatcher import dk.nodes.nstack.kotlin.NStack import dk.nodes.nstack.kotlin.models.AppOpenData -import kotlinx.coroutines.CoroutineDispatcher -import kotlinx.coroutines.withContext +import dk.nodes.nstack.kotlin.models.Result as NstackResult import javax.inject.Inject import kotlin.Exception import kotlin.Result -import dk.nodes.nstack.kotlin.models.Result as NstackResult +import kotlinx.coroutines.CoroutineDispatcher +import kotlinx.coroutines.withContext class SetupNstackUseCase @Inject constructor( - @IoDispatcher private val ioDispatcher: CoroutineDispatcher, + @IoDispatcher private val ioDispatcher: CoroutineDispatcher ) { suspend operator fun invoke(): Result = suspendRunCatching { diff --git a/app/src/main/java/com/monstarlab/features/resources/data/api/dtos/ResourceDTO.kt b/app/src/main/java/com/monstarlab/features/resources/data/api/dtos/ResourceDTO.kt index d4e17910..7cac03d7 100644 --- a/app/src/main/java/com/monstarlab/features/resources/data/api/dtos/ResourceDTO.kt +++ b/app/src/main/java/com/monstarlab/features/resources/data/api/dtos/ResourceDTO.kt @@ -11,7 +11,7 @@ data class ResourceDTO( val year: Int, val color: String, @SerialName("pantone_value") - val pantoneValue: String, + val pantoneValue: String ) fun ResourceDTO.toResource(): Resource { diff --git a/app/src/main/java/com/monstarlab/features/resources/data/api/dtos/ResourcesResponseDTO.kt b/app/src/main/java/com/monstarlab/features/resources/data/api/dtos/ResourcesResponseDTO.kt index d9f27aa4..7d897ae6 100644 --- a/app/src/main/java/com/monstarlab/features/resources/data/api/dtos/ResourcesResponseDTO.kt +++ b/app/src/main/java/com/monstarlab/features/resources/data/api/dtos/ResourcesResponseDTO.kt @@ -11,5 +11,5 @@ data class ResourcesResponseDTO( val total: Int, @SerialName("total_pages") val totalPages: Int, - val data: List, + val data: List ) diff --git a/app/src/main/java/com/monstarlab/features/resources/data/persistence/ResourcePreferenceStore.kt b/app/src/main/java/com/monstarlab/features/resources/data/persistence/ResourcePreferenceStore.kt index 0e98e451..9c192344 100644 --- a/app/src/main/java/com/monstarlab/features/resources/data/persistence/ResourcePreferenceStore.kt +++ b/app/src/main/java/com/monstarlab/features/resources/data/persistence/ResourcePreferenceStore.kt @@ -7,5 +7,5 @@ import com.monstarlab.features.resources.domain.model.Resource import javax.inject.Inject class ResourcePreferenceStore @Inject constructor( - dataStore: DataStore, + dataStore: DataStore ) : SharedPreferenceDataStore(dataStore, Resource.serializer()) diff --git a/app/src/main/java/com/monstarlab/features/resources/data/repository/ResourceRepositoryImpl.kt b/app/src/main/java/com/monstarlab/features/resources/data/repository/ResourceRepositoryImpl.kt index 25dfb7c4..11d01909 100644 --- a/app/src/main/java/com/monstarlab/features/resources/data/repository/ResourceRepositoryImpl.kt +++ b/app/src/main/java/com/monstarlab/features/resources/data/repository/ResourceRepositoryImpl.kt @@ -9,7 +9,7 @@ import javax.inject.Inject class ResourceRepositoryImpl @Inject constructor( private val api: ResourcesApi, - private val resourcePreferenceStore: ResourcePreferenceStore, + private val resourcePreferenceStore: ResourcePreferenceStore ) : ResourceRepository { override suspend fun get(): List { diff --git a/app/src/main/java/com/monstarlab/features/resources/domain/model/Resource.kt b/app/src/main/java/com/monstarlab/features/resources/domain/model/Resource.kt index 9a23c554..45f6f304 100644 --- a/app/src/main/java/com/monstarlab/features/resources/domain/model/Resource.kt +++ b/app/src/main/java/com/monstarlab/features/resources/domain/model/Resource.kt @@ -8,7 +8,7 @@ data class Resource( val name: String, val year: Int, val color: String, - val pantoneValue: String, + val pantoneValue: String ) { companion object { val Mock = Resource(0, "Cyberpunk", 2077, "#f2e900", "") diff --git a/app/src/main/java/com/monstarlab/features/resources/domain/usecase/GetResourcesUseCase.kt b/app/src/main/java/com/monstarlab/features/resources/domain/usecase/GetResourcesUseCase.kt index 0fd5ad0d..9c803eeb 100644 --- a/app/src/main/java/com/monstarlab/features/resources/domain/usecase/GetResourcesUseCase.kt +++ b/app/src/main/java/com/monstarlab/features/resources/domain/usecase/GetResourcesUseCase.kt @@ -2,11 +2,11 @@ package com.monstarlab.features.resources.domain.usecase import com.monstarlab.core.extensions.suspendRunCatching import com.monstarlab.features.resources.domain.repository.ResourceRepository -import kotlinx.coroutines.delay import javax.inject.Inject +import kotlinx.coroutines.delay class GetResourcesUseCase @Inject constructor( - private val resourceRepository: ResourceRepository, + private val resourceRepository: ResourceRepository ) { suspend operator fun invoke() = suspendRunCatching { diff --git a/app/src/main/java/com/monstarlab/features/resources/injection/ApiModule.kt b/app/src/main/java/com/monstarlab/features/resources/injection/ApiModule.kt index 3b594de2..78d3639e 100644 --- a/app/src/main/java/com/monstarlab/features/resources/injection/ApiModule.kt +++ b/app/src/main/java/com/monstarlab/features/resources/injection/ApiModule.kt @@ -5,8 +5,8 @@ import dagger.Module import dagger.Provides import dagger.hilt.InstallIn import dagger.hilt.components.SingletonComponent -import retrofit2.Retrofit import javax.inject.Singleton +import retrofit2.Retrofit @Module @InstallIn(SingletonComponent::class) diff --git a/app/src/main/java/com/monstarlab/features/resources/ui/ResourcesContract.kt b/app/src/main/java/com/monstarlab/features/resources/ui/ResourcesContract.kt index 97654fd0..db452b3a 100644 --- a/app/src/main/java/com/monstarlab/features/resources/ui/ResourcesContract.kt +++ b/app/src/main/java/com/monstarlab/features/resources/ui/ResourcesContract.kt @@ -9,7 +9,7 @@ import com.monstarlab.features.resources.domain.model.Resource data class ResourcesState( val isLoading: Boolean = false, val resources: List = emptyList(), - val error: ErrorModel? = null, + val error: ErrorModel? = null ) /** @@ -17,5 +17,5 @@ data class ResourcesState( * passed to the coordinator to handle **/ data class ResourcesActions( - val onResourceClick: (Resource) -> Unit = {}, + val onResourceClick: (Resource) -> Unit = {} ) diff --git a/app/src/main/java/com/monstarlab/features/resources/ui/ResourcesCoordinator.kt b/app/src/main/java/com/monstarlab/features/resources/ui/ResourcesCoordinator.kt index 1a7cad11..77010be7 100644 --- a/app/src/main/java/com/monstarlab/features/resources/ui/ResourcesCoordinator.kt +++ b/app/src/main/java/com/monstarlab/features/resources/ui/ResourcesCoordinator.kt @@ -13,7 +13,7 @@ import com.monstarlab.features.resources.domain.model.Resource */ class ResourcesCoordinator( val viewModel: ResourcesViewModel, - val context: Context, + val context: Context ) { val screenStateFlow = viewModel.stateFlow @@ -25,7 +25,7 @@ class ResourcesCoordinator( @Composable fun rememberResourcesCoordinator( viewModel: ResourcesViewModel, - context: Context = LocalContext.current, + context: Context = LocalContext.current ): ResourcesCoordinator { return remember(viewModel, context) { ResourcesCoordinator( diff --git a/app/src/main/java/com/monstarlab/features/resources/ui/ResourcesRoute.kt b/app/src/main/java/com/monstarlab/features/resources/ui/ResourcesRoute.kt index d5d86c95..9f2bbd5f 100644 --- a/app/src/main/java/com/monstarlab/features/resources/ui/ResourcesRoute.kt +++ b/app/src/main/java/com/monstarlab/features/resources/ui/ResourcesRoute.kt @@ -8,7 +8,7 @@ import com.monstarlab.designsystem.theme.AppTheme @Composable fun ResourcesRoute( - coordinator: ResourcesCoordinator, + coordinator: ResourcesCoordinator ) { // State observing and declarations val uiState by coordinator.screenStateFlow.collectAsStateWithLifecycle(ResourcesState()) @@ -17,7 +17,7 @@ fun ResourcesRoute( val actions = rememberResourcesActions(coordinator) // UI Rendering - com.monstarlab.designsystem.theme.AppTheme { + AppTheme { ResourcesScreen(uiState, actions) } } diff --git a/app/src/main/java/com/monstarlab/features/resources/ui/ResourcesScreen.kt b/app/src/main/java/com/monstarlab/features/resources/ui/ResourcesScreen.kt index 8645e368..d238c474 100644 --- a/app/src/main/java/com/monstarlab/features/resources/ui/ResourcesScreen.kt +++ b/app/src/main/java/com/monstarlab/features/resources/ui/ResourcesScreen.kt @@ -24,11 +24,11 @@ import com.monstarlab.features.resources.ui.components.ResourceItem @Composable fun ResourcesScreen( state: ResourcesState = ResourcesState(), - actions: ResourcesActions = ResourcesActions(), + actions: ResourcesActions = ResourcesActions() ) { Scaffold( topBar = { - com.monstarlab.designsystem.components.AppTopBar( + AppTopBar( title = "Resources", modifier = Modifier.statusBarsPadding() ) @@ -38,9 +38,13 @@ fun ResourcesScreen( modifier = Modifier .padding(it) .fillMaxSize(), - contentPadding = PaddingValues(com.monstarlab.designsystem.theme.Theme.dimensions.medium1), + contentPadding = PaddingValues( + Theme.dimensions.medium1 + ), horizontalAlignment = Alignment.CenterHorizontally, - verticalArrangement = Arrangement.spacedBy(com.monstarlab.designsystem.theme.Theme.dimensions.medium1) + verticalArrangement = Arrangement.spacedBy( + Theme.dimensions.medium1 + ) ) { animatedVisibilityItem("progress-indicator", state.isLoading) { CircularProgressIndicator() @@ -61,7 +65,7 @@ fun ResourcesScreen( @Composable @LightDarkPreview private fun ResourcesScreenPreview() { - com.monstarlab.designsystem.theme.AppTheme { + AppTheme { ResourcesScreen(state = ResourcesState(resources = List(4) { Resource.Mock })) } } diff --git a/app/src/main/java/com/monstarlab/features/resources/ui/ResourcesViewModel.kt b/app/src/main/java/com/monstarlab/features/resources/ui/ResourcesViewModel.kt index 6d8b20ec..4e6a44d0 100644 --- a/app/src/main/java/com/monstarlab/features/resources/ui/ResourcesViewModel.kt +++ b/app/src/main/java/com/monstarlab/features/resources/ui/ResourcesViewModel.kt @@ -5,16 +5,16 @@ import androidx.lifecycle.viewModelScope import com.monstarlab.core.error.toError import com.monstarlab.features.resources.domain.usecase.GetResourcesUseCase import dagger.hilt.android.lifecycle.HiltViewModel +import javax.inject.Inject import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch -import javax.inject.Inject @HiltViewModel class ResourcesViewModel @Inject constructor( - private val getResourcesUseCase: GetResourcesUseCase, + private val getResourcesUseCase: GetResourcesUseCase ) : ViewModel() { private val _stateFlow: MutableStateFlow = MutableStateFlow(ResourcesState()) diff --git a/app/src/main/java/com/monstarlab/features/resources/ui/components/ResourceItem.kt b/app/src/main/java/com/monstarlab/features/resources/ui/components/ResourceItem.kt index d814a8c5..303ed481 100644 --- a/app/src/main/java/com/monstarlab/features/resources/ui/components/ResourceItem.kt +++ b/app/src/main/java/com/monstarlab/features/resources/ui/components/ResourceItem.kt @@ -25,12 +25,16 @@ import com.monstarlab.features.resources.domain.model.Resource @Composable fun ResourceItem( resource: Resource, - modifier: Modifier = Modifier, + modifier: Modifier = Modifier ) { Card { Row( - modifier = modifier.fillMaxWidth().padding(com.monstarlab.designsystem.theme.Theme.dimensions.medium2), - horizontalArrangement = Arrangement.spacedBy(com.monstarlab.designsystem.theme.Theme.dimensions.medium1), + modifier = modifier.fillMaxWidth().padding( + Theme.dimensions.medium2 + ), + horizontalArrangement = Arrangement.spacedBy( + Theme.dimensions.medium1 + ), verticalAlignment = Alignment.CenterVertically ) { Box( @@ -57,7 +61,7 @@ fun ResourceItem( @Preview(name = "ResourceItem") @Composable private fun PreviewResourceItem() { - com.monstarlab.designsystem.theme.AppTheme { + AppTheme { ResourceItem(Resource.Mock) } } diff --git a/app/src/main/java/com/monstarlab/features/user/data/api/dtos/UserDTO.kt b/app/src/main/java/com/monstarlab/features/user/data/api/dtos/UserDTO.kt index 0618d04d..2c957727 100644 --- a/app/src/main/java/com/monstarlab/features/user/data/api/dtos/UserDTO.kt +++ b/app/src/main/java/com/monstarlab/features/user/data/api/dtos/UserDTO.kt @@ -12,7 +12,7 @@ data class UserDTO( val firstName: String, @SerialName("last_name") val lastName: String, - val avatar: String, + val avatar: String ) fun UserDTO.toUser(): User { diff --git a/app/src/main/java/com/monstarlab/features/user/data/api/dtos/UserResponseDTO.kt b/app/src/main/java/com/monstarlab/features/user/data/api/dtos/UserResponseDTO.kt index 083a5f81..21d6c026 100644 --- a/app/src/main/java/com/monstarlab/features/user/data/api/dtos/UserResponseDTO.kt +++ b/app/src/main/java/com/monstarlab/features/user/data/api/dtos/UserResponseDTO.kt @@ -4,5 +4,5 @@ import kotlinx.serialization.Serializable @Serializable data class UserResponseDTO( - val data: UserDTO, + val data: UserDTO ) diff --git a/app/src/main/java/com/monstarlab/features/user/data/persistence/UserPreferenceStore.kt b/app/src/main/java/com/monstarlab/features/user/data/persistence/UserPreferenceStore.kt index bdf3291b..f4a29a95 100644 --- a/app/src/main/java/com/monstarlab/features/user/data/persistence/UserPreferenceStore.kt +++ b/app/src/main/java/com/monstarlab/features/user/data/persistence/UserPreferenceStore.kt @@ -7,5 +7,5 @@ import com.monstarlab.features.user.domain.model.User import javax.inject.Inject class UserPreferenceStore @Inject constructor( - dataStore: DataStore, + dataStore: DataStore ) : SingleSharedPreferenceDataStore(dataStore, User.serializer()) diff --git a/app/src/main/java/com/monstarlab/features/user/data/repository/UserRepositoryImpl.kt b/app/src/main/java/com/monstarlab/features/user/data/repository/UserRepositoryImpl.kt index 2cd41c4a..7a4dc276 100644 --- a/app/src/main/java/com/monstarlab/features/user/data/repository/UserRepositoryImpl.kt +++ b/app/src/main/java/com/monstarlab/features/user/data/repository/UserRepositoryImpl.kt @@ -9,7 +9,7 @@ import javax.inject.Inject class UserRepositoryImpl @Inject constructor( private val api: UsersApi, - private val userPreferenceStore: UserPreferenceStore, + private val userPreferenceStore: UserPreferenceStore ) : UserRepository { override suspend fun get(): User { diff --git a/app/src/main/java/com/monstarlab/features/user/domain/model/User.kt b/app/src/main/java/com/monstarlab/features/user/domain/model/User.kt index 9d673fa1..f11e626a 100644 --- a/app/src/main/java/com/monstarlab/features/user/domain/model/User.kt +++ b/app/src/main/java/com/monstarlab/features/user/domain/model/User.kt @@ -7,5 +7,5 @@ data class User( val email: String, val firstName: String, val lastName: String, - val avatar: String, + val avatar: String ) diff --git a/app/src/main/java/com/monstarlab/features/user/injection/ApiModule.kt b/app/src/main/java/com/monstarlab/features/user/injection/ApiModule.kt index 7e151c27..1184d62c 100644 --- a/app/src/main/java/com/monstarlab/features/user/injection/ApiModule.kt +++ b/app/src/main/java/com/monstarlab/features/user/injection/ApiModule.kt @@ -5,8 +5,8 @@ import dagger.Module import dagger.Provides import dagger.hilt.InstallIn import dagger.hilt.components.SingletonComponent -import retrofit2.Retrofit import javax.inject.Singleton +import retrofit2.Retrofit @Module @InstallIn(SingletonComponent::class) diff --git a/app/src/main/java/com/monstarlab/injection/AppModule.kt b/app/src/main/java/com/monstarlab/injection/AppModule.kt index c7c7f080..806a98fe 100644 --- a/app/src/main/java/com/monstarlab/injection/AppModule.kt +++ b/app/src/main/java/com/monstarlab/injection/AppModule.kt @@ -16,4 +16,4 @@ class AppModule { fun provideBaseUrl(): NetworkConfig { return NetworkConfig(BuildConfig.API_URL) } -} \ No newline at end of file +} diff --git a/app/src/test/java/com/monstarlab/features/auth/domain/AuthRepositoryTest.kt b/app/src/test/java/com/monstarlab/features/auth/domain/AuthRepositoryTest.kt index 901bba6c..d4c8c436 100644 --- a/app/src/test/java/com/monstarlab/features/auth/domain/AuthRepositoryTest.kt +++ b/app/src/test/java/com/monstarlab/features/auth/domain/AuthRepositoryTest.kt @@ -38,7 +38,6 @@ internal class AuthRepositoryTest { @OptIn(ExperimentalCoroutinesApi::class) @Test fun testLoginReturnsExpectedAuthToken() = runTest { - // Arrange val email = "aslam@test.com" val password = "password" diff --git a/core/src/main/java/com/monstarlab/core/extensions/FlowExtensions.kt b/core/src/main/java/com/monstarlab/core/extensions/FlowExtensions.kt index e313c2f9..5f336584 100644 --- a/core/src/main/java/com/monstarlab/core/extensions/FlowExtensions.kt +++ b/core/src/main/java/com/monstarlab/core/extensions/FlowExtensions.kt @@ -1,9 +1,9 @@ package com.monstarlab.core.extensions +import kotlin.time.Duration import kotlinx.coroutines.delay import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.flow -import kotlin.time.Duration fun tickerFlow(interval: Duration, initialDelay: Duration = Duration.ZERO): Flow { return flow { diff --git a/core/src/main/java/com/monstarlab/core/network/NetworkConfig.kt b/core/src/main/java/com/monstarlab/core/network/NetworkConfig.kt index ccc21e03..eae0ca49 100644 --- a/core/src/main/java/com/monstarlab/core/network/NetworkConfig.kt +++ b/core/src/main/java/com/monstarlab/core/network/NetworkConfig.kt @@ -2,4 +2,4 @@ package com.monstarlab.core.network data class NetworkConfig( val baseUrl: String -) \ No newline at end of file +) diff --git a/core/src/main/java/com/monstarlab/core/network/OkHttpModule.kt b/core/src/main/java/com/monstarlab/core/network/OkHttpModule.kt index 94a7f1b3..78bf1870 100644 --- a/core/src/main/java/com/monstarlab/core/network/OkHttpModule.kt +++ b/core/src/main/java/com/monstarlab/core/network/OkHttpModule.kt @@ -10,14 +10,14 @@ import dagger.Provides import dagger.hilt.InstallIn import dagger.hilt.android.qualifiers.ApplicationContext import dagger.hilt.components.SingletonComponent +import java.util.concurrent.TimeUnit +import javax.inject.Singleton import kotlinx.serialization.ExperimentalSerializationApi import kotlinx.serialization.json.Json import okhttp3.MediaType.Companion.toMediaType import okhttp3.OkHttpClient import okhttp3.logging.HttpLoggingInterceptor import retrofit2.Retrofit -import java.util.concurrent.TimeUnit -import javax.inject.Singleton @InstallIn(SingletonComponent::class) @Module diff --git a/core/src/main/java/com/monstarlab/core/network/errorhandling/ApiErrorInterceptor.kt b/core/src/main/java/com/monstarlab/core/network/errorhandling/ApiErrorInterceptor.kt index 16af9fe6..acfdd87b 100644 --- a/core/src/main/java/com/monstarlab/core/network/errorhandling/ApiErrorInterceptor.kt +++ b/core/src/main/java/com/monstarlab/core/network/errorhandling/ApiErrorInterceptor.kt @@ -1,12 +1,12 @@ package com.monstarlab.core.network.errorhandling +import javax.inject.Inject import kotlinx.serialization.json.Json import okhttp3.Interceptor import okhttp3.MediaType.Companion.toMediaType import okhttp3.Response import okhttp3.ResponseBody.Companion.toResponseBody import timber.log.Timber -import javax.inject.Inject /** * Intercepts API errors and converts them into [ApiException] by decoding the Error response body @@ -14,7 +14,7 @@ import javax.inject.Inject * */ class ApiErrorInterceptor @Inject constructor( - private val json: Json, + private val json: Json ) : Interceptor { override fun intercept(chain: Interceptor.Chain): Response { diff --git a/core/src/main/java/com/monstarlab/core/network/errorhandling/ApiException.kt b/core/src/main/java/com/monstarlab/core/network/errorhandling/ApiException.kt index 14dabd3d..e2dd0ba1 100644 --- a/core/src/main/java/com/monstarlab/core/network/errorhandling/ApiException.kt +++ b/core/src/main/java/com/monstarlab/core/network/errorhandling/ApiException.kt @@ -9,5 +9,5 @@ import java.io.IOException */ data class ApiException( val code: Int, - val displayableMessage: String, + val displayableMessage: String ) : IOException(displayableMessage) diff --git a/core/src/main/java/com/monstarlab/core/persistence/SharedPreferenceDataStore.kt b/core/src/main/java/com/monstarlab/core/persistence/SharedPreferenceDataStore.kt index 338fa351..0385ffbf 100644 --- a/core/src/main/java/com/monstarlab/core/persistence/SharedPreferenceDataStore.kt +++ b/core/src/main/java/com/monstarlab/core/persistence/SharedPreferenceDataStore.kt @@ -11,9 +11,9 @@ import kotlinx.serialization.SerializationException import kotlinx.serialization.builtins.ListSerializer import kotlinx.serialization.json.Json -abstract class SharedPreferenceDataStore constructor( +abstract class SharedPreferenceDataStore( private val dataStore: DataStore, - private val serializer: KSerializer, + private val serializer: KSerializer ) : DataSource { private val key = stringPreferencesKey(this.javaClass.simpleName) diff --git a/core/src/main/java/com/monstarlab/core/persistence/SingleSharedPreferenceDataStore.kt b/core/src/main/java/com/monstarlab/core/persistence/SingleSharedPreferenceDataStore.kt index 5cba9ee9..eed536f7 100644 --- a/core/src/main/java/com/monstarlab/core/persistence/SingleSharedPreferenceDataStore.kt +++ b/core/src/main/java/com/monstarlab/core/persistence/SingleSharedPreferenceDataStore.kt @@ -11,9 +11,9 @@ import kotlinx.serialization.SerializationException import kotlinx.serialization.json.Json import timber.log.Timber -abstract class SingleSharedPreferenceDataStore constructor( +abstract class SingleSharedPreferenceDataStore( private val dataStore: DataStore, - private val serializer: KSerializer, + private val serializer: KSerializer ) : SingleDataSource { private val key = stringPreferencesKey(this.javaClass.simpleName) diff --git a/core/src/main/java/com/monstarlab/core/ui/ComposeFragment.kt b/core/src/main/java/com/monstarlab/core/ui/ComposeFragment.kt index 1d2f6d3c..5f15ff0b 100644 --- a/core/src/main/java/com/monstarlab/core/ui/ComposeFragment.kt +++ b/core/src/main/java/com/monstarlab/core/ui/ComposeFragment.kt @@ -16,7 +16,7 @@ abstract class ComposeFragment : Fragment() { override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle?, + savedInstanceState: Bundle? ): View? { return ComposeView(requireContext()).apply { setContent { diff --git a/core/src/main/java/com/monstarlab/core/ui/extensions/ContextExtensions.kt b/core/src/main/java/com/monstarlab/core/ui/extensions/ContextExtensions.kt index e17148bd..42c2722c 100644 --- a/core/src/main/java/com/monstarlab/core/ui/extensions/ContextExtensions.kt +++ b/core/src/main/java/com/monstarlab/core/ui/extensions/ContextExtensions.kt @@ -45,7 +45,7 @@ fun Context.checkPermission(permission: String): Boolean { fun Context.openShareSheet( title: String, message: String, - intentTitle: String = title, + intentTitle: String = title ) { val shareIntent = Intent().apply { action = Intent.ACTION_SEND diff --git a/core/src/main/java/com/monstarlab/core/ui/extensions/LazyLayoutExtensions.kt b/core/src/main/java/com/monstarlab/core/ui/extensions/LazyLayoutExtensions.kt index 520d4c79..43bd2251 100644 --- a/core/src/main/java/com/monstarlab/core/ui/extensions/LazyLayoutExtensions.kt +++ b/core/src/main/java/com/monstarlab/core/ui/extensions/LazyLayoutExtensions.kt @@ -17,7 +17,7 @@ fun LazyListScope.animatedVisibilityItem( visible: Boolean, enter: EnterTransition = fadeIn() + expandIn(), exit: ExitTransition = fadeOut() + shrinkOut(), - content: @Composable () -> Unit, + content: @Composable () -> Unit ) { item( key = key, @@ -39,7 +39,7 @@ fun LazyListScope.animatedVisibilityHeader( modifier: Modifier = Modifier, enter: EnterTransition = fadeIn() + expandIn(), exit: ExitTransition = fadeOut() + shrinkOut(), - content: @Composable () -> Unit, + content: @Composable () -> Unit ) { stickyHeader( key = key, diff --git a/core/src/main/java/com/monstarlab/core/ui/layout/ColumnWithSeparators.kt b/core/src/main/java/com/monstarlab/core/ui/layout/ColumnWithSeparators.kt index 9a0866ee..1e71e8ed 100644 --- a/core/src/main/java/com/monstarlab/core/ui/layout/ColumnWithSeparators.kt +++ b/core/src/main/java/com/monstarlab/core/ui/layout/ColumnWithSeparators.kt @@ -8,7 +8,7 @@ import androidx.compose.ui.layout.SubcomposeLayout fun ColumnWithSeparators( modifier: Modifier = Modifier, separator: @Composable () -> Unit = {}, - content: @Composable () -> Unit, + content: @Composable () -> Unit ) { SubcomposeLayout(modifier) { constraints -> val contentsMesuarebles = subcompose("content", content) @@ -40,4 +40,4 @@ fun ColumnWithSeparators( } } -private data class ContentChild(val height: Int) \ No newline at end of file +private data class ContentChild(val height: Int) diff --git a/designsystem/src/main/java/com/monstarlab/designsystem/theme/AppTheme.kt b/designsystem/src/main/java/com/monstarlab/designsystem/theme/AppTheme.kt index eab8ddf1..7bbb2312 100644 --- a/designsystem/src/main/java/com/monstarlab/designsystem/theme/AppTheme.kt +++ b/designsystem/src/main/java/com/monstarlab/designsystem/theme/AppTheme.kt @@ -24,7 +24,7 @@ import com.monstarlab.designsystem.theme.typography.Typography fun AppTheme( isDarkMode: Boolean = isSystemInDarkTheme(), isSmallDevice: Boolean = isSmallDevice(), - content: @Composable () -> Unit, + content: @Composable () -> Unit ) { val dimensions = if (isSmallDevice) Dimensions.Small else Dimensions.Default ProvideDimensions(dimensions = dimensions) { diff --git a/designsystem/src/main/java/com/monstarlab/designsystem/theme/dimensions/Dimensions.kt b/designsystem/src/main/java/com/monstarlab/designsystem/theme/dimensions/Dimensions.kt index d0e2b33f..1b080610 100644 --- a/designsystem/src/main/java/com/monstarlab/designsystem/theme/dimensions/Dimensions.kt +++ b/designsystem/src/main/java/com/monstarlab/designsystem/theme/dimensions/Dimensions.kt @@ -12,7 +12,7 @@ class Dimensions( val medium2: Dp, val medium3: Dp, val big1: Dp, - val big2: Dp, + val big2: Dp ) { companion object { val Small = Dimensions( diff --git a/designsystem/src/main/java/com/monstarlab/designsystem/theme/dimensions/DimensionsProvider.kt b/designsystem/src/main/java/com/monstarlab/designsystem/theme/dimensions/DimensionsProvider.kt index 4b168c57..df59c05d 100644 --- a/designsystem/src/main/java/com/monstarlab/designsystem/theme/dimensions/DimensionsProvider.kt +++ b/designsystem/src/main/java/com/monstarlab/designsystem/theme/dimensions/DimensionsProvider.kt @@ -11,7 +11,7 @@ val LocalDimensions = staticCompositionLocalOf { @Composable fun ProvideDimensions( dimensions: Dimensions, - content: @Composable () -> Unit, + content: @Composable () -> Unit ) { CompositionLocalProvider(LocalDimensions provides dimensions) { content.invoke() diff --git a/designsystem/src/main/java/com/monstarlab/designsystem/theme/typography/AppTypography.kt b/designsystem/src/main/java/com/monstarlab/designsystem/theme/typography/AppTypography.kt index e1ccd7b9..f1e5f26f 100644 --- a/designsystem/src/main/java/com/monstarlab/designsystem/theme/typography/AppTypography.kt +++ b/designsystem/src/main/java/com/monstarlab/designsystem/theme/typography/AppTypography.kt @@ -15,7 +15,7 @@ data class AppTypography( val headline2: TextStyle, val body1: TextStyle, val body2: TextStyle, - val button: TextStyle, + val button: TextStyle ) { constructor(typography: Typography) : this( diff --git a/designsystem/src/main/java/com/monstarlab/designsystem/theme/typography/AppTypographyProvider.kt b/designsystem/src/main/java/com/monstarlab/designsystem/theme/typography/AppTypographyProvider.kt index 32249b93..a551e3b6 100644 --- a/designsystem/src/main/java/com/monstarlab/designsystem/theme/typography/AppTypographyProvider.kt +++ b/designsystem/src/main/java/com/monstarlab/designsystem/theme/typography/AppTypographyProvider.kt @@ -11,7 +11,7 @@ val LocalAppTypography = staticCompositionLocalOf { @Composable fun ProvideAppTypography( typography: AppTypography = AppTypography(Typography), - content: @Composable () -> Unit = {}, + content: @Composable () -> Unit = {} ) { CompositionLocalProvider(LocalAppTypography provides typography) { content.invoke() From 2259f34b58ab0625d0168e1a542aac827b825fb0 Mon Sep 17 00:00:00 2001 From: khairullo Date: Mon, 18 Sep 2023 14:35:51 +0200 Subject: [PATCH 39/48] build: added android_compose_ui_tooling_preview to the core and designsystem modules --- gradle/libs.versions.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index af9904ca..c4964384 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -147,6 +147,7 @@ android_compose_core = [ "android_compose_animation", "android_compose_ui_util", "android_compose_runtime", + "android_compose_ui_tooling_preview" ] android_lifecycle = [ From 96ed8c03727d6f8722be58b53d00f193e31fc22f Mon Sep 17 00:00:00 2001 From: Roman Levinzon Date: Tue, 28 Nov 2023 10:18:46 +0100 Subject: [PATCH 40/48] build: add material dep to the core module --- core/build.gradle.kts | 2 +- .../java/com/monstarlab/core/ui/layout/ColumnWithSeparators.kt | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/core/build.gradle.kts b/core/build.gradle.kts index a56dfca5..9b0f8ba7 100644 --- a/core/build.gradle.kts +++ b/core/build.gradle.kts @@ -29,8 +29,8 @@ dependencies { // Compose implementation(platform(libs.android.compose.bom)) implementation(libs.bundles.android.compose.core) + implementation(libs.android.compose.material) implementation(libs.bundles.google.accompanist) - debugImplementation(libs.android.compose.ui.tooling) // Injection implementation(libs.hilt.android) diff --git a/core/src/main/java/com/monstarlab/core/ui/layout/ColumnWithSeparators.kt b/core/src/main/java/com/monstarlab/core/ui/layout/ColumnWithSeparators.kt index 351a22c2..f570bcf0 100644 --- a/core/src/main/java/com/monstarlab/core/ui/layout/ColumnWithSeparators.kt +++ b/core/src/main/java/com/monstarlab/core/ui/layout/ColumnWithSeparators.kt @@ -1,8 +1,10 @@ package com.monstarlab.core.ui.layout +import androidx.compose.material.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.layout.SubcomposeLayout +import androidx.compose.ui.tooling.preview.Preview @Composable fun ColumnWithSeparators( From 3fcb55ba442db48f1d981099ae364d61f99d3372 Mon Sep 17 00:00:00 2001 From: Roman Levinzon Date: Tue, 28 Nov 2023 11:17:30 +0100 Subject: [PATCH 41/48] build: Add AndroidAppConvetionPlugin and align java version using javatoolchain --- app/build.gradle.kts | 25 ++++------------- build-logic/convention/build.gradle.kts | 15 +++++----- .../kotlin/AndroidLibraryConventionPlugin.kt | 15 ---------- .../convention/AndroidAppConventionPlugin.kt | 28 +++++++++++++++++++ .../monstarlab/convention/AndroidConfig.kt | 9 ++++++ .../convention/AndroidLibConventionPlugin.kt | 27 ++++++++++++++++++ .../convention/extensions/Extensions.kt | 10 +++++++ .../com/monstarlab/modularization/Android.kt | 26 ----------------- build.gradle.kts | 1 + core/build.gradle.kts | 4 +-- designsystem/build.gradle.kts | 4 +-- gradle/libs.versions.toml | 1 + 12 files changed, 92 insertions(+), 73 deletions(-) delete mode 100644 build-logic/convention/src/main/kotlin/AndroidLibraryConventionPlugin.kt create mode 100644 build-logic/convention/src/main/kotlin/com/monstarlab/convention/AndroidAppConventionPlugin.kt create mode 100644 build-logic/convention/src/main/kotlin/com/monstarlab/convention/AndroidConfig.kt create mode 100644 build-logic/convention/src/main/kotlin/com/monstarlab/convention/AndroidLibConventionPlugin.kt create mode 100644 build-logic/convention/src/main/kotlin/com/monstarlab/convention/extensions/Extensions.kt delete mode 100644 build-logic/convention/src/main/kotlin/com/monstarlab/modularization/Android.kt diff --git a/app/build.gradle.kts b/app/build.gradle.kts index d03e9cd9..1538822b 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -8,6 +8,7 @@ plugins { alias(libs.plugins.ksp) alias(libs.plugins.hilt) id("dk.nstack.translation.plugin") + alias(libs.plugins.convention.android.application) } val nStackKey = "LqWLm621BwIxNRzdrei88pKhIIEI2EE8ni8r" @@ -20,14 +21,11 @@ translation { } android { - compileSdk = 34 namespace = "com.monstarlab" flavorDimensions += "default" defaultConfig { manifestPlaceholders += mapOf("appId" to nStackAppId, "apiKey" to nStackKey) applicationId = "com.monstarlab" - minSdk = 23 - targetSdk = 34 versionCode = 1 versionName = "1.0.0" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" @@ -62,28 +60,17 @@ android { buildConfigField("String", "API_URL", "\"https://reqres.in/api/\"") } } - buildFeatures { - viewBinding = true - compose = true - } - composeOptions { - kotlinCompilerExtensionVersion = libs.versions.compose.compiler.get() - } - compileOptions { - sourceCompatibility = JavaVersion.VERSION_17 - targetCompatibility = JavaVersion.VERSION_17 - } - kotlin { - jvmToolchain { - languageVersion.set(JavaLanguageVersion.of(JavaVersion.VERSION_17.toString())) - } - } + packaging { resources.excludes.add("META-INF/versions/9/previous-compilation-data.bin") } } +kotlin { + jvmToolchain(17) +} + configurations { create("devDebugImplementation") } diff --git a/build-logic/convention/build.gradle.kts b/build-logic/convention/build.gradle.kts index 4b4158c7..7de0e64f 100644 --- a/build-logic/convention/build.gradle.kts +++ b/build-logic/convention/build.gradle.kts @@ -2,12 +2,8 @@ plugins { `kotlin-dsl` } -group = "com.monstarlab.modularization.buildlogic" +group = "com.monstarlab.buildlogic" -java { - sourceCompatibility = JavaVersion.VERSION_17 - targetCompatibility = JavaVersion.VERSION_17 -} dependencies { compileOnly(libs.android.gradle.plugin) @@ -19,9 +15,14 @@ gradlePlugin { * Register convention plugins so they are available in the build scripts of the application */ plugins { - register("conventionAndroidLibrary") { + register("conventionAndroidLib") { id = "convention.android.library" - implementationClass = "AndroidLibraryConventionPlugin" + implementationClass = "com.monstarlab.convention.AndroidLibConventionPlugin" + } + + register("conventionAndroidApp") { + id = "convention.android.application" + implementationClass = "com.monstarlab.convention.AndroidAppConventionPlugin" } } } diff --git a/build-logic/convention/src/main/kotlin/AndroidLibraryConventionPlugin.kt b/build-logic/convention/src/main/kotlin/AndroidLibraryConventionPlugin.kt deleted file mode 100644 index b4d3d937..00000000 --- a/build-logic/convention/src/main/kotlin/AndroidLibraryConventionPlugin.kt +++ /dev/null @@ -1,15 +0,0 @@ -import com.android.build.gradle.LibraryExtension -import com.monstarlab.modularization.configureAndroid -import org.gradle.api.Plugin -import org.gradle.api.Project -import org.gradle.kotlin.dsl.configure - -class AndroidLibraryConventionPlugin : Plugin { - override fun apply(target: Project) { - with(target) { - extensions.configure { - configureAndroid(this) - } - } - } -} diff --git a/build-logic/convention/src/main/kotlin/com/monstarlab/convention/AndroidAppConventionPlugin.kt b/build-logic/convention/src/main/kotlin/com/monstarlab/convention/AndroidAppConventionPlugin.kt new file mode 100644 index 00000000..10869208 --- /dev/null +++ b/build-logic/convention/src/main/kotlin/com/monstarlab/convention/AndroidAppConventionPlugin.kt @@ -0,0 +1,28 @@ +package com.monstarlab.convention + +import com.android.build.api.dsl.ApplicationExtension +import com.monstarlab.convention.extensions.libs +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.kotlin.dsl.configure + +class AndroidAppConventionPlugin : Plugin { + override fun apply(target: Project) { + target.configure { + compileSdk = AndroidConfiguration.COMPILE_SDK + defaultConfig { + targetSdk = AndroidConfiguration.TARGET_SDK + minSdk = AndroidConfiguration.MIN_SDK + } + + buildFeatures { + compose = true + buildConfig = true + } + composeOptions { + kotlinCompilerExtensionVersion = target.rootProject.libs.findVersion("compose_compiler").get().toString() + } + } + + } +} \ No newline at end of file diff --git a/build-logic/convention/src/main/kotlin/com/monstarlab/convention/AndroidConfig.kt b/build-logic/convention/src/main/kotlin/com/monstarlab/convention/AndroidConfig.kt new file mode 100644 index 00000000..4104cc5a --- /dev/null +++ b/build-logic/convention/src/main/kotlin/com/monstarlab/convention/AndroidConfig.kt @@ -0,0 +1,9 @@ +package com.monstarlab.convention + + +internal object AndroidConfiguration { + const val COMPILE_SDK = 34 + const val TARGET_SDK = 34 + const val MIN_SDK = 23 +} + diff --git a/build-logic/convention/src/main/kotlin/com/monstarlab/convention/AndroidLibConventionPlugin.kt b/build-logic/convention/src/main/kotlin/com/monstarlab/convention/AndroidLibConventionPlugin.kt new file mode 100644 index 00000000..646b3ad0 --- /dev/null +++ b/build-logic/convention/src/main/kotlin/com/monstarlab/convention/AndroidLibConventionPlugin.kt @@ -0,0 +1,27 @@ +package com.monstarlab.convention + +import com.android.build.gradle.LibraryExtension +import com.monstarlab.convention.extensions.libs +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.kotlin.dsl.configure + +class AndroidLibConventionPlugin : Plugin { + override fun apply(target: Project) { + with(target) { + extensions.configure { + compileSdk = AndroidConfiguration.COMPILE_SDK + defaultConfig { + minSdk = AndroidConfiguration.MIN_SDK + } + buildFeatures { + compose = true + buildConfig = true + } + composeOptions { + kotlinCompilerExtensionVersion = target.rootProject.libs.findVersion("compose_compiler").get().toString() + } + } + } + } +} diff --git a/build-logic/convention/src/main/kotlin/com/monstarlab/convention/extensions/Extensions.kt b/build-logic/convention/src/main/kotlin/com/monstarlab/convention/extensions/Extensions.kt new file mode 100644 index 00000000..ade2c541 --- /dev/null +++ b/build-logic/convention/src/main/kotlin/com/monstarlab/convention/extensions/Extensions.kt @@ -0,0 +1,10 @@ +package com.monstarlab.convention.extensions + +import org.gradle.api.Project +import org.gradle.api.artifacts.VersionCatalog +import org.gradle.api.artifacts.VersionCatalogsExtension +import org.gradle.kotlin.dsl.getByType + + +val Project.libs: VersionCatalog get() = + extensions.getByType().named("libs") \ No newline at end of file diff --git a/build-logic/convention/src/main/kotlin/com/monstarlab/modularization/Android.kt b/build-logic/convention/src/main/kotlin/com/monstarlab/modularization/Android.kt deleted file mode 100644 index b0f0ad0a..00000000 --- a/build-logic/convention/src/main/kotlin/com/monstarlab/modularization/Android.kt +++ /dev/null @@ -1,26 +0,0 @@ -package com.monstarlab.modularization - -import com.android.build.api.dsl.CommonExtension -import org.gradle.api.JavaVersion - -internal fun configureAndroid(commonExtension: CommonExtension<*, *, *, *, *>) { - commonExtension.apply { - compileSdk = 34 - flavorDimensions += "default" - defaultConfig { - minSdk = 23 - } - buildFeatures { - compose = true - } - composeOptions { - kotlinCompilerExtensionVersion = "1.5.3" - } - compileOptions { - sourceCompatibility = JavaVersion.VERSION_11 - targetCompatibility = JavaVersion.VERSION_11 - } - - buildFeatures.buildConfig = true - } -} diff --git a/build.gradle.kts b/build.gradle.kts index 6b38dbd0..7267c40e 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -14,6 +14,7 @@ plugins { alias(libs.plugins.android.library) apply false alias(libs.plugins.kotlin.android) apply false alias(libs.plugins.convention.android.library) apply false + alias(libs.plugins.convention.android.application) apply false alias(libs.plugins.detekt) apply false alias(libs.plugins.spotless) alias(libs.plugins.hilt) apply false diff --git a/core/build.gradle.kts b/core/build.gradle.kts index 9b0f8ba7..2c0a4c4f 100644 --- a/core/build.gradle.kts +++ b/core/build.gradle.kts @@ -13,9 +13,7 @@ android { } kotlin { - jvmToolchain { - languageVersion.set(JavaLanguageVersion.of(JavaVersion.VERSION_11.toString())) - } + jvmToolchain(17) } dependencies { diff --git a/designsystem/build.gradle.kts b/designsystem/build.gradle.kts index bfcf9cb9..d2f463e1 100644 --- a/designsystem/build.gradle.kts +++ b/designsystem/build.gradle.kts @@ -10,9 +10,7 @@ android { } kotlin { - jvmToolchain { - languageVersion.set(JavaLanguageVersion.of(JavaVersion.VERSION_11.toString())) - } + jvmToolchain(17) } dependencies { diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 24714d5b..5b9a17bc 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -28,6 +28,7 @@ kotlin_android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" } hilt = { id = "com.google.dagger.hilt.android", version.ref = "hilt" } ksp = { id = "com.google.devtools.ksp", version.ref = "ksp" } convention-android-library = { id = "convention.android.library", version = "unspecified" } +convention-android-application = { id = "convention.android.application", version = "unspecified" } [libraries] #------------------------- From 098889e9d9c9efbe32037d38054a14b2dff8a956 Mon Sep 17 00:00:00 2001 From: Roman Levinzon Date: Tue, 28 Nov 2023 11:34:07 +0100 Subject: [PATCH 42/48] style: apply spotless --- .../java/com/monstarlab/features/auth/data/api/AuthApi.kt | 2 +- .../features/auth/data/api/dtos/TokenResponseDTO.kt | 2 +- .../java/com/monstarlab/features/auth/injection/ApiModule.kt | 2 +- .../monstarlab/features/login/domain/usecase/LoginUseCase.kt | 2 +- .../java/com/monstarlab/features/login/ui/LoginContract.kt | 4 ++-- .../java/com/monstarlab/features/login/ui/LoginCoordinator.kt | 4 ++-- .../java/com/monstarlab/features/login/ui/LoginViewModel.kt | 2 +- .../com/monstarlab/features/main/MainActivityViewModel.kt | 2 +- .../features/resources/data/api/dtos/ResourceDTO.kt | 2 +- .../features/resources/data/api/dtos/ResourcesResponseDTO.kt | 2 +- .../resources/data/persistence/ResourcePreferenceStore.kt | 2 +- .../resources/data/repository/ResourceRepositoryImpl.kt | 2 +- .../monstarlab/features/resources/domain/model/Resource.kt | 2 +- .../features/resources/domain/usecase/GetResourcesUseCase.kt | 2 +- .../com/monstarlab/features/resources/injection/ApiModule.kt | 2 +- .../com/monstarlab/features/resources/ui/ResourcesContract.kt | 4 ++-- .../monstarlab/features/resources/ui/ResourcesCoordinator.kt | 4 ++-- .../monstarlab/features/resources/ui/ResourcesViewModel.kt | 2 +- .../com/monstarlab/features/user/data/api/dtos/UserDTO.kt | 2 +- .../monstarlab/features/user/data/api/dtos/UserResponseDTO.kt | 2 +- .../features/user/data/persistence/UserPreferenceStore.kt | 2 +- .../features/user/data/repository/UserRepositoryImpl.kt | 2 +- .../java/com/monstarlab/features/user/domain/model/User.kt | 2 +- .../java/com/monstarlab/features/user/injection/ApiModule.kt | 2 +- .../kotlin/com/monstarlab/convention/extensions/Extensions.kt | 2 +- .../main/java/com/monstarlab/core/network/NetworkConfig.kt | 2 +- .../src/main/java/com/monstarlab/core/network/OkHttpModule.kt | 4 ++-- .../core/network/errorhandling/ApiErrorInterceptor.kt | 2 +- .../com/monstarlab/core/network/errorhandling/ApiException.kt | 2 +- .../monstarlab/core/persistence/SharedPreferenceDataStore.kt | 2 +- .../core/persistence/SingleSharedPreferenceDataStore.kt | 2 +- core/src/main/java/com/monstarlab/core/ui/ComposeFragment.kt | 2 +- .../com/monstarlab/core/ui/extensions/LazyLayoutExtensions.kt | 4 ++-- .../com/monstarlab/core/ui/layout/ColumnWithSeparators.kt | 2 +- .../main/java/com/monstarlab/designsystem/theme/AppTheme.kt | 2 +- .../monstarlab/designsystem/theme/dimensions/Dimensions.kt | 2 +- .../monstarlab/designsystem/theme/typography/AppTypography.kt | 2 +- .../designsystem/theme/typography/AppTypographyProvider.kt | 2 +- 38 files changed, 44 insertions(+), 44 deletions(-) diff --git a/app/src/main/java/com/monstarlab/features/auth/data/api/AuthApi.kt b/app/src/main/java/com/monstarlab/features/auth/data/api/AuthApi.kt index d9cd9a8c..c10726b4 100644 --- a/app/src/main/java/com/monstarlab/features/auth/data/api/AuthApi.kt +++ b/app/src/main/java/com/monstarlab/features/auth/data/api/AuthApi.kt @@ -11,6 +11,6 @@ interface AuthApi { @POST("login") suspend fun postLogin( @Field("email") email: String, - @Field("password") password: String + @Field("password") password: String, ): TokenResponseDTO } diff --git a/app/src/main/java/com/monstarlab/features/auth/data/api/dtos/TokenResponseDTO.kt b/app/src/main/java/com/monstarlab/features/auth/data/api/dtos/TokenResponseDTO.kt index fa4e15c7..c748233a 100644 --- a/app/src/main/java/com/monstarlab/features/auth/data/api/dtos/TokenResponseDTO.kt +++ b/app/src/main/java/com/monstarlab/features/auth/data/api/dtos/TokenResponseDTO.kt @@ -5,7 +5,7 @@ import kotlinx.serialization.Serializable @Serializable data class TokenResponseDTO( - val token: String + val token: String, ) fun TokenResponseDTO.toAuthToken() = AuthToken(token) diff --git a/app/src/main/java/com/monstarlab/features/auth/injection/ApiModule.kt b/app/src/main/java/com/monstarlab/features/auth/injection/ApiModule.kt index e339fe1b..bcb3d853 100644 --- a/app/src/main/java/com/monstarlab/features/auth/injection/ApiModule.kt +++ b/app/src/main/java/com/monstarlab/features/auth/injection/ApiModule.kt @@ -5,8 +5,8 @@ import dagger.Module import dagger.Provides import dagger.hilt.InstallIn import dagger.hilt.components.SingletonComponent -import javax.inject.Singleton import retrofit2.Retrofit +import javax.inject.Singleton @Module @InstallIn(SingletonComponent::class) diff --git a/app/src/main/java/com/monstarlab/features/login/domain/usecase/LoginUseCase.kt b/app/src/main/java/com/monstarlab/features/login/domain/usecase/LoginUseCase.kt index 6e91ea6e..f5ca85f9 100644 --- a/app/src/main/java/com/monstarlab/features/login/domain/usecase/LoginUseCase.kt +++ b/app/src/main/java/com/monstarlab/features/login/domain/usecase/LoginUseCase.kt @@ -7,7 +7,7 @@ import javax.inject.Inject class LoginUseCase @Inject constructor( private val authRepository: AuthRepository, - private val userRepository: UserRepository + private val userRepository: UserRepository, ) { suspend operator fun invoke(email: String, password: String) = suspendRunCatching { diff --git a/app/src/main/java/com/monstarlab/features/login/ui/LoginContract.kt b/app/src/main/java/com/monstarlab/features/login/ui/LoginContract.kt index b6698570..7898a362 100644 --- a/app/src/main/java/com/monstarlab/features/login/ui/LoginContract.kt +++ b/app/src/main/java/com/monstarlab/features/login/ui/LoginContract.kt @@ -11,7 +11,7 @@ data class LoginState( val isLoading: Boolean = false, val error: ErrorModel? = null, val loginButtonEnabled: Boolean = false, - val isLoggedIn: Boolean = false + val isLoggedIn: Boolean = false, ) /** @@ -21,5 +21,5 @@ data class LoginState( data class LoginActions( val onPasswordChange: (String) -> Unit = {}, val onEmailChange: (String) -> Unit = {}, - val onLoginClick: () -> Unit = {} + val onLoginClick: () -> Unit = {}, ) diff --git a/app/src/main/java/com/monstarlab/features/login/ui/LoginCoordinator.kt b/app/src/main/java/com/monstarlab/features/login/ui/LoginCoordinator.kt index f0656361..d6218dfb 100644 --- a/app/src/main/java/com/monstarlab/features/login/ui/LoginCoordinator.kt +++ b/app/src/main/java/com/monstarlab/features/login/ui/LoginCoordinator.kt @@ -18,7 +18,7 @@ import kotlinx.coroutines.flow.onEach class LoginCoordinator( val viewModel: LoginViewModel, val navController: NavController, - val scope: CoroutineScope + val scope: CoroutineScope, ) { val screenStateFlow = viewModel.stateFlow @@ -40,7 +40,7 @@ class LoginCoordinator( fun rememberLoginCoordinator( viewModel: LoginViewModel, navController: NavController, - scope: CoroutineScope = rememberCoroutineScope() + scope: CoroutineScope = rememberCoroutineScope(), ): LoginCoordinator { return remember(viewModel, navController, scope) { LoginCoordinator( diff --git a/app/src/main/java/com/monstarlab/features/login/ui/LoginViewModel.kt b/app/src/main/java/com/monstarlab/features/login/ui/LoginViewModel.kt index 49d10450..fcaa338a 100644 --- a/app/src/main/java/com/monstarlab/features/login/ui/LoginViewModel.kt +++ b/app/src/main/java/com/monstarlab/features/login/ui/LoginViewModel.kt @@ -14,7 +14,7 @@ import kotlinx.coroutines.launch @HiltViewModel class LoginViewModel @Inject constructor( - private val loginUseCase: LoginUseCase + private val loginUseCase: LoginUseCase, ) : ViewModel() { private val _stateFlow: MutableStateFlow = MutableStateFlow(LoginState()) diff --git a/app/src/main/java/com/monstarlab/features/main/MainActivityViewModel.kt b/app/src/main/java/com/monstarlab/features/main/MainActivityViewModel.kt index 0aa5d3c7..def13e15 100644 --- a/app/src/main/java/com/monstarlab/features/main/MainActivityViewModel.kt +++ b/app/src/main/java/com/monstarlab/features/main/MainActivityViewModel.kt @@ -12,7 +12,7 @@ import kotlinx.coroutines.launch @HiltViewModel class MainActivityViewModel @Inject constructor( - private val setupNstackUseCase: SetupNstackUseCase + private val setupNstackUseCase: SetupNstackUseCase, ) : ViewModel() { private val _stateFlow = MutableStateFlow(MainActivityState()) diff --git a/app/src/main/java/com/monstarlab/features/resources/data/api/dtos/ResourceDTO.kt b/app/src/main/java/com/monstarlab/features/resources/data/api/dtos/ResourceDTO.kt index ce7834f2..7393812c 100644 --- a/app/src/main/java/com/monstarlab/features/resources/data/api/dtos/ResourceDTO.kt +++ b/app/src/main/java/com/monstarlab/features/resources/data/api/dtos/ResourceDTO.kt @@ -11,7 +11,7 @@ data class ResourceDTO( val year: Int, val color: String, @SerialName("pantone_value") - val pantoneValue: String + val pantoneValue: String, ) fun ResourceDTO.toResource(): Resource { diff --git a/app/src/main/java/com/monstarlab/features/resources/data/api/dtos/ResourcesResponseDTO.kt b/app/src/main/java/com/monstarlab/features/resources/data/api/dtos/ResourcesResponseDTO.kt index 7d897ae6..d9f27aa4 100644 --- a/app/src/main/java/com/monstarlab/features/resources/data/api/dtos/ResourcesResponseDTO.kt +++ b/app/src/main/java/com/monstarlab/features/resources/data/api/dtos/ResourcesResponseDTO.kt @@ -11,5 +11,5 @@ data class ResourcesResponseDTO( val total: Int, @SerialName("total_pages") val totalPages: Int, - val data: List + val data: List, ) diff --git a/app/src/main/java/com/monstarlab/features/resources/data/persistence/ResourcePreferenceStore.kt b/app/src/main/java/com/monstarlab/features/resources/data/persistence/ResourcePreferenceStore.kt index 9c192344..0e98e451 100644 --- a/app/src/main/java/com/monstarlab/features/resources/data/persistence/ResourcePreferenceStore.kt +++ b/app/src/main/java/com/monstarlab/features/resources/data/persistence/ResourcePreferenceStore.kt @@ -7,5 +7,5 @@ import com.monstarlab.features.resources.domain.model.Resource import javax.inject.Inject class ResourcePreferenceStore @Inject constructor( - dataStore: DataStore + dataStore: DataStore, ) : SharedPreferenceDataStore(dataStore, Resource.serializer()) diff --git a/app/src/main/java/com/monstarlab/features/resources/data/repository/ResourceRepositoryImpl.kt b/app/src/main/java/com/monstarlab/features/resources/data/repository/ResourceRepositoryImpl.kt index 11d01909..25dfb7c4 100644 --- a/app/src/main/java/com/monstarlab/features/resources/data/repository/ResourceRepositoryImpl.kt +++ b/app/src/main/java/com/monstarlab/features/resources/data/repository/ResourceRepositoryImpl.kt @@ -9,7 +9,7 @@ import javax.inject.Inject class ResourceRepositoryImpl @Inject constructor( private val api: ResourcesApi, - private val resourcePreferenceStore: ResourcePreferenceStore + private val resourcePreferenceStore: ResourcePreferenceStore, ) : ResourceRepository { override suspend fun get(): List { diff --git a/app/src/main/java/com/monstarlab/features/resources/domain/model/Resource.kt b/app/src/main/java/com/monstarlab/features/resources/domain/model/Resource.kt index 45f6f304..9a23c554 100644 --- a/app/src/main/java/com/monstarlab/features/resources/domain/model/Resource.kt +++ b/app/src/main/java/com/monstarlab/features/resources/domain/model/Resource.kt @@ -8,7 +8,7 @@ data class Resource( val name: String, val year: Int, val color: String, - val pantoneValue: String + val pantoneValue: String, ) { companion object { val Mock = Resource(0, "Cyberpunk", 2077, "#f2e900", "") diff --git a/app/src/main/java/com/monstarlab/features/resources/domain/usecase/GetResourcesUseCase.kt b/app/src/main/java/com/monstarlab/features/resources/domain/usecase/GetResourcesUseCase.kt index 9c803eeb..f2345144 100644 --- a/app/src/main/java/com/monstarlab/features/resources/domain/usecase/GetResourcesUseCase.kt +++ b/app/src/main/java/com/monstarlab/features/resources/domain/usecase/GetResourcesUseCase.kt @@ -6,7 +6,7 @@ import javax.inject.Inject import kotlinx.coroutines.delay class GetResourcesUseCase @Inject constructor( - private val resourceRepository: ResourceRepository + private val resourceRepository: ResourceRepository, ) { suspend operator fun invoke() = suspendRunCatching { diff --git a/app/src/main/java/com/monstarlab/features/resources/injection/ApiModule.kt b/app/src/main/java/com/monstarlab/features/resources/injection/ApiModule.kt index 78d3639e..3b594de2 100644 --- a/app/src/main/java/com/monstarlab/features/resources/injection/ApiModule.kt +++ b/app/src/main/java/com/monstarlab/features/resources/injection/ApiModule.kt @@ -5,8 +5,8 @@ import dagger.Module import dagger.Provides import dagger.hilt.InstallIn import dagger.hilt.components.SingletonComponent -import javax.inject.Singleton import retrofit2.Retrofit +import javax.inject.Singleton @Module @InstallIn(SingletonComponent::class) diff --git a/app/src/main/java/com/monstarlab/features/resources/ui/ResourcesContract.kt b/app/src/main/java/com/monstarlab/features/resources/ui/ResourcesContract.kt index db452b3a..97654fd0 100644 --- a/app/src/main/java/com/monstarlab/features/resources/ui/ResourcesContract.kt +++ b/app/src/main/java/com/monstarlab/features/resources/ui/ResourcesContract.kt @@ -9,7 +9,7 @@ import com.monstarlab.features.resources.domain.model.Resource data class ResourcesState( val isLoading: Boolean = false, val resources: List = emptyList(), - val error: ErrorModel? = null + val error: ErrorModel? = null, ) /** @@ -17,5 +17,5 @@ data class ResourcesState( * passed to the coordinator to handle **/ data class ResourcesActions( - val onResourceClick: (Resource) -> Unit = {} + val onResourceClick: (Resource) -> Unit = {}, ) diff --git a/app/src/main/java/com/monstarlab/features/resources/ui/ResourcesCoordinator.kt b/app/src/main/java/com/monstarlab/features/resources/ui/ResourcesCoordinator.kt index 7b0f24b9..7388b4ec 100644 --- a/app/src/main/java/com/monstarlab/features/resources/ui/ResourcesCoordinator.kt +++ b/app/src/main/java/com/monstarlab/features/resources/ui/ResourcesCoordinator.kt @@ -13,7 +13,7 @@ import com.monstarlab.features.resources.domain.model.Resource */ class ResourcesCoordinator( val viewModel: ResourcesViewModel, - val context: Context + val context: Context, ) { val screenStateFlow = viewModel.stateFlow @@ -25,7 +25,7 @@ class ResourcesCoordinator( @Composable fun rememberResourcesCoordinator( viewModel: ResourcesViewModel, - context: Context = LocalContext.current + context: Context = LocalContext.current, ): ResourcesCoordinator { return remember(viewModel, context) { ResourcesCoordinator( diff --git a/app/src/main/java/com/monstarlab/features/resources/ui/ResourcesViewModel.kt b/app/src/main/java/com/monstarlab/features/resources/ui/ResourcesViewModel.kt index ac63cc41..619dd4b5 100644 --- a/app/src/main/java/com/monstarlab/features/resources/ui/ResourcesViewModel.kt +++ b/app/src/main/java/com/monstarlab/features/resources/ui/ResourcesViewModel.kt @@ -14,7 +14,7 @@ import kotlinx.coroutines.launch @HiltViewModel class ResourcesViewModel @Inject constructor( - private val getResourcesUseCase: GetResourcesUseCase + private val getResourcesUseCase: GetResourcesUseCase, ) : ViewModel() { private val _stateFlow: MutableStateFlow = MutableStateFlow(ResourcesState()) diff --git a/app/src/main/java/com/monstarlab/features/user/data/api/dtos/UserDTO.kt b/app/src/main/java/com/monstarlab/features/user/data/api/dtos/UserDTO.kt index b3d52099..67d644ef 100644 --- a/app/src/main/java/com/monstarlab/features/user/data/api/dtos/UserDTO.kt +++ b/app/src/main/java/com/monstarlab/features/user/data/api/dtos/UserDTO.kt @@ -12,7 +12,7 @@ data class UserDTO( val firstName: String, @SerialName("last_name") val lastName: String, - val avatar: String + val avatar: String, ) fun UserDTO.toUser(): User { diff --git a/app/src/main/java/com/monstarlab/features/user/data/api/dtos/UserResponseDTO.kt b/app/src/main/java/com/monstarlab/features/user/data/api/dtos/UserResponseDTO.kt index 21d6c026..083a5f81 100644 --- a/app/src/main/java/com/monstarlab/features/user/data/api/dtos/UserResponseDTO.kt +++ b/app/src/main/java/com/monstarlab/features/user/data/api/dtos/UserResponseDTO.kt @@ -4,5 +4,5 @@ import kotlinx.serialization.Serializable @Serializable data class UserResponseDTO( - val data: UserDTO + val data: UserDTO, ) diff --git a/app/src/main/java/com/monstarlab/features/user/data/persistence/UserPreferenceStore.kt b/app/src/main/java/com/monstarlab/features/user/data/persistence/UserPreferenceStore.kt index f4a29a95..bdf3291b 100644 --- a/app/src/main/java/com/monstarlab/features/user/data/persistence/UserPreferenceStore.kt +++ b/app/src/main/java/com/monstarlab/features/user/data/persistence/UserPreferenceStore.kt @@ -7,5 +7,5 @@ import com.monstarlab.features.user.domain.model.User import javax.inject.Inject class UserPreferenceStore @Inject constructor( - dataStore: DataStore + dataStore: DataStore, ) : SingleSharedPreferenceDataStore(dataStore, User.serializer()) diff --git a/app/src/main/java/com/monstarlab/features/user/data/repository/UserRepositoryImpl.kt b/app/src/main/java/com/monstarlab/features/user/data/repository/UserRepositoryImpl.kt index 7a4dc276..2cd41c4a 100644 --- a/app/src/main/java/com/monstarlab/features/user/data/repository/UserRepositoryImpl.kt +++ b/app/src/main/java/com/monstarlab/features/user/data/repository/UserRepositoryImpl.kt @@ -9,7 +9,7 @@ import javax.inject.Inject class UserRepositoryImpl @Inject constructor( private val api: UsersApi, - private val userPreferenceStore: UserPreferenceStore + private val userPreferenceStore: UserPreferenceStore, ) : UserRepository { override suspend fun get(): User { diff --git a/app/src/main/java/com/monstarlab/features/user/domain/model/User.kt b/app/src/main/java/com/monstarlab/features/user/domain/model/User.kt index f11e626a..9d673fa1 100644 --- a/app/src/main/java/com/monstarlab/features/user/domain/model/User.kt +++ b/app/src/main/java/com/monstarlab/features/user/domain/model/User.kt @@ -7,5 +7,5 @@ data class User( val email: String, val firstName: String, val lastName: String, - val avatar: String + val avatar: String, ) diff --git a/app/src/main/java/com/monstarlab/features/user/injection/ApiModule.kt b/app/src/main/java/com/monstarlab/features/user/injection/ApiModule.kt index 1184d62c..7e151c27 100644 --- a/app/src/main/java/com/monstarlab/features/user/injection/ApiModule.kt +++ b/app/src/main/java/com/monstarlab/features/user/injection/ApiModule.kt @@ -5,8 +5,8 @@ import dagger.Module import dagger.Provides import dagger.hilt.InstallIn import dagger.hilt.components.SingletonComponent -import javax.inject.Singleton import retrofit2.Retrofit +import javax.inject.Singleton @Module @InstallIn(SingletonComponent::class) diff --git a/build-logic/convention/src/main/kotlin/com/monstarlab/convention/extensions/Extensions.kt b/build-logic/convention/src/main/kotlin/com/monstarlab/convention/extensions/Extensions.kt index ade2c541..52516c4c 100644 --- a/build-logic/convention/src/main/kotlin/com/monstarlab/convention/extensions/Extensions.kt +++ b/build-logic/convention/src/main/kotlin/com/monstarlab/convention/extensions/Extensions.kt @@ -6,5 +6,5 @@ import org.gradle.api.artifacts.VersionCatalogsExtension import org.gradle.kotlin.dsl.getByType -val Project.libs: VersionCatalog get() = +internal val Project.libs: VersionCatalog get() = extensions.getByType().named("libs") \ No newline at end of file diff --git a/core/src/main/java/com/monstarlab/core/network/NetworkConfig.kt b/core/src/main/java/com/monstarlab/core/network/NetworkConfig.kt index eae0ca49..eb46e732 100644 --- a/core/src/main/java/com/monstarlab/core/network/NetworkConfig.kt +++ b/core/src/main/java/com/monstarlab/core/network/NetworkConfig.kt @@ -1,5 +1,5 @@ package com.monstarlab.core.network data class NetworkConfig( - val baseUrl: String + val baseUrl: String, ) diff --git a/core/src/main/java/com/monstarlab/core/network/OkHttpModule.kt b/core/src/main/java/com/monstarlab/core/network/OkHttpModule.kt index 1e8dce53..16de0c57 100644 --- a/core/src/main/java/com/monstarlab/core/network/OkHttpModule.kt +++ b/core/src/main/java/com/monstarlab/core/network/OkHttpModule.kt @@ -10,14 +10,14 @@ import dagger.Provides import dagger.hilt.InstallIn import dagger.hilt.android.qualifiers.ApplicationContext import dagger.hilt.components.SingletonComponent -import kotlinx.serialization.ExperimentalSerializationApi -import kotlinx.serialization.json.Json import okhttp3.MediaType.Companion.toMediaType import okhttp3.OkHttpClient import okhttp3.logging.HttpLoggingInterceptor import retrofit2.Retrofit import java.util.concurrent.TimeUnit import javax.inject.Singleton +import kotlinx.serialization.ExperimentalSerializationApi +import kotlinx.serialization.json.Json @InstallIn(SingletonComponent::class) @Module diff --git a/core/src/main/java/com/monstarlab/core/network/errorhandling/ApiErrorInterceptor.kt b/core/src/main/java/com/monstarlab/core/network/errorhandling/ApiErrorInterceptor.kt index 16af9fe6..217d29d8 100644 --- a/core/src/main/java/com/monstarlab/core/network/errorhandling/ApiErrorInterceptor.kt +++ b/core/src/main/java/com/monstarlab/core/network/errorhandling/ApiErrorInterceptor.kt @@ -1,12 +1,12 @@ package com.monstarlab.core.network.errorhandling -import kotlinx.serialization.json.Json import okhttp3.Interceptor import okhttp3.MediaType.Companion.toMediaType import okhttp3.Response import okhttp3.ResponseBody.Companion.toResponseBody import timber.log.Timber import javax.inject.Inject +import kotlinx.serialization.json.Json /** * Intercepts API errors and converts them into [ApiException] by decoding the Error response body diff --git a/core/src/main/java/com/monstarlab/core/network/errorhandling/ApiException.kt b/core/src/main/java/com/monstarlab/core/network/errorhandling/ApiException.kt index e2dd0ba1..14dabd3d 100644 --- a/core/src/main/java/com/monstarlab/core/network/errorhandling/ApiException.kt +++ b/core/src/main/java/com/monstarlab/core/network/errorhandling/ApiException.kt @@ -9,5 +9,5 @@ import java.io.IOException */ data class ApiException( val code: Int, - val displayableMessage: String + val displayableMessage: String, ) : IOException(displayableMessage) diff --git a/core/src/main/java/com/monstarlab/core/persistence/SharedPreferenceDataStore.kt b/core/src/main/java/com/monstarlab/core/persistence/SharedPreferenceDataStore.kt index 0385ffbf..22834d64 100644 --- a/core/src/main/java/com/monstarlab/core/persistence/SharedPreferenceDataStore.kt +++ b/core/src/main/java/com/monstarlab/core/persistence/SharedPreferenceDataStore.kt @@ -13,7 +13,7 @@ import kotlinx.serialization.json.Json abstract class SharedPreferenceDataStore( private val dataStore: DataStore, - private val serializer: KSerializer + private val serializer: KSerializer, ) : DataSource { private val key = stringPreferencesKey(this.javaClass.simpleName) diff --git a/core/src/main/java/com/monstarlab/core/persistence/SingleSharedPreferenceDataStore.kt b/core/src/main/java/com/monstarlab/core/persistence/SingleSharedPreferenceDataStore.kt index eb7bfde6..fe4780ce 100644 --- a/core/src/main/java/com/monstarlab/core/persistence/SingleSharedPreferenceDataStore.kt +++ b/core/src/main/java/com/monstarlab/core/persistence/SingleSharedPreferenceDataStore.kt @@ -13,7 +13,7 @@ import kotlinx.serialization.json.Json abstract class SingleSharedPreferenceDataStore( private val dataStore: DataStore, - private val serializer: KSerializer + private val serializer: KSerializer, ) : SingleDataSource { private val key = stringPreferencesKey(this.javaClass.simpleName) diff --git a/core/src/main/java/com/monstarlab/core/ui/ComposeFragment.kt b/core/src/main/java/com/monstarlab/core/ui/ComposeFragment.kt index a710ac82..25c2247f 100644 --- a/core/src/main/java/com/monstarlab/core/ui/ComposeFragment.kt +++ b/core/src/main/java/com/monstarlab/core/ui/ComposeFragment.kt @@ -16,7 +16,7 @@ abstract class ComposeFragment : Fragment() { override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle? + savedInstanceState: Bundle?, ): View? { return ComposeView(requireContext()).apply { setContent { diff --git a/core/src/main/java/com/monstarlab/core/ui/extensions/LazyLayoutExtensions.kt b/core/src/main/java/com/monstarlab/core/ui/extensions/LazyLayoutExtensions.kt index 7e8b4626..59471014 100644 --- a/core/src/main/java/com/monstarlab/core/ui/extensions/LazyLayoutExtensions.kt +++ b/core/src/main/java/com/monstarlab/core/ui/extensions/LazyLayoutExtensions.kt @@ -17,7 +17,7 @@ fun LazyListScope.animatedVisibilityItem( visible: Boolean, enter: EnterTransition = fadeIn() + expandIn(), exit: ExitTransition = fadeOut() + shrinkOut(), - content: @Composable () -> Unit + content: @Composable () -> Unit, ) { item( key = key, @@ -39,7 +39,7 @@ fun LazyListScope.animatedVisibilityHeader( modifier: Modifier = Modifier, enter: EnterTransition = fadeIn() + expandIn(), exit: ExitTransition = fadeOut() + shrinkOut(), - content: @Composable () -> Unit + content: @Composable () -> Unit, ) { stickyHeader( key = key, diff --git a/core/src/main/java/com/monstarlab/core/ui/layout/ColumnWithSeparators.kt b/core/src/main/java/com/monstarlab/core/ui/layout/ColumnWithSeparators.kt index f570bcf0..ca08b191 100644 --- a/core/src/main/java/com/monstarlab/core/ui/layout/ColumnWithSeparators.kt +++ b/core/src/main/java/com/monstarlab/core/ui/layout/ColumnWithSeparators.kt @@ -10,7 +10,7 @@ import androidx.compose.ui.tooling.preview.Preview fun ColumnWithSeparators( modifier: Modifier = Modifier, separator: @Composable () -> Unit = {}, - content: @Composable () -> Unit + content: @Composable () -> Unit, ) { SubcomposeLayout(modifier) { constraints -> val contentsMesuarebles = subcompose("content", content) diff --git a/designsystem/src/main/java/com/monstarlab/designsystem/theme/AppTheme.kt b/designsystem/src/main/java/com/monstarlab/designsystem/theme/AppTheme.kt index 285b6a1a..78a7498b 100644 --- a/designsystem/src/main/java/com/monstarlab/designsystem/theme/AppTheme.kt +++ b/designsystem/src/main/java/com/monstarlab/designsystem/theme/AppTheme.kt @@ -24,7 +24,7 @@ import com.monstarlab.designsystem.theme.typography.Typography fun AppTheme( isDarkMode: Boolean = isSystemInDarkTheme(), isSmallDevice: Boolean = isSmallDevice(), - content: @Composable () -> Unit + content: @Composable () -> Unit, ) { val dimensions = if (isSmallDevice) Dimensions.Small else Dimensions.Default ProvideDimensions(dimensions = dimensions) { diff --git a/designsystem/src/main/java/com/monstarlab/designsystem/theme/dimensions/Dimensions.kt b/designsystem/src/main/java/com/monstarlab/designsystem/theme/dimensions/Dimensions.kt index 970e2d34..169ade2d 100644 --- a/designsystem/src/main/java/com/monstarlab/designsystem/theme/dimensions/Dimensions.kt +++ b/designsystem/src/main/java/com/monstarlab/designsystem/theme/dimensions/Dimensions.kt @@ -12,7 +12,7 @@ class Dimensions( val medium2: Dp, val medium3: Dp, val big1: Dp, - val big2: Dp + val big2: Dp, ) { companion object { val Small = Dimensions( diff --git a/designsystem/src/main/java/com/monstarlab/designsystem/theme/typography/AppTypography.kt b/designsystem/src/main/java/com/monstarlab/designsystem/theme/typography/AppTypography.kt index 88924ad8..37f022ba 100644 --- a/designsystem/src/main/java/com/monstarlab/designsystem/theme/typography/AppTypography.kt +++ b/designsystem/src/main/java/com/monstarlab/designsystem/theme/typography/AppTypography.kt @@ -15,7 +15,7 @@ data class AppTypography( val headline2: TextStyle, val body1: TextStyle, val body2: TextStyle, - val button: TextStyle + val button: TextStyle, ) { constructor(typography: Typography) : this( diff --git a/designsystem/src/main/java/com/monstarlab/designsystem/theme/typography/AppTypographyProvider.kt b/designsystem/src/main/java/com/monstarlab/designsystem/theme/typography/AppTypographyProvider.kt index a551e3b6..32249b93 100644 --- a/designsystem/src/main/java/com/monstarlab/designsystem/theme/typography/AppTypographyProvider.kt +++ b/designsystem/src/main/java/com/monstarlab/designsystem/theme/typography/AppTypographyProvider.kt @@ -11,7 +11,7 @@ val LocalAppTypography = staticCompositionLocalOf { @Composable fun ProvideAppTypography( typography: AppTypography = AppTypography(Typography), - content: @Composable () -> Unit = {} + content: @Composable () -> Unit = {}, ) { CompositionLocalProvider(LocalAppTypography provides typography) { content.invoke() From b763676b47daeb83c93386258e44c9ee6c34654a Mon Sep 17 00:00:00 2001 From: Roman Levinzon Date: Tue, 28 Nov 2023 13:20:59 +0100 Subject: [PATCH 43/48] feat: add BuildConfiguration --- .../buildconfig/AppBuildConfiguration.kt | 27 +++++++++++++++++++ .../buildconfig/BuildConfigurationModule.kt | 17 ++++++++++++ .../com/monstarlab/injection/AppModule.kt | 19 ------------- .../com/monstarlab/core/config/AppFlavour.kt | 7 +++++ .../com/monstarlab/core/config/AppVersion.kt | 10 +++++++ .../core/config/BuildConfiguration.kt | 7 +++++ .../core/{network => config}/NetworkConfig.kt | 2 +- .../monstarlab/core/network/OkHttpModule.kt | 5 ++-- 8 files changed, 72 insertions(+), 22 deletions(-) create mode 100644 app/src/main/java/com/monstarlab/features/buildconfig/AppBuildConfiguration.kt create mode 100644 app/src/main/java/com/monstarlab/features/buildconfig/BuildConfigurationModule.kt delete mode 100644 app/src/main/java/com/monstarlab/injection/AppModule.kt create mode 100644 core/src/main/java/com/monstarlab/core/config/AppFlavour.kt create mode 100644 core/src/main/java/com/monstarlab/core/config/AppVersion.kt create mode 100644 core/src/main/java/com/monstarlab/core/config/BuildConfiguration.kt rename core/src/main/java/com/monstarlab/core/{network => config}/NetworkConfig.kt (60%) diff --git a/app/src/main/java/com/monstarlab/features/buildconfig/AppBuildConfiguration.kt b/app/src/main/java/com/monstarlab/features/buildconfig/AppBuildConfiguration.kt new file mode 100644 index 00000000..98145be0 --- /dev/null +++ b/app/src/main/java/com/monstarlab/features/buildconfig/AppBuildConfiguration.kt @@ -0,0 +1,27 @@ +package com.monstarlab.features.buildconfig + +import com.monstarlab.BuildConfig +import com.monstarlab.core.config.AppFlavour +import com.monstarlab.core.config.AppVersion +import com.monstarlab.core.config.BuildConfiguration +import com.monstarlab.core.config.NetworkConfig +import javax.inject.Inject + +class AppBuildConfiguration @Inject constructor() : BuildConfiguration { + override val flavour: AppFlavour + get() { + return when (BuildConfig.FLAVOR) { + "development" -> AppFlavour.Development + "staging" -> AppFlavour.Staging + "production" -> AppFlavour.Production + else -> throw IllegalStateException( + "Flavour ${BuildConfig.FLAVOR} is not supported", + ) + } + } + override val version: AppVersion = AppVersion( + versionName = BuildConfig.VERSION_NAME, + buildNumber = BuildConfig.VERSION_CODE, + ) + override val networkConfig: NetworkConfig = NetworkConfig(BuildConfig.API_URL) +} diff --git a/app/src/main/java/com/monstarlab/features/buildconfig/BuildConfigurationModule.kt b/app/src/main/java/com/monstarlab/features/buildconfig/BuildConfigurationModule.kt new file mode 100644 index 00000000..01469d00 --- /dev/null +++ b/app/src/main/java/com/monstarlab/features/buildconfig/BuildConfigurationModule.kt @@ -0,0 +1,17 @@ +package com.monstarlab.features.buildconfig + +import com.monstarlab.core.config.BuildConfiguration +import dagger.Binds +import dagger.Module +import dagger.hilt.InstallIn +import dagger.hilt.components.SingletonComponent +import javax.inject.Singleton + +@Module +@InstallIn(SingletonComponent::class) +interface BuildConfigurationModule { + + @Binds + @Singleton + fun bindBuildConfiguration(appBuildConfiguration: AppBuildConfiguration): BuildConfiguration +} diff --git a/app/src/main/java/com/monstarlab/injection/AppModule.kt b/app/src/main/java/com/monstarlab/injection/AppModule.kt deleted file mode 100644 index 806a98fe..00000000 --- a/app/src/main/java/com/monstarlab/injection/AppModule.kt +++ /dev/null @@ -1,19 +0,0 @@ -package com.monstarlab.injection - -import com.monstarlab.BuildConfig -import com.monstarlab.core.network.NetworkConfig -import dagger.Module -import dagger.Provides -import dagger.hilt.InstallIn -import dagger.hilt.components.SingletonComponent -import javax.inject.Singleton - -@InstallIn(SingletonComponent::class) -@Module -class AppModule { - @Provides - @Singleton - fun provideBaseUrl(): NetworkConfig { - return NetworkConfig(BuildConfig.API_URL) - } -} diff --git a/core/src/main/java/com/monstarlab/core/config/AppFlavour.kt b/core/src/main/java/com/monstarlab/core/config/AppFlavour.kt new file mode 100644 index 00000000..b5d12e4c --- /dev/null +++ b/core/src/main/java/com/monstarlab/core/config/AppFlavour.kt @@ -0,0 +1,7 @@ +package com.monstarlab.core.config + +enum class AppFlavour { + Development, + Staging, + Production, +} diff --git a/core/src/main/java/com/monstarlab/core/config/AppVersion.kt b/core/src/main/java/com/monstarlab/core/config/AppVersion.kt new file mode 100644 index 00000000..1be80e8a --- /dev/null +++ b/core/src/main/java/com/monstarlab/core/config/AppVersion.kt @@ -0,0 +1,10 @@ +package com.monstarlab.core.config + +data class AppVersion( + val versionName: String, + val buildNumber: Int, +) { + override fun toString(): String { + return "$versionName ($buildNumber)" + } +} diff --git a/core/src/main/java/com/monstarlab/core/config/BuildConfiguration.kt b/core/src/main/java/com/monstarlab/core/config/BuildConfiguration.kt new file mode 100644 index 00000000..2c6d8d1f --- /dev/null +++ b/core/src/main/java/com/monstarlab/core/config/BuildConfiguration.kt @@ -0,0 +1,7 @@ +package com.monstarlab.core.config + +interface BuildConfiguration { + val flavour: AppFlavour + val version: AppVersion + val networkConfig: NetworkConfig +} diff --git a/core/src/main/java/com/monstarlab/core/network/NetworkConfig.kt b/core/src/main/java/com/monstarlab/core/config/NetworkConfig.kt similarity index 60% rename from core/src/main/java/com/monstarlab/core/network/NetworkConfig.kt rename to core/src/main/java/com/monstarlab/core/config/NetworkConfig.kt index eb46e732..20ab62ae 100644 --- a/core/src/main/java/com/monstarlab/core/network/NetworkConfig.kt +++ b/core/src/main/java/com/monstarlab/core/config/NetworkConfig.kt @@ -1,4 +1,4 @@ -package com.monstarlab.core.network +package com.monstarlab.core.config data class NetworkConfig( val baseUrl: String, diff --git a/core/src/main/java/com/monstarlab/core/network/OkHttpModule.kt b/core/src/main/java/com/monstarlab/core/network/OkHttpModule.kt index 16de0c57..bd918bcb 100644 --- a/core/src/main/java/com/monstarlab/core/network/OkHttpModule.kt +++ b/core/src/main/java/com/monstarlab/core/network/OkHttpModule.kt @@ -4,6 +4,7 @@ import android.content.Context import com.chuckerteam.chucker.api.ChuckerInterceptor import com.jakewharton.retrofit2.converter.kotlinx.serialization.asConverterFactory import com.monstarlab.core.BuildConfig +import com.monstarlab.core.config.BuildConfiguration import com.monstarlab.core.network.errorhandling.ApiErrorInterceptor import dagger.Module import dagger.Provides @@ -47,10 +48,10 @@ class OkHttpModule { @ExperimentalSerializationApi @Provides @Singleton - fun provideRetrofit(client: OkHttpClient, networkConfig: NetworkConfig): Retrofit { + fun provideRetrofit(client: OkHttpClient, buildConfiguration: BuildConfiguration): Retrofit { return Retrofit.Builder() .client(client) - .baseUrl(networkConfig.baseUrl) + .baseUrl(buildConfiguration.networkConfig.baseUrl) .addConverterFactory( json.asConverterFactory("application/json".toMediaType()), ) From 39cd96da19a8e6fb4f819f21bb468bea1d948903 Mon Sep 17 00:00:00 2001 From: Roman Levinzon Date: Tue, 28 Nov 2023 14:25:12 +0100 Subject: [PATCH 44/48] docs: update README --- README.md | 34 ++++++------------ docs/DESIGN_SYSTEM.md | 84 ------------------------------------------- docs/assets/arch.svg | 1 - resources/arch.svg | 1 + resources/moduels.svg | 1 + 5 files changed, 12 insertions(+), 109 deletions(-) delete mode 100644 docs/DESIGN_SYSTEM.md delete mode 100644 docs/assets/arch.svg create mode 100644 resources/arch.svg create mode 100644 resources/moduels.svg diff --git a/README.md b/README.md index 70d4d631..972ea4ee 100644 --- a/README.md +++ b/README.md @@ -49,35 +49,21 @@ After installing, creating new features in the correct template structure should -## Project Structure -Android template project has three top-level packages: `core`, `designsystem` and `features`. Overall package structure looks like following -- `core` - - `extensions` - - `injection` - - `network` - - `persistence` - - `ui` -- `designsystem` - - `components` - - `theme` -- `features` - - `nstack` - - `feature1` - - `data` - - `domain` - - `injection` - - `ui` - -### `core` package +## Project Structure & Modules +Android template project has a modular structure and has following: `:core`, `:designsystem` and `:app`. The `:core` and `:designsystem` modules represent shared modules that are most likely gonna be used by multiple features. This + + + +### `core` module Core package is meant to be Domain-agnostic. It means that it should never reference anything project specific. Instead, it serves as a home for components that can be part of any project. This includes extensions on Kotlin Classes, Utility classes, Base classes, Compose layouts and Compose Effects and Modifiers that are behavioural rather then UI emitting -### `designsystem` package +### `designsystem` module The design system package contains the building blocks for your application's UI. The main thing you will find here is `Theme`. This template is using custom `Theme` provider for Jetpack Compose while having `Material Theme` as its foundation. This allows to tweak `Colors` and `Typography` so it reflects actual Design System that is used on the project and supply custom properties like `Dimensions` -Another part of the design system are components. Examples of `designsystem` components are Buttons, TopBars, TextFields and so on. The template provides `AppButton` `AppTextField` and `AppTopBar` that you can modify and tweak and use throughout the project. [Learn more about design system here](./docs/DESIGN_SYSTEM.md) +Another part of the design system are components. Examples of `designsystem` components are Buttons, TopBars, TextFields and so on. The template provides `AppButton` `AppTextField` and `AppTopBar` that you can modify and tweak and use throughout the project. [Learn more about design system here](resources/DESIGN_SYSTEM.md) -### `features` package +### `app` module Features package contains the most important part of any project. A Feature typically contains all the necessary code(and resources + assets if migrated to multi module) required to implement a specific application functionality, such as a login screen, shopping cart, or authentication. It may also have its own sets of dependencies, like third-party libraries or other features. [Each feature is following Clean Architecture Principles and has a three-layer split](#architecture) @@ -95,7 +81,7 @@ The domain layer contains the application's business logic. This layer should on The data layer is where the actual interactions happen between different data sources. This layer “implements” parts of the Domain layer and communicates with the APIs, Databases, and other services and SDKs. -![](/docs/assets/arch.svg) +![](/resources/arch.svg) ## Flavors diff --git a/docs/DESIGN_SYSTEM.md b/docs/DESIGN_SYSTEM.md deleted file mode 100644 index 3e7de7a4..00000000 --- a/docs/DESIGN_SYSTEM.md +++ /dev/null @@ -1,84 +0,0 @@ -# Design System - -A design system is a comprehensive set of design elements, principles, and guidelines that provide a framework for defining and governing the overall visual and user interface (UI) design of a product or service. In software development, particularly in mobile app development, a design system typically includes a library of standardized UI components, themes, and styles that serve as the building blocks for creating consistent and cohesive UI screens. - - Essentially, a design system represents the implementation of the design decisions made by designers, translated into code, and applied throughout the entire product or service. - - - - - -## Approach - -In most cases, the very default design system on Android implements Material Design. That's how get our basic look for the Buttons, Top Bars, and behavior components like Bottom Sheets. While it is easy to use and modify, in most scenarios the Design System we, as developers, have to implement will be very different. It can have more colors, more text styles, and overall be very far from the Material Design APIs. - -As it doesn’t make much sense to implement a completely custom design system, the designsystem in the template serves as a bridge between Material Design and the specific Design System we have to implement. This is done by having custom Typography, Colors, and Dimensions classes that ultimately get translated into Material Design. This provides the following benefits: - -- Our colors and typography don't need to follow Material Guidelines. We can more or fewer colors depending on the actual design, and different typography - -- We can have custom properties hooked up with the Theme, which the normal Material Design System doesn’t provide, for example, Dimensions - -- We can still use components from the Material Theme, like Buttons, top bars, Cards, and Surfaces. And, given the custom colors, fonts were translated properly (for example custom cardBackgroundColor will be translated into surface color in material) they will work out of the box - - - -## Structure - -Currently, the structure of the design system is following - -- `designsystem` - - `components` - ui components, some may have separate packages - - `theme` - contains theme-related information - - `colors` - Colors that define design-system - - `typograpy` - Text styles that define design-system - - `AppTheme.kt ` - -Develops are free to add additional packages if they want to - -## Best practices - -### Components - -- **Generic and Distinct Naming**. Implement re-usable design system components in the Design system and make the name of these components. Since Material has its own Buttons and TopBars, the name of your components should be unique enough so you don't confuse the imports. For example AppButton , AppTopBar - -- **Make the API of your components as small and concise as possible.** Material components are very flexible and they all support Slot APIs, for example, you can put any @Composable into `material.Button` content property. This is great, but in most cases, all you need for such a button is a simple text as String. - -```kotlin -// GOOD -@Composable -fun AppButton( - text: String, - onClick: () -> Unit, - modifier: Modifier = Modifier, - enabled: Boolean = true, - isLoading: Boolean = false, - type: AppButtonType = AppButtonType.Filled, - -) -``` - - -- **Don’t reference your Domain.** The design system should not know about your domain models or render something specific to the features. They should stay as generic and reusable as possible. That goes both for the Component name and its implementation - -- **Extract complex components away from the features.** In case you have a custom component for some feature (fx some fancy-looking Slider), move all its complexity to one of the shared modules/packages (design system or core.ui) and make it generic. - - - -### Colors and Typography - -- **Expand and/or Shrink the AppTypography and AppColors to suit your needs.** Make it mirror the actual design system you are working with and then convert it to Material where it's possible. - -- **Don't hardcode colors.** While colors can be very tempting to hardcode always try to see if this color can fit into your design system somehow. Maybe its the same background color but with different alpha? - -- **Use generic color names, not actual colors.** Use names like background primary and error instead of actual colors like White Blue and Red. This will make it easy to adapt your design system and use different Theme types, like Dark Mode, or in case the app will go through White-labeling - -- **Don’t hardcode text styles.** This is mainly a concern for the properties that involve numbers: letterSpacing , fontSize lineHeight and etc. Always use your design system typography to reference that. On the other hand, making text bold is Ok . - -```kotlin -// OK -val headline3 = Theme.typography.headline3 -val headline3Bold = Theme.typography.headline3.copy(fontWeight = FontWeight.Bold) - -// Not ok -val body2 = Theme.typography.body1.copy(fontSize = 12.sp) -``` \ No newline at end of file diff --git a/docs/assets/arch.svg b/docs/assets/arch.svg deleted file mode 100644 index 52ac5766..00000000 --- a/docs/assets/arch.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/resources/arch.svg b/resources/arch.svg new file mode 100644 index 00000000..a66ab16d --- /dev/null +++ b/resources/arch.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/resources/moduels.svg b/resources/moduels.svg new file mode 100644 index 00000000..75391e5b --- /dev/null +++ b/resources/moduels.svg @@ -0,0 +1 @@ + \ No newline at end of file From 90f95ddbb52ec1278fc3f47768570d30af46cab3 Mon Sep 17 00:00:00 2001 From: Roman Levinzon Date: Tue, 28 Nov 2023 14:34:07 +0100 Subject: [PATCH 45/48] docs: update README --- README.md | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 972ea4ee..997c2f93 100644 --- a/README.md +++ b/README.md @@ -50,23 +50,27 @@ After installing, creating new features in the correct template structure should ## Project Structure & Modules -Android template project has a modular structure and has following: `:core`, `:designsystem` and `:app`. The `:core` and `:designsystem` modules represent shared modules that are most likely gonna be used by multiple features. This - +Android template project has a modular structure and has following mopdules: `:core`, `:designsystem` and `:app`. The intention is to make this template as flexible as possible by introducing shared modules while having the all the features reside in `:app` module. In case project grows, this allows to easily decouple features from `:app` module and/or introduce new features as part of separate module. +![](./resources/moduels.svg) ### `core` module -Core package is meant to be Domain-agnostic. It means that it should never reference anything project specific. Instead, it serves as a home for components that can be part of any project. This includes extensions on Kotlin Classes, Utility classes, Base classes, Compose layouts and Compose Effects and Modifiers that are behavioural rather then UI emitting +Core module is meant to be Domain-agnostic. It means that it should never reference anything project specific. Instead, it serves as a home for components that can be part of any project. This includes extensions on Kotlin Classes, Utility classes, Base classes, Compose layouts and Compose Effects and Modifiers that are behavioural rather then UI emitting + ### `designsystem` module -The design system package contains the building blocks for your application's UI. The main thing you will find here is `Theme`. This template is using custom `Theme` provider for Jetpack Compose while having `Material Theme` as its foundation. This allows to tweak `Colors` and `Typography` so it reflects actual Design System that is used on the project and supply custom properties like `Dimensions` +The design system module contains the building blocks for your application's UI. The main thing you will find here is `Theme`. This template is using custom `Theme` provider for Jetpack Compose while having `Material Theme` as its foundation. This allows to tweak `Colors` and `Typography` so it reflects actual Design System that is used on the project and supply custom properties like `Dimensions` -Another part of the design system are components. Examples of `designsystem` components are Buttons, TopBars, TextFields and so on. The template provides `AppButton` `AppTextField` and `AppTopBar` that you can modify and tweak and use throughout the project. [Learn more about design system here](resources/DESIGN_SYSTEM.md) +Another part of the design system are components. Examples of `designsystem` components are Buttons, TopBars, TextFields and so on. The template provides `AppButton` `AppTextField` and `AppTopBar` that you can modify and tweak and use throughout the project. ### `app` module -Features package contains the most important part of any project. A Feature typically contains all the necessary code(and resources + assets if migrated to multi module) required to implement a specific application functionality, such as a login screen, shopping cart, or authentication. It may also have its own sets of dependencies, like third-party libraries or other features. [Each feature is following Clean Architecture Principles and has a three-layer split](#architecture) +This is a main modules that contains feature packages - the meat of any project. A Feature typically contains all the necessary code, resources and assets required to implement a specific application functionality, such as a login screen, shopping cart, or authentication. It may also have its own sets of dependencies, like third-party libraries or other features. +#### Feature modules +While the template doesn't really have feature modules and every feature is part of the `:app` module, it is adviced to make use of feature modules in case the you see there is good candidate for it. It will especially benefit mid to large sized projects under active development + Each feature (module or not) is following [Clean Architecture Principles and has a three-layer split](#architecture) ## Architecture Template implements [Clean Architecture](https://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html) and follows [best practices](https://developer.android.com/topic/architecture) provided by Google with some tweaks here and there From 05167e44c920ebccb4ba3d89494ba8b35c6bbec9 Mon Sep 17 00:00:00 2001 From: Roman Levinzon Date: Tue, 28 Nov 2023 14:38:51 +0100 Subject: [PATCH 46/48] refactor: rename corotuines related package in core --- .../features/nstack/domain/usecase/SetupNstackUseCase.kt | 2 +- .../core/{injection => coroutines}/CoroutineQualifiers.kt | 2 +- .../core/{injection => coroutines}/CoroutinesModule.kt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) rename core/src/main/java/com/monstarlab/core/{injection => coroutines}/CoroutineQualifiers.kt (90%) rename core/src/main/java/com/monstarlab/core/{injection => coroutines}/CoroutinesModule.kt (95%) diff --git a/app/src/main/java/com/monstarlab/features/nstack/domain/usecase/SetupNstackUseCase.kt b/app/src/main/java/com/monstarlab/features/nstack/domain/usecase/SetupNstackUseCase.kt index 75e7874a..79a1fd0b 100644 --- a/app/src/main/java/com/monstarlab/features/nstack/domain/usecase/SetupNstackUseCase.kt +++ b/app/src/main/java/com/monstarlab/features/nstack/domain/usecase/SetupNstackUseCase.kt @@ -1,7 +1,7 @@ package com.monstarlab.features.nstack.domain.usecase import com.monstarlab.core.extensions.suspendRunCatching -import com.monstarlab.core.injection.IoDispatcher +import com.monstarlab.core.coroutines.IoDispatcher import dk.nodes.nstack.kotlin.NStack import dk.nodes.nstack.kotlin.models.AppOpenData import javax.inject.Inject diff --git a/core/src/main/java/com/monstarlab/core/injection/CoroutineQualifiers.kt b/core/src/main/java/com/monstarlab/core/coroutines/CoroutineQualifiers.kt similarity index 90% rename from core/src/main/java/com/monstarlab/core/injection/CoroutineQualifiers.kt rename to core/src/main/java/com/monstarlab/core/coroutines/CoroutineQualifiers.kt index 1663a36a..4e9fa079 100644 --- a/core/src/main/java/com/monstarlab/core/injection/CoroutineQualifiers.kt +++ b/core/src/main/java/com/monstarlab/core/coroutines/CoroutineQualifiers.kt @@ -1,4 +1,4 @@ -package com.monstarlab.core.injection +package com.monstarlab.core.coroutines import javax.inject.Qualifier diff --git a/core/src/main/java/com/monstarlab/core/injection/CoroutinesModule.kt b/core/src/main/java/com/monstarlab/core/coroutines/CoroutinesModule.kt similarity index 95% rename from core/src/main/java/com/monstarlab/core/injection/CoroutinesModule.kt rename to core/src/main/java/com/monstarlab/core/coroutines/CoroutinesModule.kt index 76fb89d6..a1fb8701 100644 --- a/core/src/main/java/com/monstarlab/core/injection/CoroutinesModule.kt +++ b/core/src/main/java/com/monstarlab/core/coroutines/CoroutinesModule.kt @@ -1,4 +1,4 @@ -package com.monstarlab.core.injection +package com.monstarlab.core.coroutines import dagger.Module import dagger.Provides From a4abfa3671f200d0d63365b50ac2d94ba9879969 Mon Sep 17 00:00:00 2001 From: Roman Levinzon Date: Tue, 28 Nov 2023 15:05:11 +0100 Subject: [PATCH 47/48] style: apply spotless --- .../features/nstack/domain/usecase/SetupNstackUseCase.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/monstarlab/features/nstack/domain/usecase/SetupNstackUseCase.kt b/app/src/main/java/com/monstarlab/features/nstack/domain/usecase/SetupNstackUseCase.kt index 79a1fd0b..fcb4d31f 100644 --- a/app/src/main/java/com/monstarlab/features/nstack/domain/usecase/SetupNstackUseCase.kt +++ b/app/src/main/java/com/monstarlab/features/nstack/domain/usecase/SetupNstackUseCase.kt @@ -1,7 +1,7 @@ package com.monstarlab.features.nstack.domain.usecase -import com.monstarlab.core.extensions.suspendRunCatching import com.monstarlab.core.coroutines.IoDispatcher +import com.monstarlab.core.extensions.suspendRunCatching import dk.nodes.nstack.kotlin.NStack import dk.nodes.nstack.kotlin.models.AppOpenData import javax.inject.Inject From 215b45fc92f2ba6aca15cd76893a07cdc8161c81 Mon Sep 17 00:00:00 2001 From: Roman Levinzon Date: Tue, 28 Nov 2023 15:21:51 +0100 Subject: [PATCH 48/48] build: update dependencies kotlin 1.9.20, compose BOM, agp --- .../errorhandling/ApiErrorInterceptor.kt | 6 ++--- gradle/libs.versions.toml | 24 +++++++++---------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/core/src/main/java/com/monstarlab/core/network/errorhandling/ApiErrorInterceptor.kt b/core/src/main/java/com/monstarlab/core/network/errorhandling/ApiErrorInterceptor.kt index 217d29d8..b921caee 100644 --- a/core/src/main/java/com/monstarlab/core/network/errorhandling/ApiErrorInterceptor.kt +++ b/core/src/main/java/com/monstarlab/core/network/errorhandling/ApiErrorInterceptor.kt @@ -24,15 +24,15 @@ class ApiErrorInterceptor @Inject constructor( if (response.isSuccessful) { return response } - val errorBody = response.body.string() + val errorBody = response.body?.string() val errorDtoResult = runCatching { - json.decodeFromString(errorBody) + json.decodeFromString(checkNotNull(errorBody)) } if (errorDtoResult.isSuccess) { throw errorDtoResult.getOrThrow().toApiError(response.code) } else { - val newErrorBody = errorBody.toResponseBody("application/json".toMediaType()) + val newErrorBody = errorBody?.toResponseBody("application/json".toMediaType()) Timber.e("Failed to deserialize error body: ${errorDtoResult.exceptionOrNull()}") return response.newBuilder().body(newErrorBody).build() } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 5b9a17bc..a1f7e9f7 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,22 +1,22 @@ [versions] nstack = "3.2.9" -kotlin = "1.9.10" +kotlin = "1.9.20" ksp = "1.9.10-1.0.13" kotlin_coroutines = "1.7.3" retrofit = "2.9.0" -okhttp = "5.0.0-alpha.10" -compose_bom = "2023.09.00" -compose_compiler = "1.5.3" +okhttp = "4.12.0" +compose_bom = "2023.10.01" +compose_compiler = "1.5.4" hilt = "2.48" lifecycle = "2.6.2" -navigation = "2.7.2" +navigation = "2.7.5" datastore = "1.0.0" google_accompanist = "0.32.0" androidx_appcompat = "1.6.1" androidx_core = "1.9.0" -android_gradle = "8.1.1" +android_gradle = "8.1.4" chucker = "4.0.0" -mockk = "1.13.7" +mockk = "1.13.8" [plugins] spotless = { id = "com.diffplug.spotless", version = "6.22.0" } @@ -44,12 +44,12 @@ kotlin_serialization_json = "org.jetbrains.kotlinx:kotlinx-serialization-json:1. # Android #------------------------- android_gradle_plugin = { module = "com.android.tools.build:gradle", version.ref = "android_gradle" } -android_fragment = { module = "androidx.fragment:fragment-ktx", version = "1.6.1" } -android_material = { group = "com.google.android.material", name = "material", version = "1.9.0" } +android_fragment = { module = "androidx.fragment:fragment-ktx", version = "1.6.2" } +android_material = { group = "com.google.android.material", name = "material", version = "1.10.0" } android_contraintlayout = { group = "androidx.constraintlayout", name = "constraintlayout", version = "2.1.4" } android_appcompat = { group = "androidx.appcompat", name = "appcompat", version.ref = "androidx-appcompat" } android_core = { group = "androidx.core", name = "core-ktx", version.ref = "androidx-core" } -android_activity_compose = { module = "androidx.activity:activity-compose", version = "1.7.2" } +android_activity_compose = { module = "androidx.activity:activity-compose", version = "1.8.1" } android_splash = { module = "androidx.core:core-splashscreen", version = "1.0.1"} #------------------------- # Android - Lifecycle @@ -60,7 +60,7 @@ android_lifecycle_common = { module = "androidx.lifecycle:lifecycle-common-java8 android_lifecycle_viewmodel = { module = "androidx.lifecycle:lifecycle-viewmodel-ktx", version.ref = "lifecycle" } android_lifecycle_livedata = { module = "androidx.lifecycle:lifecycle-livedata-ktx", version.ref = "lifecycle" } android_lifecycle_viewmodel_compose = { module = "androidx.lifecycle:lifecycle-viewmodel-compose", version.ref = "lifecycle" } -android_lifecycle_runtime_compose = { group = "androidx.lifecycle", name = "lifecycle-runtime-compose", version = "2.7.0-alpha01" } +android_lifecycle_runtime_compose = { group = "androidx.lifecycle", name = "lifecycle-runtime-compose", version = "2.7.0-rc01" } #------------------------- # Android - Hilt #------------------------- @@ -81,7 +81,7 @@ android_compose_animation = { module = "androidx.compose.foundation:foundation" android_compose_runtime = { module = "androidx.compose.runtime:runtime-livedata" } android_compose_ui_test = { module = "androidx.compose.ui:ui-test-junit4" } android_compose_ui_test_manifest = { module = "androidx.compose.ui:ui-test-manifest" } -android_compose_material_windowsize = "androidx.compose.material3:material3-window-size-class:1.1.1" +android_compose_material_windowsize = "androidx.compose.material3:material3-window-size-class:1.1.2" #------------------------- # Android - Navigation #-------------------------