From 3cf41d3fc2e98b89b437d21bc0aed6eccbde8627 Mon Sep 17 00:00:00 2001 From: Seb3thehacker Date: Fri, 6 Nov 2026 14:31:54 -0800 Subject: [PATCH] The nav bar's mic button can be hidden; the car's voice key still works --- .../java/app/seb3thehacker/gearslip/car/CarNavBar.kt | 7 +++++-- .../app/seb3thehacker/gearslip/car/CarSettings.kt | 11 +++++++++++ .../seb3thehacker/gearslip/car/CarSettingsScreen.kt | 4 ++++ .../app/seb3thehacker/gearslip/ui/HomeCarSettings.kt | 3 +++ gearslip/src/main/res/values-ar/strings.xml | 2 ++ gearslip/src/main/res/values-cs/strings.xml | 2 ++ gearslip/src/main/res/values-de/strings.xml | 2 ++ gearslip/src/main/res/values-es/strings.xml | 2 ++ gearslip/src/main/res/values-fr/strings.xml | 2 ++ gearslip/src/main/res/values-it/strings.xml | 2 ++ gearslip/src/main/res/values-ja/strings.xml | 2 ++ gearslip/src/main/res/values-ko/strings.xml | 2 ++ gearslip/src/main/res/values-nl/strings.xml | 2 ++ gearslip/src/main/res/values-pl/strings.xml | 2 ++ gearslip/src/main/res/values-pt-rBR/strings.xml | 2 ++ gearslip/src/main/res/values-ro/strings.xml | 2 ++ gearslip/src/main/res/values-ru/strings.xml | 2 ++ gearslip/src/main/res/values-sv/strings.xml | 2 ++ gearslip/src/main/res/values-tr/strings.xml | 2 ++ gearslip/src/main/res/values-uk/strings.xml | 2 ++ gearslip/src/main/res/values-zh-rCN/strings.xml | 2 ++ gearslip/src/main/res/values/strings.xml | 2 ++ 22 files changed, 59 insertions(+), 2 deletions(-) diff --git a/gearslip/src/main/java/app/seb3thehacker/gearslip/car/CarNavBar.kt b/gearslip/src/main/java/app/seb3thehacker/gearslip/car/CarNavBar.kt index dd849eb..66346fe 100644 --- a/gearslip/src/main/java/app/seb3thehacker/gearslip/car/CarNavBar.kt +++ b/gearslip/src/main/java/app/seb3thehacker/gearslip/car/CarNavBar.kt @@ -170,6 +170,7 @@ internal fun CarNavBar(navigator: CarNavigator) { // the screen above rather than a panel on it. Over the player it's see-through, so the // cover's glow carries on behind it. val overPlayer = navigator.current == CarScreen.Media + val navMic by CarSettings.navMic.collectAsState() Surface(color = if (overPlayer) androidx.compose.ui.graphics.Color.Transparent else MaterialTheme.colorScheme.background) { BoxWithConstraints(Modifier.fillMaxWidth().height(NAV_BAR_HEIGHT).padding(horizontal = 10.dp)) { Row(Modifier.fillMaxSize(), verticalAlignment = Alignment.CenterVertically) { @@ -180,8 +181,10 @@ internal fun CarNavBar(navigator: CarNavigator) { NavHomeButton(navigator, entries, running) Spacer(Modifier.width(6.dp)) NavItem(MediaIcons.Apps, navigator.current == CarScreen.Apps) { navigator.apps() } - Spacer(Modifier.width(6.dp)) - NavAssistantIcon() + if (navMic) { + Spacer(Modifier.width(6.dp)) + NavAssistantIcon() + } // Pinned shortcuts, then whatever else is open right now. A pinned app that's also // open stays in its pinned spot, marked with a dot, instead of showing up twice. diff --git a/gearslip/src/main/java/app/seb3thehacker/gearslip/car/CarSettings.kt b/gearslip/src/main/java/app/seb3thehacker/gearslip/car/CarSettings.kt index 0203938..8907b8c 100644 --- a/gearslip/src/main/java/app/seb3thehacker/gearslip/car/CarSettings.kt +++ b/gearslip/src/main/java/app/seb3thehacker/gearslip/car/CarSettings.kt @@ -68,6 +68,7 @@ private const val KEY_LOCATION_WARNING = "car_location_warning" private const val KEY_AUTOPLAY = "car_autoplay" private const val KEY_PLAYER_TITLE = "car_player_title" private const val KEY_PLAYER_LEFT = "car_player_left" + private const val KEY_NAV_MIC = "car_nav_mic" private const val KEY_THEME = "car_app_theme" private const val KEY_UI_THEME = "car_ui_theme" private const val KEY_DARK_STYLE = "car_dark_style" @@ -113,6 +114,7 @@ private const val KEY_CLUSTER_VIDEO = "cluster_video_enabled" private val autoplayFlow = MutableStateFlow(false) private val playerTitleFlow = MutableStateFlow(false) private val playerLeftFlow = MutableStateFlow(false) + private val navMicFlow = MutableStateFlow(true) private val themeFlow = MutableStateFlow(AppTheme.PHONE) val appTheme: StateFlow = themeFlow private val darkStyleFlow = MutableStateFlow(DarkStyle.BLACK) @@ -242,6 +244,9 @@ private const val KEY_CLUSTER_VIDEO = "cluster_video_enabled" /** The home screen's player sits left of the map instead of right of it. */ val playerLeft: StateFlow = playerLeftFlow + /** The assistant's mic button in the nav bar. Off hides only the button: the car's voice key still works. */ + val navMic: StateFlow = navMicFlow + /** Lyrics from BetterLyrics and KuGou as well as LRCLIB; off sends song details to LRCLIB only. */ val scale: StateFlow = scaleFlow @@ -397,6 +402,7 @@ private const val KEY_CLUSTER_VIDEO = "cluster_video_enabled" autoplayFlow.value = AppSettings.getString(app, KEY_AUTOPLAY, "false") == "true" playerTitleFlow.value = AppSettings.getString(app, KEY_PLAYER_TITLE, "false") == "true" playerLeftFlow.value = AppSettings.getString(app, KEY_PLAYER_LEFT, "false") == "true" + navMicFlow.value = AppSettings.getString(app, KEY_NAV_MIC, "true") == "true" pipeAudioFlow.value = AppSettings.getString(app, KEY_PIPE_AUDIO, "true") == "true" // Until the driver sets it, on for USB audio and off for Bluetooth, where the map app's // own voice already reaches the car. @@ -483,6 +489,11 @@ private const val KEY_CLUSTER_VIDEO = "cluster_video_enabled" AppSettings.putString(app, KEY_PLAYER_TITLE, on.toString()) } + fun setNavMic(on: Boolean) { + navMicFlow.value = on + AppSettings.putString(app, KEY_NAV_MIC, on.toString()) + } + fun setPlayerLeft(on: Boolean) { playerLeftFlow.value = on AppSettings.putString(app, KEY_PLAYER_LEFT, on.toString()) diff --git a/gearslip/src/main/java/app/seb3thehacker/gearslip/car/CarSettingsScreen.kt b/gearslip/src/main/java/app/seb3thehacker/gearslip/car/CarSettingsScreen.kt index f87d3fc..b0d8f41 100644 --- a/gearslip/src/main/java/app/seb3thehacker/gearslip/car/CarSettingsScreen.kt +++ b/gearslip/src/main/java/app/seb3thehacker/gearslip/car/CarSettingsScreen.kt @@ -69,6 +69,7 @@ fun CarSettingsScreen() { val autoplay by CarSettings.autoplay.collectAsState() val playerTitle by CarSettings.playerTitle.collectAsState() val playerLeft by CarSettings.playerLeft.collectAsState() + val navMic by CarSettings.navMic.collectAsState() val theme by CarSettings.appTheme.collectAsState() val uiTheme by CarSettings.uiTheme.collectAsState() val darkStyle by CarSettings.darkStyle.collectAsState() @@ -186,6 +187,9 @@ fun CarSettingsScreen() { navBar, ) { CarSettings.setNavBarMode(it) } } + item { + SwitchRow(stringResource(R.string.car_nav_mic), stringResource(R.string.car_nav_mic_note), navMic) { CarSettings.setNavMic(it) } + } item { ChoiceRow( stringResource(R.string.car_player_nav_bar), diff --git a/gearslip/src/main/java/app/seb3thehacker/gearslip/ui/HomeCarSettings.kt b/gearslip/src/main/java/app/seb3thehacker/gearslip/ui/HomeCarSettings.kt index e1609c5..6e8a5b0 100644 --- a/gearslip/src/main/java/app/seb3thehacker/gearslip/ui/HomeCarSettings.kt +++ b/gearslip/src/main/java/app/seb3thehacker/gearslip/ui/HomeCarSettings.kt @@ -275,6 +275,7 @@ private fun GroupRows(group: CarGroup) { val autoplay by CarSettings.autoplay.collectAsState() val playerTitle by CarSettings.playerTitle.collectAsState() val playerLeft by CarSettings.playerLeft.collectAsState() + val navMic by CarSettings.navMic.collectAsState() val theme by CarSettings.appTheme.collectAsState() val uiTheme by CarSettings.uiTheme.collectAsState() val darkStyle by CarSettings.darkStyle.collectAsState() @@ -318,6 +319,8 @@ private fun GroupRows(group: CarGroup) { CarGroup.NAV_BAR -> { Choice(stringResource(R.string.car_nav_bar), navBarChoices(), navBar, CarSettings::setNavBarMode) SettingsDivider() + Toggle(stringResource(R.string.car_nav_mic), navMic, CarSettings::setNavMic, note = stringResource(R.string.car_nav_mic_note)) + SettingsDivider() Choice(stringResource(R.string.car_player_nav_bar), listOf(false to stringResource(R.string.car_skip_buttons), true to stringResource(R.string.car_song_title)), playerTitle, CarSettings::setPlayerTitle) SettingsDivider() Choice(stringResource(R.string.car_player_beside_map), listOf(false to stringResource(R.string.car_right), true to stringResource(R.string.car_left)), playerLeft, CarSettings::setPlayerLeft, note = stringResource(R.string.car_player_beside_map_note)) diff --git a/gearslip/src/main/res/values-ar/strings.xml b/gearslip/src/main/res/values-ar/strings.xml index 9e4c747..51a3b4d 100644 --- a/gearslip/src/main/res/values-ar/strings.xml +++ b/gearslip/src/main/res/values-ar/strings.xml @@ -980,4 +980,6 @@ صفحة البدء في Gearslip الإعلانات محظورة الإعلانات غير محظورة + زر الميكروفون + زر المساعد في شريط التنقل. يعمل زر الصوت في السيارة في كل الأحوال. diff --git a/gearslip/src/main/res/values-cs/strings.xml b/gearslip/src/main/res/values-cs/strings.xml index 4dd5ebe..30417d0 100644 --- a/gearslip/src/main/res/values-cs/strings.xml +++ b/gearslip/src/main/res/values-cs/strings.xml @@ -960,4 +960,6 @@ Úvodní stránka Gearslip Reklamy blokovány Reklamy neblokovány + Tlačítko mikrofonu + Tlačítko asistenta na navigační liště. Hlasové tlačítko auta funguje tak jako tak. diff --git a/gearslip/src/main/res/values-de/strings.xml b/gearslip/src/main/res/values-de/strings.xml index 0769cc0..506845a 100644 --- a/gearslip/src/main/res/values-de/strings.xml +++ b/gearslip/src/main/res/values-de/strings.xml @@ -822,4 +822,6 @@ Gearslip-Startseite Werbung blockiert Werbung nicht blockiert + Mikrofontaste + Die Assistent-Taste in der Navigationsleiste. Die Sprachtaste des Autos funktioniert so oder so. diff --git a/gearslip/src/main/res/values-es/strings.xml b/gearslip/src/main/res/values-es/strings.xml index b7e2303..aab9688 100644 --- a/gearslip/src/main/res/values-es/strings.xml +++ b/gearslip/src/main/res/values-es/strings.xml @@ -824,4 +824,6 @@ Inicio de Gearslip Anuncios bloqueados Anuncios sin bloquear + Botón del micrófono + El botón del asistente en la barra de navegación. El botón de voz del coche funciona igualmente. diff --git a/gearslip/src/main/res/values-fr/strings.xml b/gearslip/src/main/res/values-fr/strings.xml index de29283..45b5ec7 100644 --- a/gearslip/src/main/res/values-fr/strings.xml +++ b/gearslip/src/main/res/values-fr/strings.xml @@ -950,4 +950,6 @@ Page d’accueil Gearslip Pubs bloquées Pubs non bloquées + Bouton micro + Le bouton de l’assistant dans la barre de navigation. Le bouton vocal de la voiture fonctionne dans tous les cas. diff --git a/gearslip/src/main/res/values-it/strings.xml b/gearslip/src/main/res/values-it/strings.xml index 982b4c5..1772eed 100644 --- a/gearslip/src/main/res/values-it/strings.xml +++ b/gearslip/src/main/res/values-it/strings.xml @@ -950,4 +950,6 @@ Pagina iniziale Gearslip Pubblicità bloccata Pubblicità non bloccata + Pulsante microfono + Il pulsante dell’assistente nella barra di navigazione. Il tasto vocale dell’auto funziona comunque. diff --git a/gearslip/src/main/res/values-ja/strings.xml b/gearslip/src/main/res/values-ja/strings.xml index 76545ba..cd1fa35 100644 --- a/gearslip/src/main/res/values-ja/strings.xml +++ b/gearslip/src/main/res/values-ja/strings.xml @@ -930,4 +930,6 @@ Gearslip スタートページ 広告をブロック中 広告をブロックしない + マイクボタン + ナビゲーションバーのアシスタントボタンです。車の音声ボタンはどちらでも使えます。 diff --git a/gearslip/src/main/res/values-ko/strings.xml b/gearslip/src/main/res/values-ko/strings.xml index beb28dc..535a5ae 100644 --- a/gearslip/src/main/res/values-ko/strings.xml +++ b/gearslip/src/main/res/values-ko/strings.xml @@ -930,4 +930,6 @@ Gearslip 시작 페이지 광고 차단 중 광고 차단 안 함 + 마이크 버튼 + 내비게이션 바의 어시스턴트 버튼입니다. 차량의 음성 버튼은 어느 쪽이든 작동합니다. diff --git a/gearslip/src/main/res/values-nl/strings.xml b/gearslip/src/main/res/values-nl/strings.xml index dd67cde..e3b163a 100644 --- a/gearslip/src/main/res/values-nl/strings.xml +++ b/gearslip/src/main/res/values-nl/strings.xml @@ -940,4 +940,6 @@ Gearslip-startpagina Advertenties geblokkeerd Advertenties niet geblokkeerd + Microfoonknop + De assistentknop in de navigatiebalk. De spraakknop van de auto werkt hoe dan ook. diff --git a/gearslip/src/main/res/values-pl/strings.xml b/gearslip/src/main/res/values-pl/strings.xml index e61a9d0..3e0f57d 100644 --- a/gearslip/src/main/res/values-pl/strings.xml +++ b/gearslip/src/main/res/values-pl/strings.xml @@ -960,4 +960,6 @@ Strona startowa Gearslip Reklamy blokowane Reklamy nieblokowane + Przycisk mikrofonu + Przycisk asystenta na pasku nawigacji. Przycisk głosowy w samochodzie działa niezależnie od tego. diff --git a/gearslip/src/main/res/values-pt-rBR/strings.xml b/gearslip/src/main/res/values-pt-rBR/strings.xml index 413689e..4366b16 100644 --- a/gearslip/src/main/res/values-pt-rBR/strings.xml +++ b/gearslip/src/main/res/values-pt-rBR/strings.xml @@ -950,4 +950,6 @@ Página inicial do Gearslip Anúncios bloqueados Anúncios não bloqueados + Botão do microfone + O botão do assistente na barra de navegação. O botão de voz do carro funciona de qualquer jeito. diff --git a/gearslip/src/main/res/values-ro/strings.xml b/gearslip/src/main/res/values-ro/strings.xml index 2a4e939..23ee49a 100644 --- a/gearslip/src/main/res/values-ro/strings.xml +++ b/gearslip/src/main/res/values-ro/strings.xml @@ -832,4 +832,6 @@ Pagina de start Gearslip Reclame blocate Reclame neblocate + Butonul microfonului + Butonul asistentului din bara de navigare. Butonul vocal al mașinii funcționează oricum. diff --git a/gearslip/src/main/res/values-ru/strings.xml b/gearslip/src/main/res/values-ru/strings.xml index 591ed08..e88661f 100644 --- a/gearslip/src/main/res/values-ru/strings.xml +++ b/gearslip/src/main/res/values-ru/strings.xml @@ -960,4 +960,6 @@ Стартовая страница Gearslip Реклама блокируется Реклама не блокируется + Кнопка микрофона + Кнопка ассистента на панели навигации. Голосовая кнопка машины работает в любом случае. diff --git a/gearslip/src/main/res/values-sv/strings.xml b/gearslip/src/main/res/values-sv/strings.xml index 29b940e..5977320 100644 --- a/gearslip/src/main/res/values-sv/strings.xml +++ b/gearslip/src/main/res/values-sv/strings.xml @@ -940,4 +940,6 @@ Gearslips startsida Annonser blockeras Annonser blockeras inte + Mikrofonknapp + Assistentens knapp i navigeringsfältet. Bilens egen röstknapp fungerar oavsett. diff --git a/gearslip/src/main/res/values-tr/strings.xml b/gearslip/src/main/res/values-tr/strings.xml index 936d584..21a20fc 100644 --- a/gearslip/src/main/res/values-tr/strings.xml +++ b/gearslip/src/main/res/values-tr/strings.xml @@ -940,4 +940,6 @@ Gearslip başlangıç sayfası Reklamlar engelleniyor Reklamlar engellenmiyor + Mikrofon düğmesi + Gezinme çubuğundaki asistan düğmesi. Aracın kendi ses düğmesi her durumda çalışır. diff --git a/gearslip/src/main/res/values-uk/strings.xml b/gearslip/src/main/res/values-uk/strings.xml index 50ab85a..3ec17de 100644 --- a/gearslip/src/main/res/values-uk/strings.xml +++ b/gearslip/src/main/res/values-uk/strings.xml @@ -960,4 +960,6 @@ Стартова сторінка Gearslip Реклама блокується Реклама не блокується + Кнопка мікрофона + Кнопка асистента на панелі навігації. Голосова кнопка авто працює в будь-якому разі. diff --git a/gearslip/src/main/res/values-zh-rCN/strings.xml b/gearslip/src/main/res/values-zh-rCN/strings.xml index 958d44e..102c6a6 100644 --- a/gearslip/src/main/res/values-zh-rCN/strings.xml +++ b/gearslip/src/main/res/values-zh-rCN/strings.xml @@ -930,4 +930,6 @@ Gearslip 起始页 拦截广告 不拦截广告 + 麦克风按钮 + 导航栏中的助理按钮。车辆自带的语音按钮始终可用。 diff --git a/gearslip/src/main/res/values/strings.xml b/gearslip/src/main/res/values/strings.xml index 25650fc..e1a8d7f 100644 --- a/gearslip/src/main/res/values/strings.xml +++ b/gearslip/src/main/res/values/strings.xml @@ -989,4 +989,6 @@ Gearslip start page Ads blocked Ads not blocked + Mic button + The assistant\'s button in the nav bar. The car\'s own voice button works either way.