From ef3c11da159887247e05b1b8e97e6b6456dae784 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 17 Jun 2026 14:09:38 +0000 Subject: [PATCH] fix: guard ICU getMeasurementSystem behind API 28 check LocaleData.getMeasurementSystem requires API level 28 but the module's minSdk is 26, which lint (NewApi) flagged as an error. Guard the ICU call behind a Build.VERSION.SDK_INT check and fall back to a country-code based heuristic on API 26-27. Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_01JDcx7i1VDRyT7rDcuSB5Co --- .../loggedIn/workouts/MeasurementSystem.kt | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/workouts/MeasurementSystem.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/workouts/MeasurementSystem.kt index 50fce5c2ce..24ff98836e 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/workouts/MeasurementSystem.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/workouts/MeasurementSystem.kt @@ -22,8 +22,12 @@ package com.vitorpamplona.amethyst.ui.screen.loggedIn.workouts import android.icu.util.LocaleData import android.icu.util.ULocale +import android.os.Build import java.util.Locale +/** Countries that use miles for road distance (imperial / US customary). */ +private val MILES_COUNTRIES = setOf("US", "GB", "LR", "MM") + /** * Whether the phone's measurement preference favours miles for distance. * @@ -31,7 +35,8 @@ import java.util.Locale * which the platform surfaces through the default locale's Unicode `-u-ms-` * extension (`metric` / `ussystem` / `uksystem`). When no explicit override is * set it falls back to ICU's locale-derived measurement system (US and UK both - * use miles for distance), available since API 24. + * use miles for distance), available since API 28; on older releases it falls + * back to a country-code check. */ fun phonePrefersMiles(): Boolean { val locale = Locale.getDefault(Locale.Category.FORMAT) @@ -40,8 +45,12 @@ fun phonePrefersMiles(): Boolean { return ms == "ussystem" || ms == "uksystem" } - return when (LocaleData.getMeasurementSystem(ULocale.forLocale(locale))) { - LocaleData.MeasurementSystem.US, LocaleData.MeasurementSystem.UK -> true - else -> false + return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { + when (LocaleData.getMeasurementSystem(ULocale.forLocale(locale))) { + LocaleData.MeasurementSystem.US, LocaleData.MeasurementSystem.UK -> true + else -> false + } + } else { + locale.country.uppercase(Locale.ROOT) in MILES_COUNTRIES } }