From b848c5d91063ada5beff248ec029ffbbca0a99b8 Mon Sep 17 00:00:00 2001 From: Seb3thehacker Date: Tue, 13 Oct 2026 16:00:40 -0700 Subject: [PATCH] home: What's new and which cars work under the status card; the usage notes switch stays in Settings --- .../seb3thehacker/gearslip/ui/GearslipApp.kt | 15 ++++--- .../seb3thehacker/gearslip/ui/HomeScreen.kt | 27 +++++++++++- .../gearslip/ui/UsageStatsChoices.kt | 41 ------------------- 3 files changed, 36 insertions(+), 47 deletions(-) diff --git a/gearslip/src/main/java/app/seb3thehacker/gearslip/ui/GearslipApp.kt b/gearslip/src/main/java/app/seb3thehacker/gearslip/ui/GearslipApp.kt index 3865c30..29ccd27 100644 --- a/gearslip/src/main/java/app/seb3thehacker/gearslip/ui/GearslipApp.kt +++ b/gearslip/src/main/java/app/seb3thehacker/gearslip/ui/GearslipApp.kt @@ -62,9 +62,12 @@ fun GearslipApp(onDisconnect: () -> Unit, onRequestCallScreening: () -> Unit) { var introReturn by rememberSaveable { mutableStateOf(afterIntro) } // Home's "it worked" card opens Settings at usage notes rather than at the top. var settingsAtUsageNotes by rememberSaveable { mutableStateOf(false) } + // What's new and Connection help open from Home and from Settings; back returns to whichever. + var backTo by rememberSaveable { mutableStateOf(Screen.SETTINGS) } BackHandler(enabled = screen != Screen.HOME && screen != Screen.INTRO) { screen = when (screen) { - Screen.RECOMMENDED_APPS, Screen.LOGS, Screen.CAR_PREVIEW, Screen.HELP -> Screen.SETTINGS + Screen.RECOMMENDED_APPS, Screen.LOGS, Screen.CAR_PREVIEW -> Screen.SETTINGS + Screen.HELP, Screen.WHATS_NEW -> backTo else -> Screen.HOME } } @@ -105,16 +108,18 @@ fun GearslipApp(onDisconnect: () -> Unit, onRequestCallScreening: () -> Unit) { Screen.INTRO -> IntroScreen(onDone = { screen = introReturn }) Screen.HOME -> HomeScreen( onOpenSettings = { settingsAtUsageNotes = false; screen = Screen.SETTINGS }, + onOpenWhatsNew = { backTo = Screen.HOME; screen = Screen.WHATS_NEW }, + onOpenHelp = { backTo = Screen.HOME; screen = Screen.HELP }, onOpenUsageNotes = { settingsAtUsageNotes = true; screen = Screen.SETTINGS }, onDisconnect = onDisconnect, ) - Screen.WHATS_NEW -> WhatsNewScreen(onBack = { screen = Screen.SETTINGS }) + Screen.WHATS_NEW -> WhatsNewScreen(onBack = { screen = backTo }) Screen.LOGS -> LogsScreen(onBack = { screen = Screen.SETTINGS }) Screen.SETTINGS -> SettingsScreen( onBack = { screen = Screen.HOME }, onOpenRecommendedApps = { settingsAtUsageNotes = false; screen = Screen.RECOMMENDED_APPS }, - onOpenWhatsNew = { settingsAtUsageNotes = false; screen = Screen.WHATS_NEW }, - onOpenHelp = { settingsAtUsageNotes = false; screen = Screen.HELP }, + onOpenWhatsNew = { settingsAtUsageNotes = false; backTo = Screen.SETTINGS; screen = Screen.WHATS_NEW }, + onOpenHelp = { settingsAtUsageNotes = false; backTo = Screen.SETTINGS; screen = Screen.HELP }, onOpenCarPreview = { settingsAtUsageNotes = false; screen = Screen.CAR_PREVIEW }, onOpenLogs = { settingsAtUsageNotes = false; screen = Screen.LOGS }, onReplayTutorial = { screen = Screen.SETUP_GUIDE }, @@ -124,7 +129,7 @@ fun GearslipApp(onDisconnect: () -> Unit, onRequestCallScreening: () -> Unit) { Screen.RECOMMENDED_APPS -> RecommendedAppsScreen(onBack = { screen = Screen.SETTINGS }) Screen.CAR_PREVIEW -> CarPreviewScreen(onBack = { screen = Screen.SETTINGS }) Screen.HELP -> HelpScreen( - onBack = { screen = Screen.SETTINGS }, + onBack = { screen = backTo }, onRequestCallScreening = onRequestCallScreening, ) Screen.CERT_SETUP -> CertSetupScreen( diff --git a/gearslip/src/main/java/app/seb3thehacker/gearslip/ui/HomeScreen.kt b/gearslip/src/main/java/app/seb3thehacker/gearslip/ui/HomeScreen.kt index de43558..3a3975f 100644 --- a/gearslip/src/main/java/app/seb3thehacker/gearslip/ui/HomeScreen.kt +++ b/gearslip/src/main/java/app/seb3thehacker/gearslip/ui/HomeScreen.kt @@ -21,6 +21,7 @@ import androidx.compose.material.icons.filled.Send import androidx.compose.material.icons.filled.List import androidx.compose.material.icons.filled.PlayArrow import androidx.compose.material.icons.filled.Settings +import androidx.compose.material.icons.filled.Star import androidx.compose.material3.Button import androidx.compose.material3.CircularProgressIndicator import androidx.compose.material3.HorizontalDivider @@ -48,6 +49,8 @@ import app.seb3thehacker.gearslip.stats.WorkedPrompt @Composable fun HomeScreen( onOpenSettings: () -> Unit, + onOpenWhatsNew: () -> Unit, + onOpenHelp: () -> Unit, onOpenUsageNotes: () -> Unit, onDisconnect: () -> Unit, ) { @@ -98,7 +101,22 @@ fun HomeScreen( Spacer(Modifier.height(16.dp)) StatusCard(status) Spacer(Modifier.height(16.dp)) - UsageNotesHomeCard(onOpen = onOpenUsageNotes) + SettingsCard { + SettingsRow( + "What's new in ${Intro.release}", + Modifier.clickable(onClick = onOpenWhatsNew), + icon = Icons.Filled.Star, + trailing = { Arrow() }, + ) + SettingsDivider() + SettingsRow( + "Which cars work", + Modifier.clickable(onClick = onOpenHelp), + subtitle = "Most do. See which ones, and what to set up first", + icon = Icons.Filled.Info, + trailing = { Arrow() }, + ) + } // The first drive that worked asks once to share it, right under the result. val car = workedCar if (car != null && !live) { @@ -124,6 +142,13 @@ fun HomeScreen( } } +@Composable +private fun Arrow() = Icon( + Icons.AutoMirrored.Filled.KeyboardArrowRight, + contentDescription = null, + tint = MaterialTheme.colorScheme.onSurfaceVariant, +) + @Composable private fun StatusCard(status: SessionStatus.Snapshot) { val scheme = MaterialTheme.colorScheme diff --git a/gearslip/src/main/java/app/seb3thehacker/gearslip/ui/UsageStatsChoices.kt b/gearslip/src/main/java/app/seb3thehacker/gearslip/ui/UsageStatsChoices.kt index 66e6180..7818aee 100644 --- a/gearslip/src/main/java/app/seb3thehacker/gearslip/ui/UsageStatsChoices.kt +++ b/gearslip/src/main/java/app/seb3thehacker/gearslip/ui/UsageStatsChoices.kt @@ -256,44 +256,3 @@ internal fun WorkedCard(car: String, onSeeWhatsSent: () -> Unit, modifier: Modif } } } - -/** - * Usage notes on Home, one row with one action either way. While they're off, the row is the - * switch, so opting in is a single tap. Once they're on, it shrinks to a quiet line that opens - * Settings at its usage notes section, so a driver already sharing isn't pitched again. - */ -@Composable -internal fun UsageNotesHomeCard(onOpen: () -> Unit, modifier: Modifier = Modifier) { - val context = LocalContext.current - var on by remember { mutableStateOf(UsageStats.enabled(context)) } - - SettingsCard(modifier) { - if (on) { - SettingsRow( - "Sharing usage notes", - Modifier.clickable(onClick = onOpen), - subtitle = buildNote(), - icon = Icons.Filled.Check, - trailing = { - Icon( - Icons.AutoMirrored.Filled.KeyboardArrowRight, - contentDescription = null, - tint = MaterialTheme.colorScheme.onSurfaceVariant, - ) - }, - ) - } else { - SettingsRow( - USAGE_STATS_TITLE, - Modifier.toggleable(false, role = Role.Switch) { - UsageStats.set(context, true, UsageStats.choices(context)) - on = true - }, - subtitle = buildNote() ?: ("A short note after each drive tells the next driver " + - "whether their car works. No name, account, or location"), - icon = Icons.Filled.Send, - trailing = { Switch(checked = false, onCheckedChange = null) }, - ) - } - } -}