Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
4 changes: 2 additions & 2 deletions iOSClient/Data/NCManageDatabase+Metadata.swift
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
Expand Down
32 changes: 24 additions & 8 deletions iOSClient/Data/NCMetadataTranfersSuccess.swift
Original file line number Diff line number Diff line change
Expand Up @@ -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] = []

Expand All @@ -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 ?? ""
Expand All @@ -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
Expand All @@ -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)

Expand Down Expand Up @@ -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,
Expand Down
3 changes: 2 additions & 1 deletion iOSClient/NCGlobal.swift
Original file line number Diff line number Diff line change
Expand Up @@ -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
//
Expand Down
26 changes: 11 additions & 15 deletions iOSClient/Networking/NCNetworkingProcess.swift
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@

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)
Expand Down Expand Up @@ -70,7 +70,7 @@
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()
Expand Down Expand Up @@ -126,18 +126,14 @@
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
Expand Down Expand Up @@ -202,11 +198,11 @@
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 {
Expand All @@ -222,7 +218,7 @@
// 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()
Expand Down Expand Up @@ -267,7 +263,7 @@

await runMetadataPipelineAsync(metadatas: metadatas)

// TODO: Check temperature

Check warning on line 266 in iOSClient/Networking/NCNetworkingProcess.swift

View workflow job for this annotation

GitHub Actions / Lint

Todo Violation: TODOs should be resolved (Check temperature) (todo)

if networking.isOffline {
await startTimer(interval: offlineInterval)
Expand Down
6 changes: 4 additions & 2 deletions iOSClient/Transfers/NCTransfersModel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Loading