fix: reliable first-message send, QR routing, auto-lock recovery
Fixes reported by testers and found in an app review: - First message right after install no longer fails. Before the app finished registering with the relay, the outgoing message could crash on a null delivery address. The profile field is now optional and the send path throws a clear "still connecting, try again shortly" error while registration completes in the background. - The QR code and share link now appear only once the delivery address is ready. Previously a link generated before the first connection lacked routing, so the other side could not send the first message. The screen now shows a connecting state and reactively swaps in the QR when ready. - Incomplete contact links are rejected on import instead of failing at first send, with a clear prompt to ask for a fresh link. - Auto-lock no longer silences the app: after locking and unlocking, messaging is restarted (it previously stayed dead until app restart). - Group messages are marked failed on a non-per-member send error instead of hanging in the "sending" state forever. - Hardened the relay client against a rare duplicate connection when toggling Tor or locking mid-connect, and fromShareString now rejects a delivery address of the wrong length. - Pin unifiedpush below 6.2.0 to drop the webcrypto dependency (its native framework lacks LC_ENCRYPTION_INFO and blocked the iOS upload). - Skip Android release lint (network dependency check hangs on the build host and adds no value for a Flutter app).
This commit is contained in:
@@ -554,6 +554,18 @@ abstract class AppLocalizations {
|
||||
/// **'Relay nedostupný (sender certificate)'**
|
||||
String get errorRelayUnavailable;
|
||||
|
||||
/// NotYetRegisteredError z _sendContent, když vlastní registrace na relay ještě nedoběhla (čerstvá instalace). 'Šepot' je značka, nepřekládat.
|
||||
///
|
||||
/// In cs, this message translates to:
|
||||
/// **'Šepot se ještě připojuje k relayi — zkus zprávu poslat za chvíli.'**
|
||||
String get errorNotYetRegistered;
|
||||
|
||||
/// ContactLinkIncompleteError při přidání kontaktu z odkazu/QR bez routingu (aid+da). 'sepot://' je schéma odkazu, zachovat.
|
||||
///
|
||||
/// In cs, this message translates to:
|
||||
/// **'Odkaz je neúplný — protistrana ho vytvořila dřív, než se stihla připojit. Požádej ji o nový sepot:// odkaz.'**
|
||||
String get errorContactLinkIncomplete;
|
||||
|
||||
/// StateError z _prepareAttachment při překročení limitu velikosti přílohy; zobrazuje UI výběru/odeslání přílohy. POZOR: v kódu jde o dva adjacentní literály 'Příloha je příliš velká ' (ř. 448) + '(max ${…} MB)' (ř. 449) — sloučit do jednoho klíče.
|
||||
///
|
||||
/// In cs, this message translates to:
|
||||
@@ -1862,6 +1874,18 @@ abstract class AppLocalizations {
|
||||
/// **'Můj Šepot ID'**
|
||||
String get qrShareTitle;
|
||||
|
||||
/// Titulek na QR obrazovce, když vlastní registrace na relay ještě nedoběhla — routing (aid+da) není hotový, QR by byl neúplný.
|
||||
///
|
||||
/// In cs, this message translates to:
|
||||
/// **'Připojuji k relayi…'**
|
||||
String get qrShareConnectingTitle;
|
||||
|
||||
/// Vysvětlení pod titulkem qrShareConnectingTitle. 'Šepot' je značka, nepřekládat.
|
||||
///
|
||||
/// In cs, this message translates to:
|
||||
/// **'Až se Šepot poprvé připojí, objeví se tvůj QR kód a odkaz. Chvilku strpení — stačí pár sekund.'**
|
||||
String get qrShareConnectingBody;
|
||||
|
||||
/// Text uprostřed obrazovky, když identityProvider vrátí null (nemělo by běžně nastat)
|
||||
///
|
||||
/// In cs, this message translates to:
|
||||
|
||||
@@ -276,6 +276,14 @@ class AppLocalizationsCs extends AppLocalizations {
|
||||
@override
|
||||
String get errorRelayUnavailable => 'Relay nedostupný (sender certificate)';
|
||||
|
||||
@override
|
||||
String get errorNotYetRegistered =>
|
||||
'Šepot se ještě připojuje k relayi — zkus zprávu poslat za chvíli.';
|
||||
|
||||
@override
|
||||
String get errorContactLinkIncomplete =>
|
||||
'Odkaz je neúplný — protistrana ho vytvořila dřív, než se stihla připojit. Požádej ji o nový sepot:// odkaz.';
|
||||
|
||||
@override
|
||||
String errorAttachmentTooLarge(int maxMb) {
|
||||
return 'Příloha je příliš velká (max $maxMb MB)';
|
||||
@@ -1048,6 +1056,13 @@ class AppLocalizationsCs extends AppLocalizations {
|
||||
@override
|
||||
String get qrShareTitle => 'Můj Šepot ID';
|
||||
|
||||
@override
|
||||
String get qrShareConnectingTitle => 'Připojuji k relayi…';
|
||||
|
||||
@override
|
||||
String get qrShareConnectingBody =>
|
||||
'Až se Šepot poprvé připojí, objeví se tvůj QR kód a odkaz. Chvilku strpení — stačí pár sekund.';
|
||||
|
||||
@override
|
||||
String get qrIdentityNotFound => 'Identita nebyla nalezena';
|
||||
|
||||
|
||||
@@ -277,6 +277,14 @@ class AppLocalizationsDe extends AppLocalizations {
|
||||
String get errorRelayUnavailable =>
|
||||
'Relay nicht erreichbar (Sender-Zertifikat)';
|
||||
|
||||
@override
|
||||
String get errorNotYetRegistered =>
|
||||
'Šepot verbindet sich noch mit dem Relay — versuch es gleich noch einmal.';
|
||||
|
||||
@override
|
||||
String get errorContactLinkIncomplete =>
|
||||
'Dieser Link ist unvollständig — die andere Person hat ihn erstellt, bevor sie verbunden war. Bitte sie um einen neuen sepot://-Link.';
|
||||
|
||||
@override
|
||||
String errorAttachmentTooLarge(int maxMb) {
|
||||
return 'Anhang ist zu groß (max. $maxMb MB)';
|
||||
@@ -1067,6 +1075,13 @@ class AppLocalizationsDe extends AppLocalizations {
|
||||
@override
|
||||
String get qrShareTitle => 'Meine Šepot-ID';
|
||||
|
||||
@override
|
||||
String get qrShareConnectingTitle => 'Verbinde mit dem Relay…';
|
||||
|
||||
@override
|
||||
String get qrShareConnectingBody =>
|
||||
'Dein QR-Code und Link erscheinen, sobald sich Šepot zum ersten Mal verbindet. Einen Moment — es dauert nur ein paar Sekunden.';
|
||||
|
||||
@override
|
||||
String get qrIdentityNotFound => 'Identität nicht gefunden';
|
||||
|
||||
|
||||
@@ -274,6 +274,14 @@ class AppLocalizationsEn extends AppLocalizations {
|
||||
@override
|
||||
String get errorRelayUnavailable => 'Relay unavailable (sender certificate)';
|
||||
|
||||
@override
|
||||
String get errorNotYetRegistered =>
|
||||
'Šepot is still connecting to the relay — try sending again in a moment.';
|
||||
|
||||
@override
|
||||
String get errorContactLinkIncomplete =>
|
||||
'This link is incomplete — the other person created it before connecting. Ask them for a new sepot:// link.';
|
||||
|
||||
@override
|
||||
String errorAttachmentTooLarge(int maxMb) {
|
||||
return 'Attachment is too large (max $maxMb MB)';
|
||||
@@ -1044,6 +1052,13 @@ class AppLocalizationsEn extends AppLocalizations {
|
||||
@override
|
||||
String get qrShareTitle => 'My Šepot ID';
|
||||
|
||||
@override
|
||||
String get qrShareConnectingTitle => 'Connecting to the relay…';
|
||||
|
||||
@override
|
||||
String get qrShareConnectingBody =>
|
||||
'Your QR code and link will appear once Šepot connects for the first time. Just a moment — it only takes a few seconds.';
|
||||
|
||||
@override
|
||||
String get qrIdentityNotFound => 'Identity not found';
|
||||
|
||||
|
||||
@@ -276,6 +276,14 @@ class AppLocalizationsIt extends AppLocalizations {
|
||||
String get errorRelayUnavailable =>
|
||||
'Relay non disponibile (sender certificate)';
|
||||
|
||||
@override
|
||||
String get errorNotYetRegistered =>
|
||||
'Šepot si sta ancora connettendo al relay — riprova a inviare tra un istante.';
|
||||
|
||||
@override
|
||||
String get errorContactLinkIncomplete =>
|
||||
'Questo link è incompleto — l\'altra persona l\'ha creato prima di connettersi. Chiedile un nuovo link sepot://.';
|
||||
|
||||
@override
|
||||
String errorAttachmentTooLarge(int maxMb) {
|
||||
return 'L\'allegato è troppo grande (max $maxMb MB)';
|
||||
@@ -1055,6 +1063,13 @@ class AppLocalizationsIt extends AppLocalizations {
|
||||
@override
|
||||
String get qrShareTitle => 'Il mio Šepot ID';
|
||||
|
||||
@override
|
||||
String get qrShareConnectingTitle => 'Connessione al relay…';
|
||||
|
||||
@override
|
||||
String get qrShareConnectingBody =>
|
||||
'Il tuo codice QR e il link appariranno appena Šepot si connette per la prima volta. Un istante — bastano pochi secondi.';
|
||||
|
||||
@override
|
||||
String get qrIdentityNotFound => 'Identità non trovata';
|
||||
|
||||
|
||||
@@ -276,6 +276,14 @@ class AppLocalizationsRu extends AppLocalizations {
|
||||
@override
|
||||
String get errorRelayUnavailable => 'Релей недоступен (sender certificate)';
|
||||
|
||||
@override
|
||||
String get errorNotYetRegistered =>
|
||||
'Šepot ещё подключается к релею — попробуйте отправить сообщение через пару секунд.';
|
||||
|
||||
@override
|
||||
String get errorContactLinkIncomplete =>
|
||||
'Ссылка неполная — собеседник создал её до подключения. Попросите у него новую ссылку sepot://.';
|
||||
|
||||
@override
|
||||
String errorAttachmentTooLarge(int maxMb) {
|
||||
return 'Вложение слишком большое (макс. $maxMb МБ)';
|
||||
@@ -1072,6 +1080,13 @@ class AppLocalizationsRu extends AppLocalizations {
|
||||
@override
|
||||
String get qrShareTitle => 'Мой Šepot ID';
|
||||
|
||||
@override
|
||||
String get qrShareConnectingTitle => 'Подключение к релею…';
|
||||
|
||||
@override
|
||||
String get qrShareConnectingBody =>
|
||||
'Ваш QR-код и ссылка появятся, как только Šepot подключится в первый раз. Подождите пару секунд.';
|
||||
|
||||
@override
|
||||
String get qrIdentityNotFound => 'Идентичность не найдена';
|
||||
|
||||
|
||||
Reference in New Issue
Block a user