fix commit

This commit is contained in:
Zach 2026-02-01 16:57:17 -07:00
parent 0374f4f5da
commit 79ffc21bd6
23 changed files with 2211 additions and 1831 deletions

View file

@ -57,9 +57,6 @@ PODS:
- nanopb/encode (3.30910.0)
- package_info_plus (0.4.5):
- Flutter
- path_provider_foundation (0.0.1):
- Flutter
- FlutterMacOS
- PromisesObjC (2.4.0)
- shared_preferences_foundation (0.0.1):
- Flutter
@ -79,7 +76,6 @@ DEPENDENCIES:
- flutter_local_notifications (from `.symlinks/plugins/flutter_local_notifications/ios`)
- mobile_scanner (from `.symlinks/plugins/mobile_scanner/ios`)
- package_info_plus (from `.symlinks/plugins/package_info_plus/ios`)
- path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`)
- shared_preferences_foundation (from `.symlinks/plugins/shared_preferences_foundation/darwin`)
- sqflite_darwin (from `.symlinks/plugins/sqflite_darwin/darwin`)
- url_launcher_ios (from `.symlinks/plugins/url_launcher_ios/ios`)
@ -112,8 +108,6 @@ EXTERNAL SOURCES:
:path: ".symlinks/plugins/mobile_scanner/ios"
package_info_plus:
:path: ".symlinks/plugins/package_info_plus/ios"
path_provider_foundation:
:path: ".symlinks/plugins/path_provider_foundation/darwin"
shared_preferences_foundation:
:path: ".symlinks/plugins/shared_preferences_foundation/darwin"
sqflite_darwin:
@ -140,7 +134,6 @@ SPEC CHECKSUMS:
mobile_scanner: af8f71879eaba2bbcb4d86c6a462c3c0e7f23036
nanopb: fad817b59e0457d11a5dfbde799381cd727c1275
package_info_plus: af8e2ca6888548050f16fa2f1938db7b5a5df499
path_provider_foundation: bb55f6dbba17d0dccd6737fe6f7f34fbd0376880
PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47
shared_preferences_foundation: 7036424c3d8ec98dfe75ff1667cb0cd531ec82bb
sqflite_darwin: 20b2a3a3b70e43edae938624ce550a3cbf66a3d0

View file

@ -104,9 +104,18 @@ class BufferWriter {
}
void writeHex(String hex) {
// Validate hex string length is even and not empty
if (hex.isEmpty || hex.length % 2 != 0) {
throw FormatException('Invalid hex string length: ${hex.length}');
}
List<int> result = [];
for (int i = 0; i < hex.length ~/ 2; i++) {
result.add(int.parse(hex.substring(i * 2, i * 2 + 2), radix: 16));
final hexByte = hex.substring(i * 2, i * 2 + 2);
final byte = int.tryParse(hexByte, radix: 16);
if (byte == null) {
throw FormatException('Invalid hex characters at position $i: $hexByte');
}
result.add(byte);
}
writeBytes(Uint8List.fromList(result));
}
@ -764,4 +773,4 @@ Uint8List buildZeroHopContact(Uint8List pubKey) {
writer.writeByte(cmdShareContact);
writer.writeBytes(pubKey);
return writer.toBytes();
}
}

View file

@ -1316,7 +1316,6 @@
"pathTrace_failed": "Path trace failed.",
"pathTrace_notAvailable": "Path trace not available.",
"pathTrace_refreshTooltip": "Refresh Path Trace.",
"contacts_pathTrace": "Path Trace",
"contacts_ping": "Ping",
"contacts_repeaterPathTrace": "Path trace to repeater",
@ -1331,10 +1330,10 @@
}
},
"contacts_clipboardEmpty": "Clipboard Is Empty.",
"contacts_invalidAdvertFormat": "Invalid Contact Data",
"contacts_contactImported": "Contact has been Imported.",
"contacts_contactImportFailed": "Contact Failed to Imported.",
"contacts_clipboardEmpty": "Clipboard is empty.",
"contacts_invalidAdvertFormat": "Invalid contact data",
"contacts_contactImported": "Contact has been imported.",
"contacts_contactImportFailed": "Failed to import contact.",
"contacts_zeroHopAdvert":"Zero Hop Advert",
"contacts_floodAdvert":"Flood Advert",
"contacts_copyAdvertToClipboard":"Copy Advert to Clipboard",

View file

@ -4771,6 +4771,90 @@ abstract class AppLocalizations {
/// In en, this message translates to:
/// **'Trace route to {name}'**
String contacts_pathTraceTo(String name);
/// No description provided for @contacts_clipboardEmpty.
///
/// In en, this message translates to:
/// **'Clipboard is empty.'**
String get contacts_clipboardEmpty;
/// No description provided for @contacts_invalidAdvertFormat.
///
/// In en, this message translates to:
/// **'Invalid contact data'**
String get contacts_invalidAdvertFormat;
/// No description provided for @contacts_contactImported.
///
/// In en, this message translates to:
/// **'Contact has been imported.'**
String get contacts_contactImported;
/// No description provided for @contacts_contactImportFailed.
///
/// In en, this message translates to:
/// **'Failed to import contact.'**
String get contacts_contactImportFailed;
/// No description provided for @contacts_zeroHopAdvert.
///
/// In en, this message translates to:
/// **'Zero Hop Advert'**
String get contacts_zeroHopAdvert;
/// No description provided for @contacts_floodAdvert.
///
/// In en, this message translates to:
/// **'Flood Advert'**
String get contacts_floodAdvert;
/// No description provided for @contacts_copyAdvertToClipboard.
///
/// In en, this message translates to:
/// **'Copy Advert to Clipboard'**
String get contacts_copyAdvertToClipboard;
/// No description provided for @contacts_addContactFromClipboard.
///
/// In en, this message translates to:
/// **'Add Contact from Clipboard'**
String get contacts_addContactFromClipboard;
/// No description provided for @contacts_ShareContact.
///
/// In en, this message translates to:
/// **'Copy contact to Clipboard'**
String get contacts_ShareContact;
/// No description provided for @contacts_ShareContactZeroHop.
///
/// In en, this message translates to:
/// **'Share contact by advert'**
String get contacts_ShareContactZeroHop;
/// No description provided for @contacts_zeroHopContactAdvertSent.
///
/// In en, this message translates to:
/// **'Sent contact by advert.'**
String get contacts_zeroHopContactAdvertSent;
/// No description provided for @contacts_zeroHopContactAdvertFailed.
///
/// In en, this message translates to:
/// **'Failed to send contact.'**
String get contacts_zeroHopContactAdvertFailed;
/// No description provided for @contacts_contactAdvertCopied.
///
/// In en, this message translates to:
/// **'Advert copied to Clipboard.'**
String get contacts_contactAdvertCopied;
/// No description provided for @contacts_contactAdvertCopyFailed.
///
/// In en, this message translates to:
/// **'Copying advert to Clipboard failed.'**
String get contacts_contactAdvertCopyFailed;
}
class _AppLocalizationsDelegate

View file

@ -451,10 +451,10 @@ class AppLocalizationsBg extends AppLocalizations {
String get appSettings_languageBg => 'Български';
@override
String get appSettings_languageRu => 'Русский';
String get appSettings_languageRu => 'Руски';
@override
String get appSettings_languageUk => 'Українська';
String get appSettings_languageUk => 'Украински';
@override
String get appSettings_notifications => 'Уведомления';
@ -2720,4 +2720,50 @@ class AppLocalizationsBg extends AppLocalizations {
String contacts_pathTraceTo(String name) {
return 'Проследи маршрут към $name';
}
@override
String get contacts_clipboardEmpty => 'Клипборда е празна.';
@override
String get contacts_invalidAdvertFormat => 'Невалидни данни за контакт';
@override
String get contacts_contactImported => 'Контактът е импортиран.';
@override
String get contacts_contactImportFailed =>
'Контактът не е успешно импортиран.';
@override
String get contacts_zeroHopAdvert => 'Реклама без скок';
@override
String get contacts_floodAdvert => 'Потопна реклама';
@override
String get contacts_copyAdvertToClipboard => 'Копирай обявата в клипборда';
@override
String get contacts_addContactFromClipboard => 'Добави контакт от клипборда';
@override
String get contacts_ShareContact => 'Копирай контакт в клипборда';
@override
String get contacts_ShareContactZeroHop => 'Сподели контакт чрез обява';
@override
String get contacts_zeroHopContactAdvertSent => 'Изпратен контакт по обява.';
@override
String get contacts_zeroHopContactAdvertFailed =>
'Неуспешно изпращане на контакт.';
@override
String get contacts_contactAdvertCopied =>
'Рекламата е копирана в клипборда.';
@override
String get contacts_contactAdvertCopyFailed =>
'Копирането на обявата в клипборда не успя.';
}

View file

@ -445,10 +445,10 @@ class AppLocalizationsDe extends AppLocalizations {
String get appSettings_languageBg => 'Български';
@override
String get appSettings_languageRu => 'Русский';
String get appSettings_languageRu => 'Russisch';
@override
String get appSettings_languageUk => 'Українська';
String get appSettings_languageUk => 'Ukrainisch';
@override
String get appSettings_notifications => 'Benachrichtigungen';
@ -2724,4 +2724,53 @@ class AppLocalizationsDe extends AppLocalizations {
String contacts_pathTraceTo(String name) {
return 'Route nach $name verfolgen';
}
@override
String get contacts_clipboardEmpty => 'Die Zwischenablage ist leer.';
@override
String get contacts_invalidAdvertFormat => 'Ungültige Kontaktdaten';
@override
String get contacts_contactImported => 'Kontakt wurde importiert.';
@override
String get contacts_contactImportFailed =>
'Kontakt konnte nicht importiert werden';
@override
String get contacts_zeroHopAdvert => 'Zero-Hop-Anzeige';
@override
String get contacts_floodAdvert => 'Überflutungsanzeige';
@override
String get contacts_copyAdvertToClipboard =>
'Werbung in die Zwischenablage kopieren';
@override
String get contacts_addContactFromClipboard =>
'Kontakt aus Zwischenablage hinzufügen';
@override
String get contacts_ShareContact => 'Kontakt in die Zwischenablage kopieren';
@override
String get contacts_ShareContactZeroHop => 'Kontakt über Anzeige teilen';
@override
String get contacts_zeroHopContactAdvertSent =>
'Kontakt über Anzeige gesendet';
@override
String get contacts_zeroHopContactAdvertFailed =>
'Kontakt konnte nicht gesendet werden.';
@override
String get contacts_contactAdvertCopied =>
'Anzeige in die Zwischenablage kopiert.';
@override
String get contacts_contactAdvertCopyFailed =>
'Kopieren des Werbeinhalts in die Zwischenablage fehlgeschlagen.';
}

View file

@ -2680,4 +2680,47 @@ class AppLocalizationsEn extends AppLocalizations {
String contacts_pathTraceTo(String name) {
return 'Trace route to $name';
}
@override
String get contacts_clipboardEmpty => 'Clipboard is empty.';
@override
String get contacts_invalidAdvertFormat => 'Invalid contact data';
@override
String get contacts_contactImported => 'Contact has been imported.';
@override
String get contacts_contactImportFailed => 'Failed to import contact.';
@override
String get contacts_zeroHopAdvert => 'Zero Hop Advert';
@override
String get contacts_floodAdvert => 'Flood Advert';
@override
String get contacts_copyAdvertToClipboard => 'Copy Advert to Clipboard';
@override
String get contacts_addContactFromClipboard => 'Add Contact from Clipboard';
@override
String get contacts_ShareContact => 'Copy contact to Clipboard';
@override
String get contacts_ShareContactZeroHop => 'Share contact by advert';
@override
String get contacts_zeroHopContactAdvertSent => 'Sent contact by advert.';
@override
String get contacts_zeroHopContactAdvertFailed => 'Failed to send contact.';
@override
String get contacts_contactAdvertCopied => 'Advert copied to Clipboard.';
@override
String get contacts_contactAdvertCopyFailed =>
'Copying advert to Clipboard failed.';
}

View file

@ -448,10 +448,10 @@ class AppLocalizationsEs extends AppLocalizations {
String get appSettings_languageBg => 'Български';
@override
String get appSettings_languageRu => 'Русский';
String get appSettings_languageRu => 'Ruso';
@override
String get appSettings_languageUk => 'Українська';
String get appSettings_languageUk => 'Ucraniano';
@override
String get appSettings_notifications => 'Notificaciones';
@ -2720,4 +2720,50 @@ class AppLocalizationsEs extends AppLocalizations {
String contacts_pathTraceTo(String name) {
return 'Rastrear ruta a $name';
}
@override
String get contacts_clipboardEmpty => 'El portapapeles está vacío.';
@override
String get contacts_invalidAdvertFormat => 'Datos de contacto no válidos';
@override
String get contacts_contactImported => 'El contacto ha sido importado.';
@override
String get contacts_contactImportFailed =>
'Contacto no se importó correctamente.';
@override
String get contacts_zeroHopAdvert => 'Anuncio de Zero Hop';
@override
String get contacts_floodAdvert => 'Anuncio de inundación';
@override
String get contacts_copyAdvertToClipboard => 'Copiar anuncio al portapapeles';
@override
String get contacts_addContactFromClipboard =>
'Agregar contacto desde el portapapeles';
@override
String get contacts_ShareContact => 'Copiar contacto al Portapapeles';
@override
String get contacts_ShareContactZeroHop => 'Compartir contacto por anuncio';
@override
String get contacts_zeroHopContactAdvertSent => 'Envió contacto por anuncio.';
@override
String get contacts_zeroHopContactAdvertFailed =>
'No se pudo enviar el contacto.';
@override
String get contacts_contactAdvertCopied => 'Anuncio copiado al Portapapeles.';
@override
String get contacts_contactAdvertCopyFailed =>
'Copiar anuncio al Portapapeles ha fallado.';
}

View file

@ -449,10 +449,10 @@ class AppLocalizationsFr extends AppLocalizations {
String get appSettings_languageBg => 'Български';
@override
String get appSettings_languageRu => 'Русский';
String get appSettings_languageRu => 'Russe';
@override
String get appSettings_languageUk => 'Українська';
String get appSettings_languageUk => 'Ukrainien';
@override
String get appSettings_notifications => 'Notifications';
@ -2737,4 +2737,54 @@ class AppLocalizationsFr extends AppLocalizations {
String contacts_pathTraceTo(String name) {
return 'Tracer l\'itinéraire vers $name';
}
@override
String get contacts_clipboardEmpty => 'Le presse-papiers est vide.';
@override
String get contacts_invalidAdvertFormat => 'Données de contact non valides';
@override
String get contacts_contactImported => 'Le contact a été importé.';
@override
String get contacts_contactImportFailed =>
'Échec de l\'importation du contact.';
@override
String get contacts_zeroHopAdvert => 'Annonce Zero Hop';
@override
String get contacts_floodAdvert => 'Annonce de crue';
@override
String get contacts_copyAdvertToClipboard =>
'Copier l\'annonce dans le presse-papiers';
@override
String get contacts_addContactFromClipboard =>
'Ajouter un contact depuis le presse-papiers';
@override
String get contacts_ShareContact =>
'Copier le contact dans le presse-papiers';
@override
String get contacts_ShareContactZeroHop => 'Partager un contact par annonce';
@override
String get contacts_zeroHopContactAdvertSent =>
'Envoyer un contact par annonce.';
@override
String get contacts_zeroHopContactAdvertFailed =>
'Échec de l\'envoi du contact.';
@override
String get contacts_contactAdvertCopied =>
'Annonce copiée dans le presse-papiers.';
@override
String get contacts_contactAdvertCopyFailed =>
'La copie de l\'annonce vers le presse-papiers a échoué.';
}

View file

@ -447,10 +447,10 @@ class AppLocalizationsIt extends AppLocalizations {
String get appSettings_languageBg => 'Български';
@override
String get appSettings_languageRu => 'Русский';
String get appSettings_languageRu => 'Russo';
@override
String get appSettings_languageUk => 'Українська';
String get appSettings_languageUk => 'Ucraino';
@override
String get appSettings_notifications => 'Notifiche';
@ -2721,4 +2721,52 @@ class AppLocalizationsIt extends AppLocalizations {
String contacts_pathTraceTo(String name) {
return 'Traccia percorso verso $name';
}
@override
String get contacts_clipboardEmpty => 'La clipboard è vuota.';
@override
String get contacts_invalidAdvertFormat => 'Dati di contatto non validi';
@override
String get contacts_contactImported => 'Il contatto è stato importato.';
@override
String get contacts_contactImportFailed =>
'Contatto non importato con successo.';
@override
String get contacts_zeroHopAdvert => 'Annuncio Zero Hop';
@override
String get contacts_floodAdvert => 'Annuncio alluvionale';
@override
String get contacts_copyAdvertToClipboard => 'Copia Annuncio negli Appunti';
@override
String get contacts_addContactFromClipboard =>
'Aggiungere contatto dalla clipboard';
@override
String get contacts_ShareContact => 'Copia contatto negli Appunti';
@override
String get contacts_ShareContactZeroHop =>
'Condividi contatto tramite annuncio';
@override
String get contacts_zeroHopContactAdvertSent =>
'Inviato contatto tramite annuncio.';
@override
String get contacts_zeroHopContactAdvertFailed =>
'Invio del contatto non riuscito.';
@override
String get contacts_contactAdvertCopied => 'Annuncio copiato negli Appunti.';
@override
String get contacts_contactAdvertCopyFailed =>
'Copia dell\'annuncio nella Clipboard non riuscita.';
}

View file

@ -445,10 +445,10 @@ class AppLocalizationsNl extends AppLocalizations {
String get appSettings_languageBg => 'Български';
@override
String get appSettings_languageRu => 'Русский';
String get appSettings_languageRu => 'Russisch';
@override
String get appSettings_languageUk => 'Українська';
String get appSettings_languageUk => 'Oekraïens';
@override
String get appSettings_notifications => 'Notificaties';
@ -2710,4 +2710,52 @@ class AppLocalizationsNl extends AppLocalizations {
String contacts_pathTraceTo(String name) {
return 'Trace route to $name';
}
@override
String get contacts_clipboardEmpty => 'Knipbord is leeg.';
@override
String get contacts_invalidAdvertFormat => 'Ongeldige contactgegevens';
@override
String get contacts_contactImported => 'Contact is geïmporteerd.';
@override
String get contacts_contactImportFailed =>
'Contact kon niet geïmporteerd worden.';
@override
String get contacts_zeroHopAdvert => 'Zero Hop Reclame';
@override
String get contacts_floodAdvert => 'Overstromingsadvertentie';
@override
String get contacts_copyAdvertToClipboard => 'Advert naar klembord kopiëren';
@override
String get contacts_addContactFromClipboard =>
'Contact uit klembord toevoegen';
@override
String get contacts_ShareContact => 'Kontakt naar Klembord kopiëren';
@override
String get contacts_ShareContactZeroHop => 'Contact delen via advertentie';
@override
String get contacts_zeroHopContactAdvertSent =>
'Contact verzonden via advertentie';
@override
String get contacts_zeroHopContactAdvertFailed =>
'Mislukt om contact te verzenden';
@override
String get contacts_contactAdvertCopied =>
'Reclame gekopieerd naar Klembord.';
@override
String get contacts_contactAdvertCopyFailed =>
'Kopiëren van advertentie naar Clipboard is mislukt.';
}

View file

@ -449,10 +449,10 @@ class AppLocalizationsPl extends AppLocalizations {
String get appSettings_languageBg => 'Български';
@override
String get appSettings_languageRu => 'Русский';
String get appSettings_languageRu => 'Rosyjski';
@override
String get appSettings_languageUk => 'Українська';
String get appSettings_languageUk => 'Ukraińska';
@override
String get appSettings_notifications => 'Powiadomienia';
@ -2719,4 +2719,51 @@ class AppLocalizationsPl extends AppLocalizations {
String contacts_pathTraceTo(String name) {
return 'Śledź trasę do $name';
}
@override
String get contacts_clipboardEmpty => 'Schowek jest pusty.';
@override
String get contacts_invalidAdvertFormat => 'Nieprawidłowe dane kontaktowe';
@override
String get contacts_contactImported => 'Kontakt został zaimportowany.';
@override
String get contacts_contactImportFailed =>
'Kontakt nie został zaimportowany.';
@override
String get contacts_zeroHopAdvert => 'Reklama Zero Hop';
@override
String get contacts_floodAdvert => 'Reklama powodziowa';
@override
String get contacts_copyAdvertToClipboard => 'Kopiuj ogłoszenie do schowka';
@override
String get contacts_addContactFromClipboard => 'Dodaj kontakt z schowka';
@override
String get contacts_ShareContact => 'Kopiuj kontakt do schowka';
@override
String get contacts_ShareContactZeroHop =>
'Udostępnij kontakt przez ogłoszenie';
@override
String get contacts_zeroHopContactAdvertSent =>
'Wysłano kontakt przez ogłoszenie.';
@override
String get contacts_zeroHopContactAdvertFailed =>
'Nie udało się wysłać kontaktu.';
@override
String get contacts_contactAdvertCopied => 'Reklama skopiowana do schowka.';
@override
String get contacts_contactAdvertCopyFailed =>
'Kopiowanie ogłoszenia do schowka nie powiodło się.';
}

View file

@ -449,10 +449,10 @@ class AppLocalizationsPt extends AppLocalizations {
String get appSettings_languageBg => 'Български';
@override
String get appSettings_languageRu => 'Русский';
String get appSettings_languageRu => 'Russo';
@override
String get appSettings_languageUk => 'Українська';
String get appSettings_languageUk => 'Ucraniano';
@override
String get appSettings_notifications => 'Notificações';
@ -2721,4 +2721,51 @@ class AppLocalizationsPt extends AppLocalizations {
String contacts_pathTraceTo(String name) {
return 'Rastrear rota para $name';
}
@override
String get contacts_clipboardEmpty => 'Área de Transferência Está Vazia.';
@override
String get contacts_invalidAdvertFormat => 'Dados de Contato Inválidos';
@override
String get contacts_contactImported => 'Contato foi importado.';
@override
String get contacts_contactImportFailed => 'Contato falhou ao ser importado.';
@override
String get contacts_zeroHopAdvert => 'Anúncio Zero Hop';
@override
String get contacts_floodAdvert => 'Anúncio de Inundação';
@override
String get contacts_copyAdvertToClipboard =>
'Copiar Anúncio para Área de Transferência';
@override
String get contacts_addContactFromClipboard =>
'Adicionar Contato da Área de Transferência';
@override
String get contacts_ShareContact =>
'Copiar contato para Área de Transferência';
@override
String get contacts_ShareContactZeroHop => 'Compartilhar contato por anúncio';
@override
String get contacts_zeroHopContactAdvertSent => 'Enviou contato por anúncio.';
@override
String get contacts_zeroHopContactAdvertFailed => 'Falha ao enviar contato.';
@override
String get contacts_contactAdvertCopied =>
'Anúncio copiado para a Área de Transferência.';
@override
String get contacts_contactAdvertCopyFailed =>
'Cópia do anúncio para a Área de Transferência falhou.';
}

View file

@ -2723,4 +2723,54 @@ class AppLocalizationsRu extends AppLocalizations {
String contacts_pathTraceTo(String name) {
return 'Показать маршрут к $name';
}
@override
String get contacts_clipboardEmpty => 'Буфер обмена пуст.';
@override
String get contacts_invalidAdvertFormat =>
'Недействительные контактные данные';
@override
String get contacts_contactImported => 'Контакт был импортирован';
@override
String get contacts_contactImportFailed => 'Контакт не удалось импортировать';
@override
String get contacts_zeroHopAdvert => 'Реклама Zero Hop';
@override
String get contacts_floodAdvert => 'Рекламный поток';
@override
String get contacts_copyAdvertToClipboard =>
'Копировать рекламу в буфер обмена';
@override
String get contacts_addContactFromClipboard =>
'Добавить контакт из буфера обмена';
@override
String get contacts_ShareContact => 'Копировать контакт в буфер обмена';
@override
String get contacts_ShareContactZeroHop =>
'Поделиться контактом по объявлению';
@override
String get contacts_zeroHopContactAdvertSent =>
'Отправлено сообщение по объявлению.';
@override
String get contacts_zeroHopContactAdvertFailed =>
'Не удалось отправить контакт.';
@override
String get contacts_contactAdvertCopied =>
'Реклама скопирована в буфер обмена.';
@override
String get contacts_contactAdvertCopyFailed =>
'Копирование рекламы в буфер обмена не удалось.';
}

View file

@ -445,10 +445,10 @@ class AppLocalizationsSk extends AppLocalizations {
String get appSettings_languageBg => 'Български';
@override
String get appSettings_languageRu => 'Русский';
String get appSettings_languageRu => 'Ruština';
@override
String get appSettings_languageUk => 'Українська';
String get appSettings_languageUk => 'Ukrajinská';
@override
String get appSettings_notifications => 'Upozornenia';
@ -2706,4 +2706,50 @@ class AppLocalizationsSk extends AppLocalizations {
String contacts_pathTraceTo(String name) {
return 'Sledovať trasu k $name';
}
@override
String get contacts_clipboardEmpty => 'Schránka je prázdna.';
@override
String get contacts_invalidAdvertFormat => 'Neplatné kontaktné údaje';
@override
String get contacts_contactImported => 'Kontakt bol importovaný.';
@override
String get contacts_contactImportFailed =>
'Kontakt sa nepodarilo importovať.';
@override
String get contacts_zeroHopAdvert => 'Inzerát Zero Hop';
@override
String get contacts_floodAdvert => 'Inzerát povodní';
@override
String get contacts_copyAdvertToClipboard => 'Kopírovať reklamu do schránky';
@override
String get contacts_addContactFromClipboard => 'Pridať kontakt z schránky';
@override
String get contacts_ShareContact => 'Kopírovať kontakt do schránky';
@override
String get contacts_ShareContactZeroHop => 'Zdieľať kontakt cez inzerát';
@override
String get contacts_zeroHopContactAdvertSent => 'Poslal kontakt cez inzerát.';
@override
String get contacts_zeroHopContactAdvertFailed =>
'Zlyhalo odoslanie kontaktu.';
@override
String get contacts_contactAdvertCopied =>
'Inzerát bol skopírovaný do schránky.';
@override
String get contacts_contactAdvertCopyFailed =>
'Kopírovanie inzerátu do schránky zlyhalo.';
}

View file

@ -444,10 +444,10 @@ class AppLocalizationsSl extends AppLocalizations {
String get appSettings_languageBg => 'Български';
@override
String get appSettings_languageRu => 'Русский';
String get appSettings_languageRu => 'Ruščina';
@override
String get appSettings_languageUk => 'Українська';
String get appSettings_languageUk => 'Ukrajinsko';
@override
String get appSettings_notifications => 'Obvestila';
@ -2709,4 +2709,49 @@ class AppLocalizationsSl extends AppLocalizations {
String contacts_pathTraceTo(String name) {
return 'Trace route to $name';
}
@override
String get contacts_clipboardEmpty => 'Odložišče je prazno.';
@override
String get contacts_invalidAdvertFormat => 'Neveljavni kontaktne podatke';
@override
String get contacts_contactImported => 'Kontakt je bil uvožen.';
@override
String get contacts_contactImportFailed => 'Kontakt ni bil uspešno uvožen.';
@override
String get contacts_zeroHopAdvert => 'Reklama brez posrednikov';
@override
String get contacts_floodAdvert => 'Poplavna oglás';
@override
String get contacts_copyAdvertToClipboard => 'Kopiraj oglas v odložišče';
@override
String get contacts_addContactFromClipboard => 'Dodaj stik iz odložišča';
@override
String get contacts_ShareContact => 'Kopiraj stik v Odložišče';
@override
String get contacts_ShareContactZeroHop => 'Deliti kontakt prek oglasa';
@override
String get contacts_zeroHopContactAdvertSent => 'Poslano po oglasu.';
@override
String get contacts_zeroHopContactAdvertFailed =>
'Pošiljanje kontakta ni uspelo.';
@override
String get contacts_contactAdvertCopied =>
'Oglas je bil kopiran v odložišče.';
@override
String get contacts_contactAdvertCopyFailed =>
'Kopiranje oglasa v odložišče je spodletelo.';
}

View file

@ -442,10 +442,10 @@ class AppLocalizationsSv extends AppLocalizations {
String get appSettings_languageBg => 'Български';
@override
String get appSettings_languageRu => 'Русский';
String get appSettings_languageRu => 'Ryska';
@override
String get appSettings_languageUk => 'Українська';
String get appSettings_languageUk => 'Ukrainska';
@override
String get appSettings_notifications => 'Meddelanden';
@ -2694,4 +2694,49 @@ class AppLocalizationsSv extends AppLocalizations {
String contacts_pathTraceTo(String name) {
return 'Spåra rutt till $name';
}
@override
String get contacts_clipboardEmpty => 'Urklipp är tomt.';
@override
String get contacts_invalidAdvertFormat => 'Ogiltiga kontaktuppgifter';
@override
String get contacts_contactImported => 'Kontakt har importerats.';
@override
String get contacts_contactImportFailed => 'Kontakt kunde inte importeras.';
@override
String get contacts_zeroHopAdvert => 'Reklam med nollhopp';
@override
String get contacts_floodAdvert => 'Översvämningsannons';
@override
String get contacts_copyAdvertToClipboard => 'Kopiera annons till urklipp';
@override
String get contacts_addContactFromClipboard =>
'Lägg till kontakt från urklipp';
@override
String get contacts_ShareContact => 'Kopiera kontakt till Urklipp';
@override
String get contacts_ShareContactZeroHop => 'Dela kontakt via annons';
@override
String get contacts_zeroHopContactAdvertSent => 'Skickat kontakt via annons.';
@override
String get contacts_zeroHopContactAdvertFailed =>
'Misslyckades med att skicka kontakt.';
@override
String get contacts_contactAdvertCopied => 'Annons kopierad till Urklipp.';
@override
String get contacts_contactAdvertCopyFailed =>
'Kopiering av annons till Urklipp misslyckades.';
}

View file

@ -447,7 +447,7 @@ class AppLocalizationsUk extends AppLocalizations {
String get appSettings_languageBg => 'Български';
@override
String get appSettings_languageRu => 'Русский';
String get appSettings_languageRu => 'Російська';
@override
String get appSettings_languageUk => 'Українська';
@ -2730,4 +2730,53 @@ class AppLocalizationsUk extends AppLocalizations {
String contacts_pathTraceTo(String name) {
return 'Відстежити маршрут до $name';
}
@override
String get contacts_clipboardEmpty => 'Буфер обміну порожній';
@override
String get contacts_invalidAdvertFormat => 'Недійсні контактні дані';
@override
String get contacts_contactImported => 'Контакт було імпортовано.';
@override
String get contacts_contactImportFailed => 'Контакт не вдалося імпортувати';
@override
String get contacts_zeroHopAdvert => 'Реклама без перехоплення';
@override
String get contacts_floodAdvert => 'Залив реклами';
@override
String get contacts_copyAdvertToClipboard =>
'Копіювати оголошення в буфер обміну';
@override
String get contacts_addContactFromClipboard =>
'Додати контакт з буфера обміну';
@override
String get contacts_ShareContact => 'Копіювати контакт у буфер обміну';
@override
String get contacts_ShareContactZeroHop =>
'Поділитися контактом за оголошенням';
@override
String get contacts_zeroHopContactAdvertSent =>
'Відправлено контакт за оголошенням';
@override
String get contacts_zeroHopContactAdvertFailed =>
'Не вдалося надіслати контакт.';
@override
String get contacts_contactAdvertCopied =>
'Рекламу скопійовано до буфера обміну.';
@override
String get contacts_contactAdvertCopyFailed =>
'Копіювання оголошення в буфер обміну завершилося невдало';
}

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -34,6 +34,12 @@ enum RoomLoginDestination {
management,
}
enum ContactOperationType {
import,
export,
zeroHopShare,
}
class ContactsScreen extends StatefulWidget {
final bool hideBackButton;
@ -54,9 +60,7 @@ class _ContactsScreenState extends State<ContactsScreen>
List<ContactGroup> _groups = [];
Timer? _searchDebounce;
bool _imported = false;
bool _zeroHopContact = false;
bool _copyedContact = false;
final Set<ContactOperationType> _pendingOperations = {};
StreamSubscription<Uint8List>? _frameSubscription;
@ -97,57 +101,67 @@ class _ContactsScreenState extends State<ContactsScreen>
if (code == respCodeExportContact) {
final advertPacket = frameBuffer.readRemainingBytes();
// Validate packet has expected minimum size (98+ bytes per protocol)
if (advertPacket.length < 98) {
if (mounted) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text(context.l10n.contacts_invalidAdvertFormat)),
);
}
_pendingOperations.remove(ContactOperationType.export);
return;
}
final hexString = pubKeyToHex(advertPacket);
Clipboard.setData(ClipboardData(text: "meshcore://$hexString"));
}
if(code == respCodeOk) {
// Show a snackbar indicating success
if(_imported && mounted){
if(!mounted) return;
if(_pendingOperations.contains(ContactOperationType.import)){
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text(context.l10n.contacts_contactImported)),
);
}
if(_zeroHopContact && mounted) {
if(_pendingOperations.contains(ContactOperationType.zeroHopShare)) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text(context.l10n.contacts_zeroHopContactAdvertSent)),
);
}
if(_copyedContact && mounted) {
if(_pendingOperations.contains(ContactOperationType.export)) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text(context.l10n.contacts_contactAdvertCopied)),
);
}
_copyedContact = false;
_zeroHopContact = false;
_imported = false;
_pendingOperations.clear();
}
if(code == respCodeErr) {
// Show a snackbar indicating failure
if(_imported && mounted){
if(!mounted) return;
if(_pendingOperations.contains(ContactOperationType.import)){
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text(context.l10n.contacts_contactImportFailed)),
);
}
if(_zeroHopContact && mounted) {
if(_pendingOperations.contains(ContactOperationType.zeroHopShare)) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text(context.l10n.contacts_zeroHopContactAdvertFailed)),
);
}
if(_copyedContact && mounted) {
if(_pendingOperations.contains(ContactOperationType.export)) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text(context.l10n.contacts_contactAdvertCopyFailed)),
);
}
_copyedContact = false;
_imported = false;
_zeroHopContact = false;
_pendingOperations.clear();
}
});
@ -156,15 +170,14 @@ class _ContactsScreenState extends State<ContactsScreen>
Future<void> _contactExport(Uint8List pubKey) async {
final connector = Provider.of<MeshCoreConnector>(context, listen: false);
final exportContactFrame = buildExportContactFrame(pubKey);
_copyedContact = true;
_pendingOperations.add(ContactOperationType.export);
await connector.sendFrame(exportContactFrame);
return;
}
Future<void> _contactZeroHop(Uint8List pubKey) async {
final connector = Provider.of<MeshCoreConnector>(context, listen: false);
final exportContactZeroHopFrame = buildZeroHopContact(pubKey);
_zeroHopContact = true;
_pendingOperations.add(ContactOperationType.zeroHopShare);
await connector.sendFrame(exportContactZeroHopFrame);
}
@ -191,8 +204,8 @@ class _ContactsScreenState extends State<ContactsScreen>
final hexString = text.substring('meshcore://'.length);
try {
final importContactFrame = buildImportContactFrame(hexString);
_pendingOperations.add(ContactOperationType.import);
await connector.sendFrame(importContactFrame);
_imported = true;
} catch (e) {
if(mounted) {
ScaffoldMessenger.of(context).showSnackBar(

File diff suppressed because it is too large Load diff

View file

@ -1,69 +1 @@
{
"bg": [
"appSettings_languageRu",
"appSettings_languageUk"
],
"de": [
"appSettings_languageRu",
"appSettings_languageUk"
],
"es": [
"appSettings_languageRu",
"appSettings_languageUk"
],
"fr": [
"appSettings_languageRu",
"appSettings_languageUk"
],
"it": [
"appSettings_languageRu",
"appSettings_languageUk"
],
"nl": [
"appSettings_languageRu",
"appSettings_languageUk"
],
"pl": [
"appSettings_languageRu",
"appSettings_languageUk"
],
"pt": [
"appSettings_languageRu",
"appSettings_languageUk"
],
"ru": [
"appSettings_languageUk"
],
"sk": [
"appSettings_languageRu",
"appSettings_languageUk"
],
"sl": [
"appSettings_languageRu",
"appSettings_languageUk"
],
"sv": [
"appSettings_languageRu",
"appSettings_languageUk"
],
"uk": [
"appSettings_languageRu"
],
"zh": [
"appSettings_languageRu",
"appSettings_languageUk"
]
}
{}