Bladeren bron

add WebxdcViewController skeleton

cyberta 3 jaren geleden
bovenliggende
commit
62d76901ce

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

@@ -45,6 +45,7 @@
 		304F769925DD23D70094B5E2 /* FullMessageViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 304F769825DD23D70094B5E2 /* FullMessageViewController.swift */; };
 		3052C60A253F082E007D13EA /* MessageLabelDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3052C609253F082E007D13EA /* MessageLabelDelegate.swift */; };
 		3052C60E253F088E007D13EA /* DetectorType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3052C60D253F088E007D13EA /* DetectorType.swift */; };
+		305501742798CDE1008FD5CA /* WebxdcViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 305501732798CDE1008FD5CA /* WebxdcViewController.swift */; };
 		3057027F24C5B2F800D84EFC /* ChatListViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3057027E24C5B2F800D84EFC /* ChatListViewModel.swift */; };
 		3057028724C5C88300D84EFC /* Localizable.stringsdict in Resources */ = {isa = PBXBuildFile; fileRef = 306011B422E5E7FB00C1CE6F /* Localizable.stringsdict */; };
 		3057028C24C5E7B600D84EFC /* ContactCellViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE77838E23E4276D0093EABD /* ContactCellViewModel.swift */; };
@@ -284,6 +285,7 @@
 		304F769825DD23D70094B5E2 /* FullMessageViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FullMessageViewController.swift; sourceTree = "<group>"; };
 		3052C609253F082E007D13EA /* MessageLabelDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessageLabelDelegate.swift; sourceTree = "<group>"; };
 		3052C60D253F088E007D13EA /* DetectorType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DetectorType.swift; sourceTree = "<group>"; };
+		305501732798CDE1008FD5CA /* WebxdcViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WebxdcViewController.swift; sourceTree = "<group>"; };
 		3057027E24C5B2F800D84EFC /* ChatListViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatListViewModel.swift; sourceTree = "<group>"; };
 		3057029A24C6441300D84EFC /* EmptyStateLabel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EmptyStateLabel.swift; sourceTree = "<group>"; };
 		305702A024C6453700D84EFC /* TypeAlias.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TypeAlias.swift; sourceTree = "<group>"; };
@@ -909,6 +911,7 @@
 				AE19887423EB264000B4CD5F /* HelpViewController.swift */,
 				304F769425DD237B0094B5E2 /* WebViewViewController.swift */,
 				304F769825DD23D70094B5E2 /* FullMessageViewController.swift */,
+				305501732798CDE1008FD5CA /* WebxdcViewController.swift */,
 				785BE16721E247F1003BE98C /* MessageInfoViewController.swift */,
 				7AE0A5481FC42F65005ECB4B /* NewChatViewController.swift */,
 				7A0052C71FBE6CB40048C3BF /* NewContactController.swift */,
@@ -1468,6 +1471,7 @@
 				3080A035277DE30100E74565 /* String+Extensions.swift in Sources */,
 				302B84CE2397F6CD001C261F /* URL+Extension.swift in Sources */,
 				7A9FB1441FB061E2001FEA36 /* AppDelegate.swift in Sources */,
+				305501742798CDE1008FD5CA /* WebxdcViewController.swift in Sources */,
 				3034929F25752FC800A523D0 /* MediaPreview.swift in Sources */,
 				AE76E5EE242BF2EA003CF461 /* WelcomeViewController.swift in Sources */,
 				3052C60A253F082E007D13EA /* MessageLabelDelegate.swift in Sources */,

+ 9 - 1
deltachat-ios/Chat/ChatViewController.swift

@@ -709,7 +709,8 @@ class ChatViewController: UITableViewController {
             } else {
                 cell = tableView.dequeueReusableCell(withIdentifier: "file", for: indexPath) as? FileTextCell ?? FileTextCell()
             }
-
+        case DC_MSG_WEBXDC:
+                cell = tableView.dequeueReusableCell(withIdentifier: "file", for: indexPath) as? FileTextCell ?? FileTextCell()
         case DC_MSG_AUDIO, DC_MSG_VOICE:
             let audioMessageCell: AudioMessageCell = tableView.dequeueReusableCell(withIdentifier: "audio",
                                                                                       for: indexPath) as? AudioMessageCell ?? AudioMessageCell()
@@ -879,6 +880,8 @@ class ChatViewController: UITableViewController {
             if let url = NSURL(string: message.getVideoChatUrl()) {
                 UIApplication.shared.open(url as URL)
             }
+        } else if message.type == DC_MSG_WEBXDC {
+            showWebxdcViewFor(message: message)
         }
         _ = handleUIMenu()
     }
@@ -1601,6 +1604,11 @@ class ChatViewController: UITableViewController {
         )
     }
 
+    func showWebxdcViewFor(message: DcMsg) {
+        let webxdcViewController = WebxdcViewController(dcContext: dcContext, messageId: message.id)
+        navigationController?.pushViewController(webxdcViewController, animated: true)
+    }
+
     func showMediaGalleryFor(indexPath: IndexPath) {
         let messageId = messageIds[indexPath.row]
         let message = dcContext.getMessage(id: messageId)

+ 98 - 0
deltachat-ios/Controller/WebxdcViewController.swift

@@ -0,0 +1,98 @@
+
+import UIKit
+import WebKit
+import DcCore
+
+class WebxdcViewController: WebViewViewController {
+
+    var messageId: Int
+    var dcContext: DcContext
+    private var loadContentOnce = false
+
+    // Block just everything :)
+    let blockRules = """
+    [
+        {
+            "trigger": {
+                "url-filter": ".*"
+            },
+            "action": {
+                "type": "block"
+            }
+        }
+    ]
+    """
+
+
+    init(dcContext: DcContext, messageId: Int) {
+        self.dcContext = dcContext
+        self.messageId = messageId
+        super.init()
+    }
+
+    required init?(coder: NSCoder) {
+        fatalError("init(coder:) has not been implemented")
+    }
+
+    override func viewDidLoad() {
+        super.viewDidLoad()
+        self.title = getTitleFromWebxdcInfoJson()
+
+        let preferences = WKPreferences()
+        let configuration = WKWebViewConfiguration()
+
+        if #available(iOS 13.0, *) {
+            preferences.isFraudulentWebsiteWarningEnabled = true
+        }
+
+        if #available(iOS 14.0, *) {
+            configuration.defaultWebpagePreferences.allowsContentJavaScript = true
+        } else {
+            preferences.javaScriptEnabled = true
+        }
+        preferences.javaScriptCanOpenWindowsAutomatically = false
+
+        configuration.preferences = preferences
+    }
+
+    private func getTitleFromWebxdcInfoJson() -> String {
+        let jsonString = dcContext.getMessage(id: messageId).getWebxdcInfoJson()
+        if let data: Data = jsonString.data(using: .utf8),
+           let infoJson = (try? JSONSerialization.jsonObject(with: data, options: [])) as? [String:AnyObject],
+           let title = infoJson["name"] as? String {
+            return title
+        }
+        return ""
+    }
+
+    override func viewWillAppear(_ animated: Bool) {
+        super.viewWillAppear(animated)
+        loadRestrictedHtml()
+    }
+
+
+    private func loadRestrictedHtml() {
+        WKContentRuleListStore.default().compileContentRuleList(
+                forIdentifier: "ContentBlockingRules",
+                encodedContentRuleList: blockRules) { (contentRuleList, error) in
+
+            guard let contentRuleList = contentRuleList, error == nil else {
+                return
+            }
+
+            let configuration = self.webView.configuration
+            configuration.userContentController.add(contentRuleList)
+            self.loadHtml()
+        }
+    }
+
+    private func loadHtml() {
+        DispatchQueue.global(qos: .userInitiated).async { [weak self] in
+            guard let self = self else { return }
+//            let html = self.dcContext.getMsgHtml(msgId: self.messageId)
+//            DispatchQueue.main.async {
+//                self.webView.loadHTMLString(html, baseURL: nil)
+//            }
+        }
+    }
+}