فهرست منبع

added DocumentGalleryController

nayooti 5 سال پیش
والد
کامیت
633ccdd282

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

@@ -142,6 +142,7 @@
 		AE1988AB23EB3C7600B4CD5F /* Assets in Resources */ = {isa = PBXBuildFile; fileRef = AE1988AA23EB3C7600B4CD5F /* Assets */; };
 		AE25F09022807AD800CDEA66 /* AvatarSelectionCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE25F08F22807AD800CDEA66 /* AvatarSelectionCell.swift */; };
 		AE38B31822672DFC00EC37A1 /* ActionCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE38B31722672DFC00EC37A1 /* ActionCell.swift */; };
+		AE39D323249CFC1A007346A1 /* DocumentGalleryController.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE39D322249CFC1A007346A1 /* DocumentGalleryController.swift */; };
 		AE406EF0240FF8FF005F7022 /* ProfileCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE406EEF240FF8FF005F7022 /* ProfileCell.swift */; };
 		AE4AEE3522B1030D000AA495 /* PreviewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE4AEE3422B1030D000AA495 /* PreviewController.swift */; };
 		AE52EA19229EB53C00C586C9 /* ContactDetailHeader.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE52EA18229EB53C00C586C9 /* ContactDetailHeader.swift */; };
@@ -432,6 +433,7 @@
 		AE1988AA23EB3C7600B4CD5F /* Assets */ = {isa = PBXFileReference; lastKnownFileType = folder; path = Assets; sourceTree = "<group>"; };
 		AE25F08F22807AD800CDEA66 /* AvatarSelectionCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AvatarSelectionCell.swift; sourceTree = "<group>"; };
 		AE38B31722672DFC00EC37A1 /* ActionCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ActionCell.swift; sourceTree = "<group>"; };
+		AE39D322249CFC1A007346A1 /* DocumentGalleryController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DocumentGalleryController.swift; sourceTree = "<group>"; };
 		AE406EEF240FF8FF005F7022 /* ProfileCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProfileCell.swift; sourceTree = "<group>"; };
 		AE4AEE3422B1030D000AA495 /* PreviewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PreviewController.swift; sourceTree = "<group>"; };
 		AE52EA18229EB53C00C586C9 /* ContactDetailHeader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContactDetailHeader.swift; sourceTree = "<group>"; };
@@ -932,6 +934,7 @@
 				AED423D2249F578B00B6B2BB /* NewGroupAddMembersViewController.swift */,
 				AED423D4249F57C100B6B2BB /* AddGroupMembersViewController.swift */,
 				AED423D6249F580700B6B2BB /* BlockedContactsViewController.swift */,
+				AE39D322249CFC1A007346A1 /* DocumentGalleryController.swift */,
 			);
 			path = Controller;
 			sourceTree = "<group>";
@@ -1382,6 +1385,7 @@
 				AE6EC5282497B9B200A400E4 /* ThumbnailCache.swift in Sources */,
 				AE52EA20229EB9F000C586C9 /* EditGroupViewController.swift in Sources */,
 				AE18F294228C602A0007B1BE /* SecuritySettingsController.swift in Sources */,
+				AE39D323249CFC1A007346A1 /* DocumentGalleryController.swift in Sources */,
 				305961FD2346125100C80F33 /* TypingBubble.swift in Sources */,
 				305961D72346125100C80F33 /* MessageKit+Availability.swift in Sources */,
 				AED423D5249F57C100B6B2BB /* AddGroupMembersViewController.swift in Sources */,

+ 14 - 5
deltachat-ios/Controller/ContactDetailViewController.swift

@@ -326,14 +326,23 @@ 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,
+            messageType3: 0
+        )
+        let fileGalleryController = DocumentGalleryController(fileMessageIds: messageIds)
+        navigationController?.pushViewController(fileGalleryController, animated: true)
     }
 
     private func showGallery() {
-        let messageIds = viewModel.context.getChatMedia(chatId: viewModel.chatId,
-                                                        messageType: DC_MSG_IMAGE,
-                                                        messageType2: DC_MSG_GIF,
-                                                        messageType3: DC_MSG_VIDEO)
+        let messageIds = viewModel.context.getChatMedia(
+            chatId: viewModel.chatId,
+            messageType: DC_MSG_IMAGE,
+            messageType2: DC_MSG_GIF,
+            messageType3: DC_MSG_VIDEO
+        )
         let galleryController = GalleryViewController(mediaMessageIds: messageIds)
             navigationController?.pushViewController(galleryController, animated: true)
     }

+ 146 - 0
deltachat-ios/Controller/DocumentGalleryController.swift

@@ -0,0 +1,146 @@
+import UIKit
+import DcCore
+
+class DocumentGalleryController: UIViewController {
+
+    private let fileMessageIds: [Int]
+
+    private lazy var tableViews: UITableView = {
+        let table = UITableView(frame: .zero, style: .plain)
+        table.register(FileTableViewCell.self, forCellReuseIdentifier: FileTableViewCell.reuseIdentifier)
+        table.dataSource = self
+        table.delegate = self
+        table.rowHeight = 60
+        return table
+    }()
+
+    init(fileMessageIds: [Int]) {
+        self.fileMessageIds = fileMessageIds
+        super.init(nibName: nil, bundle: nil)
+    }
+
+    required init?(coder: NSCoder) {
+        fatalError("init(coder:) has not been implemented")
+    }
+
+    // MARK: - lifecycle
+    override func viewDidLoad() {
+        super.viewDidLoad()
+        setupSubviews()
+    }
+
+    // MARK: - layout
+    private func setupSubviews() {
+        view.addSubview(tableViews)
+        tableViews.translatesAutoresizingMaskIntoConstraints = false
+        tableViews.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 0).isActive = true
+        tableViews.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
+        tableViews.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: 0).isActive = true
+        tableViews.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true
+    }
+}
+
+// MARK: - UITableViewDelegate, UITableViewDataSource
+extension DocumentGalleryController: UITableViewDelegate, UITableViewDataSource {
+    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
+        return fileMessageIds.count
+    }
+
+    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
+        guard let cell = tableView.dequeueReusableCell(withIdentifier: FileTableViewCell.reuseIdentifier, for: indexPath) as? FileTableViewCell else {
+            return UITableViewCell()
+        }
+        let msg = DcMsg(id: fileMessageIds[indexPath.row])
+        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 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
+        }
+        /*
+        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
+            }
+        }
+        */
+    }
+
+
+
+
+}

+ 1 - 0
deltachat-ios/Controller/GalleryViewController.swift

@@ -128,6 +128,7 @@ extension GalleryViewController: UICollectionViewDataSource, UICollectionViewDel
     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) {

+ 0 - 1
deltachat-ios/View/Cell/GalleryCell.swift

@@ -2,7 +2,6 @@ import UIKit
 import DcCore
 import SDWebImage
 
-
 class GalleryCell: UICollectionViewCell {
     static let reuseIdentifier = "gallery_cell"