Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
ac069c0
fix(l10n): Update translations from Transifex
nextcloud-bot Jun 3, 2026
6ad9fb0
Read owner and permissions from PUT response on new file creation (#4…
mpivchev Jun 3, 2026
1676533
NMC 2341 - Theming changes
TSI-shwetawaikar Jun 28, 2023
9de3ddf
NMC 2341 - NCTrashView changes
harshada-15-tsys Apr 14, 2025
ee98c7f
NMC 2341 - NCTrashView updated changes
harshada-15-tsys Sep 30, 2025
cc7d7cc
NMC 2341 - NCTrashView updated changes
harshada-15-tsys Dec 15, 2025
b7b32e6
NMC 2341 - NCTrashView updated changes with 10.3.0 version
harshada-15-tsys Apr 9, 2026
35f892d
NMC 2341 - Theming changes
TSI-shwetawaikar Jun 28, 2023
3762b1d
NMC 2341 - NCTrashView changes
harshada-15-tsys Apr 14, 2025
65ca235
NMC 2341 - NCTrashView updated changes
harshada-15-tsys Sep 30, 2025
38dfe83
NMC 2341 - NCTrashView updated changes
harshada-15-tsys Dec 15, 2025
cf8a0ad
NMC 2341 - NCTrashView updated changes with 10.3.0 version
harshada-15-tsys Apr 9, 2026
94638b6
hidden-fix (#4131)
marinofaggiana Jun 5, 2026
6bea96e
NMC 2341 - Theming changes
TSI-shwetawaikar Jun 28, 2023
b9fb6a4
NMC 2341 - NCTrashView changes
harshada-15-tsys Apr 14, 2025
7af0148
NMC 2341 - NCTrashView updated changes
harshada-15-tsys Sep 30, 2025
0e98755
NMC 2341 - NCTrashView updated changes
harshada-15-tsys Dec 15, 2025
bab381d
NMC 2341 - NCTrashView updated changes with 10.3.0 version
harshada-15-tsys Apr 9, 2026
ac5336a
NMC 2341 - Theming changes
TSI-shwetawaikar Jun 28, 2023
74a772b
NMC 2341 - NCTrashView changes
harshada-15-tsys Apr 14, 2025
aa696e9
NMC 2341 - NCTrashView updated changes
harshada-15-tsys Sep 30, 2025
7de79c5
NMC 2341 - NCTrashView updated changes
harshada-15-tsys Dec 15, 2025
53e8925
NMC 2341 - NCTrashView updated changes with 10.3.0 version
harshada-15-tsys Apr 9, 2026
ec6907e
Merge branch 'nmc/2341-Trash-view' of https://github.com/nextmcloud/i…
harshada-15-tsys Jun 5, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
52 changes: 39 additions & 13 deletions Brand/NCBrand.swift
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,43 @@ let userAgent: String = {
The codename embodies the concept of dynamic, living matter — reflecting our vision of a platform that is not only powerful and reliable, but also capable of continuous transformation and intelligent adaptation.
*/

struct NextcloudVersion: Comparable {
let major: Int
let minor: Int
let micro: Int

init(_ major: Int, _ minor: Int = 0, _ micro: Int = 0) {
self.major = major
self.minor = minor
self.micro = micro
}

init(_ capabilities: NKCapabilities.Capabilities) {
self.major = capabilities.serverVersionMajor
self.minor = capabilities.serverVersionMinor
self.micro = capabilities.serverVersionMicro
}

static let v18 = NextcloudVersion(18)
static let v20 = NextcloudVersion(20)
static let v23 = NextcloudVersion(23)
static let v24 = NextcloudVersion(24)
static let v25 = NextcloudVersion(25)
static let v26 = NextcloudVersion(26)
static let v27 = NextcloudVersion(27)
static let v28 = NextcloudVersion(28)
static let v30 = NextcloudVersion(30)
static let v31 = NextcloudVersion(31)
static let v32 = NextcloudVersion(32)
static let v32_0_2 = NextcloudVersion(32, 0, 2)
static let v33 = NextcloudVersion(33)
static let v34 = NextcloudVersion(34)

static func < (lhs: NextcloudVersion, rhs: NextcloudVersion) -> Bool {
(lhs.major, lhs.minor, lhs.micro) < (rhs.major, rhs.minor, rhs.micro)
}
}

final class NCBrandOptions: @unchecked Sendable {
static let shared = NCBrandOptions()

Expand Down Expand Up @@ -129,19 +166,8 @@ final class NCBrandOptions: @unchecked Sendable {
}

func isServerVersion(_ capabilities: NKCapabilities.Capabilities,
greaterOrEqualTo major: Int,
_ minor: Int,
_ micro: Int) -> Bool {

let server = (
capabilities.serverVersionMajor,
capabilities.serverVersionMinor,
capabilities.serverVersionMicro
)

let required = (major, minor, micro)

return server >= required
greaterOrEqualTo version: NextcloudVersion) -> Bool {
return NextcloudVersion(capabilities) >= version
}
}

Expand Down
24 changes: 17 additions & 7 deletions File Provider Extension/FileProviderData.swift
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ class FileProviderData: NSObject {
return isPaginated
} else if serverUrl == NCUtilityFileSystem().getHomeServer(session: session),
let capabilities = await NextcloudKit.shared.getCapabilitiesAsync(account: session.account).capabilities,
NCBrandOptions.shared.isServerVersion(capabilities, greaterOrEqualTo: 32, 0, 2) {
NCBrandOptions.shared.isServerVersion(capabilities, greaterOrEqualTo: .v32_0_2) {
isPaginated = true
return true
}
Expand Down Expand Up @@ -147,10 +147,7 @@ class FileProviderData: NSObject {

func downloadComplete(fileName: String,
serverUrl: String,
etag: String?,
date: Date?,
dateLastModified: Date?,
length: Int64,
allHeaderFields: [AnyHashable: Any]?,
task: URLSessionTask,
error: NKError) async {
let taskIdentifier = task.taskIdentifier
Expand All @@ -165,6 +162,7 @@ class FileProviderData: NSObject {
}

let ocId = metadata.ocId
let etag = NextcloudKit.shared.nkCommonInstance.findHeader("oc-etag", allHeaderFields: allHeaderFields)

await NCManageDatabase.shared.setMetadataSessionAsync(ocId: ocId,
session: "",
Expand Down Expand Up @@ -196,7 +194,8 @@ class FileProviderData: NSObject {
ocId: String?,
etag: String?,
date: Date?,
size: Int64,
ownerId: String?,
permissions: String?,
task: URLSessionTask,
error: NKError) async {
guard let metadata = await NCManageDatabase.shared.getMetadataAsync(predicate: NSPredicate(format: "serverUrl == %@ AND fileName == %@ AND sessionTaskIdentifier == %d", serverUrl, fileName, task.taskIdentifier)) else {
Expand Down Expand Up @@ -225,11 +224,22 @@ class FileProviderData: NSObject {
metadata.uploadDate = (date as? NSDate) ?? NSDate()
metadata.etag = etag ?? ""
metadata.ocId = ocId
metadata.size = size

if let fileId = fileProviderUtility().ocIdToFileId(ocId: ocId) {
metadata.fileId = fileId
}

if let ownerId, !ownerId.isEmpty {
metadata.ownerId = ownerId
if let ownerDisplayName = await NCManageDatabase.shared.getOwnerDisplayName(account: metadata.account, ownerId: ownerId) {
metadata.ownerDisplayName = ownerDisplayName
}
}

if let permissions, !permissions.isEmpty {
metadata.permissions = permissions
}

metadata.sceneIdentifier = nil
metadata.session = ""
metadata.sessionError = ""
Expand Down
16 changes: 15 additions & 1 deletion Nextcloud.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -441,6 +441,13 @@
F75DD765290ABB25002EB562 /* Intent.intentdefinition in Sources */ = {isa = PBXBuildFile; fileRef = F75DD769290ABB25002EB562 /* Intent.intentdefinition */; };
F75DD766290ABB25002EB562 /* Intent.intentdefinition in Sources */ = {isa = PBXBuildFile; fileRef = F75DD769290ABB25002EB562 /* Intent.intentdefinition */; };
F75DD767290ABB25002EB562 /* Intent.intentdefinition in Sources */ = {isa = PBXBuildFile; fileRef = F75DD769290ABB25002EB562 /* Intent.intentdefinition */; };
F75F4BC02FD008D7009E55ED /* Optional+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = F343A4BA2A1E734600DDA874 /* Optional+Extension.swift */; };
F75F4BC12FD008D7009E55ED /* Optional+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = F343A4BA2A1E734600DDA874 /* Optional+Extension.swift */; };
F75F4BC22FD008D7009E55ED /* Optional+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = F343A4BA2A1E734600DDA874 /* Optional+Extension.swift */; };
F75F4BC32FD008D7009E55ED /* Optional+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = F343A4BA2A1E734600DDA874 /* Optional+Extension.swift */; };
F75F4BC42FD008D7009E55ED /* Optional+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = F343A4BA2A1E734600DDA874 /* Optional+Extension.swift */; };
F75F4BC52FD008D7009E55ED /* Optional+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = F343A4BA2A1E734600DDA874 /* Optional+Extension.swift */; };
F75F4BC62FD008D7009E55ED /* Optional+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = F343A4BA2A1E734600DDA874 /* Optional+Extension.swift */; };
F760DE032AE66EA80027D78A /* KeychainAccess in Frameworks */ = {isa = PBXBuildFile; productRef = F760DE022AE66EA80027D78A /* KeychainAccess */; };
F760DE052AE66EBE0027D78A /* KeychainAccess in Frameworks */ = {isa = PBXBuildFile; productRef = F760DE042AE66EBE0027D78A /* KeychainAccess */; };
F760DE072AE66EC70027D78A /* KeychainAccess in Frameworks */ = {isa = PBXBuildFile; productRef = F760DE062AE66EC70027D78A /* KeychainAccess */; };
Expand Down Expand Up @@ -4163,6 +4170,7 @@
buildActionMask = 2147483647;
files = (
F73EF7BD2B0224AB0087E6E9 /* NCManageDatabase+ExternalSites.swift in Sources */,
F75F4BC62FD008D7009E55ED /* Optional+Extension.swift in Sources */,
F73EF7C52B02250B0087E6E9 /* NCManageDatabase+GPS.swift in Sources */,
2C1D5D7923E2DE9100334ABB /* NCBrand.swift in Sources */,
F770768A263A8A2500A1BA94 /* NCUtilityFileSystem.swift in Sources */,
Expand Down Expand Up @@ -4257,6 +4265,7 @@
buildActionMask = 2147483647;
files = (
F78E2D6A29AF02DB0024D4F3 /* Database.swift in Sources */,
F75F4BC52FD008D7009E55ED /* Optional+Extension.swift in Sources */,
F7490E6E29882B56009DCE94 /* NCBrand.swift in Sources */,
F7D61E942EBF1366007F865B /* UIColor+Extension.swift in Sources */,
F71F6D0C2B6A6A5E00F1EB15 /* ThreadSafeArray.swift in Sources */,
Expand Down Expand Up @@ -4327,6 +4336,7 @@
F77C973A2953143A00FDDD09 /* NCCameraRoll.swift in Sources */,
F740BEF02A35C2AD00E9B6D5 /* UILabel+Extension.swift in Sources */,
F7C30E01291BD2610017149B /* NCNetworkingE2EERename.swift in Sources */,
F75F4BC22FD008D7009E55ED /* Optional+Extension.swift in Sources */,
AF4BF61A27562A4B0081CEEF /* NCManageDatabase+Metadata.swift in Sources */,
AF4BF615275629E20081CEEF /* NCManageDatabase+Account.swift in Sources */,
F798F0E225880608000DAFFD /* UIColor+Extension.swift in Sources */,
Expand Down Expand Up @@ -4477,6 +4487,7 @@
F72EA95228B7BA2A00C88F0C /* DashboardWidgetProvider.swift in Sources */,
F77E8C242E79717D00EAE68F /* NCManageDatabase+LivePhoto.swift in Sources */,
F76340F72EBDE9760056F538 /* NCManageDatabaseCore.swift in Sources */,
F75F4BC02FD008D7009E55ED /* Optional+Extension.swift in Sources */,
F7D496FD2EBFA6D9004F9823 /* String+Extension.swift in Sources */,
F7D7A7702DCDD437003D2007 /* NCManageDatabase+AutoUpload.swift in Sources */,
F72EA95828B7BC4F00C88F0C /* FilesData.swift in Sources */,
Expand Down Expand Up @@ -4514,6 +4525,7 @@
F3E173C42C9B1067006D177A /* AwakeMode.swift in Sources */,
F7D61E932EBF1366007F865B /* UIColor+Extension.swift in Sources */,
F76340F42EBDE9760056F538 /* NCManageDatabaseCore.swift in Sources */,
F75F4BC42FD008D7009E55ED /* Optional+Extension.swift in Sources */,
F7CAFE212F17A37C00DB35A5 /* NCNetworking+Actor.swift in Sources */,
F76340EE2EBDE74C0056F538 /* NCManageDatabase.swift in Sources */,
F763410A2EBDFCB10056F538 /* NCManageDatabase+CreateMetadata.swift in Sources */,
Expand Down Expand Up @@ -4909,6 +4921,7 @@
F7C55C8E2FB5B03D004A974F /* NCGlobal.swift in Sources */,
F7C55CC92FB5CE74004A974F /* ActionViewController.swift in Sources */,
F7C55C9B2FB5B1A7004A974F /* UIColor+Extension.swift in Sources */,
F75F4BC32FD008D7009E55ED /* Optional+Extension.swift in Sources */,
F7C55C8D2FB5B02C004A974F /* NCAssistantSharedTextStore.swift in Sources */,
F7C55C9A2FB5B127004A974F /* ThreadSafeDictionary.swift in Sources */,
);
Expand Down Expand Up @@ -4965,6 +4978,7 @@
F71F6D092B6A6A5E00F1EB15 /* ThreadSafeArray.swift in Sources */,
F757CC8429E7F88B00F31428 /* NCManageDatabase+Groupfolders.swift in Sources */,
F78E2D6729AF02DB0024D4F3 /* Database.swift in Sources */,
F75F4BC12FD008D7009E55ED /* Optional+Extension.swift in Sources */,
F77DD6AA2C5CC093009448FB /* NCSession.swift in Sources */,
F7A8D73628F17E1A008BBE1C /* NCManageDatabase+Activity.swift in Sources */,
);
Expand Down Expand Up @@ -6346,7 +6360,7 @@
isa = XCRemoteSwiftPackageReference;
repositoryURL = "https://github.com/nextcloud/NextcloudKit";
requirement = {
branch = 7.3.2;
branch = main;
kind = branch;
};
};
Expand Down
17 changes: 16 additions & 1 deletion Share/NCShareExtension+Files.swift
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,22 @@ extension NCShareExtension {
func reloadData() async {
let session = NCShareExtensionData.shared.getSession()
let layoutForView = NCManageDatabase.shared.getLayoutForView(account: session.account, key: keyLayout, serverUrl: serverUrl)
let predicate = NSPredicate(format: "account == %@ AND serverUrl == %@ AND fileName != %@ AND directory == true", session.account, serverUrl, NextcloudKit.shared.nkCommonInstance.rootFileName)
let showHiddenFiles = NCPreferences().getShowHiddenFiles(account: session.account)
let predicate = showHiddenFiles
? NSPredicate(
format: "account == %@ AND serverUrl == %@ AND fileName != %@ AND directory == true",
session.account,
serverUrl,
NextcloudKit.shared.nkCommonInstance.rootFileName
)
: NSPredicate(
format: "account == %@ AND serverUrl == %@ AND fileName != %@ AND directory == true AND NOT fileName BEGINSWITH[c] %@",
session.account,
serverUrl,
NextcloudKit.shared.nkCommonInstance.rootFileName,
"."
)

let metadatas = await NCManageDatabase.shared.getMetadatasAsync(predicate: predicate,
withLayout: layoutForView,
withAccount: session.account)
Expand Down
2 changes: 1 addition & 1 deletion iOSClient/Assistant/NCAssistantModel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ class NCAssistantModel {
self.session = NCSession.shared.getSession(controller: controller)
let capabilities = NCNetworking.shared.capabilities[session.account] ?? NKCapabilities.Capabilities()

useV2 = capabilities.serverVersionMajor >= NCGlobal.shared.nextcloudVersion30
useV2 = NCBrandOptions.shared.isServerVersion(capabilities, greaterOrEqualTo: .v30)
loadAllTypes()
}

Expand Down
16 changes: 16 additions & 0 deletions iOSClient/Data/NCManageDatabase+Metadata.swift
Original file line number Diff line number Diff line change
Expand Up @@ -1028,6 +1028,22 @@ extension NCManageDatabase {
}
}

func getOwnerDisplayName(account: String?, ownerId: String?) async -> String? {
guard let account = account.isNotEmpty,
let ownerId = ownerId.isNotEmpty else {
return nil
}

return await core.performRealmReadAsync { realm in
let ownerDisplayName = realm.objects(tableMetadata.self)
.filter("account == %@ AND ownerId == %@", account, ownerId)
.first?
.ownerDisplayName

return ownerDisplayName.isNotEmpty
}
}

/// Asynchronously retrieves the metadata for a folder, based on its session and serverUrl.
/// Handles the home directory case rootFileName) and detaches the Realm object before returning.
func getMetadataFolderAsync(session: NCSession.Session, serverUrl: String) async -> tableMetadata? {
Expand Down
18 changes: 17 additions & 1 deletion iOSClient/Data/NCMetadataTranfersSuccess.swift
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,12 @@ actor NCMetadataTranfersSuccess {
delegates.removeAll { $0 as AnyObject === delegate as AnyObject }
}

func append(metadata: tableMetadata, ocId: String, date: Date?, etag: String?) async {
func append(metadata: tableMetadata,
ocId: String,
date: Date?,
etag: String?,
ownerId: String? = nil,
permissions: String? = nil) async {
let status = metadata.status

metadata.ocId = ocId
Expand All @@ -42,6 +47,17 @@ actor NCMetadataTranfersSuccess {
metadata.fileId = fileId
}

if let ownerId = ownerId.isNotEmpty {
metadata.ownerId = ownerId
if let ownerDisplayName = await NCManageDatabase.shared.getOwnerDisplayName(account: metadata.account, ownerId: ownerId) {
metadata.ownerDisplayName = ownerDisplayName
}
}

if let permissions = permissions.isNotEmpty {
metadata.permissions = permissions
}

metadata.session = ""
metadata.sessionError = ""
metadata.sessionTaskIdentifier = 0
Expand Down
7 changes: 7 additions & 0 deletions iOSClient/Extensions/Optional+Extension.swift
Original file line number Diff line number Diff line change
Expand Up @@ -28,4 +28,11 @@ extension Optional where Wrapped: Collection {
var isEmptyOrNil: Bool {
return self?.isEmpty ?? true
}

var isNotEmpty: Wrapped? {
guard let value = self, !value.isEmpty else {
return nil
}
return value
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ extension NCCollectionViewCommon: UICollectionViewDelegate {
await banner.dismissAsync()
}

if results.nkError == .success || results.afError?.isExplicitlyCancelledError ?? false {
if results.nkError == .success || results.nkError == .cancelled {
print("ok")
} else {
await showErrorBanner(windowScene: windowScene, text: results.nkError.errorDescription, errorCode: results.nkError.errorCode)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ extension NCCollectionViewCommon {
setSearchBarLoading(true)
networkSearchInProgress = true

if capabilities.serverVersionMajor >= global.nextcloudVersion20 {
if NCBrandOptions.shared.isServerVersion(capabilities, greaterOrEqualTo: .v20) {
await unifiedSearch(text: text)
} else {
await searchLiteral(text: text)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -172,7 +172,7 @@ class NCUploadAssetsModel: ObservableObject, NCCreateFormUploadConflictDelegate
self.uploadInProgress.toggle()
return
}
let autoMkcol = capabilities.serverVersionMajor >= NCGlobal.shared.nextcloudVersion33
let autoMkcol = NCBrandOptions.shared.isServerVersion(capabilities, greaterOrEqualTo: .v33)

func createProcessUploads() {
if !self.dismissView {
Expand Down
17 changes: 3 additions & 14 deletions iOSClient/Media/NCMedia+Netwoking.swift
Original file line number Diff line number Diff line change
Expand Up @@ -18,23 +18,12 @@ extension NCMedia {
guard let nkSession = NextcloudKit.shared.nkCommonInstance.nksessions.session(forAccount: account) else {
return (account, nil, .urlError)
}
let capabilities = await NKCapabilities.shared.getCapabilities(for: account)
let files: [NKFile] = []
let href = "/files/" + nkSession.userId + path

let elementDate: String
var lessDateString: String
var greaterDateString: String

if capabilities.serverVersionMajor >= self.global.nextcloudVersionFuture {
elementDate = "nc:metadata-photos-original_date_time"
lessDateString = String(lessDate.timeIntervalSince1970)
greaterDateString = String(greaterDate.timeIntervalSince1970)
} else {
elementDate = "d:getlastmodified"
lessDateString = lessDate.formatted(using: "yyyy-MM-dd'T'HH:mm:ssZZZZZ")
greaterDateString = greaterDate.formatted(using: "yyyy-MM-dd'T'HH:mm:ssZZZZZ")
}
let elementDate = "d:getlastmodified"
let lessDateString = lessDate.formatted(using: "yyyy-MM-dd'T'HH:mm:ssZZZZZ")
let greaterDateString = greaterDate.formatted(using: "yyyy-MM-dd'T'HH:mm:ssZZZZZ")

let httpBodyString = String(format: getRequestBodySearchMedia(
createProperties: options.createProperties,
Expand Down
Loading
Loading