The nav bar's mic button can be hidden; the car's voice key still works

This commit is contained in:
Seb3thehacker committed 2026-11-06 14:31:54 -08:00
1 parent 6822abba90
commit 3cf41d3fc2
22 files changed
+57

No files matched your search

@@ -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 // 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. // cover's glow carries on behind it.
val overPlayer = navigator.current == CarScreen.Media 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) { 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)) { BoxWithConstraints(Modifier.fillMaxWidth().height(NAV_BAR_HEIGHT).padding(horizontal = 10.dp)) {
Row(Modifier.fillMaxSize(), verticalAlignment = Alignment.CenterVertically) { Row(Modifier.fillMaxSize(), verticalAlignment = Alignment.CenterVertically) {
@@ -180,8 +181,10 @@ internal fun CarNavBar(navigator: CarNavigator) {
NavHomeButton(navigator, entries, running) NavHomeButton(navigator, entries, running)
Spacer(Modifier.width(6.dp)) Spacer(Modifier.width(6.dp))
NavItem(MediaIcons.Apps, navigator.current == CarScreen.Apps) { navigator.apps() } NavItem(MediaIcons.Apps, navigator.current == CarScreen.Apps) { navigator.apps() }
if (navMic) {
Spacer(Modifier.width(6.dp)) Spacer(Modifier.width(6.dp))
NavAssistantIcon() NavAssistantIcon()
}
// Pinned shortcuts, then whatever else is open right now. A pinned app that's also // 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. // open stays in its pinned spot, marked with a dot, instead of showing up twice.
@@ -68,6 +68,7 @@ private const val KEY_LOCATION_WARNING = "car_location_warning"
private const val KEY_AUTOPLAY = "car_autoplay" private const val KEY_AUTOPLAY = "car_autoplay"
private const val KEY_PLAYER_TITLE = "car_player_title" private const val KEY_PLAYER_TITLE = "car_player_title"
private const val KEY_PLAYER_LEFT = "car_player_left" 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_THEME = "car_app_theme"
private const val KEY_UI_THEME = "car_ui_theme" private const val KEY_UI_THEME = "car_ui_theme"
private const val KEY_DARK_STYLE = "car_dark_style" 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 autoplayFlow = MutableStateFlow(false)
private val playerTitleFlow = MutableStateFlow(false) private val playerTitleFlow = MutableStateFlow(false)
private val playerLeftFlow = MutableStateFlow(false) private val playerLeftFlow = MutableStateFlow(false)
private val navMicFlow = MutableStateFlow(true)
private val themeFlow = MutableStateFlow(AppTheme.PHONE) private val themeFlow = MutableStateFlow(AppTheme.PHONE)
val appTheme: StateFlow<AppTheme> = themeFlow val appTheme: StateFlow<AppTheme> = themeFlow
private val darkStyleFlow = MutableStateFlow(DarkStyle.BLACK) 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. */ /** The home screen's player sits left of the map instead of right of it. */
val playerLeft: StateFlow<Boolean> = playerLeftFlow val playerLeft: StateFlow<Boolean> = 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<Boolean> = navMicFlow
/** Lyrics from BetterLyrics and KuGou as well as LRCLIB; off sends song details to LRCLIB only. */ /** Lyrics from BetterLyrics and KuGou as well as LRCLIB; off sends song details to LRCLIB only. */
val scale: StateFlow<Float> = scaleFlow val scale: StateFlow<Float> = scaleFlow
@@ -397,6 +402,7 @@ private const val KEY_CLUSTER_VIDEO = "cluster_video_enabled"
autoplayFlow.value = AppSettings.getString(app, KEY_AUTOPLAY, "false") == "true" autoplayFlow.value = AppSettings.getString(app, KEY_AUTOPLAY, "false") == "true"
playerTitleFlow.value = AppSettings.getString(app, KEY_PLAYER_TITLE, "false") == "true" playerTitleFlow.value = AppSettings.getString(app, KEY_PLAYER_TITLE, "false") == "true"
playerLeftFlow.value = AppSettings.getString(app, KEY_PLAYER_LEFT, "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" 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 // Until the driver sets it, on for USB audio and off for Bluetooth, where the map app's
// own voice already reaches the car. // 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()) 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) { fun setPlayerLeft(on: Boolean) {
playerLeftFlow.value = on playerLeftFlow.value = on
AppSettings.putString(app, KEY_PLAYER_LEFT, on.toString()) AppSettings.putString(app, KEY_PLAYER_LEFT, on.toString())
@@ -69,6 +69,7 @@ fun CarSettingsScreen() {
val autoplay by CarSettings.autoplay.collectAsState() val autoplay by CarSettings.autoplay.collectAsState()
val playerTitle by CarSettings.playerTitle.collectAsState() val playerTitle by CarSettings.playerTitle.collectAsState()
val playerLeft by CarSettings.playerLeft.collectAsState() val playerLeft by CarSettings.playerLeft.collectAsState()
val navMic by CarSettings.navMic.collectAsState()
val theme by CarSettings.appTheme.collectAsState() val theme by CarSettings.appTheme.collectAsState()
val uiTheme by CarSettings.uiTheme.collectAsState() val uiTheme by CarSettings.uiTheme.collectAsState()
val darkStyle by CarSettings.darkStyle.collectAsState() val darkStyle by CarSettings.darkStyle.collectAsState()
@@ -186,6 +187,9 @@ fun CarSettingsScreen() {
navBar, navBar,
) { CarSettings.setNavBarMode(it) } ) { CarSettings.setNavBarMode(it) }
} }
item {
SwitchRow(stringResource(R.string.car_nav_mic), stringResource(R.string.car_nav_mic_note), navMic) { CarSettings.setNavMic(it) }
}
item { item {
ChoiceRow( ChoiceRow(
stringResource(R.string.car_player_nav_bar), stringResource(R.string.car_player_nav_bar),
@@ -275,6 +275,7 @@ private fun GroupRows(group: CarGroup) {
val autoplay by CarSettings.autoplay.collectAsState() val autoplay by CarSettings.autoplay.collectAsState()
val playerTitle by CarSettings.playerTitle.collectAsState() val playerTitle by CarSettings.playerTitle.collectAsState()
val playerLeft by CarSettings.playerLeft.collectAsState() val playerLeft by CarSettings.playerLeft.collectAsState()
val navMic by CarSettings.navMic.collectAsState()
val theme by CarSettings.appTheme.collectAsState() val theme by CarSettings.appTheme.collectAsState()
val uiTheme by CarSettings.uiTheme.collectAsState() val uiTheme by CarSettings.uiTheme.collectAsState()
val darkStyle by CarSettings.darkStyle.collectAsState() val darkStyle by CarSettings.darkStyle.collectAsState()
@@ -318,6 +319,8 @@ private fun GroupRows(group: CarGroup) {
CarGroup.NAV_BAR -> { CarGroup.NAV_BAR -> {
Choice(stringResource(R.string.car_nav_bar), navBarChoices(), navBar, CarSettings::setNavBarMode) Choice(stringResource(R.string.car_nav_bar), navBarChoices(), navBar, CarSettings::setNavBarMode)
SettingsDivider() 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) 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() 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)) 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))
@@ -980,4 +980,6 @@
<string name="browser_share_label">صفحة البدء في Gearslip</string> <string name="browser_share_label">صفحة البدء في Gearslip</string>
<string name="summary_adblock_on">الإعلانات محظورة</string> <string name="summary_adblock_on">الإعلانات محظورة</string>
<string name="summary_adblock_off">الإعلانات غير محظورة</string> <string name="summary_adblock_off">الإعلانات غير محظورة</string>
<string name="car_nav_mic">زر الميكروفون</string>
<string name="car_nav_mic_note">زر المساعد في شريط التنقل. يعمل زر الصوت في السيارة في كل الأحوال.</string>
</resources> </resources>
@@ -960,4 +960,6 @@
<string name="browser_share_label">Úvodní stránka Gearslip</string> <string name="browser_share_label">Úvodní stránka Gearslip</string>
<string name="summary_adblock_on">Reklamy blokovány</string> <string name="summary_adblock_on">Reklamy blokovány</string>
<string name="summary_adblock_off">Reklamy neblokovány</string> <string name="summary_adblock_off">Reklamy neblokovány</string>
<string name="car_nav_mic">Tlačítko mikrofonu</string>
<string name="car_nav_mic_note">Tlačítko asistenta na navigační liště. Hlasové tlačítko auta funguje tak jako tak.</string>
</resources> </resources>
@@ -822,4 +822,6 @@
<string name="browser_share_label">Gearslip-Startseite</string> <string name="browser_share_label">Gearslip-Startseite</string>
<string name="summary_adblock_on">Werbung blockiert</string> <string name="summary_adblock_on">Werbung blockiert</string>
<string name="summary_adblock_off">Werbung nicht blockiert</string> <string name="summary_adblock_off">Werbung nicht blockiert</string>
<string name="car_nav_mic">Mikrofontaste</string>
<string name="car_nav_mic_note">Die Assistent-Taste in der Navigationsleiste. Die Sprachtaste des Autos funktioniert so oder so.</string>
</resources> </resources>
@@ -824,4 +824,6 @@
<string name="browser_share_label">Inicio de Gearslip</string> <string name="browser_share_label">Inicio de Gearslip</string>
<string name="summary_adblock_on">Anuncios bloqueados</string> <string name="summary_adblock_on">Anuncios bloqueados</string>
<string name="summary_adblock_off">Anuncios sin bloquear</string> <string name="summary_adblock_off">Anuncios sin bloquear</string>
<string name="car_nav_mic">Botón del micrófono</string>
<string name="car_nav_mic_note">El botón del asistente en la barra de navegación. El botón de voz del coche funciona igualmente.</string>
</resources> </resources>
@@ -950,4 +950,6 @@
<string name="browser_share_label">Page d’accueil Gearslip</string> <string name="browser_share_label">Page d’accueil Gearslip</string>
<string name="summary_adblock_on">Pubs bloquées</string> <string name="summary_adblock_on">Pubs bloquées</string>
<string name="summary_adblock_off">Pubs non bloquées</string> <string name="summary_adblock_off">Pubs non bloquées</string>
<string name="car_nav_mic">Bouton micro</string>
<string name="car_nav_mic_note">Le bouton de l’assistant dans la barre de navigation. Le bouton vocal de la voiture fonctionne dans tous les cas.</string>
</resources> </resources>
@@ -950,4 +950,6 @@
<string name="browser_share_label">Pagina iniziale Gearslip</string> <string name="browser_share_label">Pagina iniziale Gearslip</string>
<string name="summary_adblock_on">Pubblicità bloccata</string> <string name="summary_adblock_on">Pubblicità bloccata</string>
<string name="summary_adblock_off">Pubblicità non bloccata</string> <string name="summary_adblock_off">Pubblicità non bloccata</string>
<string name="car_nav_mic">Pulsante microfono</string>
<string name="car_nav_mic_note">Il pulsante dell’assistente nella barra di navigazione. Il tasto vocale dell’auto funziona comunque.</string>
</resources> </resources>
@@ -930,4 +930,6 @@
<string name="browser_share_label">Gearslip スタートページ</string> <string name="browser_share_label">Gearslip スタートページ</string>
<string name="summary_adblock_on">広告をブロック中</string> <string name="summary_adblock_on">広告をブロック中</string>
<string name="summary_adblock_off">広告をブロックしない</string> <string name="summary_adblock_off">広告をブロックしない</string>
<string name="car_nav_mic">マイクボタン</string>
<string name="car_nav_mic_note">ナビゲーションバーのアシスタントボタンです。車の音声ボタンはどちらでも使えます。</string>
</resources> </resources>
@@ -930,4 +930,6 @@
<string name="browser_share_label">Gearslip 시작 페이지</string> <string name="browser_share_label">Gearslip 시작 페이지</string>
<string name="summary_adblock_on">광고 차단 중</string> <string name="summary_adblock_on">광고 차단 중</string>
<string name="summary_adblock_off">광고 차단 안 함</string> <string name="summary_adblock_off">광고 차단 안 함</string>
<string name="car_nav_mic">마이크 버튼</string>
<string name="car_nav_mic_note">내비게이션 바의 어시스턴트 버튼입니다. 차량의 음성 버튼은 어느 쪽이든 작동합니다.</string>
</resources> </resources>
@@ -940,4 +940,6 @@
<string name="browser_share_label">Gearslip-startpagina</string> <string name="browser_share_label">Gearslip-startpagina</string>
<string name="summary_adblock_on">Advertenties geblokkeerd</string> <string name="summary_adblock_on">Advertenties geblokkeerd</string>
<string name="summary_adblock_off">Advertenties niet geblokkeerd</string> <string name="summary_adblock_off">Advertenties niet geblokkeerd</string>
<string name="car_nav_mic">Microfoonknop</string>
<string name="car_nav_mic_note">De assistentknop in de navigatiebalk. De spraakknop van de auto werkt hoe dan ook.</string>
</resources> </resources>
@@ -960,4 +960,6 @@
<string name="browser_share_label">Strona startowa Gearslip</string> <string name="browser_share_label">Strona startowa Gearslip</string>
<string name="summary_adblock_on">Reklamy blokowane</string> <string name="summary_adblock_on">Reklamy blokowane</string>
<string name="summary_adblock_off">Reklamy nieblokowane</string> <string name="summary_adblock_off">Reklamy nieblokowane</string>
<string name="car_nav_mic">Przycisk mikrofonu</string>
<string name="car_nav_mic_note">Przycisk asystenta na pasku nawigacji. Przycisk głosowy w samochodzie działa niezależnie od tego.</string>
</resources> </resources>
@@ -950,4 +950,6 @@
<string name="browser_share_label">Página inicial do Gearslip</string> <string name="browser_share_label">Página inicial do Gearslip</string>
<string name="summary_adblock_on">Anúncios bloqueados</string> <string name="summary_adblock_on">Anúncios bloqueados</string>
<string name="summary_adblock_off">Anúncios não bloqueados</string> <string name="summary_adblock_off">Anúncios não bloqueados</string>
<string name="car_nav_mic">Botão do microfone</string>
<string name="car_nav_mic_note">O botão do assistente na barra de navegação. O botão de voz do carro funciona de qualquer jeito.</string>
</resources> </resources>
@@ -832,4 +832,6 @@
<string name="browser_share_label">Pagina de start Gearslip</string> <string name="browser_share_label">Pagina de start Gearslip</string>
<string name="summary_adblock_on">Reclame blocate</string> <string name="summary_adblock_on">Reclame blocate</string>
<string name="summary_adblock_off">Reclame neblocate</string> <string name="summary_adblock_off">Reclame neblocate</string>
<string name="car_nav_mic">Butonul microfonului</string>
<string name="car_nav_mic_note">Butonul asistentului din bara de navigare. Butonul vocal al mașinii funcționează oricum.</string>
</resources> </resources>
@@ -960,4 +960,6 @@
<string name="browser_share_label">Стартовая страница Gearslip</string> <string name="browser_share_label">Стартовая страница Gearslip</string>
<string name="summary_adblock_on">Реклама блокируется</string> <string name="summary_adblock_on">Реклама блокируется</string>
<string name="summary_adblock_off">Реклама не блокируется</string> <string name="summary_adblock_off">Реклама не блокируется</string>
<string name="car_nav_mic">Кнопка микрофона</string>
<string name="car_nav_mic_note">Кнопка ассистента на панели навигации. Голосовая кнопка машины работает в любом случае.</string>
</resources> </resources>
@@ -940,4 +940,6 @@
<string name="browser_share_label">Gearslips startsida</string> <string name="browser_share_label">Gearslips startsida</string>
<string name="summary_adblock_on">Annonser blockeras</string> <string name="summary_adblock_on">Annonser blockeras</string>
<string name="summary_adblock_off">Annonser blockeras inte</string> <string name="summary_adblock_off">Annonser blockeras inte</string>
<string name="car_nav_mic">Mikrofonknapp</string>
<string name="car_nav_mic_note">Assistentens knapp i navigeringsfältet. Bilens egen röstknapp fungerar oavsett.</string>
</resources> </resources>
@@ -940,4 +940,6 @@
<string name="browser_share_label">Gearslip başlangıç sayfası</string> <string name="browser_share_label">Gearslip başlangıç sayfası</string>
<string name="summary_adblock_on">Reklamlar engelleniyor</string> <string name="summary_adblock_on">Reklamlar engelleniyor</string>
<string name="summary_adblock_off">Reklamlar engellenmiyor</string> <string name="summary_adblock_off">Reklamlar engellenmiyor</string>
<string name="car_nav_mic">Mikrofon düğmesi</string>
<string name="car_nav_mic_note">Gezinme çubuğundaki asistan düğmesi. Aracın kendi ses düğmesi her durumda çalışır.</string>
</resources> </resources>
@@ -960,4 +960,6 @@
<string name="browser_share_label">Стартова сторінка Gearslip</string> <string name="browser_share_label">Стартова сторінка Gearslip</string>
<string name="summary_adblock_on">Реклама блокується</string> <string name="summary_adblock_on">Реклама блокується</string>
<string name="summary_adblock_off">Реклама не блокується</string> <string name="summary_adblock_off">Реклама не блокується</string>
<string name="car_nav_mic">Кнопка мікрофона</string>
<string name="car_nav_mic_note">Кнопка асистента на панелі навігації. Голосова кнопка авто працює в будь-якому разі.</string>
</resources> </resources>
@@ -930,4 +930,6 @@
<string name="browser_share_label">Gearslip 起始页</string> <string name="browser_share_label">Gearslip 起始页</string>
<string name="summary_adblock_on">拦截广告</string> <string name="summary_adblock_on">拦截广告</string>
<string name="summary_adblock_off">不拦截广告</string> <string name="summary_adblock_off">不拦截广告</string>
<string name="car_nav_mic">麦克风按钮</string>
<string name="car_nav_mic_note">导航栏中的助理按钮。车辆自带的语音按钮始终可用。</string>
</resources> </resources>
+2
View File
@@ -989,4 +989,6 @@
<string name="browser_share_label">Gearslip start page</string> <string name="browser_share_label">Gearslip start page</string>
<string name="summary_adblock_on">Ads blocked</string> <string name="summary_adblock_on">Ads blocked</string>
<string name="summary_adblock_off">Ads not blocked</string> <string name="summary_adblock_off">Ads not blocked</string>
<string name="car_nav_mic">Mic button</string>
<string name="car_nav_mic_note">The assistant\'s button in the nav bar. The car\'s own voice button works either way.</string>
</resources> </resources>