@@ -8,15 +8,14 @@ import RealmSwift
88import SwiftUI
99
1010class 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+
0 commit comments