From 2469498ead5968bfb4110ece06b581eb431ef4c8 Mon Sep 17 00:00:00 2001 From: shinhyo Date: Tue, 25 Jun 2024 16:14:07 +0900 Subject: [PATCH 1/5] chore:kotlin 2.0 --- .gitignore | 1 + README.md | 4 +-- build-logic/convention/build.gradle.kts | 1 + .../shinhyo/brba/buildlogic/AndroidCompose.kt | 16 +++++++--- .../shinhyo/brba/buildlogic/KotlinAndroid.kt | 29 +++++++++--------- build.gradle.kts | 1 + gradle/libs.versions.toml | 30 +++++++++---------- gradle/wrapper/gradle-wrapper.properties | 4 +-- 8 files changed, 49 insertions(+), 37 deletions(-) diff --git a/.gitignore b/.gitignore index 273b7e9..b1740b0 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,4 @@ build/ .externalNativeBuild app/build build +/.kotlin diff --git a/README.md b/README.md index 55dea7b..5563d06 100644 --- a/README.md +++ b/README.md @@ -2,8 +2,8 @@

- - + +

diff --git a/build-logic/convention/build.gradle.kts b/build-logic/convention/build.gradle.kts index 011b12c..f818f57 100644 --- a/build-logic/convention/build.gradle.kts +++ b/build-logic/convention/build.gradle.kts @@ -20,6 +20,7 @@ tasks.withType().configureEach { dependencies { compileOnly(libs.android.gradlePlugin) compileOnly(libs.android.tools.common) + compileOnly(libs.compose.gradlePlugin) compileOnly(libs.kotlin.gradlePlugin) compileOnly(libs.ksp.gradlePlugin) } diff --git a/build-logic/convention/src/main/kotlin/io/github/shinhyo/brba/buildlogic/AndroidCompose.kt b/build-logic/convention/src/main/kotlin/io/github/shinhyo/brba/buildlogic/AndroidCompose.kt index 197a443..aff36a2 100644 --- a/build-logic/convention/src/main/kotlin/io/github/shinhyo/brba/buildlogic/AndroidCompose.kt +++ b/build-logic/convention/src/main/kotlin/io/github/shinhyo/brba/buildlogic/AndroidCompose.kt @@ -2,15 +2,18 @@ package io.github.shinhyo.brba.buildlogic import org.gradle.api.Project import org.gradle.kotlin.dsl.dependencies +import org.gradle.kotlin.dsl.getByType +import org.jetbrains.kotlin.compose.compiler.gradle.ComposeCompilerGradlePluginExtension internal fun Project.configureAndroidCompose() { androidExtension.apply { - buildFeatures { - compose = true + + with(plugins) { + apply("org.jetbrains.kotlin.plugin.compose") } - composeOptions { - kotlinCompilerExtensionVersion = findVersion("androidxComposeCompiler").toString() + buildFeatures { + compose = true } dependencies { @@ -19,4 +22,9 @@ internal fun Project.configureAndroidCompose() { } } + + extensions.getByType().apply { + enableStrongSkippingMode.set(true) + includeSourceInformation.set(true) + } } diff --git a/build-logic/convention/src/main/kotlin/io/github/shinhyo/brba/buildlogic/KotlinAndroid.kt b/build-logic/convention/src/main/kotlin/io/github/shinhyo/brba/buildlogic/KotlinAndroid.kt index b7f3dd2..3fb0963 100644 --- a/build-logic/convention/src/main/kotlin/io/github/shinhyo/brba/buildlogic/KotlinAndroid.kt +++ b/build-logic/convention/src/main/kotlin/io/github/shinhyo/brba/buildlogic/KotlinAndroid.kt @@ -3,7 +3,9 @@ package io.github.shinhyo.brba.buildlogic import org.gradle.api.JavaVersion import org.gradle.api.Project import org.gradle.kotlin.dsl.dependencies +import org.gradle.kotlin.dsl.provideDelegate import org.gradle.kotlin.dsl.withType +import org.jetbrains.kotlin.gradle.dsl.JvmTarget import org.jetbrains.kotlin.gradle.tasks.KotlinCompile internal fun Project.configureKotlinAndroid() { @@ -29,20 +31,19 @@ internal fun Project.configureKotlinAndroid() { private fun Project.configureKotlin() { tasks.withType().configureEach { - kotlinOptions { - jvmTarget = JavaVersion.VERSION_17.toString() - allWarningsAsErrors = properties["warningsAsErrors"] as? Boolean ?: false - compilerOptions.freeCompilerArgs.addAll( - "-P", - "plugin:androidx.compose.compiler.plugins.kotlin:strongSkipping=true", - ) - freeCompilerArgs = freeCompilerArgs + listOf( - "-Xcontext-receivers", - "-opt-in=kotlin.RequiresOptIn", - "-opt-in=kotlinx.coroutines.ExperimentalCoroutinesApi", - "-opt-in=androidx.compose.material3.ExperimentalMaterial3Api", - "-opt-in=androidx.compose.foundation.layout.ExperimentalLayoutApi", - "-opt-in=androidx.compose.animation.ExperimentalSharedTransitionApi", + compilerOptions { + jvmTarget.set(JvmTarget.JVM_17) + val warningsAsErrors: String? by project + allWarningsAsErrors.set(warningsAsErrors.toBoolean()) + freeCompilerArgs.set( + freeCompilerArgs.get() + listOf( + "-Xcontext-receivers", + "-opt-in=kotlin.RequiresOptIn", + "-opt-in=kotlinx.coroutines.ExperimentalCoroutinesApi", + "-opt-in=androidx.compose.material3.ExperimentalMaterial3Api", + "-opt-in=androidx.compose.foundation.layout.ExperimentalLayoutApi", + "-opt-in=androidx.compose.animation.ExperimentalSharedTransitionApi", + ), ) } } diff --git a/build.gradle.kts b/build.gradle.kts index 95e184d..3774560 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -9,6 +9,7 @@ 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.compose.compiler) apply false alias(libs.plugins.hilt) apply false alias(libs.plugins.ksp) apply false } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 7526a13..0ddd9e2 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -3,30 +3,28 @@ compileSdkVer = "34" targetSdkVer = "34" minSdkVer = "28" -androidGradlePlugin = "8.4.0" -androidTools = "31.4.0" +androidGradlePlugin = "8.5.0" +androidTools = "31.5.0" -kotlin = "1.9.23" +kotlin = "2.0.0" #https://github.com/google/ksp/releases -ksp = "1.9.23-1.0.20" -#https://developer.android.com/jetpack/androidx/releases/compose-kotlin -androidxComposeCompiler = "1.5.13" +ksp = "2.0.0-1.0.22" androidDesugarJdkLibs = "2.0.4" -kotlinxCoroutines = "1.8.0" +kotlinxCoroutines = "1.8.1" androidxCore = "1.13.1" androidxCoreSplashscreen = "1.0.1" -androidxAppCompat = "1.6.1" +androidxAppCompat = "1.7.0" androidxActivity = "1.9.0" androidxStartup = "1.1.1" androidxHiltNavigationCompose = "1.2.0" androidxConstraintlayoutCompose = "1.0.1" -androidxLifecycle = "2.7.0" +androidxLifecycle = "2.8.2" androidxDataStore = "1.1.1" -androidxComposeBom = "2024.05.00" -androidxCompose = "1.7.0-alpha08" +androidxComposeBom = "2024.06.00" +androidxCompose = "1.7.0-beta03" androidxComposeMaterial3 = "1.1.2" hilt = "2.51.1" @@ -35,9 +33,9 @@ hiltExt = "1.0.0" androidxNavigation = "2.7.7" junit4 = "4.13.2" -androidxTestCore = "1.5.0" -androidxTestExt = "1.1.5" -androidxEspresso = "3.5.1" +androidxTestCore = "1.6.0" +androidxTestExt = "1.2.0" +androidxEspresso = "3.6.0" coil = "2.6.0" javaxInject = "1" @@ -47,7 +45,7 @@ retrofit = "2.11.0" gson = "2.10.1" room = "2.6.1" turbine = "1.1.0" -junit = "1.1.5" +junit = "1.2.0" material = "1.12.0" haze = "0.7.1" @@ -63,6 +61,7 @@ android-gradlePlugin = { group = "com.android.tools.build", name = "gradle", ver android-tools-common = { group = "com.android.tools", name = "common", version.ref = "androidTools" } kotlin-gradlePlugin = { group = "org.jetbrains.kotlin", name = "kotlin-gradle-plugin", version.ref = "kotlin" } ksp-gradlePlugin = { group = "com.google.devtools.ksp", name = "com.google.devtools.ksp.gradle.plugin", version.ref = "ksp" } +compose-gradlePlugin = { module = "org.jetbrains.kotlin:compose-compiler-gradle-plugin", version.ref = "kotlin" } # android android-desugarJdkLibs = { group = "com.android.tools", name = "desugar_jdk_libs", version.ref = "androidDesugarJdkLibs" } @@ -133,6 +132,7 @@ haze = { group = "dev.chrisbanes.haze", name = "haze", version.ref = "haze" } [plugins] kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" } +compose-compiler = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" } android-application = { id = "com.android.application", version.ref = "androidGradlePlugin" } android-library = { id = "com.android.library", version.ref = "androidGradlePlugin" } hilt = { id = "com.google.dagger.hilt.android", version.ref = "hilt" } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index c3b331f..d4bf247 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Fri Sep 29 07:27:22 KST 2023 +#Tue Jun 25 15:56:57 KST 2024 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.6-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists From 03a409843039f8d8baf385b2d65ed0e7b5932722 Mon Sep 17 00:00:00 2001 From: shinhyo Date: Fri, 26 Jul 2024 23:01:11 +0900 Subject: [PATCH 2/5] refactor: move files from app to main --- .run/spotlessApply.run.xml | 23 +++ app/build.gradle.kts | 49 ----- app/src/main/AndroidManifest.xml | 4 +- app/src/main/res/values/colors.xml | 2 - app/src/main/res/xml/backup_rules.xml | 13 ++ .../main/res/xml/data_extraction_rules.xml | 19 ++ .../brba.android.application.gradle.kts | 60 +++++- .../shinhyo/brba/buildlogic/AndroidCompose.kt | 15 +- .../shinhyo/brba/buildlogic/Extension.kt | 2 +- .../shinhyo/brba/buildlogic/KotlinAndroid.kt | 54 +++--- .../shinhyo/brba/feature/main/ListScreen.kt | 182 ++++++++++++------ .../src/main/res/values-night/themes.xml | 0 .../main}/src/main/res/values/themes.xml | 0 gradle/libs.versions.toml | 22 ++- 14 files changed, 281 insertions(+), 164 deletions(-) create mode 100644 .run/spotlessApply.run.xml delete mode 100644 app/src/main/res/values/colors.xml create mode 100644 app/src/main/res/xml/backup_rules.xml create mode 100644 app/src/main/res/xml/data_extraction_rules.xml rename {app => feature/main}/src/main/res/values-night/themes.xml (100%) rename {app => feature/main}/src/main/res/values/themes.xml (100%) diff --git a/.run/spotlessApply.run.xml b/.run/spotlessApply.run.xml new file mode 100644 index 0000000..5c4dac8 --- /dev/null +++ b/.run/spotlessApply.run.xml @@ -0,0 +1,23 @@ + + + + + + + true + true + false + + + \ No newline at end of file diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 181db15..212e492 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -1,52 +1,3 @@ plugins { id("brba.android.application") } - -android { - namespace = "io.github.shinhyo.brba" - - defaultConfig { - applicationId = "io.github.shinhyo.brba" - versionCode = 1 - versionName = "1.0" - } - - signingConfigs { - getByName("debug") { - storeFile = rootProject.file("debug.keystore") - storePassword = "android" - keyAlias = "androiddebugkey" - keyPassword = "android" - } - } - - buildTypes { - getByName("debug") { - isDebuggable = false - } - - getByName("release") { - isDebuggable = false - isShrinkResources = true - isMinifyEnabled = true - proguardFiles( - getDefaultProguardFile("proguard-android-optimize.txt"), - "proguard-rules.pro", - ) - signingConfig = signingConfigs.getByName("debug") - } - } - - buildFeatures { - buildConfig = true - } -} - -dependencies { - implementation(project(":feature:main")) - - implementation(libs.androidx.startup) - implementation(libs.androidx.compose.material3) - implementation(libs.timber) - implementation(libs.coil.kt) -} diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index b8ba5ab..f60b984 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -6,8 +6,10 @@ - diff --git a/app/src/main/res/xml/backup_rules.xml b/app/src/main/res/xml/backup_rules.xml new file mode 100644 index 0000000..fa0f996 --- /dev/null +++ b/app/src/main/res/xml/backup_rules.xml @@ -0,0 +1,13 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/xml/data_extraction_rules.xml b/app/src/main/res/xml/data_extraction_rules.xml new file mode 100644 index 0000000..9ee9997 --- /dev/null +++ b/app/src/main/res/xml/data_extraction_rules.xml @@ -0,0 +1,19 @@ + + + + + + + \ No newline at end of file diff --git a/build-logic/convention/src/main/kotlin/brba.android.application.gradle.kts b/build-logic/convention/src/main/kotlin/brba.android.application.gradle.kts index fad027e..3371540 100644 --- a/build-logic/convention/src/main/kotlin/brba.android.application.gradle.kts +++ b/build-logic/convention/src/main/kotlin/brba.android.application.gradle.kts @@ -2,6 +2,7 @@ import com.android.build.api.dsl.ApplicationExtension import io.github.shinhyo.brba.buildlogic.configureAndroidCompose import io.github.shinhyo.brba.buildlogic.configureHiltAndroid import io.github.shinhyo.brba.buildlogic.configureKotlinAndroid +import io.github.shinhyo.brba.buildlogic.findLibrary import io.github.shinhyo.brba.buildlogic.findVersion with(pluginManager) { @@ -9,9 +10,58 @@ with(pluginManager) { } extensions.configure { - defaultConfig.targetSdk = findVersion("targetSdkVer").toString().toInt() -} + namespace = "io.github.shinhyo.brba" + + defaultConfig.applicationId = "io.github.shinhyo.brba" + defaultConfig.targetSdk = findVersion("targetSdkVer").toInt() + defaultConfig.versionCode = findVersion("versionCode").toInt() + defaultConfig.versionName = findVersion("versionName") + defaultConfig.testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + defaultConfig.vectorDrawables.useSupportLibrary = true + + buildFeatures.buildConfig = true + + signingConfigs { + getByName("debug") { + storeFile = rootProject.file("debug.keystore") + storePassword = "android" + keyAlias = "androiddebugkey" + keyPassword = "android" + } + } + + buildTypes { + getByName("debug") { + isDebuggable = false + } + + getByName("release") { + isDebuggable = false + isShrinkResources = true + isMinifyEnabled = true + proguardFiles( + getDefaultProguardFile("proguard-android-optimize.txt"), + "proguard-rules.pro", + ) + signingConfig = signingConfigs.getByName("debug") + } + } + + packaging { + resources { + excludes += "/META-INF/{AL2.0,LGPL2.1}" + } + } + + configureKotlinAndroid() + configureAndroidCompose() + configureHiltAndroid() + + dependencies { + add("implementation", project(":feature:main")) -configureKotlinAndroid() -configureAndroidCompose() -configureHiltAndroid() + add("implementation", findLibrary("androidx.startup")) + add("implementation", findLibrary("timber")) + add("implementation", findLibrary("coil.kt")) + } +} \ No newline at end of file diff --git a/build-logic/convention/src/main/kotlin/io/github/shinhyo/brba/buildlogic/AndroidCompose.kt b/build-logic/convention/src/main/kotlin/io/github/shinhyo/brba/buildlogic/AndroidCompose.kt index aff36a2..eb58675 100644 --- a/build-logic/convention/src/main/kotlin/io/github/shinhyo/brba/buildlogic/AndroidCompose.kt +++ b/build-logic/convention/src/main/kotlin/io/github/shinhyo/brba/buildlogic/AndroidCompose.kt @@ -1,13 +1,12 @@ package io.github.shinhyo.brba.buildlogic - import org.gradle.api.Project +import org.gradle.kotlin.dsl.assign +import org.gradle.kotlin.dsl.configure import org.gradle.kotlin.dsl.dependencies -import org.gradle.kotlin.dsl.getByType import org.jetbrains.kotlin.compose.compiler.gradle.ComposeCompilerGradlePluginExtension internal fun Project.configureAndroidCompose() { androidExtension.apply { - with(plugins) { apply("org.jetbrains.kotlin.plugin.compose") } @@ -19,12 +18,16 @@ internal fun Project.configureAndroidCompose() { dependencies { val bom = libs.findLibrary("androidx-compose-bom").get() add("implementation", platform(bom)) + add("androidTestImplementation", platform(bom)) + add("implementation", libs.findLibrary("androidx-compose-ui-tooling-preview").get()) + add("debugImplementation", libs.findLibrary("androidx-compose-ui-tooling").get()) } } - extensions.getByType().apply { - enableStrongSkippingMode.set(true) - includeSourceInformation.set(true) + extensions.configure { + enableStrongSkippingMode = true + includeSourceInformation = true } } + diff --git a/build-logic/convention/src/main/kotlin/io/github/shinhyo/brba/buildlogic/Extension.kt b/build-logic/convention/src/main/kotlin/io/github/shinhyo/brba/buildlogic/Extension.kt index 37873b3..e6e7336 100644 --- a/build-logic/convention/src/main/kotlin/io/github/shinhyo/brba/buildlogic/Extension.kt +++ b/build-logic/convention/src/main/kotlin/io/github/shinhyo/brba/buildlogic/Extension.kt @@ -23,6 +23,6 @@ internal val Project.androidExtension: CommonExtension<*, *, *, *, *, *> internal val Project.libs get(): VersionCatalog = extensions.getByType().named("libs") -internal fun Project.findVersion(alias: String) = libs.findVersion(alias).get() +internal fun Project.findVersion(alias: String) = libs.findVersion(alias).get().toString() internal fun Project.findLibrary(alias: String) = libs.findLibrary(alias).get() \ No newline at end of file diff --git a/build-logic/convention/src/main/kotlin/io/github/shinhyo/brba/buildlogic/KotlinAndroid.kt b/build-logic/convention/src/main/kotlin/io/github/shinhyo/brba/buildlogic/KotlinAndroid.kt index 3fb0963..f03659d 100644 --- a/build-logic/convention/src/main/kotlin/io/github/shinhyo/brba/buildlogic/KotlinAndroid.kt +++ b/build-logic/convention/src/main/kotlin/io/github/shinhyo/brba/buildlogic/KotlinAndroid.kt @@ -2,20 +2,23 @@ package io.github.shinhyo.brba.buildlogic import org.gradle.api.JavaVersion import org.gradle.api.Project +import org.gradle.kotlin.dsl.assign +import org.gradle.kotlin.dsl.configure import org.gradle.kotlin.dsl.dependencies import org.gradle.kotlin.dsl.provideDelegate -import org.gradle.kotlin.dsl.withType import org.jetbrains.kotlin.gradle.dsl.JvmTarget -import org.jetbrains.kotlin.gradle.tasks.KotlinCompile +import org.jetbrains.kotlin.gradle.dsl.KotlinAndroidProjectExtension +import org.jetbrains.kotlin.gradle.dsl.KotlinJvmProjectExtension +import org.jetbrains.kotlin.gradle.dsl.KotlinTopLevelExtension internal fun Project.configureKotlinAndroid() { pluginManager.apply("org.jetbrains.kotlin.android") androidExtension.apply { - compileSdk = findVersion("compileSdkVer").toString().toInt() + compileSdk = findVersion("compileSdkVer").toInt() defaultConfig { - minSdk = findVersion("minSdkVer").toString().toInt() + minSdk = findVersion("minSdkVer").toInt() } compileOptions { @@ -25,33 +28,32 @@ internal fun Project.configureKotlinAndroid() { } } - configureKotlin() - configureDependencies() + configureKotlin() } -private fun Project.configureKotlin() { - tasks.withType().configureEach { - compilerOptions { - jvmTarget.set(JvmTarget.JVM_17) - val warningsAsErrors: String? by project - allWarningsAsErrors.set(warningsAsErrors.toBoolean()) - freeCompilerArgs.set( - freeCompilerArgs.get() + listOf( - "-Xcontext-receivers", - "-opt-in=kotlin.RequiresOptIn", - "-opt-in=kotlinx.coroutines.ExperimentalCoroutinesApi", - "-opt-in=androidx.compose.material3.ExperimentalMaterial3Api", - "-opt-in=androidx.compose.foundation.layout.ExperimentalLayoutApi", - "-opt-in=androidx.compose.animation.ExperimentalSharedTransitionApi", - ), - ) - } +private inline fun Project.configureKotlin() = configure { + val warningsAsErrors: String? by project + when (this) { + is KotlinAndroidProjectExtension -> compilerOptions + is KotlinJvmProjectExtension -> compilerOptions + else -> TODO("Unsupported project extension $this ${T::class}") + }.apply { + jvmTarget = JvmTarget.JVM_17 + allWarningsAsErrors = warningsAsErrors.toBoolean() + freeCompilerArgs.addAll( + listOf( + "-Xcontext-receivers", + "-opt-in=kotlin.RequiresOptIn", + "-opt-in=kotlinx.coroutines.ExperimentalCoroutinesApi", + "-opt-in=androidx.compose.material3.ExperimentalMaterial3Api", + "-opt-in=androidx.compose.foundation.layout.ExperimentalLayoutApi", + "-opt-in=androidx.compose.animation.ExperimentalSharedTransitionApi", + ), + ) } -} -private fun Project.configureDependencies() { dependencies { add("coreLibraryDesugaring", findLibrary("android.desugarJdkLibs")) add("implementation", findLibrary("kotlinx.coroutines.android")) } -} +} \ No newline at end of file diff --git a/feature/list/src/main/java/io/github/shinhyo/brba/feature/main/ListScreen.kt b/feature/list/src/main/java/io/github/shinhyo/brba/feature/main/ListScreen.kt index 53790a9..47d6c3f 100644 --- a/feature/list/src/main/java/io/github/shinhyo/brba/feature/main/ListScreen.kt +++ b/feature/list/src/main/java/io/github/shinhyo/brba/feature/main/ListScreen.kt @@ -19,6 +19,7 @@ import android.content.res.Configuration import androidx.compose.animation.AnimatedVisibilityScope import androidx.compose.animation.SharedTransitionScope import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.WindowInsets import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.lazy.staggeredgrid.LazyVerticalStaggeredGrid @@ -75,82 +76,135 @@ private fun SharedTransitionScope.ListScreen( onFavoriteClick: (BrbaCharacter) -> Unit = {}, onChangeThemeClick: (BrbaThemeMode) -> Unit = {}, ) { - val hazeState: HazeState = remember { HazeState() } + val hazeState = remember { HazeState() } Scaffold( topBar = { - BrbaTopAppBar( + ListTopAppBar( hazeState = hazeState, - actions = { - when (uiState) { - is ListUiState.Loading, - is ListUiState.Error, - -> { - } - - is ListUiState.Success -> { - if (uiState.themeMode != BrbaThemeMode.System) { - val icTheme = if (uiState.themeMode == BrbaThemeMode.Light) { - io.github.shinhyo.brba.core.designsystem.R.drawable.ic_theme_light - } else { - io.github.shinhyo.brba.core.designsystem.R.drawable.ic_theme_dark - } - IconButton( - onClick = { onChangeThemeClick.invoke(uiState.themeMode) }, - ) { - Icon( - painterResource(id = icTheme), - contentDescription = "ic_theme", - tint = MaterialTheme.colorScheme.tertiary, - ) - } - } - } - } - }, + uiState = uiState, + onChangeThemeClick = onChangeThemeClick, ) }, contentWindowInsets = WindowInsets(16.dp, 4.dp, 16.dp, 16.dp), ) { contentPadding -> - when (uiState) { - is ListUiState.Loading -> { - BrBaCircleProgress(modifier) - } + is ListUiState.Loading -> LoadingContent() + is ListUiState.Error -> ErrorContent(uiState.exception) + is ListUiState.Success -> SuccessContent( + modifier = modifier, + animatedVisibilityScope = animatedVisibilityScope, + contentPadding = contentPadding, + hazeState = hazeState, + characters = uiState.characters, + onCharacterClick = onCharacterClick, + onFavoriteClick = onFavoriteClick, + ) + } + } +} - is ListUiState.Error -> { - uiState.exception?.printStackTrace() +@Composable +private fun ListTopAppBar( + hazeState: HazeState, + uiState: ListUiState, + onChangeThemeClick: (BrbaThemeMode) -> Unit, +) { + BrbaTopAppBar( + hazeState = hazeState, + actions = { + if (uiState is ListUiState.Success) { + ThemeToggleButton( + themeMode = uiState.themeMode, + onClick = onChangeThemeClick, + ) } + }, + ) +} - is ListUiState.Success -> { - LazyVerticalStaggeredGrid( - horizontalArrangement = Arrangement.spacedBy(6.dp), - verticalItemSpacing = 6.dp, - contentPadding = contentPadding, - columns = StaggeredGridCells.Adaptive( - minSize = 100.dp, - ), - modifier = modifier - .haze( - state = hazeState, - style = HazeDefaults.style(backgroundColor = MaterialTheme.colorScheme.surface), - ) - .fillMaxSize(), - ) { - items( - items = uiState.characters, - key = { character -> character.charId }, - ) { character -> - BrbaCharacterCard( - modifier = Modifier, - animatedVisibilityScope = animatedVisibilityScope, - character = character, - onCharacterClick = onCharacterClick, - onFavoriteClick = onFavoriteClick, - ) - } - } - } +@Composable +private fun LoadingContent() { + BrBaCircleProgress(Modifier.fillMaxSize()) +} + +@Composable +private fun ErrorContent(exception: Throwable?) { + // Display error message +} + +@Composable +private fun SharedTransitionScope.SuccessContent( + modifier: Modifier, + animatedVisibilityScope: AnimatedVisibilityScope, + contentPadding: PaddingValues, + hazeState: HazeState, + characters: List, + onCharacterClick: (BrbaCharacter) -> Unit, + onFavoriteClick: (BrbaCharacter) -> Unit, +) { + val columns = remember { StaggeredGridCells.Adaptive(minSize = 100.dp) } + + LazyVerticalStaggeredGrid( + columns = columns, + horizontalArrangement = Arrangement.spacedBy(6.dp), + verticalItemSpacing = 6.dp, + contentPadding = contentPadding, + modifier = modifier + .haze( + state = hazeState, + style = HazeDefaults.style(backgroundColor = MaterialTheme.colorScheme.surface), + ) + .fillMaxSize(), + ) { + items( + items = characters, + key = { it.charId }, + contentType = { "character" }, + ) { character -> + CharacterCard( + animatedVisibilityScope = animatedVisibilityScope, + character = character, + onCharacterClick = onCharacterClick, + onFavoriteClick = onFavoriteClick, + ) + } + } +} + +@Composable +private fun SharedTransitionScope.CharacterCard( + animatedVisibilityScope: AnimatedVisibilityScope, + character: BrbaCharacter, + onCharacterClick: (BrbaCharacter) -> Unit, + onFavoriteClick: (BrbaCharacter) -> Unit, +) { + BrbaCharacterCard( + modifier = Modifier, + animatedVisibilityScope = animatedVisibilityScope, + character = character, + onCharacterClick = onCharacterClick, + onFavoriteClick = onFavoriteClick, + ) +} + +@Composable +private fun ThemeToggleButton( + themeMode: BrbaThemeMode, + onClick: (BrbaThemeMode) -> Unit, +) { + if (themeMode != BrbaThemeMode.System) { + val iconRes = if (themeMode == BrbaThemeMode.Light) { + io.github.shinhyo.brba.core.designsystem.R.drawable.ic_theme_light + } else { + io.github.shinhyo.brba.core.designsystem.R.drawable.ic_theme_dark + } + IconButton(onClick = { onClick(themeMode) }) { + Icon( + painter = painterResource(id = iconRes), + contentDescription = "Change theme", + tint = MaterialTheme.colorScheme.tertiary, + ) } } } diff --git a/app/src/main/res/values-night/themes.xml b/feature/main/src/main/res/values-night/themes.xml similarity index 100% rename from app/src/main/res/values-night/themes.xml rename to feature/main/src/main/res/values-night/themes.xml diff --git a/app/src/main/res/values/themes.xml b/feature/main/src/main/res/values/themes.xml similarity index 100% rename from app/src/main/res/values/themes.xml rename to feature/main/src/main/res/values/themes.xml diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 0ddd9e2..8795cc0 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,14 +1,16 @@ [versions] +versionCode = "1" +versionName = "1.0.0" compileSdkVer = "34" targetSdkVer = "34" minSdkVer = "28" -androidGradlePlugin = "8.5.0" -androidTools = "31.5.0" +androidGradlePlugin = "8.5.1" +androidTools = "31.5.1" kotlin = "2.0.0" -#https://github.com/google/ksp/releases -ksp = "2.0.0-1.0.22" +# https://github.com/google/ksp/releases +ksp = "2.0.0-1.0.23" androidDesugarJdkLibs = "2.0.4" kotlinxCoroutines = "1.8.1" @@ -16,15 +18,15 @@ kotlinxCoroutines = "1.8.1" androidxCore = "1.13.1" androidxCoreSplashscreen = "1.0.1" androidxAppCompat = "1.7.0" -androidxActivity = "1.9.0" +androidxActivity = "1.9.1" androidxStartup = "1.1.1" androidxHiltNavigationCompose = "1.2.0" androidxConstraintlayoutCompose = "1.0.1" -androidxLifecycle = "2.8.2" +androidxLifecycle = "2.8.4" androidxDataStore = "1.1.1" androidxComposeBom = "2024.06.00" -androidxCompose = "1.7.0-beta03" +androidxCompose = "1.7.0-beta06" androidxComposeMaterial3 = "1.1.2" hilt = "2.51.1" @@ -33,9 +35,9 @@ hiltExt = "1.0.0" androidxNavigation = "2.7.7" junit4 = "4.13.2" -androidxTestCore = "1.6.0" -androidxTestExt = "1.2.0" -androidxEspresso = "3.6.0" +androidxTestCore = "1.6.1" +androidxTestExt = "1.2.1" +androidxEspresso = "3.6.1" coil = "2.6.0" javaxInject = "1" From 375fc872b0abb3926dc1651f583273b8ee83f509 Mon Sep 17 00:00:00 2001 From: shinhyo Date: Fri, 26 Jul 2024 23:48:22 +0900 Subject: [PATCH 3/5] chore: kotlin 2.0.10-RC --- README.md | 2 +- gradle/libs.versions.toml | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 5563d06..ff58c5e 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@

- +

diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 8795cc0..957feb4 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -8,9 +8,10 @@ minSdkVer = "28" androidGradlePlugin = "8.5.1" androidTools = "31.5.1" -kotlin = "2.0.0" +# https://github.com/JetBrains/kotlin/releases +kotlin = "2.0.10-RC" # https://github.com/google/ksp/releases -ksp = "2.0.0-1.0.23" +ksp = "2.0.10-RC-1.0.23" androidDesugarJdkLibs = "2.0.4" kotlinxCoroutines = "1.8.1" @@ -47,7 +48,7 @@ retrofit = "2.11.0" gson = "2.10.1" room = "2.6.1" turbine = "1.1.0" -junit = "1.2.0" +junit = "1.2.1" material = "1.12.0" haze = "0.7.1" From 0100b96b2387881ad55384eee57daddaae7257f1 Mon Sep 17 00:00:00 2001 From: shinhyo Date: Fri, 26 Jul 2024 23:55:19 +0900 Subject: [PATCH 4/5] chore: change trigger branch in ci --- .github/workflows/Build.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/Build.yaml b/.github/workflows/Build.yaml index cb6c4ed..a657f3c 100644 --- a/.github/workflows/Build.yaml +++ b/.github/workflows/Build.yaml @@ -3,7 +3,7 @@ name: Build on: push: branches: - - main + - develop pull_request: concurrency: From 4c94de3b7a3a49dd19095838cba32973b7e8bbe2 Mon Sep 17 00:00:00 2001 From: Luke Date: Sat, 27 Jul 2024 00:07:20 +0900 Subject: [PATCH 5/5] Update README.md --- README.md | 23 +++-------------------- 1 file changed, 3 insertions(+), 20 deletions(-) diff --git a/README.md b/README.md index ff58c5e..db39014 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -

Breaking Bad - Jetpack Compose

+

🧪 Breaking Bad - Jetpack Compose

@@ -36,7 +36,7 @@ - [Coil-Compose](https://coil-kt.github.io/coil/compose) - [Timber](https://github.com/JakeWharton/timber) - [Haze](https://github.com/chrisbanes/haze) -- [sharedElement](https://developer.android.com/guide/fragments/animate#shared) +- [SharedElement](https://developer.android.com/guide/fragments/animate#shared) ## Multi Module @@ -60,22 +60,5 @@    └── setting ``` +## Module Graphs ![](project.dot.png) - -# License - -```xml - Designed and developed by 2021 shinhyo - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -```