feat: merge remote-call feature and fix remote connection

- Implement photos API (GET /devices/identificator/{id}/photos)
  - Fix deviceId empty in commands (set before async load)
  - Fix missing await in call() method
  - Add ref.mounted checks on all async operations
  - Reload photos after REQUEST_PHOTO command
  - Add CountryPrefixPicker to spy call dialog
  - Add loading state and topSnackbar feedback on call
  - Handle empty photos list in gallery
  - Fix Expanded overflow in remote camera screen
  - Change keyboard to phone type in spy call
  - Remove unnecessary use cases
  - Add GetPicturesResponseModel with freezed
This commit is contained in:
2026-03-22 04:57:38 +01:00
39 changed files with 1111 additions and 451 deletions

View File

@@ -623,5 +623,7 @@
"volumeRingtone": "Klingeltonlautstärke",
"volumeAlarm": "Alarmlautstärke",
"volumeHint": "Sie können den Schieberegler ziehen, um die Gerätelautstärke anzupassen. Die App speichert nur die zuletzt erfolgreich eingestellte Lautstärke. Die tatsächliche Lautstärke hängt vom Gerät ab.",
"volumeSend": "Senden"
"volumeSend": "Senden",
"photoTaken": "Foto erfolgreich aufgenommen",
"noPhotosAvailable": "Keine Fotos verfügbar"
}

View File

@@ -755,5 +755,7 @@
"vibrationOnly": "Vibration only",
"silent": "Silent",
"syncClockMessage": "Synchronize the device clock with the current time",
"locationWifiNetworksOptional": "WiFi networks (optional)"
"locationWifiNetworksOptional": "WiFi networks (optional)",
"photoTaken": "Photo taken successfully",
"noPhotosAvailable": "No photos available"
}

View File

@@ -753,5 +753,7 @@
"vibrationOnly": "Solo vibración",
"silent": "Silencio",
"syncClockMessage": "Sincroniza el reloj del dispositivo con la hora actual",
"locationWifiNetworksOptional": "Redes WiFi (opcional)"
"locationWifiNetworksOptional": "Redes WiFi (opcional)",
"photoTaken": "Foto tomada exitosamente",
"noPhotosAvailable": "No hay fotos disponibles"
}

View File

@@ -623,5 +623,7 @@
"volumeRingtone": "Volume de la sonnerie",
"volumeAlarm": "Volume de l'alarme",
"volumeHint": "Vous pouvez faire glisser le curseur pour régler le volume de l'appareil. L'application ne sauvegarde que le dernier niveau de volume ajusté avec succès. Le volume réel dépendra de l'appareil.",
"volumeSend": "Envoyer"
"volumeSend": "Envoyer",
"photoTaken": "Photo prise avec succès",
"noPhotosAvailable": "Aucune photo disponible"
}

View File

@@ -623,5 +623,7 @@
"volumeRingtone": "Volume suoneria",
"volumeAlarm": "Volume sveglia",
"volumeHint": "Puoi trascinare il cursore per regolare il volume del dispositivo. L'app salva solo l'ultimo livello di volume regolato con successo. Il volume effettivo dipenderà dal dispositivo.",
"volumeSend": "Invia"
"volumeSend": "Invia",
"photoTaken": "Foto scattata con successo",
"noPhotosAvailable": "Nessuna foto disponibile"
}

View File

@@ -623,5 +623,7 @@
"volumeRingtone": "Volume do toque",
"volumeAlarm": "Volume do alarme",
"volumeHint": "Você pode arrastar o controle deslizante para ajustar o volume do dispositivo. O aplicativo salva apenas o nível de volume ajustado com sucesso mais recentemente. O volume real dependerá do dispositivo.",
"volumeSend": "Enviar"
"volumeSend": "Enviar",
"photoTaken": "Foto tirada com sucesso",
"noPhotosAvailable": "Nenhuma foto disponível"
}

View File

@@ -759,5 +759,7 @@ class I18n {
static const String wifiSettings = 'wifiSettings';
static const String wifiSsid = 'wifiSsid';
static const String wifiSsidHint = 'wifiSsidHint';
static const String photoTaken = 'photoTaken';
static const String noPhotosAvailable = 'noPhotosAvailable';
static const String yesterday = 'yesterday';
}