From 38856c67e5a9acee38c8013bfadc426259f7a290 Mon Sep 17 00:00:00 2001 From: Winston Lowe Date: Mon, 2 Mar 2026 10:23:14 -0800 Subject: [PATCH] feat: Add functionality to delete all discovered contacts - Implemented a new method to remove all discovered contacts from the list. - Added confirmation dialog for deleting all discovered contacts in the discovery screen. - Updated localization files to include new strings for deleting all discovered contacts. - Refactored contact import logic to streamline the process. - Enhanced the discovery handling to notify users appropriately based on settings. --- lib/connector/meshcore_connector.dart | 109 +++++++++++++++++++++----- lib/l10n/app_bg.arb | 5 +- lib/l10n/app_de.arb | 5 +- lib/l10n/app_en.arb | 5 +- lib/l10n/app_es.arb | 5 +- lib/l10n/app_fr.arb | 5 +- lib/l10n/app_it.arb | 5 +- lib/l10n/app_localizations.dart | 20 ++++- lib/l10n/app_localizations_bg.dart | 11 +++ lib/l10n/app_localizations_de.dart | 11 +++ lib/l10n/app_localizations_en.dart | 13 ++- lib/l10n/app_localizations_es.dart | 11 +++ lib/l10n/app_localizations_fr.dart | 11 +++ lib/l10n/app_localizations_it.dart | 11 +++ lib/l10n/app_localizations_nl.dart | 11 +++ lib/l10n/app_localizations_pl.dart | 11 +++ lib/l10n/app_localizations_pt.dart | 11 +++ lib/l10n/app_localizations_ru.dart | 11 +++ lib/l10n/app_localizations_sk.dart | 11 +++ lib/l10n/app_localizations_sl.dart | 11 +++ lib/l10n/app_localizations_sv.dart | 11 +++ lib/l10n/app_localizations_uk.dart | 11 +++ lib/l10n/app_localizations_zh.dart | 9 +++ lib/l10n/app_nl.arb | 5 +- lib/l10n/app_pl.arb | 5 +- lib/l10n/app_pt.arb | 5 +- lib/l10n/app_ru.arb | 5 +- lib/l10n/app_sk.arb | 5 +- lib/l10n/app_sl.arb | 5 +- lib/l10n/app_sv.arb | 5 +- lib/l10n/app_uk.arb | 5 +- lib/l10n/app_zh.arb | 5 +- lib/screens/contacts_screen.dart | 2 +- lib/screens/discovery_screen.dart | 43 ++++++++++ 34 files changed, 378 insertions(+), 36 deletions(-) diff --git a/lib/connector/meshcore_connector.dart b/lib/connector/meshcore_connector.dart index 14d62dd..d71cc75 100644 --- a/lib/connector/meshcore_connector.dart +++ b/lib/connector/meshcore_connector.dart @@ -1527,6 +1527,8 @@ class MeshCoreConnector extends ChangeNotifier { Future removeContact(Contact contact) async { if (!isConnected) return; + _handleDiscovery(contact, Uint8List(0), noNotify: true); + await sendFrame(buildRemoveContactFrame(contact.publicKey)); _contacts.removeWhere((c) => c.publicKeyHex == contact.publicKeyHex); _knownContactKeys.remove(contact.publicKeyHex); @@ -1552,23 +1554,15 @@ class MeshCoreConnector extends ChangeNotifier { Future importDiscoveredContact(DiscoveryContact contact) async { if (!isConnected) return; + await sendFrame( - buildSetAutoAddConfigFrame( - autoAddChat: true, - autoAddRepeater: true, - autoAddRoomServer: true, - autoAddSensor: true, - overwriteOldest: _overwriteOldest, - ), - ); - await sendFrame(buildImportContactFrame(contact.rawPacket)); - await sendFrame( - buildSetAutoAddConfigFrame( - autoAddChat: _autoAddUsers, - autoAddRepeater: _autoAddRepeaters, - autoAddRoomServer: _autoAddRoomServers, - autoAddSensor: _autoAddSensors, - overwriteOldest: _overwriteOldest, + buildUpdateContactPathFrame( + contact.publicKey, + contact.path, + contact.pathLength, + type: contact.type, + flags: 0, + name: contact.name, ), ); @@ -3805,6 +3799,76 @@ class MeshCoreConnector extends ChangeNotifier { } } + void importContact(Uint8List frame) { + final packet = BufferReader(frame); + int payloadType = 0; + Uint8List pathBytes = Uint8List(0); + try { + packet.skipBytes(1); // Skip frame type byte + packet.skipBytes(1); // Skip SNR byte + packet.skipBytes(1); // Skip RSSI byte + final header = packet.readByte(); + payloadType = (header >> 2) & 0x0F; + //final payloadVer = (header >> 6) & 0x03; + final pathLen = packet.readByte(); + pathBytes = packet.readBytes(pathLen); + } catch (e) { + appLogger.warn('Malformed RX frame: $e', tag: 'Connector'); + return; + } + double latitude = 0.0; + double longitude = 0.0; + String name = ''; + Uint8List publicKey = Uint8List(0); + int type = 0; + int timestamp = 0; + bool hasLocation = false; + bool hasName = false; + if (payloadType != payloadTypeADVERT) { + appLogger.warn('Unexpected payload type: $payloadType', tag: 'Connector'); + return; + } + try { + publicKey = packet.readBytes(32); + timestamp = packet.readInt32LE(); + //TODO add signature verification + packet.skipBytes(64); // Skip signature for now + final flags = packet.readByte(); + type = flags & 0x0F; + hasLocation = (flags & 0x10) != 0; + // For future use: + //final hasFeature1 = (flags & 0x20) != 0; + //final hasFeature2 = (flags & 0x40) != 0; + hasName = (flags & 0x80) != 0; + if (hasLocation && packet.remaining >= 8) { + latitude = packet.readInt32LE() / 1e6; + longitude = packet.readInt32LE() / 1e6; + } + if (hasName && packet.remaining > 0) { + name = packet.readString(); + } + } catch (e) { + appLogger.warn('Malformed advert frame: $e', tag: 'Connector'); + return; + } + + importDiscoveredContact( + DiscoveryContact( + rawPacket: frame, + publicKey: publicKey, + name: name, + type: type, + pathLength: pathBytes.length, + path: Uint8List.fromList( + pathBytes.reversed.toList(), + ), // Store path in reverse for easier use in outgoing messages + latitude: latitude, + longitude: longitude, + lastSeen: DateTime.fromMillisecondsSinceEpoch(timestamp * 1000), + ), + ); + } + void _handlePayloadAdvertReceived( Uint8List rawPacket, Uint8List payload, @@ -3982,7 +4046,11 @@ class MeshCoreConnector extends ChangeNotifier { } } - void _handleDiscovery(Contact contact, Uint8List rawPacket) { + void _handleDiscovery( + Contact contact, + Uint8List rawPacket, { + bool noNotify = false, + }) { debugPrint('Discovered new contact: ${contact.name}'); final existingIndex = _discoveredContacts.indexWhere( @@ -4022,7 +4090,7 @@ class MeshCoreConnector extends ChangeNotifier { unawaited(_persistDiscoveredContacts()); // Show notification for new contact (advertisement) - if (_appSettingsService != null) { + if (_appSettingsService != null && !noNotify) { final settings = _appSettingsService!.settings; if (settings.notificationsEnabled && settings.notifyOnNewAdvert) { _notificationService.showAdvertNotification( @@ -4033,6 +4101,11 @@ class MeshCoreConnector extends ChangeNotifier { } } } + + void removeAllDiscoveredContacts() { + _discoveredContacts.clear(); + notifyListeners(); + } } const int _phRouteMask = 0x03; diff --git a/lib/l10n/app_bg.arb b/lib/l10n/app_bg.arb index cf33d3d..d8c6821 100644 --- a/lib/l10n/app_bg.arb +++ b/lib/l10n/app_bg.arb @@ -1821,5 +1821,8 @@ "discoveredContacts_copyContact": "Копирай контакт в клипборда", "discoveredContacts_deleteContact": "Изтрий контакт", "discoveredContacts_addContact": "Добави контакт", - "contactsSettings_overwriteOldestSubtitle": "Когато списъкът с контакти е пълен, най-старият неключов контакт ще бъде заменен." + "contactsSettings_overwriteOldestSubtitle": "Когато списъкът с контакти е пълен, най-старият неключов контакт ще бъде заменен.", + "discoveredContacts_deleteContactAll": "Изтриване на Всички Открити Контакти", + "discoveredContacts_deleteContactAllContent": "Сигурни ли сте, че искате да изтриете всички открити контакти?", + "common_deleteAll": "Изтрий всичко" } diff --git a/lib/l10n/app_de.arb b/lib/l10n/app_de.arb index 0029f4c..690dc6c 100644 --- a/lib/l10n/app_de.arb +++ b/lib/l10n/app_de.arb @@ -1849,5 +1849,8 @@ "discoveredContacts_copyContact": "Kontakt in die Zwischenablage kopieren", "contactsSettings_overwriteOldestTitle": "Überschreiben des Ältesten", "contactsSettings_autoAddSensorsSubtitle": "Ermöglichen Sie dem Begleiter, automatisch entdeckte Sensoren hinzuzufügen", - "contactsSettings_overwriteOldestSubtitle": "Wenn die Kontaktliste voll ist, wird der älteste nicht favorisierte Kontakt ersetzt." + "contactsSettings_overwriteOldestSubtitle": "Wenn die Kontaktliste voll ist, wird der älteste nicht favorisierte Kontakt ersetzt.", + "common_deleteAll": "Alles löschen", + "discoveredContacts_deleteContactAllContent": "Sind Sie sicher, dass Sie alle gefundenen Kontakte löschen möchten?", + "discoveredContacts_deleteContactAll": "Alle entdeckten Kontakte löschen" } diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index 66cf2a2..0eb6173 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -10,6 +10,7 @@ "common_unknownDevice": "Unknown Device", "common_save": "Save", "common_delete": "Delete", + "common_deleteAll": "Delete All", "common_close": "Close", "common_edit": "Edit", "common_add": "Add", @@ -1859,5 +1860,7 @@ "discoveredContacts_contactAdded": "Contact added", "discoveredContacts_addContact": "Add Contact", "discoveredContacts_copyContact": "Copy Contact to clipboard", - "discoveredContacts_deleteContact": "Delete Contact" + "discoveredContacts_deleteContact": "Delete Discovered Contact", + "discoveredContacts_deleteContactAll": "Delete All Discovered Contacts", + "discoveredContacts_deleteContactAllContent": "Are you sure you want to delete all discovered contacts?" } \ No newline at end of file diff --git a/lib/l10n/app_es.arb b/lib/l10n/app_es.arb index 54b9c4d..3eb91d9 100644 --- a/lib/l10n/app_es.arb +++ b/lib/l10n/app_es.arb @@ -1849,5 +1849,8 @@ "discoveredContacts_Title": "Contactos descubiertos", "discoveredContacts_searchHint": "Buscar contactos descubiertos", "discoveredContacts_addContact": "Agregar contacto", - "contactsSettings_overwriteOldestSubtitle": "Cuando la lista de contactos esté llena, se reemplazará el contacto no favorito más antiguo." + "contactsSettings_overwriteOldestSubtitle": "Cuando la lista de contactos esté llena, se reemplazará el contacto no favorito más antiguo.", + "common_deleteAll": "Eliminar todo", + "discoveredContacts_deleteContactAll": "Eliminar Todos los Contactos Descubiertos", + "discoveredContacts_deleteContactAllContent": "¿Está seguro de que desea eliminar todos los contactos descubiertos!" } diff --git a/lib/l10n/app_fr.arb b/lib/l10n/app_fr.arb index bdfc3e6..faf8b8b 100644 --- a/lib/l10n/app_fr.arb +++ b/lib/l10n/app_fr.arb @@ -1821,5 +1821,8 @@ "contactsSettings_autoAddSensorsSubtitle": "Autoriser le compagnon à ajouter automatiquement les capteurs découverts.", "discoveredContacts_Title": "Contacts découverts", "discoveredContacts_searchHint": "Rechercher des contacts découverts", - "contactsSettings_overwriteOldestSubtitle": "Lorsque la liste de contacts est pleine, le contact le plus ancien non favori sera remplacé." + "contactsSettings_overwriteOldestSubtitle": "Lorsque la liste de contacts est pleine, le contact le plus ancien non favori sera remplacé.", + "common_deleteAll": "Supprimer tout", + "discoveredContacts_deleteContactAll": "Supprimer tous les contacts découverts", + "discoveredContacts_deleteContactAllContent": "Êtes-vous sûr de vouloir supprimer tous les contacts découverts ?" } diff --git a/lib/l10n/app_it.arb b/lib/l10n/app_it.arb index ad4a80b..11de963 100644 --- a/lib/l10n/app_it.arb +++ b/lib/l10n/app_it.arb @@ -1821,5 +1821,8 @@ "discoveredContacts_contactAdded": "Contatto aggiunto", "discoveredContacts_deleteContact": "Elimina Contatto", "discoveredContacts_copyContact": "Copia contatto negli appunti", - "contactsSettings_overwriteOldestSubtitle": "Quando l'elenco dei contatti è pieno, il contatto più vecchio non tra i preferiti verrà sostituito." + "contactsSettings_overwriteOldestSubtitle": "Quando l'elenco dei contatti è pieno, il contatto più vecchio non tra i preferiti verrà sostituito.", + "common_deleteAll": "Elimina tutto", + "discoveredContacts_deleteContactAllContent": "Sei sicuro di voler eliminare tutti i contatti scoperti?", + "discoveredContacts_deleteContactAll": "Eliminare tutti i contatti scoperti" } diff --git a/lib/l10n/app_localizations.dart b/lib/l10n/app_localizations.dart index 8b73b19..f44ef17 100644 --- a/lib/l10n/app_localizations.dart +++ b/lib/l10n/app_localizations.dart @@ -184,6 +184,12 @@ abstract class AppLocalizations { /// **'Delete'** String get common_delete; + /// No description provided for @common_deleteAll. + /// + /// In en, this message translates to: + /// **'Delete All'** + String get common_deleteAll; + /// No description provided for @common_close. /// /// In en, this message translates to: @@ -5510,8 +5516,20 @@ abstract class AppLocalizations { /// No description provided for @discoveredContacts_deleteContact. /// /// In en, this message translates to: - /// **'Delete Contact'** + /// **'Delete Discovered Contact'** String get discoveredContacts_deleteContact; + + /// No description provided for @discoveredContacts_deleteContactAll. + /// + /// In en, this message translates to: + /// **'Delete All Discovered Contacts'** + String get discoveredContacts_deleteContactAll; + + /// No description provided for @discoveredContacts_deleteContactAllContent. + /// + /// In en, this message translates to: + /// **'Are you sure you want to delete all discovered contacts?'** + String get discoveredContacts_deleteContactAllContent; } class _AppLocalizationsDelegate diff --git a/lib/l10n/app_localizations_bg.dart b/lib/l10n/app_localizations_bg.dart index 16712d2..05ce277 100644 --- a/lib/l10n/app_localizations_bg.dart +++ b/lib/l10n/app_localizations_bg.dart @@ -38,6 +38,9 @@ class AppLocalizationsBg extends AppLocalizations { @override String get common_delete => 'Изтрий'; + @override + String get common_deleteAll => 'Изтрий всичко'; + @override String get common_close => 'Затвори'; @@ -3189,4 +3192,12 @@ class AppLocalizationsBg extends AppLocalizations { @override String get discoveredContacts_deleteContact => 'Изтрий контакт'; + + @override + String get discoveredContacts_deleteContactAll => + 'Изтриване на Всички Открити Контакти'; + + @override + String get discoveredContacts_deleteContactAllContent => + 'Сигурни ли сте, че искате да изтриете всички открити контакти?'; } diff --git a/lib/l10n/app_localizations_de.dart b/lib/l10n/app_localizations_de.dart index 64c75cb..47377ee 100644 --- a/lib/l10n/app_localizations_de.dart +++ b/lib/l10n/app_localizations_de.dart @@ -38,6 +38,9 @@ class AppLocalizationsDe extends AppLocalizations { @override String get common_delete => 'Löschen'; + @override + String get common_deleteAll => 'Alles löschen'; + @override String get common_close => 'Schließen'; @@ -3200,4 +3203,12 @@ class AppLocalizationsDe extends AppLocalizations { @override String get discoveredContacts_deleteContact => 'Kontakt löschen'; + + @override + String get discoveredContacts_deleteContactAll => + 'Alle entdeckten Kontakte löschen'; + + @override + String get discoveredContacts_deleteContactAllContent => + 'Sind Sie sicher, dass Sie alle gefundenen Kontakte löschen möchten?'; } diff --git a/lib/l10n/app_localizations_en.dart b/lib/l10n/app_localizations_en.dart index 031dd44..8f1fa3d 100644 --- a/lib/l10n/app_localizations_en.dart +++ b/lib/l10n/app_localizations_en.dart @@ -38,6 +38,9 @@ class AppLocalizationsEn extends AppLocalizations { @override String get common_delete => 'Delete'; + @override + String get common_deleteAll => 'Delete All'; + @override String get common_close => 'Close'; @@ -3137,5 +3140,13 @@ class AppLocalizationsEn extends AppLocalizations { String get discoveredContacts_copyContact => 'Copy Contact to clipboard'; @override - String get discoveredContacts_deleteContact => 'Delete Contact'; + String get discoveredContacts_deleteContact => 'Delete Discovered Contact'; + + @override + String get discoveredContacts_deleteContactAll => + 'Delete All Discovered Contacts'; + + @override + String get discoveredContacts_deleteContactAllContent => + 'Are you sure you want to delete all discovered contacts?'; } diff --git a/lib/l10n/app_localizations_es.dart b/lib/l10n/app_localizations_es.dart index c516d96..ddd9ff9 100644 --- a/lib/l10n/app_localizations_es.dart +++ b/lib/l10n/app_localizations_es.dart @@ -38,6 +38,9 @@ class AppLocalizationsEs extends AppLocalizations { @override String get common_delete => 'Eliminar'; + @override + String get common_deleteAll => 'Eliminar todo'; + @override String get common_close => 'Cerrar'; @@ -3193,4 +3196,12 @@ class AppLocalizationsEs extends AppLocalizations { @override String get discoveredContacts_deleteContact => 'Eliminar contacto'; + + @override + String get discoveredContacts_deleteContactAll => + 'Eliminar Todos los Contactos Descubiertos'; + + @override + String get discoveredContacts_deleteContactAllContent => + '¿Está seguro de que desea eliminar todos los contactos descubiertos!'; } diff --git a/lib/l10n/app_localizations_fr.dart b/lib/l10n/app_localizations_fr.dart index 1ff8aca..52bf0a3 100644 --- a/lib/l10n/app_localizations_fr.dart +++ b/lib/l10n/app_localizations_fr.dart @@ -38,6 +38,9 @@ class AppLocalizationsFr extends AppLocalizations { @override String get common_delete => 'Supprimer'; + @override + String get common_deleteAll => 'Supprimer tout'; + @override String get common_close => 'Fermer'; @@ -3214,4 +3217,12 @@ class AppLocalizationsFr extends AppLocalizations { @override String get discoveredContacts_deleteContact => 'Supprimer le contact'; + + @override + String get discoveredContacts_deleteContactAll => + 'Supprimer tous les contacts découverts'; + + @override + String get discoveredContacts_deleteContactAllContent => + 'Êtes-vous sûr de vouloir supprimer tous les contacts découverts ?'; } diff --git a/lib/l10n/app_localizations_it.dart b/lib/l10n/app_localizations_it.dart index a4e6057..8730115 100644 --- a/lib/l10n/app_localizations_it.dart +++ b/lib/l10n/app_localizations_it.dart @@ -38,6 +38,9 @@ class AppLocalizationsIt extends AppLocalizations { @override String get common_delete => 'Elimina'; + @override + String get common_deleteAll => 'Elimina tutto'; + @override String get common_close => 'Chiudi'; @@ -3194,4 +3197,12 @@ class AppLocalizationsIt extends AppLocalizations { @override String get discoveredContacts_deleteContact => 'Elimina Contatto'; + + @override + String get discoveredContacts_deleteContactAll => + 'Eliminare tutti i contatti scoperti'; + + @override + String get discoveredContacts_deleteContactAllContent => + 'Sei sicuro di voler eliminare tutti i contatti scoperti?'; } diff --git a/lib/l10n/app_localizations_nl.dart b/lib/l10n/app_localizations_nl.dart index 3deb4c7..93d7f97 100644 --- a/lib/l10n/app_localizations_nl.dart +++ b/lib/l10n/app_localizations_nl.dart @@ -38,6 +38,9 @@ class AppLocalizationsNl extends AppLocalizations { @override String get common_delete => 'Verwijderen'; + @override + String get common_deleteAll => 'Alles verwijderen'; + @override String get common_close => 'Sluiten'; @@ -3180,4 +3183,12 @@ class AppLocalizationsNl extends AppLocalizations { @override String get discoveredContacts_deleteContact => 'Contact verwijderen'; + + @override + String get discoveredContacts_deleteContactAll => + 'Verwijder alle ontdekte contacten'; + + @override + String get discoveredContacts_deleteContactAllContent => + 'Weet u zeker dat u alle ontdekte contacten wilt verwijderen?'; } diff --git a/lib/l10n/app_localizations_pl.dart b/lib/l10n/app_localizations_pl.dart index 78c1f8a..3d5bf54 100644 --- a/lib/l10n/app_localizations_pl.dart +++ b/lib/l10n/app_localizations_pl.dart @@ -38,6 +38,9 @@ class AppLocalizationsPl extends AppLocalizations { @override String get common_delete => 'Usuń'; + @override + String get common_deleteAll => 'Usuń wszystko'; + @override String get common_close => 'Zamknąć'; @@ -3193,4 +3196,12 @@ class AppLocalizationsPl extends AppLocalizations { @override String get discoveredContacts_deleteContact => 'Usuń kontakt'; + + @override + String get discoveredContacts_deleteContactAll => + 'Usuń wszystkie odkryte kontakty'; + + @override + String get discoveredContacts_deleteContactAllContent => + 'Czy na pewno chcesz usunąć wszystkie znalezione kontakty?'; } diff --git a/lib/l10n/app_localizations_pt.dart b/lib/l10n/app_localizations_pt.dart index 58f2284..393f369 100644 --- a/lib/l10n/app_localizations_pt.dart +++ b/lib/l10n/app_localizations_pt.dart @@ -38,6 +38,9 @@ class AppLocalizationsPt extends AppLocalizations { @override String get common_delete => 'Excluir'; + @override + String get common_deleteAll => 'Excluir Tudo'; + @override String get common_close => 'Fechar'; @@ -3190,4 +3193,12 @@ class AppLocalizationsPt extends AppLocalizations { @override String get discoveredContacts_deleteContact => 'Excluir Contato'; + + @override + String get discoveredContacts_deleteContactAll => + 'Excluir Todos os Contatos Descobertos'; + + @override + String get discoveredContacts_deleteContactAllContent => + 'Tem certeza de que deseja excluir todos os contatos descobertos?'; } diff --git a/lib/l10n/app_localizations_ru.dart b/lib/l10n/app_localizations_ru.dart index 0d5dea5..192cb7f 100644 --- a/lib/l10n/app_localizations_ru.dart +++ b/lib/l10n/app_localizations_ru.dart @@ -38,6 +38,9 @@ class AppLocalizationsRu extends AppLocalizations { @override String get common_delete => 'Удалить'; + @override + String get common_deleteAll => 'Удалить все'; + @override String get common_close => 'Закрыть'; @@ -3202,4 +3205,12 @@ class AppLocalizationsRu extends AppLocalizations { @override String get discoveredContacts_deleteContact => 'Удалить контакт'; + + @override + String get discoveredContacts_deleteContactAll => + 'Удалить Все Обнаруженные Контакты'; + + @override + String get discoveredContacts_deleteContactAllContent => + 'Вы уверены, что хотите удалить все обнаруженные контакты?'; } diff --git a/lib/l10n/app_localizations_sk.dart b/lib/l10n/app_localizations_sk.dart index fd4db23..f1076b8 100644 --- a/lib/l10n/app_localizations_sk.dart +++ b/lib/l10n/app_localizations_sk.dart @@ -38,6 +38,9 @@ class AppLocalizationsSk extends AppLocalizations { @override String get common_delete => 'Odstrániť'; + @override + String get common_deleteAll => 'Zmazať všetko'; + @override String get common_close => 'Zavrieť'; @@ -3175,4 +3178,12 @@ class AppLocalizationsSk extends AppLocalizations { @override String get discoveredContacts_deleteContact => 'Zmazať kontakt'; + + @override + String get discoveredContacts_deleteContactAll => + 'Zmazať všetky objavené kontakty'; + + @override + String get discoveredContacts_deleteContactAllContent => + 'Ste si istí, že chcete zmazať všetky objavené kontakty?'; } diff --git a/lib/l10n/app_localizations_sl.dart b/lib/l10n/app_localizations_sl.dart index 339f30a..469abdb 100644 --- a/lib/l10n/app_localizations_sl.dart +++ b/lib/l10n/app_localizations_sl.dart @@ -38,6 +38,9 @@ class AppLocalizationsSl extends AppLocalizations { @override String get common_delete => 'Izbrisati'; + @override + String get common_deleteAll => 'Izbriši vse'; + @override String get common_close => 'Zapri'; @@ -3179,4 +3182,12 @@ class AppLocalizationsSl extends AppLocalizations { @override String get discoveredContacts_deleteContact => 'Izbriši stik'; + + @override + String get discoveredContacts_deleteContactAll => + 'Izbriši vse odkrite kontakte'; + + @override + String get discoveredContacts_deleteContactAllContent => + 'Ste prepričani, da želite izbrisati vse odkrite kontakte?'; } diff --git a/lib/l10n/app_localizations_sv.dart b/lib/l10n/app_localizations_sv.dart index 9e32ec8..718d7ad 100644 --- a/lib/l10n/app_localizations_sv.dart +++ b/lib/l10n/app_localizations_sv.dart @@ -38,6 +38,9 @@ class AppLocalizationsSv extends AppLocalizations { @override String get common_delete => 'Radera'; + @override + String get common_deleteAll => 'Ta bort alla'; + @override String get common_close => 'Stänga'; @@ -3158,4 +3161,12 @@ class AppLocalizationsSv extends AppLocalizations { @override String get discoveredContacts_deleteContact => 'Ta bort kontakt'; + + @override + String get discoveredContacts_deleteContactAll => + 'Ta bort alla upptäckta kontakter'; + + @override + String get discoveredContacts_deleteContactAllContent => + 'Är du säker på att du vill ta bort alla upptäckta kontakter?'; } diff --git a/lib/l10n/app_localizations_uk.dart b/lib/l10n/app_localizations_uk.dart index fae7e99..9541219 100644 --- a/lib/l10n/app_localizations_uk.dart +++ b/lib/l10n/app_localizations_uk.dart @@ -38,6 +38,9 @@ class AppLocalizationsUk extends AppLocalizations { @override String get common_delete => 'Видалити'; + @override + String get common_deleteAll => 'Видалити все'; + @override String get common_close => 'Закрити'; @@ -3209,4 +3212,12 @@ class AppLocalizationsUk extends AppLocalizations { @override String get discoveredContacts_deleteContact => 'Видалити контакт'; + + @override + String get discoveredContacts_deleteContactAll => + 'Видалити всі виявлені контакти'; + + @override + String get discoveredContacts_deleteContactAllContent => + 'Ви впевнені, що хочете видалити всі виявлені контакти?'; } diff --git a/lib/l10n/app_localizations_zh.dart b/lib/l10n/app_localizations_zh.dart index 8a3a3a3..17f84ce 100644 --- a/lib/l10n/app_localizations_zh.dart +++ b/lib/l10n/app_localizations_zh.dart @@ -38,6 +38,9 @@ class AppLocalizationsZh extends AppLocalizations { @override String get common_delete => '删除'; + @override + String get common_deleteAll => '删除全部'; + @override String get common_close => '关闭'; @@ -2957,4 +2960,10 @@ class AppLocalizationsZh extends AppLocalizations { @override String get discoveredContacts_deleteContact => '删除联系人'; + + @override + String get discoveredContacts_deleteContactAll => '删除所有发现的联系人'; + + @override + String get discoveredContacts_deleteContactAllContent => '您确定要删除所有发现的联系人吗?'; } diff --git a/lib/l10n/app_nl.arb b/lib/l10n/app_nl.arb index 68e6fc6..67ef891 100644 --- a/lib/l10n/app_nl.arb +++ b/lib/l10n/app_nl.arb @@ -1821,5 +1821,8 @@ "discoveredContacts_Title": "Ontdekte contacten", "discoveredContacts_contactAdded": "Contact toegevoegd", "discoveredContacts_searchHint": "Ontdekte contacten zoeken", - "contactsSettings_overwriteOldestSubtitle": "Wanneer de contactenlijst vol is, wordt de oudste niet-favoriete contactpersoon vervangen." + "contactsSettings_overwriteOldestSubtitle": "Wanneer de contactenlijst vol is, wordt de oudste niet-favoriete contactpersoon vervangen.", + "common_deleteAll": "Alles verwijderen", + "discoveredContacts_deleteContactAll": "Verwijder alle ontdekte contacten", + "discoveredContacts_deleteContactAllContent": "Weet u zeker dat u alle ontdekte contacten wilt verwijderen?" } diff --git a/lib/l10n/app_pl.arb b/lib/l10n/app_pl.arb index 66d55aa..d090cb5 100644 --- a/lib/l10n/app_pl.arb +++ b/lib/l10n/app_pl.arb @@ -1821,5 +1821,8 @@ "contactsSettings_autoAddSensorsSubtitle": "Zezwól towarzyszowi na automatyczne dodawanie wykrytych czujników.", "discoveredContacts_noMatching": "Brak pasujących kontaktów", "discoveredContacts_deleteContact": "Usuń kontakt", - "contactsSettings_overwriteOldestSubtitle": "Gdy lista kontaktów jest pełna, najstarszy nieulubiony kontakt zostanie zastąpiony." + "contactsSettings_overwriteOldestSubtitle": "Gdy lista kontaktów jest pełna, najstarszy nieulubiony kontakt zostanie zastąpiony.", + "common_deleteAll": "Usuń wszystko", + "discoveredContacts_deleteContactAllContent": "Czy na pewno chcesz usunąć wszystkie znalezione kontakty?", + "discoveredContacts_deleteContactAll": "Usuń wszystkie odkryte kontakty" } diff --git a/lib/l10n/app_pt.arb b/lib/l10n/app_pt.arb index bbf067b..ceecc40 100644 --- a/lib/l10n/app_pt.arb +++ b/lib/l10n/app_pt.arb @@ -1821,5 +1821,8 @@ "discoveredContacts_deleteContact": "Excluir Contato", "discoveredContacts_contactAdded": "Contato adicionado", "discoveredContacts_addContact": "Adicionar Contato", - "contactsSettings_overwriteOldestSubtitle": "Quando a lista de contatos estiver cheia, o contato mais antigo não favoritado será substituído." + "contactsSettings_overwriteOldestSubtitle": "Quando a lista de contatos estiver cheia, o contato mais antigo não favoritado será substituído.", + "common_deleteAll": "Excluir Tudo", + "discoveredContacts_deleteContactAll": "Excluir Todos os Contatos Descobertos", + "discoveredContacts_deleteContactAllContent": "Tem certeza de que deseja excluir todos os contatos descobertos?" } diff --git a/lib/l10n/app_ru.arb b/lib/l10n/app_ru.arb index 21a9cda..fbed74e 100644 --- a/lib/l10n/app_ru.arb +++ b/lib/l10n/app_ru.arb @@ -1061,5 +1061,8 @@ "discoveredContacts_addContact": "Добавить контакт", "discoveredContacts_Title": "Обнаруженные контакты", "discoveredContacts_deleteContact": "Удалить контакт", - "contactsSettings_overwriteOldestSubtitle": "Когда список контактов заполнен, будет заменен самый старый контакт, который не находится в избранном." + "contactsSettings_overwriteOldestSubtitle": "Когда список контактов заполнен, будет заменен самый старый контакт, который не находится в избранном.", + "common_deleteAll": "Удалить все", + "discoveredContacts_deleteContactAllContent": "Вы уверены, что хотите удалить все обнаруженные контакты?", + "discoveredContacts_deleteContactAll": "Удалить Все Обнаруженные Контакты" } diff --git a/lib/l10n/app_sk.arb b/lib/l10n/app_sk.arb index 19b217e..85d7bec 100644 --- a/lib/l10n/app_sk.arb +++ b/lib/l10n/app_sk.arb @@ -1821,5 +1821,8 @@ "discoveredContacts_Title": "Objavené kontakty", "contactsSettings_overwriteOldestTitle": "Prepísať najstaršie", "discoveredContacts_addContact": "Pridať kontakt", - "contactsSettings_overwriteOldestSubtitle": "Keď je zoznam kontaktov plný, bude nahradený najstarší neoznačený kontakt." + "contactsSettings_overwriteOldestSubtitle": "Keď je zoznam kontaktov plný, bude nahradený najstarší neoznačený kontakt.", + "discoveredContacts_deleteContactAll": "Zmazať všetky objavené kontakty", + "common_deleteAll": "Zmazať všetko", + "discoveredContacts_deleteContactAllContent": "Ste si istí, že chcete zmazať všetky objavené kontakty?" } diff --git a/lib/l10n/app_sl.arb b/lib/l10n/app_sl.arb index aefa817..83bbfa2 100644 --- a/lib/l10n/app_sl.arb +++ b/lib/l10n/app_sl.arb @@ -1821,5 +1821,8 @@ "discoveredContacts_Title": "Odkriti stiki", "discoveredContacts_searchHint": "Najdeni stiki po iskanju", "discoveredContacts_deleteContact": "Izbriši stik", - "contactsSettings_overwriteOldestSubtitle": "Ko je seznam stikov poln, bo najstarejši nestarševski stik zamenjan." + "contactsSettings_overwriteOldestSubtitle": "Ko je seznam stikov poln, bo najstarejši nestarševski stik zamenjan.", + "common_deleteAll": "Izbriši vse", + "discoveredContacts_deleteContactAllContent": "Ste prepričani, da želite izbrisati vse odkrite kontakte?", + "discoveredContacts_deleteContactAll": "Izbriši vse odkrite kontakte" } diff --git a/lib/l10n/app_sv.arb b/lib/l10n/app_sv.arb index b8f29d7..12996e4 100644 --- a/lib/l10n/app_sv.arb +++ b/lib/l10n/app_sv.arb @@ -1821,5 +1821,8 @@ "discoveredContacts_contactAdded": "Kontakt tillagd", "discoveredContacts_addContact": "Lägg till kontakt", "discoveredContacts_copyContact": "Kopiera kontakt till urklipp", - "contactsSettings_overwriteOldestSubtitle": "När kontaktlistan är full ersätts den äldsta icke-favoriterade kontakten." + "contactsSettings_overwriteOldestSubtitle": "När kontaktlistan är full ersätts den äldsta icke-favoriterade kontakten.", + "common_deleteAll": "Ta bort alla", + "discoveredContacts_deleteContactAllContent": "Är du säker på att du vill ta bort alla upptäckta kontakter?", + "discoveredContacts_deleteContactAll": "Ta bort alla upptäckta kontakter" } diff --git a/lib/l10n/app_uk.arb b/lib/l10n/app_uk.arb index 275cb13..4b74e37 100644 --- a/lib/l10n/app_uk.arb +++ b/lib/l10n/app_uk.arb @@ -1821,5 +1821,8 @@ "discoveredContacts_deleteContact": "Видалити контакт", "discoveredContacts_copyContact": "Копіювати контакт у буфер обміну", "discoveredContacts_addContact": "Додати контакт", - "contactsSettings_overwriteOldestSubtitle": "Коли список контактів заповнений, найстарший контакт без позначки улюбленого буде замінений." + "contactsSettings_overwriteOldestSubtitle": "Коли список контактів заповнений, найстарший контакт без позначки улюбленого буде замінений.", + "common_deleteAll": "Видалити все", + "discoveredContacts_deleteContactAll": "Видалити всі виявлені контакти", + "discoveredContacts_deleteContactAllContent": "Ви впевнені, що хочете видалити всі виявлені контакти?" } diff --git a/lib/l10n/app_zh.arb b/lib/l10n/app_zh.arb index 11bbd67..be178bc 100644 --- a/lib/l10n/app_zh.arb +++ b/lib/l10n/app_zh.arb @@ -1826,5 +1826,8 @@ "discoveredContacts_noMatching": "没有匹配的联系人", "discoveredContacts_Title": "已发现的联系人", "discoveredContacts_copyContact": "复制联系人到剪贴板", - "contactsSettings_overwriteOldestSubtitle": "当联系人列表已满时,将替换最老的非收藏联系人。" + "contactsSettings_overwriteOldestSubtitle": "当联系人列表已满时,将替换最老的非收藏联系人。", + "common_deleteAll": "删除全部", + "discoveredContacts_deleteContactAllContent": "您确定要删除所有发现的联系人吗?", + "discoveredContacts_deleteContactAll": "删除所有发现的联系人" } diff --git a/lib/screens/contacts_screen.dart b/lib/screens/contacts_screen.dart index 5753785..47bac9c 100644 --- a/lib/screens/contacts_screen.dart +++ b/lib/screens/contacts_screen.dart @@ -222,7 +222,7 @@ class _ContactsScreenState extends State final bytes = hex2Uint8List(hexString); final importContactFrame = buildImportContactFrame(bytes); _pendingOperations.add(ContactOperationType.import); - await connector.sendFrame(importContactFrame, expectsGenericAck: true); + connector.importContact(importContactFrame); } catch (e) { if (mounted) { ScaffoldMessenger.of(context).showSnackBar( diff --git a/lib/screens/discovery_screen.dart b/lib/screens/discovery_screen.dart index dadf632..f122654 100644 --- a/lib/screens/discovery_screen.dart +++ b/lib/screens/discovery_screen.dart @@ -56,6 +56,25 @@ class _DiscoveryScreenState extends State { subtitle: false, ), centerTitle: true, + actions: [ + PopupMenuButton( + itemBuilder: (context) => [ + PopupMenuItem( + child: Row( + children: [ + const Icon(Icons.delete, color: Colors.red), + const SizedBox(width: 8), + Text(context.l10n.discoveredContacts_deleteContactAll), + ], + ), + onTap: () { + _deleteContacts(context, connector); + }, + ), + ], + icon: const Icon(Icons.more_vert), + ), + ], ), body: Column( children: [ @@ -163,6 +182,30 @@ class _DiscoveryScreenState extends State { } } + void _deleteContacts(BuildContext context, MeshCoreConnector connector) { + final l10n = context.l10n; + showDialog( + context: context, + builder: (context) => AlertDialog( + title: Text(l10n.common_deleteAll), + content: Text(l10n.discoveredContacts_deleteContactAllContent), + actions: [ + TextButton( + onPressed: () => Navigator.pop(context), + child: Text(l10n.common_cancel), + ), + TextButton( + onPressed: () async { + Navigator.pop(context); + connector.removeAllDiscoveredContacts(); + }, + child: Text(l10n.common_deleteAll), + ), + ], + ), + ); + } + Widget _buildFilters( List filteredAndSorted, MeshCoreConnector connector,