Ver Fonte

Media detail view improvements (#2579)

* WIP

Signed-off-by: Milen Pivchev <milen.pivchev@gmail.com>

* WIP

Signed-off-by: Milen Pivchev <milen.pivchev@gmail.com>

* Save location in DB

Signed-off-by: Milen Pivchev <milen.pivchev@gmail.com>

* Show detail view on orientation change

Signed-off-by: Milen Pivchev <milen.pivchev@gmail.com>

* Remove comments

Signed-off-by: Milen Pivchev <milen.pivchev@gmail.com>

* WIP

Signed-off-by: Milen Pivchev <milen.pivchev@gmail.com>

* Fixes

Signed-off-by: Milen Pivchev <milen.pivchev@gmail.com>

* fix

Signed-off-by: Marino Faggiana <marino@marinofaggiana.com>

* fix

Signed-off-by: Marino Faggiana <marino@marinofaggiana.com>

---------

Signed-off-by: Milen Pivchev <milen.pivchev@gmail.com>
Signed-off-by: Marino Faggiana <marino@marinofaggiana.com>
Co-authored-by: Marino Faggiana <marino@marinofaggiana.com>
Milen Pivchev há 1 ano atrás
pai
commit
c3bc1d3dcb

+ 1 - 1
Brand/Database.swift

@@ -26,4 +26,4 @@ import Foundation
 // Database Realm
 //
 let databaseName                    = "nextcloud.realm"
-let databaseSchemaVersion: UInt64   = 311
+let databaseSchemaVersion: UInt64   = 312

+ 2 - 8
iOSClient/Data/NCDatabase.swift

@@ -84,15 +84,9 @@ class tableExternalSites: Object {
 }
 
 class tableGPS: Object {
-
-    @objc dynamic var latitude = ""
+    @objc dynamic var latitude: Double = 0
+    @objc dynamic var longitude: Double = 0
     @objc dynamic var location = ""
-    @objc dynamic var longitude = ""
-    @objc dynamic var placemarkAdministrativeArea = ""
-    @objc dynamic var placemarkCountry = ""
-    @objc dynamic var placemarkLocality = ""
-    @objc dynamic var placemarkPostalCode = ""
-    @objc dynamic var placemarkThoroughfare = ""
 }
 
 class tablePhotoLibrary: Object {

+ 3 - 8
iOSClient/Data/NCManageDatabase.swift

@@ -440,21 +440,17 @@ class NCManageDatabase: NSObject {
     // MARK: -
     // MARK: Table GPS
 
-    @objc func addGeocoderLocation(_ location: String, placemarkAdministrativeArea: String, placemarkCountry: String, placemarkLocality: String, placemarkPostalCode: String, placemarkThoroughfare: String, latitude: String, longitude: String) {
+    @objc func addGeocoderLocation(_ location: String, latitude: Double, longitude: Double) {
 
         do {
             let realm = try Realm()
+            realm.refresh()
             guard realm.objects(tableGPS.self).filter("latitude == %@ AND longitude == %@", latitude, longitude).first == nil else { return }
             try realm.write {
                 let addObject = tableGPS()
                 addObject.latitude = latitude
                 addObject.location = location
                 addObject.longitude = longitude
-                addObject.placemarkAdministrativeArea = placemarkAdministrativeArea
-                addObject.placemarkCountry = placemarkCountry
-                addObject.placemarkLocality = placemarkLocality
-                addObject.placemarkPostalCode = placemarkPostalCode
-                addObject.placemarkThoroughfare = placemarkThoroughfare
                 realm.add(addObject)
             }
         } catch let error as NSError {
@@ -462,8 +458,7 @@ class NCManageDatabase: NSObject {
         }
     }
 
-    @objc func getLocationFromGeoLatitude(_ latitude: String, longitude: String) -> String? {
-
+    @objc func getLocationFromLatAndLong(latitude: Double, longitude: Double) -> String? {
         do {
             let realm = try Realm()
             realm.refresh()

+ 12 - 5
iOSClient/Utility/NCUtility.swift

@@ -839,12 +839,19 @@ class NCUtility: NSObject {
         let geocoder = CLGeocoder()
         let llocation = CLLocation(latitude: latitude, longitude: longitude)
 
-        geocoder.reverseGeocodeLocation(llocation) { placemarks, error in
-            if error == nil, let placemark = placemarks?.first {
-                let locationComponents: [String] = [placemark.name, placemark.locality, placemark.country]
-                    .compactMap {$0}
+        if let location = NCManageDatabase.shared.getLocationFromLatAndLong(latitude: latitude, longitude: longitude) {
+            completion(location)
+        } else {
+            geocoder.reverseGeocodeLocation(llocation) { placemarks, error in
+                if error == nil, let placemark = placemarks?.first {
+                    let locationComponents: [String] = [placemark.name, placemark.locality, placemark.country]
+                        .compactMap {$0}
+
+                    let location = locationComponents.joined(separator: ", ")
 
-                completion(locationComponents.joined(separator: ", "))
+                    NCManageDatabase.shared.addGeocoderLocation(location, latitude: latitude, longitude: longitude)
+                    completion(location)
+                }
             }
         }
     }

+ 87 - 76
iOSClient/Viewer/NCViewerMedia/NCViewerMedia.swift

@@ -60,6 +60,8 @@ class NCViewerMedia: UIViewController {
     var isDetailViewInitializze: Bool = false
     weak var delegate: NCViewerMediaViewDelegate?
 
+    private var allowPanning = true
+
     // MARK: - View Life Cycle
 
     required init?(coder aDecoder: NSCoder) {
@@ -229,33 +231,30 @@ class NCViewerMedia: UIViewController {
     }
 
     override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
+        super.viewWillTransition(to: size, with: coordinator)
 
-        if UIDevice.current.orientation.isValidInterfaceOrientation {
-            closeDetail()
-        }
+        let wasShown = detailView.isShown
 
-        self.tipView?.dismiss()
-        if metadata.isVideo {
-            self.imageVideoContainer.isHidden = true
-        }
+        if UIDevice.current.orientation.isValidInterfaceOrientation {
 
-        super.viewWillTransition(to: size, with: coordinator)
+            if wasShown { closeDetail(animate: false) }
+            self.tipView?.dismiss()
+            if metadata.isVideo {
+                self.imageVideoContainer.isHidden = true
+            }
 
-        coordinator.animate(alongsideTransition: { context in
-            // back to the original size
-            self.scrollView.zoom(to: CGRect(x: 0, y: 0, width: self.scrollView.bounds.width, height: self.scrollView.bounds.height), animated: false)
-            self.view.layoutIfNeeded()
-            UIView.animate(withDuration: context.transitionDuration) {
-                if self.detailView.isShown {
-                    self.openDetail()
+            coordinator.animate(alongsideTransition: { context in
+                // back to the original size
+                self.scrollView.zoom(to: CGRect(x: 0, y: 0, width: self.scrollView.bounds.width, height: self.scrollView.bounds.height), animated: false)
+                self.view.layoutIfNeeded()
+            }, completion: { _ in
+                self.showTip()
+                if self.metadata.isVideo {
+                    self.imageVideoContainer.isHidden = false
                 }
-            }
-        }, completion: { _ in
-            self.showTip()
-            if self.metadata.isVideo {
-                self.imageVideoContainer.isHidden = false
-            }
-        })
+                if wasShown { self.openDetail(animate: true) }
+            })
+        }
     }
 
     // MARK: - Tip
@@ -284,76 +283,92 @@ class NCViewerMedia: UIViewController {
             }
         }
 
+        if metadata.isImage, metadata.fileExtension.lowercased() == "gif", !CCUtility.fileProviderStorageExists(metadata) {
+            downloadImage()
+        }
+
         // Get image
         let image = getImageMetadata(metadata)
         if self.metadata.ocId == metadata.ocId {
             self.image = image
             self.imageVideoContainer.image = image
         }
+    }
 
-        func getImageMetadata(_ metadata: tableMetadata) -> UIImage? {
+    func getImageMetadata(_ metadata: tableMetadata) -> UIImage? {
 
-            if let image = getImage(metadata: metadata) {
-                return image
-            }
+        if let image = getImage(metadata: metadata) {
+            return image
+        }
 
-            if metadata.isVideo && !metadata.hasPreview {
-                NCUtility.shared.createImageFrom(fileNameView: metadata.fileNameView, ocId: metadata.ocId, etag: metadata.etag, classFile: metadata.classFile)
-            }
+        if metadata.isVideo && !metadata.hasPreview {
+            NCUtility.shared.createImageFrom(fileNameView: metadata.fileNameView, ocId: metadata.ocId, etag: metadata.etag, classFile: metadata.classFile)
+        }
 
-            if CCUtility.fileProviderStoragePreviewIconExists(metadata.ocId, etag: metadata.etag) {
-                if let imagePreviewPath = CCUtility.getDirectoryProviderStoragePreviewOcId(metadata.ocId, etag: metadata.etag) {
-                    return UIImage(contentsOfFile: imagePreviewPath)
-                }
+        if CCUtility.fileProviderStoragePreviewIconExists(metadata.ocId, etag: metadata.etag) {
+            if let imagePreviewPath = CCUtility.getDirectoryProviderStoragePreviewOcId(metadata.ocId, etag: metadata.etag) {
+                return UIImage(contentsOfFile: imagePreviewPath)
             }
+        }
 
-            if metadata.isAudio {
-                return UIImage(named: "noPreviewAudio")!.image(color: .gray, size: view.frame.width)
-            } else if metadata.isImage {
-                return UIImage(named: "noPreview")!.image(color: .gray, size: view.frame.width)
-            } else {
-                return nil
-            }
+        if metadata.isAudio {
+            return UIImage(named: "noPreviewAudio")!.image(color: .gray, size: view.frame.width)
+        } else if metadata.isImage {
+            return UIImage(named: "noPreview")!.image(color: .gray, size: view.frame.width)
+        } else {
+            return nil
         }
+    }
 
-        func getImage(metadata: tableMetadata) -> UIImage? {
+    func getImage(metadata: tableMetadata) -> UIImage? {
 
-            let ext = CCUtility.getExtension(metadata.fileNameView)
-            var image: UIImage?
+        let ext = CCUtility.getExtension(metadata.fileNameView)
+        var image: UIImage?
 
-            if CCUtility.fileProviderStorageExists(metadata) && metadata.isImage {
+        if CCUtility.fileProviderStorageExists(metadata) && metadata.isImage {
 
-                let previewPath = CCUtility.getDirectoryProviderStoragePreviewOcId(metadata.ocId, etag: metadata.etag)!
-                let imagePath = CCUtility.getDirectoryProviderStorageOcId(metadata.ocId, fileNameView: metadata.fileNameView)!
+            let previewPath = CCUtility.getDirectoryProviderStoragePreviewOcId(metadata.ocId, etag: metadata.etag)!
+            let imagePath = CCUtility.getDirectoryProviderStorageOcId(metadata.ocId, fileNameView: metadata.fileNameView)!
 
-                if ext == "GIF" {
-                    if !FileManager().fileExists(atPath: previewPath) {
-                        NCUtility.shared.createImageFrom(fileNameView: metadata.fileNameView, ocId: metadata.ocId, etag: metadata.etag, classFile: metadata.classFile)
-                    }
-                    image = UIImage.animatedImage(withAnimatedGIFURL: URL(fileURLWithPath: imagePath))
-                } else if ext == "SVG" {
-                    if let svgImage = SVGKImage(contentsOfFile: imagePath) {
-                        svgImage.size = CGSize(width: NCGlobal.shared.sizePreview, height: NCGlobal.shared.sizePreview)
-                        if let image = svgImage.uiImage {
-                            if !FileManager().fileExists(atPath: previewPath) {
-                                do {
-                                    try image.pngData()?.write(to: URL(fileURLWithPath: previewPath), options: .atomic)
-                                } catch { }
-                            }
-                            return image
-                        } else {
-                            return nil
+            if ext == "GIF" {
+                if !FileManager().fileExists(atPath: previewPath) {
+                    NCUtility.shared.createImageFrom(fileNameView: metadata.fileNameView, ocId: metadata.ocId, etag: metadata.etag, classFile: metadata.classFile)
+                }
+                image = UIImage.animatedImage(withAnimatedGIFURL: URL(fileURLWithPath: imagePath))
+            } else if ext == "SVG" {
+                if let svgImage = SVGKImage(contentsOfFile: imagePath) {
+                    svgImage.size = CGSize(width: NCGlobal.shared.sizePreview, height: NCGlobal.shared.sizePreview)
+                    if let image = svgImage.uiImage {
+                        if !FileManager().fileExists(atPath: previewPath) {
+                            do {
+                                try image.pngData()?.write(to: URL(fileURLWithPath: previewPath), options: .atomic)
+                            } catch { }
                         }
+                        return image
                     } else {
                         return nil
                     }
                 } else {
-                    NCUtility.shared.createImageFrom(fileNameView: metadata.fileNameView, ocId: metadata.ocId, etag: metadata.etag, classFile: metadata.classFile)
-                    image = UIImage(contentsOfFile: imagePath)
+                    return nil
                 }
+            } else {
+                NCUtility.shared.createImageFrom(fileNameView: metadata.fileNameView, ocId: metadata.ocId, etag: metadata.etag, classFile: metadata.classFile)
+                image = UIImage(contentsOfFile: imagePath)
             }
+        }
 
-            return image
+        return image
+    }
+    
+    func downloadImage(withSelector selector: String = "") {
+        NCNetworking.shared.download(metadata: metadata, selector: selector, progressHandler: { progress in
+            self.allowPanning = false
+        }) { _, _ in
+            let image = self.getImageMetadata(self.metadata)
+            self.image = image
+            self.imageVideoContainer.image = image
+
+            self.allowPanning = true
         }
     }
 
@@ -401,7 +416,7 @@ class NCViewerMedia: UIViewController {
 
     @objc func didPanWith(gestureRecognizer: UIPanGestureRecognizer) {
 
-        guard metadata.isImage else { return }
+        guard metadata.isImage, allowPanning else { return }
 
         let currentLocation = gestureRecognizer.translation(in: self.view)
 
@@ -461,7 +476,7 @@ extension NCViewerMedia {
         detailView.isShown ? closeDetail() : openDetail()
     }
 
-    private func openDetail() {
+    private func openDetail(animate: Bool = true) {
         delegate?.didOpenDetail()
         self.dismissTip()
 
@@ -483,7 +498,7 @@ extension NCViewerMedia {
                 if self.imageViewConstraint < 0 { self.imageViewConstraint = 0 }
             }
 
-            UIView.animate(withDuration: 0.3) {
+            UIView.animate(withDuration: animate ? 0.3 : 0) {
                 self.imageViewTopConstraint.constant = -self.imageViewConstraint
                 self.imageViewBottomConstraint.constant = self.imageViewConstraint
                 self.detailViewTopConstraint.constant = self.detailView.frame.height
@@ -494,7 +509,7 @@ extension NCViewerMedia {
         }
     }
 
-    private func closeDetail() {
+    func closeDetail(animate: Bool = true) {
         delegate?.didCloseDetail()
         self.detailView.hide()
         imageViewConstraint = 0
@@ -502,7 +517,7 @@ extension NCViewerMedia {
         statusLabel.isHidden = false
         statusViewImage.isHidden = false
 
-        UIView.animate(withDuration: 0.3) {
+        UIView.animate(withDuration: animate ? 0.3 : 0) {
             self.imageViewTopConstraint.constant = 0
             self.imageViewBottomConstraint.constant = 0
             self.detailViewTopConstraint.constant = 0
@@ -559,15 +574,11 @@ extension NCViewerMedia: UIScrollViewDelegate {
             scrollView.contentInset = .zero
         }
     }
-
-    func scrollViewDidScroll(_ scrollView: UIScrollView) {
-    }
 }
 
 extension NCViewerMedia: NCViewerMediaDetailViewDelegate {
-
     func downloadFullResolution() {
-        NCNetworking.shared.download(metadata: metadata, selector: NCGlobal.shared.selectorOpenDetail) { _, _ in }
+        downloadImage(withSelector: NCGlobal.shared.selectorOpenDetail)
     }
 }
 

+ 1 - 0
iOSClient/Viewer/NCViewerMedia/NCViewerMediaPage.swift

@@ -571,6 +571,7 @@ extension NCViewerMediaPage: UIPageViewControllerDelegate, UIPageViewControllerD
             previousViewControllers.forEach { viewController in
                 let viewerMedia = viewController as! NCViewerMedia
                 viewerMedia.ncplayer?.playerStop()
+                viewerMedia.closeDetail()
             }
             currentIndex = nextIndex!
         }