Add QR code

This commit is contained in:
Leon Böttger committed 2025-03-10 21:34:42 +01:00
1 parent af26ffc88f
commit 89d892eea9
46 files changed
+335 -27

No files matched your search

+21
View File
@@ -0,0 +1,21 @@
{
"images" : [
{
"filename" : "QR.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 173 KiB

File renamed without changes.

Before

Width:  |  Height:  |  Size: 752 KiB

After

Width:  |  Height:  |  Size: 752 KiB

+1
View File
@@ -102,3 +102,4 @@ If you still encounter issues, the issues could be caused due to your WiFi route
"TransferFinished" = "Transfer finished";
"TransferTimedOut" = "Timed out";
"UnsupportedType" = "Attachment type not supported";
"QrCodeInstructions" = "Scan the QR Code with the camera of your Android device. Afterward, it will show up in the previous screen.\n\nAlternatively, install and open the 'Files by Google' app and tap 'Receive' at the bottom right.";
-8
View File
@@ -189,11 +189,3 @@ extension IAPManager.IAPManagerError: LocalizedError {
}
}
}
public extension String {
func localized() -> String {
let localizedString = NSLocalizedString(self, comment: "")
return localizedString
}
}
+15
View File
@@ -0,0 +1,15 @@
//
// Localized.swift
// QuickDrop
//
// Created by Leon Böttger on 10.03.25.
//
import Foundation
public extension String {
func localized() -> String {
let localizedString = NSLocalizedString(self, comment: "")
return localizedString
}
}
+1
View File
@@ -92,3 +92,4 @@
"TransferFinished" = "اكتمل النقل";
"TransferTimedOut" = "انتهت المهلة";
"UnsupportedType" = "نوع المرفق غير مدعوم";
"QrCodeInstructions" = "امسح رمز QR باستخدام كاميرا جهاز Android الخاص بك. بعد ذلك، سيظهر في الشاشة السابقة.\n\nبدلاً من ذلك، قم بتثبيت وفتح تطبيق 'Files by Google' ثم اضغط على 'استلام' في الزاوية اليمنى السفلى.";
+1
View File
@@ -95,3 +95,4 @@ Wenn du weiterhin Probleme hast, könnten diese durch deinen WLAN-Router verursa
"TransferFinished" = "Übertragung abgeschlossen";
"TransferTimedOut" = "Zeitüberschreitung";
"UnsupportedType" = "Typ nicht unterstützt";
"QrCodeInstructions" = "Scanne den QR-Code mit der Kamera deines Android-Geräts. Danach wird er auf dem vorherigen Bildschirm angezeigt.\n\nAlternativ kannst du die App 'Files by Google' installieren und öffnen und unten rechts auf 'Empfangen' tippen.";
+1
View File
@@ -93,3 +93,4 @@ Si aún encuentras problemas, estos podrían ser causados por tu router WiFi. Al
"TransferFinished" = "Transferencia finalizada";
"TransferTimedOut" = "Tiempo de espera agotado";
"UnsupportedType" = "Tipo de archivo adjunto no compatible";
"QrCodeInstructions" = "Escanea el código QR con la cámara de tu dispositivo Android. Luego, aparecerá en la pantalla anterior.\n\nComo alternativa, instala y abre la aplicación 'Files by Google' y toca 'Recibir' en la parte inferior derecha.";
+1
View File
@@ -93,3 +93,4 @@ Si vous rencontrez toujours des problèmes, ceux-ci peuvent être causés par vo
"TransferFinished" = "Transfert terminé";
"TransferTimedOut" = "Délai dépassé";
"UnsupportedType" = "Type de pièce jointe non pris en charge";
"QrCodeInstructions" = "Scannez le code QR avec l’appareil photo de votre appareil Android. Ensuite, il apparaîtra sur l’écran précédent.\n\nSinon, installez et ouvrez l’application 'Files by Google' et appuyez sur 'Recevoir' en bas à droite.";
+1
View File
@@ -94,3 +94,4 @@ Ha továbbra is problémákat tapasztalsz, azok a WiFi-routeredből adódhatnak.
"TransferFinished" = "Átvitel befejezve";
"TransferTimedOut" = "Időtúllépés";
"UnsupportedType" = "Nem támogatott csatolmánytípus";
"QrCodeInstructions" = "Olvasd be a QR-kódot az Android készüléked kamerájával. Ezután megjelenik az előző képernyőn.\n\nAlternatív megoldásként telepítsd és nyisd meg a 'Files by Google' alkalmazást, majd koppints a 'Fogadás' gombra a jobb alsó sarokban.";
+1
View File
@@ -93,3 +93,4 @@ Se il problema persiste, potrebbe essere causato dal tuo router WiFi. Alcuni rou
"TransferFinished" = "Trasferimento completato";
"TransferTimedOut" = "Tempo scaduto";
"UnsupportedType" = "Tipo di allegato non supportato";
"QrCodeInstructions" = "Scansiona il codice QR con la fotocamera del tuo dispositivo Android. Successivamente, apparirà nella schermata precedente.\n\nIn alternativa, installa e apri l'app 'Files by Google' e tocca 'Ricevi' in basso a destra.";
+1
View File
@@ -93,3 +93,4 @@ AndroidデバイスからMacにファイルを送信するには、スマート
"TransferFinished" = "転送完了";
"TransferTimedOut" = "タイムアウトしました";
"UnsupportedType" = "添付ファイルの種類はサポートされていません";
"QrCodeInstructions" = "AndroidデバイスのカメラでQRコードをスキャンしてください。その後、前の画面に表示されます。\n\nまたは、『Files by Google』アプリをインストールして開き、右下の「受信」をタップしてください。";
+1
View File
@@ -93,3 +93,4 @@ Android 기기에서 Mac으로 파일을 보내려면 휴대폰에서 공유 아
"TransferFinished" = "전송 완료";
"TransferTimedOut" = "시간 초과";
"UnsupportedType" = "지원되지 않는 첨부 파일 유형";
"QrCodeInstructions" = "Android 기기의 카메라로 QR 코드를 스캔하세요. 이후 이전 화면에 표시됩니다.\n\n또는 'Files by Google' 앱을 설치하고 열어 오른쪽 아래의 '받기'를 탭하세요.";
+1
View File
@@ -93,3 +93,4 @@ Als je nog steeds problemen ondervindt, kunnen deze veroorzaakt worden door je W
"TransferFinished" = "Overdracht voltooid";
"TransferTimedOut" = "Time-out";
"UnsupportedType" = "Bijlagetype niet ondersteund";
"QrCodeInstructions" = "Scan de QR-code met de camera van je Android-apparaat. Daarna verschijnt het op het vorige scherm.\n\nAls alternatief kun je de app 'Files by Google' installeren en openen en op 'Ontvangen' tikken rechtsonder.";
+1
View File
@@ -93,3 +93,4 @@ Se você ainda encontrar problemas, eles podem ser causados pelo seu roteador Wi
"TransferFinished" = "Transferência concluída";
"TransferTimedOut" = "Tempo esgotado";
"UnsupportedType" = "Tipo de anexo não suportado";
"QrCodeInstructions" = "Escaneie o código QR com a câmera do seu dispositivo Android. Em seguida, ele aparecerá na tela anterior.\n\nComo alternativa, instale e abra o app 'Files by Google' e toque em 'Receber' no canto inferior direito.";
+1
View File
@@ -93,3 +93,4 @@ Se ainda tiver problemas, estes podem ser causados pelo seu router WiFi. Alguns
"TransferFinished" = "Transferência concluída";
"TransferTimedOut" = "Tempo limite excedido";
"UnsupportedType" = "Tipo de anexo não suportado";
"QrCodeInstructions" = "Digitalize o código QR com a câmara do seu dispositivo Android. Depois, ele aparecerá no ecrã anterior.\n\nEm alternativa, instale e abra a aplicação 'Files by Google' e toque em 'Receber' no canto inferior direito.";
+1
View File
@@ -92,3 +92,4 @@ Dacă întâmpini în continuare probleme, acestea ar putea fi cauzate de router
"TransferFinished" = "Transfer finalizat";
"TransferTimedOut" = "Timpul a expirat";
"UnsupportedType" = "Tip de atașament neacceptat";
"QrCodeInstructions" = "Scanează codul QR cu camera dispozitivului tău Android. După aceea, acesta va apărea pe ecranul anterior.\n\nAlternativ, instalează și deschide aplicația 'Files by Google' și apasă pe 'Primește' în colțul din dreapta jos.";
+1
View File
@@ -96,3 +96,4 @@
"TransferFinished" = "Передача завершена";
"TransferTimedOut" = "Время ожидания истекло";
"UnsupportedType" = "Тип вложения не поддерживается";
"QrCodeInstructions" = "Отсканируйте QR-код с помощью камеры вашего устройства Android. После этого он появится на предыдущем экране.\n\nИли установите и откройте приложение 'Files by Google' и нажмите 'Получить' внизу справа.";
+1
View File
@@ -93,3 +93,4 @@
"TransferFinished" = "การโอนเสร็จสิ้น";
"TransferTimedOut" = "หมดเวลา";
"UnsupportedType" = "ไม่รองรับประเภทไฟล์แนบ";
"QrCodeInstructions" = "สแกนรหัส QR ด้วยกล้องของอุปกรณ์ Android ของคุณ หลังจากนั้น อุปกรณ์จะปรากฏบนหน้าจอก่อนหน้า\n\nหรือ ติดตั้งและเปิดแอป 'Files by Google' แล้วแตะ 'รับ' ที่ด้านล่างขวา";
+1
View File
@@ -93,3 +93,4 @@
"TransferFinished" = "Передача завершена";
"TransferTimedOut" = "Час очікування вийшов";
"UnsupportedType" = "Тип вкладення не підтримується";
"QrCodeInstructions" = "Скануйте QR-код за допомогою камери вашого пристрою Android. Після цього він з’явиться на попередньому екрані.\n\nАбо встановіть та відкрийте додаток 'Files by Google' і натисніть 'Отримати' внизу праворуч.";
@@ -93,3 +93,4 @@
"TransferFinished" = "传输完成";
"TransferTimedOut" = "超时";
"UnsupportedType" = "不支持的附件类型";
"QrCodeInstructions" = "使用您的 Android 设备的相机扫描二维码。之后,它将在上一个屏幕上显示。\n\n或者,安装并打开 'Files by Google' 应用,然后点击右下角的“接收”。";
+18 -4
View File
@@ -10,7 +10,6 @@
691F53BB2ABB70840089FD92 /* DeviceListCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 691F53B92ABB70840089FD92 /* DeviceListCell.swift */; };
691F53BC2ABB70840089FD92 /* DeviceListCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 691F53BA2ABB70840089FD92 /* DeviceListCell.xib */; };
691F53BE2ABF03820089FD92 /* OutboundNearbyConnection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 691F53BD2ABF03820089FD92 /* OutboundNearbyConnection.swift */; };
699B03452AB5FBA300E0D718 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 699B03442AB5FBA300E0D718 /* Assets.xcassets */; };
699DEBA62AB0573200115D22 /* ShareViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 699DEBA52AB0573200115D22 /* ShareViewController.swift */; };
699DEBA92AB0573200115D22 /* ShareViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 699DEBA72AB0573200115D22 /* ShareViewController.xib */; };
699DEBAE2AB0573200115D22 /* QuickDropShareExtension.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = 699DEBA12AB0573200115D22 /* QuickDropShareExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
@@ -46,6 +45,12 @@
EB7F54142D78E9E700989564 /* LicenseWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = EB7F54132D78E9E400989564 /* LicenseWindow.swift */; };
EB9237C42D7CDF8B00CA3A42 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 69D2C32B29E77F2200EC7E30 /* Localizable.strings */; };
EB9237C52D7CDF9000CA3A42 /* Localizable.stringsdict in Resources */ = {isa = PBXBuildFile; fileRef = 69D2C33629E78DF400EC7E30 /* Localizable.stringsdict */; };
EB96ED892D7F79BE004B3FF1 /* ShareViewControllerSwiftUI.swift in Sources */ = {isa = PBXBuildFile; fileRef = EB96ED882D7F79B9004B3FF1 /* ShareViewControllerSwiftUI.swift */; };
EB96ED8B2D7F7CF7004B3FF1 /* QrCodeVIew.swift in Sources */ = {isa = PBXBuildFile; fileRef = EB96ED8A2D7F7CF4004B3FF1 /* QrCodeVIew.swift */; };
EB96ED8C2D7F7E7B004B3FF1 /* QrCodeVIew.swift in Sources */ = {isa = PBXBuildFile; fileRef = EB96ED8A2D7F7CF4004B3FF1 /* QrCodeVIew.swift */; };
EB96ED8D2D7F7EA3004B3FF1 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 69DA9A1329E0BF5200A442DA /* Assets.xcassets */; };
EB96ED8F2D7F8105004B3FF1 /* Localized.swift in Sources */ = {isa = PBXBuildFile; fileRef = EB96ED8E2D7F8103004B3FF1 /* Localized.swift */; };
EB96ED902D7F8114004B3FF1 /* Localized.swift in Sources */ = {isa = PBXBuildFile; fileRef = EB96ED8E2D7F8103004B3FF1 /* Localized.swift */; };
EBD2A2172D2860C100BCB8E2 /* WelcomeScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = EBD2A2162D2860BE00BCB8E2 /* WelcomeScreen.swift */; };
/* End PBXBuildFile section */
@@ -144,7 +149,6 @@
698DFAE529E2F91A0064F247 /* NearbyConnection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NearbyConnection.swift; sourceTree = "<group>"; };
698DFAED29E353220064F247 /* UserNotifications.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UserNotifications.framework; path = System/Library/Frameworks/UserNotifications.framework; sourceTree = SDKROOT; };
698DFAEF29E353220064F247 /* UserNotificationsUI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UserNotificationsUI.framework; path = System/Library/Frameworks/UserNotificationsUI.framework; sourceTree = SDKROOT; };
699B03442AB5FBA300E0D718 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
699DEBA12AB0573200115D22 /* QuickDropShareExtension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = QuickDropShareExtension.appex; sourceTree = BUILT_PRODUCTS_DIR; };
699DEBA52AB0573200115D22 /* ShareViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShareViewController.swift; sourceTree = "<group>"; };
699DEBA82AB0573200115D22 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/ShareViewController.xib; sourceTree = "<group>"; };
@@ -205,6 +209,9 @@
EB9237BF2D7CDE3E00CA3A42 /* pt-BR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-BR"; path = "pt-BR.lproj/ShareViewController.strings"; sourceTree = "<group>"; };
EB9237C12D7CDE4000CA3A42 /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/ShareViewController.strings; sourceTree = "<group>"; };
EB9237C32D7CDE4100CA3A42 /* th */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = th; path = th.lproj/ShareViewController.strings; sourceTree = "<group>"; };
EB96ED882D7F79B9004B3FF1 /* ShareViewControllerSwiftUI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShareViewControllerSwiftUI.swift; sourceTree = "<group>"; };
EB96ED8A2D7F7CF4004B3FF1 /* QrCodeVIew.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QrCodeVIew.swift; sourceTree = "<group>"; };
EB96ED8E2D7F8103004B3FF1 /* Localized.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Localized.swift; sourceTree = "<group>"; };
EBD2A2162D2860BE00BCB8E2 /* WelcomeScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WelcomeScreen.swift; sourceTree = "<group>"; };
EBD2A2182D28619200BCB8E2 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = Info.plist; sourceTree = "<group>"; };
/* End PBXFileReference section */
@@ -254,11 +261,12 @@
699DEBA22AB0573200115D22 /* ShareExtension */ = {
isa = PBXGroup;
children = (
EB96ED882D7F79B9004B3FF1 /* ShareViewControllerSwiftUI.swift */,
699DEBA52AB0573200115D22 /* ShareViewController.swift */,
EB96ED8A2D7F7CF4004B3FF1 /* QrCodeVIew.swift */,
691F53B92ABB70840089FD92 /* DeviceListCell.swift */,
691F53BA2ABB70840089FD92 /* DeviceListCell.xib */,
699DEBA72AB0573200115D22 /* ShareViewController.xib */,
699B03442AB5FBA300E0D718 /* Assets.xcassets */,
699DEBAA2AB0573200115D22 /* Info.plist */,
699DEBAB2AB0573200115D22 /* ShareExtension.entitlements */,
);
@@ -297,6 +305,7 @@
EB7F54112D78E95C00989564 /* TutorialView.swift */,
EB7F54132D78E9E400989564 /* LicenseWindow.swift */,
EB36435F2D73A29F009CDFF8 /* AudioManager.swift */,
EB96ED8E2D7F8103004B3FF1 /* Localized.swift */,
EB7F540F2D78E6DD00989564 /* Sidebar.swift */,
EB7CD1422D6FAEAF00CB0CB5 /* UserDefaultsKeys.swift */,
EB7CD13B2D6F8B6500CB0CB5 /* IAP */,
@@ -482,10 +491,10 @@
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
699B03452AB5FBA300E0D718 /* Assets.xcassets in Resources */,
EB9237C42D7CDF8B00CA3A42 /* Localizable.strings in Resources */,
691F53BC2ABB70840089FD92 /* DeviceListCell.xib in Resources */,
699DEBA92AB0573200115D22 /* ShareViewController.xib in Resources */,
EB96ED8D2D7F7EA3004B3FF1 /* Assets.xcassets in Resources */,
EB9237C52D7CDF9000CA3A42 /* Localizable.stringsdict in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
@@ -509,7 +518,10 @@
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
EB96ED892D7F79BE004B3FF1 /* ShareViewControllerSwiftUI.swift in Sources */,
EB96ED902D7F8114004B3FF1 /* Localized.swift in Sources */,
699DEBA62AB0573200115D22 /* ShareViewController.swift in Sources */,
EB96ED8B2D7F7CF7004B3FF1 /* QrCodeVIew.swift in Sources */,
EB7CD1462D6FB0E800CB0CB5 /* Logger.swift in Sources */,
691F53BB2ABB70840089FD92 /* DeviceListCell.swift in Sources */,
);
@@ -521,11 +533,13 @@
files = (
EBD2A2172D2860C100BCB8E2 /* WelcomeScreen.swift in Sources */,
EB3643602D73A2A2009CDFF8 /* AudioManager.swift in Sources */,
EB96ED8C2D7F7E7B004B3FF1 /* QrCodeVIew.swift in Sources */,
EB7F54142D78E9E700989564 /* LicenseWindow.swift in Sources */,
EB7CD1432D6FAEB400CB0CB5 /* UserDefaultsKeys.swift in Sources */,
69DA9A1229E0BF5100A442DA /* AppDelegate.swift in Sources */,
EB7F54102D78E6DF00989564 /* Sidebar.swift in Sources */,
EB7F54122D78E96000989564 /* TutorialView.swift in Sources */,
EB96ED8F2D7F8105004B3FF1 /* Localized.swift in Sources */,
EB7CD1452D6FB0C300CB0CB5 /* Logger.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
@@ -1,6 +0,0 @@
{
"info" : {
"author" : "xcode",
"version" : 1
}
}
@@ -91,24 +91,37 @@ Gw
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<customView translatesAutoresizingMaskIntoConstraints="NO" id="ACO-U2-AZj">
<rect key="frame" x="0.0" y="40" width="404" height="146"/>
</customView>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="CF4-AV-wG4">
<rect key="frame" x="3" y="3" width="189" height="32"/>
<buttonCell key="cell" type="push" title="Don't see your device?" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="j2l-tf-7in">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/>
<string key="keyEquivalent" base64-UTF8="YES">
Gw
</string>
</buttonCell>
<constraints>
<constraint firstAttribute="width" relation="greaterThanOrEqual" constant="175" id="WQ4-sg-Puk"/>
<constraint firstAttribute="width" relation="greaterThanOrEqual" constant="60" id="WyJ-wc-nKO"/>
</constraints>
<connections>
<action selector="dontSeeDeviceButton:" target="-2" id="EZu-rX-Ewr"/>
</connections>
</button>
</subviews>
<constraints>
<constraint firstItem="OEz-QK-nem" firstAttribute="top" secondItem="1xF-vr-5sH" secondAttribute="bottom" constant="10" id="852-oh-vM0"/>
<constraint firstItem="OEz-QK-nem" firstAttribute="leading" secondItem="afM-Om-nLQ" secondAttribute="trailing" constant="5" id="CIj-Dk-Md0"/>
<constraint firstAttribute="trailing" secondItem="ACO-U2-AZj" secondAttribute="trailing" id="HIg-sX-IK0"/>
<constraint firstItem="ACO-U2-AZj" firstAttribute="leading" secondItem="1" secondAttribute="leading" id="IGL-2g-wpe"/>
<constraint firstItem="CF4-AV-wG4" firstAttribute="leading" secondItem="afM-Om-nLQ" secondAttribute="leading" id="KfB-g2-nez"/>
<constraint firstItem="afM-Om-nLQ" firstAttribute="leading" secondItem="1" secondAttribute="leading" constant="10" id="LK2-cg-qcY"/>
<constraint firstItem="NVE-vN-dkz" firstAttribute="top" secondItem="ACO-U2-AZj" secondAttribute="bottom" constant="10" id="RSD-PX-W0H"/>
<constraint firstAttribute="bottom" secondItem="NVE-vN-dkz" secondAttribute="bottom" constant="10" id="USG-Gg-of3"/>
<constraint firstAttribute="trailing" secondItem="NVE-vN-dkz" secondAttribute="trailing" constant="10" id="Z6U-4n-4tO"/>
<constraint firstItem="CF4-AV-wG4" firstAttribute="baseline" secondItem="NVE-vN-dkz" secondAttribute="baseline" id="duh-UD-VUw"/>
<constraint firstItem="afM-Om-nLQ" firstAttribute="top" secondItem="1" secondAttribute="top" constant="36" id="fUG-kT-wb0"/>
<constraint firstItem="NVE-vN-dkz" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="CF4-AV-wG4" secondAttribute="trailing" constant="12" symbolic="YES" id="kWX-0G-L7t"/>
<constraint firstItem="1xF-vr-5sH" firstAttribute="centerX" secondItem="1" secondAttribute="centerX" id="sCA-yf-S9L"/>
<constraint firstItem="1xF-vr-5sH" firstAttribute="top" secondItem="1" secondAttribute="top" constant="10" id="tFn-vk-9Cq"/>
<constraint firstAttribute="trailing" secondItem="OEz-QK-nem" secondAttribute="trailing" constant="10" id="vyd-BI-oDH"/>
<constraint firstItem="ACO-U2-AZj" firstAttribute="top" secondItem="OEz-QK-nem" secondAttribute="bottom" constant="10" id="x5r-wc-s4x"/>
</constraints>
<point key="canvasLocation" x="140" y="-36"/>
</customView>
@@ -131,7 +144,7 @@ Gw
<rect key="frame" x="-2" y="0.0" width="525" height="32"/>
<textFieldCell key="cell" alignment="center" title="If you don't see your device, open the &quot;Google Files&quot; app and tap &quot;Receive&quot; on the Nearby Share tab." id="vla-gF-eJo">
<font key="font" metaFont="system"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="0.0" colorSpace="custom" customColorSpace="sRGB"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
@@ -256,6 +269,11 @@ Gw
</scroller>
<point key="canvasLocation" x="-397.5" y="30"/>
</scrollView>
<customView id="ACO-U2-AZj">
<rect key="frame" x="0.0" y="0.0" width="404" height="146"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<point key="canvasLocation" x="140" y="-36"/>
</customView>
</objects>
<resources>
<image name="NSCaution" width="32" height="32"/>
+48
View File
@@ -0,0 +1,48 @@
//
// QrCodeVIew.swift
// QuickDrop
//
// Created by Leon Böttger on 10.03.25.
//
import SwiftUI
let qrCodeViewSize = CGSize(width: 600.0, height: 310.0)
struct QrCodeView: View {
@State private var qrCode: String = ""
var body: some View {
VStack {
Spacer()
HStack {
Spacer()
Image("QR")
.resizable()
.aspectRatio(1, contentMode: .fit)
.frame(height: 230)
Spacer()
Text("QrCodeInstructions".localized())
.padding(.top)
.padding(.horizontal)
.multilineTextAlignment(.center)
Spacer()
}
.padding(.horizontal)
Spacer()
}
.frame(width: qrCodeViewSize.width, height: qrCodeViewSize.height)
}
}
#Preview {
QrCodeView()
}
+34
View File
@@ -7,10 +7,13 @@
import Foundation
import Cocoa
import SwiftUI
import NearbyShare
class ShareViewController: NSViewController, ShareExtensionDelegate{
private var qrWindow: NSWindow?
private var urls:[URL]=[]
private var foundDevices:[RemoteDeviceInfo]=[]
private var chosenDevice:RemoteDeviceInfo?
@@ -121,6 +124,37 @@ class ShareViewController: NSViewController, ShareExtensionDelegate{
let cancelError = NSError(domain: NSCocoaErrorDomain, code: NSUserCancelledError, userInfo: nil)
self.extensionContext!.cancelRequest(withError: cancelError)
}
@IBAction func dontSeeDeviceButton(_ sender: AnyObject?) {
openQrScreen()
}
@objc func openQrScreen() {
// Create the welcome screen SwiftUI view
let qrCodeView = QrCodeView()
// Create an NSWindow to host the SwiftUI view
qrWindow = NSWindow(
contentRect: NSRect(x: 0, y: 0, width: qrCodeViewSize.width, height: qrCodeViewSize.height),
styleMask: [.titled, .closable],
backing: .buffered,
defer: false
)
qrWindow?.styleMask.insert(.fullSizeContentView)
qrWindow?.titleVisibility = .hidden
qrWindow?.titlebarAppearsTransparent = true
qrWindow?.center()
qrWindow?.isReleasedWhenClosed = false
qrWindow?.setFrameAutosaveName("QrCodeScreen")
qrWindow?.contentView = NSHostingView(rootView: qrCodeView)
// Ensure the window is always on top
NSApp.activate(ignoringOtherApps: true) // Brings the whole app to the front
qrWindow?.makeKeyAndOrderFront(nil)
qrWindow?.level = .normal
}
private func urlsReady(){
for url in urls{
@@ -0,0 +1,138 @@
////
//// ShareViewControllerSwiftUI.swift
//// QuickDrop
////
//// Created by Leon Böttger on 10.03.25.
////
//
//import SwiftUI
//import NearbyShare
//
//import SwiftUI
//import Cocoa
//
//class ShareViewController: NSViewController {
// private let viewModel = ShareViewModel()
//
// override func loadView() {
// self.view = NSHostingView(rootView: ShareView(viewModel: viewModel))
// }
//
// override func viewDidLoad() {
// super.viewDidLoad()
// NearbyConnectionManager.shared.startDeviceDiscovery()
// NearbyConnectionManager.shared.addShareExtensionDelegate(viewModel)
// }
//
// override func viewWillDisappear() {
// NearbyConnectionManager.shared.stopDeviceDiscovery()
// NearbyConnectionManager.shared.removeShareExtensionDelegate(viewModel)
// }
//}
//
//import SwiftUI
//import Combine
//import NearbyShare
//
//class ShareViewModel: ObservableObject, ShareExtensionDelegate {
// @Published var foundDevices: [RemoteDeviceInfo] = []
// @Published var transferProgress: Double = 0.0
// @Published var transferState: String = "Idle"
// @Published var chosenDevice: RemoteDeviceInfo?
//
// func addDevice(device: RemoteDeviceInfo) {
// DispatchQueue.main.async {
// self.foundDevices.append(device)
// }
// }
//
// func removeDevice(id: String) {
// DispatchQueue.main.async {
// self.foundDevices.removeAll { $0.id == id }
// }
// }
//
// func connectionWasEstablished(pinCode: String) {
// DispatchQueue.main.async {
// self.transferState = "Connected - PIN: \(pinCode)"
// self.transferProgress = 0.0
// }
// }
//
// func connectionFailed(with error: Error) {
// DispatchQueue.main.async {
// self.transferState = "Error: \(error.localizedDescription)"
// }
// }
//
// func transferAccepted() {
// DispatchQueue.main.async {
// self.transferState = "Sending..."
// }
// }
//
// func transferProgress(progress: Double) {
// DispatchQueue.main.async {
// self.transferProgress = progress
// }
// }
//
// func transferFinished() {
// DispatchQueue.main.async {
// self.transferState = "Transfer finished"
// }
// }
//
// func selectDevice(device: RemoteDeviceInfo) {
// DispatchQueue.main.async {
// self.chosenDevice = device
// self.transferState = "Connecting to \(device.name)..."
// }
// NearbyConnectionManager.shared.stopDeviceDiscovery()
// NearbyConnectionManager.shared.startOutgoingTransfer(deviceID: device.id!, delegate: self, urls: [])
// }
//}
//
//
//import SwiftUI
//
//struct ShareView: View {
// @ObservedObject var viewModel: ShareViewModel
//
// var body: some View {
// VStack(spacing: 20) {
// Text("Nearby Devices")
// .font(.title)
//
// List(viewModel.foundDevices, id: \.id) { device in
// Button(action: {
// viewModel.selectDevice(device: device)
// }) {
// HStack {
// Image(systemName: deviceImageName(for: device.type))
// Text(device.name)
// }
// }
// }
//
// Text(viewModel.transferState)
// .padding()
//
// ProgressView(value: viewModel.transferProgress, total: 1000)
// .progressViewStyle(LinearProgressViewStyle())
// .padding()
// }
// .padding()
// }
//
// private func deviceImageName(for type: RemoteDeviceInfo.DeviceType) -> String {
// switch type {
// case .tablet:
// return "ipad"
// case .computer:
// return "desktopcomputer"
// default:
// return "iphone"
// }
// }
//}
@@ -4,3 +4,4 @@
"6Up-t3-mwm.title" = "إلغاء";
"NaJ-Wx-Pim.title" = "جارٍ البحث عن الأجهزة...";
"vla-gF-eJo.title" = "إذا لم ترَ جهازك، قم بتثبيت وفتح تطبيق 'Files by Google' ثم اضغط على 'استلام' في أسفل اليمين. ملاحظة: غير مدعوم حاليًا لأجهزة Samsung.";
"j2l-tf-7in.title" = "هل لا ترى جهازك؟";
@@ -4,3 +4,4 @@
"6Up-t3-mwm.title" = "Abbrechen";
"NaJ-Wx-Pim.title" = "Suche nach Geräten...";
"vla-gF-eJo.title" = "Falls du dein Gerät nicht siehst, installiere und öffne die „Files by Google“ App und tippe unten rechts auf „Empfangen“. Achtung: Samsung wird aktuell nicht unterstützt.";
"j2l-tf-7in.title" = "Gerät nicht sichtbar?";
@@ -5,3 +5,4 @@
"6Up-t3-mwm.title" = "Cancel";
"NaJ-Wx-Pim.title" = "Searching for devices...";
"vla-gF-eJo.title" = "If you don't see your device, install and open the 'Files by Google' app and tap 'Receive' at the bottom right. Note: Samsung is currently not supported.";
"j2l-tf-7in.title" = "Don't see your device?";
@@ -5,3 +5,4 @@
"6Up-t3-mwm.title" = "Cancelar";
"NaJ-Wx-Pim.title" = "Buscando dispositivos...";
"vla-gF-eJo.title" = "Si no ves tu dispositivo, instala y abre la aplicación 'Files by Google' y toca 'Recibir' en la parte inferior derecha. Nota: Actualmente no compatible con Samsung.";
"j2l-tf-7in.title" = "¿No ves tu dispositivo?";
@@ -5,3 +5,4 @@
"6Up-t3-mwm.title" = "Annuler";
"NaJ-Wx-Pim.title" = "Recherche de périphériques...";
"vla-gF-eJo.title" = "Si vous ne voyez pas votre appareil, installez et ouvrez l'application 'Files by Google', puis appuyez sur 'Recevoir' en bas à droite. Remarque : Actuellement non pris en charge pour Samsung.";
"j2l-tf-7in.title" = "Vous ne voyez pas votre appareil ?";
@@ -5,3 +5,4 @@
"6Up-t3-mwm.title" = "Mégse";
"NaJ-Wx-Pim.title" = "Eszközök keresése...";
"vla-gF-eJo.title" = "Ha nem látod az eszközödet, telepítsd és nyisd meg a 'Files by Google' alkalmazást, majd koppints a 'Fogadás' gombra a jobb alsó sarokban. Megjegyzés: Jelenleg nem támogatott Samsung eszközökön.";
"j2l-tf-7in.title" = "Nem látod az eszközödet?";
@@ -5,3 +5,4 @@
"6Up-t3-mwm.title" = "Annulla";
"NaJ-Wx-Pim.title" = "Ricerca di dispositivi...";
"vla-gF-eJo.title" = "Se non vedi il tuo dispositivo, installa e apri l'app 'Files by Google' e tocca 'Ricevi' in basso a destra. Nota: Attualmente non supportato per Samsung.";
"j2l-tf-7in.title" = "Non vedi il tuo dispositivo?";
@@ -5,3 +5,4 @@
"6Up-t3-mwm.title" = "キャンセル";
"NaJ-Wx-Pim.title" = "デバイスを検索中...";
"vla-gF-eJo.title" = "デバイスが表示されない場合は、『Files by Google』アプリをインストールして開き、右下の『受信』をタップしてください。注意: 現在、Samsungには対応していません。";
"j2l-tf-7in.title" = "デバイスが見えませんか?";
@@ -5,3 +5,4 @@
"6Up-t3-mwm.title" = "취소";
"NaJ-Wx-Pim.title" = "기기 검색 중...";
"vla-gF-eJo.title" = "기기를 찾을 수 없다면 'Files by Google' 앱을 설치하고 실행한 후, 오른쪽 하단의 '받기'를 탭하세요. 참고: 현재 삼성은 지원되지 않습니다.";
"j2l-tf-7in.title" = "장치가 보이지 않나요?";
@@ -5,3 +5,4 @@
"6Up-t3-mwm.title" = "Annuleren";
"NaJ-Wx-Pim.title" = "Zoeken naar apparaten...";
"vla-gF-eJo.title" = "Als je je apparaat niet ziet, installeer en open de app 'Files by Google' en tik op 'Ontvangen' rechtsonder. Opmerking: Momenteel niet ondersteund voor Samsung.";
"j2l-tf-7in.title" = "Zie je je apparaat niet?";
@@ -5,3 +5,4 @@
"6Up-t3-mwm.title" = "Cancelar";
"NaJ-Wx-Pim.title" = "Procurando dispositivos...";
"vla-gF-eJo.title" = "Se você não vê seu dispositivo, instale e abra o app 'Files by Google' e toque em 'Receber' no canto inferior direito. Nota: Atualmente não compatível com Samsung.";
"j2l-tf-7in.title" = "Não vê o seu dispositivo?";
@@ -5,3 +5,4 @@
"6Up-t3-mwm.title" = "Cancelar";
"NaJ-Wx-Pim.title" = "A procurar dispositivos...";
"vla-gF-eJo.title" = "Se não vires o teu dispositivo, instala e abre a aplicação 'Files by Google' e toca em 'Receber' no canto inferior direito. Nota: Atualmente não suportado para Samsung.";
"j2l-tf-7in.title" = "Não vê o seu dispositivo?";
@@ -5,3 +5,4 @@
"6Up-t3-mwm.title" = "Anulează";
"NaJ-Wx-Pim.title" = "Se caută dispozitive...";
"vla-gF-eJo.title" = "Dacă nu vezi dispozitivul tău, instalează și deschide aplicația 'Files by Google' și atinge 'Primește' în colțul din dreapta jos. Notă: În prezent, nu este compatibil cu Samsung.";
"j2l-tf-7in.title" = "Nu vezi dispozitivul tău?";
@@ -4,4 +4,5 @@
"6Up-t3-mwm.title" = "Отмена";
"NaJ-Wx-Pim.title" = "Поиск устройств...";
"vla-gF-eJo.title" = "Если вы не видите свое устройство, установите и откройте приложение 'Files by Google' и нажмите 'Получить' в правом нижнем углу. Примечание: В настоящее время не поддерживается для Samsung.";
"vla-gF-eJo.title" = "Если вы не видите свое устройство, установите и откройте приложение 'Files by Google' и нажмите 'Получить' в правом нижнем углу. Примечание: В настоящее время не поддерживается для Samsung.";
"j2l-tf-7in.title" = "Не видите ваше устройство?";
@@ -5,3 +5,4 @@
"6Up-t3-mwm.title" = "ยกเลิก";
"NaJ-Wx-Pim.title" = "กำลังค้นหาอุปกรณ์...";
"vla-gF-eJo.title" = "หากคุณไม่เห็นอุปกรณ์ของคุณ ให้ติดตั้งและเปิดแอป 'Files by Google' แล้วแตะ 'รับ' ที่มุมล่างขวา หมายเหตุ: ปัจจุบันยังไม่รองรับ Samsung";
"j2l-tf-7in.title" = "ไม่เห็นอุปกรณ์ของคุณใช่ไหม?";
@@ -5,3 +5,4 @@
"6Up-t3-mwm.title" = "Скасувати";
"NaJ-Wx-Pim.title" = "Пошук пристроїв...";
"vla-gF-eJo.title" = "Якщо ви не бачите свій пристрій, встановіть і відкрийте додаток 'Files by Google' та натисніть 'Отримати' внизу праворуч. Примітка: Наразі не підтримується для Samsung.";
"j2l-tf-7in.title" = "Не бачите вашого пристрою?";
@@ -4,3 +4,4 @@
"6Up-t3-mwm.title" = "取消";
"NaJ-Wx-Pim.title" = "正在搜索设备...";
"vla-gF-eJo.title" = "如果您没有看到您的设备,请安装并打开‘Files by Google’应用,然后点击右下角的‘接收’。注意:目前不支持三星设备。";
"j2l-tf-7in.title" = "看不到你的设备吗?";