Browse Source

Add webVC

Marino Faggiana 8 years ago
parent
commit
c6aabcbbf2
38 changed files with 814 additions and 0 deletions
  1. 6 0
      Libraries external/SwiftWebVC/Resources/Media.xcassets/Contents.json
  2. 22 0
      Libraries external/SwiftWebVC/Resources/Media.xcassets/SwiftWebVCActivityChrome-iPad.imageset/Contents.json
  3. BIN
      Libraries external/SwiftWebVC/Resources/Media.xcassets/SwiftWebVCActivityChrome-iPad.imageset/SwiftWebVCActivityChrome-iPad.png
  4. BIN
      Libraries external/SwiftWebVC/Resources/Media.xcassets/SwiftWebVCActivityChrome-iPad.imageset/SwiftWebVCActivityChrome-iPad@2x.png
  5. 21 0
      Libraries external/SwiftWebVC/Resources/Media.xcassets/SwiftWebVCActivityChrome.imageset/Contents.json
  6. BIN
      Libraries external/SwiftWebVC/Resources/Media.xcassets/SwiftWebVCActivityChrome.imageset/SwiftWebVCActivityChrome@2x.png
  7. 22 0
      Libraries external/SwiftWebVC/Resources/Media.xcassets/SwiftWebVCActivitySafari-iPad.imageset/Contents.json
  8. BIN
      Libraries external/SwiftWebVC/Resources/Media.xcassets/SwiftWebVCActivitySafari-iPad.imageset/SwiftWebVCActivitySafari-iPad.png
  9. BIN
      Libraries external/SwiftWebVC/Resources/Media.xcassets/SwiftWebVCActivitySafari-iPad.imageset/SwiftWebVCActivitySafari-iPad@2x.png
  10. 21 0
      Libraries external/SwiftWebVC/Resources/Media.xcassets/SwiftWebVCActivitySafari.imageset/Contents.json
  11. BIN
      Libraries external/SwiftWebVC/Resources/Media.xcassets/SwiftWebVCActivitySafari.imageset/SwiftWebVCActivitySafari@2x.png
  12. 22 0
      Libraries external/SwiftWebVC/Resources/Media.xcassets/SwiftWebVCBack.imageset/Contents.json
  13. BIN
      Libraries external/SwiftWebVC/Resources/Media.xcassets/SwiftWebVCBack.imageset/SwiftWebVCBack.png
  14. BIN
      Libraries external/SwiftWebVC/Resources/Media.xcassets/SwiftWebVCBack.imageset/SwiftWebVCBack@2x.png
  15. 22 0
      Libraries external/SwiftWebVC/Resources/Media.xcassets/SwiftWebVCDismiss.imageset/Contents.json
  16. BIN
      Libraries external/SwiftWebVC/Resources/Media.xcassets/SwiftWebVCDismiss.imageset/SwiftWebVCDismiss.png
  17. BIN
      Libraries external/SwiftWebVC/Resources/Media.xcassets/SwiftWebVCDismiss.imageset/SwiftWebVCDismiss@2x.png
  18. 22 0
      Libraries external/SwiftWebVC/Resources/Media.xcassets/SwiftWebVCNext.imageset/Contents.json
  19. BIN
      Libraries external/SwiftWebVC/Resources/Media.xcassets/SwiftWebVCNext.imageset/SwiftWebVCNext.png
  20. BIN
      Libraries external/SwiftWebVC/Resources/Media.xcassets/SwiftWebVCNext.imageset/SwiftWebVCNext@2x.png
  21. 5 0
      Libraries external/SwiftWebVC/Strings/da.lproj/SwiftWebVC.strings
  22. 2 0
      Libraries external/SwiftWebVC/Strings/de.lproj/SwiftWebVC.strings
  23. 3 0
      Libraries external/SwiftWebVC/Strings/en.lproj/SwiftWebVC.strings
  24. 3 0
      Libraries external/SwiftWebVC/Strings/es-ES.lproj/SwiftWebVC.strings
  25. 3 0
      Libraries external/SwiftWebVC/Strings/es.lproj/SwiftWebVC.strings
  26. 3 0
      Libraries external/SwiftWebVC/Strings/fr.lproj/SwiftWebVC.strings
  27. 2 0
      Libraries external/SwiftWebVC/Strings/ja.lproj/SwiftWebVC.strings
  28. 2 0
      Libraries external/SwiftWebVC/Strings/pt.lproj/SwiftWebVC.strings
  29. 2 0
      Libraries external/SwiftWebVC/Strings/vi.lproj/SwiftWebVC.strings
  30. 6 0
      Libraries external/SwiftWebVC/Strings/zh-Hans.lproj/SwiftWebVC.strings
  31. 3 0
      Libraries external/SwiftWebVC/Strings/zh-Hant.lproj/SwiftWebVC.strings
  32. 82 0
      Libraries external/SwiftWebVC/SwiftModalWebVC.swift
  33. 310 0
      Libraries external/SwiftWebVC/SwiftWebVC.swift
  34. 46 0
      Libraries external/SwiftWebVC/SwiftWebVCActivity.swift
  35. 52 0
      Libraries external/SwiftWebVC/SwiftWebVCActivityChrome.swift
  36. 31 0
      Libraries external/SwiftWebVC/SwiftWebVCActivitySafari.swift
  37. 87 0
      Nextcloud.xcodeproj/project.pbxproj
  38. 14 0
      iOSClient/Main/CCMain.m

+ 6 - 0
Libraries external/SwiftWebVC/Resources/Media.xcassets/Contents.json

@@ -0,0 +1,6 @@
+{
+  "info" : {
+    "version" : 1,
+    "author" : "xcode"
+  }
+}

+ 22 - 0
Libraries external/SwiftWebVC/Resources/Media.xcassets/SwiftWebVCActivityChrome-iPad.imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "filename" : "SwiftWebVCActivityChrome-iPad.png",
+      "scale" : "1x"
+    },
+    {
+      "idiom" : "universal",
+      "filename" : "SwiftWebVCActivityChrome-iPad@2x.png",
+      "scale" : "2x"
+    },
+    {
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "version" : 1,
+    "author" : "xcode"
+  }
+}

BIN
Libraries external/SwiftWebVC/Resources/Media.xcassets/SwiftWebVCActivityChrome-iPad.imageset/SwiftWebVCActivityChrome-iPad.png


BIN
Libraries external/SwiftWebVC/Resources/Media.xcassets/SwiftWebVCActivityChrome-iPad.imageset/SwiftWebVCActivityChrome-iPad@2x.png


+ 21 - 0
Libraries external/SwiftWebVC/Resources/Media.xcassets/SwiftWebVCActivityChrome.imageset/Contents.json

@@ -0,0 +1,21 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "idiom" : "universal",
+      "filename" : "SwiftWebVCActivityChrome@2x.png",
+      "scale" : "2x"
+    },
+    {
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "version" : 1,
+    "author" : "xcode"
+  }
+}

BIN
Libraries external/SwiftWebVC/Resources/Media.xcassets/SwiftWebVCActivityChrome.imageset/SwiftWebVCActivityChrome@2x.png


+ 22 - 0
Libraries external/SwiftWebVC/Resources/Media.xcassets/SwiftWebVCActivitySafari-iPad.imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "filename" : "SwiftWebVCActivitySafari-iPad.png",
+      "scale" : "1x"
+    },
+    {
+      "idiom" : "universal",
+      "filename" : "SwiftWebVCActivitySafari-iPad@2x.png",
+      "scale" : "2x"
+    },
+    {
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "version" : 1,
+    "author" : "xcode"
+  }
+}

BIN
Libraries external/SwiftWebVC/Resources/Media.xcassets/SwiftWebVCActivitySafari-iPad.imageset/SwiftWebVCActivitySafari-iPad.png


BIN
Libraries external/SwiftWebVC/Resources/Media.xcassets/SwiftWebVCActivitySafari-iPad.imageset/SwiftWebVCActivitySafari-iPad@2x.png


+ 21 - 0
Libraries external/SwiftWebVC/Resources/Media.xcassets/SwiftWebVCActivitySafari.imageset/Contents.json

@@ -0,0 +1,21 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "idiom" : "universal",
+      "filename" : "SwiftWebVCActivitySafari@2x.png",
+      "scale" : "2x"
+    },
+    {
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "version" : 1,
+    "author" : "xcode"
+  }
+}

BIN
Libraries external/SwiftWebVC/Resources/Media.xcassets/SwiftWebVCActivitySafari.imageset/SwiftWebVCActivitySafari@2x.png


+ 22 - 0
Libraries external/SwiftWebVC/Resources/Media.xcassets/SwiftWebVCBack.imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "filename" : "SwiftWebVCBack.png",
+      "scale" : "1x"
+    },
+    {
+      "idiom" : "universal",
+      "filename" : "SwiftWebVCBack@2x.png",
+      "scale" : "2x"
+    },
+    {
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "version" : 1,
+    "author" : "xcode"
+  }
+}

BIN
Libraries external/SwiftWebVC/Resources/Media.xcassets/SwiftWebVCBack.imageset/SwiftWebVCBack.png


BIN
Libraries external/SwiftWebVC/Resources/Media.xcassets/SwiftWebVCBack.imageset/SwiftWebVCBack@2x.png


+ 22 - 0
Libraries external/SwiftWebVC/Resources/Media.xcassets/SwiftWebVCDismiss.imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "filename" : "SwiftWebVCDismiss.png",
+      "scale" : "1x"
+    },
+    {
+      "idiom" : "universal",
+      "filename" : "SwiftWebVCDismiss@2x.png",
+      "scale" : "2x"
+    },
+    {
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "version" : 1,
+    "author" : "xcode"
+  }
+}

BIN
Libraries external/SwiftWebVC/Resources/Media.xcassets/SwiftWebVCDismiss.imageset/SwiftWebVCDismiss.png


BIN
Libraries external/SwiftWebVC/Resources/Media.xcassets/SwiftWebVCDismiss.imageset/SwiftWebVCDismiss@2x.png


+ 22 - 0
Libraries external/SwiftWebVC/Resources/Media.xcassets/SwiftWebVCNext.imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "filename" : "SwiftWebVCNext.png",
+      "scale" : "1x"
+    },
+    {
+      "idiom" : "universal",
+      "filename" : "SwiftWebVCNext@2x.png",
+      "scale" : "2x"
+    },
+    {
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "version" : 1,
+    "author" : "xcode"
+  }
+}

BIN
Libraries external/SwiftWebVC/Resources/Media.xcassets/SwiftWebVCNext.imageset/SwiftWebVCNext.png


BIN
Libraries external/SwiftWebVC/Resources/Media.xcassets/SwiftWebVCNext.imageset/SwiftWebVCNext@2x.png


+ 5 - 0
Libraries external/SwiftWebVC/Strings/da.lproj/SwiftWebVC.strings

@@ -0,0 +1,5 @@
+// Copyright (c) 2013 Anders Fogh Eriksen
+"Open in Safari" = "Åbn i Safari";
+"Open in Chrome" = "Åbn i Chrome";
+"Copy Link" = "Kopier Link";
+"Mail Link to this Page" = "Mail Link til denne side";

+ 2 - 0
Libraries external/SwiftWebVC/Strings/de.lproj/SwiftWebVC.strings

@@ -0,0 +1,2 @@
+"Open in Safari" = "In Safari öffnen";
+"Open in Chrome" = "In Chrome öffnen";

+ 3 - 0
Libraries external/SwiftWebVC/Strings/en.lproj/SwiftWebVC.strings

@@ -0,0 +1,3 @@
+// Copyright (c) 2013 Alex Ruperez
+"Open in Safari" = "Open in Safari";
+"Open in Chrome" = "Open in Chrome";

+ 3 - 0
Libraries external/SwiftWebVC/Strings/es-ES.lproj/SwiftWebVC.strings

@@ -0,0 +1,3 @@
+// Copyright (c) 2013 Alex Ruperez
+"Open in Safari" = "Abrir en Safari";
+"Open in Chrome" = "Abrir en Chrome";

+ 3 - 0
Libraries external/SwiftWebVC/Strings/es.lproj/SwiftWebVC.strings

@@ -0,0 +1,3 @@
+// Copyright (c) 2013 Alex Ruperez
+"Open in Safari" = "Abrir en Safari";
+"Open in Chrome" = "Abrir en Chrome";

+ 3 - 0
Libraries external/SwiftWebVC/Strings/fr.lproj/SwiftWebVC.strings

@@ -0,0 +1,3 @@
+// Copyright (c) 2013 Benjamin Michotte
+"Open in Safari" = "Ouvrir dans Safari";
+"Open in Chrome" = "Ouvrir dans Chrome";

+ 2 - 0
Libraries external/SwiftWebVC/Strings/ja.lproj/SwiftWebVC.strings

@@ -0,0 +1,2 @@
+"Open in Safari" = "Safariで開く";
+"Open in Chrome" = "Chromeで開く";

+ 2 - 0
Libraries external/SwiftWebVC/Strings/pt.lproj/SwiftWebVC.strings

@@ -0,0 +1,2 @@
+"Open in Safari" = "Abrir no Safari";
+"Open in Chrome" = "Abrir no Chrome";

+ 2 - 0
Libraries external/SwiftWebVC/Strings/vi.lproj/SwiftWebVC.strings

@@ -0,0 +1,2 @@
+"Open in Safari" = "Mở bằng Safari";
+"Open in Chrome" = "Mở bằng Chrome";

+ 6 - 0
Libraries external/SwiftWebVC/Strings/zh-Hans.lproj/SwiftWebVC.strings

@@ -0,0 +1,6 @@
+// Copyright (c) 2013 James Stout
+"Open in Safari" = "在Safari中打开";
+"Open in Chrome" = "在Chrome中打开";
+"Copy Link" = "复制网页链接";
+"Mail Link to this Page" = "以电邮传送此页链接";
+"Cancel"="取消";

+ 3 - 0
Libraries external/SwiftWebVC/Strings/zh-Hant.lproj/SwiftWebVC.strings

@@ -0,0 +1,3 @@
+// Copyright (c) 2013 James Stout
+"Open in Safari" = "打開Safari";
+"Open in Chrome" = "打開Chrome";

+ 82 - 0
Libraries external/SwiftWebVC/SwiftModalWebVC.swift

@@ -0,0 +1,82 @@
+//
+//  SwiftModalWebVC.swift
+//
+//  Created by Myles Ringle on 24/06/2015.
+//  Transcribed from code used in SVWebViewController.
+//  Copyright (c) 2015 Myles Ringle & Oliver Letterer. All rights reserved.
+//
+
+import UIKit
+
+public class SwiftModalWebVC: UINavigationController {
+    
+    public enum SwiftModalWebVCTheme {
+        case lightBlue, lightBlack, dark
+    }
+    
+    weak var webViewDelegate: UIWebViewDelegate? = nil
+    
+    public convenience init(urlString: String) {
+        self.init(pageURL: URL(string: urlString)!)
+    }
+    
+    public convenience init(urlString: String, theme: SwiftModalWebVCTheme) {
+        self.init(pageURL: URL(string: urlString)!, theme: theme)
+    }
+    
+    public convenience init(pageURL: URL) {
+        self.init(request: URLRequest(url: pageURL))
+    }
+    
+    public convenience init(pageURL: URL, theme: SwiftModalWebVCTheme) {
+        self.init(request: URLRequest(url: pageURL), theme: theme)
+    }
+    
+    public init(request: URLRequest, theme: SwiftModalWebVCTheme = .lightBlue) {
+        let webViewController = SwiftWebVC(aRequest: request)
+        webViewController.storedStatusColor = UINavigationBar.appearance().barStyle
+
+        let doneButton = UIBarButtonItem(image: SwiftWebVC.bundledImage(named: "SwiftWebVCDismiss"),
+                                         style: UIBarButtonItemStyle.plain,
+                                         target: webViewController,
+                                         action: #selector(SwiftWebVC.doneButtonTapped))
+        
+        switch theme {
+        case .lightBlue:
+            doneButton.tintColor = nil
+            webViewController.buttonColor = nil
+            webViewController.titleColor = UIColor.black
+            UINavigationBar.appearance().barStyle = UIBarStyle.default
+        case .lightBlack:
+            doneButton.tintColor = UIColor.darkGray
+            webViewController.buttonColor = UIColor.darkGray
+            webViewController.titleColor = UIColor.black
+            UINavigationBar.appearance().barStyle = UIBarStyle.default
+        case .dark:
+            doneButton.tintColor = UIColor.white
+            webViewController.buttonColor = UIColor.white
+            webViewController.titleColor = UIColor.groupTableViewBackground
+            UINavigationBar.appearance().barStyle = UIBarStyle.black
+        }
+        
+        if (UIDevice.current.userInterfaceIdiom == UIUserInterfaceIdiom.pad) {
+            webViewController.navigationItem.leftBarButtonItem = doneButton
+        }
+        else {
+            webViewController.navigationItem.rightBarButtonItem = doneButton
+        }
+        super.init(rootViewController: webViewController)
+    }
+    
+    override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
+        super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
+    }
+    
+    required public init(coder aDecoder: NSCoder) {
+        fatalError("init(coder:) has not been implemented")
+    }
+    
+    override public func viewWillAppear(_ animated: Bool) {
+        super.viewWillAppear(false)
+    }
+}

+ 310 - 0
Libraries external/SwiftWebVC/SwiftWebVC.swift

@@ -0,0 +1,310 @@
+//
+//  SwiftWebVC.swift
+//
+//  Created by Myles Ringle on 24/06/2015.
+//  Transcribed from code used in SVWebViewController.
+//  Copyright (c) 2015 Myles Ringle & Sam Vermette. All rights reserved.
+//
+
+import WebKit
+
+public protocol SwiftWebVCDelegate: class {
+    func didStartLoading()
+    func didFinishLoading(success: Bool)
+}
+
+public class SwiftWebVC: UIViewController {
+    
+    public weak var delegate: SwiftWebVCDelegate?
+    var storedStatusColor: UIBarStyle?
+    var buttonColor: UIColor? = nil
+    var titleColor: UIColor? = nil
+    var closing: Bool! = false
+    
+    lazy var backBarButtonItem: UIBarButtonItem =  {
+        var tempBackBarButtonItem = UIBarButtonItem(image: SwiftWebVC.bundledImage(named: "SwiftWebVCBack"),
+                                                    style: UIBarButtonItemStyle.plain,
+                                                    target: self,
+                                                    action: #selector(SwiftWebVC.goBackTapped(_:)))
+        tempBackBarButtonItem.width = 18.0
+        tempBackBarButtonItem.tintColor = self.buttonColor
+        return tempBackBarButtonItem
+    }()
+    
+    lazy var forwardBarButtonItem: UIBarButtonItem =  {
+        var tempForwardBarButtonItem = UIBarButtonItem(image: SwiftWebVC.bundledImage(named: "SwiftWebVCNext"),
+                                                       style: UIBarButtonItemStyle.plain,
+                                                       target: self,
+                                                       action: #selector(SwiftWebVC.goForwardTapped(_:)))
+        tempForwardBarButtonItem.width = 18.0
+        tempForwardBarButtonItem.tintColor = self.buttonColor
+        return tempForwardBarButtonItem
+    }()
+    
+    lazy var refreshBarButtonItem: UIBarButtonItem = {
+        var tempRefreshBarButtonItem = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.refresh,
+                                                       target: self,
+                                                       action: #selector(SwiftWebVC.reloadTapped(_:)))
+        tempRefreshBarButtonItem.tintColor = self.buttonColor
+        return tempRefreshBarButtonItem
+    }()
+    
+    lazy var stopBarButtonItem: UIBarButtonItem = {
+        var tempStopBarButtonItem = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.stop,
+                                                    target: self,
+                                                    action: #selector(SwiftWebVC.stopTapped(_:)))
+        tempStopBarButtonItem.tintColor = self.buttonColor
+        return tempStopBarButtonItem
+    }()
+    
+    lazy var actionBarButtonItem: UIBarButtonItem = {
+        var tempActionBarButtonItem = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.action,
+                                                      target: self,
+                                                      action: #selector(SwiftWebVC.actionButtonTapped(_:)))
+        tempActionBarButtonItem.tintColor = self.buttonColor
+        return tempActionBarButtonItem
+    }()
+    
+    
+    lazy var webView: WKWebView = {
+        var tempWebView = WKWebView(frame: UIScreen.main.bounds)
+        tempWebView.uiDelegate = self
+        tempWebView.navigationDelegate = self
+        return tempWebView;
+    }()
+    
+    var request: URLRequest!
+    
+    var navBarTitle: UILabel!
+    
+    ////////////////////////////////////////////////
+    
+    deinit {
+        webView.stopLoading()
+        UIApplication.shared.isNetworkActivityIndicatorVisible = false
+        webView.uiDelegate = nil;
+        webView.navigationDelegate = nil;
+    }
+    
+    public convenience init(urlString: String) {
+        self.init(pageURL: URL(string: urlString)!)
+    }
+    
+    public convenience init(pageURL: URL) {
+        self.init(aRequest: URLRequest(url: pageURL))
+    }
+    
+    public convenience init(aRequest: URLRequest) {
+        self.init()
+        self.request = aRequest
+    }
+    
+    func loadRequest(_ request: URLRequest) {
+        webView.load(request)
+    }
+    
+    ////////////////////////////////////////////////
+    // View Lifecycle
+    
+    override public func loadView() {
+        view = webView
+        loadRequest(request)
+    }
+    
+    override public func viewDidLoad() {
+        super.viewDidLoad()
+        updateToolbarItems()
+    }
+    
+    override public func viewWillAppear(_ animated: Bool) {
+        assert(self.navigationController != nil, "SVWebViewController needs to be contained in a UINavigationController. If you are presenting SVWebViewController modally, use SVModalWebViewController instead.")
+        
+        navBarTitle = UILabel()
+        navBarTitle.backgroundColor = UIColor.clear
+        if presentingViewController == nil {
+            if let titleAttributes = navigationController!.navigationBar.titleTextAttributes {
+                navBarTitle.textColor = titleAttributes["NSColor"] as! UIColor
+            }
+        }
+        else {
+            navBarTitle.textColor = self.titleColor
+        }
+        navBarTitle.shadowOffset = CGSize(width: 0, height: 1);
+        navBarTitle.font = UIFont(name: "HelveticaNeue-Medium", size: 17.0)
+        
+        navigationItem.titleView = navBarTitle;
+        
+        super.viewWillAppear(true)
+        
+        if (UIDevice.current.userInterfaceIdiom == UIUserInterfaceIdiom.phone) {
+            self.navigationController?.setToolbarHidden(false, animated: false)
+        }
+        else if (UIDevice.current.userInterfaceIdiom == UIUserInterfaceIdiom.pad) {
+            self.navigationController?.setToolbarHidden(true, animated: true)
+        }
+    }
+    
+    override public func viewWillDisappear(_ animated: Bool) {
+        super.viewWillDisappear(true)
+        
+        if (UIDevice.current.userInterfaceIdiom == UIUserInterfaceIdiom.phone) {
+            self.navigationController?.setToolbarHidden(true, animated: true)
+        }
+    }
+    
+    override public func viewDidDisappear(_ animated: Bool) {
+        super.viewDidDisappear(true)
+        UIApplication.shared.isNetworkActivityIndicatorVisible = false
+    }
+    
+    ////////////////////////////////////////////////
+    // Toolbar
+    
+    func updateToolbarItems() {
+        backBarButtonItem.isEnabled = webView.canGoBack
+        forwardBarButtonItem.isEnabled = webView.canGoForward
+        
+        
+        let refreshStopBarButtonItem: UIBarButtonItem = webView.isLoading ? stopBarButtonItem : refreshBarButtonItem
+        
+        let fixedSpace: UIBarButtonItem = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.fixedSpace, target: nil, action: nil)
+        let flexibleSpace: UIBarButtonItem = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.flexibleSpace, target: nil, action: nil)
+        
+        if (UIDevice.current.userInterfaceIdiom == UIUserInterfaceIdiom.pad) {
+            
+            let toolbarWidth: CGFloat = 250.0
+            fixedSpace.width = 35.0
+            
+            let items: NSArray = [fixedSpace, refreshStopBarButtonItem, fixedSpace, backBarButtonItem, fixedSpace, forwardBarButtonItem, fixedSpace, actionBarButtonItem]
+            
+            let toolbar: UIToolbar = UIToolbar(frame: CGRect(x: 0.0, y: 0.0, width: toolbarWidth, height: 44.0))
+            if !closing {
+                toolbar.items = items as? [UIBarButtonItem]
+                if presentingViewController == nil {
+                    toolbar.barTintColor = navigationController!.navigationBar.barTintColor
+                }
+                else {
+                    toolbar.barStyle = navigationController!.navigationBar.barStyle
+                }
+                toolbar.tintColor = navigationController!.navigationBar.tintColor
+            }
+            navigationItem.rightBarButtonItems = items.reverseObjectEnumerator().allObjects as? [UIBarButtonItem]
+            
+        }
+        else {
+            let items: NSArray = [fixedSpace, backBarButtonItem, flexibleSpace, forwardBarButtonItem, flexibleSpace, refreshStopBarButtonItem, flexibleSpace, actionBarButtonItem, fixedSpace]
+            
+            if !closing {
+                if presentingViewController == nil {
+                    navigationController!.toolbar.barTintColor = navigationController!.navigationBar.barTintColor
+                }
+                else {
+                    navigationController!.toolbar.barStyle = navigationController!.navigationBar.barStyle
+                }
+                navigationController!.toolbar.tintColor = navigationController!.navigationBar.tintColor
+                toolbarItems = items as? [UIBarButtonItem]
+            }
+        }
+    }
+    
+    
+    ////////////////////////////////////////////////
+    // Target Actions
+    
+    func goBackTapped(_ sender: UIBarButtonItem) {
+        webView.goBack()
+    }
+    
+    func goForwardTapped(_ sender: UIBarButtonItem) {
+        webView.goForward()
+    }
+    
+    func reloadTapped(_ sender: UIBarButtonItem) {
+        webView.reload()
+    }
+    
+    func stopTapped(_ sender: UIBarButtonItem) {
+        webView.stopLoading()
+        updateToolbarItems()
+    }
+    
+    func actionButtonTapped(_ sender: AnyObject) {
+        
+        if let url: URL = ((webView.url != nil) ? webView.url : request.url) {
+            let activities: NSArray = [SwiftWebVCActivitySafari(), SwiftWebVCActivityChrome()]
+            
+            if url.absoluteString.hasPrefix("file:///") {
+                let dc: UIDocumentInteractionController = UIDocumentInteractionController(url: url)
+                dc.presentOptionsMenu(from: view.bounds, in: view, animated: true)
+            }
+            else {
+                let activityController: UIActivityViewController = UIActivityViewController(activityItems: [url], applicationActivities: activities as? [UIActivity])
+                
+                if floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_7_1 && UIDevice.current.userInterfaceIdiom == UIUserInterfaceIdiom.pad {
+                    let ctrl: UIPopoverPresentationController = activityController.popoverPresentationController!
+                    ctrl.sourceView = view
+                    ctrl.barButtonItem = sender as? UIBarButtonItem
+                }
+                
+                present(activityController, animated: true, completion: nil)
+            }
+        }
+    }
+    
+    ////////////////////////////////////////////////
+    
+    func doneButtonTapped() {
+        closing = true
+        UINavigationBar.appearance().barStyle = storedStatusColor!
+        self.dismiss(animated: true, completion: nil)
+    }
+
+    // MARK: - Class Methods
+
+    /// Helper function to get image within SwiftWebVCResources bundle
+    ///
+    /// - parameter named: The name of the image in the SwiftWebVCResources bundle
+    class func bundledImage(named: String) -> UIImage? {
+        let image = UIImage(named: named)
+        if image == nil {
+            return UIImage(named: named, in: Bundle(for: SwiftWebVC.classForCoder()), compatibleWith: nil)
+        } // Replace MyBasePodClass with yours
+        return image
+    }
+    
+}
+
+extension SwiftWebVC: WKUIDelegate {
+    
+    // Add any desired WKUIDelegate methods here: https://developer.apple.com/reference/webkit/wkuidelegate
+    
+}
+
+extension SwiftWebVC: WKNavigationDelegate {
+    
+    public func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) {
+        self.delegate?.didStartLoading()
+        UIApplication.shared.isNetworkActivityIndicatorVisible = true
+        updateToolbarItems()
+    }
+    
+    public func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
+        self.delegate?.didFinishLoading(success: true)
+        UIApplication.shared.isNetworkActivityIndicatorVisible = false
+        
+        webView.evaluateJavaScript("document.title", completionHandler: {(response, error) in
+            self.navBarTitle.text = response as! String?
+            self.navBarTitle.sizeToFit()
+            self.updateToolbarItems()
+        })
+        
+    }
+    
+    public func webView(_ webView: WKWebView, didFail navigation: WKNavigation!, withError error: Error) {
+        self.delegate?.didFinishLoading(success: false)
+        UIApplication.shared.isNetworkActivityIndicatorVisible = false
+        updateToolbarItems()
+    }
+    
+    
+}

+ 46 - 0
Libraries external/SwiftWebVC/SwiftWebVCActivity.swift

@@ -0,0 +1,46 @@
+//
+//  SwiftWebVCActivity.swift
+//
+//  Created by Myles Ringle on 24/06/2015.
+//  Transcribed from code used in SVWebViewController.
+//  Copyright (c) 2015 Myles Ringle & Sam Vermette. All rights reserved.
+//
+
+import UIKit
+
+
+class SwiftWebVCActivity: UIActivity {
+
+    var URLToOpen: URL?
+    var schemePrefix: String?
+    
+    override var activityType : UIActivityType? {
+        let typeArray = "\(type(of: self))".components(separatedBy: ".")
+        let type: String = typeArray[typeArray.count-1]
+        return UIActivityType(rawValue: type)
+    }
+        
+    override var activityImage : UIImage {
+        if let type = activityType?.rawValue {
+            if (UIDevice.current.userInterfaceIdiom == UIUserInterfaceIdiom.pad) {
+                return SwiftWebVC.bundledImage(named: "\(type)-iPad")!
+            }
+            else {
+                return SwiftWebVC.bundledImage(named: "\(type)")!
+            }
+        }
+        else{
+            assert(false, "Unknow type")
+            return UIImage()
+        }
+    }
+            
+    override func prepare(withActivityItems activityItems: [Any]) {
+        for activityItem in activityItems {
+            if activityItem is URL {
+                URLToOpen = activityItem as? URL
+            }
+        }
+    }
+
+}

+ 52 - 0
Libraries external/SwiftWebVC/SwiftWebVCActivityChrome.swift

@@ -0,0 +1,52 @@
+//
+//  SwiftWebVCActivityChrome.swift
+//
+//  Created by Myles Ringle on 24/06/2015.
+//  Transcribed from code used in SVWebViewController.
+//  Copyright (c) 2015 Myles Ringle & Sam Vermette. All rights reserved.
+//
+
+import UIKit
+
+class SwiftWebVCActivityChrome : SwiftWebVCActivity {
+
+    override var activityTitle : String {
+        return NSLocalizedString("Open in Chrome", tableName: "SwiftWebVC", comment: "")
+    }
+    
+    override func canPerform(withActivityItems activityItems: [Any]) -> Bool {
+        for activityItem in activityItems {
+            if activityItem is URL, UIApplication.shared.canOpenURL(URL(string: "googlechrome://")!) {
+                return true;
+            }
+        }
+        return false;
+    }
+    
+    override func perform() {
+        let inputURL: URL! = URLToOpen as URL!
+        let scheme: String! = inputURL.scheme
+        
+        // Replace the URL Scheme with the Chrome equivalent.
+        var chromeScheme: String? = nil;
+        if scheme == "http" {
+            chromeScheme = "googlechrome"
+        }
+        else if scheme == "https" {
+            chromeScheme = "googlechromes"
+        }
+        
+        // Proceed only if a valid Google Chrome URI Scheme is available.
+        if chromeScheme != nil {
+            let absoluteString: NSString! = inputURL!.absoluteString as NSString!
+            let rangeForScheme: NSRange! = absoluteString.range(of: ":")
+            let urlNoScheme: String! = absoluteString.substring(from: rangeForScheme.location)
+            let chromeURLString: String! = chromeScheme!+urlNoScheme
+            let chromeURL: URL! = URL(string: chromeURLString)
+            
+            // Open the URL with Chrome.
+            UIApplication.shared.openURL(chromeURL)
+        }
+    }
+    
+}

+ 31 - 0
Libraries external/SwiftWebVC/SwiftWebVCActivitySafari.swift

@@ -0,0 +1,31 @@
+//
+//  SwiftWebVCActivitySafari.swift
+//
+//  Created by Myles Ringle on 24/06/2015.
+//  Transcribed from code used in SVWebViewController.
+//  Copyright (c) 2015 Myles Ringle & Sam Vermette. All rights reserved.
+//
+
+import UIKit
+
+class SwiftWebVCActivitySafari : SwiftWebVCActivity {
+    
+    override var activityTitle : String {
+        return NSLocalizedString("Open in Safari", tableName: "SwiftWebVC", comment: "")
+    }
+    
+    override func canPerform(withActivityItems activityItems: [Any]) -> Bool {
+        for activityItem in activityItems {
+            if let activityItem = activityItem as? URL, UIApplication.shared.canOpenURL(activityItem) {
+                return true
+            }
+        }
+        return false
+    }
+    
+    override func perform() {
+        let completed: Bool = UIApplication.shared.openURL(URLToOpen! as URL)
+        activityDidFinish(completed)
+    }
+    
+}

+ 87 - 0
Nextcloud.xcodeproj/project.pbxproj

@@ -494,6 +494,13 @@
 		F78088EB1DD3A1DB005C5A7C /* cryptocloud.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = F78088E51DD3A1DB005C5A7C /* cryptocloud.xcdatamodeld */; };
 		F78BFED41D3111B800E513CF /* LaunchScreenNextcloud.xib in Resources */ = {isa = PBXBuildFile; fileRef = F78BFECA1D3111B800E513CF /* LaunchScreenNextcloud.xib */; };
 		F78BFEE11D31126B00E513CF /* MainInterface.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = F78BFEDE1D31126B00E513CF /* MainInterface.storyboard */; };
+		F7B1FB461E72C0F4001781FE /* Media.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = F7B1FB331E72C0F4001781FE /* Media.xcassets */; };
+		F7B1FB471E72C0F4001781FE /* SwiftWebVC.strings in Resources */ = {isa = PBXBuildFile; fileRef = F7B1FB351E72C0F4001781FE /* SwiftWebVC.strings */; };
+		F7B1FB481E72C0F4001781FE /* SwiftModalWebVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7B1FB411E72C0F4001781FE /* SwiftModalWebVC.swift */; };
+		F7B1FB491E72C0F4001781FE /* SwiftWebVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7B1FB421E72C0F4001781FE /* SwiftWebVC.swift */; };
+		F7B1FB4A1E72C0F4001781FE /* SwiftWebVCActivity.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7B1FB431E72C0F4001781FE /* SwiftWebVCActivity.swift */; };
+		F7B1FB4B1E72C0F4001781FE /* SwiftWebVCActivityChrome.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7B1FB441E72C0F4001781FE /* SwiftWebVCActivityChrome.swift */; };
+		F7B1FB4C1E72C0F4001781FE /* SwiftWebVCActivitySafari.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7B1FB451E72C0F4001781FE /* SwiftWebVCActivitySafari.swift */; };
 		F7BB14961D5B62C000ECEE68 /* libcrypto.a in Frameworks */ = {isa = PBXBuildFile; fileRef = F70A63061D5B3467004E2AA5 /* libcrypto.a */; };
 		F7BB14971D5B62C000ECEE68 /* libssl.a in Frameworks */ = {isa = PBXBuildFile; fileRef = F70A63071D5B3467004E2AA5 /* libssl.a */; };
 		F7BE6E2F1D2D5C3B00106933 /* CCQuickActions.m in Sources */ = {isa = PBXBuildFile; fileRef = F7BE6E2C1D2D5C3B00106933 /* CCQuickActions.m */; };
@@ -1404,6 +1411,23 @@
 		F7ACE42F1BAC0268006C0017 /* CCManageCameraUpload.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CCManageCameraUpload.m; sourceTree = "<group>"; };
 		F7ACE4301BAC0268006C0017 /* CCSettings.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CCSettings.h; sourceTree = "<group>"; };
 		F7ACE4311BAC0268006C0017 /* CCSettings.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CCSettings.m; sourceTree = "<group>"; };
+		F7B1FB331E72C0F4001781FE /* Media.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Media.xcassets; sourceTree = "<group>"; };
+		F7B1FB361E72C0F4001781FE /* da */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = da; path = da.lproj/SwiftWebVC.strings; sourceTree = "<group>"; };
+		F7B1FB371E72C0F4001781FE /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/SwiftWebVC.strings; sourceTree = "<group>"; };
+		F7B1FB381E72C0F4001781FE /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/SwiftWebVC.strings; sourceTree = "<group>"; };
+		F7B1FB391E72C0F4001781FE /* es-ES */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-ES"; path = "es-ES.lproj/SwiftWebVC.strings"; sourceTree = "<group>"; };
+		F7B1FB3A1E72C0F4001781FE /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/SwiftWebVC.strings; sourceTree = "<group>"; };
+		F7B1FB3B1E72C0F4001781FE /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/SwiftWebVC.strings; sourceTree = "<group>"; };
+		F7B1FB3C1E72C0F4001781FE /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/SwiftWebVC.strings; sourceTree = "<group>"; };
+		F7B1FB3D1E72C0F4001781FE /* pt */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pt; path = pt.lproj/SwiftWebVC.strings; sourceTree = "<group>"; };
+		F7B1FB3E1E72C0F4001781FE /* vi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = vi; path = vi.lproj/SwiftWebVC.strings; sourceTree = "<group>"; };
+		F7B1FB3F1E72C0F4001781FE /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/SwiftWebVC.strings"; sourceTree = "<group>"; };
+		F7B1FB401E72C0F4001781FE /* zh-Hant */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hant"; path = "zh-Hant.lproj/SwiftWebVC.strings"; sourceTree = "<group>"; };
+		F7B1FB411E72C0F4001781FE /* SwiftModalWebVC.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SwiftModalWebVC.swift; sourceTree = "<group>"; };
+		F7B1FB421E72C0F4001781FE /* SwiftWebVC.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SwiftWebVC.swift; sourceTree = "<group>"; };
+		F7B1FB431E72C0F4001781FE /* SwiftWebVCActivity.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SwiftWebVCActivity.swift; sourceTree = "<group>"; };
+		F7B1FB441E72C0F4001781FE /* SwiftWebVCActivityChrome.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SwiftWebVCActivityChrome.swift; sourceTree = "<group>"; };
+		F7B1FB451E72C0F4001781FE /* SwiftWebVCActivitySafari.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SwiftWebVCActivitySafari.swift; sourceTree = "<group>"; };
 		F7B61E861DC13C20009E938F /* MagicalRecord.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = MagicalRecord.xcodeproj; path = "Libraries external/MagicalRecord/MagicalRecord.xcodeproj"; sourceTree = SOURCE_ROOT; };
 		F7B81D7F1C64E77F006D02DF /* CCCoreData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CCCoreData.h; sourceTree = "<group>"; };
 		F7B81D801C64E77F006D02DF /* CCCoreData.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CCCoreData.m; sourceTree = "<group>"; };
@@ -1728,6 +1752,7 @@
 				F7659A3A1DC0B760004860C4 /* PSTCollectionView */,
 				F70F0C4F1C8892C5008DAB36 /* REMenu */,
 				F70F05321C889184008DAB36 /* RNCryptor */,
+				F7B1FB311E72C0F4001781FE /* SwiftWebVC */,
 				F70F0F921C889487008DAB36 /* SSZipArchive */,
 				F7676A601D5CB1B900DF734C /* TWMessageBarManager */,
 				F73CCE271DC13798007E38D8 /* UICKeyChainStore */,
@@ -2869,6 +2894,36 @@
 			path = Settings;
 			sourceTree = "<group>";
 		};
+		F7B1FB311E72C0F4001781FE /* SwiftWebVC */ = {
+			isa = PBXGroup;
+			children = (
+				F7B1FB321E72C0F4001781FE /* Resources */,
+				F7B1FB341E72C0F4001781FE /* Strings */,
+				F7B1FB411E72C0F4001781FE /* SwiftModalWebVC.swift */,
+				F7B1FB421E72C0F4001781FE /* SwiftWebVC.swift */,
+				F7B1FB431E72C0F4001781FE /* SwiftWebVCActivity.swift */,
+				F7B1FB441E72C0F4001781FE /* SwiftWebVCActivityChrome.swift */,
+				F7B1FB451E72C0F4001781FE /* SwiftWebVCActivitySafari.swift */,
+			);
+			path = SwiftWebVC;
+			sourceTree = "<group>";
+		};
+		F7B1FB321E72C0F4001781FE /* Resources */ = {
+			isa = PBXGroup;
+			children = (
+				F7B1FB331E72C0F4001781FE /* Media.xcassets */,
+			);
+			path = Resources;
+			sourceTree = "<group>";
+		};
+		F7B1FB341E72C0F4001781FE /* Strings */ = {
+			isa = PBXGroup;
+			children = (
+				F7B1FB351E72C0F4001781FE /* SwiftWebVC.strings */,
+			);
+			path = Strings;
+			sourceTree = "<group>";
+		};
 		F7B61E871DC13C20009E938F /* Products */ = {
 			isa = PBXGroup;
 			children = (
@@ -3498,6 +3553,13 @@
 				ru,
 				pl,
 				es,
+				da,
+				"es-ES",
+				ja,
+				pt,
+				vi,
+				"zh-Hans",
+				"zh-Hant",
 			);
 			mainGroup = F7F67B9F1A24D27800EE80DA;
 			productRefGroup = F7F67B9F1A24D27800EE80DA;
@@ -3759,6 +3821,7 @@
 				F7F54CFB1E5B14C700E19C62 /* UIBarButtonItemArrowLeft@2x.png in Resources */,
 				F77B0F641D118A16002130FE /* ZSSh4.png in Resources */,
 				F77B0F671D118A16002130FE /* InfoPlist.strings in Resources */,
+				F7B1FB461E72C0F4001781FE /* Media.xcassets in Resources */,
 				F7C525A21E3B6DA800FFE02C /* CCNotification.storyboard in Resources */,
 				F77B0F6B1D118A16002130FE /* ZSSundo.png in Resources */,
 				F77B0F6C1D118A16002130FE /* ZSSsubscript.png in Resources */,
@@ -3791,6 +3854,7 @@
 				F77B0F861D118A16002130FE /* LMMediaPlayerView.bundle in Resources */,
 				F77B0F8A1D118A16002130FE /* CCCellMain.xib in Resources */,
 				F77B0F8C1D118A16002130FE /* CCCellMainTransfer.xib in Resources */,
+				F7B1FB471E72C0F4001781FE /* SwiftWebVC.strings in Resources */,
 				F77B0F8E1D118A16002130FE /* LMMediaPlayerView.xib in Resources */,
 				F77B0F8F1D118A16002130FE /* ZSSunlink@2x.png in Resources */,
 				F77B0F901D118A16002130FE /* ZSSpicker@2x.png in Resources */,
@@ -4006,6 +4070,7 @@
 				F77B0E051D118A16002130FE /* ReaderDocument.m in Sources */,
 				F7F06ECD1DBFACC600099AE9 /* CTAssetThumbnailStacks.m in Sources */,
 				F7659A581DC0B760004860C4 /* NSIndexPath+PSTCollectionViewAdditions.m in Sources */,
+				F7B1FB4B1E72C0F4001781FE /* SwiftWebVCActivityChrome.swift in Sources */,
 				F7659A681DC0B760004860C4 /* PSTCollectionViewUpdateItem.m in Sources */,
 				F7F54D061E5B14C800E19C62 /* MWCaptionView.m in Sources */,
 				F7C00D471E2D0D0F0032160B /* CCCellOffline.m in Sources */,
@@ -4054,6 +4119,7 @@
 				F77B0E291D118A16002130FE /* NSArray+LMMediaPlayerShuffle.m in Sources */,
 				F77B0E2A1D118A16002130FE /* REMenu.m in Sources */,
 				F73CCDDB1DC13776007E38D8 /* XLFormButtonCell.m in Sources */,
+				F7B1FB491E72C0F4001781FE /* SwiftWebVC.swift in Sources */,
 				F7F06E9B1DBFACC600099AE9 /* UICollectionView+CTAssetsPickerController.m in Sources */,
 				F77B0E2D1D118A16002130FE /* CYRTextView.m in Sources */,
 				F77B0E2F1D118A16002130FE /* LMMediaItemStreamingCache.m in Sources */,
@@ -4065,6 +4131,7 @@
 				F7F06EB91DBFACC600099AE9 /* CTAssetsGridViewLayout.m in Sources */,
 				F7DA62AE1E41E666003E1740 /* CCOfflinePageContent.m in Sources */,
 				F7FB5F131E66CDCB00389481 /* CCOfflineContainer.m in Sources */,
+				F7B1FB4C1E72C0F4001781FE /* SwiftWebVCActivitySafari.swift in Sources */,
 				F77B0E351D118A16002130FE /* NYXImagesHelper.m in Sources */,
 				F73CCE171DC13776007E38D8 /* XLFormTextView.m in Sources */,
 				F77B0E361D118A16002130FE /* ZSSBarButtonItem.m in Sources */,
@@ -4140,6 +4207,7 @@
 				F77B0E761D118A16002130FE /* ReaderViewController.m in Sources */,
 				F77B0E781D118A16002130FE /* ReaderThumbFetch.m in Sources */,
 				F77B0E7B1D118A16002130FE /* CCPassaporto.m in Sources */,
+				F7B1FB4A1E72C0F4001781FE /* SwiftWebVCActivity.swift in Sources */,
 				F7F06EA51DBFACC600099AE9 /* CTAssetItemViewController.m in Sources */,
 				F7659A5A1DC0B760004860C4 /* PSTCollectionView.m in Sources */,
 				F7BF1B431D51E893000854F6 /* CCLogin.m in Sources */,
@@ -4162,6 +4230,7 @@
 				F72AAECB1E5C60C700BB17E1 /* AHKActionSheetViewController.m in Sources */,
 				F77B0E901D118A16002130FE /* CCManageHelp.m in Sources */,
 				F77B0E911D118A16002130FE /* CCTemplates.m in Sources */,
+				F7B1FB481E72C0F4001781FE /* SwiftModalWebVC.swift in Sources */,
 				F73CCDE11DC13776007E38D8 /* XLFormDatePickerCell.m in Sources */,
 				F72AAECD1E5C60C700BB17E1 /* UIWindow+AHKAdditions.m in Sources */,
 				F77B0E921D118A16002130FE /* CCCellMainTransfer.m in Sources */,
@@ -4308,6 +4377,24 @@
 			name = Intro.strings;
 			sourceTree = "<group>";
 		};
+		F7B1FB351E72C0F4001781FE /* SwiftWebVC.strings */ = {
+			isa = PBXVariantGroup;
+			children = (
+				F7B1FB361E72C0F4001781FE /* da */,
+				F7B1FB371E72C0F4001781FE /* de */,
+				F7B1FB381E72C0F4001781FE /* en */,
+				F7B1FB391E72C0F4001781FE /* es-ES */,
+				F7B1FB3A1E72C0F4001781FE /* es */,
+				F7B1FB3B1E72C0F4001781FE /* fr */,
+				F7B1FB3C1E72C0F4001781FE /* ja */,
+				F7B1FB3D1E72C0F4001781FE /* pt */,
+				F7B1FB3E1E72C0F4001781FE /* vi */,
+				F7B1FB3F1E72C0F4001781FE /* zh-Hans */,
+				F7B1FB401E72C0F4001781FE /* zh-Hant */,
+			);
+			name = SwiftWebVC.strings;
+			sourceTree = "<group>";
+		};
 		F7B381BF1C074E3E004693F8 /* Error.strings */ = {
 			isa = PBXVariantGroup;
 			children = (

+ 14 - 0
iOSClient/Main/CCMain.m

@@ -3216,6 +3216,7 @@
     
     [CCMenu setTitleFont:[UIFont systemFontOfSize:12.0]];
     [CCMenu showMenuInView:self.navigationController.view fromRect:rect menuItems:menuArray withOptions:options];
+    
 #endif
     
 #if defined(MENU_BRAND_ENABLE) && defined(OPTION_MULTIUSER_DISABLE)
@@ -3226,18 +3227,24 @@
     item.title = @"Example title ... N. 1";
     item.image = [UIImage imageNamed:image_notification];
     item.target = self;
+    item.action = @selector(goToWebVC:);
+    item.argument = @"https://www.nextcloud.com";
     [menuArray addObject:item];
 
     item = [CCMenuItem new];
     item.title = @"Example title ... N. 2";
     item.image = [UIImage imageNamed:image_notification];
     item.target = self;
+    item.action = @selector(goToWebVC:);
+    item.argument = @"https://www.nextcloud.com";
     [menuArray addObject:item];
     
     item = [CCMenuItem new];
     item.title = @"Example title ... N. 3";
     item.image = [UIImage imageNamed:image_notification];
     item.target = self;
+    item.action = @selector(goToWebVC:);
+    item.argument = @"https://www.nextcloud.com";
     [menuArray addObject:item];
     
     OptionalConfiguration options;
@@ -3297,6 +3304,13 @@
     });
 }
 
+- (void)goToWebVC:(CCMenuItem *)sender
+{
+    SwiftWebVC *webVC = [[SwiftWebVC alloc] initWithUrlString:sender.argument];
+    
+    [self.navigationController pushViewController:webVC animated:YES];
+}
+
 #pragma --------------------------------------------------------------------------------------------
 #pragma mark ==== ReMenu ====
 #pragma --------------------------------------------------------------------------------------------