Forráskód Böngészése

pdf thumbnails - cleanging

nayooti 5 éve
szülő
commit
ae093bd7c0

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

@@ -99,19 +99,52 @@ 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 = 1, width: CGFloat = 240) -> UIImage? {
+		guard let pdf = CGPDFDocument(url as CFURL),
+			let page = pdf.page(at: pageNumber)
+			else {
+				return nil
+		}
+
+		var pageRect = page.getBoxRect(.mediaBox)
+		let pdfScale = width / pageRect.size.width
+		pageRect.size = CGSize(width: pageRect.size.width*pdfScale, height: pageRect.size.height*pdfScale)
+		pageRect.origin = .zero
+
+		UIGraphicsBeginImageContext(pageRect.size)
+		let context = UIGraphicsGetCurrentContext()!
+
+		// White BG
+		context.setFillColor(UIColor.white.cgColor)
+		context.fill(pageRect)
+		context.saveGState()
+
+		// Next 3 lines makes the rotations so that the page look in the right direction
+		context.translateBy(x: 0.0, y: pageRect.size.height)
+		context.scaleBy(x: 1.0, y: -1.0)
+		context.concatenate(page.getDrawingTransform(.mediaBox, rect: pageRect, rotate: 0, preserveAspectRatio: true))
+
+		context.drawPDFPage(page)
+		context.restoreGState()
+
+		let image = UIGraphicsGetImageFromCurrentImageContext()
+		UIGraphicsEndImageContext()
+		return image
+	}
 
 }

+ 4 - 0
deltachat-ios.xcodeproj/project.pbxproj

@@ -159,6 +159,7 @@
 		AE851AC7227C776400ED86F0 /* Location.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE851AC6227C776400ED86F0 /* Location.swift */; };
 		AE851AC9227C77CF00ED86F0 /* Media.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE851AC8227C77CF00ED86F0 /* Media.swift */; };
 		AE851AD0227DF50900ED86F0 /* GroupChatDetailViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE851ACF227DF50900ED86F0 /* GroupChatDetailViewController.swift */; };
+		AE8DD451249D1DFB009A4BC1 /* FileTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE8DD450249D1DFB009A4BC1 /* FileTableViewCell.swift */; };
 		AE8F503524753DFE007FEE0B /* GalleryViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE8F503424753DFE007FEE0B /* GalleryViewController.swift */; };
 		AE9DAF0D22C1215D004C9591 /* EditContactController.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE9DAF0C22C1215D004C9591 /* EditContactController.swift */; };
 		AE9DAF0F22C278C6004C9591 /* ChatTitleView.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE9DAF0E22C278C6004C9591 /* ChatTitleView.swift */; };
@@ -452,6 +453,7 @@
 		AE851AC6227C776400ED86F0 /* Location.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Location.swift; sourceTree = "<group>"; };
 		AE851AC8227C77CF00ED86F0 /* Media.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Media.swift; sourceTree = "<group>"; };
 		AE851ACF227DF50900ED86F0 /* GroupChatDetailViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GroupChatDetailViewController.swift; sourceTree = "<group>"; };
+		AE8DD450249D1DFB009A4BC1 /* FileTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FileTableViewCell.swift; sourceTree = "<group>"; };
 		AE8F503424753DFE007FEE0B /* GalleryViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GalleryViewController.swift; sourceTree = "<group>"; };
 		AE9DAF0C22C1215D004C9591 /* EditContactController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EditContactController.swift; sourceTree = "<group>"; };
 		AE9DAF0E22C278C6004C9591 /* ChatTitleView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatTitleView.swift; sourceTree = "<group>"; };
@@ -864,6 +866,7 @@
 			children = (
 				AE406EEF240FF8FF005F7022 /* ProfileCell.swift */,
 				AE0AA951247800E700D42A7F /* GalleryCell.swift */,
+				AE8DD450249D1DFB009A4BC1 /* FileTableViewCell.swift */,
 			);
 			path = Cell;
 			sourceTree = "<group>";
@@ -1389,6 +1392,7 @@
 				305961FD2346125100C80F33 /* TypingBubble.swift in Sources */,
 				305961D72346125100C80F33 /* MessageKit+Availability.swift in Sources */,
 				AED423D5249F57C100B6B2BB /* AddGroupMembersViewController.swift in Sources */,
+				AE8DD451249D1DFB009A4BC1 /* FileTableViewCell.swift in Sources */,
 				3040F45E234DFBC000FA34D5 /* Audio.swift in Sources */,
 				305961FE2346125100C80F33 /* InsetLabel.swift in Sources */,
 				3095A351237DD1F700AB07F7 /* MediaPicker.swift in Sources */,

+ 17 - 82
deltachat-ios/Controller/DocumentGalleryController.swift

@@ -17,6 +17,7 @@ class DocumentGalleryController: UIViewController {
     init(fileMessageIds: [Int]) {
         self.fileMessageIds = fileMessageIds
         super.init(nibName: nil, bundle: nil)
+        self.title = String.localized("documents")
     }
 
     required init?(coder: NSCoder) {
@@ -54,93 +55,27 @@ extension DocumentGalleryController: UITableViewDelegate, UITableViewDataSource
         cell.update(msg: msg)
         return cell
     }
-}
-
-class FileTableViewCell: UITableViewCell {
-
-    static let reuseIdentifier = "file_table_view_cell"
-
-    private let fileImageView: UIImageView = {
-        let imageView = UIImageView()
-        imageView.contentMode = .scaleAspectFit
-        return imageView
-    }()
-
-    override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
-        super.init(style: .subtitle, reuseIdentifier: reuseIdentifier)
-        setupSubviews()
-    }
-
-    required init?(coder: NSCoder) {
-        fatalError("init(coder:) has not been implemented")
-    }
 
-    override func prepareForReuse() {
-        fileImageView.image = nil
-        detailTextLabel?.text = nil
-        textLabel?.text = nil
-    }
-
-    // MARK: - layout
-    private func setupSubviews() {
-        guard let textLabel = textLabel, let detailTextLabel = detailTextLabel else { return }
-
-        contentView.addSubview(fileImageView)
-        fileImageView.translatesAutoresizingMaskIntoConstraints = false
-        fileImageView.centerYAnchor.constraint(equalTo: contentView.centerYAnchor, constant: 0).isActive = true
-        fileImageView.heightAnchor.constraint(lessThanOrEqualTo: contentView.heightAnchor, multiplier: 0.9).isActive = true
-        fileImageView.leadingAnchor.constraint(equalTo: contentView.layoutMarginsGuide.leadingAnchor, constant: 0).isActive = true
-        fileImageView.widthAnchor.constraint(equalToConstant: 50).isActive = true
-        textLabel.translatesAutoresizingMaskIntoConstraints = false
-        detailTextLabel.translatesAutoresizingMaskIntoConstraints = false
-        textLabel.leadingAnchor.constraint(equalTo: fileImageView.trailingAnchor, constant: 10).isActive = true
-        textLabel.topAnchor.constraint(equalTo: contentView.layoutMarginsGuide.topAnchor, constant: 0).isActive = true
-        textLabel.trailingAnchor.constraint(equalTo: contentView.layoutMarginsGuide.trailingAnchor, constant: 0).isActive = true
-        detailTextLabel.leadingAnchor.constraint(equalTo: textLabel.leadingAnchor, constant: 0).isActive = true
-        detailTextLabel.topAnchor.constraint(equalTo: textLabel.bottomAnchor, constant: 0).isActive = true
-        detailTextLabel.trailingAnchor.constraint(equalTo: textLabel.trailingAnchor, constant: 0).isActive = true
-        detailTextLabel.bottomAnchor.constraint(equalTo: contentView.layoutMarginsGuide.bottomAnchor, constant: 0).isActive = true
+    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
+        let msgId = fileMessageIds[indexPath.row]
+        showPreview(msgId: msgId)
+        tableView.deselectRow(at: indexPath, animated: false)
     }
+}
 
-    func update(msg: DcMsg) {
-        switch msg.kind {
-        case .fileText(let mediaItem):
-            if let url = mediaItem.url {
-                let controller = UIDocumentInteractionController(url: url)
-                fileImageView.image = controller.icons.first ?? mediaItem.placeholderImage
-            } else {
-                fileImageView.image = mediaItem.placeholderImage
-            }
-            textLabel?.text = msg.filename
-            detailTextLabel?.attributedText = mediaItem.text?[MediaItemConstants.mediaSubtitle]
-        default:
-            break
+// MARK: - coordinator
+extension DocumentGalleryController {
+    func showPreview(msgId: Int) {
+        guard let index = fileMessageIds.index(of: msgId) else {
+            return
         }
-        /*
-        if let fileUrl = msg.fileURL {
-            let controller = UIDocumentInteractionController(url: fileUrl)
-            cell.imageView?.image = controller.icons.first
-        }
-        if let fileName = msg.filename {
-            let messageKind = msg.createFileMessage(text: fileName)
-            switch messageKind {
-            case .fileText(let mediaItem):
-                if let title = mediaItem.text?[MediaItemConstants.mediaTitle] {
-                    cell.textLabel?.attributedText = title
-                    cell.textLabel?.makeBorder(color: .yellow)
-                }
-                if let subtitle = mediaItem.text?[MediaItemConstants.mediaSubtitle] {
-                    cell.detailTextLabel?.attributedText = subtitle
-                    cell.detailTextLabel?.makeBorder()
-                }
-            default:
-                break
-            }
+
+        let mediaUrls = fileMessageIds.compactMap {
+            return DcMsg(id: $0).fileURL
         }
-        */
+        let previewController = PreviewController(currentIndex: index, urls: mediaUrls)
+        present(previewController, animated: true, completion: nil)
     }
+}
 
 
-
-
-}

+ 70 - 0
deltachat-ios/View/Cell/FileTableViewCell.swift

@@ -0,0 +1,70 @@
+import UIKit
+import DcCore
+
+class FileTableViewCell: UITableViewCell {
+
+    static let reuseIdentifier = "file_table_view_cell"
+
+    private let fileImageView: UIImageView = {
+        let imageView = UIImageView()
+        imageView.contentMode = .scaleAspectFit
+        return imageView
+    }()
+
+    override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
+        super.init(style: .subtitle, reuseIdentifier: reuseIdentifier)
+        setupSubviews()
+    }
+
+    required init?(coder: NSCoder) {
+        fatalError("init(coder:) has not been implemented")
+    }
+
+    override func prepareForReuse() {
+        fileImageView.image = nil
+        detailTextLabel?.text = nil
+        textLabel?.text = nil
+    }
+
+    // MARK: - layout
+    private func setupSubviews() {
+        guard let textLabel = textLabel, let detailTextLabel = detailTextLabel else { return }
+
+        contentView.addSubview(fileImageView)
+        fileImageView.translatesAutoresizingMaskIntoConstraints = false
+        fileImageView.centerYAnchor.constraint(equalTo: contentView.centerYAnchor, constant: 0).isActive = true
+        fileImageView.heightAnchor.constraint(lessThanOrEqualTo: contentView.heightAnchor, multiplier: 0.9).isActive = true
+        fileImageView.leadingAnchor.constraint(equalTo: contentView.layoutMarginsGuide.leadingAnchor, constant: 0).isActive = true
+        fileImageView.widthAnchor.constraint(equalToConstant: 50).isActive = true
+        textLabel.translatesAutoresizingMaskIntoConstraints = false
+        detailTextLabel.translatesAutoresizingMaskIntoConstraints = false
+        textLabel.leadingAnchor.constraint(equalTo: fileImageView.trailingAnchor, constant: 10).isActive = true
+        textLabel.topAnchor.constraint(equalTo: contentView.layoutMarginsGuide.topAnchor, constant: 0).isActive = true
+        textLabel.trailingAnchor.constraint(equalTo: contentView.layoutMarginsGuide.trailingAnchor, constant: 0).isActive = true
+        detailTextLabel.leadingAnchor.constraint(equalTo: textLabel.leadingAnchor, constant: 0).isActive = true
+        detailTextLabel.topAnchor.constraint(equalTo: textLabel.bottomAnchor, constant: 0).isActive = true
+        detailTextLabel.trailingAnchor.constraint(equalTo: textLabel.trailingAnchor, constant: 0).isActive = true
+        detailTextLabel.bottomAnchor.constraint(equalTo: contentView.layoutMarginsGuide.bottomAnchor, constant: 0).isActive = true
+    }
+
+    // MARK: - update
+    func update(msg: DcMsg) {
+        switch msg.kind {
+        case .fileText(let mediaItem):
+            if let url = mediaItem.url {
+                if let pdfThumbnail = DcUtils.thumbnailFromPdf(withUrl: url) {
+                    fileImageView.image = pdfThumbnail
+                } else {
+                    let controller = UIDocumentInteractionController(url: url)
+                    fileImageView.image = controller.icons.first ?? mediaItem.placeholderImage
+                }
+            } else {
+                fileImageView.image = mediaItem.placeholderImage
+            }
+            textLabel?.text = msg.filename
+            detailTextLabel?.attributedText = mediaItem.text?[MediaItemConstants.mediaSubtitle]
+        default:
+            break
+        }
+    }
+}