From f139ac48c44e3b5807c8b51e5e344cd7e9de0e2e Mon Sep 17 00:00:00 2001 From: Seb3thehacker Date: Fri, 6 Nov 2026 13:30:29 -0800 Subject: [PATCH] Car display density takes any value from 60 to 480 DPI, typed in under Custom --- .../seb3thehacker/gearslip/car/CarSettings.kt | 4 +- .../gearslip/ui/HomeCarSettings.kt | 56 ++++++++++++++++++- gearslip/src/main/res/values-ar/strings.xml | 4 ++ gearslip/src/main/res/values-cs/strings.xml | 4 ++ gearslip/src/main/res/values-de/strings.xml | 4 ++ gearslip/src/main/res/values-es/strings.xml | 4 ++ gearslip/src/main/res/values-fr/strings.xml | 4 ++ gearslip/src/main/res/values-it/strings.xml | 4 ++ gearslip/src/main/res/values-ja/strings.xml | 4 ++ gearslip/src/main/res/values-ko/strings.xml | 4 ++ gearslip/src/main/res/values-nl/strings.xml | 4 ++ gearslip/src/main/res/values-pl/strings.xml | 4 ++ .../src/main/res/values-pt-rBR/strings.xml | 4 ++ gearslip/src/main/res/values-ro/strings.xml | 4 ++ gearslip/src/main/res/values-ru/strings.xml | 4 ++ gearslip/src/main/res/values-sv/strings.xml | 4 ++ gearslip/src/main/res/values-tr/strings.xml | 4 ++ gearslip/src/main/res/values-uk/strings.xml | 4 ++ .../src/main/res/values-zh-rCN/strings.xml | 4 ++ gearslip/src/main/res/values/strings.xml | 4 ++ 20 files changed, 129 insertions(+), 3 deletions(-) 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 b0befa2..0203938 100644 --- a/gearslip/src/main/java/app/seb3thehacker/gearslip/car/CarSettings.kt +++ b/gearslip/src/main/java/app/seb3thehacker/gearslip/car/CarSettings.kt @@ -249,6 +249,8 @@ private const val KEY_CLUSTER_VIDEO = "cluster_video_enabled" /** [carDensity] when it leaves the choice to the car. */ const val DENSITY_FROM_CAR = 0 val DENSITIES = listOf(160, 180, 200, 220, 240) + /** The range a typed-in density may take (issue #82): small enough for more on screen, big enough to read. */ + val CUSTOM_DENSITIES = 60..480 /** An absolute DPI for the car UI and its apps; the video's resolution doesn't change with it. */ val carDensity: StateFlow = carDensityFlow @@ -381,7 +383,7 @@ private const val KEY_CLUSTER_VIDEO = "cluster_video_enabled" fun init(context: Context) { app = context.applicationContext scaleFlow.value = AppSettings.getString(app, KEY_SCALE, "1.0").toFloatOrNull() ?: 1f - carDensityFlow.value = AppSettings.getString(app, KEY_DENSITY, "").toIntOrNull()?.takeIf { it in DENSITIES } ?: DENSITY_FROM_CAR + carDensityFlow.value = AppSettings.getString(app, KEY_DENSITY, "").toIntOrNull()?.takeIf { it in DENSITIES || it in CUSTOM_DENSITIES } ?: DENSITY_FROM_CAR openFlow.value = AppSettings.getString(app, KEY_OPEN, HOME) lastNavFlow.value = AppSettings.getString(app, KEY_LAST_NAV, "").ifEmpty { null } lastMediaFlow.value = AppSettings.getString(app, KEY_LAST_MEDIA, "").ifEmpty { null } 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 57fc0c1..59f59ac 100644 --- a/gearslip/src/main/java/app/seb3thehacker/gearslip/ui/HomeCarSettings.kt +++ b/gearslip/src/main/java/app/seb3thehacker/gearslip/ui/HomeCarSettings.kt @@ -21,6 +21,11 @@ import androidx.compose.material.icons.automirrored.filled.ArrowBack import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.verticalScroll import androidx.compose.material3.Checkbox +import androidx.compose.ui.text.input.KeyboardType +import androidx.compose.foundation.text.KeyboardOptions +import androidx.compose.material3.TextButton +import androidx.compose.material3.OutlinedTextField +import androidx.compose.material3.AlertDialog import androidx.compose.material3.DropdownMenu import androidx.compose.material3.DropdownMenuItem import androidx.compose.material3.Icon @@ -65,8 +70,44 @@ enum class CarGroup(@param:StringRes val title: Int) { @Composable private fun sizeChoices() = listOf(1f to stringResource(R.string.choice_size_normal), 1.25f to stringResource(R.string.choice_size_large), 1.5f to stringResource(R.string.choice_size_xlarge)) + +/** Marks the menu's Custom entry, which opens [CustomDensityDialog] instead of choosing. */ +private const val DENSITY_CUSTOM = -1 + +/** The presets, a typed-in value when that's what's set, and Custom to type one. */ @Composable -private fun densityChoices() = listOf(CarSettings.DENSITY_FROM_CAR to stringResource(R.string.choice_density_car)) + CarSettings.DENSITIES.map { it to stringResource(R.string.choice_density_dpi, it) } +private fun densityChoices(current: Int): List> { + val values = CarSettings.DENSITIES.let { if (current != CarSettings.DENSITY_FROM_CAR && current !in it) (it + current).sorted() else it } + return listOf(CarSettings.DENSITY_FROM_CAR to stringResource(R.string.choice_density_car)) + + values.map { it to stringResource(R.string.choice_density_dpi, it) } + + (DENSITY_CUSTOM to stringResource(R.string.choice_density_custom)) +} + +/** Types in any density in [CarSettings.CUSTOM_DENSITIES] (issue #82). */ +@Composable +private fun CustomDensityDialog(current: Int, onDismiss: () -> Unit, onSave: (Int) -> Unit) { + var text by remember { mutableStateOf(current.takeIf { it != CarSettings.DENSITY_FROM_CAR }?.toString().orEmpty()) } + val value = text.toIntOrNull()?.takeIf { it in CarSettings.CUSTOM_DENSITIES } + val range = CarSettings.CUSTOM_DENSITIES + AlertDialog( + onDismissRequest = onDismiss, + title = { Text(stringResource(R.string.density_custom_title)) }, + text = { + Column(verticalArrangement = Arrangement.spacedBy(12.dp)) { + Text(stringResource(R.string.density_custom_note, range.first, range.last)) + OutlinedTextField( + text, { text = it.filter(Char::isDigit).take(3) }, + label = { Text(stringResource(R.string.density_custom_label)) }, + singleLine = true, + isError = text.isNotEmpty() && value == null, + keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number), + ) + } + }, + confirmButton = { TextButton(onClick = { value?.let(onSave) }, enabled = value != null) { Text(stringResource(R.string.save)) } }, + dismissButton = { TextButton(onClick = onDismiss) { Text(stringResource(R.string.cancel)) } }, + ) +} @Composable private fun themeChoices() = listOf(AppTheme.PHONE to stringResource(R.string.choice_theme_phone), AppTheme.LIGHT to stringResource(R.string.choice_theme_light), AppTheme.DARK to stringResource(R.string.choice_theme_dark)) @Composable @@ -243,7 +284,18 @@ private fun GroupRows(group: CarGroup) { SettingsDivider() Choice(stringResource(R.string.car_size), sizeChoices(), scale, CarSettings::setScale) SettingsDivider() - Choice(stringResource(R.string.car_density), densityChoices(), density, CarSettings::setCarDensity, note = stringResource(R.string.car_density_note)) + var customDensity by remember { mutableStateOf(false) } + Choice( + stringResource(R.string.car_density), densityChoices(density), density, + { if (it == DENSITY_CUSTOM) customDensity = true else CarSettings.setCarDensity(it) }, + note = stringResource(R.string.car_density_note), + ) + if (customDensity) { + CustomDensityDialog(density, onDismiss = { customDensity = false }) { + CarSettings.setCarDensity(it) + customDensity = false + } + } SettingsDivider() Choice(stringResource(R.string.car_app_theme), themeChoices(), theme, CarSettings::setAppTheme) SettingsDivider() diff --git a/gearslip/src/main/res/values-ar/strings.xml b/gearslip/src/main/res/values-ar/strings.xml index 73cb211..aa4d435 100644 --- a/gearslip/src/main/res/values-ar/strings.xml +++ b/gearslip/src/main/res/values-ar/strings.xml @@ -889,6 +889,7 @@ وصّل سيارة لحفظ هذا الضبط لها. من السيارة %1$d DPI + مخصص… فائتة · %1$s لا توجد مكالمات حديثة. الأخيرة @@ -944,4 +945,7 @@ لحظة… جرّب “navigate home” أو “play” ثم اسم فنان. قل “help” للمزيد. منح الإذن + كثافة مخصصة + DPI + أي قيمة من %1$d إلى %2$d. القيمة الأقل تُظهر محتوى أكثر على الشاشة، والأعلى تُكبّر كل شيء. diff --git a/gearslip/src/main/res/values-cs/strings.xml b/gearslip/src/main/res/values-cs/strings.xml index 37b4162..febb329 100644 --- a/gearslip/src/main/res/values-cs/strings.xml +++ b/gearslip/src/main/res/values-cs/strings.xml @@ -873,6 +873,7 @@ Připojte auto, abyste pro něj tuto úpravu uložili. Z auta %1$d DPI + Vlastní… Zmeškaný · %1$s Žádné nedávné hovory. Nedávné @@ -924,4 +925,7 @@ Okamžik… Zkuste „navigate home“ nebo „play“ a interpreta. Pro víc řekněte „help“. Povolit + Vlastní hustota + DPI + Libovolná hodnota od %1$d do %2$d. Nižší vejde víc na obrazovku, vyšší vše zvětší. diff --git a/gearslip/src/main/res/values-de/strings.xml b/gearslip/src/main/res/values-de/strings.xml index e8aff6b..bb52d5d 100644 --- a/gearslip/src/main/res/values-de/strings.xml +++ b/gearslip/src/main/res/values-de/strings.xml @@ -739,6 +739,7 @@ Verbinde ein Auto, um diese Anpassung dafür zu speichern. Vom Auto %1$d DPI + Eigener Wert… Verpasst · %1$s Keine letzten Anrufe. Letzte @@ -786,4 +787,7 @@ Einen Moment… Probier „navigate home“ oder „play“ und einen Künstler. Sag „help“ für mehr. Erlauben + Eigene Dichte + DPI + Ein Wert von %1$d bis %2$d. Kleiner passt mehr auf den Bildschirm, größer macht alles größer. diff --git a/gearslip/src/main/res/values-es/strings.xml b/gearslip/src/main/res/values-es/strings.xml index 767e542..d79feb7 100644 --- a/gearslip/src/main/res/values-es/strings.xml +++ b/gearslip/src/main/res/values-es/strings.xml @@ -739,6 +739,7 @@ Conecta un coche para guardar este ajuste para él. Desde el coche %1$d DPI + Personalizado… Perdida · %1$s No hay llamadas recientes. Recientes @@ -788,4 +789,7 @@ Un momento… Prueba “navigate home” o “play” y un artista. Di “help” para ver más. Permitir + Densidad personalizada + DPI + Cualquier valor de %1$d a %2$d. Un valor menor muestra más en pantalla; uno mayor lo agranda todo. diff --git a/gearslip/src/main/res/values-fr/strings.xml b/gearslip/src/main/res/values-fr/strings.xml index 72bdbf3..ce63f8c 100644 --- a/gearslip/src/main/res/values-fr/strings.xml +++ b/gearslip/src/main/res/values-fr/strings.xml @@ -865,6 +865,7 @@ Connectez une voiture pour enregistrer ce réglage pour elle. Selon la voiture %1$d DPI + Personnalisé… Manqué · %1$s Aucun appel récent. Récents @@ -914,4 +915,7 @@ Un instant… Essayez « navigate home » ou « play » suivi d\'un artiste. Dites « help » pour en savoir plus. Autoriser + Densité personnalisée + DPI + Toute valeur de %1$d à %2$d. Plus bas affiche plus de choses à l’écran, plus haut agrandit tout. diff --git a/gearslip/src/main/res/values-it/strings.xml b/gearslip/src/main/res/values-it/strings.xml index ad54147..f02df14 100644 --- a/gearslip/src/main/res/values-it/strings.xml +++ b/gearslip/src/main/res/values-it/strings.xml @@ -865,6 +865,7 @@ Collega un\'auto per salvare questa regolazione per lei. Dall\'auto %1$d DPI + Personalizzata… Persa · %1$s Nessuna chiamata recente. Recenti @@ -914,4 +915,7 @@ Un momento… Prova “navigate home” o “play” e un artista. Di’ “help” per altro. Consenti + Densità personalizzata + DPI + Qualsiasi valore da %1$d a %2$d. Più basso mostra più cose sullo schermo, più alto ingrandisce tutto. diff --git a/gearslip/src/main/res/values-ja/strings.xml b/gearslip/src/main/res/values-ja/strings.xml index 4bb6b33..a4336c7 100644 --- a/gearslip/src/main/res/values-ja/strings.xml +++ b/gearslip/src/main/res/values-ja/strings.xml @@ -849,6 +849,7 @@ この調整を保存するには車を接続してください。 車に合わせる %1$d DPI + カスタム… 不在着信 · %1$s 最近の通話はありません。 履歴 @@ -894,4 +895,7 @@ 少々お待ちください… 「navigate home」や「play」+アーティスト名を試してください。「help」で一覧を表示します。 許可 + カスタム密度 + DPI + %1$d~%2$d の値を入力します。小さいほど画面に多く表示され、大きいほどすべてが大きくなります。 diff --git a/gearslip/src/main/res/values-ko/strings.xml b/gearslip/src/main/res/values-ko/strings.xml index 94812e0..004984c 100644 --- a/gearslip/src/main/res/values-ko/strings.xml +++ b/gearslip/src/main/res/values-ko/strings.xml @@ -849,6 +849,7 @@ 이 조정을 저장하려면 차량을 연결하세요. 차량 기본값 %1$d DPI + 사용자 지정… 부재중 · %1$s 최근 통화가 없습니다. 최근 기록 @@ -894,4 +895,7 @@ 잠시만요… “navigate home” 또는 “play”와 아티스트 이름을 말해 보세요. 더 보려면 “help”라고 말하세요. 허용 + 사용자 지정 밀도 + DPI + %1$d~%2$d 사이의 값을 입력하세요. 낮을수록 화면에 더 많이 표시되고, 높을수록 모든 것이 커집니다. diff --git a/gearslip/src/main/res/values-nl/strings.xml b/gearslip/src/main/res/values-nl/strings.xml index 7cd9aa6..1f76e52 100644 --- a/gearslip/src/main/res/values-nl/strings.xml +++ b/gearslip/src/main/res/values-nl/strings.xml @@ -857,6 +857,7 @@ Verbind een auto om deze aanpassing ervoor op te slaan. Van de auto %1$d DPI + Aangepast… Gemist · %1$s Geen recente oproepen. Recent @@ -904,4 +905,7 @@ Even geduld… Probeer “navigate home” of “play” en een artiest. Zeg “help” voor meer. Toestaan + Aangepaste dichtheid + DPI + Elke waarde van %1$d tot %2$d. Lager past meer op het scherm, hoger maakt alles groter. diff --git a/gearslip/src/main/res/values-pl/strings.xml b/gearslip/src/main/res/values-pl/strings.xml index 5b10bcb..ff7479b 100644 --- a/gearslip/src/main/res/values-pl/strings.xml +++ b/gearslip/src/main/res/values-pl/strings.xml @@ -873,6 +873,7 @@ Połącz samochód, aby zapisać dla niego to dopasowanie. Z samochodu %1$d DPI + Własna… Nieodebrane · %1$s Brak ostatnich połączeń. Ostatnie @@ -924,4 +925,7 @@ Chwileczkę… Spróbuj „navigate home” albo „play” i wykonawcę. Powiedz „help”, aby zobaczyć więcej. Zezwól + Własna gęstość + DPI + Dowolna wartość od %1$d do %2$d. Niższa mieści więcej na ekranie, wyższa wszystko powiększa. diff --git a/gearslip/src/main/res/values-pt-rBR/strings.xml b/gearslip/src/main/res/values-pt-rBR/strings.xml index b951cb0..dcc1cb0 100644 --- a/gearslip/src/main/res/values-pt-rBR/strings.xml +++ b/gearslip/src/main/res/values-pt-rBR/strings.xml @@ -865,6 +865,7 @@ Conecte um carro para salvar este ajuste para ele. Do carro %1$d DPI + Personalizado… Perdida · %1$s Nenhuma chamada recente. Recentes @@ -914,4 +915,7 @@ Um momento… Tente “navigate home” ou “play” e um artista. Diga “help” para ver mais. Permitir + Densidade personalizada + DPI + Qualquer valor de %1$d a %2$d. Menor cabe mais na tela; maior deixa tudo maior. diff --git a/gearslip/src/main/res/values-ro/strings.xml b/gearslip/src/main/res/values-ro/strings.xml index 9b9892c..e8767ee 100644 --- a/gearslip/src/main/res/values-ro/strings.xml +++ b/gearslip/src/main/res/values-ro/strings.xml @@ -598,6 +598,7 @@ Conectează o mașină ca să salvezi această ajustare pentru ea. Din mașină %1$d DPI + Personalizat… Ratat · %1$s Niciun apel recent. Recente @@ -796,4 +797,7 @@ Un moment… Încearcă „navigate home” sau „play” și un artist. Spune „help” pentru mai multe. Permite + Densitate personalizată + DPI + Orice valoare între %1$d și %2$d. Mai mică încape mai mult pe ecran, mai mare mărește totul. diff --git a/gearslip/src/main/res/values-ru/strings.xml b/gearslip/src/main/res/values-ru/strings.xml index 40032ad..4f5236c 100644 --- a/gearslip/src/main/res/values-ru/strings.xml +++ b/gearslip/src/main/res/values-ru/strings.xml @@ -873,6 +873,7 @@ Подключите машину, чтобы сохранить для неё эту подгонку. От машины %1$d DPI + Своё значение… Пропущенный · %1$s Нет недавних вызовов. Недавние @@ -924,4 +925,7 @@ Секунду… Попробуйте «navigate home» или «play» и исполнителя. Скажите «help», чтобы узнать больше. Разрешить + Своя плотность + DPI + Любое значение от %1$d до %2$d. Меньше — больше помещается на экране, больше — всё крупнее. diff --git a/gearslip/src/main/res/values-sv/strings.xml b/gearslip/src/main/res/values-sv/strings.xml index 88c7144..5c1c8cb 100644 --- a/gearslip/src/main/res/values-sv/strings.xml +++ b/gearslip/src/main/res/values-sv/strings.xml @@ -857,6 +857,7 @@ Anslut en bil för att spara den här justeringen för den. Från bilen %1$d DPI + Anpassad… Missat · %1$s Inga senaste samtal. Senaste @@ -904,4 +905,7 @@ Ett ögonblick… Prova ”navigate home” eller ”play” och en artist. Säg ”help” för mer. Tillåt + Anpassad täthet + DPI + Valfritt värde från %1$d till %2$d. Lägre får plats med mer på skärmen, högre gör allt större. diff --git a/gearslip/src/main/res/values-tr/strings.xml b/gearslip/src/main/res/values-tr/strings.xml index 7d6f96f..5e7bb81 100644 --- a/gearslip/src/main/res/values-tr/strings.xml +++ b/gearslip/src/main/res/values-tr/strings.xml @@ -857,6 +857,7 @@ Bu ayarı bir araba için kaydetmek üzere arabayı bağla. Arabadan %1$d DPI + Özel… Cevapsız · %1$s Son arama yok. Son aramalar @@ -904,4 +905,7 @@ Bir saniye… “navigate home” ya da “play” ve bir sanatçı adı dene. Daha fazlası için “help” de. İzin ver + Özel yoğunluk + DPI + %1$d ile %2$d arasında herhangi bir değer. Düşük değer ekrana daha çok sığdırır, yüksek değer her şeyi büyütür. diff --git a/gearslip/src/main/res/values-uk/strings.xml b/gearslip/src/main/res/values-uk/strings.xml index c233d81..d253a72 100644 --- a/gearslip/src/main/res/values-uk/strings.xml +++ b/gearslip/src/main/res/values-uk/strings.xml @@ -873,6 +873,7 @@ Підключіть авто, щоб зберегти для нього це припасування. Від авто %1$d DPI + Своє значення… Пропущений · %1$s Немає недавніх дзвінків. Недавні @@ -924,4 +925,7 @@ Хвилинку… Спробуйте «navigate home» або «play» і виконавця. Скажіть «help», щоб дізнатися більше. Дозволити + Своя щільність + DPI + Будь-яке значення від %1$d до %2$d. Менше — більше вміщується на екрані, більше — усе крупніше. diff --git a/gearslip/src/main/res/values-zh-rCN/strings.xml b/gearslip/src/main/res/values-zh-rCN/strings.xml index 4b00235..8a28600 100644 --- a/gearslip/src/main/res/values-zh-rCN/strings.xml +++ b/gearslip/src/main/res/values-zh-rCN/strings.xml @@ -849,6 +849,7 @@ 连接汽车后才能为它保存此调整。 跟随汽车 %1$d DPI + 自定义… 未接 · %1$s 没有最近通话。 最近 @@ -894,4 +895,7 @@ 请稍候… 试试说“navigate home”,或“play”加歌手名。说“help”查看更多。 授权 + 自定义密度 + DPI + 输入 %1$d 到 %2$d 之间的任意值。数值越小,屏幕上显示的内容越多;越大,所有内容越大。 diff --git a/gearslip/src/main/res/values/strings.xml b/gearslip/src/main/res/values/strings.xml index 4228766..7d7972b 100644 --- a/gearslip/src/main/res/values/strings.xml +++ b/gearslip/src/main/res/values/strings.xml @@ -196,6 +196,7 @@ Larger text and controls, including in apps. Try 200 DPI with Size on Normal. Reconnect the car or reopen the preview to apply it. If controls clip, choose a lower DPI or From car. From car %1$d DPI + Custom… App theme Dark mode Buttons @@ -953,4 +954,7 @@ Language Same as the phone Next chapter + Custom density + DPI + Any value from %1$d to %2$d. Lower fits more on the screen; higher makes everything bigger.