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 Nextcloud.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -6237,7 +6237,7 @@
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
COPY_PHASE_STRIP = NO;
CURRENT_PROJECT_VERSION = 2;
CURRENT_PROJECT_VERSION = 3;
DEAD_CODE_STRIPPING = YES;
DEBUG_INFORMATION_FORMAT = dwarf;
DEVELOPMENT_TEAM = NKUJUXUJ3B;
Expand Down Expand Up @@ -6305,7 +6305,7 @@
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
COPY_PHASE_STRIP = NO;
CURRENT_PROJECT_VERSION = 2;
CURRENT_PROJECT_VERSION = 3;
DEAD_CODE_STRIPPING = YES;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
DEVELOPMENT_TEAM = NKUJUXUJ3B;
Expand Down
34 changes: 25 additions & 9 deletions iOSClient/Data/NCManageDatabase+Metadata.swift
Original file line number Diff line number Diff line change
Expand Up @@ -1467,23 +1467,39 @@ extension NCManageDatabase {
}
}

func getTransferAsync(tranfersSuccess: [tableMetadata]) async -> [tableMetadata] {
func getTransferAsync(tranfersSuccess: [tableMetadata], status: [Int], offset: Int, limit: Int) async -> (metadatas: [tableMetadata], inWaiting: Int, inProgress: Int, inError: Int) {
await core.performRealmReadAsync { realm in
let predicate = NSPredicate(format: "status IN %@", NCGlobal.shared.metadataStatusTransfers)
let allTransfers = realm.objects(tableMetadata.self)
.filter("status != 0")

let excludedIds = Set(tranfersSuccess.compactMap(\.ocIdTransfer))

let inWaiting = allTransfers.filter("status IN %@", NCGlobal.shared.metadatasStatusInWaiting).count
let inProgress = allTransfers.filter("status IN %@", NCGlobal.shared.metadatasStatusDownloadingUploading).count
let inError = allTransfers.filter("status IN %@", NCGlobal.shared.metadatasStatusInError).count

let sortDescriptors = [
RealmSwift.SortDescriptor(keyPath: "status", ascending: false),
RealmSwift.SortDescriptor(keyPath: "sessionDate", ascending: true)
RealmSwift.SortDescriptor(keyPath: "sessionDate", ascending: true),
RealmSwift.SortDescriptor(keyPath: "ocId", ascending: true)
]

let results = realm.objects(tableMetadata.self)
.filter(predicate)
let results = allTransfers
.filter("status IN %@", status)
.sorted(by: sortDescriptors)
.filter { !excludedIds.contains($0.ocIdTransfer) }

let excludedIds = Set(tranfersSuccess.compactMap { $0.ocIdTransfer })
let filtered = results.filter { !excludedIds.contains($0.ocIdTransfer) }
let startIndex = min(offset, results.count)
let endIndex = min(startIndex + limit, results.count)
let metadatas = results[startIndex..<endIndex].map { $0.detachedCopy() }

return filtered.map { $0.detachedCopy() }
} ?? []
return (
metadatas: metadatas,
inWaiting: inWaiting,
inProgress: inProgress,
inError: inError
)
} ?? (metadatas: [], inWaiting: 0, inProgress: 0, inError: 0)
}

func getMetadatasStatusCountAsync(status: [Int]) async -> Int {
Expand Down
2 changes: 1 addition & 1 deletion iOSClient/NCGlobal.swift
Original file line number Diff line number Diff line change
Expand Up @@ -231,9 +231,9 @@ final class NCGlobal: Sendable {
let metadataStatusForScreenAwake = [-1, -2, 1, 2]
let metadataStatusHideInView = [1, 2, 3, 11]
let metadataStatusWaitWebDav = [10, 11, 12, 13, 14, 15]
let metadataStatusTransfers = [-2, -3, 2, 3, 10, 11, 12, 13, 14, 15]

let metadatasStatusInWaiting = [-1, 1, 10, 11, 12, 13, 14, 15]
let metadatasStatusInError = [-3, 3]
let metadatasStatusInWaitingDownloadUpload = [-1, 1]
let metadatasStatusDownloadingUploading = [-2, 2]

Expand Down
12 changes: 9 additions & 3 deletions iOSClient/Supporting Files/en.lproj/Localizable.strings
Original file line number Diff line number Diff line change
Expand Up @@ -435,9 +435,15 @@
"_remote_" = "Remote";
"_remote_group_" = "Remote group";
"_conversation_" = "Conversation";

"_no_transfer_" = "No transfers yet";
"_no_transfer_sub_" = "Uploads and downloads from this device will show up here";
"_no_transfer_" = "No transfers yet";
"_no_transfer_sub_" = "Uploads and downloads from this device will show up here";
"_no_transfer_in_progress_" = "No transfers in progress";
"_no_transfer_in_progress_sub_" = "Active uploads and downloads from this device will appear here.";
"_no_transfer_in_waiting_" = "No transfers waiting";
"_no_transfer_in_waiting_sub_" = "Transfers waiting to start will appear here.";
"_no_transfer_in_error_" = "No transfer errors";
"_no_transfer_in_error_sub_" = "Transfers that need your attention will appear here.";
"_transfers_waiting_shown_" = "%1$d of %2$d transfers waiting";
"_no_activity_footer_" = "No more activities to load";
"_transfers_" = "Transfers";
"_activity_" = "Activity";
Expand Down
80 changes: 56 additions & 24 deletions iOSClient/Transfers/NCTransfersModel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,36 @@
import Foundation
import NextcloudKit

internal enum TransfersFilter: Sendable {
case waiting
case progress
case error

var statuses: [Int] {
switch self {
case .waiting:
return NCGlobal.shared.metadatasStatusInWaiting
case .progress:
return NCGlobal.shared.metadatasStatusDownloadingUploading
case .error:
return NCGlobal.shared.metadatasStatusInError
}
}
}

final class TransfersViewModel: ObservableObject, NCMetadataTransfersSuccessDelegate {
@Published var metadatas: [tableMetadata] = []
@Published var progressMap: [String: Float] = [:]
@Published var isLoading = false
@Published var showFlushMessage = false
@Published var inWaitingCount = 0
@Published var inProgressCount = 0
@Published var inErrorCount = 0

@Published private(set) var selectedFilter: TransfersFilter = .progress

private var isLoadingTransfers = false
private let transfersLimit = 100

// Dependencies
private let session: NCSession.Session
private let database = NCManageDatabase.shared
Expand Down Expand Up @@ -47,34 +68,45 @@ final class TransfersViewModel: ObservableObject, NCMetadataTransfersSuccessDele
func pollTransfers() async {
while !Task.isCancelled {
if !isXcodeRunningForPreviews {
isLoading = true

// Items
let transfersSuccess = await networking.metadataTranfersSuccess.getAll()
let results = await database.getTransferAsync(tranfersSuccess: transfersSuccess)
metadatas = results.filter {
self.global.metadataStatusTransfers.contains($0.status)
}
await loadTransfers()
}
try? await Task.sleep(for: .seconds(0.5))
}
}

// inWaitingCount
let countTransfersSuccess = await NCNetworking.shared.metadataTranfersSuccess.count()
let countWaiting = await NCManageDatabase.shared.getMetadatasStatusCountAsync(status: NCGlobal.shared.metadatasStatusInWaiting)
inWaitingCount = max(0, countWaiting - countTransfersSuccess)
@MainActor
func selectFilter(_ filter: TransfersFilter) async {
guard selectedFilter != filter else {
return
}

// inProgressCount
inProgressCount = metadatas.compactMap(\.status)
.filter { NCGlobal.shared.metadatasStatusDownloadingUploading.contains($0) }
.count
selectedFilter = filter
await loadTransfers()
}

// inErrorCount
inErrorCount = metadatas.compactMap(\.errorCode)
.filter { $0 != 0 }
.count
@MainActor
private func loadTransfers() async {
guard !isLoadingTransfers else {
return
}

isLoading = false
}
try? await Task.sleep(for: .seconds(0.5))
isLoadingTransfers = true
defer {
isLoadingTransfers = false
}

let transfersSuccess = await networking.metadataTranfersSuccess.getAll()
let result = await database.getTransferAsync(
tranfersSuccess: transfersSuccess,
status: selectedFilter.statuses,
offset: 0,
limit: transfersLimit
)

metadatas = result.metadatas
inWaitingCount = result.inWaiting
inProgressCount = result.inProgress
inErrorCount = result.inError
}

func cancel(item: tableMetadata) async {
Expand Down
Loading
Loading