feat(apple): send a transfer to a device from the share panel

Send to a device now sits alongside the QR code, NFC, and export actions,
since an offer is another way to deliver the same invitation. Picking a
device pushes the existing transfer rather than re-sharing the files.

The picker lists only devices holding a live grant, so nothing offered there
can fail on tap, and it distinguishes accepted from waiting for that device
to open the app.

Also fixes the deprecated SF Symbol and the two Sendable warnings introduced
with the contacts screen: the sections now talk to the model directly rather
than storing view callbacks that a Binding setter has to convert.
This commit is contained in:
2026-08-07 10:24:05 +02:00
parent d8587851a3
commit 3441280599
23 changed files with 310 additions and 35 deletions

View File

@@ -344,6 +344,10 @@
<string name="contacts_offer_held">Dieses Gerät ist nicht geöffnet. Die Übertragung wird beim nächsten Öffnen von VniDrop zugestellt.</string>
<string name="contacts_waiting_title">Wartet auf Zustellung</string>
<string name="contacts_waiting_hint">Brechen Sie die Übertragung ab, um sie zurückzuziehen.</string>
<string name="contacts_send_to_device">An ein Gerät senden</string>
<string name="contacts_pick_device_title">Gerät auswählen</string>
<string name="contacts_pick_device_empty">Derzeit ist kein Gerät erreichbar. Gespeicherte Geräte erscheinen hier nach einer Übertragung.</string>
<string name="contacts_sent_to_device">%1$s hat die Übertragung angenommen</string>
<plurals name="transfer_file_count">
<item quantity="one">%1$d Datei</item>
<item quantity="other">%1$d Dateien</item>

View File

@@ -344,6 +344,10 @@
<string name="contacts_offer_held">Ese dispositivo no está abierto. La transferencia se entregará la próxima vez que abra VniDrop.</string>
<string name="contacts_waiting_title">Pendientes de entrega</string>
<string name="contacts_waiting_hint">Cancela la transferencia para retirarla.</string>
<string name="contacts_send_to_device">Enviar a un dispositivo</string>
<string name="contacts_pick_device_title">Elegir un dispositivo</string>
<string name="contacts_pick_device_empty">Ningún dispositivo está disponible ahora. Los dispositivos guardados aparecen aquí tras una transferencia.</string>
<string name="contacts_sent_to_device">%1$s aceptó la transferencia</string>
<plurals name="transfer_file_count">
<item quantity="one">%1$d archivo</item>
<item quantity="other">%1$d archivos</item>

View File

@@ -344,6 +344,10 @@
<string name="contacts_offer_held">Cet appareil nest pas ouvert. Le transfert sera remis à sa prochaine ouverture de VniDrop.</string>
<string name="contacts_waiting_title">En attente de remise</string>
<string name="contacts_waiting_hint">Annulez le transfert pour le retirer.</string>
<string name="contacts_send_to_device">Envoyer à un appareil</string>
<string name="contacts_pick_device_title">Choisir un appareil</string>
<string name="contacts_pick_device_empty">Aucun appareil nest joignable pour le moment. Les appareils enregistrés apparaissent ici après un transfert.</string>
<string name="contacts_sent_to_device">%1$s a accepté le transfert</string>
<plurals name="transfer_file_count">
<item quantity="one">%1$d fichier</item>
<item quantity="other">%1$d fichiers</item>

View File

@@ -344,6 +344,10 @@
<string name="contacts_offer_held">Quel dispositivo non è aperto. Il trasferimento verrà consegnato alla prossima apertura di VniDrop.</string>
<string name="contacts_waiting_title">In attesa di consegna</string>
<string name="contacts_waiting_hint">Annulla il trasferimento per ritirarlo.</string>
<string name="contacts_send_to_device">Invia a un dispositivo</string>
<string name="contacts_pick_device_title">Scegli un dispositivo</string>
<string name="contacts_pick_device_empty">Nessun dispositivo è raggiungibile ora. I dispositivi memorizzati compaiono qui dopo un trasferimento.</string>
<string name="contacts_sent_to_device">%1$s ha accettato il trasferimento</string>
<plurals name="transfer_file_count">
<item quantity="one">%1$d file</item>
<item quantity="other">%1$d file</item>

View File

@@ -344,6 +344,10 @@
<string name="contacts_offer_held">Dat apparaat is niet geopend. De overdracht wordt bezorgd zodra het VniDrop weer opent.</string>
<string name="contacts_waiting_title">Wacht op bezorging</string>
<string name="contacts_waiting_hint">Annuleer de overdracht om die in te trekken.</string>
<string name="contacts_send_to_device">Naar een apparaat sturen</string>
<string name="contacts_pick_device_title">Kies een apparaat</string>
<string name="contacts_pick_device_empty">Er is nu geen apparaat bereikbaar. Onthouden apparaten verschijnen hier na een overdracht.</string>
<string name="contacts_sent_to_device">%1$s heeft de overdracht geaccepteerd</string>
<plurals name="transfer_file_count">
<item quantity="one">%1$d bestand</item>
<item quantity="other">%1$d bestanden</item>

View File

@@ -344,6 +344,10 @@
<string name="contacts_offer_held">To urządzenie nie jest otwarte. Przesyłka zostanie dostarczona przy następnym uruchomieniu VniDrop.</string>
<string name="contacts_waiting_title">Oczekuje na dostarczenie</string>
<string name="contacts_waiting_hint">Anuluj przesyłkę, aby ją wycofać.</string>
<string name="contacts_send_to_device">Wyślij do urządzenia</string>
<string name="contacts_pick_device_title">Wybierz urządzenie</string>
<string name="contacts_pick_device_empty">Żadne urządzenie nie jest teraz dostępne. Zapamiętane urządzenia pojawią się tu po przesłaniu.</string>
<string name="contacts_sent_to_device">%1$s zaakceptowało przesyłkę</string>
<plurals name="transfer_file_count">
<item quantity="one">%1$d plik</item>
<item quantity="few">%1$d pliki</item>

View File

@@ -344,6 +344,10 @@
<string name="contacts_offer_held">Esse dispositivo não está aberto. A transferência será entregue da próxima vez que abrir o VniDrop.</string>
<string name="contacts_waiting_title">A aguardar entrega</string>
<string name="contacts_waiting_hint">Cancele a transferência para a retirar.</string>
<string name="contacts_send_to_device">Enviar para um dispositivo</string>
<string name="contacts_pick_device_title">Escolher um dispositivo</string>
<string name="contacts_pick_device_empty">Nenhum dispositivo está acessível agora. Os dispositivos guardados aparecem aqui após uma transferência.</string>
<string name="contacts_sent_to_device">%1$s aceitou a transferência</string>
<plurals name="transfer_file_count">
<item quantity="one">%1$d ficheiro</item>
<item quantity="other">%1$d ficheiros</item>

View File

@@ -344,6 +344,10 @@
<string name="contacts_offer_held">Это устройство не открыто. Передача будет доставлена при следующем запуске VniDrop.</string>
<string name="contacts_waiting_title">Ожидает доставки</string>
<string name="contacts_waiting_hint">Отмените передачу, чтобы отозвать её.</string>
<string name="contacts_send_to_device">Отправить на устройство</string>
<string name="contacts_pick_device_title">Выберите устройство</string>
<string name="contacts_pick_device_empty">Сейчас ни одно устройство недоступно. Сохранённые устройства появятся здесь после передачи.</string>
<string name="contacts_sent_to_device">%1$s принял передачу</string>
<plurals name="transfer_file_count">
<item quantity="one">%1$d файл</item>
<item quantity="few">%1$d файла</item>

View File

@@ -344,6 +344,10 @@
<string name="contacts_offer_held">That device is not open. The transfer will be delivered the next time it opens VniDrop.</string>
<string name="contacts_waiting_title">Waiting to be delivered</string>
<string name="contacts_waiting_hint">Cancel the transfer to withdraw it.</string>
<string name="contacts_send_to_device">Send to a device</string>
<string name="contacts_pick_device_title">Choose a device</string>
<string name="contacts_pick_device_empty">No device can be reached right now. Remembered devices appear here after a transfer.</string>
<string name="contacts_sent_to_device">%1$s accepted the transfer</string>
<plurals name="transfer_file_count">
<item quantity="other">%1$d files</item>
<item quantity="one">%1$d file</item>