Преглед на файлове

open browser/phone on taps to status-urls

B. Petersen преди 4 години
родител
ревизия
799ef36640
променени са 2 файла, в които са добавени 40 реда и са изтрити 2 реда
  1. 18 0
      deltachat-ios/Controller/ContactDetailViewController.swift
  2. 22 2
      deltachat-ios/View/MultilineLabelCell.swift

+ 18 - 0
deltachat-ios/Controller/ContactDetailViewController.swift

@@ -90,6 +90,7 @@ class ContactDetailViewController: UITableViewController {
 
     private lazy var statusCell: MultilineLabelCell = {
         let cell = MultilineLabelCell()
+        cell.multilineDelegate = self
         return cell
     }()
 
@@ -439,3 +440,20 @@ class ContactDetailViewController: UITableViewController {
         }
     }
 }
+
+extension ContactDetailViewController: MultilineLabelCellDelegate {
+    func phoneNumberTapped(number: String) {
+        let sanitizedNumber = number.filter("0123456789".contains)
+        if let phoneURL = URL(string: "tel://\(sanitizedNumber)") {
+            UIApplication.shared.open(phoneURL, options: [:], completionHandler: nil)
+        }
+    }
+
+    func urlTapped(url: URL) {
+        if Utils.isEmail(url: url) {
+            let email = Utils.getEmailFrom(url)
+        } else {
+            UIApplication.shared.open(url)
+        }
+    }
+}

+ 22 - 2
deltachat-ios/View/MultilineLabelCell.swift

@@ -3,6 +3,7 @@ import UIKit
 import DcCore
 
 class MultilineLabelCell: UITableViewCell {
+    public weak var multilineDelegate: MultilineLabelCellDelegate?
 
     lazy var label: MessageLabel = {
         let label = MessageLabel()
@@ -40,11 +41,25 @@ class MultilineLabelCell: UITableViewCell {
         label.alignTrailingToAnchor(margins.trailingAnchor)
         label.alignTopToAnchor(margins.topAnchor)
         label.alignBottomToAnchor(margins.bottomAnchor)
+
+        let gestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(handleTapGesture(_:)))
+        gestureRecognizer.numberOfTapsRequired = 1
+        label.addGestureRecognizer(gestureRecognizer)
     }
 
     func setText(text: String?) {
         label.text = text
     }
+
+    @objc
+    open func handleTapGesture(_ gesture: UIGestureRecognizer) {
+        guard gesture.state == .ended else { return }
+        let touchLocation = gesture.location(in: label)
+        let isHandled = label.handleGesture(touchLocation)
+        if !isHandled {
+            logger.info("status: tapped outside urls or phone numbers")
+        }
+    }
 }
 
 extension MultilineLabelCell: MessageLabelDelegate {
@@ -53,11 +68,11 @@ extension MultilineLabelCell: MessageLabelDelegate {
     public func didSelectDate(_ date: Date) {}
 
     public func didSelectPhoneNumber(_ phoneNumber: String) {
-        logger.info("status phone number tapped")
+        multilineDelegate?.phoneNumberTapped(number: phoneNumber)
     }
 
     public func didSelectURL(_ url: URL) {
-        logger.info("status URL tapped")
+        multilineDelegate?.urlTapped(url: url)
     }
 
     public func didSelectTransitInformation(_ transitInformation: [String: String]) {}
@@ -68,3 +83,8 @@ extension MultilineLabelCell: MessageLabelDelegate {
 
     public func didSelectCustom(_ pattern: String, match: String?) {}
 }
+
+public protocol MultilineLabelCellDelegate: class {
+    func phoneNumberTapped(number: String)
+    func urlTapped(url: URL)
+}