diff --git a/NearDrop/Assets.xcassets/QR.imageset/Contents.json b/NearDrop/Assets.xcassets/QR.imageset/Contents.json new file mode 100644 index 0000000..864b867 --- /dev/null +++ b/NearDrop/Assets.xcassets/QR.imageset/Contents.json @@ -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 + } +} diff --git a/NearDrop/Assets.xcassets/QR.imageset/QR.png b/NearDrop/Assets.xcassets/QR.imageset/QR.png new file mode 100644 index 0000000..6e48f0a Binary files /dev/null and b/NearDrop/Assets.xcassets/QR.imageset/QR.png differ diff --git a/ShareExtension/Assets.xcassets/QuickDropIcon.imageset/1024-1024.png b/NearDrop/Assets.xcassets/QuickDropIcon.imageset/1024-1024.png similarity index 100% rename from ShareExtension/Assets.xcassets/QuickDropIcon.imageset/1024-1024.png rename to NearDrop/Assets.xcassets/QuickDropIcon.imageset/1024-1024.png diff --git a/ShareExtension/Assets.xcassets/QuickDropIcon.imageset/Contents.json b/NearDrop/Assets.xcassets/QuickDropIcon.imageset/Contents.json similarity index 100% rename from ShareExtension/Assets.xcassets/QuickDropIcon.imageset/Contents.json rename to NearDrop/Assets.xcassets/QuickDropIcon.imageset/Contents.json diff --git a/NearDrop/Base.lproj/Localizable.strings b/NearDrop/Base.lproj/Localizable.strings index b065c6a..46af21f 100644 --- a/NearDrop/Base.lproj/Localizable.strings +++ b/NearDrop/Base.lproj/Localizable.strings @@ -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."; diff --git a/NearDrop/IAP/PurchaseHelper.swift b/NearDrop/IAP/PurchaseHelper.swift index f43d36d..207bd73 100644 --- a/NearDrop/IAP/PurchaseHelper.swift +++ b/NearDrop/IAP/PurchaseHelper.swift @@ -189,11 +189,3 @@ extension IAPManager.IAPManagerError: LocalizedError { } } } - - -public extension String { - func localized() -> String { - let localizedString = NSLocalizedString(self, comment: "") - return localizedString - } -} diff --git a/NearDrop/Localized.swift b/NearDrop/Localized.swift new file mode 100644 index 0000000..99d6091 --- /dev/null +++ b/NearDrop/Localized.swift @@ -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 + } +} diff --git a/NearDrop/ar.lproj/Localizable.strings b/NearDrop/ar.lproj/Localizable.strings index 0210212..c40c34a 100644 --- a/NearDrop/ar.lproj/Localizable.strings +++ b/NearDrop/ar.lproj/Localizable.strings @@ -92,3 +92,4 @@ "TransferFinished" = "اكتمل النقل"; "TransferTimedOut" = "انتهت المهلة"; "UnsupportedType" = "نوع المرفق غير مدعوم"; +"QrCodeInstructions" = "امسح رمز QR باستخدام كاميرا جهاز Android الخاص بك. بعد ذلك، سيظهر في الشاشة السابقة.\n\nبدلاً من ذلك، قم بتثبيت وفتح تطبيق 'Files by Google' ثم اضغط على 'استلام' في الزاوية اليمنى السفلى."; diff --git a/NearDrop/de.lproj/Localizable.strings b/NearDrop/de.lproj/Localizable.strings index e397a91..2e0817f 100644 --- a/NearDrop/de.lproj/Localizable.strings +++ b/NearDrop/de.lproj/Localizable.strings @@ -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."; diff --git a/NearDrop/es.lproj/Localizable.strings b/NearDrop/es.lproj/Localizable.strings index e8eeae7..fa0cd0d 100644 --- a/NearDrop/es.lproj/Localizable.strings +++ b/NearDrop/es.lproj/Localizable.strings @@ -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."; diff --git a/NearDrop/fr.lproj/Localizable.strings b/NearDrop/fr.lproj/Localizable.strings index 7c0f492..b02c6a0 100644 --- a/NearDrop/fr.lproj/Localizable.strings +++ b/NearDrop/fr.lproj/Localizable.strings @@ -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."; diff --git a/NearDrop/hu.lproj/Localizable.strings b/NearDrop/hu.lproj/Localizable.strings index c592ccf..dc8ba86 100644 --- a/NearDrop/hu.lproj/Localizable.strings +++ b/NearDrop/hu.lproj/Localizable.strings @@ -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."; diff --git a/NearDrop/it.lproj/Localizable.strings b/NearDrop/it.lproj/Localizable.strings index 49e7dd1..790421e 100644 --- a/NearDrop/it.lproj/Localizable.strings +++ b/NearDrop/it.lproj/Localizable.strings @@ -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."; diff --git a/NearDrop/ja.lproj/Localizable.strings b/NearDrop/ja.lproj/Localizable.strings index c1378ac..fd87434 100644 --- a/NearDrop/ja.lproj/Localizable.strings +++ b/NearDrop/ja.lproj/Localizable.strings @@ -93,3 +93,4 @@ AndroidデバイスからMacにファイルを送信するには、スマート "TransferFinished" = "転送完了"; "TransferTimedOut" = "タイムアウトしました"; "UnsupportedType" = "添付ファイルの種類はサポートされていません"; +"QrCodeInstructions" = "AndroidデバイスのカメラでQRコードをスキャンしてください。その後、前の画面に表示されます。\n\nまたは、『Files by Google』アプリをインストールして開き、右下の「受信」をタップしてください。"; diff --git a/NearDrop/ko.lproj/Localizable.strings b/NearDrop/ko.lproj/Localizable.strings index dfc4d6a..0ae0fea 100644 --- a/NearDrop/ko.lproj/Localizable.strings +++ b/NearDrop/ko.lproj/Localizable.strings @@ -93,3 +93,4 @@ Android 기기에서 Mac으로 파일을 보내려면 휴대폰에서 공유 아 "TransferFinished" = "전송 완료"; "TransferTimedOut" = "시간 초과"; "UnsupportedType" = "지원되지 않는 첨부 파일 유형"; +"QrCodeInstructions" = "Android 기기의 카메라로 QR 코드를 스캔하세요. 이후 이전 화면에 표시됩니다.\n\n또는 'Files by Google' 앱을 설치하고 열어 오른쪽 아래의 '받기'를 탭하세요."; diff --git a/NearDrop/nl.lproj/Localizable.strings b/NearDrop/nl.lproj/Localizable.strings index 6a82d8f..f17e2d7 100644 --- a/NearDrop/nl.lproj/Localizable.strings +++ b/NearDrop/nl.lproj/Localizable.strings @@ -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."; diff --git a/NearDrop/pt-BR.lproj/Localizable.strings b/NearDrop/pt-BR.lproj/Localizable.strings index f1b580f..4bbc9a6 100644 --- a/NearDrop/pt-BR.lproj/Localizable.strings +++ b/NearDrop/pt-BR.lproj/Localizable.strings @@ -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."; diff --git a/NearDrop/pt-PT.lproj/Localizable.strings b/NearDrop/pt-PT.lproj/Localizable.strings index 1d43e32..c60562e 100644 --- a/NearDrop/pt-PT.lproj/Localizable.strings +++ b/NearDrop/pt-PT.lproj/Localizable.strings @@ -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."; diff --git a/NearDrop/ro.lproj/Localizable.strings b/NearDrop/ro.lproj/Localizable.strings index ef7e969..5a8544e 100644 --- a/NearDrop/ro.lproj/Localizable.strings +++ b/NearDrop/ro.lproj/Localizable.strings @@ -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."; diff --git a/NearDrop/ru.lproj/Localizable.strings b/NearDrop/ru.lproj/Localizable.strings index ab6ad3f..ec3ce05 100644 --- a/NearDrop/ru.lproj/Localizable.strings +++ b/NearDrop/ru.lproj/Localizable.strings @@ -96,3 +96,4 @@ "TransferFinished" = "Передача завершена"; "TransferTimedOut" = "Время ожидания истекло"; "UnsupportedType" = "Тип вложения не поддерживается"; +"QrCodeInstructions" = "Отсканируйте QR-код с помощью камеры вашего устройства Android. После этого он появится на предыдущем экране.\n\nИли установите и откройте приложение 'Files by Google' и нажмите 'Получить' внизу справа."; diff --git a/NearDrop/th.lproj/Localizable.strings b/NearDrop/th.lproj/Localizable.strings index d5c3a74..6b60c91 100644 --- a/NearDrop/th.lproj/Localizable.strings +++ b/NearDrop/th.lproj/Localizable.strings @@ -93,3 +93,4 @@ "TransferFinished" = "การโอนเสร็จสิ้น"; "TransferTimedOut" = "หมดเวลา"; "UnsupportedType" = "ไม่รองรับประเภทไฟล์แนบ"; +"QrCodeInstructions" = "สแกนรหัส QR ด้วยกล้องของอุปกรณ์ Android ของคุณ หลังจากนั้น อุปกรณ์จะปรากฏบนหน้าจอก่อนหน้า\n\nหรือ ติดตั้งและเปิดแอป 'Files by Google' แล้วแตะ 'รับ' ที่ด้านล่างขวา"; diff --git a/NearDrop/uk.lproj/Localizable.strings b/NearDrop/uk.lproj/Localizable.strings index 719abcd..57bad5e 100644 --- a/NearDrop/uk.lproj/Localizable.strings +++ b/NearDrop/uk.lproj/Localizable.strings @@ -93,3 +93,4 @@ "TransferFinished" = "Передача завершена"; "TransferTimedOut" = "Час очікування вийшов"; "UnsupportedType" = "Тип вкладення не підтримується"; +"QrCodeInstructions" = "Скануйте QR-код за допомогою камери вашого пристрою Android. Після цього він з’явиться на попередньому екрані.\n\nАбо встановіть та відкрийте додаток 'Files by Google' і натисніть 'Отримати' внизу праворуч."; diff --git a/NearDrop/zh-Hans.lproj/Localizable.strings b/NearDrop/zh-Hans.lproj/Localizable.strings index aeea278..acbbecc 100644 --- a/NearDrop/zh-Hans.lproj/Localizable.strings +++ b/NearDrop/zh-Hans.lproj/Localizable.strings @@ -93,3 +93,4 @@ "TransferFinished" = "传输完成"; "TransferTimedOut" = "超时"; "UnsupportedType" = "不支持的附件类型"; +"QrCodeInstructions" = "使用您的 Android 设备的相机扫描二维码。之后,它将在上一个屏幕上显示。\n\n或者,安装并打开 'Files by Google' 应用,然后点击右下角的“接收”。"; diff --git a/QuickDrop.xcodeproj/project.pbxproj b/QuickDrop.xcodeproj/project.pbxproj index 5178649..8bf91dc 100644 --- a/QuickDrop.xcodeproj/project.pbxproj +++ b/QuickDrop.xcodeproj/project.pbxproj @@ -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 = ""; }; 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 = ""; }; 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 = ""; }; 699DEBA82AB0573200115D22 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/ShareViewController.xib; sourceTree = ""; }; @@ -205,6 +209,9 @@ EB9237BF2D7CDE3E00CA3A42 /* pt-BR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-BR"; path = "pt-BR.lproj/ShareViewController.strings"; sourceTree = ""; }; EB9237C12D7CDE4000CA3A42 /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/ShareViewController.strings; sourceTree = ""; }; EB9237C32D7CDE4100CA3A42 /* th */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = th; path = th.lproj/ShareViewController.strings; sourceTree = ""; }; + EB96ED882D7F79B9004B3FF1 /* ShareViewControllerSwiftUI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShareViewControllerSwiftUI.swift; sourceTree = ""; }; + EB96ED8A2D7F7CF4004B3FF1 /* QrCodeVIew.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QrCodeVIew.swift; sourceTree = ""; }; + EB96ED8E2D7F8103004B3FF1 /* Localized.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Localized.swift; sourceTree = ""; }; EBD2A2162D2860BE00BCB8E2 /* WelcomeScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WelcomeScreen.swift; sourceTree = ""; }; EBD2A2182D28619200BCB8E2 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = Info.plist; sourceTree = ""; }; /* 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; diff --git a/ShareExtension/Assets.xcassets/Contents.json b/ShareExtension/Assets.xcassets/Contents.json deleted file mode 100644 index 73c0059..0000000 --- a/ShareExtension/Assets.xcassets/Contents.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/ShareExtension/Base.lproj/ShareViewController.xib b/ShareExtension/Base.lproj/ShareViewController.xib index f4b20e5..4595810 100644 --- a/ShareExtension/Base.lproj/ShareViewController.xib +++ b/ShareExtension/Base.lproj/ShareViewController.xib @@ -91,24 +91,37 @@ Gw - - - + - - + - + + - @@ -131,7 +144,7 @@ Gw - + @@ -256,6 +269,11 @@ Gw + + + + + diff --git a/ShareExtension/QrCodeVIew.swift b/ShareExtension/QrCodeVIew.swift new file mode 100644 index 0000000..2ab9580 --- /dev/null +++ b/ShareExtension/QrCodeVIew.swift @@ -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() +} diff --git a/ShareExtension/ShareViewController.swift b/ShareExtension/ShareViewController.swift index 6df836c..3a4225f 100644 --- a/ShareExtension/ShareViewController.swift +++ b/ShareExtension/ShareViewController.swift @@ -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{ diff --git a/ShareExtension/ShareViewControllerSwiftUI.swift b/ShareExtension/ShareViewControllerSwiftUI.swift new file mode 100644 index 0000000..9fbdc38 --- /dev/null +++ b/ShareExtension/ShareViewControllerSwiftUI.swift @@ -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" +// } +// } +//} diff --git a/ShareExtension/ar.lproj/ShareViewController.strings b/ShareExtension/ar.lproj/ShareViewController.strings index 8219079..e651014 100644 --- a/ShareExtension/ar.lproj/ShareViewController.strings +++ b/ShareExtension/ar.lproj/ShareViewController.strings @@ -4,3 +4,4 @@ "6Up-t3-mwm.title" = "إلغاء"; "NaJ-Wx-Pim.title" = "جارٍ البحث عن الأجهزة..."; "vla-gF-eJo.title" = "إذا لم ترَ جهازك، قم بتثبيت وفتح تطبيق 'Files by Google' ثم اضغط على 'استلام' في أسفل اليمين. ملاحظة: غير مدعوم حاليًا لأجهزة Samsung."; +"j2l-tf-7in.title" = "هل لا ترى جهازك؟"; diff --git a/ShareExtension/de.lproj/ShareViewController.strings b/ShareExtension/de.lproj/ShareViewController.strings index 71d22e2..2b58e95 100644 --- a/ShareExtension/de.lproj/ShareViewController.strings +++ b/ShareExtension/de.lproj/ShareViewController.strings @@ -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?"; diff --git a/ShareExtension/en.lproj/ShareViewController.strings b/ShareExtension/en.lproj/ShareViewController.strings index 702ce31..fec86b4 100644 --- a/ShareExtension/en.lproj/ShareViewController.strings +++ b/ShareExtension/en.lproj/ShareViewController.strings @@ -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?"; diff --git a/ShareExtension/es.lproj/ShareViewController.strings b/ShareExtension/es.lproj/ShareViewController.strings index 731f604..a06cbe0 100644 --- a/ShareExtension/es.lproj/ShareViewController.strings +++ b/ShareExtension/es.lproj/ShareViewController.strings @@ -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?"; diff --git a/ShareExtension/fr.lproj/ShareViewController.strings b/ShareExtension/fr.lproj/ShareViewController.strings index 0b1c5b3..0cda9eb 100644 --- a/ShareExtension/fr.lproj/ShareViewController.strings +++ b/ShareExtension/fr.lproj/ShareViewController.strings @@ -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 ?"; diff --git a/ShareExtension/hu.lproj/ShareViewController.strings b/ShareExtension/hu.lproj/ShareViewController.strings index 5113bc7..a92008d 100644 --- a/ShareExtension/hu.lproj/ShareViewController.strings +++ b/ShareExtension/hu.lproj/ShareViewController.strings @@ -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?"; diff --git a/ShareExtension/it.lproj/ShareViewController.strings b/ShareExtension/it.lproj/ShareViewController.strings index 59818e3..3f348af 100644 --- a/ShareExtension/it.lproj/ShareViewController.strings +++ b/ShareExtension/it.lproj/ShareViewController.strings @@ -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?"; diff --git a/ShareExtension/ja.lproj/ShareViewController.strings b/ShareExtension/ja.lproj/ShareViewController.strings index 5e9b97d..8ba3c31 100644 --- a/ShareExtension/ja.lproj/ShareViewController.strings +++ b/ShareExtension/ja.lproj/ShareViewController.strings @@ -5,3 +5,4 @@ "6Up-t3-mwm.title" = "キャンセル"; "NaJ-Wx-Pim.title" = "デバイスを検索中..."; "vla-gF-eJo.title" = "デバイスが表示されない場合は、『Files by Google』アプリをインストールして開き、右下の『受信』をタップしてください。注意: 現在、Samsungには対応していません。"; +"j2l-tf-7in.title" = "デバイスが見えませんか?"; diff --git a/ShareExtension/ko.lproj/ShareViewController.strings b/ShareExtension/ko.lproj/ShareViewController.strings index 8007d61..da13348 100644 --- a/ShareExtension/ko.lproj/ShareViewController.strings +++ b/ShareExtension/ko.lproj/ShareViewController.strings @@ -5,3 +5,4 @@ "6Up-t3-mwm.title" = "취소"; "NaJ-Wx-Pim.title" = "기기 검색 중..."; "vla-gF-eJo.title" = "기기를 찾을 수 없다면 'Files by Google' 앱을 설치하고 실행한 후, 오른쪽 하단의 '받기'를 탭하세요. 참고: 현재 삼성은 지원되지 않습니다."; +"j2l-tf-7in.title" = "장치가 보이지 않나요?"; diff --git a/ShareExtension/nl.lproj/ShareViewController.strings b/ShareExtension/nl.lproj/ShareViewController.strings index 303b8a1..cfb0b10 100644 --- a/ShareExtension/nl.lproj/ShareViewController.strings +++ b/ShareExtension/nl.lproj/ShareViewController.strings @@ -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?"; diff --git a/ShareExtension/pt-BR.lproj/ShareViewController.strings b/ShareExtension/pt-BR.lproj/ShareViewController.strings index fe98aab..96e6b19 100644 --- a/ShareExtension/pt-BR.lproj/ShareViewController.strings +++ b/ShareExtension/pt-BR.lproj/ShareViewController.strings @@ -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?"; diff --git a/ShareExtension/pt-PT.lproj/ShareViewController.strings b/ShareExtension/pt-PT.lproj/ShareViewController.strings index b05cf40..2954fea 100644 --- a/ShareExtension/pt-PT.lproj/ShareViewController.strings +++ b/ShareExtension/pt-PT.lproj/ShareViewController.strings @@ -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?"; diff --git a/ShareExtension/ro.lproj/ShareViewController.strings b/ShareExtension/ro.lproj/ShareViewController.strings index 51ad68c..8490933 100644 --- a/ShareExtension/ro.lproj/ShareViewController.strings +++ b/ShareExtension/ro.lproj/ShareViewController.strings @@ -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?"; diff --git a/ShareExtension/ru.lproj/ShareViewController.strings b/ShareExtension/ru.lproj/ShareViewController.strings index 4e1269b..d03059f 100644 --- a/ShareExtension/ru.lproj/ShareViewController.strings +++ b/ShareExtension/ru.lproj/ShareViewController.strings @@ -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" = "Не видите ваше устройство?"; diff --git a/ShareExtension/th.lproj/ShareViewController.strings b/ShareExtension/th.lproj/ShareViewController.strings index 7d089c8..8c13459 100644 --- a/ShareExtension/th.lproj/ShareViewController.strings +++ b/ShareExtension/th.lproj/ShareViewController.strings @@ -5,3 +5,4 @@ "6Up-t3-mwm.title" = "ยกเลิก"; "NaJ-Wx-Pim.title" = "กำลังค้นหาอุปกรณ์..."; "vla-gF-eJo.title" = "หากคุณไม่เห็นอุปกรณ์ของคุณ ให้ติดตั้งและเปิดแอป 'Files by Google' แล้วแตะ 'รับ' ที่มุมล่างขวา หมายเหตุ: ปัจจุบันยังไม่รองรับ Samsung"; +"j2l-tf-7in.title" = "ไม่เห็นอุปกรณ์ของคุณใช่ไหม?"; diff --git a/ShareExtension/uk.lproj/ShareViewController.strings b/ShareExtension/uk.lproj/ShareViewController.strings index 24e906b..87a78aa 100644 --- a/ShareExtension/uk.lproj/ShareViewController.strings +++ b/ShareExtension/uk.lproj/ShareViewController.strings @@ -5,3 +5,4 @@ "6Up-t3-mwm.title" = "Скасувати"; "NaJ-Wx-Pim.title" = "Пошук пристроїв..."; "vla-gF-eJo.title" = "Якщо ви не бачите свій пристрій, встановіть і відкрийте додаток 'Files by Google' та натисніть 'Отримати' внизу праворуч. Примітка: Наразі не підтримується для Samsung."; +"j2l-tf-7in.title" = "Не бачите вашого пристрою?"; diff --git a/ShareExtension/zh-Hans.lproj/ShareViewController.strings b/ShareExtension/zh-Hans.lproj/ShareViewController.strings index 6b0b6b3..8141f43 100644 --- a/ShareExtension/zh-Hans.lproj/ShareViewController.strings +++ b/ShareExtension/zh-Hans.lproj/ShareViewController.strings @@ -4,3 +4,4 @@ "6Up-t3-mwm.title" = "取消"; "NaJ-Wx-Pim.title" = "正在搜索设备..."; "vla-gF-eJo.title" = "如果您没有看到您的设备,请安装并打开‘Files by Google’应用,然后点击右下角的‘接收’。注意:目前不支持三星设备。"; +"j2l-tf-7in.title" = "看不到你的设备吗?";