diff --git a/.github/workflows/build_and_local_tests.yml b/.github/workflows/build_and_local_tests.yml
index 301ea2a5..dff299be 100644
--- a/.github/workflows/build_and_local_tests.yml
+++ b/.github/workflows/build_and_local_tests.yml
@@ -30,14 +30,14 @@ jobs:
run: ./gradlew testDebug --stacktrace
- name: Upload build outputs (APKs)
- uses: actions/upload-artifact@v5
+ uses: actions/upload-artifact@v7
with:
name: build-outputs
path: ./app/build/outputs
- name: Upload build reports
if: always()
- uses: actions/upload-artifact@v5
+ uses: actions/upload-artifact@v7
with:
name: build-reports
path: ./app/build/reports
diff --git a/.github/workflows/instrumented_tests.yml b/.github/workflows/instrumented_tests.yml
index 80ace531..eec11f9a 100644
--- a/.github/workflows/instrumented_tests.yml
+++ b/.github/workflows/instrumented_tests.yml
@@ -41,7 +41,7 @@ jobs:
- name: Upload test reports
if: always()
- uses: actions/upload-artifact@v5
+ uses: actions/upload-artifact@v7
with:
name: test-reports-${{ matrix.api-level }}
path: ./app/build/reports/androidTests
diff --git a/app/build.gradle.kts b/app/build.gradle.kts
index d7e20880..1fc23824 100644
--- a/app/build.gradle.kts
+++ b/app/build.gradle.kts
@@ -14,11 +14,8 @@
* limitations under the License.
*/
-@Suppress("DSL_SCOPE_VIOLATION") // Remove when fixed https://youtrack.jetbrains.com/issue/KTIJ-19369
plugins {
alias(libs.plugins.android.application)
- alias(libs.plugins.kotlin.android)
- alias(libs.plugins.kotlin.kapt)
alias(libs.plugins.hilt.gradle)
alias(libs.plugins.ksp)
alias(libs.plugins.compose.compiler)
@@ -40,11 +37,6 @@ android {
vectorDrawables {
useSupportLibrary = true
}
-
- // Enable room auto-migrations
- ksp {
- arg("room.schemaLocation", "$projectDir/schemas")
- }
}
buildTypes {
@@ -54,30 +46,24 @@ android {
}
}
- compileOptions {
- sourceCompatibility = JavaVersion.VERSION_17
- targetCompatibility = JavaVersion.VERSION_17
- }
-
- kotlinOptions {
- jvmTarget = "17"
- }
-
buildFeatures {
compose = true
aidl = false
buildConfig = false
- renderScript = false
shaders = false
}
- packagingOptions {
+ packaging {
resources {
excludes += "/META-INF/{AL2.0,LGPL2.1}"
}
}
}
+ksp {
+ arg("room.schemaLocation", "$projectDir/schemas")
+}
+
dependencies {
val composeBom = platform(libs.androidx.compose.bom)
@@ -91,13 +77,13 @@ dependencies {
// Hilt Dependency Injection
implementation(libs.hilt.android)
- kapt(libs.hilt.compiler)
+ ksp(libs.hilt.compiler)
// Hilt and instrumented tests.
androidTestImplementation(libs.hilt.android.testing)
- kaptAndroidTest(libs.hilt.android.compiler)
+ kspAndroidTest(libs.hilt.android.compiler)
// Hilt and Robolectric tests.
testImplementation(libs.hilt.android.testing)
- kaptTest(libs.hilt.android.compiler)
+ kspTest(libs.hilt.android.compiler)
// Arch Components
implementation(libs.androidx.lifecycle.runtime.compose)
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index c663a7f3..ede66d1b 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -32,10 +32,10 @@
-
diff --git a/app/src/main/java/android/template/ui/MainActivity.kt b/app/src/main/java/android/template/ui/MainActivity.kt
index a198dbc0..f862cd08 100644
--- a/app/src/main/java/android/template/ui/MainActivity.kt
+++ b/app/src/main/java/android/template/ui/MainActivity.kt
@@ -17,19 +17,27 @@
package android.template.ui
import android.os.Bundle
+import android.template.ui.theme.MyApplicationTheme
import androidx.activity.ComponentActivity
+import androidx.activity.SystemBarStyle
import androidx.activity.compose.setContent
+import androidx.activity.enableEdgeToEdge
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Surface
import androidx.compose.ui.Modifier
import dagger.hilt.android.AndroidEntryPoint
-import android.template.ui.theme.MyApplicationTheme
@AndroidEntryPoint
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
+ enableEdgeToEdge(
+ statusBarStyle = SystemBarStyle.auto(
+ lightScrim = android.graphics.Color.TRANSPARENT,
+ darkScrim = android.graphics.Color.TRANSPARENT
+ )
+ )
super.onCreate(savedInstanceState)
setContent {
MyApplicationTheme {
diff --git a/app/src/main/java/android/template/ui/Navigation.kt b/app/src/main/java/android/template/ui/Navigation.kt
index d57362c7..092a63c2 100644
--- a/app/src/main/java/android/template/ui/Navigation.kt
+++ b/app/src/main/java/android/template/ui/Navigation.kt
@@ -18,6 +18,7 @@ package android.template.ui
import android.template.ui.mymodel.MyModelScreen
import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.layout.safeDrawingPadding
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
@@ -37,7 +38,7 @@ fun MainNavigation() {
entry {
MyModelScreen(
onItemClick = { navKey -> backStack.add(navKey) },
- modifier = Modifier.padding(16.dp)
+ modifier = Modifier.safeDrawingPadding().padding(16.dp)
)
}
}
diff --git a/app/src/main/java/android/template/ui/mymodel/MyModelScreen.kt b/app/src/main/java/android/template/ui/mymodel/MyModelScreen.kt
index 7d83bbe5..8da558a9 100644
--- a/app/src/main/java/android/template/ui/mymodel/MyModelScreen.kt
+++ b/app/src/main/java/android/template/ui/mymodel/MyModelScreen.kt
@@ -42,14 +42,14 @@ import androidx.navigation3.runtime.NavKey
fun MyModelScreen(
onItemClick: (NavKey) -> Unit,
modifier: Modifier = Modifier,
- viewModel: MyModelViewModel = hiltViewModel()
+ viewModel: MyModelViewModel = hiltViewModel(),
) {
val items by viewModel.uiState.collectAsStateWithLifecycle()
if (items is MyModelUiState.Success) {
MyModelScreen(
items = (items as MyModelUiState.Success).data,
onSave = viewModel::addMyModel,
- modifier = modifier
+ modifier = modifier,
)
}
}
@@ -58,20 +58,26 @@ fun MyModelScreen(
internal fun MyModelScreen(
items: List,
onSave: (name: String) -> Unit,
- modifier: Modifier = Modifier
+ modifier: Modifier = Modifier,
) {
Column(modifier) {
var nameMyModel by remember { mutableStateOf("Compose") }
Row(
- modifier = Modifier.fillMaxWidth().padding(bottom = 24.dp),
+ modifier = Modifier
+ .fillMaxWidth()
+ .padding(bottom = 24.dp),
horizontalArrangement = Arrangement.spacedBy(16.dp)
) {
TextField(
+ modifier = Modifier.weight(1f),
value = nameMyModel,
onValueChange = { nameMyModel = it }
)
- Button(modifier = Modifier.width(96.dp), onClick = { onSave(nameMyModel) }) {
+ Button(
+ modifier = Modifier.width(96.dp),
+ onClick = { onSave(nameMyModel) }
+ ) {
Text("Save")
}
}
@@ -91,7 +97,7 @@ private fun DefaultPreview() {
}
}
-@Preview(showBackground = true, widthDp = 480)
+@Preview(showBackground = true, widthDp = 340)
@Composable
private fun PortraitPreview() {
MyApplicationTheme {
diff --git a/app/src/main/java/android/template/ui/theme/Theme.kt b/app/src/main/java/android/template/ui/theme/Theme.kt
index b97baace..fd15404f 100644
--- a/app/src/main/java/android/template/ui/theme/Theme.kt
+++ b/app/src/main/java/android/template/ui/theme/Theme.kt
@@ -16,7 +16,6 @@
package android.template.ui.theme
-import android.app.Activity
import android.os.Build
import androidx.compose.foundation.isSystemInDarkTheme
import androidx.compose.material3.MaterialTheme
@@ -25,11 +24,7 @@ import androidx.compose.material3.dynamicDarkColorScheme
import androidx.compose.material3.dynamicLightColorScheme
import androidx.compose.material3.lightColorScheme
import androidx.compose.runtime.Composable
-import androidx.compose.runtime.SideEffect
-import androidx.compose.ui.graphics.toArgb
import androidx.compose.ui.platform.LocalContext
-import androidx.compose.ui.platform.LocalView
-import androidx.core.view.ViewCompat
private val DarkColorScheme = darkColorScheme(
primary = Purple80,
@@ -68,13 +63,6 @@ fun MyApplicationTheme(
darkTheme -> DarkColorScheme
else -> LightColorScheme
}
- val view = LocalView.current
- if (!view.isInEditMode) {
- SideEffect {
- (view.context as Activity).window.statusBarColor = colorScheme.primary.toArgb()
- ViewCompat.getWindowInsetsController(view)?.isAppearanceLightStatusBars = darkTheme
- }
- }
MaterialTheme(
colorScheme = colorScheme,
diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml
deleted file mode 100644
index 53ee56c6..00000000
--- a/app/src/main/res/values/colors.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-
-
-
-
- #FFBB86FC
- #FF6200EE
- #FF3700B3
- #FF03DAC5
- #FF018786
- #FF000000
- #FFFFFFFF
-
diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml
index b4e159c7..a12412b0 100644
--- a/gradle/libs.versions.toml
+++ b/gradle/libs.versions.toml
@@ -1,20 +1,20 @@
[versions]
-androidGradlePlugin = "8.13.1"
+androidGradlePlugin = "9.0.1"
androidxCore = "1.17.0"
androidxLifecycle = "2.10.0"
-androidxActivity = "1.12.0"
-androidxComposeBom = "2025.11.01"
+androidxActivity = "1.12.4"
+androidxComposeBom = "2026.02.00"
androidxHilt = "1.3.0"
androidxRoom = "2.8.4"
androidxTest = "1.7.0"
androidxTestExt = "1.3.0"
androidxTestRunner = "1.7.0"
coroutines = "1.10.2"
-hilt = "2.57.2"
+hilt = "2.59.2"
junit = "4.13.2"
-kotlin = "2.2.21"
-ksp = "2.3.2"
-nav3Core = "1.0.0"
+kotlin = "2.3.10"
+ksp = "2.3.6"
+nav3Core = "1.0.1"
lifecycleViewmodelNav3 = "2.10.0"
[libraries]
@@ -41,7 +41,6 @@ hilt-android = { module = "com.google.dagger:hilt-android", version.ref = "hilt"
hilt-android-compiler = { module = "com.google.dagger:hilt-android-compiler", version.ref = "hilt" }
hilt-android-testing = { module = "com.google.dagger:hilt-android-testing", version.ref = "hilt" }
hilt-compiler = { module = "com.google.dagger:hilt-compiler", version.ref = "hilt" }
-hilt-gradle-plugin = { module = "com.google.dagger:hilt-android-gradle-plugin", version.ref = "hilt" }
junit = { module = "junit:junit", version.ref = "junit" }
kotlinx-coroutines-test = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-test", version.ref = "coroutines" }
androidx-navigation3-runtime = { module = "androidx.navigation3:navigation3-runtime", version.ref = "nav3Core" }
@@ -50,10 +49,7 @@ androidx-lifecycle-viewmodel-navigation3 = { module = "androidx.lifecycle:lifecy
[plugins]
android-application = { id = "com.android.application", version.ref = "androidGradlePlugin" }
-android-library = { id = "com.android.library", version.ref = "androidGradlePlugin" }
compose-compiler = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" }
-kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" }
-kotlin-kapt = { id = "org.jetbrains.kotlin.kapt", version.ref = "kotlin" }
ksp = { id = "com.google.devtools.ksp", version.ref = "ksp"}
hilt-gradle = { id = "com.google.dagger.hilt.android", version.ref = "hilt" }
kotlin-serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" }
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index 23449a2b..37f78a6a 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -1,6 +1,6 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-9.2.1-bin.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-9.3.1-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
diff --git a/settings.gradle.kts b/settings.gradle.kts
index 5e5c71e9..e298d8bc 100644
--- a/settings.gradle.kts
+++ b/settings.gradle.kts
@@ -13,7 +13,6 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-
pluginManagement {
repositories {
gradlePluginPortal()
@@ -21,6 +20,7 @@ pluginManagement {
mavenCentral()
}
}
+
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories {