marinofaggiana 4 ani în urmă
părinte
comite
ab08891f36

+ 1 - 1
iOSClient/CCGlobal.h

@@ -84,7 +84,7 @@
 
 // Database Realm
 #define k_databaseDefault                               @"nextcloud.realm"
-#define k_databaseSchemaVersion                         116
+#define k_databaseSchemaVersion                         117
 
 // Intro selector
 #define k_intro_login                                   0

+ 1 - 0
iOSClient/Database/NCDatabase.swift

@@ -49,6 +49,7 @@ class tableAccount: Object {
     @objc dynamic var country = ""
     @objc dynamic var displayName = ""
     @objc dynamic var dateUpdateMedia: NSDate? = nil
+    @objc dynamic var dateLteMedia: NSDate? = nil
     @objc dynamic var email = ""
     @objc dynamic var enabled: Bool = false
     @objc dynamic var groups = ""

+ 21 - 14
iOSClient/Database/NCManageDatabase.swift

@@ -672,14 +672,33 @@ class NCManageDatabase: NSObject {
     }
     #endif
     
-    @objc func setAccountDateUpdateMedia() {
+    @objc func setAccountDateUpdateMedia(clear: Bool = false) {
         
         let realm = try! Realm()
 
         do {
             try realm.write {
                 if let result = realm.objects(tableAccount.self).filter("active == true").first {
+                    if clear {
+                        result.dateUpdateMedia = nil
+                    } else {
                         result.dateUpdateMedia = Date() as NSDate
+                    }
+                }
+            }
+        } catch let error {
+            print("[LOG] Could not write to database: ", error)
+        }
+    }
+    
+    @objc func setAccountDateLteMedia(date: NSDate?) {
+        
+        let realm = try! Realm()
+
+        do {
+            try realm.write {
+                if let result = realm.objects(tableAccount.self).filter("active == true").first {
+                    result.dateLteMedia = date
                 }
             }
         } catch let error {
@@ -2442,19 +2461,7 @@ class NCManageDatabase: NSObject {
         
         return(isDifferent, newInsert)
     }
-    
-    @objc func getMetadataMediaDate(account: String, order: ComparisonResult) -> Date {
-        
-        let realm = try! Realm()
-        realm.refresh()
-        
-        if let entities = realm.objects(tableMetadata.self).filter("account == %@ AND (typeFile == %@ OR typeFile == %@ OR typeFile == %@)", account, k_metadataTypeFile_image, k_metadataTypeFile_video, k_metadataTypeFile_audio).max(by: { $0.date.compare($1.date as Date) == order }) {
-            return Calendar.current.date(bySettingHour: 0, minute: 0, second: 0, of: entities.date as Date)!
-        }
-        
-        return Calendar.current.date(bySettingHour: 0, minute: 0, second: 0, of: Date())!
-    }
-    
+
     //MARK: -
     //MARK: Table Photo Library
     

+ 60 - 185
iOSClient/Media/NCMedia.swift

@@ -59,7 +59,7 @@ class NCMedia: UIViewController, DropdownMenuDelegate, DZNEmptyDataSetSource, DZ
 
     private let refreshControl = UIRefreshControl()
     private var loadingSearch = false
-
+    
     struct cacheImages {
         static var cellPlayImage = UIImage()
         static var cellFavouriteImage = UIImage()
@@ -172,7 +172,7 @@ class NCMedia: UIViewController, DropdownMenuDelegate, DZNEmptyDataSetSource, DZ
         // Configure Refresh Control
         refreshControl.tintColor = .lightGray
         refreshControl.backgroundColor = NCBrandColor.sharedInstance.backgroundView
-        refreshControl.addTarget(self, action: #selector(loadNetworkDatasource), for: .valueChanged)
+        refreshControl.addTarget(self, action: #selector(searchNewPhotoVideo), for: .valueChanged)
         
         // get auto upload folder
         autoUploadFileName = NCManageDatabase.sharedInstance.getAccountAutoUploadFileName()
@@ -186,10 +186,6 @@ class NCMedia: UIViewController, DropdownMenuDelegate, DZNEmptyDataSetSource, DZ
         super.viewDidAppear(animated)
         
         searchNewPhotoVideo()
-        
-        reloadDataThenPerform {
-            self.selectSearchSections()
-        }
     }
     
     override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
@@ -219,7 +215,7 @@ class NCMedia: UIViewController, DropdownMenuDelegate, DZNEmptyDataSetSource, DZ
                 
                 if errorCode == 0 && (metadata.typeFile == k_metadataTypeFile_image || metadata.typeFile == k_metadataTypeFile_video || metadata.typeFile == k_metadataTypeFile_audio) {
                     
-                    self.reloadDataSource(loadNetworkDatasource: false) {
+                    self.reloadDataSource() {
                     
                         let userInfo: [String : Any] = ["metadata": metadata, "type": "delete"]
                         NotificationCenter.default.post(name: Notification.Name.init(rawValue: k_notificationCenter_synchronizationMedia), object: nil, userInfo: userInfo)
@@ -235,7 +231,7 @@ class NCMedia: UIViewController, DropdownMenuDelegate, DZNEmptyDataSetSource, DZ
                 
                 if errorCode == 0 && (metadata.typeFile == k_metadataTypeFile_image || metadata.typeFile == k_metadataTypeFile_video || metadata.typeFile == k_metadataTypeFile_audio) {
                     
-                    self.reloadDataSource(loadNetworkDatasource: false) {
+                    self.reloadDataSource() {
                     
                         let userInfo: [String : Any] = ["metadata": metadata, "metadataNew": metadataNew, "type": "move"]
                         NotificationCenter.default.post(name: Notification.Name.init(rawValue: k_notificationCenter_synchronizationMedia), object: nil, userInfo: userInfo)
@@ -251,7 +247,7 @@ class NCMedia: UIViewController, DropdownMenuDelegate, DZNEmptyDataSetSource, DZ
                 
                 if errorCode == 0 && (metadata.typeFile == k_metadataTypeFile_image || metadata.typeFile == k_metadataTypeFile_video || metadata.typeFile == k_metadataTypeFile_audio) {
                     
-                    self.reloadDataSource(loadNetworkDatasource: false) {
+                    self.reloadDataSource() {
                     
                         let userInfo: [String : Any] = ["metadata": metadata, "type": "rename"]
                         NotificationCenter.default.post(name: Notification.Name.init(rawValue: k_notificationCenter_synchronizationMedia), object: nil, userInfo: userInfo)
@@ -329,7 +325,7 @@ class NCMedia: UIViewController, DropdownMenuDelegate, DZNEmptyDataSetSource, DZ
                     icon: CCGraphics.changeThemingColorImage(UIImage(named: filterTypeFileImage ? "imageno" : "imageyes"), width: 50, height: 50, color: NCBrandColor.sharedInstance.icon),
                     action: { menuAction in
                         self.filterTypeFileImage = !self.filterTypeFileImage
-                        self.reloadDataSource(loadNetworkDatasource: false) { }
+                        self.reloadDataSource() { }
                     }
                 )
             )
@@ -340,7 +336,7 @@ class NCMedia: UIViewController, DropdownMenuDelegate, DZNEmptyDataSetSource, DZ
                     icon: CCGraphics.changeThemingColorImage(UIImage(named: filterTypeFileVideo ? "videono" : "videoyes"), width: 50, height: 50, color: NCBrandColor.sharedInstance.icon),
                     action: { menuAction in
                         self.filterTypeFileVideo = !self.filterTypeFileVideo
-                        self.reloadDataSource(loadNetworkDatasource: false) { }
+                        self.reloadDataSource() { }
                     }
                 )
             )
@@ -586,7 +582,7 @@ extension NCMedia: UICollectionViewDelegateFlowLayout {
 
 extension NCMedia {
 
-    public func reloadDataSource(loadNetworkDatasource: Bool, completion: @escaping ()->()) {
+    public func reloadDataSource(completion: @escaping ()->()) {
         
         if (appDelegate.activeAccount == nil || appDelegate.activeAccount.count == 0 || appDelegate.maintenanceMode == true) {
             return
@@ -598,218 +594,92 @@ extension NCMedia {
             self.sectionDatasource = CCSectionMetadata.creataDataSourseSectionMetadata(metadatas, listProgressMetadata: nil, groupByField: "date", filterTypeFileImage: self.filterTypeFileImage, filterTypeFileVideo: self.filterTypeFileVideo, filterLivePhoto: true, sorted: "date", ascending: false, activeAccount: self.appDelegate.activeAccount)
             
             DispatchQueue.main.async {
-                
                 self.collectionView?.reloadData()
                 
-                if loadNetworkDatasource {
-                    self.loadNetworkDatasource()
-                }
-                
-                self.reloadDataThenPerform {
-                    self.downloadThumbnail()
-                }
-                
                 completion()
             }
         }
     }
     
-    func deleteItems() {
-        
-        self.isEditMode = false
-        
-        if (appDelegate.activeAccount == nil || appDelegate.activeAccount.count == 0 || appDelegate.maintenanceMode == true) {
-            return
-        }
-        
-        // copy in arrayDeleteMetadata
-        for ocId in selectocId {
-            if let metadata = NCManageDatabase.sharedInstance.getMetadata(predicate: NSPredicate(format: "ocId == %@", ocId)) {
-                appDelegate.arrayDeleteMetadata.add(metadata)
-            }
-        }
-        if let metadata = appDelegate.arrayDeleteMetadata.firstObject {
-            appDelegate.arrayDeleteMetadata.removeObject(at: 0)
-            NCNetworking.shared.deleteMetadata(metadata as! tableMetadata, account: appDelegate.activeAccount, url: appDelegate.activeUrl) { (errorCode, errorDescription) in }
-        }
-    }
-    
-    func searchNewPhotoVideo() {
+    @objc func searchNewPhotoVideo() {
         
         let tableAccount = NCManageDatabase.sharedInstance.getAccountActive()
-        let fromDate = tableAccount?.dateUpdateMedia
-        if fromDate == nil { NCManageDatabase.sharedInstance.setAccountDateUpdateMedia() }
         
         //let elementDate = "nc:upload_time/"
         //let lteDate: Int = Int(Date().timeIntervalSince1970)
         //let gteDate: Int = Int(fromDate!.timeIntervalSince1970)
         
         guard let lteDate = Calendar.current.date(byAdding: .day, value: 1, to: Date()) else { return }
-        let gteDate = fromDate!
+        guard var gteDate = Calendar.current.date(byAdding: .day, value: -30, to: Date()) else { return }
         
-        let elementDate = "d:getlastmodified/"
-
-        NCCommunication.shared.searchMedia(lteDate: lteDate, gteDate: gteDate, elementDate: elementDate ,showHiddenFiles: CCUtility.getShowHiddenFiles(), user: appDelegate.activeUser) { (account, files, errorCode, errorDescription) in
+        if let date = tableAccount?.dateUpdateMedia {
+            gteDate = date as Date
+        }
+        
+        NCCommunication.shared.searchMedia(lteDate: lteDate, gteDate: gteDate, elementDate: "d:getlastmodified/" ,showHiddenFiles: CCUtility.getShowHiddenFiles(), user: appDelegate.activeUser) { (account, files, errorCode, errorDescription) in
             if errorCode == 0 && files != nil && files!.count > 0 {
                 NCManageDatabase.sharedInstance.addMetadatas(files: files, account: self.appDelegate.activeAccount)
+                NCManageDatabase.sharedInstance.setAccountDateLteMedia(date: files?.last?.date)
                 NCManageDatabase.sharedInstance.setAccountDateUpdateMedia()
             }
-            self.reloadDataSource(loadNetworkDatasource: false) {}
+            self.refreshControl.endRefreshing()
+            self.reloadDataSource() {}
         }
     }
     
-    func search(lteDate: Date, gteDate: Date, addPast: Bool, insertPrevius: Int,setDistantPast: Bool, debug: String) {
-        
-        // ----- DEBUG -----
-        #if DEBUG
-        let dateFormatter = DateFormatter()
-        dateFormatter.dateFormat = "dd-MM-yyyy HH:mm"
-        print("[LOG] Search: addPast \(addPast), distantPass: \(setDistantPast), Lte: " + dateFormatter.string(from: lteDate) + " - Gte: " + dateFormatter.string(from: gteDate) + " DEBUG: " + debug)
-        #endif
-        // -----------------
+    private func searchOldPhotoVideo(gteDate: Date? = nil) {
         
-        if (appDelegate.activeAccount == nil || appDelegate.activeAccount.count == 0 || appDelegate.maintenanceMode == true) {
-            return
+        var lteDate = Date()
+        let tableAccount = NCManageDatabase.sharedInstance.getAccountActive()
+        if let date = tableAccount?.dateLteMedia {
+            lteDate = date as Date
         }
+
+        let height = self.tabBarController?.tabBar.frame.size.height ?? 0
+        NCUtility.sharedInstance.startActivityIndicator(view: self.view, bottom: height + 50)
         
-        if addPast && loadingSearch {
-            return
-        }
         
-        if setDistantPast {
-            isDistantPast = true
+        var gteDate = gteDate
+        if gteDate == nil {
+            gteDate = Calendar.current.date(byAdding: .day, value: -30, to: lteDate)
         }
-        
-        if addPast {
-            DispatchQueue.main.async {
-                let height = self.tabBarController?.tabBar.frame.size.height ?? 0
-                NCUtility.sharedInstance.startActivityIndicator(view: self.view, bottom: height + 50)
-            }
-        }
-        loadingSearch = true
-        
-        let elementDate = "d:getlastmodified/"
-        
-        NCCommunication.shared.searchMedia(lteDate: lteDate, gteDate: gteDate, elementDate: elementDate ,showHiddenFiles: CCUtility.getShowHiddenFiles(), user: appDelegate.activeUser) { (account, files, errorCode, errorDescription) in
-            
-            self.refreshControl.endRefreshing()
-            NCUtility.sharedInstance.stopActivityIndicator()
-            
-            if errorCode == 0 && account == self.appDelegate.activeAccount && files != nil {
-                                    
-                var isDifferent: Bool = false
-                var newInsert: Int = 0
-            
-                DispatchQueue.global().async {
-                    
-                    NCManageDatabase.sharedInstance.convertNCCommunicationFilesToMetadatas(files!, useMetadataFolder: false, account: account) { (metadataFolder, metadatasFolder, metadatas) in
-                        
-                        let totalDistance = Calendar.current.dateComponents([Calendar.Component.day], from: gteDate, to: lteDate).value(for: .day) ?? 0
-                        let difference = NCManageDatabase.sharedInstance.updateMetadatasMedia(metadatas, lteDate: lteDate, gteDate: gteDate, account: account)
-                        isDifferent = difference.isDifferent
-                        newInsert = difference.newInsert
-                        
-                        self.loadingSearch = false
-
-                        print("[LOG] Search: Totale Distance \(totalDistance) - It's Different \(isDifferent) - New insert \(newInsert)")
-
-                        if isDifferent {
-                            DispatchQueue.main.async {
-                                self.reloadDataSource(loadNetworkDatasource: false) { }
-                            }
-                        }
-                        
-                        if (isDifferent == false || newInsert+insertPrevius < 100) && addPast && setDistantPast == false {
-                            
-                            switch totalDistance {
-                            case 0...89:
-                                if var gteDate90 = Calendar.current.date(byAdding: .day, value: -90, to: gteDate) {
-                                    gteDate90 = Calendar.current.date(bySettingHour: 0, minute: 0, second: 0, of: gteDate90) ?? Date()
-                                    self.search(lteDate: lteDate, gteDate: gteDate90, addPast: addPast, insertPrevius: newInsert+insertPrevius, setDistantPast: false, debug: "search recursive -90 gg")
-                                }
-                            case 90...179:
-                                if var gteDate180 = Calendar.current.date(byAdding: .day, value: -180, to: gteDate) {
-                                    gteDate180 = Calendar.current.date(bySettingHour: 0, minute: 0, second: 0, of: gteDate180) ?? Date()
-                                    self.search(lteDate: lteDate, gteDate: gteDate180, addPast: addPast, insertPrevius: newInsert+insertPrevius, setDistantPast: false, debug: "search recursive -180 gg")
-                                }
-                            case 180...364:
-                                if var gteDate365 = Calendar.current.date(byAdding: .day, value: -365, to: gteDate) {
-                                    gteDate365 = Calendar.current.date(bySettingHour: 0, minute: 0, second: 0, of: gteDate365) ?? Date()
-                                    self.search(lteDate: lteDate, gteDate: gteDate365, addPast: addPast, insertPrevius: newInsert+insertPrevius, setDistantPast: false, debug: "search recursive -365 gg")
-                                }
-                            default:
-                                self.search(lteDate: lteDate, gteDate: NSDate.distantPast, addPast: addPast, insertPrevius: newInsert+insertPrevius, setDistantPast: true, debug: "search recursive distant pass")
-                            }
-                        }
-                        
-//                        DispatchQueue.main.async {
-//                            self.reloadDataThenPerform {}
-//                        }
+
+        NCCommunication.shared.searchMedia(lteDate: lteDate, gteDate: gteDate!, elementDate: "d:getlastmodified/" ,showHiddenFiles: CCUtility.getShowHiddenFiles(), user: appDelegate.activeUser) { (account, files, errorCode, errorDescription) in
+            if errorCode == 0 {
+                if files != nil && files!.count > 0 {
+                    NCManageDatabase.sharedInstance.addMetadatas(files: files, account: self.appDelegate.activeAccount)
+                    NCManageDatabase.sharedInstance.setAccountDateLteMedia(date: files?.last?.date)
+                    NCManageDatabase.sharedInstance.setAccountDateUpdateMedia()
+                    self.reloadDataSource() {}
+                } else {
+                    if gteDate == Calendar.current.date(byAdding: .day, value: -30, to: lteDate) {
+                        self.searchOldPhotoVideo(gteDate: Calendar.current.date(byAdding: .day, value: -90, to: lteDate))
+                    } else if gteDate == Calendar.current.date(byAdding: .day, value: -90, to: lteDate) {
+                        self.searchOldPhotoVideo(gteDate: Date.distantPast)
                     }
                 }
-             
-            } else {
-                
-                self.loadingSearch = false
-                
-                self.reloadDataSource(loadNetworkDatasource: false) { }
             }
+            NCUtility.sharedInstance.stopActivityIndicator()
         }
     }
     
-    @objc private func loadNetworkDatasource() {
-        
-        isDistantPast = false
-        
-        if (appDelegate.activeAccount == nil || appDelegate.activeAccount.count == 0 || appDelegate.maintenanceMode == true) {
-            return
-        }
-        
-        if sectionDatasource.allRecordsDataSource.count == 0 {
-            
-            let gteDate = Calendar.current.date(byAdding: .day, value: -30, to: Date())
-            search(lteDate: Date(), gteDate: gteDate!, addPast: true, insertPrevius: 0, setDistantPast: false, debug: "search (add past) today, -30 gg")
-            
-        } else {
-            
-            let gteDate = NCManageDatabase.sharedInstance.getMetadataMediaDate(account: self.appDelegate.activeAccount, order: .orderedAscending)
-            search(lteDate: Date(), gteDate: gteDate, addPast: false, insertPrevius: 0, setDistantPast: false, debug: "search today, first date record")
-        }
+    func deleteItems() {
         
-        reloadDataThenPerform {
-        }
-    }
-    
-    private func selectSearchSections() {
+        self.isEditMode = false
         
         if (appDelegate.activeAccount == nil || appDelegate.activeAccount.count == 0 || appDelegate.maintenanceMode == true) {
             return
         }
         
-        let sections = NSMutableSet()
-        let lastDate = NCManageDatabase.sharedInstance.getMetadataMediaDate(account: self.appDelegate.activeAccount, order: .orderedDescending)
-        var gteDate: Date?
-        
-        for item in collectionView.indexPathsForVisibleItems {
-            if let metadata = NCMainCommon.sharedInstance.getMetadataFromSectionDataSourceIndexPath(item, sectionDataSource: sectionDatasource) {
-                if let date = Calendar.current.date(bySettingHour: 0, minute: 0, second: 0, of: metadata.date as Date) {
-                    sections.add(date)
-                }
+        // copy in arrayDeleteMetadata
+        for ocId in selectocId {
+            if let metadata = NCManageDatabase.sharedInstance.getMetadata(predicate: NSPredicate(format: "ocId == %@", ocId)) {
+                appDelegate.arrayDeleteMetadata.add(metadata)
             }
         }
-        let sortedSections = sections.sorted { (date1, date2) -> Bool in
-            (date1 as! Date).compare(date2 as! Date) == .orderedDescending
-        }
-        
-        if sortedSections.count >= 1 {
-            let lteDate = Calendar.current.date(byAdding: .day, value: 1, to: sortedSections.first as! Date)!
-            if lastDate == sortedSections.last as! Date {
-                gteDate = Calendar.current.date(byAdding: .day, value: -30, to: sortedSections.last as! Date)!
-                search(lteDate: lteDate, gteDate: gteDate!, addPast: true, insertPrevius: 0, setDistantPast: false, debug: "search (add past) last record, -30 gg")
-            } else {
-                gteDate = Calendar.current.date(byAdding: .day, value: -1, to: sortedSections.last as! Date)!
-                search(lteDate: lteDate, gteDate: gteDate!, addPast: false, insertPrevius: 0, setDistantPast: false, debug: "search [refresh window]")
-            }
+        if let metadata = appDelegate.arrayDeleteMetadata.firstObject {
+            appDelegate.arrayDeleteMetadata.removeObject(at: 0)
+            NCNetworking.shared.deleteMetadata(metadata as! tableMetadata, account: appDelegate.activeAccount, url: appDelegate.activeUrl) { (errorCode, errorDescription) in }
         }
     }
     
@@ -825,7 +695,6 @@ extension NCMedia {
     }
     
     private func removeDeletedFile() {
-        return;
         guard let collectionView = self.collectionView else { return }
         DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
             for item in collectionView.indexPathsForVisibleItems {
@@ -848,13 +717,19 @@ extension NCMedia: UIScrollViewDelegate {
     
     func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) {
         if !decelerate {
-            selectSearchSections()
             self.removeDeletedFile()
+            
+            if (scrollView.contentOffset.y >= (scrollView.contentSize.height - scrollView.frame.size.height)) {
+                searchOldPhotoVideo()
+            }
         }
     }
     
     func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
-        selectSearchSections()
         self.removeDeletedFile()
+        
+        if (scrollView.contentOffset.y >= (scrollView.contentSize.height - scrollView.frame.size.height)) {
+            searchOldPhotoVideo()
+        }
     }
 }

+ 2 - 0
iOSClient/Settings/CCAdvanced.m

@@ -237,6 +237,8 @@
     [KTVHTTPCache cacheDeleteAllCaches];
     
     [[NCManageDatabase sharedInstance] clearDatabaseWithAccount:appDelegate.activeAccount removeAccount:false];
+    [[NCManageDatabase sharedInstance] setAccountDateUpdateMediaWithClear:true];
+    [[NCManageDatabase sharedInstance] setAccountDateLteMediaWithDate:nil];
     
     [CCUtility removeGroupDirectoryProviderStorage];
     [CCUtility removeGroupLibraryDirectory];