Skip to content

Commit

Permalink
3094 offline crud copy move favorite (#3098)
Browse files Browse the repository at this point in the history
* favorite

Signed-off-by: Marino Faggiana <marino@marinofaggiana.com>

* fix

Signed-off-by: Marino Faggiana <marino@marinofaggiana.com>

* cleaning

Signed-off-by: Marino Faggiana <marino@marinofaggiana.com>

* cleaning

Signed-off-by: Marino Faggiana <marino@marinofaggiana.com>

---------

Signed-off-by: Marino Faggiana <marino@marinofaggiana.com>
  • Loading branch information
marinofaggiana authored Oct 8, 2024
1 parent 0ed7ccd commit ee3e51c
Show file tree
Hide file tree
Showing 8 changed files with 71 additions and 50 deletions.
13 changes: 13 additions & 0 deletions iOSClient/Data/NCManageDatabase+Metadata.swift
Original file line number Diff line number Diff line change
Expand Up @@ -845,6 +845,19 @@ extension NCManageDatabase {
}
}

func setMetadataFavorite(ocId: String, favorite: Bool, status: Int) {
do {
let realm = try Realm()
try realm.write {
let result = realm.objects(tableMetadata.self).filter("ocId == %@", ocId).first
result?.favorite = favorite
result?.status = status
}
} catch let error {
NextcloudKit.shared.nkCommonInstance.writeLog("[ERROR] Could not write to database: \(error)")
}
}

// MARK: - GetMetadata

func getMetadata(predicate: NSPredicate) -> tableMetadata? {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -277,16 +277,17 @@ class NCCollectionViewDataSource: NSObject {
for metadata in metadatas {
let indexPath = IndexPath(row: counter, section: 0)
if indexPath.row < dataSourceMetadatas.count {
let etag = dataSourceMetadatas[indexPath.row].etag
if etag != metadata.etag {
if !metadata.isEqual(dataSourceMetadatas[indexPath.row]) {
updated = true
}
} else {
updated = true
}

self.metadataIndexPath[indexPath] = tableMetadata(value: metadata)

/// caching preview
///
if metadata.isImageOrVideo,
NCImageCache.shared.getImageCache(ocId: metadata.ocId, etag: metadata.etag, ext: self.global.previewExt256) == nil,
let image = self.utility.getImage(ocId: metadata.ocId, etag: metadata.etag, ext: self.global.previewExt256) {
Expand Down
3 changes: 1 addition & 2 deletions iOSClient/Menu/NCCollectionViewCommon+Menu.swift
Original file line number Diff line number Diff line change
Expand Up @@ -200,8 +200,7 @@ extension NCCollectionViewCommon {
// FAVORITE
// FIXME: PROPPATCH doesn't work
// https://github.com/nextcloud/files_lock/issues/68
if NCNetworking.shared.isOnline,
!metadata.lock {
if !metadata.lock {
actions.append(
NCMenuAction(
title: metadata.favorite ? NSLocalizedString("_remove_favorites_", comment: "") : NSLocalizedString("_add_favorites_", comment: ""),
Expand Down
3 changes: 1 addition & 2 deletions iOSClient/Menu/NCViewer+Menu.swift
Original file line number Diff line number Diff line change
Expand Up @@ -67,8 +67,7 @@ extension NCViewer {
// FAVORITE
// Workaround: PROPPATCH doesn't work
// https://github.com/nextcloud/files_lock/issues/68
if NCNetworking.shared.isOnline,
!metadata.lock {
if !metadata.lock {
actions.append(
NCMenuAction(
title: metadata.favorite ? NSLocalizedString("_remove_favorites_", comment: "") : NSLocalizedString("_add_favorites_", comment: ""),
Expand Down
1 change: 1 addition & 0 deletions iOSClient/NCGlobal.swift
Original file line number Diff line number Diff line change
Expand Up @@ -273,6 +273,7 @@ class NCGlobal: NSObject {
let metadataStatusWaitCreateFolder: Int = 10
let metadataStatusWaitDelete: Int = 11
let metadataStatusWaitRename: Int = 12
let metadataStatusWaitFavorite: Int = 13

let metadataStatusInTransfer = [-1, -2, 1, 2]
let metadataStatusFileDown = [-1, -2, -3]
Expand Down
8 changes: 8 additions & 0 deletions iOSClient/Networking/NCNetworking+AsyncAwait.swift
Original file line number Diff line number Diff line change
Expand Up @@ -139,6 +139,14 @@ extension NCNetworking {
})
}

func setFavorite(fileName: String, favorite: Bool, account: String) async -> NKError {
await withUnsafeContinuation({ continuation in
NextcloudKit.shared.setFavorite(fileName: fileName, favorite: favorite, account: account) { _, error in
continuation.resume(returning: error)
}
})
}

func readFileOrFolder(serverUrlFileName: String,
depth: String,
showHiddenFiles: Bool = true,
Expand Down
29 changes: 2 additions & 27 deletions iOSClient/Networking/NCNetworking+WebDAV.swift
Original file line number Diff line number Diff line change
Expand Up @@ -538,34 +538,9 @@ extension NCNetworking {

func favoriteMetadata(_ metadata: tableMetadata,
completion: @escaping (_ error: NKError) -> Void) {
if let metadataLive = self.database.getMetadataLivePhoto(metadata: metadata) {
favoriteMetadataPlain(metadataLive) { error in
if error == .success {
self.favoriteMetadataPlain(metadata, completion: completion)
} else {
completion(error)
}
}
} else {
favoriteMetadataPlain(metadata, completion: completion)
}
}
self.database.setMetadataFavorite(ocId: metadata.ocId, favorite: !metadata.favorite, status: global.metadataStatusWaitFavorite)

private func favoriteMetadataPlain(_ metadata: tableMetadata,
completion: @escaping (_ error: NKError) -> Void) {
let session = NCSession.Session(account: metadata.account, urlBase: metadata.urlBase, user: metadata.user, userId: metadata.userId)
let fileName = utilityFileSystem.getFileNamePath(metadata.fileName, serverUrl: metadata.serverUrl, session: session)
let favorite = !metadata.favorite
let ocId = metadata.ocId

NextcloudKit.shared.setFavorite(fileName: fileName, favorite: favorite, account: metadata.account) { _, error in
if error == .success {
metadata.favorite = favorite
self.database.addMetadata(metadata)
NotificationCenter.default.postOnMainThread(name: self.global.notificationCenterFavoriteFile, userInfo: ["ocId": ocId, "serverUrl": metadata.serverUrl])
}
completion(error)
}
NotificationCenter.default.postOnMainThread(name: self.global.notificationCenterFavoriteFile, userInfo: ["ocId": metadata.ocId, "serverUrl": metadata.serverUrl])
}

// MARK: - Lock Files
Expand Down
59 changes: 42 additions & 17 deletions iOSClient/Networking/NCNetworkingProcess.swift
Original file line number Diff line number Diff line change
Expand Up @@ -31,10 +31,11 @@ class NCNetworkingProcess {

private let utilityFileSystem = NCUtilityFileSystem()
private let database = NCManageDatabase.shared
private let global = NCGlobal.shared
private let networking = NCNetworking.shared
private var notificationToken: NotificationToken?
private var hasRun: Bool = false
private let lockQueue = DispatchQueue(label: "com.nextcloud.networkingprocess.lockqueue")
private let global = NCGlobal.shared
private var timerProcess: Timer?

private init() {
Expand All @@ -55,7 +56,7 @@ class NCNetworkingProcess {
guard let self else { return }

self.lockQueue.sync {
guard !self.hasRun, NCNetworking.shared.isOnline else { return }
guard !self.hasRun, self.networking.isOnline else { return }
self.hasRun = true

Task { [weak self] in
Expand All @@ -79,13 +80,13 @@ class NCNetworkingProcess {
self.timerProcess = Timer.scheduledTimer(withTimeInterval: 3, repeats: true, block: { _ in

self.lockQueue.sync {
guard !self.hasRun, NCNetworking.shared.isOnline else { return }
guard !self.hasRun, self.networking.isOnline else { return }
self.hasRun = true

/// Keep screen awake
///
Task {
let tasks = await NCNetworking.shared.getAllDataTask()
let tasks = await self.networking.getAllDataTask()
let hasSynchronizationTask = tasks.contains { $0.taskDescription == NCGlobal.shared.taskDescriptionSynchronization }
let resultsTransfer = self.database.getResultsMetadatas(predicate: NSPredicate(format: "status IN %@", self.global.metadataStatusInTransfer))

Expand Down Expand Up @@ -138,16 +139,40 @@ class NCNetworkingProcess {
let metadatasDownloading = self.database.getMetadatas(predicate: NSPredicate(format: "status == %d", global.metadataStatusDownloading))
let metadatasUploading = self.database.getMetadatas(predicate: NSPredicate(format: "status == %d", global.metadataStatusUploading))
let metadatasUploadError: [tableMetadata] = self.database.getMetadatas(predicate: NSPredicate(format: "status == %d", global.metadataStatusUploadError), sortedByKeyPath: "sessionDate", ascending: true) ?? []
let isWiFi = NCNetworking.shared.networkReachability == NKCommon.TypeReachability.reachableEthernetOrWiFi
let isWiFi = networking.networkReachability == NKCommon.TypeReachability.reachableEthernetOrWiFi
var counterDownloading = metadatasDownloading.count
var counterUploading = metadatasUploading.count

/// ------------------------ FAVORITE
///
if let metadatasWaitFavorite = self.database.getMetadatas(predicate: NSPredicate(format: "status == %d", global.metadataStatusWaitFavorite), sortedByKeyPath: "serverUrl", ascending: true), !metadatasWaitFavorite.isEmpty {
for metadata in metadatasWaitFavorite {
let session = NCSession.Session(account: metadata.account, urlBase: metadata.urlBase, user: metadata.user, userId: metadata.userId)
let fileName = utilityFileSystem.getFileNamePath(metadata.fileName, serverUrl: metadata.serverUrl, session: session)
let error = await networking.setFavorite(fileName: fileName, favorite: metadata.favorite, account: metadata.account)
if error == .success {
database.setMetadataStatus(ocId: metadata.ocId, status: global.metadataStatusNormal)
} else {
let serverUrlFileName = metadata.serverUrl + "/" + metadata.fileName
let results = await NCNetworking.shared.readFileOrFolder(serverUrlFileName: serverUrlFileName, depth: "0", showHiddenFiles: true, account: metadata.account)
if results.error == .success, let file = results.files?.first {
database.setMetadataFavorite(ocId: file.ocId, favorite: file.favorite, status: global.metadataStatusNormal)
NotificationCenter.default.postOnMainThread(name: self.global.notificationCenterFavoriteFile, userInfo: ["ocId": metadata.ocId, "serverUrl": metadata.serverUrl])
} else {
NotificationCenter.default.postOnMainThread(name: self.global.notificationCenterGetServerData, userInfo: ["serverUrl": metadata.serverUrl])
}
}
}

return (counterDownloading, counterUploading, metadatasWaitFavorite.count)
}

/// ------------------------ DELETE
///
if let metadatasWaitDelete = self.database.getMetadatas(predicate: NSPredicate(format: "status == %d", global.metadataStatusWaitDelete), sortedByKeyPath: "serverUrl", ascending: true), !metadatasWaitDelete.isEmpty {
for metadata in metadatasWaitDelete {
if NCNetworking.shared.deleteFileOrFolderQueue.operations.filter({ ($0 as? NCOperationDeleteFileOrFolder)?.ocId == metadata.ocId }).isEmpty {
NCNetworking.shared.deleteFileOrFolderQueue.addOperation(NCOperationDeleteFileOrFolder(metadata: metadata))
if networking.deleteFileOrFolderQueue.operations.filter({ ($0 as? NCOperationDeleteFileOrFolder)?.ocId == metadata.ocId }).isEmpty {
networking.deleteFileOrFolderQueue.addOperation(NCOperationDeleteFileOrFolder(metadata: metadata))
}
}
return (counterDownloading, counterUploading, metadatasWaitDelete.count)
Expand All @@ -157,7 +182,7 @@ class NCNetworkingProcess {
///
if let metadatasWaitCreateFolder = self.database.getMetadatas(predicate: NSPredicate(format: "status == %d", global.metadataStatusWaitCreateFolder), sortedByKeyPath: "serverUrl", ascending: true), !metadatasWaitCreateFolder.isEmpty {
for metadata in metadatasWaitCreateFolder {
let error = await NCNetworking.shared.createFolder(metadata: metadata)
let error = await networking.createFolder(metadata: metadata)
if error != .success {
if metadata.sessionError.isEmpty {
let serverUrlFileName = metadata.serverUrl + "/" + metadata.fileName
Expand All @@ -175,7 +200,7 @@ class NCNetworkingProcess {
for metadata in metadatasWaitRename {
let serverUrlFileNameSource = metadata.serveUrlFileName
let serverUrlFileNameDestination = metadata.serverUrl + "/" + metadata.fileName
let result = await NCNetworking.shared.moveFileOrFolder(serverUrlFileNameSource: serverUrlFileNameSource, serverUrlFileNameDestination: serverUrlFileNameDestination, overwrite: false, account: metadata.account)
let result = await networking.moveFileOrFolder(serverUrlFileNameSource: serverUrlFileNameSource, serverUrlFileNameDestination: serverUrlFileNameDestination, overwrite: false, account: metadata.account)
if result.error == .success {
database.setMetadataServeUrlFileNameStatusNormal(ocId: metadata.ocId)
} else {
Expand All @@ -189,13 +214,13 @@ class NCNetworkingProcess {
/// ------------------------ DOWNLOAD
///
let limitDownload = maxConcurrentOperationDownload - counterDownloading
let metadatasWaitDownload = self.database.getMetadatas(predicate: NSPredicate(format: "session == %@ AND status == %d", NCNetworking.shared.sessionDownloadBackground, global.metadataStatusWaitDownload), numItems: limitDownload, sorted: "sessionDate", ascending: true)
let metadatasWaitDownload = self.database.getMetadatas(predicate: NSPredicate(format: "session == %@ AND status == %d", networking.sessionDownloadBackground, global.metadataStatusWaitDownload), numItems: limitDownload, sorted: "sessionDate", ascending: true)
for metadata in metadatasWaitDownload where counterDownloading < maxConcurrentOperationDownload {
counterDownloading += 1
NCNetworking.shared.download(metadata: metadata, withNotificationProgressTask: true)
networking.download(metadata: metadata, withNotificationProgressTask: true)
}
if counterDownloading == 0 {
let metadatasDownloadError: [tableMetadata] = self.database.getMetadatas(predicate: NSPredicate(format: "session == %@ AND status == %d", NCNetworking.shared.sessionDownloadBackground, global.metadataStatusDownloadError), sortedByKeyPath: "sessionDate", ascending: true) ?? []
let metadatasDownloadError: [tableMetadata] = self.database.getMetadatas(predicate: NSPredicate(format: "session == %@ AND status == %d", networking.sessionDownloadBackground, global.metadataStatusDownloadError), sortedByKeyPath: "sessionDate", ascending: true) ?? []
for metadata in metadatasDownloadError {
// Verify COUNTER ERROR
if let transfer = NCTransferProgress.shared.get(ocIdTransfer: metadata.ocIdTransfer),
Expand Down Expand Up @@ -248,7 +273,7 @@ class NCNetworkingProcess {
/// isE2EE
let isInDirectoryE2EE = metadata.isDirectoryE2EE
/// NO WiFi
if !isWiFi && metadata.session == NCNetworking.shared.sessionUploadBackgroundWWan { continue }
if !isWiFi && metadata.session == networking.sessionUploadBackgroundWWan { continue }
if applicationState != .active && (isInDirectoryE2EE || metadata.chunk > 0) { continue }
if let metadata = self.database.setMetadataStatus(ocId: metadata.ocId, status: global.metadataStatusUploading) {
/// find controller
Expand All @@ -268,7 +293,7 @@ class NCNetworkingProcess {
}
}

NCNetworking.shared.upload(metadata: metadata, controller: controller)
networking.upload(metadata: metadata, controller: controller)
if isInDirectoryE2EE || metadata.chunk > 0 {
maxConcurrentOperationUpload = 1
}
Expand All @@ -292,14 +317,14 @@ class NCNetworkingProcess {
NextcloudKit.shared.getUserProfile(account: metadata.account) { _, userProfile, _, error in
if error == .success, let userProfile, userProfile.quotaFree > 0, userProfile.quotaFree > metadata.size {
self.database.setMetadataSession(ocId: metadata.ocId,
session: NCNetworking.shared.sessionUploadBackground,
session: self.networking.sessionUploadBackground,
sessionError: "",
status: self.global.metadataStatusWaitUpload)
}
}
} else {
self.database.setMetadataSession(ocId: metadata.ocId,
session: NCNetworking.shared.sessionUploadBackground,
session: self.networking.sessionUploadBackground,
sessionError: "",
status: global.metadataStatusWaitUpload)
}
Expand All @@ -323,7 +348,7 @@ class NCNetworkingProcess {
func refreshProcessingTask() async -> (counterDownloading: Int, counterUploading: Int, counterWebDAV: Int) {
await withCheckedContinuation { continuation in
self.lockQueue.sync {
guard !self.hasRun, NCNetworking.shared.isOnline else { return }
guard !self.hasRun, networking.isOnline else { return }
self.hasRun = true

Task { [weak self] in
Expand Down

0 comments on commit ee3e51c

Please sign in to comment.