diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 4d440399..6285d2d0 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -34,6 +34,9 @@ android { proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro") } } + androidResources { + generateLocaleConfig = true + } } dependencies { diff --git a/app/src/main/java/com/rtbishop/look4sat/presentation/MainTheme.kt b/app/src/main/java/com/rtbishop/look4sat/presentation/MainTheme.kt index e9075106..53939008 100644 --- a/app/src/main/java/com/rtbishop/look4sat/presentation/MainTheme.kt +++ b/app/src/main/java/com/rtbishop/look4sat/presentation/MainTheme.kt @@ -1,5 +1,6 @@ package com.rtbishop.look4sat.presentation +import android.os.Build import androidx.activity.ComponentActivity import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.foundation.shape.RoundedCornerShape @@ -44,6 +45,10 @@ fun MainTheme(isDarkTheme: Boolean = isSystemInDarkTheme(), content: @Composable val window = (view.context as ComponentActivity).window val insetsController = WindowCompat.getInsetsController(window, view) insetsController.isAppearanceLightStatusBars = false + insetsController.isAppearanceLightNavigationBars = false + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + window.isNavigationBarContrastEnforced = false + } } MaterialTheme(colorScheme, shapes, typography, content) } diff --git a/app/src/main/java/com/rtbishop/look4sat/presentation/common/Components.kt b/app/src/main/java/com/rtbishop/look4sat/presentation/common/Components.kt index fd9b35fa..81d734c3 100644 --- a/app/src/main/java/com/rtbishop/look4sat/presentation/common/Components.kt +++ b/app/src/main/java/com/rtbishop/look4sat/presentation/common/Components.kt @@ -3,6 +3,7 @@ package com.rtbishop.look4sat.presentation.common import androidx.compose.foundation.MarqueeSpacing import androidx.compose.foundation.background import androidx.compose.foundation.basicMarquee +import androidx.compose.foundation.border import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box @@ -17,7 +18,6 @@ import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.statusBarsPadding import androidx.compose.foundation.layout.width -import androidx.compose.foundation.shape.CircleShape import androidx.compose.material3.ButtonDefaults import androidx.compose.material3.CardDefaults import androidx.compose.material3.CircularProgressIndicator @@ -201,11 +201,9 @@ fun CardButton(onClick: () -> Unit, text: String, modifier: Modifier = Modifier) } @Composable -fun IconCard(action: () -> Unit, resId: Int, modifier: Modifier = Modifier, main: Boolean = false) { +fun IconCard(action: () -> Unit, resId: Int, modifier: Modifier = Modifier) { val clickableMod = Modifier.clickable { action() } - val defaultC = CardDefaults.elevatedCardColors() - val mainC = CardDefaults.elevatedCardColors(containerColor = MaterialTheme.colorScheme.primary) - ElevatedCard(modifier = Modifier.size(48.dp), colors = if (main) mainC else defaultC, shape = CircleShape) { + ElevatedCard(modifier = Modifier.size(48.dp)) { Box(modifier = clickableMod.fillMaxSize(), contentAlignment = Alignment.Center) { Icon(painter = painterResource(resId), contentDescription = null, modifier = modifier) } @@ -331,6 +329,27 @@ fun ScreenColumn(floatingBar: @Composable () -> Unit = {}, content: @Composable } } +@Composable +fun PrimaryButton(action: () -> Unit, resId: Int, modifier: Modifier = Modifier) { + val clickableMod = modifier.clickable { action() } + val colors = CardDefaults.cardColors(containerColor = MaterialTheme.colorScheme.primary) + ElevatedCard(modifier = Modifier.size(96.dp, 48.dp), colors = colors, shape = MaterialTheme.shapes.large) { + Box(modifier = clickableMod.fillMaxSize(), contentAlignment = Alignment.Center) { + Icon(painter = painterResource(resId), contentDescription = null) + } + } +} + +@Composable +fun SecondaryButton(action: () -> Unit, resId: Int, modifier: Modifier = Modifier) { + val clickableMod = modifier.clickable { action() } + ElevatedCard(modifier = Modifier.size(48.dp), shape = MaterialTheme.shapes.large) { + Box(modifier = clickableMod.fillMaxSize(), contentAlignment = Alignment.Center) { + Icon(painter = painterResource(resId), contentDescription = null) + } + } +} + @Composable fun FloatingBar( startAction: () -> Unit, startIconResId: Int, @@ -340,17 +359,18 @@ fun FloatingBar( val spacing = LocalSpacing.current Surface( color = MaterialTheme.colorScheme.background, - shape = CircleShape, - modifier = Modifier.padding(bottom = spacing.large) + shape = MaterialTheme.shapes.extraLarge, + modifier = Modifier.padding(bottom = spacing.medium) + .border(width = 1.dp, color = MaterialTheme.colorScheme.surfaceVariant, shape = MaterialTheme.shapes.extraLarge) ) { Row( horizontalArrangement = Arrangement.spacedBy(spacing.medium), verticalAlignment = Alignment.CenterVertically, - modifier = Modifier.padding(spacing.medium) + modifier = Modifier.padding(horizontal = spacing.large, vertical = spacing.medium) ) { - IconCard(action = startAction, resId = startIconResId) - IconCard(action = centerAction, resId = centerIconResId, main = true) - IconCard(action = endAction, resId = endIconResId) + SecondaryButton(action = startAction, resId = startIconResId) + PrimaryButton(action = centerAction, resId = centerIconResId) + SecondaryButton(action = endAction, resId = endIconResId) } } } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index e3f95461..83eb9797 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,16 +1,17 @@ [versions] -android-gradle-plugin = "8.12.2" -google-ksp = "2.2.10-2.0.2" -kotlin = "2.2.10" +android-gradle-plugin = "8.13.0" +google-ksp = "2.2.20-2.0.2" +kotlin = "2.2.20" androidx-core-ktx = "1.17.0" androidx-core-splashscreen = "1.0.1" -androidx-room = "2.7.2" +androidx-room = "2.8.0" -compose-bom = "2025.08.01" -compose-activity = "1.10.1" +compose-bom = "2025.09.00" +compose-activity = "1.11.0" compose-lifecycle = "2.9.3" -compose-navigation = "2.9.3" +#compose-material3 = "1.4.0-rc01" +compose-navigation = "2.9.4" other-coroutines = "1.10.2" other-json = "20250517" @@ -39,6 +40,7 @@ compose-tooling = { group = "androidx.compose.ui", name = "ui-tooling" } compose-activity = { module = "androidx.activity:activity-compose", version.ref = "compose-activity" } compose-lifecycle = { module = "androidx.lifecycle:lifecycle-runtime-compose", version.ref = "compose-lifecycle" } +#compose-material3 = { module = "androidx.compose.material3:material3", version.ref = "compose-material3" } compose-navigation = { module = "androidx.navigation:navigation-compose", version.ref = "compose-navigation" } compose-viewmodel = { module = "androidx.lifecycle:lifecycle-viewmodel-compose", version.ref = "compose-lifecycle" } @@ -67,9 +69,9 @@ kotlin-jvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" } [bundles] composeAll = [ - "compose-animation", "compose-runtime", "compose-tooling", "compose-activity", - "compose-lifecycle", "compose-material3", "compose-material3-adaptive", - "compose-navigation", "compose-viewmodel" + "compose-animation", "compose-runtime", "compose-tooling", + "compose-activity", "compose-lifecycle", "compose-material3", + "compose-material3-adaptive", "compose-navigation", "compose-viewmodel" ] composeDebug = ["compose-debug-manifest", "compose-debug-tooling"] unitTest = ["test-coroutines", "test-junit4", "test-mockk"]