refactor(tcp): promote MeshCoreTcpConnector, fix translations, harden UI

- Replace thin MeshCoreTcpManager facade with a proper MeshCoreTcpConnector
  that owns TcpTransportService and the frame subscription, mirroring
  MeshCoreUsbManager. The connector no longer holds a raw TcpTransportService
  or a _tcpFrameSubscription field.
- Remove hardcoded default host IP from TcpScreen (keep port 5000 hint).
- Disable connect button during scanning state, not just connecting state.
- Fix tcpPortLabel mistranslated as nautical "port/harbor" in de, it, pt,
  nl, sv, sk, sl, zh; fix corrupted Slovak tcpPortHint ("5 000" → "5000").
- Remove unused tcpStatus_connecting string from all 15 locale arb files
  and all generated app_localizations_*.dart files.
- Add extendedPadding to TCP screen FABs to match USB screen.
- Add Key to connect button; update tests to use byKey and assert
  onPressed == null when button is disabled during scanning.
This commit is contained in:
Zach
2026-03-13 10:58:52 -07:00
parent 1ad5db27ca
commit db935a7454
35 changed files with 91 additions and 123 deletions
-1
View File
@@ -1881,7 +1881,6 @@
"tcpPortLabel": "Пристанище",
"tcpPortHint": "5000",
"tcpStatus_notConnected": "Въведете крайната точка и свържете се.",
"tcpStatus_connecting": "Свързване към TCP крайния пункт...",
"tcpStatus_connectingTo": "Свързване към {endpoint}...",
"tcpErrorHostRequired": "Необходим е IP адрес.",
"tcpErrorPortInvalid": "Портът трябва да бъде между 1 и 65535.",
+1 -2
View File
@@ -1906,10 +1906,9 @@
"connectionChoiceTcpLabel": "TCP",
"tcpHostHint": "192.168.40.10",
"tcpScreenTitle": "Verbinden über TCP",
"tcpPortLabel": "Hafen",
"tcpPortLabel": "Port",
"tcpPortHint": "5000",
"tcpStatus_notConnected": "Geben Sie den Endpunkt ein und verbinden Sie sich.",
"tcpStatus_connecting": "Verbindung zum TCP-Endpunkt hergestellt...",
"tcpStatus_connectingTo": "Verbindung zu {endpoint}...",
"tcpErrorHostRequired": "Eine IP-Adresse ist erforderlich.",
"tcpErrorPortInvalid": "Die Portnummer muss zwischen 1 und 65535 liegen.",
-1
View File
@@ -56,7 +56,6 @@
"tcpPortLabel": "Port",
"tcpPortHint": "5000",
"tcpStatus_notConnected": "Enter endpoint and connect",
"tcpStatus_connecting": "Connecting to TCP endpoint...",
"tcpStatus_connectingTo": "Connecting to {endpoint}...",
"@tcpStatus_connectingTo": {
"placeholders": {
-1
View File
@@ -1909,7 +1909,6 @@
"tcpPortLabel": "Puerto",
"tcpPortHint": "5000",
"tcpStatus_notConnected": "Ingrese la dirección final y conecte.",
"tcpStatus_connecting": "Conectándose al punto final TCP...",
"tcpStatus_connectingTo": "Conectándose a {endpoint}...",
"tcpErrorHostRequired": "Se requiere la dirección IP.",
"tcpErrorPortInvalid": "El puerto debe estar entre 1 y 65535.",
-1
View File
@@ -1881,7 +1881,6 @@
"tcpPortLabel": "Port",
"tcpPortHint": "5000",
"tcpStatus_notConnected": "Entrez l'adresse de destination et connectez-vous.",
"tcpStatus_connecting": "Connexion au point de terminaison TCP...",
"tcpStatus_connectingTo": "Connexion à {endpoint}...",
"tcpErrorHostRequired": "Une adresse IP est obligatoire.",
"tcpErrorPortInvalid": "La taille du port doit être comprise entre 1 et 65535.",
+1 -2
View File
@@ -1878,10 +1878,9 @@
"tcpHostHint": "192.168.40.10",
"connectionChoiceTcpLabel": "TCP",
"tcpScreenTitle": "Stabilire una connessione tramite TCP",
"tcpPortLabel": "Porto",
"tcpPortLabel": "Porta",
"tcpPortHint": "5000",
"tcpStatus_notConnected": "Inserisci l'endpoint e connettiti.",
"tcpStatus_connecting": "Connessione al punto finale TCP...",
"tcpStatus_connectingTo": "Connessione a {endpoint}...",
"tcpErrorHostRequired": "È necessario fornire un indirizzo IP.",
"tcpErrorPortInvalid": "La dimensione della porta deve essere compresa tra 1 e 65535.",
-6
View File
@@ -376,12 +376,6 @@ abstract class AppLocalizations {
/// **'Enter endpoint and connect'**
String get tcpStatus_notConnected;
/// No description provided for @tcpStatus_connecting.
///
/// In en, this message translates to:
/// **'Connecting to TCP endpoint...'**
String get tcpStatus_connecting;
/// No description provided for @tcpStatus_connectingTo.
///
/// In en, this message translates to:
-3
View File
@@ -138,9 +138,6 @@ class AppLocalizationsBg extends AppLocalizations {
@override
String get tcpStatus_notConnected => 'Въведете крайната точка и свържете се.';
@override
String get tcpStatus_connecting => 'Свързване към TCP крайния пункт...';
@override
String tcpStatus_connectingTo(String endpoint) {
return 'Свързване към $endpoint...';
+1 -5
View File
@@ -130,7 +130,7 @@ class AppLocalizationsDe extends AppLocalizations {
String get tcpHostHint => '192.168.40.10';
@override
String get tcpPortLabel => 'Hafen';
String get tcpPortLabel => 'Port';
@override
String get tcpPortHint => '5000';
@@ -139,10 +139,6 @@ class AppLocalizationsDe extends AppLocalizations {
String get tcpStatus_notConnected =>
'Geben Sie den Endpunkt ein und verbinden Sie sich.';
@override
String get tcpStatus_connecting =>
'Verbindung zum TCP-Endpunkt hergestellt...';
@override
String tcpStatus_connectingTo(String endpoint) {
return 'Verbindung zu $endpoint...';
-3
View File
@@ -138,9 +138,6 @@ class AppLocalizationsEn extends AppLocalizations {
@override
String get tcpStatus_notConnected => 'Enter endpoint and connect';
@override
String get tcpStatus_connecting => 'Connecting to TCP endpoint...';
@override
String tcpStatus_connectingTo(String endpoint) {
return 'Connecting to $endpoint...';
-3
View File
@@ -138,9 +138,6 @@ class AppLocalizationsEs extends AppLocalizations {
@override
String get tcpStatus_notConnected => 'Ingrese la dirección final y conecte.';
@override
String get tcpStatus_connecting => 'Conectándose al punto final TCP...';
@override
String tcpStatus_connectingTo(String endpoint) {
return 'Conectándose a $endpoint...';
-3
View File
@@ -139,9 +139,6 @@ class AppLocalizationsFr extends AppLocalizations {
String get tcpStatus_notConnected =>
'Entrez l\'adresse de destination et connectez-vous.';
@override
String get tcpStatus_connecting => 'Connexion au point de terminaison TCP...';
@override
String tcpStatus_connectingTo(String endpoint) {
return 'Connexion à $endpoint...';
+1 -4
View File
@@ -130,7 +130,7 @@ class AppLocalizationsIt extends AppLocalizations {
String get tcpHostHint => '192.168.40.10';
@override
String get tcpPortLabel => 'Porto';
String get tcpPortLabel => 'Porta';
@override
String get tcpPortHint => '5000';
@@ -138,9 +138,6 @@ class AppLocalizationsIt extends AppLocalizations {
@override
String get tcpStatus_notConnected => 'Inserisci l\'endpoint e connettiti.';
@override
String get tcpStatus_connecting => 'Connessione al punto finale TCP...';
@override
String tcpStatus_connectingTo(String endpoint) {
return 'Connessione a $endpoint...';
+1 -4
View File
@@ -130,7 +130,7 @@ class AppLocalizationsNl extends AppLocalizations {
String get tcpHostHint => '192.168.40.10';
@override
String get tcpPortLabel => 'Haven';
String get tcpPortLabel => 'Poort';
@override
String get tcpPortHint => '5000';
@@ -138,9 +138,6 @@ class AppLocalizationsNl extends AppLocalizations {
@override
String get tcpStatus_notConnected => 'Voer het eindpunt in en verbind';
@override
String get tcpStatus_connecting => 'Verbinding maken met TCP-eindpunt...';
@override
String tcpStatus_connectingTo(String endpoint) {
return 'Verbinding maken met $endpoint...';
-3
View File
@@ -138,9 +138,6 @@ class AppLocalizationsPl extends AppLocalizations {
@override
String get tcpStatus_notConnected => 'Wprowadź adres URL i połącz';
@override
String get tcpStatus_connecting => 'Połączenie z punktem TCP...';
@override
String tcpStatus_connectingTo(String endpoint) {
return 'Połączenie z $endpoint...';
+1 -5
View File
@@ -130,7 +130,7 @@ class AppLocalizationsPt extends AppLocalizations {
String get tcpHostHint => '192.168.40.10';
@override
String get tcpPortLabel => 'Porto';
String get tcpPortLabel => 'Porta';
@override
String get tcpPortHint => '5000';
@@ -138,10 +138,6 @@ class AppLocalizationsPt extends AppLocalizations {
@override
String get tcpStatus_notConnected => 'Insira o endereço final e conecte-se.';
@override
String get tcpStatus_connecting =>
'Conectando ao ponto de extremidade TCP...';
@override
String tcpStatus_connectingTo(String endpoint) {
return 'Conectando a $endpoint...';
-3
View File
@@ -138,9 +138,6 @@ class AppLocalizationsRu extends AppLocalizations {
@override
String get tcpStatus_notConnected => 'Введите адрес и подключитесь.';
@override
String get tcpStatus_connecting => 'Установление соединения с TCP-портом...';
@override
String tcpStatus_connectingTo(String endpoint) {
return 'Подключение к $endpoint...';
+2 -5
View File
@@ -130,17 +130,14 @@ class AppLocalizationsSk extends AppLocalizations {
String get tcpHostHint => '192.168.40.10';
@override
String get tcpPortLabel => 'Pri항';
String get tcpPortLabel => 'Port';
@override
String get tcpPortHint => '5 000';
String get tcpPortHint => '5000';
@override
String get tcpStatus_notConnected => 'Zadajte cieľovú adresu a pripojte sa.';
@override
String get tcpStatus_connecting => 'Pripojenie k TCP endpointu...';
@override
String tcpStatus_connectingTo(String endpoint) {
return 'Pripojenie k $endpoint...';
+1 -4
View File
@@ -130,7 +130,7 @@ class AppLocalizationsSl extends AppLocalizations {
String get tcpHostHint => '192.168.40.10';
@override
String get tcpPortLabel => 'Pril';
String get tcpPortLabel => 'Vrata';
@override
String get tcpPortHint => '5000';
@@ -138,9 +138,6 @@ class AppLocalizationsSl extends AppLocalizations {
@override
String get tcpStatus_notConnected => 'Vnesite končni naslov in se povežite';
@override
String get tcpStatus_connecting => 'Povezava z TCP koncem...';
@override
String tcpStatus_connectingTo(String endpoint) {
return 'Povezava z $endpoint...';
+1 -4
View File
@@ -130,7 +130,7 @@ class AppLocalizationsSv extends AppLocalizations {
String get tcpHostHint => '192.168.40.10';
@override
String get tcpPortLabel => 'Hamn';
String get tcpPortLabel => 'Port';
@override
String get tcpPortHint => '5000';
@@ -138,9 +138,6 @@ class AppLocalizationsSv extends AppLocalizations {
@override
String get tcpStatus_notConnected => 'Ange slutpunkt och anslut';
@override
String get tcpStatus_connecting => 'Anslutning till TCP-slutpunkt...';
@override
String tcpStatus_connectingTo(String endpoint) {
return 'Anslutning till $endpoint...';
-3
View File
@@ -138,9 +138,6 @@ class AppLocalizationsUk extends AppLocalizations {
@override
String get tcpStatus_notConnected => 'Введіть кінцеву точку та підключіться';
@override
String get tcpStatus_connecting => 'Підключення до TCP-кінцевої точки...';
@override
String tcpStatus_connectingTo(String endpoint) {
return 'Підключення до $endpoint...';
+1 -4
View File
@@ -130,7 +130,7 @@ class AppLocalizationsZh extends AppLocalizations {
String get tcpHostHint => '192.168.40.10';
@override
String get tcpPortLabel => '';
String get tcpPortLabel => '端口';
@override
String get tcpPortHint => '5000';
@@ -138,9 +138,6 @@ class AppLocalizationsZh extends AppLocalizations {
@override
String get tcpStatus_notConnected => '输入目标地址,然后连接';
@override
String get tcpStatus_connecting => '连接到 TCP 终点...';
@override
String tcpStatus_connectingTo(String endpoint) {
return '连接到 $endpoint...';
+1 -2
View File
@@ -1878,10 +1878,9 @@
"tcpHostLabel": "IP-adres",
"tcpHostHint": "192.168.40.10",
"connectionChoiceTcpLabel": "TCP",
"tcpPortLabel": "Haven",
"tcpPortLabel": "Poort",
"tcpPortHint": "5000",
"tcpStatus_notConnected": "Voer het eindpunt in en verbind",
"tcpStatus_connecting": "Verbinding maken met TCP-eindpunt...",
"tcpStatus_connectingTo": "Verbinding maken met {endpoint}...",
"tcpErrorHostRequired": "Een IP-adres is vereist.",
"tcpErrorPortInvalid": "De poortwaarde moet tussen 1 en 65535 liggen.",
-1
View File
@@ -1881,7 +1881,6 @@
"tcpPortLabel": "Port",
"tcpPortHint": "5000",
"tcpStatus_notConnected": "Wprowadź adres URL i połącz",
"tcpStatus_connecting": "Połączenie z punktem TCP...",
"tcpStatus_connectingTo": "Połączenie z {endpoint}...",
"tcpErrorHostRequired": "Wymagana jest adresa IP.",
"tcpErrorPortInvalid": "Numer portu musi mieścić się w zakresie od 1 do 65535.",
+1 -2
View File
@@ -1878,10 +1878,9 @@
"connectionChoiceTcpLabel": "TCP",
"tcpScreenTitle": "Estabelecer conexão via TCP",
"tcpHostHint": "192.168.40.10",
"tcpPortLabel": "Porto",
"tcpPortLabel": "Porta",
"tcpPortHint": "5000",
"tcpStatus_notConnected": "Insira o endereço final e conecte-se.",
"tcpStatus_connecting": "Conectando ao ponto de extremidade TCP...",
"tcpStatus_connectingTo": "Conectando a {endpoint}...",
"tcpErrorHostRequired": "É necessário fornecer um endereço IP.",
"tcpErrorPortInvalid": "O valor do porto deve estar entre 1 e 65535.",
-1
View File
@@ -1121,7 +1121,6 @@
"tcpPortLabel": "Порт",
"tcpPortHint": "5000",
"tcpStatus_notConnected": "Введите адрес и подключитесь.",
"tcpStatus_connecting": "Установление соединения с TCP-портом...",
"tcpStatus_connectingTo": "Подключение к {endpoint}...",
"tcpErrorHostRequired": "Необходимо указать IP-адрес.",
"tcpErrorPortInvalid": "Порт должен находиться в диапазоне от 1 до 65535.",
+2 -3
View File
@@ -1878,10 +1878,9 @@
"tcpHostLabel": "IP adresa",
"tcpScreenTitle": "Spojte sa pomocou protokolu TCP",
"connectionChoiceTcpLabel": "TCP",
"tcpPortLabel": "Pri항",
"tcpPortHint": "5 000",
"tcpPortLabel": "Port",
"tcpPortHint": "5000",
"tcpStatus_notConnected": "Zadajte cieľovú adresu a pripojte sa.",
"tcpStatus_connecting": "Pripojenie k TCP endpointu...",
"tcpStatus_connectingTo": "Pripojenie k {endpoint}...",
"tcpErrorHostRequired": "Je potrebné zadať IP adresu.",
"tcpErrorPortInvalid": "Číslo portu musí byť medzi 1 a 65535.",
+1 -2
View File
@@ -1878,10 +1878,9 @@
"tcpHostLabel": "IP naslov",
"tcpHostHint": "192.168.40.10",
"tcpScreenTitle": "Komunicirajte preko protokola TCP",
"tcpPortLabel": "Pril",
"tcpPortLabel": "Vrata",
"tcpPortHint": "5000",
"tcpStatus_notConnected": "Vnesite končni naslov in se povežite",
"tcpStatus_connecting": "Povezava z TCP koncem...",
"tcpStatus_connectingTo": "Povezava z {endpoint}...",
"tcpErrorHostRequired": "Potrebna je IP-naslov.",
"tcpErrorPortInvalid": "Port mora biti med 1 in 65535.",
+1 -2
View File
@@ -1878,10 +1878,9 @@
"tcpHostLabel": "IP-adress",
"tcpScreenTitle": "Anslut via TCP",
"connectionChoiceTcpLabel": "TCP",
"tcpPortLabel": "Hamn",
"tcpPortLabel": "Port",
"tcpPortHint": "5000",
"tcpStatus_notConnected": "Ange slutpunkt och anslut",
"tcpStatus_connecting": "Anslutning till TCP-slutpunkt...",
"tcpStatus_connectingTo": "Anslutning till {endpoint}...",
"tcpErrorHostRequired": "IP-adress krävs.",
"tcpErrorPortInvalid": "Porten måste vara mellan 1 och 65535.",
-1
View File
@@ -1881,7 +1881,6 @@
"tcpPortLabel": "Порт",
"tcpPortHint": "5000",
"tcpStatus_notConnected": "Введіть кінцеву точку та підключіться",
"tcpStatus_connecting": "Підключення до TCP-кінцевої точки...",
"tcpStatus_connectingTo": "Підключення до {endpoint}...",
"tcpErrorHostRequired": "Необхідно вказати IP-адресу.",
"tcpErrorPortInvalid": "Порт повинен бути в межах від 1 до 65535.",
+1 -2
View File
@@ -1883,10 +1883,9 @@
"tcpHostHint": "192.168.40.10",
"tcpScreenTitle": "通过 TCP 连接",
"connectionChoiceTcpLabel": "TCP",
"tcpPortLabel": "",
"tcpPortLabel": "端口",
"tcpPortHint": "5000",
"tcpStatus_notConnected": "输入目标地址,然后连接",
"tcpStatus_connecting": "连接到 TCP 终点...",
"tcpStatus_connectingTo": "连接到 {endpoint}...",
"tcpErrorHostRequired": "需要提供IP地址。",
"tcpErrorPortInvalid": "端口号必须在 1 到 65535 之间。",