From 0bf321dea1785e2810d0565e013421aa580d930c Mon Sep 17 00:00:00 2001 From: Claudio Cambra Date: Tue, 18 Mar 2025 11:34:07 +0100 Subject: [PATCH 1/6] shell_integration/macOS/FileProviderUIExt: Add eviction procedure Signed-off-by: Claudio Cambra --- .../FileProviderUIExt/Evicting/Eviction.swift | 26 +++++++++++++++++++ .../project.pbxproj | 12 +++++++++ 2 files changed, 38 insertions(+) create mode 100644 shell_integration/MacOSX/NextcloudIntegration/FileProviderUIExt/Evicting/Eviction.swift diff --git a/shell_integration/MacOSX/NextcloudIntegration/FileProviderUIExt/Evicting/Eviction.swift b/shell_integration/MacOSX/NextcloudIntegration/FileProviderUIExt/Evicting/Eviction.swift new file mode 100644 index 0000000000..a3d6b72f19 --- /dev/null +++ b/shell_integration/MacOSX/NextcloudIntegration/FileProviderUIExt/Evicting/Eviction.swift @@ -0,0 +1,26 @@ +// +// Eviction.swift +// FileProviderUIExt +// +// Created by Claudio Cambra on 18/3/25. +// + +import FileProvider +import Foundation + +func evict( + itemsWithIdentifiers identifiers: [NSFileProviderItemIdentifier], + inDomain domain: NSFileProviderDomain +) async { + guard let manager = NSFileProviderManager(for: domain) else { + return; + } + do { + for itemIdentifier in identifiers { + try await manager.evictItem(identifier: itemIdentifier) + } + } catch let error { + + } +} + diff --git a/shell_integration/MacOSX/NextcloudIntegration/NextcloudIntegration.xcodeproj/project.pbxproj b/shell_integration/MacOSX/NextcloudIntegration/NextcloudIntegration.xcodeproj/project.pbxproj index f41132680d..f1646f37eb 100644 --- a/shell_integration/MacOSX/NextcloudIntegration/NextcloudIntegration.xcodeproj/project.pbxproj +++ b/shell_integration/MacOSX/NextcloudIntegration/NextcloudIntegration.xcodeproj/project.pbxproj @@ -10,6 +10,7 @@ 5307A6E62965C6FA001E0C6A /* NextcloudKit in Frameworks */ = {isa = PBXBuildFile; productRef = 5307A6E52965C6FA001E0C6A /* NextcloudKit */; }; 5307A6E82965DAD8001E0C6A /* NextcloudKit in Frameworks */ = {isa = PBXBuildFile; productRef = 5307A6E72965DAD8001E0C6A /* NextcloudKit */; }; 531522822B8E01C6002E31BE /* ShareTableItemView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 531522812B8E01C6002E31BE /* ShareTableItemView.xib */; }; + 531EDE572D897B4F00FD91F9 /* Eviction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 531EDE562D897B4F00FD91F9 /* Eviction.swift */; }; 532572082C4690340068DEC3 /* FileProviderExtension+EnumerationListener.swift in Sources */ = {isa = PBXBuildFile; fileRef = 532572072C4690340068DEC3 /* FileProviderExtension+EnumerationListener.swift */; }; 5350E4E92B0C534A00F276CB /* ClientCommunicationService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5350E4E82B0C534A00F276CB /* ClientCommunicationService.swift */; }; 5352B36C29DC44B50011CE03 /* FileProviderExtension+Thumbnailing.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5352B36B29DC44B50011CE03 /* FileProviderExtension+Thumbnailing.swift */; }; @@ -153,6 +154,7 @@ /* Begin PBXFileReference section */ 531522812B8E01C6002E31BE /* ShareTableItemView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = ShareTableItemView.xib; sourceTree = ""; }; + 531EDE562D897B4F00FD91F9 /* Eviction.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Eviction.swift; sourceTree = ""; }; 532572072C4690340068DEC3 /* FileProviderExtension+EnumerationListener.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "FileProviderExtension+EnumerationListener.swift"; sourceTree = ""; }; 5350E4E72B0C514400F276CB /* ClientCommunicationProtocol.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ClientCommunicationProtocol.h; sourceTree = ""; }; 5350E4E82B0C534A00F276CB /* ClientCommunicationService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ClientCommunicationService.swift; sourceTree = ""; }; @@ -260,6 +262,14 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 531EDE542D88569400FD91F9 /* Evicting */ = { + isa = PBXGroup; + children = ( + 531EDE562D897B4F00FD91F9 /* Eviction.swift */, + ); + path = Evicting; + sourceTree = ""; + }; 5350E4C72B0C368B00F276CB /* Services */ = { isa = PBXGroup; children = ( @@ -353,6 +363,7 @@ 53B9797F2B84C81F002DA742 /* FileProviderUIExt */ = { isa = PBXGroup; children = ( + 531EDE542D88569400FD91F9 /* Evicting */, 5376307B2B85E2E00026BFAB /* Extensions */, 537BD6782C58D0FC00446ED0 /* Locking */, 537BD6772C58D0C400446ED0 /* Sharing */, @@ -721,6 +732,7 @@ buildActionMask = 2147483647; files = ( 537BD6822C58F72E00446ED0 /* MetadataProvider.swift in Sources */, + 531EDE572D897B4F00FD91F9 /* Eviction.swift in Sources */, 537630932B85F4B00026BFAB /* ShareViewController.swift in Sources */, 53FE14672B8F78B6006C4193 /* ShareOptionsView.swift in Sources */, 53651E462BBC0D9500ECAC29 /* ShareeSuggestionsDataSource.swift in Sources */, From 8466170816fd9e137dc731e26d5a06a595c5e819 Mon Sep 17 00:00:00 2001 From: Claudio Cambra Date: Tue, 18 Mar 2025 11:34:25 +0100 Subject: [PATCH 2/6] shell_integration/macOS/FileProviderUIExt: Add non-async eviction Signed-off-by: Claudio Cambra --- .../FileProviderUIExt/Evicting/Eviction.swift | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/shell_integration/MacOSX/NextcloudIntegration/FileProviderUIExt/Evicting/Eviction.swift b/shell_integration/MacOSX/NextcloudIntegration/FileProviderUIExt/Evicting/Eviction.swift index a3d6b72f19..4742690d74 100644 --- a/shell_integration/MacOSX/NextcloudIntegration/FileProviderUIExt/Evicting/Eviction.swift +++ b/shell_integration/MacOSX/NextcloudIntegration/FileProviderUIExt/Evicting/Eviction.swift @@ -24,3 +24,14 @@ func evict( } } +func evict( + itemsWithIdentifiers identifiers: [NSFileProviderItemIdentifier], + inDomain domain: NSFileProviderDomain +) { + let semaphore = DispatchSemaphore(value: 0) + Task { + await evict(itemsWithIdentifiers: identifiers, inDomain: domain) + semaphore.signal() + } + semaphore.wait() +} From 83a4781ba99e25a878a56a04ea7a15085703ff36 Mon Sep 17 00:00:00 2001 From: Claudio Cambra Date: Tue, 18 Mar 2025 11:34:53 +0100 Subject: [PATCH 3/6] shell_integration/macOS/FileProviderUIExt: Add "free up space" action to context menu Signed-off-by: Claudio Cambra --- .../FileProviderUIExt/DocumentActionViewController.swift | 2 ++ .../NextcloudIntegration/FileProviderUIExt/Info.plist | 8 ++++++++ 2 files changed, 10 insertions(+) diff --git a/shell_integration/MacOSX/NextcloudIntegration/FileProviderUIExt/DocumentActionViewController.swift b/shell_integration/MacOSX/NextcloudIntegration/FileProviderUIExt/DocumentActionViewController.swift index dfff3bf34a..c96703dd26 100644 --- a/shell_integration/MacOSX/NextcloudIntegration/FileProviderUIExt/DocumentActionViewController.swift +++ b/shell_integration/MacOSX/NextcloudIntegration/FileProviderUIExt/DocumentActionViewController.swift @@ -43,6 +43,8 @@ class DocumentActionViewController: FPUIActionExtensionViewController { prepare(childViewController: LockViewController(itemIdentifiers, locking: true)) case "com.nextcloud.desktopclient.FileProviderUIExt.UnlockFileAction": prepare(childViewController: LockViewController(itemIdentifiers, locking: false)) + case "com.nextcloud.desktopclient.FileProviderUIExt.EvictAction": + evict(itemsWithIdentifiers: itemIdentifiers, inDomain: domain); default: return } diff --git a/shell_integration/MacOSX/NextcloudIntegration/FileProviderUIExt/Info.plist b/shell_integration/MacOSX/NextcloudIntegration/FileProviderUIExt/Info.plist index 31930b7627..14c4123d53 100644 --- a/shell_integration/MacOSX/NextcloudIntegration/FileProviderUIExt/Info.plist +++ b/shell_integration/MacOSX/NextcloudIntegration/FileProviderUIExt/Info.plist @@ -36,6 +36,14 @@ NSExtensionFileProviderActionName Share options + + NSExtensionFileProviderActionActivationRule + SUBQUERY ( fileproviderItems, $fileproviderItem, $fileproviderItem.downloaded ).@count > 0 + NSExtensionFileProviderActionIdentifier + com.nextcloud.desktopclient.FileProviderUIExt.EvictAction + NSExtensionFileProviderActionName + Free up space + NSExtensionPointIdentifier com.apple.fileprovider-actionsui From 0da4edefc5b3cc35f505b182ed629435ce0dfbe0 Mon Sep 17 00:00:00 2001 From: Claudio Cambra Date: Tue, 25 Mar 2025 10:30:55 +0100 Subject: [PATCH 4/6] shell_integration/macOS/FileProviderUIExt: Auto dismiss vc when evicting item Signed-off-by: Claudio Cambra --- .../FileProviderUIExt/DocumentActionViewController.swift | 1 + 1 file changed, 1 insertion(+) diff --git a/shell_integration/MacOSX/NextcloudIntegration/FileProviderUIExt/DocumentActionViewController.swift b/shell_integration/MacOSX/NextcloudIntegration/FileProviderUIExt/DocumentActionViewController.swift index c96703dd26..4301fc3420 100644 --- a/shell_integration/MacOSX/NextcloudIntegration/FileProviderUIExt/DocumentActionViewController.swift +++ b/shell_integration/MacOSX/NextcloudIntegration/FileProviderUIExt/DocumentActionViewController.swift @@ -45,6 +45,7 @@ class DocumentActionViewController: FPUIActionExtensionViewController { prepare(childViewController: LockViewController(itemIdentifiers, locking: false)) case "com.nextcloud.desktopclient.FileProviderUIExt.EvictAction": evict(itemsWithIdentifiers: itemIdentifiers, inDomain: domain); + dismiss(self); default: return } From 66ea9276adcc9fc0a188423568dbf3ea6124a2a2 Mon Sep 17 00:00:00 2001 From: Claudio Cambra Date: Tue, 25 Mar 2025 10:32:14 +0100 Subject: [PATCH 5/6] shell_integration/macOS/FileProviderUIExt: Log eviction process Signed-off-by: Claudio Cambra --- .../FileProviderUIExt/Evicting/Eviction.swift | 12 +++++++++++- .../Extensions/Logger+Extensions.swift | 1 + 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/shell_integration/MacOSX/NextcloudIntegration/FileProviderUIExt/Evicting/Eviction.swift b/shell_integration/MacOSX/NextcloudIntegration/FileProviderUIExt/Evicting/Eviction.swift index 4742690d74..7c0396bf4a 100644 --- a/shell_integration/MacOSX/NextcloudIntegration/FileProviderUIExt/Evicting/Eviction.swift +++ b/shell_integration/MacOSX/NextcloudIntegration/FileProviderUIExt/Evicting/Eviction.swift @@ -7,20 +7,30 @@ import FileProvider import Foundation +import OSLog func evict( itemsWithIdentifiers identifiers: [NSFileProviderItemIdentifier], inDomain domain: NSFileProviderDomain ) async { + Logger.eviction.debug("Starting eviction process…") guard let manager = NSFileProviderManager(for: domain) else { + Logger.eviction.error( + "Could not get manager for domain: \(domain.identifier.rawValue, privacy: .public)" + ) return; } do { for itemIdentifier in identifiers { + Logger.eviction.error( + "Evicting item: \(itemIdentifier.rawValue, privacy: .public)" + ) try await manager.evictItem(identifier: itemIdentifier) } } catch let error { - + Logger.eviction.error( + "Error evicting item: \(error.localizedDescription, privacy: .public)" + ) } } diff --git a/shell_integration/MacOSX/NextcloudIntegration/FileProviderUIExt/Extensions/Logger+Extensions.swift b/shell_integration/MacOSX/NextcloudIntegration/FileProviderUIExt/Extensions/Logger+Extensions.swift index d2e38c3cc0..2b95ee5e5b 100644 --- a/shell_integration/MacOSX/NextcloudIntegration/FileProviderUIExt/Extensions/Logger+Extensions.swift +++ b/shell_integration/MacOSX/NextcloudIntegration/FileProviderUIExt/Extensions/Logger+Extensions.swift @@ -11,6 +11,7 @@ extension Logger { private static var subsystem = Bundle.main.bundleIdentifier! static let actionViewController = Logger(subsystem: subsystem, category: "actionViewController") + static let eviction = Logger(subsystem: subsystem, category: "eviction") static let lockViewController = Logger(subsystem: subsystem, category: "lockViewController") static let metadataProvider = Logger(subsystem: subsystem, category: "metadataProvider") static let shareCapabilities = Logger(subsystem: subsystem, category: "shareCapabilities") From fb64a59f4ab16715772f0f3a453ddee375651809 Mon Sep 17 00:00:00 2001 From: Claudio Cambra Date: Tue, 25 Mar 2025 11:46:44 +0100 Subject: [PATCH 6/6] shell_integration/macOS/FileProviderUIExt: Use more reliable new userInfo entry for downloaded state Signed-off-by: Claudio Cambra --- .../MacOSX/NextcloudIntegration/FileProviderUIExt/Info.plist | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shell_integration/MacOSX/NextcloudIntegration/FileProviderUIExt/Info.plist b/shell_integration/MacOSX/NextcloudIntegration/FileProviderUIExt/Info.plist index 14c4123d53..b314406889 100644 --- a/shell_integration/MacOSX/NextcloudIntegration/FileProviderUIExt/Info.plist +++ b/shell_integration/MacOSX/NextcloudIntegration/FileProviderUIExt/Info.plist @@ -38,7 +38,7 @@ NSExtensionFileProviderActionActivationRule - SUBQUERY ( fileproviderItems, $fileproviderItem, $fileproviderItem.downloaded ).@count > 0 + SUBQUERY ( fileproviderItems, $fileproviderItem, $fileproviderItem.userInfo.downloaded == true ).@count > 0 NSExtensionFileProviderActionIdentifier com.nextcloud.desktopclient.FileProviderUIExt.EvictAction NSExtensionFileProviderActionName