瀏覽代碼

tweaked gallery+cells to display files

nayooti 4 年之前
父節點
當前提交
2c7e16b9c0

+ 1 - 1
DcCore/DcCore/DC/Wrapper.swift

@@ -95,7 +95,7 @@ public class DcContext {
         dc_send_msg_sync(contextPointer, UInt32(chatId), msg.messagePointer)
     }
 
-    public func getChatMedia(chatId: Int, messageType: Int32, messageType2: Int32, messageType3: Int32) -> [Int] {
+    public func getChatMedia(chatId: Int, messageType: Int32, messageType2: Int32 = 0, messageType3: Int32 = 0) -> [Int] {
         guard let messagesPointer = dc_get_chat_media(contextPointer, UInt32(chatId), messageType, messageType2, messageType3) else {
             return []
         }

+ 43 - 14
DcCore/DcCore/Helper/DcUtils.swift

@@ -99,19 +99,48 @@ public struct DcUtils {
     }
 
     public static func generateThumbnailFromVideo(url: URL?) -> UIImage? {
-           guard let url = url else {
-               return nil
-           }
-           do {
-               let asset = AVURLAsset(url: url)
-               let imageGenerator = AVAssetImageGenerator(asset: asset)
-               imageGenerator.appliesPreferredTrackTransform = true
-               let cgImage = try imageGenerator.copyCGImage(at: .zero, actualTime: nil)
-               return UIImage(cgImage: cgImage)
-           } catch {
-               print(error.localizedDescription)
-               return nil
-           }
-       }
+		guard let url = url else {
+			return nil
+		}
+		do {
+			let asset = AVURLAsset(url: url)
+			let imageGenerator = AVAssetImageGenerator(asset: asset)
+			imageGenerator.appliesPreferredTrackTransform = true
+			let cgImage = try imageGenerator.copyCGImage(at: .zero, actualTime: nil)
+			return UIImage(cgImage: cgImage)
+		} catch {
+			print(error.localizedDescription)
+			return nil
+		}
+	}
+
+	public static func thumbnailFromPdf(withUrl url:URL, pageNumber:Int, width: CGFloat = 240) -> UIImage? {
+
+		let document = CGPDFDocument(url as CFURL)
+		guard let pdf = document, let page = pdf.page(at: pageNumber) else {
+				return nil
+		}
+		let pageRect = page.getBoxRect(.mediaBox)
+		let renderer = UIGraphicsImageRenderer(size: pageRect.size)
+		let thumbnail = renderer.image { ctx in
+			UIColor.white.set()
+			ctx.fill(pageRect)
+
+			ctx.cgContext.translateBy(x: 0.0, y: pageRect.size.height)
+			ctx.cgContext.scaleBy(x: 1.0, y: -1.0)
+
+			ctx.cgContext.drawPDFPage(page)
+		}
+
+		return thumbnail
+	}
+
+	/*
+	public static func generateThumbnailFromPDF(of thumbnailSize: CGSize , for documentUrl: URL, atPage pageIndex: Int) -> UIImage? {
+		let pdfDocument = PDFDocument(url: documentUrl)
+		let pdfDocumentPage = pdfDocument?.page(at: pageIndex)
+		return pdfDocumentPage?.thumbnail(of: thumbnailSize, for: PDFDisplayBox.trimBox)
+	}
+	*/
 
 }

+ 15 - 1
deltachat-ios/Controller/ContactDetailViewController.swift

@@ -326,7 +326,21 @@ class ContactDetailViewController: UITableViewController {
     }
 
     private func showDocuments() {
-        presentPreview(for: DC_MSG_FILE, messageType2: DC_MSG_AUDIO, messageType3: 0)
+        let messageIds = viewModel.context.getChatMedia(
+            chatId: viewModel.chatId,
+            messageType: DC_MSG_FILE,
+            messageType2: DC_MSG_AUDIO
+        )
+        let specs: GalleryViewController.LayoutSpecs = GalleryViewController.LayoutSpecs(
+            backgroundColor: UIColor.lightGray,
+            phonePortrait: 1,
+            phoneLandscape: 2,
+            padPortrait: 3,
+            padLandscape: 4
+        )
+        let galleryController = GalleryViewController(mediaMessageIds: messageIds, layoutSpecs: specs)
+        navigationController?.pushViewController(galleryController, animated: true)
+        // presentPreview(for: DC_MSG_FILE, messageType2: DC_MSG_AUDIO, messageType3: 0)
     }
 
     private func showGallery() {

+ 35 - 12
deltachat-ios/Controller/GalleryViewController.swift

@@ -3,6 +3,30 @@ import DcCore
 
 class GalleryViewController: UIViewController {
 
+    struct LayoutSpecs {
+        // used to specify columns
+        let backgroundColor: UIColor
+        let phonePortrait: Int
+        let phoneLandscape: Int
+        let padPortrait: Int
+        let padLandscape: Int
+
+        init(
+            backgroundColor: UIColor = DcColors.defaultBackgroundColor,
+            phonePortrait: Int = 3,
+            phoneLandscape: Int = 4,
+            padPortrait: Int = 5,
+            padLandscape: Int = 6
+        ) {
+            self.backgroundColor = backgroundColor
+            self.phonePortrait = phonePortrait
+            self.phoneLandscape = phoneLandscape
+            self.padPortrait = padPortrait
+            self.padLandscape = padLandscape
+        }
+    }
+
+
     // MARK: - data
     private let mediaMessageIds: [Int]
 
@@ -23,7 +47,7 @@ class GalleryViewController: UIViewController {
         collection.delegate = self
         collection.register(GalleryCell.self, forCellWithReuseIdentifier: GalleryCell.reuseIdentifier)
         collection.contentInset = UIEdgeInsets(top: gridDefaultSpacing, left: gridDefaultSpacing, bottom: gridDefaultSpacing, right: gridDefaultSpacing)
-        collection.backgroundColor = .white
+        collection.backgroundColor = layoutSpecs.backgroundColor
         collection.delaysContentTouches = false
         collection.alwaysBounceVertical = true
         return collection
@@ -42,8 +66,11 @@ class GalleryViewController: UIViewController {
         return label
     }()
 
-    init(mediaMessageIds: [Int]) {
+    private let layoutSpecs: LayoutSpecs
+
+    init(mediaMessageIds: [Int], layoutSpecs: LayoutSpecs? = nil) {
         self.mediaMessageIds = mediaMessageIds.reversed()
+        self.layoutSpecs = layoutSpecs ?? LayoutSpecs()
         super.init(nibName: nil, bundle: nil)
     }
 
@@ -122,12 +149,14 @@ extension GalleryViewController: UICollectionViewDataSource, UICollectionViewDel
         let msgId = mediaMessageIds[indexPath.row]
         let msg = DcMsg(id: msgId)
         galleryCell.update(msg: msg)
+        galleryCell.bgColor = layoutSpecs.backgroundColor
         return galleryCell
     }
 
     func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
         let msgId = mediaMessageIds[indexPath.row]
         showPreview(msgId: msgId)
+        collectionView.deselectItem(at: indexPath, animated: true)
     }
 
     func scrollViewWillBeginDragging(_ scrollView: UIScrollView) {
@@ -148,27 +177,21 @@ extension GalleryViewController: UICollectionViewDataSource, UICollectionViewDel
 private extension GalleryViewController {
     func reloadCollectionViewLayout() {
 
-        // columns specification
-        let phonePortrait = 3
-        let phoneLandscape = 4
-        let padPortrait = 5
-        let padLandscape = 8
-
         let orientation = UIApplication.shared.statusBarOrientation
         let deviceType = UIDevice.current.userInterfaceIdiom
 
         var gridDisplay: GridDisplay?
         if deviceType == .phone {
             if orientation.isPortrait {
-                gridDisplay = .grid(columns: phonePortrait)
+                gridDisplay = .grid(columns: layoutSpecs.phonePortrait)
             } else {
-                gridDisplay = .grid(columns: phoneLandscape)
+                gridDisplay = .grid(columns: layoutSpecs.phoneLandscape)
             }
         } else if deviceType == .pad {
             if orientation.isPortrait {
-                gridDisplay = .grid(columns: padPortrait)
+                gridDisplay = .grid(columns: layoutSpecs.padPortrait)
             } else {
-                gridDisplay = .grid(columns: padLandscape)
+                gridDisplay = .grid(columns: layoutSpecs.padLandscape)
             }
         }
 

+ 24 - 5
deltachat-ios/View/Cell/GalleryCell.swift

@@ -6,10 +6,13 @@ import SDWebImage
 class GalleryCell: UICollectionViewCell {
     static let reuseIdentifier = "gallery_cell"
 
+    var bgColor: UIColor = DcColors.defaultBackgroundColor
+
     var imageView: UIImageView = {
         let view = UIImageView()
         view.contentMode = .scaleAspectFill
         view.clipsToBounds = true
+        view.backgroundColor = .clear
         return view
     }()
 
@@ -29,13 +32,18 @@ class GalleryCell: UICollectionViewCell {
         fatalError("init(coder:) has not been implemented")
     }
 
+    override func prepareForReuse() {
+        // reset to defaults
+        imageView.contentMode = .scaleAspectFill
+    }
+
     private func setupSubviews() {
         contentView.addSubview(imageView)
         imageView.translatesAutoresizingMaskIntoConstraints = false
-        imageView.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, constant: 0).isActive = true
-        imageView.topAnchor.constraint(equalTo: contentView.topAnchor, constant: 0).isActive = true
-        imageView.trailingAnchor.constraint(equalTo: contentView.trailingAnchor, constant: 0).isActive = true
-        imageView.bottomAnchor.constraint(equalTo: contentView.bottomAnchor, constant: 0).isActive = true
+        imageView.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, constant: 4).isActive = true
+        imageView.topAnchor.constraint(equalTo: contentView.topAnchor, constant: 4).isActive = true
+        imageView.trailingAnchor.constraint(equalTo: contentView.trailingAnchor, constant: -4).isActive = true
+        imageView.bottomAnchor.constraint(equalTo: contentView.bottomAnchor, constant: -4).isActive = true
 
         contentView.addSubview(playButtonView)
         playButtonView.translatesAutoresizingMaskIntoConstraints = false
@@ -58,6 +66,17 @@ class GalleryCell: UICollectionViewCell {
         case .gif:
             imageView.sd_setImage(with: fileUrl, placeholderImage: nil)
             playButtonView.isHidden = true
+        case .file:
+            var thumbnail: UIImage?
+            if let pdfThumbnail =  DcUtils.thumbnailFromPdf(withUrl: fileUrl, pageNumber: 1) { // DcUtils.generateThumbnailFromPDF(of: contentView.frame.size, for: fileUrl, atPage: 0) {
+                thumbnail = pdfThumbnail
+            } else {
+                let controller = UIDocumentInteractionController(url: fileUrl)
+                thumbnail = controller.icons.last
+            }
+            imageView.image = thumbnail
+            imageView.contentMode = .scaleAspectFit
+            contentView.backgroundColor = .lightGray
         default:
             safe_fatalError("unsupported viewtype - viewtype \(viewtype) not supported.")
         }
@@ -66,7 +85,7 @@ class GalleryCell: UICollectionViewCell {
     override var isSelected: Bool {
         willSet {
             // to provide visual feedback on select events
-            contentView.backgroundColor = newValue ? DcColors.primary : .white
+            contentView.backgroundColor = newValue ? DcColors.primary : bgColor
             imageView.alpha = newValue ? 0.75 : 1.0
         }
     }