From ea45bf994bc96398cd86ffcd72e9e1da2c278721 Mon Sep 17 00:00:00 2001 From: Seb3thehacker Date: Sat, 24 Oct 2026 13:53:05 -0700 Subject: [PATCH] car: setting to put the home screen's player left of the map --- .../app/seb3thehacker/gearslip/car/CarHomeScreen.kt | 8 ++++++-- .../app/seb3thehacker/gearslip/car/CarSettings.kt | 11 +++++++++++ .../seb3thehacker/gearslip/car/CarSettingsScreen.kt | 9 +++++++++ 3 files changed, 26 insertions(+), 2 deletions(-) diff --git a/gearslip/src/main/java/app/seb3thehacker/gearslip/car/CarHomeScreen.kt b/gearslip/src/main/java/app/seb3thehacker/gearslip/car/CarHomeScreen.kt index c157ebe..a2a7943 100644 --- a/gearslip/src/main/java/app/seb3thehacker/gearslip/car/CarHomeScreen.kt +++ b/gearslip/src/main/java/app/seb3thehacker/gearslip/car/CarHomeScreen.kt @@ -93,9 +93,14 @@ fun CarHome() { if (onHome) seenHome[0] = true } val splitScreen = phase == CarMedia.Phase.READY && now.isActive && panel != SidePanel.NONE + val playerLeft by CarSettings.playerLeft.collectAsStateWithLifecycle() // No padding anywhere, split screen or not: the player sits flush against the map. Row(Modifier.fillMaxSize()) { + val side = Modifier.weight(1f).fillMaxHeight().padding(bottom = LocalNavBarInset.current) + if (splitScreen && playerLeft) { + if (panel == SidePanel.LYRICS) SideLyrics(now, side) else DockedPlayer(now, side) + } Box( Modifier .weight(if (splitScreen) 2.1f else 1f) @@ -103,8 +108,7 @@ fun CarHome() { ) { MapPane(navStatus, frame) } - if (splitScreen) { - val side = Modifier.weight(1f).fillMaxHeight().padding(bottom = LocalNavBarInset.current) + if (splitScreen && !playerLeft) { if (panel == SidePanel.LYRICS) SideLyrics(now, side) else DockedPlayer(now, side) } } 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 5b31c8c..128e062 100644 --- a/gearslip/src/main/java/app/seb3thehacker/gearslip/car/CarSettings.kt +++ b/gearslip/src/main/java/app/seb3thehacker/gearslip/car/CarSettings.kt @@ -63,6 +63,7 @@ private const val KEY_LOCATION_WARNING = "car_location_warning" private const val KEY_LAST_MEDIA = "car_last_media" 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_THEME = "car_app_theme" private const val KEY_UI_THEME = "car_ui_theme" private const val KEY_PINNED = "car_pinned_apps" @@ -100,6 +101,7 @@ private const val KEY_LOCATION_WARNING = "car_location_warning" private val lastMediaFlow = MutableStateFlow(null) private val autoplayFlow = MutableStateFlow(false) private val playerTitleFlow = MutableStateFlow(false) + private val playerLeftFlow = MutableStateFlow(false) private val themeFlow = MutableStateFlow(AppTheme.PHONE) val appTheme: StateFlow = themeFlow private val uiThemeFlow = MutableStateFlow(GsThemes.default.id) @@ -215,6 +217,9 @@ private const val KEY_LOCATION_WARNING = "car_location_warning" */ val playerTitle: StateFlow = playerTitleFlow + /** The home screen's player sits left of the map instead of right of it. */ + val playerLeft: StateFlow = playerLeftFlow + val scale: StateFlow = scaleFlow val openOnConnect: StateFlow = openFlow val nightMode: StateFlow = nightFlow @@ -292,6 +297,7 @@ private const val KEY_LOCATION_WARNING = "car_location_warning" uiThemeFlow.value = AppSettings.getString(app, KEY_UI_THEME, GsThemes.default.id) 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" 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. @@ -362,6 +368,11 @@ private const val KEY_LOCATION_WARNING = "car_location_warning" AppSettings.putString(app, KEY_PLAYER_TITLE, on.toString()) } + fun setPlayerLeft(on: Boolean) { + playerLeftFlow.value = on + AppSettings.putString(app, KEY_PLAYER_LEFT, on.toString()) + } + fun setAutoplay(on: Boolean) { autoplayFlow.value = on AppSettings.putString(app, KEY_AUTOPLAY, 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 419d02d..b0f97d4 100644 --- a/gearslip/src/main/java/app/seb3thehacker/gearslip/car/CarSettingsScreen.kt +++ b/gearslip/src/main/java/app/seb3thehacker/gearslip/car/CarSettingsScreen.kt @@ -63,6 +63,7 @@ fun CarSettingsScreen() { val locationWarning by CarSettings.locationWarning.collectAsState() val autoplay by CarSettings.autoplay.collectAsState() val playerTitle by CarSettings.playerTitle.collectAsState() + val playerLeft by CarSettings.playerLeft.collectAsState() val theme by CarSettings.appTheme.collectAsState() val uiTheme by CarSettings.uiTheme.collectAsState() val experimentalFeatures by CarSettings.experimentalFeaturesEnabled.collectAsState() @@ -172,6 +173,14 @@ fun CarSettingsScreen() { ) { CarSettings.setPlayerTitle(it) } } + item { + ChoiceRow( + "Player beside the map", + listOf(false to "Right", true to "Left"), + playerLeft, + ) { CarSettings.setPlayerLeft(it) } + } + item { ChoiceRow( "Autoplay on connect",