diff --git a/Nextcloud.xcodeproj/project.pbxproj b/Nextcloud.xcodeproj/project.pbxproj index 40a35fe685..82e3b83219 100644 --- a/Nextcloud.xcodeproj/project.pbxproj +++ b/Nextcloud.xcodeproj/project.pbxproj @@ -2201,7 +2201,7 @@ isa = PBXGroup; children = ( F7603298252F0E550015A421 /* Collection Common */, - F7DFB7E9219C5A0500680748 /* Create cloud */, + F7DFB7E9219C5A0500680748 /* Create */, F7226EDB1EE4089300EBECB1 /* Main.storyboard */, F7B934FD2BDCFE1E002B2FC9 /* NCDragDrop.swift */, F794E13C2BBBFF2E003693D7 /* NCMainTabBarController.swift */, @@ -3116,7 +3116,7 @@ path = TOPasscodeViewController; sourceTree = ""; }; - F7DFB7E9219C5A0500680748 /* Create cloud */ = { + F7DFB7E9219C5A0500680748 /* Create */ = { isa = PBXGroup; children = ( F7FA7FFD2C0F4F3B0072FC60 /* Upload Assets */, @@ -3126,7 +3126,7 @@ F704B5E82430C0B800632F5F /* NCCreateFormUploadConflictCell.swift */, F704B5E62430C06700632F5F /* NCCreateFormUploadConflictCell.xib */, ); - path = "Create cloud"; + path = Create; sourceTree = ""; }; F7E9C41320F4CA870040CF18 /* Transfers */ = { diff --git a/iOSClient/Main/Collection Common/NCCollectionViewCommon+CollectionViewDelegate.swift b/iOSClient/Main/Collection Common/NCCollectionViewCommon+CollectionViewDelegate.swift index 5f7822ea62..03e1d7630f 100644 --- a/iOSClient/Main/Collection Common/NCCollectionViewCommon+CollectionViewDelegate.swift +++ b/iOSClient/Main/Collection Common/NCCollectionViewCommon+CollectionViewDelegate.swift @@ -53,7 +53,7 @@ extension NCCollectionViewCommon: UICollectionViewDelegate { } } await MainActor.run { - LucidBanner.shared.dismiss(for: token) + LucidBanner.shared.dismiss() } if results.nkError == .success || results.afError?.isExplicitlyCancelledError ?? false { @@ -153,9 +153,9 @@ extension NCCollectionViewCommon: UICollectionViewDelegate { } let identifier = indexPath as NSCopying var image = utility.getImage(ocId: metadata.ocId, etag: metadata.etag, ext: global.previewExt1024, userId: metadata.userId, urlBase: metadata.urlBase) + let cell = collectionView.cellForItem(at: indexPath) if image == nil { - let cell = collectionView.cellForItem(at: indexPath) if cell is NCListCell { image = (cell as? NCListCell)?.imageItem.image } else if cell is NCGridCell { @@ -168,7 +168,7 @@ extension NCCollectionViewCommon: UICollectionViewDelegate { return UIContextMenuConfiguration(identifier: identifier, previewProvider: { return NCViewerProviderContextMenu(metadata: metadata, image: image, sceneIdentifier: self.sceneIdentifier) }, actionProvider: { _ in - let contextMenu = NCContextMenu(metadata: metadata.detachedCopy(), viewController: self, sceneIdentifier: self.sceneIdentifier, image: image) + let contextMenu = NCContextMenu(metadata: metadata.detachedCopy(), viewController: self, sceneIdentifier: self.sceneIdentifier, image: image, sender: cell) return contextMenu.viewMenu() }) } diff --git a/iOSClient/Main/Collection Common/NCCollectionViewCommon.swift b/iOSClient/Main/Collection Common/NCCollectionViewCommon.swift index 541a627688..c499df2321 100644 --- a/iOSClient/Main/Collection Common/NCCollectionViewCommon.swift +++ b/iOSClient/Main/Collection Common/NCCollectionViewCommon.swift @@ -774,7 +774,7 @@ class NCCollectionViewCommon: UIViewController, UIGestureRecognizerDelegate, UIS } } } - LucidBanner.shared.dismiss(for: token) + LucidBanner.shared.dismiss() } } diff --git a/iOSClient/Main/Collection Common/Section Header Footer/NCSectionFirstHeader.swift b/iOSClient/Main/Collection Common/Section Header Footer/NCSectionFirstHeader.swift index aed1d00f33..3a3f982288 100644 --- a/iOSClient/Main/Collection Common/Section Header Footer/NCSectionFirstHeader.swift +++ b/iOSClient/Main/Collection Common/Section Header Footer/NCSectionFirstHeader.swift @@ -241,7 +241,8 @@ extension NCSectionFirstHeader: UICollectionViewDelegate { return UIContextMenuConfiguration(identifier: identifier, previewProvider: { return NCViewerProviderContextMenu(metadata: metadata, image: image, sceneIdentifier: self.sceneIdentifier) }, actionProvider: { _ in - let contextMenu = NCContextMenu(metadata: metadata.detachedCopy(), viewController: viewController, sceneIdentifier: self.sceneIdentifier, image: image) + let cell = collectionView.cellForItem(at: indexPath) + let contextMenu = NCContextMenu(metadata: metadata.detachedCopy(), viewController: viewController, sceneIdentifier: self.sceneIdentifier, image: image, sender: cell) return contextMenu.viewMenu() }) #endif diff --git a/iOSClient/Main/Create cloud/NCCreate.swift b/iOSClient/Main/Create/NCCreate.swift similarity index 88% rename from iOSClient/Main/Create cloud/NCCreate.swift rename to iOSClient/Main/Create/NCCreate.swift index 684ebd6707..9b5ee114c7 100644 --- a/iOSClient/Main/Create cloud/NCCreate.swift +++ b/iOSClient/Main/Create/NCCreate.swift @@ -235,17 +235,14 @@ class NCCreate: NSObject { /// - sender: The UI element that triggered the action (for iPad popover anchoring). @MainActor func createActivityViewController(selectedMetadata: [tableMetadata], controller: NCMainTabBarController?, sender: Any?) async { - guard let controller else { return } + guard let controller else { + return + } let metadatas = selectedMetadata.filter { !$0.directory } var exportURLs: [URL] = [] var downloadMetadata: [(tableMetadata, URL)] = [] - let scene = SceneManager.shared.getWindow(controller: controller)?.windowScene - let token = showHudBanner( - scene: scene, - title: NSLocalizedString("_download_in_progress_", comment: "") - ) for metadata in metadatas { let localPath = utilityFileSystem.getDirectoryProviderStorageOcId( @@ -254,56 +251,63 @@ class NCCreate: NSObject { userId: metadata.userId, urlBase: metadata.urlBase ) - let fileURL = URL(fileURLWithPath: localPath) - if utilityFileSystem.fileProviderStorageExists(metadata) { - downloadMetadata.append((metadata, fileURL)) + if utilityFileSystem.fileProviderStorageExists(metadata), + let url = exportFileForSharing(from: URL(fileURLWithPath: localPath)) { + exportURLs.append(url) } else { - downloadMetadata.append((metadata, fileURL)) + downloadMetadata.append((metadata, URL(fileURLWithPath: localPath))) } } - // Download missing files - for (originalMetadata, localFileURL) in downloadMetadata { - guard let metadata = await NCManageDatabase.shared.setMetadataSessionInWaitDownloadAsync( - ocId: originalMetadata.ocId, - session: NCNetworking.shared.sessionDownload, - selector: "", - sceneIdentifier: controller.sceneIdentifier - ) else { - LucidBanner.shared.dismiss(for: token) - return - } + if !downloadMetadata.isEmpty { + let token = showHudBanner( + scene: scene, + title: NSLocalizedString("_download_in_progress_", comment: "") + ) - let results = await NCNetworking.shared.downloadFile( - metadata: metadata - ) { _ in - // downloadStartHandler not used here - } progressHandler: { progress in - Task { @MainActor in - LucidBanner.shared.update( - progress: progress.fractionCompleted, - for: token - ) + // Download missing files + for (originalMetadata, localFileURL) in downloadMetadata { + guard let metadata = await NCManageDatabase.shared.setMetadataSessionInWaitDownloadAsync( + ocId: originalMetadata.ocId, + session: NCNetworking.shared.sessionDownload, + selector: "", + sceneIdentifier: controller.sceneIdentifier + ) else { + LucidBanner.shared.dismiss() + return } - } - if results.nkError == .success { - if let exportedURL = exportFileForSharing(from: localFileURL) { - exportURLs.append(exportedURL) + let results = await NCNetworking.shared.downloadFile( + metadata: metadata + ) { _ in + // downloadStartHandler not used here + } progressHandler: { progress in + Task { @MainActor in + LucidBanner.shared.update( + progress: progress.fractionCompleted, + for: token + ) + } } - } else { - Task { @MainActor in - showErrorBanner( - scene: scene, - errorDescription: results.nkError.errorDescription, - errorCode: results.nkError.errorCode - ) + + if results.nkError == .success { + if let url = exportFileForSharing(from: localFileURL) { + exportURLs.append(url) + } + } else { + Task { @MainActor in + showErrorBanner( + scene: scene, + errorDescription: results.nkError.errorDescription, + errorCode: results.nkError.errorCode + ) + } } } - } - LucidBanner.shared.dismiss(for: token) + LucidBanner.shared.dismiss() + } guard !exportURLs.isEmpty else { return } diff --git a/iOSClient/Main/Create cloud/NCCreateFormUploadConflict.storyboard b/iOSClient/Main/Create/NCCreateFormUploadConflict.storyboard similarity index 100% rename from iOSClient/Main/Create cloud/NCCreateFormUploadConflict.storyboard rename to iOSClient/Main/Create/NCCreateFormUploadConflict.storyboard diff --git a/iOSClient/Main/Create cloud/NCCreateFormUploadConflict.swift b/iOSClient/Main/Create/NCCreateFormUploadConflict.swift similarity index 100% rename from iOSClient/Main/Create cloud/NCCreateFormUploadConflict.swift rename to iOSClient/Main/Create/NCCreateFormUploadConflict.swift diff --git a/iOSClient/Main/Create cloud/NCCreateFormUploadConflictCell.swift b/iOSClient/Main/Create/NCCreateFormUploadConflictCell.swift similarity index 100% rename from iOSClient/Main/Create cloud/NCCreateFormUploadConflictCell.swift rename to iOSClient/Main/Create/NCCreateFormUploadConflictCell.swift diff --git a/iOSClient/Main/Create cloud/NCCreateFormUploadConflictCell.xib b/iOSClient/Main/Create/NCCreateFormUploadConflictCell.xib similarity index 100% rename from iOSClient/Main/Create cloud/NCCreateFormUploadConflictCell.xib rename to iOSClient/Main/Create/NCCreateFormUploadConflictCell.xib diff --git a/iOSClient/Main/Create cloud/Upload Assets/NCUploadAssetsModel.swift b/iOSClient/Main/Create/Upload Assets/NCUploadAssetsModel.swift similarity index 100% rename from iOSClient/Main/Create cloud/Upload Assets/NCUploadAssetsModel.swift rename to iOSClient/Main/Create/Upload Assets/NCUploadAssetsModel.swift diff --git a/iOSClient/Main/Create cloud/Upload Assets/NCUploadAssetsView.swift b/iOSClient/Main/Create/Upload Assets/NCUploadAssetsView.swift similarity index 100% rename from iOSClient/Main/Create cloud/Upload Assets/NCUploadAssetsView.swift rename to iOSClient/Main/Create/Upload Assets/NCUploadAssetsView.swift diff --git a/iOSClient/Main/NCDragDrop.swift b/iOSClient/Main/NCDragDrop.swift index d155e16c00..a8338b40c7 100644 --- a/iOSClient/Main/NCDragDrop.swift +++ b/iOSClient/Main/NCDragDrop.swift @@ -6,6 +6,7 @@ import UIKit import UniformTypeIdentifiers import NextcloudKit import Alamofire +import LucidBanner class NCDragDrop: NSObject { let utilityFileSystem = NCUtilityFileSystem() @@ -181,25 +182,29 @@ class NCDragDrop: NSObject { @MainActor func transfers(collectionViewCommon: NCCollectionViewCommon, destination: String, session: NCSession.Session) async { + defer { + LucidBanner.shared.dismiss() + } + guard let metadatas = DragDropHover.shared.sourceMetadatas else { return } - let hud = NCHud(collectionViewCommon.controller?.view) var uploadRequest: UploadRequest? var downloadRequest: DownloadRequest? - - func setDetailText(status: String, percent: Int) { - let text = "\(NSLocalizedString("_tap_to_cancel_", comment: "")) \(status) (\(percent)%)" - hud.setDetailText(text) - } - - hud.pieProgress(text: NSLocalizedString("_keep_active_for_transfers_", comment: ""), - tapToCancelDetailText: true) { - if let downloadRequest { - downloadRequest.cancel() - } else if let uploadRequest { - uploadRequest.cancel() - } + let scene = SceneManager.shared.getWindow(sceneIdentifier: collectionViewCommon.controller?.sceneIdentifier)?.windowScene + + let token = showUploadBanner( + scene: scene, + title: NSLocalizedString("_transfer_in_progress_", comment: ""), + subtitle: NSLocalizedString("_keep_active_for_transfers_", comment: ""), + footnote: "( " + NSLocalizedString("_tap_to_cancel_", comment: "") + " )", + systemImage: "arrow.left.arrow.right.circle", + imageAnimation: .pulsebyLayer) { _, _ in + if let downloadRequest { + downloadRequest.cancel() + } else if let uploadRequest { + uploadRequest.cancel() + } } for (index, metadata) in metadatas.enumerated() { @@ -214,12 +219,9 @@ class NCDragDrop: NSObject { if !utilityFileSystem.fileProviderStorageExists(metadata) { let results = await NCNetworking.shared.downloadFile(metadata: metadata) { request in downloadRequest = request - } progressHandler: { progress in - let status = NSLocalizedString("_status_downloading_", comment: "").lowercased() - setDetailText(status: status, percent: Int(progress.fractionCompleted * 100)) } guard results.nkError == .success else { - hud.error(text: results.nkError.errorDescription) + showErrorBanner(scene: scene, errorDescription: results.nkError.errorDescription, errorCode: results.nkError.errorCode) break } } @@ -239,20 +241,16 @@ class NCDragDrop: NSObject { creationDate: metadata.creationDate as Date, dateModificationFile: metadata.date as Date) { request in uploadRequest = request - } progressHandler: { _, _, fractionCompleted in - let status = NSLocalizedString("_status_uploading_", comment: "").lowercased() - setDetailText(status: status, percent: Int(fractionCompleted * 100)) } guard results.error == .success else { - hud.error(text: results.error.errorDescription) + showErrorBanner(scene: scene, errorDescription: results.error.errorDescription, errorCode: results.error.errorCode) break } - hud.progress(Double(index + 1) / Double(metadatas.count)) + LucidBanner.shared.update(progress: Double(index + 1) / Double(metadatas.count), for: token) } await collectionViewCommon.getServerData(forced: true) - hud.success() } } diff --git a/iOSClient/Media/NCMedia+CollectionViewDelegate.swift b/iOSClient/Media/NCMedia+CollectionViewDelegate.swift index 047e3402fa..8535cad6b4 100644 --- a/iOSClient/Media/NCMedia+CollectionViewDelegate.swift +++ b/iOSClient/Media/NCMedia+CollectionViewDelegate.swift @@ -44,7 +44,8 @@ extension NCMedia: UICollectionViewDelegate { return UIContextMenuConfiguration(identifier: identifier, previewProvider: { return NCViewerProviderContextMenu(metadata: metadata, image: image, sceneIdentifier: self.sceneIdentifier) }, actionProvider: { _ in - let contextMenu = NCContextMenu(metadata: metadata.detachedCopy(), viewController: self, sceneIdentifier: self.sceneIdentifier, image: image) + let cell = collectionView.cellForItem(at: indexPath) + let contextMenu = NCContextMenu(metadata: metadata.detachedCopy(), viewController: self, sceneIdentifier: self.sceneIdentifier, image: image, sender: collectionView) return contextMenu.viewMenu() }) } diff --git a/iOSClient/Menu/NCContextMenu.swift b/iOSClient/Menu/NCContextMenu.swift index 259dc26d1f..69d88c17ce 100644 --- a/iOSClient/Menu/NCContextMenu.swift +++ b/iOSClient/Menu/NCContextMenu.swift @@ -6,6 +6,7 @@ import Foundation import UIKit import Alamofire import NextcloudKit +import LucidBanner class NCContextMenu: NSObject { let utilityFileSystem = NCUtilityFileSystem() @@ -18,19 +19,21 @@ class NCContextMenu: NSObject { let sceneIdentifier: String let viewController: UIViewController let image: UIImage? + let sender: Any? - init(metadata: tableMetadata, viewController: UIViewController, sceneIdentifier: String, image: UIImage?) { + init(metadata: tableMetadata, viewController: UIViewController, sceneIdentifier: String, image: UIImage?, sender: Any?) { self.metadata = metadata self.viewController = viewController self.sceneIdentifier = sceneIdentifier self.image = image + self.sender = sender } func viewMenu() -> UIMenu { var downloadRequest: DownloadRequest? var titleDeleteConfirmFile = NSLocalizedString("_delete_file_", comment: "") let metadataMOV = self.database.getMetadataLivePhoto(metadata: metadata) - let hud = NCHud(viewController.view) + let scene = SceneManager.shared.getWindow(sceneIdentifier: sceneIdentifier)?.windowScene if metadata.directory { titleDeleteConfirmFile = NSLocalizedString("_delete_folder_", comment: "") } @@ -54,45 +57,11 @@ class NCContextMenu: NSObject { let share = UIAction(title: NSLocalizedString("_share_", comment: ""), image: utility.loadImage(named: "square.and.arrow.up") ) { _ in - if self.utilityFileSystem.fileProviderStorageExists(self.metadata) { - Task { - await self.networking.transferDispatcher.notifyAllDelegates { delegate in - delegate.transferChange(status: self.global.networkingStatusDownloaded, - account: self.metadata.account, - fileName: self.metadata.fileName, - serverUrl: self.metadata.serverUrl, - selector: self.global.selectorOpenIn, - ocId: self.metadata.ocId, - destination: nil, - error: .success) - } - } - } else { - Task { @MainActor in - guard let metadata = await self.database.setMetadataSessionInWaitDownloadAsync(ocId: self.metadata.ocId, - session: self.networking.sessionDownload, - selector: self.global.selectorOpenIn, - sceneIdentifier: self.sceneIdentifier) else { - return - } - - hud.ringProgress(text: NSLocalizedString("_downloading_", comment: ""), tapToCancelDetailText: true) { - if let request = downloadRequest { - request.cancel() - } - } - - let results = await self.networking.downloadFile(metadata: metadata) { request in - downloadRequest = request - } progressHandler: { progress in - hud.progress(progress.fractionCompleted) - } - if results.nkError == .success || results.afError?.isExplicitlyCancelledError ?? false { - hud.dismiss() - } else { - hud.error(text: results.nkError.errorDescription) - } - } + Task {@MainActor in + let controller = self.viewController.tabBarController as? NCMainTabBarController + await NCCreate().createActivityViewController(selectedMetadata: [self.metadata], + controller: controller, + sender: self.sender) } } @@ -129,21 +98,27 @@ class NCContextMenu: NSObject { return } - hud.ringProgress(text: NSLocalizedString("_downloading_", comment: "")) { - if let request = downloadRequest { - request.cancel() - } + let token = showHudBanner( + scene: scene, + title: NSLocalizedString("_download_in_progress_", comment: "")) { _, _ in + if let request = downloadRequest { + request.cancel() + } } let results = await self.networking.downloadFile(metadata: metadata) { request in downloadRequest = request } progressHandler: { progress in - hud.progress(progress.fractionCompleted) + Task {@MainActor in + LucidBanner.shared.update(progress: progress.fractionCompleted, for: token) + } } + LucidBanner.shared.dismiss() + if results.nkError == .success || results.afError?.isExplicitlyCancelledError ?? false { - hud.dismiss() + // } else { - hud.error(text: results.nkError.errorDescription) + showErrorBanner(scene: scene, errorDescription: results.nkError.errorDescription, errorCode: results.nkError.errorCode) } } } diff --git a/iOSClient/Networking/E2EE/NCNetworkingE2EEUpload.swift b/iOSClient/Networking/E2EE/NCNetworkingE2EEUpload.swift index 7f094118fa..3b246b9e7f 100644 --- a/iOSClient/Networking/E2EE/NCNetworkingE2EEUpload.swift +++ b/iOSClient/Networking/E2EE/NCNetworkingE2EEUpload.swift @@ -47,7 +47,7 @@ class NCNetworkingE2EEUpload: NSObject { if let request = self.request { request.cancel() } - LucidBanner.shared.dismiss(for: self.bannerToken) + LucidBanner.shared.dismiss() } defer { @@ -56,7 +56,7 @@ class NCNetworkingE2EEUpload: NSObject { await self.database.deleteMetadataAsync(id: ocId) } } - LucidBanner.shared.dismiss(for: bannerToken) + LucidBanner.shared.dismiss() } if let result = await self.database.getMetadataAsync(predicate: NSPredicate(format: "serverUrl == %@ AND fileNameView == %@ AND ocId != %@", metadata.serverUrl, metadata.fileNameView, metadata.ocId)) { @@ -262,7 +262,7 @@ class NCNetworkingE2EEUpload: NSObject { currentUploadTask = task let results = await task.value - LucidBanner.shared.dismiss(for: bannerToken) + LucidBanner.shared.dismiss() return (results.file?.ocId, results.file?.etag, results.file?.date, results.error) } else { @@ -292,7 +292,7 @@ class NCNetworkingE2EEUpload: NSObject { } } - LucidBanner.shared.dismiss(for: bannerToken) + LucidBanner.shared.dismiss() return (results.ocId, results.etag, results.date, results.error) } diff --git a/iOSClient/Networking/NCNetworking+WebDAV.swift b/iOSClient/Networking/NCNetworking+WebDAV.swift index 001069cb54..bfc52f257c 100644 --- a/iOSClient/Networking/NCNetworking+WebDAV.swift +++ b/iOSClient/Networking/NCNetworking+WebDAV.swift @@ -349,7 +349,7 @@ extension NCNetworking { LucidBanner.shared.update(progress: Double(num) / Double(total), for: token) } } - LucidBanner.shared.dismiss(for: token) + LucidBanner.shared.dismiss() } else { await deleteLocalFile(metadata: metadata) @@ -415,7 +415,7 @@ extension NCNetworking { } } - LucidBanner.shared.dismiss(for: token) + LucidBanner.shared.dismiss() } #endif diff --git a/iOSClient/Networking/NCNetworkingProcess.swift b/iOSClient/Networking/NCNetworkingProcess.swift index 0278f1c007..4895e67b05 100644 --- a/iOSClient/Networking/NCNetworkingProcess.swift +++ b/iOSClient/Networking/NCNetworkingProcess.swift @@ -392,7 +392,7 @@ actor NCNetworkingProcess { if let currentUploadTask { currentUploadTask.cancel() } else { - LucidBanner.shared.dismiss(for: token) + LucidBanner.shared.dismiss() } } @@ -433,7 +433,7 @@ actor NCNetworkingProcess { currentUploadTask = task _ = await task.value - LucidBanner.shared.dismiss(for: token) + LucidBanner.shared.dismiss() } // MARK: - Helper diff --git a/iOSClient/SceneDelegate.swift b/iOSClient/SceneDelegate.swift index a44246fe75..cd3903f02a 100644 --- a/iOSClient/SceneDelegate.swift +++ b/iOSClient/SceneDelegate.swift @@ -494,6 +494,9 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { try? await Task.sleep(nanoseconds: 1_500_000_000) await NCService().startRequestServicesServer(account: account, controller: controller) + + try? await Task.sleep(nanoseconds: 2_000_000_000) + await NCNetworking.shared.verifyZombie() } NotificationCenter.default.postOnMainThread(name: global.notificationCenterRichdocumentGrabFocus) diff --git a/iOSClient/Select/NCSelect.swift b/iOSClient/Select/NCSelect.swift index c962658889..572fa3bd73 100644 --- a/iOSClient/Select/NCSelect.swift +++ b/iOSClient/Select/NCSelect.swift @@ -220,7 +220,7 @@ class NCSelect: UIViewController, UIGestureRecognizerDelegate, UIAdaptivePresent guard session.account == account, status == self.global.networkingStatusCreateFolder, self.serverUrl == serverUrl, - let metadata = await NCManageDatabase.shared.getMetadataFromOcIdAsync(ocId) + let metadata = await NCManageDatabase.shared.getMetadataAsync(predicate: NSPredicate(format: "account == %@ AND serverUrl == %@ AND fileName == %@", account, serverUrl, fileName)) else { return } diff --git a/iOSClient/Supporting Files/en.lproj/Localizable.strings b/iOSClient/Supporting Files/en.lproj/Localizable.strings index fb08fe86bd..4ff6731ffe 100644 --- a/iOSClient/Supporting Files/en.lproj/Localizable.strings +++ b/iOSClient/Supporting Files/en.lproj/Localizable.strings @@ -663,6 +663,7 @@ "_delete_in_progress_" = "Delete in progress …"; "_download_in_progress_" = "Download in progress …"; "_upload_in_progress_" = "Upload in progress …"; +"_transfer_in_progress_" = "Transfer in progress …"; "_in_waiting_" = "In waiting"; "_in_progress_" = "In progress"; "_in_error_" = "In error";