Merge pull request #8073 from nextcloud/feature/free-space-up-finder-vfs

shell_integration/macOS/FileProviderUIExt: Add "free up space" menu entry
This commit is contained in:
Claudio Cambra 2025-03-25 15:28:58 +01:00 committed by GitHub
commit d2a49ec2a1
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 71 additions and 0 deletions

View File

@ -43,6 +43,9 @@ 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);
dismiss(self);
default:
return
}

View File

@ -0,0 +1,47 @@
//
// Eviction.swift
// FileProviderUIExt
//
// Created by Claudio Cambra on 18/3/25.
//
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)"
)
}
}
func evict(
itemsWithIdentifiers identifiers: [NSFileProviderItemIdentifier],
inDomain domain: NSFileProviderDomain
) {
let semaphore = DispatchSemaphore(value: 0)
Task {
await evict(itemsWithIdentifiers: identifiers, inDomain: domain)
semaphore.signal()
}
semaphore.wait()
}

View File

@ -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")

View File

@ -36,6 +36,14 @@
<key>NSExtensionFileProviderActionName</key>
<string>Share options</string>
</dict>
<dict>
<key>NSExtensionFileProviderActionActivationRule</key>
<string>SUBQUERY ( fileproviderItems, $fileproviderItem, $fileproviderItem.userInfo.downloaded == true ).@count &gt; 0</string>
<key>NSExtensionFileProviderActionIdentifier</key>
<string>com.nextcloud.desktopclient.FileProviderUIExt.EvictAction</string>
<key>NSExtensionFileProviderActionName</key>
<string>Free up space</string>
</dict>
</array>
<key>NSExtensionPointIdentifier</key>
<string>com.apple.fileprovider-actionsui</string>

View File

@ -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 = "<group>"; };
531EDE562D897B4F00FD91F9 /* Eviction.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Eviction.swift; sourceTree = "<group>"; };
532572072C4690340068DEC3 /* FileProviderExtension+EnumerationListener.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "FileProviderExtension+EnumerationListener.swift"; sourceTree = "<group>"; };
5350E4E72B0C514400F276CB /* ClientCommunicationProtocol.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ClientCommunicationProtocol.h; sourceTree = "<group>"; };
5350E4E82B0C534A00F276CB /* ClientCommunicationService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ClientCommunicationService.swift; sourceTree = "<group>"; };
@ -260,6 +262,14 @@
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
531EDE542D88569400FD91F9 /* Evicting */ = {
isa = PBXGroup;
children = (
531EDE562D897B4F00FD91F9 /* Eviction.swift */,
);
path = Evicting;
sourceTree = "<group>";
};
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 */,