From bb86ebc606372e9eaaaf75cf2d91987198889e96 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Leon=20B=C3=B6ttger?= Date: Fri, 4 Apr 2025 20:21:17 +0200 Subject: [PATCH] Fix if pending file takes too long --- NearDrop/AppDelegate.swift | 9 +---- NearDrop/SettingsView.swift | 1 + NearDrop/TutorialView.swift | 2 +- NearDrop/WelcomeScreen.swift | 1 + .../Helpers.swift | 10 +++-- NearbyShare/InboundNearbyConnection.swift | 39 ++++++++++++++++++- QuickDrop.xcodeproj/project.pbxproj | 10 ++--- 7 files changed, 53 insertions(+), 19 deletions(-) rename NearDrop/UserDefaultsKeys.swift => NearbyShare/Helpers.swift (59%) diff --git a/NearDrop/AppDelegate.swift b/NearDrop/AppDelegate.swift index 6579c9b..b5e3a65 100644 --- a/NearDrop/AppDelegate.swift +++ b/NearDrop/AppDelegate.swift @@ -168,12 +168,7 @@ class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCenterDele plusWindow?.makeKeyAndOrderFront(nil) plusWindow?.level = .normal } - - - func isPlusVersion() -> Bool { - return UserDefaults.standard.bool(forKey: UserDefaultsKeys.plusVersion.rawValue) - } - + func transmissionCount() -> Int { return UserDefaults.standard.integer(forKey: UserDefaultsKeys.transmissionCount.rawValue) @@ -287,7 +282,7 @@ class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCenterDele private func pressAcceptButton(transferID: String) { - if false || (!isPlusVersion() && transmissionCount() > 0) { + if true || (!isPlusVersion() && transmissionCount() > 0) { self.continueTransmission(accept: true, transferID: transferID, storeInTemp: true) log("Showing plus screen...") diff --git a/NearDrop/SettingsView.swift b/NearDrop/SettingsView.swift index 41ec53a..b997fd5 100644 --- a/NearDrop/SettingsView.swift +++ b/NearDrop/SettingsView.swift @@ -7,6 +7,7 @@ import SwiftUI import AppKit +import NearbyShare struct SettingsView: View { @AppStorage(UserDefaultsKeys.automaticallyAcceptFiles.rawValue) private var automaticallyAcceptFiles = false diff --git a/NearDrop/TutorialView.swift b/NearDrop/TutorialView.swift index 54e8e85..bc42a50 100644 --- a/NearDrop/TutorialView.swift +++ b/NearDrop/TutorialView.swift @@ -6,7 +6,7 @@ // import SwiftUI - +import NearbyShare struct TutorialView: View { diff --git a/NearDrop/WelcomeScreen.swift b/NearDrop/WelcomeScreen.swift index b1ca0c8..ad5b4f7 100644 --- a/NearDrop/WelcomeScreen.swift +++ b/NearDrop/WelcomeScreen.swift @@ -6,6 +6,7 @@ // import SwiftUI +import NearbyShare struct WelcomeScreen: View { diff --git a/NearDrop/UserDefaultsKeys.swift b/NearbyShare/Helpers.swift similarity index 59% rename from NearDrop/UserDefaultsKeys.swift rename to NearbyShare/Helpers.swift index 8436b34..b5b2d9d 100644 --- a/NearDrop/UserDefaultsKeys.swift +++ b/NearbyShare/Helpers.swift @@ -1,13 +1,17 @@ // -// UserDefaultKeys.swift +// Helpers.swift // QuickDrop // -// Created by Leon Böttger on 26.02.25. +// Created by Leon Böttger on 04.04.25. // import Foundation -enum UserDefaultsKeys: String, CaseIterable { +public func isPlusVersion() -> Bool { + return UserDefaults.standard.bool(forKey: UserDefaultsKeys.plusVersion.rawValue) +} + +public enum UserDefaultsKeys: String, CaseIterable { case isEligibleForIap = "isEligibleForIap" case appLaunchedBefore = "ShowedWelcomeScreen" case plusVersion = "isPlusVersion" diff --git a/NearbyShare/InboundNearbyConnection.swift b/NearbyShare/InboundNearbyConnection.swift index b5de0ea..b3e371b 100644 --- a/NearbyShare/InboundNearbyConnection.swift +++ b/NearbyShare/InboundNearbyConnection.swift @@ -43,6 +43,7 @@ class InboundNearbyConnection: NearbyConnection{ DispatchQueue.main.async { self.delegate?.connectionWasTerminated(connection: self, error: self.lastError) + SaveFilesManager.shared.movePendingFilesToTarget() SaveFilesManager.shared.stopAccessingSecurityScopedResource() } } @@ -113,6 +114,8 @@ class InboundNearbyConnection: NearbyConnection{ try fileInfo.fileHandle?.close() transferredFiles[id]!.fileHandle=nil fileInfo.progress?.unpublish() + SaveFilesManager.shared.registerFileFinishedDownloading(fileInfo.destinationURL) + transferredFiles.removeValue(forKey: id) if transferredFiles.isEmpty{ try sendDisconnectionAndDisconnect() @@ -135,6 +138,7 @@ class InboundNearbyConnection: NearbyConnection{ transferredFiles[id]!.fileHandle=nil fileInfo.progress?.unpublish() transferredFiles.removeValue(forKey: id) + SaveFilesManager.shared.registerFileFinishedDownloading(fileInfo.destinationURL) try sendDisconnectionAndDisconnect() return true } @@ -442,8 +446,20 @@ public class SaveFilesManager { internal let tempDirectory: URL = FileManager.default.temporaryDirectory.appendingPathComponent("Pending") private var securityScopeUrl: URL? + private var filesFinishedDownloading = [URL]() + + + public func registerFileFinishedDownloading(_ fileURL: URL) { + filesFinishedDownloading.append(fileURL) + } + + public func movePendingFilesToTarget() { + if !isPlusVersion() { + return + } + log("Moving pending files to target directory") do { @@ -453,9 +469,16 @@ public class SaveFilesManager { let target = getSaveDirectory() for file in files { + let fileName = file.lastPathComponent var destinationURL = target.appendingPathComponent(fileName) + if !filesFinishedDownloading.contains(destinationURL) { + log("File \(file) not finished downloading, skipping") + log("Pending files: \(filesFinishedDownloading)") + continue + } + var counter = 1 let fileExtension = destinationURL.pathExtension let baseName = destinationURL.deletingPathExtension().lastPathComponent @@ -469,10 +492,22 @@ public class SaveFilesManager { log("Moving file: \(file.lastPathComponent) to \(destinationURL.lastPathComponent)") try fileManager.copyItem(at: file, to: destinationURL) + + let progress = Progress() + progress.fileURL = destinationURL + progress.totalUnitCount = 10 + progress.kind = .file + progress.isPausable = false + progress.publish() + + DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { + progress.completedUnitCount = 10 + progress.unpublish() + } + + try fileManager.removeItem(at: file) } - try fileManager.removeItem(at: tempDirectory) - stopAccessingSecurityScopedResource() log("Moved all pending files to target directory") diff --git a/QuickDrop.xcodeproj/project.pbxproj b/QuickDrop.xcodeproj/project.pbxproj index 9ddc818..a2b06de 100644 --- a/QuickDrop.xcodeproj/project.pbxproj +++ b/QuickDrop.xcodeproj/project.pbxproj @@ -34,11 +34,10 @@ 69DCF49C2AB8C58500CBE2CC /* SwiftECC in Frameworks */ = {isa = PBXBuildFile; productRef = 69DCF49B2AB8C58500CBE2CC /* SwiftECC */; }; 69DCF49D2AB8C9A500CBE2CC /* libNearbyShare.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 69DCF4812AB70D0600CBE2CC /* libNearbyShare.dylib */; }; 69DCF49E2AB8C9A500CBE2CC /* libNearbyShare.dylib in Embed Libraries */ = {isa = PBXBuildFile; fileRef = 69DCF4812AB70D0600CBE2CC /* libNearbyShare.dylib */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; + EB2F9BFB2DA04B69004010A2 /* Helpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = EB2F9BFA2DA04B67004010A2 /* Helpers.swift */; }; EB3643602D73A2A2009CDFF8 /* AudioManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = EB36435F2D73A29F009CDFF8 /* AudioManager.swift */; }; EB3643622D73A2CA009CDFF8 /* timeIsNow.mp3 in Resources */ = {isa = PBXBuildFile; fileRef = EB3643612D73A2CA009CDFF8 /* timeIsNow.mp3 */; }; EB6F62D72D91F4AF00534EC2 /* SettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = EB6F62D62D91F4AC00534EC2 /* SettingsView.swift */; }; - EB6F62DE2D932B4800534EC2 /* UserDefaultsKeys.swift in Sources */ = {isa = PBXBuildFile; fileRef = EB7CD1422D6FAEAF00CB0CB5 /* UserDefaultsKeys.swift */; }; - EB7CD1432D6FAEB400CB0CB5 /* UserDefaultsKeys.swift in Sources */ = {isa = PBXBuildFile; fileRef = EB7CD1422D6FAEAF00CB0CB5 /* UserDefaultsKeys.swift */; }; EB7CD1452D6FB0C300CB0CB5 /* Logger.swift in Sources */ = {isa = PBXBuildFile; fileRef = EB7CD1442D6FB0C100CB0CB5 /* Logger.swift */; }; EB7CD1462D6FB0E800CB0CB5 /* Logger.swift in Sources */ = {isa = PBXBuildFile; fileRef = EB7CD1442D6FB0C100CB0CB5 /* Logger.swift */; }; EB7CD1472D6FB0E800CB0CB5 /* Logger.swift in Sources */ = {isa = PBXBuildFile; fileRef = EB7CD1442D6FB0C100CB0CB5 /* Logger.swift */; }; @@ -196,10 +195,10 @@ E9C8C6D22CFF66650053474D /* ro */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ro; path = ro.lproj/ShareViewController.strings; sourceTree = ""; }; E9C8C6D32CFF66650053474D /* ro */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = ro; path = ro.lproj/Localizable.stringsdict; sourceTree = ""; }; E9C8C6D42CFF66650053474D /* ro */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ro; path = ro.lproj/Localizable.strings; sourceTree = ""; }; + EB2F9BFA2DA04B67004010A2 /* Helpers.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Helpers.swift; sourceTree = ""; }; EB36435F2D73A29F009CDFF8 /* AudioManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AudioManager.swift; sourceTree = ""; }; EB3643612D73A2CA009CDFF8 /* timeIsNow.mp3 */ = {isa = PBXFileReference; lastKnownFileType = audio.mp3; path = timeIsNow.mp3; sourceTree = ""; }; EB6F62D62D91F4AC00534EC2 /* SettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsView.swift; sourceTree = ""; }; - EB7CD1422D6FAEAF00CB0CB5 /* UserDefaultsKeys.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserDefaultsKeys.swift; sourceTree = ""; }; EB7CD1442D6FB0C100CB0CB5 /* Logger.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Logger.swift; sourceTree = ""; }; EB7F540F2D78E6DD00989564 /* Sidebar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Sidebar.swift; sourceTree = ""; }; EB7F54112D78E95C00989564 /* TutorialView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TutorialView.swift; sourceTree = ""; }; @@ -311,7 +310,6 @@ EB36435F2D73A29F009CDFF8 /* AudioManager.swift */, EB96ED8E2D7F8103004B3FF1 /* Localized.swift */, EB7F540F2D78E6DD00989564 /* Sidebar.swift */, - EB7CD1422D6FAEAF00CB0CB5 /* UserDefaultsKeys.swift */, EB7CD13B2D6F8B6500CB0CB5 /* IAP */, 69DA9A1329E0BF5200A442DA /* Assets.xcassets */, 69D2C33629E78DF400EC7E30 /* Localizable.stringsdict */, @@ -342,6 +340,7 @@ 69DA9A1E29E0C0B300A442DA /* NearbyConnectionManager.swift */, 69DA9A2229E17F0400A442DA /* InboundNearbyConnection.swift */, 691F53BD2ABF03820089FD92 /* OutboundNearbyConnection.swift */, + EB2F9BFA2DA04B67004010A2 /* Helpers.swift */, 698DFAE529E2F91A0064F247 /* NearbyConnection.swift */, 69DA9A2029E0CC4E00A442DA /* Data+Extensions.swift */, ); @@ -539,7 +538,6 @@ 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 */, EB6F62D72D91F4AF00534EC2 /* SettingsView.swift in Sources */, @@ -554,8 +552,8 @@ buildActionMask = 2147483647; files = ( 69DCF48D2AB70E8C00CBE2CC /* offline_wire_formats.pb.swift in Sources */, + EB2F9BFB2DA04B69004010A2 /* Helpers.swift in Sources */, 69DCF48F2AB70E8C00CBE2CC /* securemessage.pb.swift in Sources */, - EB6F62DE2D932B4800534EC2 /* UserDefaultsKeys.swift in Sources */, 69DCF4912AB70E9700CBE2CC /* NearbyConnection.swift in Sources */, 69DCF4922AB70E9700CBE2CC /* NearbyConnectionManager.swift in Sources */, 69DCF48E2AB70E8C00CBE2CC /* securegcm.pb.swift in Sources */,