From 7023e57abc41a0ed312d9b8dc3fa4687904cffd9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?D=C6=B0=C6=A1ng=20Th=C3=A1i=20Minh?= <73929358+hide-your-code@users.noreply.github.com> Date: Fri, 7 Jul 2023 02:39:48 +0700 Subject: [PATCH] [v1.0.4] Update some versions for new Android Studio Preview's version (#126) --- .github/dependabot.yml | 4 +- .../workflows/check_build_lint_unittest.yaml | 6 + .github/workflows/dependabot_ci.yaml | 3 + .../workflows/deploy_to_internal_testing.yaml | 3 + .gitignore | 2 + .idea/deploymentTargetDropDown.xml | 4 +- .idea/kotlinc.xml | 2 +- .idea/misc.xml | 3 +- README.md | 6 + app/build.gradle.kts | 195 +++++++++-------- app/firebase-crashlytics.pro | 3 + .../presentation/component/InfinityText.kt | 6 +- .../component/NavigationDrawerLabel.kt | 1 - .../presentation/component/WeatherScaffold.kt | 1 - .../weapose/presentation/ui/WeatherApp.kt | 3 +- .../presentation/ui/WeatherAppState.kt | 61 +++--- .../ui/home/CurrentWeatherScreen.kt | 2 +- .../ui/infomation/InformationScreen.kt | 1 + .../ui/search/map/SearchByMapScreen.kt | 10 +- .../ui/search/text/SearchByTextScreen.kt | 5 +- .../SevenDaysWeatherScreen.kt | 6 +- .../presentation/ui/splash/SplashScreen.kt | 1 - build.gradle.kts | 15 +- gradle/libs.versions.toml | 199 ++++++++++++++++++ gradle/wrapper/gradle-wrapper.properties | 2 +- settings.gradle.kts | 1 + 26 files changed, 392 insertions(+), 153 deletions(-) create mode 100644 app/firebase-crashlytics.pro create mode 100644 gradle/libs.versions.toml diff --git a/.github/dependabot.yml b/.github/dependabot.yml index fd6b7a7..6451970 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -3,7 +3,7 @@ updates: - package-ecosystem: "github-actions" directory: "/" schedule: - interval: daily + interval: monthly time: "09:00" timezone: "Asia/Ho_Chi_Minh" - package-ecosystem: gradle @@ -11,7 +11,7 @@ updates: reviewers: - "hide-your-code" schedule: - interval: daily + interval: monthly time: "09:00" timezone: "Asia/Ho_Chi_Minh" open-pull-requests-limit: 99 diff --git a/.github/workflows/check_build_lint_unittest.yaml b/.github/workflows/check_build_lint_unittest.yaml index 67345e3..1cf5a79 100644 --- a/.github/workflows/check_build_lint_unittest.yaml +++ b/.github/workflows/check_build_lint_unittest.yaml @@ -24,6 +24,9 @@ jobs: MAPS_API_KEY: ${{ secrets.MAPS_API_KEY }} run: printf "API_KEY=\"$API_KEY\"\nBASE_URL=\"$BASE_URL\"\nMAPS_API_KEY=\"$MAPS_API_KEY\"" > ./local.properties + - name: Setup Android SDK + uses: android-actions/setup-android@v2 + - name: Caching gradle uses: actions/cache@v3 with: @@ -70,6 +73,9 @@ jobs: MAPS_API_KEY: ${{ secrets.MAPS_API_KEY }} run: printf "API_KEY=\"$API_KEY\"\nBASE_URL=\"$BASE_URL\"\nMAPS_API_KEY=\"$MAPS_API_KEY\"" > ./local.properties + - name: Setup Android SDK + uses: android-actions/setup-android@v2 + - name: Caching gradle uses: actions/cache@v3 with: diff --git a/.github/workflows/dependabot_ci.yaml b/.github/workflows/dependabot_ci.yaml index 1bbe25e..2298ad3 100644 --- a/.github/workflows/dependabot_ci.yaml +++ b/.github/workflows/dependabot_ci.yaml @@ -27,6 +27,9 @@ jobs: MAPS_API_KEY: ${{ secrets.MAPS_API_KEY }} run: printf "API_KEY=\"$API_KEY\"\nBASE_URL=\"$BASE_URL\"\nMAPS_API_KEY=\"$MAPS_API_KEY\"" > ./local.properties + - name: Setup Android SDK + uses: android-actions/setup-android@v2 + - name: Caching gradle uses: actions/cache@v3 with: diff --git a/.github/workflows/deploy_to_internal_testing.yaml b/.github/workflows/deploy_to_internal_testing.yaml index 9bc54d4..84b136b 100644 --- a/.github/workflows/deploy_to_internal_testing.yaml +++ b/.github/workflows/deploy_to_internal_testing.yaml @@ -30,6 +30,9 @@ jobs: MAPS_API_KEY: ${{ secrets.MAPS_API_KEY }} run: printf "API_KEY=\"$API_KEY\"\nBASE_URL=\"$BASE_URL\"\nMAPS_API_KEY=\"$MAPS_API_KEY\"" > ./local.properties + - name: Setup Android SDK + uses: android-actions/setup-android@v2 + - name: Caching gradle uses: actions/cache@v3 with: diff --git a/.gitignore b/.gitignore index f5e396a..cf4cbcf 100644 --- a/.gitignore +++ b/.gitignore @@ -14,3 +14,5 @@ .cxx local.properties /reports + +/app/google-services.json diff --git a/.idea/deploymentTargetDropDown.xml b/.idea/deploymentTargetDropDown.xml index 5123a39..3f2a854 100644 --- a/.idea/deploymentTargetDropDown.xml +++ b/.idea/deploymentTargetDropDown.xml @@ -7,11 +7,11 @@ - + - + \ No newline at end of file diff --git a/.idea/kotlinc.xml b/.idea/kotlinc.xml index 2b8a50f..69e8615 100644 --- a/.idea/kotlinc.xml +++ b/.idea/kotlinc.xml @@ -1,6 +1,6 @@ - \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index 60ffdae..a2061bf 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,4 +1,3 @@ - - + diff --git a/README.md b/README.md index d39f92f..86ddf2d 100644 --- a/README.md +++ b/README.md @@ -11,6 +11,12 @@ This app is inspired by: I want to say thanks for those people to help me to make this app. +## :construction: In progress + +I'm trying to implement **Version Catalog** for new Gradle's version but the **Dependabot** doesn't support it ([seeing this](https://github.com/dependabot/dependabot-core/pull/6249)). + +You can check out from `v1.0.4/version_catalog` to see what I done. + ## :tada: Ready on Google Play Now, you can download it on Google Play Store. Install it and give me your feedback! diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 65ec651..025da60 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -5,11 +5,15 @@ import java.util.Properties plugins { id("com.android.application") id("org.jetbrains.kotlin.android") - kotlin("kapt") + // Implemented later because we had an exception when we were trying to run tests. +// id("com.google.devtools.ksp") id("dagger.hilt.android.plugin") id("com.google.android.libraries.mapsplatform.secrets-gradle-plugin") - id("org.jetbrains.kotlinx.kover") version "0.6.1" - id("io.gitlab.arturbosch.detekt") version "1.22.0" + id("org.jetbrains.kotlinx.kover") version "0.7.0-Beta" + id("io.gitlab.arturbosch.detekt") version "1.23.0-RC3" + id("com.google.firebase.crashlytics") + id("com.google.gms.google-services") + id("org.jetbrains.kotlin.kapt") } val properties = Properties().apply { @@ -17,19 +21,10 @@ val properties = Properties().apply { } project.afterEvaluate { - tasks.koverHtmlReport { - group = "kover" - description = "Generated test coverage" - - dependsOn("testDebugUnitTest") - - isEnabled = true - } - detekt { - toolVersion = "1.22.0" + toolVersion = "1.23.0-RC3" basePath = "$rootDir" - config = files("$rootDir/config/detekt/detekt_config.yml") + config.setFrom(files("$rootDir/config/detekt/detekt_config.yml")) buildUponDefaultConfig = true } @@ -44,25 +39,34 @@ project.afterEvaluate { } kover { - htmlReport { - reportDir.set(layout.buildDirectory.dir("kover_report/html_result")) - filters { - classes { - includes += listOf("com.minhdtm.example.weapose.*") - - excludes += listOf( - "*Screen*", - "*_Factory*", - "*_HiltModules*", - "*di*", - "*_Impl*", - "*BuildConfig*", - "*Activity*", - "*App*", - "*Drawer*", - "*Graph*", - "*.theme*", - ) + useKoverTool() +} + +koverReport { + androidReports("debug") { + html { + setReportDir(layout.buildDirectory.dir("kover_report/html_result")) + + filters { + excludes { + classes( + "*Screen*", + "*_Factory*", + "*_HiltModules*", + "*di*", + "*_Impl*", + "*BuildConfig*", + "*Activity*", + "*App*", + "*Drawer*", + "*Graph*", + "*.theme*", + ) + } + + includes { + classes("com.minhdtm.example.weapose.*") + } } } } @@ -70,12 +74,12 @@ kover { android { namespace = "com.minhdtm.example.weapose" - compileSdk = 33 + compileSdk = 34 defaultConfig { applicationId = "com.minhdtm.example.weapose" minSdk = 21 - targetSdk = 33 + targetSdk = 34 versionCode = 5 versionName = "1.0.3" @@ -93,7 +97,14 @@ android { buildTypes { getByName("release") { isMinifyEnabled = true - proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro", "retrofit2.pro", "gson.pro", "okhttp3.pro") + proguardFiles( + getDefaultProguardFile("proguard-android-optimize.txt"), + "proguard-rules.pro", + "retrofit2.pro", + "gson.pro", + "okhttp3.pro", + "firebase-crashlytics.pro", + ) signingConfig = signingConfigs.getByName("debug") } } @@ -121,7 +132,7 @@ android { } composeOptions { - kotlinCompilerExtensionVersion = "1.4.0" + kotlinCompilerExtensionVersion = "1.4.6" } packaging { @@ -132,97 +143,103 @@ android { } dependencies { - implementation("androidx.core:core-ktx:1.9.0") - implementation("androidx.activity:activity-compose:1.6.1") + // Core + implementation(libs.androidx.core) + + // Activity + implementation(libs.androidx.activity.compose) // Compose ui - implementation("androidx.compose.ui:ui:1.4.0-alpha05") - implementation("androidx.compose.ui:ui-tooling-preview:1.4.0-alpha05") + implementation(libs.androidx.compose.ui.ui) + implementation(libs.androidx.compose.ui.ui.tooling.preview) // Material - implementation("androidx.compose.material3:material3:1.1.0-alpha05") - implementation("androidx.compose.material:material:1.4.0-alpha05") + implementation(libs.androidx.compose.material.get2()) + implementation(libs.androidx.compose.material.get3()) // Work manager - implementation("androidx.work:work-runtime-ktx:2.8.0-rc01") + implementation(libs.androidx.work) // Google accompanist - implementation("com.google.accompanist:accompanist-navigation-animation:0.28.0") - implementation("com.google.accompanist:accompanist-systemuicontroller:0.28.0") - implementation("com.google.accompanist:accompanist-swiperefresh:0.28.0") - implementation("com.google.accompanist:accompanist-permissions:0.27.0") - implementation("com.google.accompanist:accompanist-flowlayout:0.28.0") + implementation(libs.bundles.google.accompanist) // Google play services - implementation("com.google.android.gms:play-services-location:21.0.1") - implementation("com.google.android.gms:play-services-maps:18.1.0") - implementation("com.google.android.libraries.places:places:3.0.0") - implementation("com.google.maps.android:maps-compose:2.11.2") + implementation(libs.google.play.services.location) + implementation(libs.google.play.services.maps) + implementation(libs.google.places) + implementation(libs.google.maps) + + // Firebase platform + implementation(platform(libs.firebase.bom)) + implementation(libs.bundles.firebase) // Coroutine - implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4") - implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4") + implementation(libs.kotlinx.coroutines.core) + implementation(libs.kotlinx.coroutines.android) // Retrofit - implementation("com.squareup.retrofit2:retrofit:2.9.0") - implementation("com.squareup.retrofit2:converter-gson:2.9.0") + implementation(libs.bundles.retrofit2) // Okhttp - implementation("com.squareup.okhttp3:okhttp:4.10.0") - implementation("com.squareup.okhttp3:logging-interceptor:4.10.0") + implementation(libs.okhttp3) + implementation(libs.okhttp3.logging.interceptor) // Room - implementation("androidx.room:room-runtime:2.5.0") - implementation("androidx.room:room-ktx:2.5.0") - annotationProcessor("androidx.room:room-compiler:2.5.0") - kapt("androidx.room:room-compiler:2.5.0") + implementation(libs.androidx.room.runtime) + implementation(libs.androidx.room.ktx) + annotationProcessor(libs.androidx.room.compiler) + kapt(libs.androidx.room.compiler) // Hilt - implementation("androidx.hilt:hilt-navigation-compose:1.0.0") - implementation("androidx.hilt:hilt-work:1.0.0") - implementation("com.google.dagger:hilt-android:2.45") - kapt("com.google.dagger:hilt-android-compiler:2.45") + implementation(libs.androidx.hilt.navigation.compose) + implementation(libs.androidx.hilt.work) + implementation(libs.google.dagger.hilt.android) + kapt(libs.google.dagger.hilt.android.compiler) // Navigation - implementation("androidx.navigation:navigation-compose:2.5.3") + implementation(libs.androidx.navigation) // Lifecycle - implementation("androidx.lifecycle:lifecycle-runtime-compose:2.6.0-alpha05") - implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.6.0-alpha05") + implementation(libs.androidx.lifecycle.runtime.compose) + implementation(libs.androidx.lifecycle.runtime.ktx) // ViewModel - implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.0-alpha05") - implementation("androidx.lifecycle:lifecycle-viewmodel-compose:2.6.0-alpha05") + implementation(libs.androidx.lifecycle.viewmodel.compose) + implementation(libs.androidx.lifecycle.viewmodel.ktx) // LiveData - implementation("androidx.compose.runtime:runtime-livedata:1.4.0-alpha04") + implementation(libs.androidx.livedata) // Gson - implementation("com.google.code.gson:gson:2.10.1") + implementation(libs.google.gson) // Timber - implementation("com.jakewharton.timber:timber:5.0.1") + implementation(libs.timber) // DataStore - implementation("androidx.datastore:datastore-preferences:1.0.0") - - // Kotlin reflect - implementation("org.jetbrains.kotlin:kotlin-reflect:1.8.10") + implementation(libs.androidx.datastore.preferences) // Lottie - implementation("com.airbnb.android:lottie-compose:6.0.0") + implementation(libs.lottie) + + // Junit + testImplementation(libs.junit.get4()) + + // Kotlin reflect + testImplementation(libs.kotlin.reflect) - testImplementation("junit:junit:4.13.2") - testImplementation("org.jetbrains.kotlinx:kotlinx-coroutines-test:1.6.4") + // Coroutines test + testImplementation(libs.kotlinx.coroutines.test) // MockK - testImplementation("io.mockk:mockk:1.13.4") - testImplementation("io.mockk:mockk-agent-jvm:1.13.4") + testImplementation(libs.mockk) + testImplementation(libs.mockk.agent.jvm) - androidTestImplementation("androidx.test.ext:junit:1.1.5") - androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1") - androidTestImplementation("androidx.compose.ui:ui-test-junit4:1.3.3") + androidTestImplementation(libs.androidx.test.junit) + androidTestImplementation(libs.androidx.test.espresso) + androidTestImplementation(libs.androidx.compose.ui.ui.test.junit) - debugImplementation("androidx.compose.ui:ui-tooling:1.4.0-alpha05") - debugImplementation("androidx.compose.ui:ui-test-manifest:1.4.0-alpha05") + // UI Debugging + debugImplementation(libs.androidx.compose.ui.ui.tooling) + debugImplementation(libs.androidx.compose.ui.ui.test.manifest) } diff --git a/app/firebase-crashlytics.pro b/app/firebase-crashlytics.pro new file mode 100644 index 0000000..df863db --- /dev/null +++ b/app/firebase-crashlytics.pro @@ -0,0 +1,3 @@ +-keepattributes SourceFile,LineNumberTable +-keep public class * extends java.lang.Throwable +-keep public class * extends com.minhdtm.example.weapose.data.exception.ResponseException diff --git a/app/src/main/java/com/minhdtm/example/weapose/presentation/component/InfinityText.kt b/app/src/main/java/com/minhdtm/example/weapose/presentation/component/InfinityText.kt index 975a128..d95f2df 100644 --- a/app/src/main/java/com/minhdtm/example/weapose/presentation/component/InfinityText.kt +++ b/app/src/main/java/com/minhdtm/example/weapose/presentation/component/InfinityText.kt @@ -48,8 +48,12 @@ fun InfinityText( modifier = modifier, targetState = text, transitionSpec = { - slideInVertically { height -> -height } + fadeIn() with slideOutVertically { height -> height } + fadeOut() + val fadeInAndFadeOut = slideInVertically { height -> -height } + fadeIn() with slideOutVertically { height -> height } + fadeOut() + fadeInAndFadeOut.using( + SizeTransform(clip = false) + ) }, + label = "", ) { targetState -> content.invoke(targetState) } diff --git a/app/src/main/java/com/minhdtm/example/weapose/presentation/component/NavigationDrawerLabel.kt b/app/src/main/java/com/minhdtm/example/weapose/presentation/component/NavigationDrawerLabel.kt index 1f7dce4..b51b028 100644 --- a/app/src/main/java/com/minhdtm/example/weapose/presentation/component/NavigationDrawerLabel.kt +++ b/app/src/main/java/com/minhdtm/example/weapose/presentation/component/NavigationDrawerLabel.kt @@ -8,7 +8,6 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp -@OptIn(ExperimentalMaterial3Api::class) @Composable fun NavigationDrawerLabel( modifier: Modifier = Modifier, diff --git a/app/src/main/java/com/minhdtm/example/weapose/presentation/component/WeatherScaffold.kt b/app/src/main/java/com/minhdtm/example/weapose/presentation/component/WeatherScaffold.kt index d693a12..1394a2d 100644 --- a/app/src/main/java/com/minhdtm/example/weapose/presentation/component/WeatherScaffold.kt +++ b/app/src/main/java/com/minhdtm/example/weapose/presentation/component/WeatherScaffold.kt @@ -8,7 +8,6 @@ import androidx.compose.ui.graphics.Color import com.minhdtm.example.weapose.domain.enums.ActionType import com.minhdtm.example.weapose.presentation.base.ViewState -@OptIn(ExperimentalMaterial3Api::class) @Composable fun WeatherScaffold( modifier: Modifier = Modifier, diff --git a/app/src/main/java/com/minhdtm/example/weapose/presentation/ui/WeatherApp.kt b/app/src/main/java/com/minhdtm/example/weapose/presentation/ui/WeatherApp.kt index a81d8fe..2f0eaf9 100644 --- a/app/src/main/java/com/minhdtm/example/weapose/presentation/ui/WeatherApp.kt +++ b/app/src/main/java/com/minhdtm/example/weapose/presentation/ui/WeatherApp.kt @@ -29,7 +29,7 @@ import com.minhdtm.example.weapose.presentation.broadcast.LocaleChangeBroadcast import com.minhdtm.example.weapose.presentation.component.NavigationDrawerLabel @SuppressLint("UnusedMaterial3ScaffoldPaddingParameter") -@OptIn(ExperimentalMaterial3Api::class, ExperimentalAnimationApi::class) +@OptIn(ExperimentalAnimationApi::class) @Composable fun WeatherApp(appState: WeatherAppState = rememberWeatherAppState()) { val systemUiController = rememberSystemUiController() @@ -115,7 +115,6 @@ fun WeatherApp(appState: WeatherAppState = rememberWeatherAppState()) { } } -@OptIn(ExperimentalMaterial3Api::class) @Composable fun ColumnScope.WeatherDrawerContent( selectedItem: DrawerTab, diff --git a/app/src/main/java/com/minhdtm/example/weapose/presentation/ui/WeatherAppState.kt b/app/src/main/java/com/minhdtm/example/weapose/presentation/ui/WeatherAppState.kt index 3c56eb3..eeb20ad 100644 --- a/app/src/main/java/com/minhdtm/example/weapose/presentation/ui/WeatherAppState.kt +++ b/app/src/main/java/com/minhdtm/example/weapose/presentation/ui/WeatherAppState.kt @@ -6,7 +6,7 @@ import android.net.Uri import android.provider.Settings import androidx.annotation.DrawableRes import androidx.annotation.StringRes -import androidx.compose.animation.AnimatedContentScope +import androidx.compose.animation.AnimatedContentTransitionScope import androidx.compose.animation.ExperimentalAnimationApi import androidx.compose.animation.core.tween import androidx.compose.material3.* @@ -92,16 +92,16 @@ fun NavGraphBuilder.splash(appState: WeatherAppState) { composable( route = Screen.Splash.route, enterTransition = { - slideIntoContainer(AnimatedContentScope.SlideDirection.Left, animationSpec = tween(700)) + slideIntoContainer(AnimatedContentTransitionScope.SlideDirection.Left, animationSpec = tween(700)) }, exitTransition = { - slideOutOfContainer(AnimatedContentScope.SlideDirection.Left, animationSpec = tween(700)) + slideOutOfContainer(AnimatedContentTransitionScope.SlideDirection.Left, animationSpec = tween(700)) }, popEnterTransition = { - slideIntoContainer(AnimatedContentScope.SlideDirection.Right, animationSpec = tween(700)) + slideIntoContainer(AnimatedContentTransitionScope.SlideDirection.Right, animationSpec = tween(700)) }, popExitTransition = { - slideOutOfContainer(AnimatedContentScope.SlideDirection.Right, animationSpec = tween(700)) + slideOutOfContainer(AnimatedContentTransitionScope.SlideDirection.Right, animationSpec = tween(700)) }, ) { Splash(appState) @@ -118,16 +118,16 @@ fun NavGraphBuilder.home(appState: WeatherAppState) { composable( route = Screen.CurrentWeather.route, enterTransition = { - slideIntoContainer(AnimatedContentScope.SlideDirection.Left, animationSpec = tween(700)) + slideIntoContainer(AnimatedContentTransitionScope.SlideDirection.Left, animationSpec = tween(700)) }, exitTransition = { - slideOutOfContainer(AnimatedContentScope.SlideDirection.Left, animationSpec = tween(700)) + slideOutOfContainer(AnimatedContentTransitionScope.SlideDirection.Left, animationSpec = tween(700)) }, popEnterTransition = { - slideIntoContainer(AnimatedContentScope.SlideDirection.Right, animationSpec = tween(700)) + slideIntoContainer(AnimatedContentTransitionScope.SlideDirection.Right, animationSpec = tween(700)) }, popExitTransition = { - slideOutOfContainer(AnimatedContentScope.SlideDirection.Right, animationSpec = tween(700)) + slideOutOfContainer(AnimatedContentTransitionScope.SlideDirection.Right, animationSpec = tween(700)) }, ) { CurrentWeather( @@ -139,16 +139,16 @@ fun NavGraphBuilder.home(appState: WeatherAppState) { composable( route = Screen.Settings.route, enterTransition = { - slideIntoContainer(AnimatedContentScope.SlideDirection.Left, animationSpec = tween(700)) + slideIntoContainer(AnimatedContentTransitionScope.SlideDirection.Left, animationSpec = tween(700)) }, exitTransition = { - slideOutOfContainer(AnimatedContentScope.SlideDirection.Left, animationSpec = tween(700)) + slideOutOfContainer(AnimatedContentTransitionScope.SlideDirection.Left, animationSpec = tween(700)) }, popEnterTransition = { - slideIntoContainer(AnimatedContentScope.SlideDirection.Right, animationSpec = tween(700)) + slideIntoContainer(AnimatedContentTransitionScope.SlideDirection.Right, animationSpec = tween(700)) }, popExitTransition = { - slideOutOfContainer(AnimatedContentScope.SlideDirection.Right, animationSpec = tween(700)) + slideOutOfContainer(AnimatedContentTransitionScope.SlideDirection.Right, animationSpec = tween(700)) }, ) { Settings( @@ -160,16 +160,16 @@ fun NavGraphBuilder.home(appState: WeatherAppState) { composable( route = Screen.SevenDaysWeather.route, enterTransition = { - slideIntoContainer(AnimatedContentScope.SlideDirection.Left, animationSpec = tween(700)) + slideIntoContainer(AnimatedContentTransitionScope.SlideDirection.Left, animationSpec = tween(700)) }, exitTransition = { - slideOutOfContainer(AnimatedContentScope.SlideDirection.Left, animationSpec = tween(700)) + slideOutOfContainer(AnimatedContentTransitionScope.SlideDirection.Left, animationSpec = tween(700)) }, popEnterTransition = { - slideIntoContainer(AnimatedContentScope.SlideDirection.Right, animationSpec = tween(700)) + slideIntoContainer(AnimatedContentTransitionScope.SlideDirection.Right, animationSpec = tween(700)) }, popExitTransition = { - slideOutOfContainer(AnimatedContentScope.SlideDirection.Right, animationSpec = tween(700)) + slideOutOfContainer(AnimatedContentTransitionScope.SlideDirection.Right, animationSpec = tween(700)) }, ) { SevenDaysWeather( @@ -181,16 +181,16 @@ fun NavGraphBuilder.home(appState: WeatherAppState) { composable( route = Screen.Info.route, enterTransition = { - slideIntoContainer(AnimatedContentScope.SlideDirection.Left, animationSpec = tween(700)) + slideIntoContainer(AnimatedContentTransitionScope.SlideDirection.Left, animationSpec = tween(700)) }, exitTransition = { - slideOutOfContainer(AnimatedContentScope.SlideDirection.Left, animationSpec = tween(700)) + slideOutOfContainer(AnimatedContentTransitionScope.SlideDirection.Left, animationSpec = tween(700)) }, popEnterTransition = { - slideIntoContainer(AnimatedContentScope.SlideDirection.Right, animationSpec = tween(700)) + slideIntoContainer(AnimatedContentTransitionScope.SlideDirection.Right, animationSpec = tween(700)) }, popExitTransition = { - slideOutOfContainer(AnimatedContentScope.SlideDirection.Right, animationSpec = tween(700)) + slideOutOfContainer(AnimatedContentTransitionScope.SlideDirection.Right, animationSpec = tween(700)) }, ) { Information( @@ -207,16 +207,16 @@ fun NavGraphBuilder.home(appState: WeatherAppState) { navArgument(Constants.Key.FROM_ROUTE) { type = NavType.StringType }, ), enterTransition = { - slideIntoContainer(AnimatedContentScope.SlideDirection.Left, animationSpec = tween(700)) + slideIntoContainer(AnimatedContentTransitionScope.SlideDirection.Left, animationSpec = tween(700)) }, exitTransition = { - slideOutOfContainer(AnimatedContentScope.SlideDirection.Left, animationSpec = tween(700)) + slideOutOfContainer(AnimatedContentTransitionScope.SlideDirection.Left, animationSpec = tween(700)) }, popEnterTransition = { - slideIntoContainer(AnimatedContentScope.SlideDirection.Right, animationSpec = tween(700)) + slideIntoContainer(AnimatedContentTransitionScope.SlideDirection.Right, animationSpec = tween(700)) }, popExitTransition = { - slideOutOfContainer(AnimatedContentScope.SlideDirection.Right, animationSpec = tween(700)) + slideOutOfContainer(AnimatedContentTransitionScope.SlideDirection.Right, animationSpec = tween(700)) }, ) { SearchByMap( @@ -233,16 +233,16 @@ fun NavGraphBuilder.home(appState: WeatherAppState) { navArgument(Constants.Key.FROM_ROUTE) { type = NavType.StringType }, ), enterTransition = { - slideIntoContainer(AnimatedContentScope.SlideDirection.Left, animationSpec = tween(700)) + slideIntoContainer(AnimatedContentTransitionScope.SlideDirection.Left, animationSpec = tween(700)) }, exitTransition = { - slideOutOfContainer(AnimatedContentScope.SlideDirection.Left, animationSpec = tween(700)) + slideOutOfContainer(AnimatedContentTransitionScope.SlideDirection.Left, animationSpec = tween(700)) }, popEnterTransition = { - slideIntoContainer(AnimatedContentScope.SlideDirection.Right, animationSpec = tween(700)) + slideIntoContainer(AnimatedContentTransitionScope.SlideDirection.Right, animationSpec = tween(700)) }, popExitTransition = { - slideOutOfContainer(AnimatedContentScope.SlideDirection.Right, animationSpec = tween(700)) + slideOutOfContainer(AnimatedContentTransitionScope.SlideDirection.Right, animationSpec = tween(700)) }, ) { SearchByText( @@ -253,7 +253,7 @@ fun NavGraphBuilder.home(appState: WeatherAppState) { } } -@OptIn(ExperimentalAnimationApi::class, ExperimentalMaterial3Api::class) +@OptIn(ExperimentalAnimationApi::class) @Composable fun rememberWeatherAppState( coroutineScope: CoroutineScope = rememberCoroutineScope(), @@ -264,7 +264,6 @@ fun rememberWeatherAppState( WeatherAppState(coroutineScope, controller, drawer, snackbarHost) } -@OptIn(ExperimentalMaterial3Api::class) class WeatherAppState( private val coroutineScope: CoroutineScope, val controller: NavHostController, diff --git a/app/src/main/java/com/minhdtm/example/weapose/presentation/ui/home/CurrentWeatherScreen.kt b/app/src/main/java/com/minhdtm/example/weapose/presentation/ui/home/CurrentWeatherScreen.kt index ac6991d..000a944 100644 --- a/app/src/main/java/com/minhdtm/example/weapose/presentation/ui/home/CurrentWeatherScreen.kt +++ b/app/src/main/java/com/minhdtm/example/weapose/presentation/ui/home/CurrentWeatherScreen.kt @@ -171,7 +171,7 @@ fun CurrentWeather( ) } -@OptIn(ExperimentalMaterial3Api::class, ExperimentalMaterialApi::class) +@OptIn(ExperimentalMaterialApi::class) @Composable fun CurrentWeatherScreen( state: CurrentWeatherViewState, diff --git a/app/src/main/java/com/minhdtm/example/weapose/presentation/ui/infomation/InformationScreen.kt b/app/src/main/java/com/minhdtm/example/weapose/presentation/ui/infomation/InformationScreen.kt index 17042d0..49daeb8 100644 --- a/app/src/main/java/com/minhdtm/example/weapose/presentation/ui/infomation/InformationScreen.kt +++ b/app/src/main/java/com/minhdtm/example/weapose/presentation/ui/infomation/InformationScreen.kt @@ -12,6 +12,7 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.viewmodel.compose.viewModel import com.minhdtm.example.weapose.presentation.component.WeatherScaffold import com.minhdtm.example.weapose.presentation.ui.WeatherAppState +import kotlinx.coroutines.flow.buffer @Composable fun Information( diff --git a/app/src/main/java/com/minhdtm/example/weapose/presentation/ui/search/map/SearchByMapScreen.kt b/app/src/main/java/com/minhdtm/example/weapose/presentation/ui/search/map/SearchByMapScreen.kt index f05ff38..f913b93 100644 --- a/app/src/main/java/com/minhdtm/example/weapose/presentation/ui/search/map/SearchByMapScreen.kt +++ b/app/src/main/java/com/minhdtm/example/weapose/presentation/ui/search/map/SearchByMapScreen.kt @@ -226,8 +226,7 @@ fun SearchAppBar( onBack: () -> Unit = {}, onChangeModeGoogleMap: () -> Unit = {}, ) { - TopAppBar( - modifier = Modifier.windowInsetsPadding(WindowInsets.statusBars), + TopAppBar(modifier = Modifier.windowInsetsPadding(WindowInsets.statusBars), backgroundColor = Color.Transparent, contentColor = Color.Transparent, elevation = 0.dp, @@ -255,14 +254,15 @@ fun SearchAppBar( targetState = isDarkMode, transitionSpec = { if (!targetState) { // Dark mode - slideInVertically { height -> height } + fadeIn() with slideOutVertically { height -> -height } + fadeOut() + slideInVertically { height -> height } + fadeIn() togetherWith slideOutVertically { height -> -height } + fadeOut() } else { // Light mode - slideInVertically { height -> -height } + fadeIn() with slideOutVertically { height -> height } + fadeOut() + slideInVertically { height -> -height } + fadeIn() togetherWith slideOutVertically { height -> height } + fadeOut() }.using( SizeTransform(clip = false) ) }, - ) { + label = "", + ) { _ -> val icon = rememberSaveable(isDarkMode) { if (isDarkMode) { R.drawable.ic_dark_mode diff --git a/app/src/main/java/com/minhdtm/example/weapose/presentation/ui/search/text/SearchByTextScreen.kt b/app/src/main/java/com/minhdtm/example/weapose/presentation/ui/search/text/SearchByTextScreen.kt index e1297ad..b49b616 100644 --- a/app/src/main/java/com/minhdtm/example/weapose/presentation/ui/search/text/SearchByTextScreen.kt +++ b/app/src/main/java/com/minhdtm/example/weapose/presentation/ui/search/text/SearchByTextScreen.kt @@ -114,7 +114,6 @@ fun SearchByText( ) } -@OptIn(ExperimentalMaterial3Api::class) @Composable fun SearchByTextScreen( state: SearchByTextViewState, @@ -241,7 +240,6 @@ fun EmptyList( } } -@OptIn(ExperimentalMaterial3Api::class) @Composable fun ListHistorySearch( modifier: Modifier = Modifier, @@ -297,7 +295,6 @@ fun ItemResultSearch( } } -@OptIn(ExperimentalMaterial3Api::class) @Composable fun SearchByTextAppBar( modifier: Modifier = Modifier, @@ -317,7 +314,7 @@ fun SearchByTextAppBar( onValueChange = onTextChange, singleLine = true, shape = RoundedCornerShape(30.dp), - colors = TextFieldDefaults.textFieldColors( + colors = TextFieldDefaults.colors( focusedIndicatorColor = Color.Transparent, unfocusedIndicatorColor = Color.Transparent, disabledIndicatorColor = Color.Transparent, diff --git a/app/src/main/java/com/minhdtm/example/weapose/presentation/ui/sevendaysweather/SevenDaysWeatherScreen.kt b/app/src/main/java/com/minhdtm/example/weapose/presentation/ui/sevendaysweather/SevenDaysWeatherScreen.kt index e31dd59..0732918 100644 --- a/app/src/main/java/com/minhdtm/example/weapose/presentation/ui/sevendaysweather/SevenDaysWeatherScreen.kt +++ b/app/src/main/java/com/minhdtm/example/weapose/presentation/ui/sevendaysweather/SevenDaysWeatherScreen.kt @@ -117,7 +117,7 @@ fun SevenDaysWeather( ) } -@OptIn(ExperimentalMaterial3Api::class, ExperimentalMaterialApi::class) +@OptIn(ExperimentalMaterialApi::class) @Composable fun SevenDaysWeatherScreen( state: SevenDaysViewState, @@ -246,9 +246,9 @@ fun WeatherDayItem( transition.AnimatedContent(transitionSpec = { if (!targetState) { - slideInVertically { height -> height } + fadeIn() with slideOutVertically { height -> -height } + fadeOut() + slideInVertically { height -> height } + fadeIn() togetherWith slideOutVertically { height -> -height } + fadeOut() } else { - slideInVertically { height -> -height } + fadeIn() with slideOutVertically { height -> height } + fadeOut() + slideInVertically { height -> -height } + fadeIn() togetherWith slideOutVertically { height -> height } + fadeOut() }.using( SizeTransform(clip = false) ) diff --git a/app/src/main/java/com/minhdtm/example/weapose/presentation/ui/splash/SplashScreen.kt b/app/src/main/java/com/minhdtm/example/weapose/presentation/ui/splash/SplashScreen.kt index 700d5a4..3957e63 100644 --- a/app/src/main/java/com/minhdtm/example/weapose/presentation/ui/splash/SplashScreen.kt +++ b/app/src/main/java/com/minhdtm/example/weapose/presentation/ui/splash/SplashScreen.kt @@ -26,7 +26,6 @@ fun Splash(appState: WeatherAppState) { ) } -@OptIn(ExperimentalMaterial3Api::class) @SuppressLint("UnusedMaterial3ScaffoldPaddingParameter") @Composable fun SplashScreen( diff --git a/build.gradle.kts b/build.gradle.kts index 152e222..7dfc3fa 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,8 +1,11 @@ plugins { - id("com.android.application") version "8.1.0-alpha02" apply false - id("com.android.library") version "8.1.0-alpha02" apply false - id("org.jetbrains.kotlin.android") version "1.8.0" apply false - id("org.jetbrains.kotlin.jvm") version "1.8.0" apply false - id("com.google.android.libraries.mapsplatform.secrets-gradle-plugin") version "2.0.1" apply false - id("com.google.dagger.hilt.android") version "2.45" apply false + alias(libs.plugins.android.application) apply false + alias(libs.plugins.android.library) apply false + alias(libs.plugins.firebase.crashlytics) apply false + alias(libs.plugins.kotlin.android) apply false + alias(libs.plugins.kotlin.jvm) apply false + alias(libs.plugins.google.hilt) apply false + alias(libs.plugins.google.ksp) apply false + alias(libs.plugins.google.maps.secrets) apply false + alias(libs.plugins.google.service) apply false } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml new file mode 100644 index 0000000..f4a67d1 --- /dev/null +++ b/gradle/libs.versions.toml @@ -0,0 +1,199 @@ +[versions] +# Gradle +android-core = "8.2.0-alpha01" +firebase-crashlytics = "2.9.4" +google-hilt = "2.45" +google-maps-screts = "2.0.1" +google-services = "4.3.15" +google-ksp = "1.8.20-1.0.10" +kotlin-android = "1.8.10" +kotlin-jvm = "1.8.10" + +# AndroidX +androidx-activity = "1.7.2" +androidx-compose = "1.6.0-alpha01" +androidx-compose-material-3 = "1.2.0-alpha03" +androidx-compose-bom = "2023.06.01" +androidx-core = "1.10.1" +androidx-datastore = "1.0.0" +androidx-hilt = "1.0.0" +androidx-lifecycle = "2.6.1" +androidx-livedata = "1.6.0-alpha01" +androidx-viewmodel = "2.6.0-alpha05" +androidx-navigation = "2.6.0" +androidx-room = "2.5.2" +androidx-test-junit = "1.1.5" +androidx-test-espresso = "3.5.1" +androidx-work = "2.8.1" + +# Firebase +firebase-bom = "32.1.1" + +# Jetbrains +jetbrains-kotlin-reflect = "1.8.10" +jetbrains-kotlinx-coroutines = "1.6.4" + +# Junit +junit = "4.13.2" + +# Google +google-accompanist = "0.31.1-alpha" +google-dagger = "2.44.2" +google-gson = "2.10.1" +google-maps = "2.9.1" +google-places = "3.2.0" +google-services-location = "21.0.1" +google-services-maps = "18.1.0" + +# Lottie +lottie = "5.2.0" + +# MockK +mockK = "1.13.3" + +# Timber +timber = "5.0.1" + +# Square +okhttp3 = "4.10.0" +retrofit2 = "2.9.0" + +[libraries] +# AndroidX Activity Compose +androidx-activity-compose = { group = "androidx.activity", name = "activity-compose", version.ref = "androidx-activity" } + +# AndroidX Core +androidx-core = { group = "androidx.core", name = "core-ktx", version.ref = "androidx-core" } + +# AndroidX Compose +androidx-compose-bom = { group = "androidx.compose", name = "compose-bom", version.ref = "androidx-compose-bom" } + +# AndroidX Compose Ui +androidx-compose-ui-ui = { group = "androidx.compose.ui", name = "ui", version.ref = "androidx-compose" } +androidx-compose-ui-ui-test-junit = { group = "androidx.compose.ui", name = "ui-test-junit4", version.ref = "androidx-compose" } +androidx-compose-ui-ui-test-manifest = { group = "androidx.compose.ui", name = "ui-test-manifest", version.ref = "androidx-compose" } +androidx-compose-ui-ui-tooling = { group = "androidx.compose.ui", name = "ui-tooling", version.ref = "androidx-compose" } +androidx-compose-ui-ui-tooling-preview = { group = "androidx.compose.ui", name = "ui-tooling-preview", version.ref = "androidx-compose" } + +# AndroidX Compose Material +androidx-compose-material-2 = { group = "androidx.compose.material", name = "material", version.ref = "androidx-compose" } +androidx-compose-material-3 = { group = "androidx.compose.material3", name = "material3", version.ref = "androidx-compose-material-3" } + +# AndroidX DataStore +androidx-datastore-preferences = { group = "androidx.datastore", name = "datastore-preferences", version.ref = "androidx-datastore" } + +# AndroidX Hilt +androidx-hilt-navigation-compose = { group = "androidx.hilt", name = "hilt-navigation-compose", version.ref = "androidx-hilt" } +androidx-hilt-work = { group = "androidx.hilt", name = "hilt-work", version.ref = "androidx-hilt" } + +# AndroidX Lifecycle +androidx-lifecycle-runtime-compose = { group = "androidx.lifecycle", name = "lifecycle-runtime-compose", version.ref = "androidx-lifecycle" } +androidx-lifecycle-runtime-ktx = { group = "androidx.lifecycle", name = "lifecycle-runtime-ktx", version.ref = "androidx-lifecycle" } +androidx-lifecycle-viewmodel-ktx = { group = "androidx.lifecycle", name = "lifecycle-viewmodel-ktx", version.ref = "androidx-lifecycle" } +androidx-lifecycle-viewmodel-compose = { group = "androidx.lifecycle", name = "lifecycle-viewmodel-compose", version.ref = "androidx-lifecycle" } + +# AndroidX LiveData +androidx-livedata = { group = "androidx.compose.runtime", name = "runtime-livedata", version.ref = "androidx-livedata" } + +# AndroidX Navigation +androidx-navigation = { group = "androidx.navigation", name = "navigation-compose", version.ref = "androidx-navigation" } + +# AndroidX Room +androidx-room-runtime = { group = "androidx.room", name = "room-runtime", version.ref = "androidx-room" } +androidx-room-ktx = { group = "androidx.room", name = "room-ktx", version.ref = "androidx-room" } +androidx-room-compiler = { group = "androidx.room", name = "room-compiler", version.ref = "androidx-room" } + +# AndroidX Test +androidx-test-junit = { group = "androidx.test.ext", name = "junit", version.ref = "androidx-test-junit" } +androidx-test-espresso = { group = "androidx.test.espresso", name = "espresso-core", version.ref = "androidx-test-espresso" } + +# AndroidX Work Manager +androidx-work = { group = "androidx.work", name = "work-runtime-ktx", version.ref = "androidx-work" } + +# Firebase +firebase-bom = { group = "com.google.firebase", name = "firebase-bom", version.ref = "firebase-bom" } +firebase-crashlytics = { group = "com.google.firebase", name = "firebase-crashlytics-ktx" } + +# Google Accompanist +google-accompanist-navigation-animation = { group = "com.google.accompanist", name = "accompanist-navigation-animation", version.ref = "google-accompanist" } +google-accompanist-systemUiController = { group = "com.google.accompanist", name = "accompanist-systemuicontroller", version.ref = "google-accompanist" } +google-accompanist-flowLayout = { group = "com.google.accompanist", name = "accompanist-flowlayout", version.ref = "google-accompanist" } +google-accompanist-permission = { group = "com.google.accompanist", name = "accompanist-permissions", version.ref = "google-accompanist" } + +# Google Dagger +google-dagger-hilt-android = { group = "com.google.dagger", name = "hilt-android", version.ref = "google-dagger" } +google-dagger-hilt-android-compiler = { group = "com.google.dagger", name = "hilt-android-compiler", version.ref = "google-dagger" } + +# Google Gson +google-gson = { group = "com.google.code.gson", name = "gson", version.ref = "google-gson" } + +# Google Services +google-maps = { group = "com.google.maps.android", name = "maps-compose", version.ref = "google-maps" } +google-places = { group = "com.google.android.libraries.places", name = "places", version.ref = "google-places" } +google-play-services-location = { group = "com.google.android.gms", name = "play-services-location", version.ref = "google-services-location" } +google-play-services-maps = { group = "com.google.android.gms", name = "play-services-maps", version.ref = "google-services-maps" } + +# JUnit +junit-4 = { group = "junit", name = "junit", version.ref = "junit" } + +# Kotlin Reflect +kotlin-reflect = { group = "org.jetbrains.kotlin", name = "kotlin-reflect", version.ref = "jetbrains-kotlin-reflect" } + +# KotlinX Coroutines +kotlinx-coroutines-android = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-android", version.ref = "jetbrains-kotlinx-coroutines" } +kotlinx-coroutines-core = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-core", version.ref = "jetbrains-kotlinx-coroutines" } +kotlinx-coroutines-test = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-test", version.ref = "jetbrains-kotlinx-coroutines" } + +# MockK +mockk = { group = "io.mockk", name = "mockk", version.ref = "mockK" } +mockk-agent-jvm = { group = "io.mockk", name = "mockk-agent-jvm", version.ref = "mockK" } + +# Lottie +lottie = { group = "com.airbnb.android", name = "lottie-compose", version.ref = "lottie" } + +# Timber +timber = { group = "com.jakewharton.timber", name = "timber", version.ref = "timber" } + +# Okhttp +okhttp3 = { group = "com.squareup.okhttp3", name = "okhttp", version.ref = "okhttp3" } +okhttp3-logging-interceptor = { group = "com.squareup.okhttp3", name = "logging-interceptor", version.ref = "okhttp3" } + +# Retrofit +retrofit2 = { group = "com.squareup.retrofit2", name = "retrofit", version.ref = "retrofit2" } +retrofit2-converter-gson = { group = "com.squareup.retrofit2", name = "converter-gson", version.ref = "retrofit2" } + + +[plugins] +android-application = { id = "com.android.application", version.ref = "android-core" } +android-library = { id = "com.android.library", version.ref = "android-core" } + +firebase-crashlytics = { id = "com.google.firebase.crashlytics", version.ref = "firebase-crashlytics" } + +kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin-android" } +kotlin-jvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin-jvm" } + +google-maps-secrets = { id = "com.google.android.libraries.mapsplatform.secrets-gradle-plugin", version.ref = "google-maps-screts" } +google-hilt = { id = "com.google.dagger.hilt.android", version.ref = "google-hilt" } +google-ksp = { id = "com.google.devtools.ksp", version.ref = "google-ksp" } +google-service = { id = "com.google.gms.google-services", version.ref = "google-services" } + +[bundles] +androidx-compose = ["androidx-activity-compose", + "androidx-compose-material-2", + "androidx-compose-material-3", + "androidx-compose-ui-ui", + "androidx-compose-ui-ui-tooling-preview", +] +androidx-compose-debug = ["androidx-compose-ui-ui-tooling", "androidx-compose-ui-ui-test-manifest"] +androidx-compose-integration-testing = ["androidx-compose-ui-ui-test-junit"] + +firebase = ["firebase-crashlytics"] + +google-accompanist = [ + "google-accompanist-flowLayout", + "google-accompanist-navigation-animation", + "google-accompanist-permission", + "google-accompanist-systemUiController", +] + +retrofit2 = ["retrofit2", 'retrofit2-converter-gson'] diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 703be24..7c654e6 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ #Sat Jul 09 23:12:33 ICT 2022 distributionBase=GRADLE_USER_HOME -distributionUrl=https\://services.gradle.org/distributions/gradle-8.0-rc-1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.1.1-all.zip distributionPath=wrapper/dists zipStorePath=wrapper/dists zipStoreBase=GRADLE_USER_HOME diff --git a/settings.gradle.kts b/settings.gradle.kts index fec8570..2cab1f7 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -8,6 +8,7 @@ pluginManagement { dependencyResolutionManagement { repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) + repositories { google() mavenCentral()