feat: Add location validation and improve contact latitude/longitude handling

This commit is contained in:
Winston Lowe 2026-03-21 09:39:03 -07:00
parent e313bea3fc
commit 4f609f160f
2 changed files with 23 additions and 20 deletions

View file

@ -4913,6 +4913,17 @@ class MeshCoreConnector extends ChangeNotifier {
);
}
bool hasValidLocation(double? latitude, double? longitude) {
const double epsilon = 1e-6;
final lat = latitude ?? 0.0;
final lon = longitude ?? 0.0;
return (lat.abs() > epsilon || lon.abs() > epsilon) &&
lat >= -90.0 &&
lat <= 90.0 &&
lon >= -180.0 &&
lon <= 180.0;
}
void _handlePayloadAdvertReceived(
Uint8List rawPacket,
Uint8List payload,
@ -4950,6 +4961,9 @@ class MeshCoreConnector extends ChangeNotifier {
latitude = advert.readInt32LE() / 1e6;
longitude = advert.readInt32LE() / 1e6;
}
// Validate location values if present
hasLocation = hasValidLocation(latitude, longitude);
if (hasName && advert.remaining > 0) {
name = advert.readString();
}
@ -5015,20 +5029,8 @@ class MeshCoreConnector extends ChangeNotifier {
// CRITICAL: Preserve user's path override when contact is refreshed from device
_contacts[existingIndex] = existing.copyWith(
latitude:
hasLocation &&
latitude != null &&
latitude.abs() <= 90 &&
(latitude != 0 || longitude != 0)
? latitude
: existing.latitude,
longitude:
hasLocation &&
longitude != null &&
longitude.abs() <= 180 &&
(latitude != 0 || longitude != 0)
? longitude
: existing.longitude,
latitude: hasLocation ? latitude : existing.latitude,
longitude: hasLocation ? longitude : existing.longitude,
name: hasName ? name : existing.name,
path: Uint8List.fromList(path.reversed.toList()),
pathLength: path.length,

View file

@ -181,12 +181,13 @@ class Contact {
final lastMod = reader.readUInt32LE();
double? lat, lon;
final latRaw = reader.readInt32LE();
final lonRaw = reader.readInt32LE();
if (latRaw != 0 || lonRaw != 0) {
lat = latRaw / 1e6;
lon = lonRaw / 1e6;
if (reader.remaining >= 8) {
final latRaw = reader.readInt32LE();
final lonRaw = reader.readInt32LE();
if (latRaw != 0 || lonRaw != 0) {
lat = latRaw / 1e6;
lon = lonRaw / 1e6;
}
}
return Contact(