Refactor contact handling by removing unnecessary mapping and improving clarity across multiple screens

This commit is contained in:
Winston Lowe
2026-03-26 16:46:01 -07:00
parent 5dfccb9a94
commit 4ce7878539
5 changed files with 37 additions and 45 deletions
+3 -10
View File
@@ -40,12 +40,7 @@ class ChannelMessagePathScreen extends StatelessWidget {
final primaryPath = !channelMessage && !message.isOutgoing final primaryPath = !channelMessage && !message.isOutgoing
? Uint8List.fromList(primaryPathTmp.reversed.toList()) ? Uint8List.fromList(primaryPathTmp.reversed.toList())
: primaryPathTmp; : primaryPathTmp;
<<<<<<< HEAD
final hops = _buildPathHops(primaryPath, connector, l10n); final hops = _buildPathHops(primaryPath, connector, l10n);
=======
final contacts = connector.allContactsUnfiltered;
final hops = _buildPathHops(primaryPath, contacts, l10n);
>>>>>>> da74560 (Enhance contact handling and UI updates across multiple screens)
final hasHopDetails = primaryPath.isNotEmpty; final hasHopDetails = primaryPath.isNotEmpty;
final observedLabel = _formatObservedHops( final observedLabel = _formatObservedHops(
primaryPath.length, primaryPath.length,
@@ -390,10 +385,7 @@ class _ChannelMessagePathMapScreenState
: selectedPathTmp; : selectedPathTmp;
final selectedIndex = _indexForPath(selectedPath, observedPaths); final selectedIndex = _indexForPath(selectedPath, observedPaths);
final contacts = connector.allContactsUnfiltered final hops = _buildPathHops(selectedPath, connector, context.l10n);
.map((c) => connector.getFromDiscovered(c))
.toList();
final hops = _buildPathHops(selectedPath, contacts, context.l10n);
final points = <LatLng>[]; final points = <LatLng>[];
@@ -830,7 +822,8 @@ List<_PathHop> _buildPathHops(
) { ) {
if (pathBytes.isEmpty) return const []; if (pathBytes.isEmpty) return const [];
final candidatesByPrefix = <int, List<Contact>>{}; final candidatesByPrefix = <int, List<Contact>>{};
for (final contact in connector.allContacts) { final allContacts = connector.allContacts;
for (final contact in allContacts) {
if (contact.publicKey.isEmpty) continue; if (contact.publicKey.isEmpty) continue;
if (contact.type != advTypeRepeater && contact.type != advTypeRoom) { if (contact.type != advTypeRepeater && contact.type != advTypeRoom) {
continue; continue;
@@ -24,6 +24,7 @@ class _CompanionRadioStatsScreenState extends State<CompanionRadioStatsScreen> {
final c = context.read<MeshCoreConnector>(); final c = context.read<MeshCoreConnector>();
_connector = c; _connector = c;
c.acquireRadioStatsPolling(); c.acquireRadioStatsPolling();
c.setPollingInterval(1);
c.radioStatsNotifier.addListener(_onStatsUpdate); c.radioStatsNotifier.addListener(_onStatsUpdate);
} }
@@ -44,6 +45,7 @@ class _CompanionRadioStatsScreenState extends State<CompanionRadioStatsScreen> {
void dispose() { void dispose() {
_connector?.radioStatsNotifier.removeListener(_onStatsUpdate); _connector?.radioStatsNotifier.removeListener(_onStatsUpdate);
_connector?.releaseRadioStatsPolling(); _connector?.releaseRadioStatsPolling();
_connector?.setPollingInterval(30);
super.dispose(); super.dispose();
} }
+26 -21
View File
@@ -139,9 +139,7 @@ class _MapScreenState extends State<MapScreen> {
builder: (context, connector, settingsService, pathHistory, child) { builder: (context, connector, settingsService, pathHistory, child) {
final tileCache = context.read<MapTileCacheService>(); final tileCache = context.read<MapTileCacheService>();
final settings = settingsService.settings; final settings = settingsService.settings;
final allContacts = connector.allContacts final allContacts = connector.allContacts;
.map((c) => connector.getFromDiscovered(c))
.toList();
final contacts = settings.mapShowDiscoveryContacts final contacts = settings.mapShowDiscoveryContacts
? allContacts ? allContacts
@@ -491,10 +489,11 @@ class _MapScreenState extends State<MapScreen> {
), ),
), ),
), ),
..._buildGuessedMarker( if (!settings.mapShowOverlaps)
guessedLocations, ..._buildGuessedMarker(
showLabels: _showNodeLabels, guessedLocations,
), showLabels: _showNodeLabels,
),
..._buildMarkers( ..._buildMarkers(
contactsWithLocation, contactsWithLocation,
settings, settings,
@@ -881,23 +880,29 @@ class _MapScreenState extends State<MapScreen> {
addContact = true; addContact = true;
} }
final hasOverlap = contacts if (contact.type == advTypeChat && _isBuildingPathTrace) {
.where(
(c) =>
c.publicKeyHex != contact.publicKeyHex &&
c.publicKey.first == contact.publicKey.first &&
(c.type == advTypeRepeater || c.type == advTypeRoom) &&
(contact.type == advTypeRepeater ||
contact.type == advTypeRoom),
)
.firstOrNull;
if (hasOverlap == null &&
settings.mapShowOverlaps &&
!_isBuildingPathTrace) {
addContact = false; addContact = false;
} }
if (settings.mapShowOverlaps) {
final hasOverlap = contacts
.where(
(c) =>
c.publicKeyHex != contact.publicKeyHex &&
c.publicKey.first == contact.publicKey.first &&
(c.type == advTypeRepeater || c.type == advTypeRoom) &&
(contact.type == advTypeRepeater ||
contact.type == advTypeRoom),
)
.firstOrNull;
if (hasOverlap == null &&
settings.mapShowOverlaps &&
!_isBuildingPathTrace) {
addContact = false;
}
}
if (addContact) { if (addContact) {
filtered.add(contact); filtered.add(contact);
} }
+1 -3
View File
@@ -283,9 +283,7 @@ class _PathTraceMapScreenState extends State<PathTraceMapScreen> {
if (widget.pathContacts != null) { if (widget.pathContacts != null) {
pathContacts = {for (var c in widget.pathContacts!) c.publicKey[0]: c}; pathContacts = {for (var c in widget.pathContacts!) c.publicKey[0]: c};
} else { } else {
final contacts = connector.allContactsUnfiltered final contacts = connector.allContactsUnfiltered;
.map((c) => connector.getFromDiscovered(c))
.toList();
contacts.where((c) => c.type != advTypeChat).forEach((repeater) { contacts.where((c) => c.type != advTypeChat).forEach((repeater) {
if (lastContact.latitude != null && if (lastContact.latitude != null &&
lastContact.longitude != null && lastContact.longitude != null &&
+5 -11
View File
@@ -58,10 +58,9 @@ class GpxExport {
} }
void addRepeaters() { void addRepeaters() {
final contacts = _connector.allContacts final contacts = _connector.allContacts.where(
.where((c) => c.type == advTypeRepeater || c.type == advTypeRoom) (c) => c.type == advTypeRepeater || c.type == advTypeRoom,
.map((c) => _connector.getFromDiscovered(c)) );
.toList();
for (var contact in contacts) { for (var contact in contacts) {
if (contact.latitude == null || contact.longitude == null) { if (contact.latitude == null || contact.longitude == null) {
continue; continue;
@@ -80,10 +79,7 @@ class GpxExport {
} }
void addContacts() { void addContacts() {
final contacts = _connector.allContacts final contacts = _connector.allContacts.where((c) => c.type == advTypeChat);
.where((c) => c.type == advTypeChat)
.map((c) => _connector.getFromDiscovered(c))
.toList();
for (var contact in contacts) { for (var contact in contacts) {
if (contact.latitude == null || contact.longitude == null) { if (contact.latitude == null || contact.longitude == null) {
continue; continue;
@@ -102,9 +98,7 @@ class GpxExport {
} }
void addAll() { void addAll() {
final contacts = _connector.allContacts final contacts = _connector.allContacts;
.map((c) => _connector.getFromDiscovered(c))
.toList();
for (var contact in contacts) { for (var contact in contacts) {
if (contact.latitude == null || contact.longitude == null) { if (contact.latitude == null || contact.longitude == null) {
continue; continue;