@ -17,6 +17,7 @@ class Contact {
final double ? longitude ;
final double ? longitude ;
final DateTime lastSeen ;
final DateTime lastSeen ;
final DateTime lastMessageAt ;
final DateTime lastMessageAt ;
final DateTime ? lastModified ;
final bool isActive ;
final bool isActive ;
final bool wasPulled ;
final bool wasPulled ;
final Uint8List ? rawPacket ;
final Uint8List ? rawPacket ;
@ -33,6 +34,7 @@ class Contact {
this . latitude ,
this . latitude ,
this . longitude ,
this . longitude ,
required this . lastSeen ,
required this . lastSeen ,
this . lastModified ,
DateTime ? lastMessageAt ,
DateTime ? lastMessageAt ,
this . isActive = true ,
this . isActive = true ,
this . wasPulled = false ,
this . wasPulled = false ,
@ -94,6 +96,7 @@ class Contact {
double ? longitude ,
double ? longitude ,
DateTime ? lastSeen ,
DateTime ? lastSeen ,
DateTime ? lastMessageAt ,
DateTime ? lastMessageAt ,
DateTime ? lastModified ,
bool ? isActive ,
bool ? isActive ,
Uint8List ? rawPacket ,
Uint8List ? rawPacket ,
} ) {
} ) {
@ -114,6 +117,7 @@ class Contact {
longitude: longitude ? ? this . longitude ,
longitude: longitude ? ? this . longitude ,
lastSeen: lastSeen ? ? this . lastSeen ,
lastSeen: lastSeen ? ? this . lastSeen ,
lastMessageAt: lastMessageAt ? ? this . lastMessageAt ,
lastMessageAt: lastMessageAt ? ? this . lastMessageAt ,
lastModified: lastModified ? ? this . lastModified ,
isActive: isActive ? ? this . isActive ,
isActive: isActive ? ? this . isActive ,
rawPacket: rawPacket ? ? this . rawPacket ,
rawPacket: rawPacket ? ? this . rawPacket ,
) ;
) ;
@ -182,16 +186,34 @@ class Contact {
return null ;
return null ;
}
}
final lastMod = reader . readUInt32LE ( ) ;
/ / mandatory last_advert_timestamp
final lastAdvertTimestamp = reader . readUInt32LE ( ) ;
double ? lat , lon ;
double ? lat , lon ;
if ( reader . remaining > = 8 ) {
DateTime ? lastModified ;
if ( reader . remaining > = 12 ) {
final latRaw = reader . readInt32LE ( ) ;
final latRaw = reader . readInt32LE ( ) ;
final lonRaw = reader . readInt32LE ( ) ;
final lonRaw = reader . readInt32LE ( ) ;
final lastModRaw = reader . readUInt32LE ( ) ;
/ / TODO: should this be & & ?
if ( latRaw ! = 0 | | lonRaw ! = 0 ) {
if ( latRaw ! = 0 | | lonRaw ! = 0 ) {
lat = latRaw / 1e6 ;
lat = latRaw / 1e6 ;
lon = lonRaw / 1e6 ;
lon = lonRaw / 1e6 ;
}
}
if ( lastModRaw ! = 0 ) {
lastModified = DateTime . fromMillisecondsSinceEpoch ( lastModRaw * 1000 ) ;
}
} else if ( reader . remaining > = 8 ) {
/ / Old layout: gps without lastmod
final latRaw = reader . readInt32LE ( ) ;
final lonRaw = reader . readInt32LE ( ) ;
if ( latRaw ! = 0 | | lonRaw ! = 0 ) {
lat = latRaw / 1e6 ;
lon = lonRaw / 1e6 ;
}
appLogger . info (
' Contact ${ pubKeyToHex ( pubKey ) . substring ( 0 , 8 ) } has gps but no lastmod (legacy firmware layout) ' ,
) ;
}
}
return Contact (
return Contact (
@ -203,7 +225,10 @@ class Contact {
path: pathBytes ,
path: pathBytes ,
latitude: lat ,
latitude: lat ,
longitude: lon ,
longitude: lon ,
lastSeen: DateTime . fromMillisecondsSinceEpoch ( lastMod * 1000 ) ,
lastSeen: DateTime . fromMillisecondsSinceEpoch (
lastAdvertTimestamp * 1000 ,
) ,
lastModified: lastModified ,
isActive: true ,
isActive: true ,
rawPacket: null ,
rawPacket: null ,
) ;
) ;