diff --git a/iOSClient/Data/NCManageDatabase+Metadata.swift b/iOSClient/Data/NCManageDatabase+Metadata.swift index 2e44150c79..dc32ea891c 100644 --- a/iOSClient/Data/NCManageDatabase+Metadata.swift +++ b/iOSClient/Data/NCManageDatabase+Metadata.swift @@ -1348,10 +1348,10 @@ extension NCManageDatabase { } ?? [] } - func getMetadatasInWaitingCountAsync() async -> Int { + func getMetadatasStatusCountAsync(status: [Int]) async -> Int { await core.performRealmReadAsync { realm in realm.objects(tableMetadata.self) - .filter("status IN %@", NCGlobal.shared.metadatasStatusInWaiting) + .filter("status IN %@", status) .count } ?? 0 } diff --git a/iOSClient/Data/NCMetadataTranfersSuccess.swift b/iOSClient/Data/NCMetadataTranfersSuccess.swift index 6f115ae4a8..5b53798df9 100644 --- a/iOSClient/Data/NCMetadataTranfersSuccess.swift +++ b/iOSClient/Data/NCMetadataTranfersSuccess.swift @@ -11,7 +11,12 @@ public protocol NCMetadataTransfersSuccessDelegate: AnyObject { } actor NCMetadataTranfersSuccess { - private var tranfersSuccess: [tableMetadata] = [] + private struct TransferSuccessItem { + let metadata: tableMetadata + let status: Int + } + + private var tranfersSuccess: [TransferSuccessItem] = [] private let utility = NCUtility() private var delegates: [NCMetadataTransfersSuccessDelegate] = [] @@ -26,6 +31,8 @@ actor NCMetadataTranfersSuccess { } func append(metadata: tableMetadata, ocId: String, date: Date?, etag: String?) async { + let status = metadata.status + metadata.ocId = ocId metadata.uploadDate = (date as? NSDate) ?? NSDate() metadata.etag = etag ?? "" @@ -40,10 +47,12 @@ actor NCMetadataTranfersSuccess { metadata.sessionTaskIdentifier = 0 metadata.status = NCGlobal.shared.metadataStatusNormal - if let index = tranfersSuccess.firstIndex(where: { $0.ocId == metadata.ocId }) { - tranfersSuccess[index] = metadata + let item = TransferSuccessItem(metadata: metadata, status: status) + + if let index = tranfersSuccess.firstIndex(where: { $0.metadata.ocId == metadata.ocId }) { + tranfersSuccess[index] = item } else { - tranfersSuccess.append(metadata) + tranfersSuccess.append(item) } // Create Live Photo metadata @@ -61,16 +70,21 @@ actor NCMetadataTranfersSuccess { tranfersSuccess.count } + func count(statuses: [Int]) -> Int { + tranfersSuccess.filter { statuses.contains($0.status) }.count + } + func getAll() -> [tableMetadata] { - tranfersSuccess + tranfersSuccess.map(\.metadata) } func exists(serverUrlFileName: String) async -> Bool { - return tranfersSuccess.filter({ $0.serverUrlFileName == serverUrlFileName }).first != nil + return tranfersSuccess.contains { $0.metadata.serverUrlFileName == serverUrlFileName } } func flush() async { - let metadatas: [tableMetadata] = tranfersSuccess + let items = tranfersSuccess + let metadatas = items.map(\.metadata) let hasLivePhotos = await NCManageDatabase.shared.hasLivePhotos() tranfersSuccess.removeAll(keepingCapacity: true) @@ -115,7 +129,9 @@ actor NCMetadataTranfersSuccess { // TransferDispatcher — notify outside of shared-state mutation await NCNetworking.shared.transferDispatcher.notifyAllDelegates { delegate in - for metadata in metadatas { + for item in items { + let metadata = item.metadata + delegate.transferChange(status: NCGlobal.shared.networkingStatusUploaded, account: metadata.account, fileName: metadata.fileName, diff --git a/iOSClient/NCGlobal.swift b/iOSClient/NCGlobal.swift index cd2eee1ef7..2e6ad38aee 100644 --- a/iOSClient/NCGlobal.swift +++ b/iOSClient/NCGlobal.swift @@ -253,7 +253,8 @@ final class NCGlobal: Sendable { let metadataStatusTransfers = [-2, -3, 2, 3, 10, 11, 12, 13, 14, 15] let metadatasStatusInWaiting = [-1, 1, 10, 11, 12, 13, 14, 15] - let metadatasStatusInProgress = [-2, 2] + let metadatasStatusInWaitingDownloadUpload = [-1, 1] + let metadatasStatusDownloadingUploading = [-2, 2] // Auto upload subfolder granularity // diff --git a/iOSClient/Networking/NCNetworkingProcess.swift b/iOSClient/Networking/NCNetworkingProcess.swift index 93ab4dd4ce..930a965320 100644 --- a/iOSClient/Networking/NCNetworkingProcess.swift +++ b/iOSClient/Networking/NCNetworkingProcess.swift @@ -28,7 +28,7 @@ actor NCNetworkingProcess { private var enableControllingScreenAwake = true private var currentAccount = "" - private var inWaitingCount: Int = 0 + private var inWaitDownloadUploadCount: Int = 0 private var timer: DispatchSourceTimer? private let timerQueue = DispatchQueue(label: "com.nextcloud.timerProcess", qos: .utility) @@ -70,7 +70,7 @@ actor NCNetworkingProcess { guard let self else { return } Task { - let count = await self.inWaitingCount() + let count = await self.inWaitingDownloadUploadCount() try? await UNUserNotificationCenter.current().setBadgeCount(count) await self.stopTimer() @@ -126,18 +126,14 @@ actor NCNetworkingProcess { currentAccount = account } - private func inWaitingCount() async -> Int { - let countTransferSuccess = await NCNetworking.shared.metadataTranfersSuccess.count() - let totalNonNormal = await NCManageDatabase.shared.getMetadatasInWaitingCountAsync() - let count = max(0, totalNonNormal - countTransferSuccess) + private func inWaitingDownloadUploadCount() async -> Int { + let countTransferDownloadingUploadingSuccess = await NCNetworking.shared.metadataTranfersSuccess.count(statuses: NCGlobal.shared.metadatasStatusDownloadingUploading) + let countWaitingDownloadUpload = await NCManageDatabase.shared.getMetadatasStatusCountAsync(status: NCGlobal.shared.metadatasStatusInWaitingDownloadUpload) + let count = max(0, countWaitingDownloadUpload - countTransferDownloadingUploadingSuccess) return count } - func getInWaitingCount() async -> Int { - return inWaitingCount - } - func startTimer(interval: TimeInterval) async { let isActive = await MainActor.run { UIApplication.shared.applicationState == .active @@ -202,11 +198,11 @@ actor NCNetworkingProcess { return } - // UPDATE INWAIT & BADGE + // UPDATE INWAIT DOWNLOAD UPLOAD & BADGE // - let count = await inWaitingCount() - if count != inWaitingCount { - inWaitingCount = count + let count = await inWaitingDownloadUploadCount() + if count != inWaitDownloadUploadCount { + inWaitDownloadUploadCount = count Task { @MainActor in if let controller = getRootController(), let files = controller.tabBar.items?.first { @@ -222,7 +218,7 @@ actor NCNetworkingProcess { // TRANSFERS SUCCESS // let countWaitUpload = metadatas.filter { $0.status == self.global.metadataStatusWaitUpload }.count - let countProgress = metadatas.filter { global.metadatasStatusInProgress.contains($0.status) }.count + let countProgress = metadatas.filter { global.metadatasStatusDownloadingUploading.contains($0.status) }.count let countTransferSuccess = await NCNetworking.shared.metadataTranfersSuccess.count() if (countWaitUpload == 0 && countTransferSuccess > 0) || countTransferSuccess >= NCBrandOptions.shared.numMaximumProcess { await NCNetworking.shared.metadataTranfersSuccess.flush() diff --git a/iOSClient/Transfers/NCTransfersModel.swift b/iOSClient/Transfers/NCTransfersModel.swift index ffc8d68f47..b8297817b1 100644 --- a/iOSClient/Transfers/NCTransfersModel.swift +++ b/iOSClient/Transfers/NCTransfersModel.swift @@ -57,11 +57,13 @@ final class TransfersViewModel: ObservableObject, NCMetadataTransfersSuccessDele } // inWaitingCount - inWaitingCount = await NCNetworkingProcess.shared.getInWaitingCount() + let countTransfersSuccess = await NCNetworking.shared.metadataTranfersSuccess.count() + let countWaiting = await NCManageDatabase.shared.getMetadatasStatusCountAsync(status: NCGlobal.shared.metadatasStatusInWaiting) + inWaitingCount = max(0, countWaiting - countTransfersSuccess) // inProgressCount inProgressCount = metadatas.compactMap(\.status) - .filter { NCGlobal.shared.metadatasStatusInProgress.contains($0) } + .filter { NCGlobal.shared.metadatasStatusDownloadingUploading.contains($0) } .count // inErrorCount