Skip to content

Commit 0c87881

Browse files
committed
Merge branch 'master' of https://github.com/nextcloud/ios into filename-fixes
2 parents 2fd379f + 53cf041 commit 0c87881

File tree

86 files changed

+1135
-817
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

86 files changed

+1135
-817
lines changed

Nextcloud.xcodeproj/project.pbxproj

Lines changed: 31 additions & 36 deletions
Large diffs are not rendered by default.

Share/NCShareExtension.swift

Lines changed: 27 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ class NCShareExtension: UIViewController {
4949
let global = NCGlobal.shared
5050
var maintenanceMode: Bool = false
5151
var token: Int?
52+
var banner: LucidBanner?
5253
var sceneIdentifier: String = UUID().uuidString
5354

5455
// MARK: - View Life Cycle
@@ -114,6 +115,10 @@ class NCShareExtension: UIViewController {
114115
}
115116

116117
NCNetworking.shared.setupScene(sceneIdentifier: sceneIdentifier, controller: self)
118+
119+
if let windowScene = view.window?.windowScene {
120+
banner = LucidBannerRegistry.shared.banner(for: windowScene)
121+
}
117122
}
118123

119124
override func viewWillAppear(_ animated: Bool) {
@@ -383,10 +388,10 @@ extension NCShareExtension {
383388
vPosition: .center,
384389
horizontalLayout: horizontalLayout,
385390
blocksTouches: true)
386-
token = showUploadBanner(scene: window.windowScene,
387-
payload: payload,
388-
allowMinimizeOnTap: false,
389-
onButtonTap: {
391+
(token, banner) = showUploadBanner(windowScene: window.windowScene,
392+
payload: payload,
393+
allowMinimizeOnTap: false,
394+
onButtonTap: {
390395
self.cancel()
391396
})
392397

@@ -397,7 +402,7 @@ extension NCShareExtension {
397402
systemImage: "arrowshape.up.circle",
398403
imageAnimation: .breathe,
399404
progress: 0)
400-
LucidBanner.shared.update(payload: payloadUpdate)
405+
banner?.update(payload: payloadUpdate)
401406

402407
error = await self.upload(metadata: metadata)
403408
if error != .success {
@@ -406,12 +411,12 @@ extension NCShareExtension {
406411
}
407412

408413
if error == .success {
409-
LucidBanner.shared.update(payload: LucidBannerPayload.Update(stage: .success, horizontalLayout: .centered(width: 100)), for: self.token)
414+
banner?.update(payload: LucidBannerPayload.Update(stage: .success, horizontalLayout: .centered(width: 100)), for: self.token)
410415
} else {
411-
LucidBanner.shared.update(payload: LucidBannerPayload.Update(subtitle: error?.errorDescription, stage: .error), for: self.token)
416+
banner?.update(payload: LucidBannerPayload.Update(subtitle: error?.errorDescription, stage: .error), for: self.token)
412417
}
413418

414-
LucidBanner.shared.dismiss(after: 2) {
419+
banner?.dismiss(after: 2) {
415420
self.cancel()
416421
}
417422
}
@@ -444,35 +449,40 @@ extension NCShareExtension {
444449
self.counterUploaded += 1
445450

446451
if metadata.isDirectoryE2EE {
447-
error = await NCNetworkingE2EEUpload().upload(metadata: metadata, session: session, controller: self, stageBanner: nil, tokenBanner: self.token)
452+
error = await NCNetworkingE2EEUpload().upload(metadata: metadata,
453+
session: session,
454+
controller: self,
455+
banner: banner,
456+
stageBanner: nil,
457+
tokenBanner: self.token)
448458
} else if metadata.chunk > 0 {
449-
LucidBanner.shared.update(payload: LucidBannerPayload.Update(systemImage: "gearshape.arrow.triangle.2.circlepath",
450-
imageAnimation: .rotate),
459+
banner?.update(payload: LucidBannerPayload.Update(systemImage: "gearshape.arrow.triangle.2.circlepath",
460+
imageAnimation: .rotate),
451461
for: self.token)
452462
let task = Task { () -> (account: String, file: NKFile?, error: NKError) in
453463
let results = await NCNetworking.shared.uploadChunkFile(metadata: metadata) { total, counter in
454464
Task {@MainActor in
455-
LucidBanner.shared.update(payload: LucidBannerPayload.Update(progress: Double(counter) / Double(total)), for: self.token)
465+
self.banner?.update(payload: LucidBannerPayload.Update(progress: Double(counter) / Double(total)), for: self.token)
456466
}
457467
} uploadStart: { _ in
458468
Task {@MainActor in
459469
let payload = LucidBannerPayload.Update(
460470
systemImage: "arrowshape.up.circle",
461471
imageAnimation: .breathe
462472
)
463-
LucidBanner.shared.update(payload: payload, for: self.token)
473+
self.banner?.update(payload: payload, for: self.token)
464474
}
465475
} uploadProgressHandler: { _, _, progress in
466476
Task {@MainActor in
467-
LucidBanner.shared.update(payload: LucidBannerPayload.Update(progress: progress), for: self.token)
477+
self.banner?.update(payload: LucidBannerPayload.Update(progress: progress), for: self.token)
468478
}
469479
} assembling: {
470480
Task {@MainActor in
471481
let payload = LucidBannerPayload.Update(
472482
systemImage: "gearshape.arrow.triangle.2.circlepath",
473483
imageAnimation: .rotate
474484
)
475-
LucidBanner.shared.update(payload: payload, for: self.token)
485+
self.banner?.update(payload: payload, for: self.token)
476486
}
477487
}
478488

@@ -494,8 +504,8 @@ extension NCShareExtension {
494504
dateModificationFile: metadata.date as Date) { _ in
495505
} progressHandler: { _, _, fractionCompleted in
496506
Task {@MainActor in
497-
LucidBanner.shared.update(payload: LucidBannerPayload.Update(progress: fractionCompleted),
498-
for: self.token)
507+
self.banner?.update(payload: LucidBannerPayload.Update(progress: fractionCompleted),
508+
for: self.token)
499509
}
500510
}
501511
error = results.error

iOSClient/Account/NCAccount.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -193,8 +193,8 @@ class NCAccount: NSObject {
193193
guard let tblAccount = await NCManageDatabase.shared.getTableAccountAsync(predicate: NSPredicate(format: "account == %@", account)) else {
194194
return
195195
}
196-
197-
await showErrorBanner(controller: controller, text: String(format: NSLocalizedString("_account_unauthorized_", comment: ""), account), errorCode: NCGlobal.shared.errorUnauthorized401)
196+
let windowScene = SceneManager.shared.getWindowScene(controller: controller)
197+
await showErrorBanner(windowScene: windowScene, text: String(format: NSLocalizedString("_account_unauthorized_", comment: ""), account), errorCode: NCGlobal.shared.errorUnauthorized401)
198198

199199
let resultsWipe = await NextcloudKit.shared.getRemoteWipeStatusAsync(serverUrl: tblAccount.urlBase, token: token, account: account) { task in
200200
Task {

iOSClient/Activity/NCActivity.swift

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,11 @@ class NCActivity: UIViewController, NCSharePagingContent {
4444
}
4545
}
4646

47+
@MainActor
48+
internal var windowScene: UIWindowScene? {
49+
SceneManager.shared.getWindowScene(controller: self.tabBarController as? NCMainTabBarController)
50+
}
51+
4752
// MARK: - View Life Cycle
4853

4954
override func viewDidLoad() {
@@ -83,7 +88,9 @@ class NCActivity: UIViewController, NCSharePagingContent {
8388
self.loadComments()
8489
} else {
8590
Task {
86-
await showErrorBanner(controller: self.tabBarController, text: error.errorDescription, errorCode: error.errorCode)
91+
await showErrorBanner(windowScene: self.windowScene,
92+
text: error.errorDescription,
93+
errorCode: error.errorCode)
8794
}
8895
}
8996
}
@@ -424,7 +431,9 @@ extension NCActivity {
424431
self.database.addComments(comments, account: metadata.account, objectId: metadata.fileId)
425432
} else if error.errorCode != NCGlobal.shared.errorResourceNotFound {
426433
Task {
427-
await showErrorBanner(controller: self.tabBarController, text: error.errorDescription, errorCode: error.errorCode)
434+
await showErrorBanner(windowScene: self.windowScene,
435+
text: error.errorDescription,
436+
errorCode: error.errorCode)
428437
}
429438
}
430439

iOSClient/Activity/NCActivityTableViewCell.swift

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,9 @@ extension NCActivityTableViewCell: UICollectionViewDelegate {
8282
(responder as? UIViewController)!.navigationController?.pushViewController(viewController, animated: true)
8383
} else {
8484
Task {
85-
await showErrorBanner(controller: viewController.controller, text: "_trash_file_not_found_", errorCode: 0)
85+
await showErrorBanner(windowScene: viewController.windowScene,
86+
text: "_trash_file_not_found_",
87+
errorCode: NCGlobal.shared.errorInternalError)
8688
}
8789
}
8890
}

iOSClient/Assistant/Chat/NCAssistantChatModel.swift

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@
44

55
import NextcloudKit
66

7-
@Observable class NCAssistantChatModel {
7+
@MainActor
8+
@Observable
9+
class NCAssistantChatModel {
810
var messages: [AssistantChatMessage] = []
911
var isSending: Bool = false
1012
var isThinking: Bool = false
@@ -22,6 +24,9 @@ import NextcloudKit
2224

2325
@ObservationIgnored var controller: NCMainTabBarController?
2426
@ObservationIgnored private var chatMessageTaskId: Int?
27+
@ObservationIgnored var windowScene: UIWindowScene? {
28+
SceneManager.shared.getWindowScene(controller: controller)
29+
}
2530

2631
init(controller: NCMainTabBarController?, messages: [AssistantChatMessage] = []) {
2732
self.controller = controller
@@ -96,7 +101,7 @@ import NextcloudKit
96101
if result.error == .success {
97102
messages = result.chatMessages ?? []
98103
} else {
99-
await showErrorBanner(controller: controller, title: "_error_", text: "_assistant_error_load_messages_", errorCode: result.error.errorCode)
104+
await showErrorBanner(windowScene: windowScene, title: "_error_", text: "_assistant_error_load_messages_", errorCode: result.error.errorCode)
100105
}
101106
}
102107

@@ -107,7 +112,7 @@ import NextcloudKit
107112

108113
if result.error != .success {
109114
stopPolling()
110-
await showErrorBanner(controller: controller, title: "_error_", text: "_assistant_error_generate_response_", errorCode: result.error.errorCode)
115+
await showErrorBanner(windowScene: windowScene, title: "_error_", text: "_assistant_error_generate_response_", errorCode: result.error.errorCode)
111116
return
112117
}
113118

@@ -134,7 +139,7 @@ import NextcloudKit
134139
await generateChatSession()
135140
startPollingForResponse()
136141
} else {
137-
await showErrorBanner(controller: controller, title: "_error_", text: "_assistant_error_send_message_", errorCode: 20)
142+
await showErrorBanner(windowScene: windowScene, title: "_error_", text: "_assistant_error_send_message_", errorCode: NCGlobal.shared.errorInternalError)
138143
}
139144

140145
isSending = false

iOSClient/Data/NCManageDatabase+LayoutForView.swift

Lines changed: 21 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,15 @@ extension NCManageDatabase {
8989
})
9090
}
9191

92-
func getLayoutForView(account: String, key: String, serverUrl: String, layout: String? = nil) -> NCDBLayoutForView {
92+
func getLayoutForView(account: String, key: String, serverUrl: String, layoutType: String = NCGlobal.shared.layoutList) -> NCDBLayoutForView {
93+
var layoutForView = NCDBLayoutForView()
94+
defer {
95+
/* FORCED LAYOUT RECENT */
96+
if key == NCGlobal.shared.layoutViewRecent {
97+
layoutForView.sort = "date"
98+
layoutForView.ascending = false
99+
}
100+
}
93101
let keyStore = serverUrl.isEmpty ? key : serverUrl
94102
let index = account + " " + keyStore
95103

@@ -99,7 +107,8 @@ extension NCManageDatabase {
99107
.first
100108
.map { NCDBLayoutForView(value: $0) }
101109
}) {
102-
return layout
110+
layoutForView = layout
111+
return layoutForView
103112
}
104113

105114
let tblAccount = core.performRealmRead { realm in
@@ -134,7 +143,8 @@ extension NCManageDatabase {
134143
self.setLayoutForView(layoutForView: photosLayoutForView)
135144
}
136145

137-
return photosLayoutForView
146+
layoutForView = photosLayoutForView
147+
return layoutForView
138148

139149
} else if !serverUrl.isEmpty,
140150
let serverDirectoryUp = NCUtilityFileSystem().serverDirectoryUp(serverUrl: serverUrl, home: home) {
@@ -154,24 +164,22 @@ extension NCManageDatabase {
154164
self.setLayoutForView(layoutForView: previusLayoutForView)
155165
}
156166

157-
return previusLayoutForView
167+
layoutForView = previusLayoutForView
168+
return layoutForView
158169
}
159170
}
160171
}
161172

162-
// Standatd layout
163-
let layout = layout ?? NCGlobal.shared.layoutList
164173
DispatchQueue.global(qos: .utility).async {
165-
self.setLayoutForView(account: account, key: key, serverUrl: serverUrl, layout: layout)
174+
self.setLayoutForView(account: account, key: key, serverUrl: serverUrl, layout: layoutType)
166175
}
167176

168-
let placeholder = NCDBLayoutForView()
169-
placeholder.index = index
170-
placeholder.account = account
171-
placeholder.keyStore = keyStore
172-
placeholder.layout = layout
177+
layoutForView.index = index
178+
layoutForView.account = account
179+
layoutForView.keyStore = keyStore
180+
layoutForView.layout = layoutType
173181

174-
return placeholder
182+
return layoutForView
175183
}
176184

177185
func updatePhotoLayoutForView(account: String,

iOSClient/Data/NCManageDatabase+Metadata.swift

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -914,6 +914,21 @@ extension NCManageDatabase {
914914
}
915915
}
916916

917+
func getMetadatasAsync(predicate: NSPredicate,
918+
limit: Int? = nil) async -> [tableMetadata]? {
919+
return await core.performRealmReadAsync { realm in
920+
let results = realm.objects(tableMetadata.self)
921+
.filter(predicate)
922+
923+
if let limit {
924+
let sliced = results.prefix(limit)
925+
return sliced.map { $0.detachedCopy() }
926+
} else {
927+
return results.map { $0.detachedCopy() }
928+
}
929+
}
930+
}
931+
917932
func getMetadatas(predicate: NSPredicate,
918933
numItems: Int,
919934
sorted: String,

iOSClient/DeepLink/NCDeepLinkHandler.swift

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -140,9 +140,11 @@ class NCDeepLinkHandler {
140140
controller.selectedIndex = ControllerConstants.moreIndex
141141
guard let navigationController = controller.viewControllers?[controller.selectedIndex] as? UINavigationController else { return }
142142

143-
let settingsView = NCSettingsView(model: NCSettingsModel(controller: controller))
144-
let settingsController = UIHostingController(rootView: settingsView)
145-
navigationController.pushViewController(settingsController, animated: true)
143+
Task { @MainActor in
144+
let settingsView = NCSettingsView(model: NCSettingsModel(controller: controller))
145+
let settingsController = UIHostingController(rootView: settingsView)
146+
navigationController.pushViewController(settingsController, animated: true)
147+
}
146148
}
147149

148150
private func navigateToAutoUpload(controller: NCMainTabBarController) {

iOSClient/Extensions/UIViewController+Extension.swift

Lines changed: 4 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,11 @@
1-
//
2-
// UIViewController+Extension.swift
3-
// Nextcloud
4-
//
5-
// Created by Marino Faggiana on 02/08/2022.
6-
// Copyright © 2022 Marino Faggiana. All rights reserved.
7-
//
8-
// Author Marino Faggiana <marino.faggiana@nextcloud.com>
9-
//
10-
// This program is free software: you can redistribute it and/or modify
11-
// it under the terms of the GNU General Public License as published by
12-
// the Free Software Foundation, either version 3 of the License, or
13-
// (at your option) any later version.
14-
//
15-
// This program is distributed in the hope that it will be useful,
16-
// but WITHOUT ANY WARRANTY; without even the implied warranty of
17-
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18-
// GNU General Public License for more details.
19-
//
20-
// You should have received a copy of the GNU General Public License
21-
// along with this program. If not, see <http://www.gnu.org/licenses/>.
22-
//
1+
// SPDX-FileCopyrightText: Nextcloud GmbH
2+
// SPDX-FileCopyrightText: 2022-2026 Marino Faggiana
3+
// SPDX-License-Identifier: GPL-3.0-or-later
234

245
import Foundation
256
import UIKit
267
import MessageUI
27-
import NextcloudKit
8+
import LucidBanner
289

2910
extension UIViewController {
3011
// https://stackoverflow.com/questions/6131205/how-to-find-topmost-view-controller-on-ios

0 commit comments

Comments
 (0)