Skip to content

Commit aa2d354

Browse files
NMC 2172 - Dashboard theming customisation updated changes with 10.3.0 version
1 parent 5381b6d commit aa2d354

11 files changed

Lines changed: 1191 additions & 259 deletions

iOSClient/Files/NCFiles.swift

Lines changed: 43 additions & 144 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,14 @@ import RealmSwift
88
import SwiftUI
99

1010
class NCFiles: NCCollectionViewCommon {
11+
1112
internal var fileNameBlink: String?
1213
internal var fileNameOpen: String?
1314

1415
internal var lastOffsetY: CGFloat = 0
1516
internal var lastScrollTime: TimeInterval = 0
1617
internal var accumulatedScrollDown: CGFloat = 0
1718

18-
internal var syncMetadatasTask: Task<Void, Never>?
19-
2019
required init?(coder aDecoder: NSCoder) {
2120
super.init(coder: aDecoder)
2221

@@ -101,16 +100,19 @@ class NCFiles: NCCollectionViewCommon {
101100
super.viewWillAppear(animated)
102101

103102
Task {
104-
let capabilities = await database.getCapabilities(account: self.session.account) ?? NKCapabilities.Capabilities()
105-
await mainNavigationController?.createPlusMenu(session: self.session, capabilities: capabilities)
106-
107103
await self.reloadDataSource()
108104
}
109105
}
110106

111107
override func viewDidAppear(_ animated: Bool) {
112108
super.viewDidAppear(animated)
113109

110+
// Re-evaluate in-app messages after viewDidAppear
111+
MoEngageAnalytics.shared.displayInAppNotificationSafely(reason: "viewDidAppear")
112+
113+
// Preload hidden NCMedia so it's ready without being shown
114+
// NCMediaPreloader.shared.preloadIfNeeded()
115+
114116
if !self.dataSource.isEmpty() {
115117
self.blinkCell(fileName: self.fileNameBlink)
116118
self.openFile(fileName: self.fileNameOpen)
@@ -147,53 +149,10 @@ class NCFiles: NCCollectionViewCommon {
147149

148150
// MARK: - DataSource
149151

150-
override func reloadDataSource() {
151-
guard !isSearchingMode
152-
else {
153-
return super.reloadDataSource()
154-
}
155-
156-
// Watchdog: this is only a fail safe "dead lock", I don't think the timeout will ever be called but at least nothing gets stuck, if after 5 sec. (which is a long time in this routine), the semaphore is still locked
157-
//
158-
if self.semaphoreReloadDataSource.wait(timeout: .now() + 5) == .timedOut {
159-
self.semaphoreReloadDataSource.signal()
160-
}
161-
162-
var predicate = self.defaultPredicate
163-
let predicateDirectory = NSPredicate(format: "account == %@ AND serverUrl == %@", session.account, self.serverUrl)
164-
let dataSourceMetadatas = self.dataSource.getMetadatas()
165-
166-
if NCKeychain().getPersonalFilesOnly(account: session.account) {
167-
predicate = self.personalFilesOnlyPredicate
168-
}
169-
170-
self.metadataFolder = database.getMetadataFolder(session: session, serverUrl: self.serverUrl)
171-
self.richWorkspaceText = database.getTableDirectory(predicate: predicateDirectory)?.richWorkspace
172-
173-
let metadatas = self.database.getResultsMetadatasPredicate(predicate, layoutForView: layoutForView)
174-
self.dataSource = NCCollectionViewDataSource(metadatas: metadatas, layoutForView: layoutForView)
175-
176-
if metadatas.isEmpty {
177-
self.semaphoreReloadDataSource.signal()
178-
return super.reloadDataSource()
179-
}
180-
181-
self.dataSource.caching(metadatas: metadatas, dataSourceMetadatas: dataSourceMetadatas) {
182-
self.semaphoreReloadDataSource.signal()
183-
super.reloadDataSource()
184-
}
185-
}
186-
187-
override func getServerData(refresh: Bool = false) async {
188-
await super.getServerData()
189-
190-
defer {
191-
stopGUIGetServerData()
192-
startSyncMetadata(metadatas: self.dataSource.getMetadatas())
193-
}
194-
195-
Task {
196-
await networking.networkingTasks.cancel(identifier: "\(self.serverUrl)_NCFiles")
152+
override func reloadDataSource() async {
153+
guard !isSearchingMode else {
154+
await super.reloadDataSource()
155+
return
197156
}
198157

199158
self.metadataFolder = await self.database.getMetadataFolderAsync(session: self.session, serverUrl: self.serverUrl)
@@ -229,7 +188,7 @@ class NCFiles: NCCollectionViewCommon {
229188

230189
override func getServerData(forced: Bool = false) async {
231190
defer {
232-
restoreDefaultTitle()
191+
stopGUIGetServerData()
233192
startSyncMetadata(metadatas: self.dataSource.getMetadatas())
234193
}
235194

@@ -288,22 +247,30 @@ class NCFiles: NCCollectionViewCommon {
288247
self.collectionView.reloadData()
289248
}
290249
}
291-
guard resultsReadFile.error == .success, let metadata = resultsReadFile.metadata else {
292-
return (nil, resultsReadFile.error, false)
250+
guard resultsReadFile.error == .success,
251+
let metadata = resultsReadFile.metadata else {
252+
return(nil, resultsReadFile.error, reloadRequired)
293253
}
254+
let e2eEncrypted = metadata.e2eEncrypted
255+
let ocId = metadata.ocId
294256

295257
await self.database.updateDirectoryRichWorkspaceAsync(metadata.richWorkspace, account: resultsReadFile.account, serverUrl: serverUrl)
296258
let tableDirectory = await self.database.getTableDirectoryAsync(ocId: metadata.ocId)
297259

260+
// Verify LivePhoto
261+
//
262+
reloadRequired = await networking.setLivePhoto(account: resultsReadFile.account)
263+
await NCManageDatabase.shared.deleteLivePhotoError()
264+
298265
let shouldSkipUpdate: Bool = (
299-
!refresh &&
266+
!forced &&
300267
tableDirectory?.etag == metadata.etag &&
301268
!metadata.e2eEncrypted &&
302269
!self.dataSource.isEmpty()
303270
)
304271

305272
if shouldSkipUpdate {
306-
return (nil, NKError(), false)
273+
return (nil, NKError(), reloadRequired)
307274
}
308275

309276
startGUIGetServerData()
@@ -312,30 +279,40 @@ class NCFiles: NCCollectionViewCommon {
312279
let (account, metadataFolder, metadatas, error) = await NCNetworking.shared.readFolderAsync(serverUrl: serverUrl,
313280
account: session.account,
314281
options: options) { task in
315-
self.dataSourceTask = task
282+
Task {
283+
await NCNetworking.shared.networkingTasks.track(identifier: "\(self.serverUrl)_NCFiles", task: task)
284+
}
316285
if self.dataSource.isEmpty() {
317286
self.collectionView.reloadData()
318287
}
288+
}
319289

320290
guard error == .success else {
321-
return (nil, error, false)
291+
return(nil, error, reloadRequired)
322292
}
293+
reloadRequired = true
323294

324295
if let metadataFolder {
325296
self.metadataFolder = metadataFolder.detachedCopy()
326297
self.richWorkspaceText = metadataFolder.richWorkspace
327298
}
328299

329-
guard let metadataFolder,
330-
isDirectoryE2EE,
331-
NCKeychain().isEndToEndEnabled(account: account),
300+
//
301+
// E2EE section
302+
//
303+
304+
guard e2eEncrypted,
305+
let metadatas,
306+
!metadatas.isEmpty,
307+
NCPreferences().isEndToEndEnabled(account: account),
332308
await !NCNetworkingE2EE().isInUpload(account: account, serverUrl: serverUrl) else {
333-
return (metadatas, error, true)
309+
return(metadatas, error, reloadRequired)
334310
}
335311

336-
/// E2EE
337312
let lock = await self.database.getE2ETokenLockAsync(account: account, serverUrl: serverUrl)
338-
let results = await NCNetworkingE2EE().getMetadata(fileId: metadataFolder.ocId, e2eToken: lock?.e2eToken, account: account)
313+
if let e2eToken = lock?.e2eToken {
314+
nkLog(tag: self.global.logTagE2EE, message: "Tocken: \(e2eToken)", minimumLogLevel: .verbose)
315+
}
339316

340317
let results = await NCNetworkingE2EE().getMetadata(fileId: ocId, e2eToken: lock?.e2eToken, account: account)
341318

@@ -397,79 +374,6 @@ class NCFiles: NCCollectionViewCommon {
397374
}
398375
}
399376

400-
guard error == .success else {
401-
return(nil, error, reloadRequired)
402-
}
403-
reloadRequired = true
404-
405-
if let metadataFolder {
406-
self.metadataFolder = metadataFolder.detachedCopy()
407-
self.richWorkspaceText = metadataFolder.richWorkspace
408-
}
409-
410-
//
411-
// E2EE section
412-
//
413-
414-
guard e2eEncrypted,
415-
let metadatas,
416-
!metadatas.isEmpty,
417-
NCPreferences().isEndToEndEnabled(account: account),
418-
await !NCNetworkingE2EE().isInUpload(account: account, serverUrl: serverUrl) else {
419-
return(metadatas, error, reloadRequired)
420-
}
421-
422-
let lock = await self.database.getE2ETokenLockAsync(account: account, serverUrl: serverUrl)
423-
if let e2eToken = lock?.e2eToken {
424-
nkLog(tag: self.global.logTagE2EE, message: "Tocken: \(e2eToken)", minimumLogLevel: .verbose)
425-
}
426-
427-
let results = await NCNetworkingE2EE().getMetadata(fileId: ocId, e2eToken: lock?.e2eToken, account: account)
428-
429-
nkLog(tag: self.global.logTagE2EE, message: "Get metadata with error: \(results.error.errorCode)")
430-
nkLog(tag: self.global.logTagE2EE, message: "Get metadata with metadata: \(results.e2eMetadata ?? ""), signature: \(results.signature ?? ""), version \(results.version ?? "")", minimumLogLevel: .verbose)
431-
432-
guard results.error == .success,
433-
let e2eMetadata = results.e2eMetadata,
434-
let version = results.version else {
435-
436-
// No metadata fount, re-send it
437-
if results.error.errorCode == NCGlobal.shared.errorResourceNotFound {
438-
NCContentPresenter().showInfo(description: "Metadata not found")
439-
let error = await NCNetworkingE2EE().uploadMetadata(serverUrl: serverUrl, account: account)
440-
if error != .success {
441-
NCContentPresenter().showError(error: error)
442-
}
443-
} else {
444-
// show error
445-
NCContentPresenter().showError(error: results.error)
446-
}
447-
448-
return(metadatas, error, reloadRequired)
449-
}
450-
451-
let errorDecodeMetadata = await NCEndToEndMetadata().decodeMetadata(e2eMetadata, signature: results.signature, serverUrl: serverUrl, session: self.session)
452-
nkLog(debug: "Decode e2ee metadata with error: \(errorDecodeMetadata.errorCode)")
453-
454-
if errorDecodeMetadata == .success {
455-
let capabilities = await NKCapabilities.shared.getCapabilities(for: self.session.account)
456-
if version == "v1", capabilities.e2EEApiVersion == NCGlobal.shared.e2eeVersionV20 {
457-
NCContentPresenter().showInfo(description: "Conversion metadata v1 to v2 required, please wait...")
458-
nkLog(tag: self.global.logTagE2EE, message: "Conversion v1 to v2")
459-
NCActivityIndicator.shared.start()
460-
461-
let error = await NCNetworkingE2EE().uploadMetadata(serverUrl: serverUrl, updateVersionV1V2: true, account: account)
462-
if error != .success {
463-
NCContentPresenter().showError(error: error)
464-
}
465-
NCActivityIndicator.shared.stop()
466-
}
467-
} else {
468-
// Client Diagnostic
469-
await self.database.addDiagnosticAsync(account: account, issue: NCGlobal.shared.diagnosticIssueE2eeErrors)
470-
NCContentPresenter().showError(error: error)
471-
}
472-
473377
return (metadatas, error, reloadRequired)
474378
}
475379

@@ -518,12 +422,6 @@ class NCFiles: NCCollectionViewCommon {
518422
navigationController = UIStoryboard(name: "NCIntro", bundle: nil).instantiateInitialViewController() as? UINavigationController
519423
}
520424

521-
UIApplication.shared.firstWindow?.rootViewController = navigationController
522-
} else if let account = tblAccount?.account, account != currentAccount {
523-
Task {
524-
await NCAccount().changeAccount(account, userProfile: nil, controller: controller)
525-
}
526-
527425
UIApplication.shared.mainAppWindow?.rootViewController = navigationController
528426
} else if let account = tblAccount?.account, account != currentAccount {
529427
Task {
@@ -539,3 +437,4 @@ class NCFiles: NCCollectionViewCommon {
539437
}
540438
}
541439
}
440+

iOSClient/Main/Collection Common/Cell/NCGridCell.swift

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,12 @@ class NCGridCell: UICollectionViewCell, UIGestureRecognizerDelegate, NCCellMainP
163163
}
164164

165165
func selected(_ status: Bool, isEditMode: Bool, color: UIColor) {
166+
// E2EE - remove encrypt folder selection
167+
if let metadata = NCManageDatabase.shared.getMetadataFromOcId(self.metadata?.ocId), metadata.e2eEncrypted {
168+
imageSelect.isHidden = true
169+
} else {
170+
imageSelect.isHidden = isEditMode ? false : true
171+
}
166172
if isEditMode {
167173
buttonMore.isHidden = true
168174
accessibilityCustomActions = nil
@@ -173,6 +179,14 @@ class NCGridCell: UICollectionViewCell, UIGestureRecognizerDelegate, NCCellMainP
173179
imageVisualEffect.alpha = status ? 1 : 0
174180
imageSelect.alpha = status ? 1 : 0
175181
imageSelect.image = NCImageCache.shared.getImageCheckedYes(color: color)
182+
// if status {
183+
// imageSelect.image = NCImageCache.shared.getImageCheckedYes()
184+
// imageVisualEffect.isHidden = false
185+
// } else {
186+
// imageSelect.image = NCImageCache.shared.getImageCheckedNo()
187+
// backgroundView = nil
188+
// imageVisualEffect.isHidden = true
189+
// }
176190
}
177191

178192
func writeInfoDateSize(date: NSDate, size: Int64) {
@@ -189,6 +203,14 @@ class NCGridCell: UICollectionViewCell, UIGestureRecognizerDelegate, NCCellMainP
189203
accessibilityLabel = label
190204
accessibilityValue = value
191205
}
206+
207+
func setIconOutlines() {
208+
if imageStatus.image != nil {
209+
imageStatus.makeCircularBackground(withColor: .systemBackground)
210+
} else {
211+
imageStatus.backgroundColor = .clear
212+
}
213+
}
192214
}
193215

194216
// MARK: - Grid Layout

iOSClient/Main/Collection Common/Cell/NCPhotoCell.swift

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,10 +45,45 @@ class NCPhotoCell: UICollectionViewCell, UIGestureRecognizerDelegate, NCCellMain
4545
return nil
4646
}
4747

48+
@objc private func handleTapObserver(_ g: UITapGestureRecognizer) {
49+
let location = g.location(in: contentView)
50+
51+
if buttonMore.frame.contains(location) {
52+
delegate?.onMenuIntent(with: metadata)
53+
}
54+
}
55+
56+
func setButtonMore(image: UIImage) {
57+
buttonMore.setImage(image, for: .normal)
58+
}
59+
60+
func hideButtonMore(_ status: Bool) {
61+
// buttonMore.isHidden = status NO MORE USED
62+
}
63+
64+
func hideImageStatus(_ status: Bool) {
65+
imageStatus.isHidden = status
66+
}
67+
4868
func selected(_ status: Bool, isEditMode: Bool, color: UIColor) {
4969
imageVisualEffect.alpha = status ? 1 : 0
5070
imageSelect.alpha = status ? 1 : 0
5171
imageSelect.image = NCImageCache.shared.getImageCheckedYes(color: color)
72+
// E2EE - remove encrypt folder selection
73+
if let metadata = NCManageDatabase.shared.getMetadataFromOcId(self.metadata?.ocId), metadata.e2eEncrypted {
74+
imageSelect.isHidden = true
75+
} else {
76+
imageSelect.isHidden = isEditMode ? false : true
77+
}
78+
if status {
79+
// imageSelect.isHidden = false
80+
imageVisualEffect.isHidden = false
81+
imageSelect.image = NCImageCache.shared.getImageCheckedYes()
82+
} else {
83+
// imageSelect.isHidden = true
84+
imageVisualEffect.isHidden = true
85+
imageSelect.image = NCImageCache.shared.getImageCheckedNo()
86+
}
5287
}
5388

5489
func setAccessibility(label: String, value: String) {

0 commit comments

Comments
 (0)