Skip to content

Commit 2dbd4bd

Browse files
garthvhCopilot
andauthored
Fix measurement and locale issues across the app (#1764)
- Fix CLLocation.speed incorrectly labeled as km/h instead of m/s in GPSStatus - Fix hardcoded Fahrenheit conversion in NodeWeatherForecast to use locale - Fix altitude chart Y-axis to show feet for imperial locales - Fix force-unwrap crash risk on locale temperature key in Float extension and calculateDewPoint - Fix operator precedence confusion in temperature locale checks - Fix hardcoded kg/mm unit strings to be locale-aware (kg/lbs, mm/in) - Fix wind speed unit in EnvironmentDefaultColumns to match protobuf m/s - Fix distance column in EnvironmentDefaultColumns to use Measurement formatter Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: garthvh <1795163+garthvh@users.noreply.github.com>
1 parent cb62400 commit 2dbd4bd

8 files changed

Lines changed: 32 additions & 16 deletions

File tree

Meshtastic/Extensions/Float.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ extension Float {
2828
let localeUnit = locale.object(forKey: NSLocale.Key(rawValue: "kCFLocaleTemperatureUnitKey"))
2929
var format: UnitTemperature = .celsius
3030

31-
if localeUnit! as? String == "Fahrenheit" {
31+
if (localeUnit as? String) == "Fahrenheit" {
3232
format = .fahrenheit
3333
}
3434
return temperature.converted(to: format).value

Meshtastic/Views/Helpers/Weather/LocalWeatherConditions.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ func calculateDewPoint(temp: Float, relativeHumidity: Float, convertToLocale: Bo
113113
let localeUnit = locale.object(forKey: NSLocale.Key(rawValue: "kCFLocaleTemperatureUnitKey"))
114114
var format: UnitTemperature = .celsius
115115

116-
if localeUnit! as? String == "Fahrenheit" {
116+
if (localeUnit as? String) == "Fahrenheit" {
117117
format = .fahrenheit
118118
}
119119
return dewPointUnit.converted(to: format).value

Meshtastic/Views/Helpers/Weather/NodeWeatherForecast.swift

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,13 @@ struct NodeWeatherForecastView: View {
2727
.task {
2828
do {
2929
let weather = try await WeatherService.shared.weather(for: location, including: .hourly).forecast
30+
let locale = NSLocale.current as NSLocale
31+
let localeUnit = locale.object(forKey: NSLocale.Key(rawValue: "kCFLocaleTemperatureUnitKey"))
32+
let targetUnit: UnitTemperature = (localeUnit as? String) == "Fahrenheit" ? .fahrenheit : .celsius
3033
forecast = NodeWeatherForecast(entries: weather.map {
3134
.init(
3235
date: $0.date,
33-
degrees: $0.temperature.converted(to: .fahrenheit).value,
36+
degrees: $0.temperature.converted(to: targetUnit).value,
3437
isDaylight: $0.isDaylight
3538
)
3639
})

Meshtastic/Views/Nodes/Helpers/Map/PositionAltitudeChart.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ struct PositionAltitudeChart: View {
5252
AxisValueLabel("""
5353
\(value.as(PlottableMeasurement.self)!
5454
.measurement
55-
.converted(to: .meters),
55+
.converted(to: Locale.current.measurementSystem == .metric ? .meters : .feet),
5656
format: .measurement(
5757
width: .wide,
5858
numberFormatStyle: .number.precision(

Meshtastic/Views/Nodes/Helpers/Metrics Columns/EnvironmentDefaultColumns.swift

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,7 @@ extension MetricsColumnList {
200200
tableBody: { _, speed in
201201
speed.map {
202202
let windSpeed = Measurement(
203-
value: Double($0), unit: UnitSpeed.kilometersPerHour)
203+
value: Double($0), unit: UnitSpeed.metersPerSecond)
204204
return Text(
205205
windSpeed.formatted(
206206
.measurement(
@@ -289,11 +289,15 @@ extension MetricsColumnList {
289289
visible: false,
290290
tableBody: { _, distance in
291291
distance.map {
292-
if UIDevice.current.userInterfaceIdiom == .pad || UIDevice.current.userInterfaceIdiom == .mac {
293-
Text(verbatim: "\($0.formatted(.number.grouping(.never).precision(.fractionLength(1)))) mm")
294-
} else {
295-
Text("\($0.formatted(.number.grouping(.never).precision(.fractionLength(1))))")
296-
}
292+
let dist = Measurement(
293+
value: Double($0), unit: UnitLength.millimeters)
294+
return Text(
295+
dist.formatted(
296+
.measurement(
297+
width: .abbreviated,
298+
numberFormatStyle: .number.grouping(.never)
299+
.precision(
300+
.fractionLength(1)))))
297301
} ?? Text(Constants.nilValueIndicator)
298302
}),
299303

Meshtastic/Views/Nodes/Helpers/Metrics Columns/EnvironmentDefaultSeries.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ extension MetricsSeriesList {
2424
foregroundStyle: { chartRange in
2525
let locale = NSLocale.current as NSLocale
2626
let localeUnit = locale.object(forKey: NSLocale.Key(rawValue: "kCFLocaleTemperatureUnitKey"))
27-
let format: UnitTemperature = localeUnit as? String ?? "Celsius" == "Fahrenheit" ? .fahrenheit : .celsius
27+
let format: UnitTemperature = (localeUnit as? String) == "Fahrenheit" ? .fahrenheit : .celsius
2828
let lowerBound = chartRange.map { Double($0.lowerBound) } ?? 0.0
2929
let upperBound = chartRange.map { Double($0.upperBound) } ?? 100.0
3030
let stops: [Gradient.Stop] = generateStops(minTemp: lowerBound, maxTemp: upperBound, tempUnit: format, opacity: 1.0)
@@ -92,7 +92,7 @@ extension MetricsSeriesList {
9292
foregroundStyle: { chartRange in
9393
let locale = NSLocale.current as NSLocale
9494
let localeUnit = locale.object(forKey: NSLocale.Key(rawValue: "kCFLocaleTemperatureUnitKey"))
95-
let format: UnitTemperature = localeUnit as? String ?? "Celsius" == "Fahrenheit" ? .fahrenheit : .celsius
95+
let format: UnitTemperature = (localeUnit as? String) == "Fahrenheit" ? .fahrenheit : .celsius
9696
let lowerBound = chartRange.map { Double($0.lowerBound) } ?? 0.0
9797
let upperBound = chartRange.map { Double($0.upperBound) } ?? 100.0
9898
let stops: [Gradient.Stop] = generateStops(minTemp: lowerBound, maxTemp: upperBound, tempUnit: format, opacity: 1.0)

Meshtastic/Views/Nodes/Helpers/NodeDetail.swift

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -344,15 +344,24 @@ struct NodeDetail: View {
344344
RadiationCompactWidget(radiation: radiation.formatted(.number.precision(.fractionLength(1))), unit: "µR/hr")
345345
}
346346
if let weight = metrics.weight {
347-
WeightCompactWidget(weight: weight.formatted(.number.precision(.fractionLength(1))), unit: "kg")
347+
let weightMeasurement = Measurement(value: Double(weight), unit: UnitMass.kilograms)
348+
let usesMetric = Locale.current.measurementSystem == .metric
349+
let weightUnit = usesMetric ? UnitMass.kilograms : UnitMass.pounds
350+
let weightLabel = usesMetric ? "kg" : "lbs"
351+
WeightCompactWidget(weight: weightMeasurement.converted(to: weightUnit).value.formatted(.number.precision(.fractionLength(1))), unit: weightLabel)
348352
}
349353
if let distance = metrics.distance {
350-
DistanceCompactWidget(distance: distance.formatted(.number.precision(.fractionLength(0))), unit: "mm")
354+
let distMeasurement = Measurement(value: Double(distance), unit: UnitLength.millimeters)
355+
let usesMetric = Locale.current.measurementSystem == .metric
356+
let distUnit = usesMetric ? UnitLength.millimeters : UnitLength.inches
357+
let distLabel = usesMetric ? "mm" : "in"
358+
let distDecimals = usesMetric ? 0 : 1
359+
DistanceCompactWidget(distance: distMeasurement.converted(to: distUnit).value.formatted(.number.precision(.fractionLength(distDecimals))), unit: distLabel)
351360
}
352361
if let soilTemperature = metrics.soilTemperature {
353362
let locale = NSLocale.current as NSLocale
354363
let localeUnit = locale.object(forKey: NSLocale.Key(rawValue: "kCFLocaleTemperatureUnitKey"))
355-
let unit = localeUnit as? String ?? "Celsius" == "Fahrenheit" ? "°F" : "°C"
364+
let unit = (localeUnit as? String) == "Fahrenheit" ? "°F" : "°C"
356365
SoilTemperatureCompactWidget(temperature: soilTemperature.localeTemperature().formatted(.number.precision(.fractionLength(0))), unit: unit)
357366
}
358367
if let soilMoisture = metrics.soilMoisture {

Meshtastic/Views/Settings/GPSStatus.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ struct GPSStatus: View {
2020
let horizontalAccuracy = Measurement(value: newLocation.horizontalAccuracy, unit: UnitLength.meters)
2121
let verticalAccuracy = Measurement(value: newLocation.verticalAccuracy, unit: UnitLength.meters)
2222
let altitiude = Measurement(value: newLocation.altitude, unit: UnitLength.meters)
23-
let speed = Measurement(value: newLocation.speed, unit: UnitSpeed.kilometersPerHour)
23+
let speed = Measurement(value: newLocation.speed, unit: UnitSpeed.metersPerSecond)
2424
let speedAccuracy = Measurement(value: newLocation.speedAccuracy, unit: UnitSpeed.metersPerSecond)
2525
let courseAccuracy = Measurement(value: newLocation.courseAccuracy, unit: UnitAngle.degrees)
2626

0 commit comments

Comments
 (0)