Browse Source

Merge pull request #2434 from nextcloud/develop

Version 4.8.1
Marino Faggiana 1 year ago
parent
commit
3eb9bbfb79
100 changed files with 1137 additions and 1927 deletions
  1. 2 1
      .swiftlint.yml
  2. 1 1
      Brand/Database.swift
  3. 0 0
      Brand/Intro/NCIntro.storyboard
  4. 0 0
      Brand/Intro/NCIntroCollectionViewCell.swift
  5. 0 0
      Brand/Intro/NCIntroCollectionViewCell.xib
  6. 0 0
      Brand/Intro/NCIntroViewController.swift
  7. 8 0
      Brand/NCBrand.swift
  8. 1 1
      Cartfile
  9. 2 2
      Cartfile.resolved
  10. 19 0
      ExternalResources/NCApplicationHandle.swift
  11. 98 67
      Nextcloud.xcodeproj/project.pbxproj
  12. 3 1
      iOSClient/AppDelegate.swift
  13. 3 1
      iOSClient/Data/NCElementsJSON.swift
  14. 94 0
      iOSClient/Data/NCManageDatabase+Groupfolders.swift
  15. 60 14
      iOSClient/Data/NCManageDatabase+Metadata.swift
  16. 58 59
      iOSClient/Data/NCManageDatabase+Video.swift
  17. 17 10
      iOSClient/Data/NCManageDatabase.swift
  18. 236 0
      iOSClient/Diagnostics/NCCapabilitiesView.swift
  19. 0 690
      iOSClient/Diagnostics/NCCapabilitiesViewController.storyboard
  20. 0 350
      iOSClient/Diagnostics/NCCapabilitiesViewController.swift
  21. 53 0
      iOSClient/Groupfolders/NCGroupfolders.storyboard
  22. 129 0
      iOSClient/Groupfolders/NCGroupfolders.swift
  23. 0 15
      iOSClient/Images.xcassets/arrow.left.arrow.right.imageset/Contents.json
  24. BIN
      iOSClient/Images.xcassets/arrow.left.arrow.right.imageset/transfer.pdf
  25. 0 15
      iOSClient/Images.xcassets/audioOff.imageset/Contents.json
  26. 0 53
      iOSClient/Images.xcassets/audioOff.imageset/audioOff.pdf
  27. 0 15
      iOSClient/Images.xcassets/audioOn.imageset/Contents.json
  28. 0 52
      iOSClient/Images.xcassets/audioOn.imageset/audioOn.pdf
  29. 0 15
      iOSClient/Images.xcassets/audioPlayFull.imageset/Contents.json
  30. BIN
      iOSClient/Images.xcassets/audioPlayFull.imageset/audioPlayFull.pdf
  31. 0 15
      iOSClient/Images.xcassets/bell.imageset/Contents.json
  32. BIN
      iOSClient/Images.xcassets/bell.imageset/bell-outline.pdf
  33. 0 15
      iOSClient/Images.xcassets/bolt.imageset/Contents.json
  34. 0 1
      iOSClient/Images.xcassets/bolt.imageset/lightning-bolt-outline.svg
  35. 0 15
      iOSClient/Images.xcassets/captions.bubble.imageset/Contents.json
  36. 0 1
      iOSClient/Images.xcassets/captions.bubble.imageset/subtitles-outline.svg
  37. 0 15
      iOSClient/Images.xcassets/doc.on.clipboard.imageset/Contents.json
  38. 0 1
      iOSClient/Images.xcassets/doc.on.clipboard.imageset/doc.on.clipboard.svg
  39. 0 1
      iOSClient/Images.xcassets/doc.on.doc.imageset/copy.svg
  40. BIN
      iOSClient/Images.xcassets/doc.text.viewfinder.imageset/scan.pdf
  41. 0 26
      iOSClient/Images.xcassets/encrypted.imageset/Contents.json
  42. BIN
      iOSClient/Images.xcassets/encrypted.imageset/encrypted.png
  43. BIN
      iOSClient/Images.xcassets/encrypted.imageset/encrypted@2x.png
  44. BIN
      iOSClient/Images.xcassets/encrypted.imageset/encrypted@3x.png
  45. 0 15
      iOSClient/Images.xcassets/forward.imageset/Contents.json
  46. 0 1
      iOSClient/Images.xcassets/forward.imageset/forward.svg
  47. 0 15
      iOSClient/Images.xcassets/gobackward.10.imageset/Contents.json
  48. 0 4
      iOSClient/Images.xcassets/gobackward.10.imageset/gobackward.15.svg
  49. 0 15
      iOSClient/Images.xcassets/goforward.10.imageset/Contents.json
  50. 0 4
      iOSClient/Images.xcassets/goforward.10.imageset/goforward.15.svg
  51. 0 1
      iOSClient/Images.xcassets/play.fill.imageset/play.svg
  52. 0 16
      iOSClient/Images.xcassets/plus-slash-minus.imageset/Contents.json
  53. BIN
      iOSClient/Images.xcassets/plus-slash-minus.imageset/plus-slash-minus.pdf
  54. 0 26
      iOSClient/Images.xcassets/plus.imageset/Contents.json
  55. BIN
      iOSClient/Images.xcassets/plus.imageset/add.png
  56. BIN
      iOSClient/Images.xcassets/plus.imageset/add@2x.png
  57. BIN
      iOSClient/Images.xcassets/plus.imageset/add@3x.png
  58. 0 15
      iOSClient/Images.xcassets/recent.imageset/Contents.json
  59. BIN
      iOSClient/Images.xcassets/recent.imageset/recent.pdf
  60. 0 15
      iOSClient/Images.xcassets/scan.imageset/Contents.json
  61. 0 1
      iOSClient/Images.xcassets/scan.imageset/icons8-scan.svg
  62. 1 4
      iOSClient/Images.xcassets/speaker0.imageset/Contents.json
  63. 8 0
      iOSClient/Images.xcassets/speaker0.imageset/speaker0.svg
  64. 1 4
      iOSClient/Images.xcassets/speaker1.imageset/Contents.json
  65. 8 0
      iOSClient/Images.xcassets/speaker1.imageset/speaker1.svg
  66. 1 4
      iOSClient/Images.xcassets/speaker2.imageset/Contents.json
  67. 4 0
      iOSClient/Images.xcassets/speaker2.imageset/speaker2.svg
  68. 1 4
      iOSClient/Images.xcassets/speaker3.imageset/Contents.json
  69. 4 0
      iOSClient/Images.xcassets/speaker3.imageset/speaker3.svg
  70. 0 15
      iOSClient/Images.xcassets/textRecognition.imageset/Contents.json
  71. BIN
      iOSClient/Images.xcassets/textRecognition.imageset/textRecognition.png
  72. 0 15
      iOSClient/Images.xcassets/themeLightDark.imageset/Contents.json
  73. BIN
      iOSClient/Images.xcassets/themeLightDark.imageset/themeLightDark.pdf
  74. 0 15
      iOSClient/Images.xcassets/transferDown.imageset/Contents.json
  75. 0 53
      iOSClient/Images.xcassets/transferDown.imageset/transferDown.pdf
  76. 0 15
      iOSClient/Images.xcassets/tray.and.arrow.down.imageset/Contents.json
  77. 0 1
      iOSClient/Images.xcassets/tray.and.arrow.down.imageset/archive-arrow-down-outline.svg
  78. 0 26
      iOSClient/Images.xcassets/utorrent.imageset/Contents.json
  79. BIN
      iOSClient/Images.xcassets/utorrent.imageset/utorrent.png
  80. BIN
      iOSClient/Images.xcassets/utorrent.imageset/utorrent@2x.png
  81. BIN
      iOSClient/Images.xcassets/utorrent.imageset/utorrent@3x.png
  82. 0 1
      iOSClient/Images.xcassets/video.imageset/video.svg
  83. 0 16
      iOSClient/Images.xcassets/zoomInMedia.imageset/Contents.json
  84. BIN
      iOSClient/Images.xcassets/zoomInMedia.imageset/plus.pdf
  85. 0 16
      iOSClient/Images.xcassets/zoomOutMedia.imageset/Contents.json
  86. BIN
      iOSClient/Images.xcassets/zoomOutMedia.imageset/minus.pdf
  87. 9 12
      iOSClient/Login/NCLoginWeb.swift
  88. 33 5
      iOSClient/Login/NCViewCertificateDetails.swift
  89. 35 60
      iOSClient/Main/Collection Common/NCCollectionViewCommon.swift
  90. 6 0
      iOSClient/Main/Collection Common/NCGridCell.swift
  91. 33 0
      iOSClient/Main/Collection Common/NCListCell.swift
  92. 62 22
      iOSClient/Main/Collection Common/NCListCell.xib
  93. 18 7
      iOSClient/Main/Main.storyboard
  94. 34 6
      iOSClient/Main/NCActionCenter.swift
  95. 8 0
      iOSClient/Main/NCCellProtocol.swift
  96. 43 12
      iOSClient/Main/NCPickerViewController.swift
  97. 20 12
      iOSClient/Media/NCMedia.swift
  98. 21 19
      iOSClient/Media/NCMediaCommandView.xib
  99. 2 2
      iOSClient/Menu/AppDelegate+Menu.swift
  100. 1 1
      iOSClient/Menu/NCCollectionViewCommon+Menu.swift

+ 2 - 1
.swiftlint.yml

@@ -37,7 +37,8 @@ disabled_rules:
   - cyclomatic_complexity
   - cyclomatic_complexity
   - nesting
   - nesting
   - shorthand_operator
   - shorthand_operator
-  
+  - force_try
+    
 excluded:
 excluded:
   - Carthage
   - Carthage
   - Pods
   - Pods

+ 1 - 1
Brand/Database.swift

@@ -26,4 +26,4 @@ import Foundation
 // Database Realm
 // Database Realm
 //
 //
 let databaseName                    = "nextcloud.realm"
 let databaseName                    = "nextcloud.realm"
-let databaseSchemaVersion: UInt64   = 274
+let databaseSchemaVersion: UInt64   = 297

+ 0 - 0
iOSClient/Intro/NCIntro.storyboard → Brand/Intro/NCIntro.storyboard


+ 0 - 0
iOSClient/Intro/NCIntroCollectionViewCell.swift → Brand/Intro/NCIntroCollectionViewCell.swift


+ 0 - 0
iOSClient/Intro/NCIntroCollectionViewCell.xib → Brand/Intro/NCIntroCollectionViewCell.xib


+ 0 - 0
iOSClient/Intro/NCIntroViewController.swift → Brand/Intro/NCIntroViewController.swift


+ 8 - 0
Brand/NCBrand.swift

@@ -79,6 +79,14 @@ import UIKit
     @objc public var disable_log:                       Bool = false
     @objc public var disable_log:                       Bool = false
     @objc public var disable_mobileconfig:              Bool = false
     @objc public var disable_mobileconfig:              Bool = false
 
 
+    // Internal option behaviour
+    @objc public var cleanUpDay:                        Int = 0                                                     // Set default "Delete, in the cache, all files older than" possible days value are: 0, 1, 7, 30, 90, 180, 365
+
+    // Info Paging
+    enum NCInfoPagingTab: Int, CaseIterable {
+        case activity, sharing
+    }
+
     override init() {
     override init() {
 
 
         if folderBrandAutoUpload != "" {
         if folderBrandAutoUpload != "" {

+ 1 - 1
Cartfile

@@ -1,2 +1,2 @@
-github "https://github.com/marinofaggiana/KTVHTTPCache" "2.0.5"
 github "https://github.com/marinofaggiana/TOPasscodeViewController" "master"
 github "https://github.com/marinofaggiana/TOPasscodeViewController" "master"
+binary "https://code.videolan.org/videolan/VLCKit/raw/master/Packaging/MobileVLCKit.json" ~> 3.3.0

+ 2 - 2
Cartfile.resolved

@@ -1,2 +1,2 @@
-github "marinofaggiana/KTVHTTPCache" "2.0.5"
-github "marinofaggiana/TOPasscodeViewController" "a1b9d1058b2648e636525fc368e220a0cfddb42a"
+binary "https://code.videolan.org/videolan/VLCKit/raw/master/Packaging/MobileVLCKit.json" "3.5.1"
+github "marinofaggiana/TOPasscodeViewController" "ed795637acd2b1ef154e011a04ebab4686d0523c"

+ 19 - 0
ExternalResources/NCApplicationHandle.swift

@@ -23,6 +23,8 @@
 
 
 import Foundation
 import Foundation
 import NextcloudKit
 import NextcloudKit
+import UIKit
+import Parchment
 
 
 class NCApplicationHandle: NSObject {
 class NCApplicationHandle: NSObject {
 
 
@@ -59,4 +61,21 @@ class NCApplicationHandle: NSObject {
     // func: tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
     // func: tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
     func didSelectItem(_ item: NKExternalSite, viewController: UIViewController) {
     func didSelectItem(_ item: NKExternalSite, viewController: UIViewController) {
     }
     }
+
+    // class: NCSharePaging
+    // func pagingViewController(_: PagingViewController, viewControllerAt index: Int) -> UIViewController
+    func pagingViewController(_: PagingViewController, viewControllerAt index: Int, metadata: tableMetadata, topHeight: CGFloat) -> UIViewController {
+        return UIViewController()
+    }
+
+    // class: NCSharePaging
+    // func pagingViewController(_: PagingViewController, pagingItemAt index: Int) -> PagingItem
+    func pagingViewController(_: PagingViewController, pagingItemAt index: Int) -> PagingItem {
+        return PagingIndexItem(index: index, title: "")
+    }
+
+    // class: NCActionCenter
+    func filterPages(pages: [NCBrandOptions.NCInfoPagingTab], page: NCBrandOptions.NCInfoPagingTab, metadata: tableMetadata) -> ([NCBrandOptions.NCInfoPagingTab], NCBrandOptions.NCInfoPagingTab) {
+        return (pages, page)
+    }
 }
 }

+ 98 - 67
Nextcloud.xcodeproj/project.pbxproj

@@ -107,9 +107,8 @@
 		F70753F12542A9A200972D44 /* NCViewerMedia.swift in Sources */ = {isa = PBXBuildFile; fileRef = F70753F02542A9A200972D44 /* NCViewerMedia.swift */; };
 		F70753F12542A9A200972D44 /* NCViewerMedia.swift in Sources */ = {isa = PBXBuildFile; fileRef = F70753F02542A9A200972D44 /* NCViewerMedia.swift */; };
 		F70753F72542A9C000972D44 /* NCViewerMediaPage.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = F70753F62542A9C000972D44 /* NCViewerMediaPage.storyboard */; };
 		F70753F72542A9C000972D44 /* NCViewerMediaPage.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = F70753F62542A9C000972D44 /* NCViewerMediaPage.storyboard */; };
 		F707C26521A2DC5200F6181E /* NCStoreReview.swift in Sources */ = {isa = PBXBuildFile; fileRef = F707C26421A2DC5200F6181E /* NCStoreReview.swift */; };
 		F707C26521A2DC5200F6181E /* NCStoreReview.swift in Sources */ = {isa = PBXBuildFile; fileRef = F707C26421A2DC5200F6181E /* NCStoreReview.swift */; };
+		F70821D829E59E6D001CA2D7 /* TagListView in Frameworks */ = {isa = PBXBuildFile; productRef = F70821D729E59E6D001CA2D7 /* TagListView */; };
 		F70968A424212C4E00ED60E5 /* NCLivePhoto.swift in Sources */ = {isa = PBXBuildFile; fileRef = F70968A324212C4E00ED60E5 /* NCLivePhoto.swift */; };
 		F70968A424212C4E00ED60E5 /* NCLivePhoto.swift in Sources */ = {isa = PBXBuildFile; fileRef = F70968A324212C4E00ED60E5 /* NCLivePhoto.swift */; };
-		F70A58BE24D0349500DED00D /* NCCapabilitiesViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F70A58BD24D0349500DED00D /* NCCapabilitiesViewController.swift */; };
-		F70A58C024D0545100DED00D /* NCCapabilitiesViewController.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = F70A58BF24D0545100DED00D /* NCCapabilitiesViewController.storyboard */; };
 		F70B86752642CE3B00ED5349 /* FirebaseCrashlytics in Frameworks */ = {isa = PBXBuildFile; productRef = F70B86742642CE3B00ED5349 /* FirebaseCrashlytics */; };
 		F70B86752642CE3B00ED5349 /* FirebaseCrashlytics in Frameworks */ = {isa = PBXBuildFile; productRef = F70B86742642CE3B00ED5349 /* FirebaseCrashlytics */; };
 		F70BFC7420E0FA7D00C67599 /* NCUtility.swift in Sources */ = {isa = PBXBuildFile; fileRef = F70BFC7320E0FA7C00C67599 /* NCUtility.swift */; };
 		F70BFC7420E0FA7D00C67599 /* NCUtility.swift in Sources */ = {isa = PBXBuildFile; fileRef = F70BFC7320E0FA7C00C67599 /* NCUtility.swift */; };
 		F70BFC7520E0FA7D00C67599 /* NCUtility.swift in Sources */ = {isa = PBXBuildFile; fileRef = F70BFC7320E0FA7C00C67599 /* NCUtility.swift */; };
 		F70BFC7520E0FA7D00C67599 /* NCUtility.swift in Sources */ = {isa = PBXBuildFile; fileRef = F70BFC7320E0FA7C00C67599 /* NCUtility.swift */; };
@@ -139,7 +138,6 @@
 		F7148059262ED52200693E51 /* NCSectionHeaderMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = F78ACD57219048040088454D /* NCSectionHeaderMenu.xib */; };
 		F7148059262ED52200693E51 /* NCSectionHeaderMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = F78ACD57219048040088454D /* NCSectionHeaderMenu.xib */; };
 		F714805E262ED52900693E51 /* NCSectionFooter.xib in Resources */ = {isa = PBXBuildFile; fileRef = F78ACD53219047D40088454D /* NCSectionFooter.xib */; };
 		F714805E262ED52900693E51 /* NCSectionFooter.xib in Resources */ = {isa = PBXBuildFile; fileRef = F78ACD53219047D40088454D /* NCSectionFooter.xib */; };
 		F7148063262ED66200693E51 /* NCEmptyView.xib in Resources */ = {isa = PBXBuildFile; fileRef = F7239876253D86D300257F49 /* NCEmptyView.xib */; };
 		F7148063262ED66200693E51 /* NCEmptyView.xib in Resources */ = {isa = PBXBuildFile; fileRef = F7239876253D86D300257F49 /* NCEmptyView.xib */; };
-		F716B75F26F09DF600D37EFC /* NCKTVHTTPCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = F716B75E26F09DF600D37EFC /* NCKTVHTTPCache.swift */; };
 		F717402D24F699A5000C87D5 /* NCFavorite.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = F717402B24F699A5000C87D5 /* NCFavorite.storyboard */; };
 		F717402D24F699A5000C87D5 /* NCFavorite.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = F717402B24F699A5000C87D5 /* NCFavorite.storyboard */; };
 		F717402E24F699A5000C87D5 /* NCFavorite.swift in Sources */ = {isa = PBXBuildFile; fileRef = F717402C24F699A5000C87D5 /* NCFavorite.swift */; };
 		F717402E24F699A5000C87D5 /* NCFavorite.swift in Sources */ = {isa = PBXBuildFile; fileRef = F717402C24F699A5000C87D5 /* NCFavorite.swift */; };
 		F718C24E254D507B00C5C256 /* NCViewerMediaDetailView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F718C24D254D507B00C5C256 /* NCViewerMediaDetailView.swift */; };
 		F718C24E254D507B00C5C256 /* NCViewerMediaDetailView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F718C24D254D507B00C5C256 /* NCViewerMediaDetailView.swift */; };
@@ -255,10 +253,6 @@
 		F749B654297B0F2400087535 /* NCManageDatabase+Avatar.swift in Sources */ = {isa = PBXBuildFile; fileRef = F749B650297B0F2400087535 /* NCManageDatabase+Avatar.swift */; };
 		F749B654297B0F2400087535 /* NCManageDatabase+Avatar.swift in Sources */ = {isa = PBXBuildFile; fileRef = F749B650297B0F2400087535 /* NCManageDatabase+Avatar.swift */; };
 		F749B655297B0F2400087535 /* NCManageDatabase+Avatar.swift in Sources */ = {isa = PBXBuildFile; fileRef = F749B650297B0F2400087535 /* NCManageDatabase+Avatar.swift */; };
 		F749B655297B0F2400087535 /* NCManageDatabase+Avatar.swift in Sources */ = {isa = PBXBuildFile; fileRef = F749B650297B0F2400087535 /* NCManageDatabase+Avatar.swift */; };
 		F749B656297B0F2400087535 /* NCManageDatabase+Avatar.swift in Sources */ = {isa = PBXBuildFile; fileRef = F749B650297B0F2400087535 /* NCManageDatabase+Avatar.swift */; };
 		F749B656297B0F2400087535 /* NCManageDatabase+Avatar.swift in Sources */ = {isa = PBXBuildFile; fileRef = F749B650297B0F2400087535 /* NCManageDatabase+Avatar.swift */; };
-		F749C10B23C4A5340027D966 /* NCIntroCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = F749C10723C4A5330027D966 /* NCIntroCollectionViewCell.swift */; };
-		F749C10C23C4A5340027D966 /* NCIntroViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F749C10823C4A5330027D966 /* NCIntroViewController.swift */; };
-		F749C10D23C4A5340027D966 /* NCIntro.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = F749C10923C4A5330027D966 /* NCIntro.storyboard */; };
-		F749C10E23C4A5340027D966 /* NCIntroCollectionViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = F749C10A23C4A5340027D966 /* NCIntroCollectionViewCell.xib */; };
 		F749E4E91DC1FB38009BA2FD /* Share.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = F7CE8AFB1DC1F8D8009CAE48 /* Share.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
 		F749E4E91DC1FB38009BA2FD /* Share.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = F7CE8AFB1DC1F8D8009CAE48 /* Share.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
 		F74AF3A4247FB6AE00AC767B /* NCUtilityFileSystem.swift in Sources */ = {isa = PBXBuildFile; fileRef = F74AF3A3247FB6AE00AC767B /* NCUtilityFileSystem.swift */; };
 		F74AF3A4247FB6AE00AC767B /* NCUtilityFileSystem.swift in Sources */ = {isa = PBXBuildFile; fileRef = F74AF3A3247FB6AE00AC767B /* NCUtilityFileSystem.swift */; };
 		F74AF3A5247FB6AE00AC767B /* NCUtilityFileSystem.swift in Sources */ = {isa = PBXBuildFile; fileRef = F74AF3A3247FB6AE00AC767B /* NCUtilityFileSystem.swift */; };
 		F74AF3A5247FB6AE00AC767B /* NCUtilityFileSystem.swift in Sources */ = {isa = PBXBuildFile; fileRef = F74AF3A3247FB6AE00AC767B /* NCUtilityFileSystem.swift */; };
@@ -272,6 +266,15 @@
 		F7501C332212E57500FB1415 /* NCMedia.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7501C312212E57400FB1415 /* NCMedia.swift */; };
 		F7501C332212E57500FB1415 /* NCMedia.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7501C312212E57400FB1415 /* NCMedia.swift */; };
 		F753BA93281FD8020015BFB6 /* EasyTipView in Frameworks */ = {isa = PBXBuildFile; productRef = F753BA92281FD8020015BFB6 /* EasyTipView */; };
 		F753BA93281FD8020015BFB6 /* EasyTipView in Frameworks */ = {isa = PBXBuildFile; productRef = F753BA92281FD8020015BFB6 /* EasyTipView */; };
 		F755BD9B20594AC7008C5FBB /* NCService.swift in Sources */ = {isa = PBXBuildFile; fileRef = F755BD9A20594AC7008C5FBB /* NCService.swift */; };
 		F755BD9B20594AC7008C5FBB /* NCService.swift in Sources */ = {isa = PBXBuildFile; fileRef = F755BD9A20594AC7008C5FBB /* NCService.swift */; };
+		F757CC8229E7F88B00F31428 /* NCManageDatabase+Groupfolders.swift in Sources */ = {isa = PBXBuildFile; fileRef = F757CC8129E7F88B00F31428 /* NCManageDatabase+Groupfolders.swift */; };
+		F757CC8329E7F88B00F31428 /* NCManageDatabase+Groupfolders.swift in Sources */ = {isa = PBXBuildFile; fileRef = F757CC8129E7F88B00F31428 /* NCManageDatabase+Groupfolders.swift */; };
+		F757CC8429E7F88B00F31428 /* NCManageDatabase+Groupfolders.swift in Sources */ = {isa = PBXBuildFile; fileRef = F757CC8129E7F88B00F31428 /* NCManageDatabase+Groupfolders.swift */; };
+		F757CC8529E7F88B00F31428 /* NCManageDatabase+Groupfolders.swift in Sources */ = {isa = PBXBuildFile; fileRef = F757CC8129E7F88B00F31428 /* NCManageDatabase+Groupfolders.swift */; };
+		F757CC8629E7F88B00F31428 /* NCManageDatabase+Groupfolders.swift in Sources */ = {isa = PBXBuildFile; fileRef = F757CC8129E7F88B00F31428 /* NCManageDatabase+Groupfolders.swift */; };
+		F757CC8729E7F88B00F31428 /* NCManageDatabase+Groupfolders.swift in Sources */ = {isa = PBXBuildFile; fileRef = F757CC8129E7F88B00F31428 /* NCManageDatabase+Groupfolders.swift */; };
+		F757CC8829E7F88B00F31428 /* NCManageDatabase+Groupfolders.swift in Sources */ = {isa = PBXBuildFile; fileRef = F757CC8129E7F88B00F31428 /* NCManageDatabase+Groupfolders.swift */; };
+		F757CC8C29E82D0500F31428 /* NCGroupfolders.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = F757CC8A29E82D0500F31428 /* NCGroupfolders.storyboard */; };
+		F757CC8D29E82D0500F31428 /* NCGroupfolders.swift in Sources */ = {isa = PBXBuildFile; fileRef = F757CC8B29E82D0500F31428 /* NCGroupfolders.swift */; };
 		F7581D1A25EFDA61004DC699 /* NCLoginWeb+Menu.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7581D1925EFDA60004DC699 /* NCLoginWeb+Menu.swift */; };
 		F7581D1A25EFDA61004DC699 /* NCLoginWeb+Menu.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7581D1925EFDA60004DC699 /* NCLoginWeb+Menu.swift */; };
 		F7581D2425EFDDDF004DC699 /* NCMedia+Menu.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7581D2325EFDDDF004DC699 /* NCMedia+Menu.swift */; };
 		F7581D2425EFDDDF004DC699 /* NCMedia+Menu.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7581D2325EFDDDF004DC699 /* NCMedia+Menu.swift */; };
 		F758A01227A7F03E0069468B /* JGProgressHUD in Frameworks */ = {isa = PBXBuildFile; productRef = F758A01127A7F03E0069468B /* JGProgressHUD */; };
 		F758A01227A7F03E0069468B /* JGProgressHUD in Frameworks */ = {isa = PBXBuildFile; productRef = F758A01127A7F03E0069468B /* JGProgressHUD */; };
@@ -292,6 +295,10 @@
 		F75EAED826D2552E00F4320E /* MarqueeLabel in Frameworks */ = {isa = PBXBuildFile; productRef = F75EAED726D2552E00F4320E /* MarqueeLabel */; };
 		F75EAED826D2552E00F4320E /* MarqueeLabel in Frameworks */ = {isa = PBXBuildFile; productRef = F75EAED726D2552E00F4320E /* MarqueeLabel */; };
 		F760329F252F0F8E0015A421 /* NCTransferCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = F760329D252F0F8E0015A421 /* NCTransferCell.swift */; };
 		F760329F252F0F8E0015A421 /* NCTransferCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = F760329D252F0F8E0015A421 /* NCTransferCell.swift */; };
 		F76032A0252F0F8E0015A421 /* NCTransferCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = F760329E252F0F8E0015A421 /* NCTransferCell.xib */; };
 		F76032A0252F0F8E0015A421 /* NCTransferCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = F760329E252F0F8E0015A421 /* NCTransferCell.xib */; };
+		F761856A29E98543006EB3B0 /* NCIntro.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = F761856629E98543006EB3B0 /* NCIntro.storyboard */; };
+		F761856B29E98543006EB3B0 /* NCIntroViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F761856729E98543006EB3B0 /* NCIntroViewController.swift */; };
+		F761856C29E98543006EB3B0 /* NCIntroCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = F761856829E98543006EB3B0 /* NCIntroCollectionViewCell.swift */; };
+		F761856D29E98543006EB3B0 /* NCIntroCollectionViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = F761856929E98543006EB3B0 /* NCIntroCollectionViewCell.xib */; };
 		F7651A8A23A2A3F2001403D2 /* NCCreateFormUploadDocuments.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = F7651A8823A2A3F2001403D2 /* NCCreateFormUploadDocuments.storyboard */; };
 		F7651A8A23A2A3F2001403D2 /* NCCreateFormUploadDocuments.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = F7651A8823A2A3F2001403D2 /* NCCreateFormUploadDocuments.storyboard */; };
 		F7651A8B23A2A3F2001403D2 /* NCCreateFormUploadDocuments.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7651A8923A2A3F2001403D2 /* NCCreateFormUploadDocuments.swift */; };
 		F7651A8B23A2A3F2001403D2 /* NCCreateFormUploadDocuments.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7651A8923A2A3F2001403D2 /* NCCreateFormUploadDocuments.swift */; };
 		F765608F23BF813600765969 /* NCContentPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = F765608E23BF813500765969 /* NCContentPresenter.swift */; };
 		F765608F23BF813600765969 /* NCContentPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = F765608E23BF813500765969 /* NCContentPresenter.swift */; };
@@ -318,10 +325,6 @@
 		F76D3CF12428B40E005DFA87 /* NCViewerPDFSearch.swift in Sources */ = {isa = PBXBuildFile; fileRef = F76D3CF02428B40E005DFA87 /* NCViewerPDFSearch.swift */; };
 		F76D3CF12428B40E005DFA87 /* NCViewerPDFSearch.swift in Sources */ = {isa = PBXBuildFile; fileRef = F76D3CF02428B40E005DFA87 /* NCViewerPDFSearch.swift */; };
 		F76D3CF32428B94E005DFA87 /* NCViewerPDFSearchCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = F76D3CF22428B94E005DFA87 /* NCViewerPDFSearchCell.xib */; };
 		F76D3CF32428B94E005DFA87 /* NCViewerPDFSearchCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = F76D3CF22428B94E005DFA87 /* NCViewerPDFSearchCell.xib */; };
 		F76D3CF52428D0C1005DFA87 /* NCViewerPDF.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = F76D3CF42428D0C0005DFA87 /* NCViewerPDF.storyboard */; };
 		F76D3CF52428D0C1005DFA87 /* NCViewerPDF.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = F76D3CF42428D0C0005DFA87 /* NCViewerPDF.storyboard */; };
-		F76DA93F277B75870082465B /* KTVCocoaHTTPServer.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = F70B867E2642CF5400ED5349 /* KTVCocoaHTTPServer.xcframework */; };
-		F76DA940277B75870082465B /* KTVCocoaHTTPServer.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = F70B867E2642CF5400ED5349 /* KTVCocoaHTTPServer.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
-		F76DA941277B75870082465B /* KTVHTTPCache.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = F70B86792642CF5300ED5349 /* KTVHTTPCache.xcframework */; };
-		F76DA942277B75870082465B /* KTVHTTPCache.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = F70B86792642CF5300ED5349 /* KTVHTTPCache.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
 		F76DA95B277B75A90082465B /* TOPasscodeViewController.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = F70B86822642CF5500ED5349 /* TOPasscodeViewController.xcframework */; };
 		F76DA95B277B75A90082465B /* TOPasscodeViewController.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = F70B86822642CF5500ED5349 /* TOPasscodeViewController.xcframework */; };
 		F76DA95C277B75A90082465B /* TOPasscodeViewController.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = F70B86822642CF5500ED5349 /* TOPasscodeViewController.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
 		F76DA95C277B75A90082465B /* TOPasscodeViewController.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = F70B86822642CF5500ED5349 /* TOPasscodeViewController.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
 		F76DA963277B760E0082465B /* Queuer in Frameworks */ = {isa = PBXBuildFile; productRef = F76DA962277B760E0082465B /* Queuer */; };
 		F76DA963277B760E0082465B /* Queuer in Frameworks */ = {isa = PBXBuildFile; productRef = F76DA962277B760E0082465B /* Queuer */; };
@@ -350,6 +353,8 @@
 		F77444F8222816D5000D5EB0 /* NCPickerViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F77444F7222816D5000D5EB0 /* NCPickerViewController.swift */; };
 		F77444F8222816D5000D5EB0 /* NCPickerViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F77444F7222816D5000D5EB0 /* NCPickerViewController.swift */; };
 		F77910A525DD517B00CEDB9E /* Settings.bundle in Resources */ = {isa = PBXBuildFile; fileRef = F77910A425DD517B00CEDB9E /* Settings.bundle */; };
 		F77910A525DD517B00CEDB9E /* Settings.bundle in Resources */ = {isa = PBXBuildFile; fileRef = F77910A425DD517B00CEDB9E /* Settings.bundle */; };
 		F77910AB25DD53C700CEDB9E /* NCSettingsBundleHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = F77910AA25DD53C700CEDB9E /* NCSettingsBundleHelper.swift */; };
 		F77910AB25DD53C700CEDB9E /* NCSettingsBundleHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = F77910AA25DD53C700CEDB9E /* NCSettingsBundleHelper.swift */; };
+		F7792DE529EEE02D005930CE /* MobileVLCKit.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = F7792DE429EEE02D005930CE /* MobileVLCKit.xcframework */; };
+		F7792DE629EEE02D005930CE /* MobileVLCKit.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = F7792DE429EEE02D005930CE /* MobileVLCKit.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
 		F77A697D250A0FBC00FF1708 /* NCCollectionViewCommon+Menu.swift in Sources */ = {isa = PBXBuildFile; fileRef = F77A697C250A0FBC00FF1708 /* NCCollectionViewCommon+Menu.swift */; };
 		F77A697D250A0FBC00FF1708 /* NCCollectionViewCommon+Menu.swift in Sources */ = {isa = PBXBuildFile; fileRef = F77A697C250A0FBC00FF1708 /* NCCollectionViewCommon+Menu.swift */; };
 		F77B0DF51D118A16002130FE /* CCUtility.m in Sources */ = {isa = PBXBuildFile; fileRef = F7053E3D1C639DF500741EA5 /* CCUtility.m */; };
 		F77B0DF51D118A16002130FE /* CCUtility.m in Sources */ = {isa = PBXBuildFile; fileRef = F7053E3D1C639DF500741EA5 /* CCUtility.m */; };
 		F77B0E4F1D118A16002130FE /* CCManageAutoUpload.m in Sources */ = {isa = PBXBuildFile; fileRef = F7ACE42F1BAC0268006C0017 /* CCManageAutoUpload.m */; };
 		F77B0E4F1D118A16002130FE /* CCManageAutoUpload.m in Sources */ = {isa = PBXBuildFile; fileRef = F7ACE42F1BAC0268006C0017 /* CCManageAutoUpload.m */; };
@@ -464,6 +469,7 @@
 		F7A0D1352591FBC5008F8A13 /* String+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7A0D1342591FBC5008F8A13 /* String+Extension.swift */; };
 		F7A0D1352591FBC5008F8A13 /* String+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7A0D1342591FBC5008F8A13 /* String+Extension.swift */; };
 		F7A0D1362591FBC5008F8A13 /* String+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7A0D1342591FBC5008F8A13 /* String+Extension.swift */; };
 		F7A0D1362591FBC5008F8A13 /* String+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7A0D1342591FBC5008F8A13 /* String+Extension.swift */; };
 		F7A0D1372591FBC5008F8A13 /* String+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7A0D1342591FBC5008F8A13 /* String+Extension.swift */; };
 		F7A0D1372591FBC5008F8A13 /* String+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7A0D1342591FBC5008F8A13 /* String+Extension.swift */; };
+		F7A1050E29E587AF00FFD92B /* TagListView in Frameworks */ = {isa = PBXBuildFile; productRef = F7A1050D29E587AF00FFD92B /* TagListView */; };
 		F7A321AD1E9E6AD50069AD1B /* CCAdvanced.m in Sources */ = {isa = PBXBuildFile; fileRef = F7A321AC1E9E6AD50069AD1B /* CCAdvanced.m */; };
 		F7A321AD1E9E6AD50069AD1B /* CCAdvanced.m in Sources */ = {isa = PBXBuildFile; fileRef = F7A321AC1E9E6AD50069AD1B /* CCAdvanced.m */; };
 		F7A48413297022E000BD1B49 /* ViewerQuickLook.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7A48412297022E000BD1B49 /* ViewerQuickLook.swift */; };
 		F7A48413297022E000BD1B49 /* ViewerQuickLook.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7A48412297022E000BD1B49 /* ViewerQuickLook.swift */; };
 		F7A48415297028FC00BD1B49 /* Nextcloud Hub.png in Resources */ = {isa = PBXBuildFile; fileRef = F7A48414297028FC00BD1B49 /* Nextcloud Hub.png */; };
 		F7A48415297028FC00BD1B49 /* Nextcloud Hub.png in Resources */ = {isa = PBXBuildFile; fileRef = F7A48414297028FC00BD1B49 /* Nextcloud Hub.png */; };
@@ -576,8 +582,6 @@
 		F7EFC0C6256BC77700461AAD /* NCMoreUserCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = F7EFC0C5256BC77700461AAD /* NCMoreUserCell.xib */; };
 		F7EFC0C6256BC77700461AAD /* NCMoreUserCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = F7EFC0C5256BC77700461AAD /* NCMoreUserCell.xib */; };
 		F7EFC0CD256BF8DD00461AAD /* NCUserStatus.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7EFC0CC256BF8DD00461AAD /* NCUserStatus.swift */; };
 		F7EFC0CD256BF8DD00461AAD /* NCUserStatus.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7EFC0CC256BF8DD00461AAD /* NCUserStatus.swift */; };
 		F7F1E54C2492369A00E42386 /* NCMediaCommandView.xib in Resources */ = {isa = PBXBuildFile; fileRef = F7F1E54B2492369A00E42386 /* NCMediaCommandView.xib */; };
 		F7F1E54C2492369A00E42386 /* NCMediaCommandView.xib in Resources */ = {isa = PBXBuildFile; fileRef = F7F1E54B2492369A00E42386 /* NCMediaCommandView.xib */; };
-		F7F4F0F727ECDBA4008676F9 /* NCSubtitles.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7F4F0F327ECDBA4008676F9 /* NCSubtitles.swift */; };
-		F7F4F0F927ECDBA4008676F9 /* NCSubtitlePlayer.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7F4F0F527ECDBA4008676F9 /* NCSubtitlePlayer.swift */; };
 		F7F4F10527ECDBDB008676F9 /* Inconsolata-SemiBold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = F7F4F0FD27ECDBDB008676F9 /* Inconsolata-SemiBold.ttf */; };
 		F7F4F10527ECDBDB008676F9 /* Inconsolata-SemiBold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = F7F4F0FD27ECDBDB008676F9 /* Inconsolata-SemiBold.ttf */; };
 		F7F4F10627ECDBDB008676F9 /* Inconsolata-Medium.ttf in Resources */ = {isa = PBXBuildFile; fileRef = F7F4F0FE27ECDBDB008676F9 /* Inconsolata-Medium.ttf */; };
 		F7F4F10627ECDBDB008676F9 /* Inconsolata-Medium.ttf in Resources */ = {isa = PBXBuildFile; fileRef = F7F4F0FE27ECDBDB008676F9 /* Inconsolata-Medium.ttf */; };
 		F7F4F10727ECDBDB008676F9 /* Inconsolata-Black.ttf in Resources */ = {isa = PBXBuildFile; fileRef = F7F4F0FF27ECDBDB008676F9 /* Inconsolata-Black.ttf */; };
 		F7F4F10727ECDBDB008676F9 /* Inconsolata-Black.ttf in Resources */ = {isa = PBXBuildFile; fileRef = F7F4F0FF27ECDBDB008676F9 /* Inconsolata-Black.ttf */; };
@@ -592,6 +596,7 @@
 		F7F878AF1FB9E3B900599E4F /* NCEndToEndMetadata.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7F878AD1FB9E3B900599E4F /* NCEndToEndMetadata.swift */; };
 		F7F878AF1FB9E3B900599E4F /* NCEndToEndMetadata.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7F878AD1FB9E3B900599E4F /* NCEndToEndMetadata.swift */; };
 		F7F9D1BB25397CE000D9BFF5 /* NCViewer.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7F9D1BA25397CE000D9BFF5 /* NCViewer.swift */; };
 		F7F9D1BB25397CE000D9BFF5 /* NCViewer.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7F9D1BA25397CE000D9BFF5 /* NCViewer.swift */; };
 		F7FAFD3A28BFA948000777FE /* NCNotification+Menu.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7FAFD3928BFA947000777FE /* NCNotification+Menu.swift */; };
 		F7FAFD3A28BFA948000777FE /* NCNotification+Menu.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7FAFD3928BFA947000777FE /* NCNotification+Menu.swift */; };
+		F7FC5EE12A1768D700D921F5 /* NCCapabilitiesView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7FC5EE02A1768D700D921F5 /* NCCapabilitiesView.swift */; };
 		F7FF2CB12842159500EBB7A1 /* NCSectionHeader.xib in Resources */ = {isa = PBXBuildFile; fileRef = F7FF2CB02842159500EBB7A1 /* NCSectionHeader.xib */; };
 		F7FF2CB12842159500EBB7A1 /* NCSectionHeader.xib in Resources */ = {isa = PBXBuildFile; fileRef = F7FF2CB02842159500EBB7A1 /* NCSectionHeader.xib */; };
 /* End PBXBuildFile section */
 /* End PBXBuildFile section */
 
 
@@ -654,9 +659,8 @@
 			dstPath = "";
 			dstPath = "";
 			dstSubfolderSpec = 10;
 			dstSubfolderSpec = 10;
 			files = (
 			files = (
-				F76DA942277B75870082465B /* KTVHTTPCache.xcframework in Embed Frameworks */,
+				F7792DE629EEE02D005930CE /* MobileVLCKit.xcframework in Embed Frameworks */,
 				F76DA95C277B75A90082465B /* TOPasscodeViewController.xcframework in Embed Frameworks */,
 				F76DA95C277B75A90082465B /* TOPasscodeViewController.xcframework in Embed Frameworks */,
-				F76DA940277B75870082465B /* KTVCocoaHTTPServer.xcframework in Embed Frameworks */,
 			);
 			);
 			name = "Embed Frameworks";
 			name = "Embed Frameworks";
 			runOnlyForDeploymentPostprocessing = 0;
 			runOnlyForDeploymentPostprocessing = 0;
@@ -784,8 +788,6 @@
 		F707C26421A2DC5200F6181E /* NCStoreReview.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NCStoreReview.swift; sourceTree = "<group>"; };
 		F707C26421A2DC5200F6181E /* NCStoreReview.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NCStoreReview.swift; sourceTree = "<group>"; };
 		F70968A324212C4E00ED60E5 /* NCLivePhoto.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NCLivePhoto.swift; sourceTree = "<group>"; };
 		F70968A324212C4E00ED60E5 /* NCLivePhoto.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NCLivePhoto.swift; sourceTree = "<group>"; };
 		F70A07C8205285FB00DC1231 /* pt-PT */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-PT"; path = "pt-PT.lproj/Localizable.strings"; sourceTree = "<group>"; };
 		F70A07C8205285FB00DC1231 /* pt-PT */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-PT"; path = "pt-PT.lproj/Localizable.strings"; sourceTree = "<group>"; };
-		F70A58BD24D0349500DED00D /* NCCapabilitiesViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NCCapabilitiesViewController.swift; sourceTree = "<group>"; };
-		F70A58BF24D0545100DED00D /* NCCapabilitiesViewController.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = NCCapabilitiesViewController.storyboard; sourceTree = "<group>"; };
 		F70B866F2642CA9500ED5349 /* ChromaColorPicker.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = ChromaColorPicker.xcframework; path = Carthage/Build/ChromaColorPicker.xcframework; sourceTree = "<group>"; };
 		F70B866F2642CA9500ED5349 /* ChromaColorPicker.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = ChromaColorPicker.xcframework; path = Carthage/Build/ChromaColorPicker.xcframework; sourceTree = "<group>"; };
 		F70B86792642CF5300ED5349 /* KTVHTTPCache.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = KTVHTTPCache.xcframework; path = Carthage/Build/KTVHTTPCache.xcframework; sourceTree = "<group>"; };
 		F70B86792642CF5300ED5349 /* KTVHTTPCache.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = KTVHTTPCache.xcframework; path = Carthage/Build/KTVHTTPCache.xcframework; sourceTree = "<group>"; };
 		F70B867A2642CF5300ED5349 /* TLPhotoPicker.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = TLPhotoPicker.xcframework; path = Carthage/Build/TLPhotoPicker.xcframework; sourceTree = "<group>"; };
 		F70B867A2642CF5300ED5349 /* TLPhotoPicker.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = TLPhotoPicker.xcframework; path = Carthage/Build/TLPhotoPicker.xcframework; sourceTree = "<group>"; };
@@ -823,7 +825,6 @@
 		F7151A811D477A4B00E6AF45 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = "<group>"; };
 		F7151A811D477A4B00E6AF45 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = "<group>"; };
 		F7169A301EE59BB70086BD69 /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/Localizable.strings; sourceTree = "<group>"; };
 		F7169A301EE59BB70086BD69 /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/Localizable.strings; sourceTree = "<group>"; };
 		F7169A4C1EE59C640086BD69 /* tr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = tr; path = tr.lproj/Localizable.strings; sourceTree = "<group>"; };
 		F7169A4C1EE59C640086BD69 /* tr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = tr; path = tr.lproj/Localizable.strings; sourceTree = "<group>"; };
-		F716B75E26F09DF600D37EFC /* NCKTVHTTPCache.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NCKTVHTTPCache.swift; sourceTree = "<group>"; };
 		F716FE7723795E5000FABE50 /* NCCommunication.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = NCCommunication.framework; path = Carthage/Build/iOS/NCCommunication.framework; sourceTree = "<group>"; };
 		F716FE7723795E5000FABE50 /* NCCommunication.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = NCCommunication.framework; path = Carthage/Build/iOS/NCCommunication.framework; sourceTree = "<group>"; };
 		F717402B24F699A5000C87D5 /* NCFavorite.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = NCFavorite.storyboard; sourceTree = "<group>"; };
 		F717402B24F699A5000C87D5 /* NCFavorite.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = NCFavorite.storyboard; sourceTree = "<group>"; };
 		F717402C24F699A5000C87D5 /* NCFavorite.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NCFavorite.swift; sourceTree = "<group>"; };
 		F717402C24F699A5000C87D5 /* NCFavorite.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NCFavorite.swift; sourceTree = "<group>"; };
@@ -895,10 +896,6 @@
 		F7490E8F2988F0C2009DCE94 /* NCCreateFormUploadAssets.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NCCreateFormUploadAssets.swift; sourceTree = "<group>"; };
 		F7490E8F2988F0C2009DCE94 /* NCCreateFormUploadAssets.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NCCreateFormUploadAssets.swift; sourceTree = "<group>"; };
 		F749B649297B0CBB00087535 /* NCManageDatabase+Share.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NCManageDatabase+Share.swift"; sourceTree = "<group>"; };
 		F749B649297B0CBB00087535 /* NCManageDatabase+Share.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NCManageDatabase+Share.swift"; sourceTree = "<group>"; };
 		F749B650297B0F2400087535 /* NCManageDatabase+Avatar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NCManageDatabase+Avatar.swift"; sourceTree = "<group>"; };
 		F749B650297B0F2400087535 /* NCManageDatabase+Avatar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NCManageDatabase+Avatar.swift"; sourceTree = "<group>"; };
-		F749C10723C4A5330027D966 /* NCIntroCollectionViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NCIntroCollectionViewCell.swift; sourceTree = "<group>"; };
-		F749C10823C4A5330027D966 /* NCIntroViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NCIntroViewController.swift; sourceTree = "<group>"; };
-		F749C10923C4A5330027D966 /* NCIntro.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = NCIntro.storyboard; sourceTree = "<group>"; };
-		F749C10A23C4A5340027D966 /* NCIntroCollectionViewCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = NCIntroCollectionViewCell.xib; sourceTree = "<group>"; };
 		F74AF3A3247FB6AE00AC767B /* NCUtilityFileSystem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NCUtilityFileSystem.swift; sourceTree = "<group>"; };
 		F74AF3A3247FB6AE00AC767B /* NCUtilityFileSystem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NCUtilityFileSystem.swift; sourceTree = "<group>"; };
 		F74AFCE822E8B024003DE61F /* FSCalendar.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = FSCalendar.framework; path = Carthage/Build/iOS/FSCalendar.framework; sourceTree = "<group>"; };
 		F74AFCE822E8B024003DE61F /* FSCalendar.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = FSCalendar.framework; path = Carthage/Build/iOS/FSCalendar.framework; sourceTree = "<group>"; };
 		F74C0434253F1CDC009762AB /* NCShares.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NCShares.swift; sourceTree = "<group>"; };
 		F74C0434253F1CDC009762AB /* NCShares.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NCShares.swift; sourceTree = "<group>"; };
@@ -913,6 +910,9 @@
 		F753701922723E0D0041C76C /* ca */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ca; path = ca.lproj/Localizable.strings; sourceTree = "<group>"; };
 		F753701922723E0D0041C76C /* ca */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ca; path = ca.lproj/Localizable.strings; sourceTree = "<group>"; };
 		F753701A22723EC80041C76C /* da */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = da; path = da.lproj/Localizable.strings; sourceTree = "<group>"; };
 		F753701A22723EC80041C76C /* da */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = da; path = da.lproj/Localizable.strings; sourceTree = "<group>"; };
 		F755BD9A20594AC7008C5FBB /* NCService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NCService.swift; sourceTree = "<group>"; };
 		F755BD9A20594AC7008C5FBB /* NCService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NCService.swift; sourceTree = "<group>"; };
+		F757CC8129E7F88B00F31428 /* NCManageDatabase+Groupfolders.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "NCManageDatabase+Groupfolders.swift"; sourceTree = "<group>"; };
+		F757CC8A29E82D0500F31428 /* NCGroupfolders.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = NCGroupfolders.storyboard; sourceTree = "<group>"; };
+		F757CC8B29E82D0500F31428 /* NCGroupfolders.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NCGroupfolders.swift; sourceTree = "<group>"; };
 		F7581D1925EFDA60004DC699 /* NCLoginWeb+Menu.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "NCLoginWeb+Menu.swift"; sourceTree = "<group>"; };
 		F7581D1925EFDA60004DC699 /* NCLoginWeb+Menu.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "NCLoginWeb+Menu.swift"; sourceTree = "<group>"; };
 		F7581D2325EFDDDF004DC699 /* NCMedia+Menu.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "NCMedia+Menu.swift"; sourceTree = "<group>"; };
 		F7581D2325EFDDDF004DC699 /* NCMedia+Menu.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "NCMedia+Menu.swift"; sourceTree = "<group>"; };
 		F758B457212C564000515F55 /* NCScan.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = NCScan.storyboard; sourceTree = "<group>"; };
 		F758B457212C564000515F55 /* NCScan.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = NCScan.storyboard; sourceTree = "<group>"; };
@@ -932,6 +932,10 @@
 		F75EDFBE1E8C116D00E6F369 /* libstdc++.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = "libstdc++.tbd"; path = "usr/lib/libstdc++.tbd"; sourceTree = SDKROOT; };
 		F75EDFBE1E8C116D00E6F369 /* libstdc++.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = "libstdc++.tbd"; path = "usr/lib/libstdc++.tbd"; sourceTree = SDKROOT; };
 		F760329D252F0F8E0015A421 /* NCTransferCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = NCTransferCell.swift; path = iOSClient/Transfers/NCTransferCell.swift; sourceTree = SOURCE_ROOT; };
 		F760329D252F0F8E0015A421 /* NCTransferCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = NCTransferCell.swift; path = iOSClient/Transfers/NCTransferCell.swift; sourceTree = SOURCE_ROOT; };
 		F760329E252F0F8E0015A421 /* NCTransferCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = NCTransferCell.xib; path = iOSClient/Transfers/NCTransferCell.xib; sourceTree = SOURCE_ROOT; };
 		F760329E252F0F8E0015A421 /* NCTransferCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = NCTransferCell.xib; path = iOSClient/Transfers/NCTransferCell.xib; sourceTree = SOURCE_ROOT; };
+		F761856629E98543006EB3B0 /* NCIntro.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = NCIntro.storyboard; sourceTree = "<group>"; };
+		F761856729E98543006EB3B0 /* NCIntroViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NCIntroViewController.swift; sourceTree = "<group>"; };
+		F761856829E98543006EB3B0 /* NCIntroCollectionViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NCIntroCollectionViewCell.swift; sourceTree = "<group>"; };
+		F761856929E98543006EB3B0 /* NCIntroCollectionViewCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = NCIntroCollectionViewCell.xib; sourceTree = "<group>"; };
 		F7651A8823A2A3F2001403D2 /* NCCreateFormUploadDocuments.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = NCCreateFormUploadDocuments.storyboard; sourceTree = "<group>"; };
 		F7651A8823A2A3F2001403D2 /* NCCreateFormUploadDocuments.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = NCCreateFormUploadDocuments.storyboard; sourceTree = "<group>"; };
 		F7651A8923A2A3F2001403D2 /* NCCreateFormUploadDocuments.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NCCreateFormUploadDocuments.swift; sourceTree = "<group>"; };
 		F7651A8923A2A3F2001403D2 /* NCCreateFormUploadDocuments.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NCCreateFormUploadDocuments.swift; sourceTree = "<group>"; };
 		F765608623BF806C00765969 /* QuickLayout.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuickLayout.framework; path = Carthage/Build/iOS/QuickLayout.framework; sourceTree = "<group>"; };
 		F765608623BF806C00765969 /* QuickLayout.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuickLayout.framework; path = Carthage/Build/iOS/QuickLayout.framework; sourceTree = "<group>"; };
@@ -993,6 +997,7 @@
 		F77444F7222816D5000D5EB0 /* NCPickerViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NCPickerViewController.swift; sourceTree = "<group>"; };
 		F77444F7222816D5000D5EB0 /* NCPickerViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NCPickerViewController.swift; sourceTree = "<group>"; };
 		F77910A425DD517B00CEDB9E /* Settings.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; path = Settings.bundle; sourceTree = "<group>"; };
 		F77910A425DD517B00CEDB9E /* Settings.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; path = Settings.bundle; sourceTree = "<group>"; };
 		F77910AA25DD53C700CEDB9E /* NCSettingsBundleHelper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NCSettingsBundleHelper.swift; sourceTree = "<group>"; };
 		F77910AA25DD53C700CEDB9E /* NCSettingsBundleHelper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NCSettingsBundleHelper.swift; sourceTree = "<group>"; };
+		F7792DE429EEE02D005930CE /* MobileVLCKit.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = MobileVLCKit.xcframework; path = Carthage/Build/MobileVLCKit.xcframework; sourceTree = "<group>"; };
 		F77A697C250A0FBC00FF1708 /* NCCollectionViewCommon+Menu.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "NCCollectionViewCommon+Menu.swift"; sourceTree = "<group>"; };
 		F77A697C250A0FBC00FF1708 /* NCCollectionViewCommon+Menu.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "NCCollectionViewCommon+Menu.swift"; sourceTree = "<group>"; };
 		F77BB745289984CA0090FC19 /* UIViewController+Extension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIViewController+Extension.swift"; sourceTree = "<group>"; };
 		F77BB745289984CA0090FC19 /* UIViewController+Extension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIViewController+Extension.swift"; sourceTree = "<group>"; };
 		F77BB747289985270090FC19 /* UITabBarController+Extension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UITabBarController+Extension.swift"; sourceTree = "<group>"; };
 		F77BB747289985270090FC19 /* UITabBarController+Extension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UITabBarController+Extension.swift"; sourceTree = "<group>"; };
@@ -1222,8 +1227,6 @@
 		F7EFC0CC256BF8DD00461AAD /* NCUserStatus.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NCUserStatus.swift; sourceTree = "<group>"; };
 		F7EFC0CC256BF8DD00461AAD /* NCUserStatus.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NCUserStatus.swift; sourceTree = "<group>"; };
 		F7F1E54B2492369A00E42386 /* NCMediaCommandView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = NCMediaCommandView.xib; sourceTree = "<group>"; };
 		F7F1E54B2492369A00E42386 /* NCMediaCommandView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = NCMediaCommandView.xib; sourceTree = "<group>"; };
 		F7F35B592578FB63003F5589 /* CollaboraOnlineWebViewKeyboardManager.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CollaboraOnlineWebViewKeyboardManager.framework; path = Carthage/Build/iOS/CollaboraOnlineWebViewKeyboardManager.framework; sourceTree = "<group>"; };
 		F7F35B592578FB63003F5589 /* CollaboraOnlineWebViewKeyboardManager.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CollaboraOnlineWebViewKeyboardManager.framework; path = Carthage/Build/iOS/CollaboraOnlineWebViewKeyboardManager.framework; sourceTree = "<group>"; };
-		F7F4F0F327ECDBA4008676F9 /* NCSubtitles.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NCSubtitles.swift; sourceTree = "<group>"; };
-		F7F4F0F527ECDBA4008676F9 /* NCSubtitlePlayer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NCSubtitlePlayer.swift; sourceTree = "<group>"; };
 		F7F4F0FD27ECDBDB008676F9 /* Inconsolata-SemiBold.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Inconsolata-SemiBold.ttf"; sourceTree = "<group>"; };
 		F7F4F0FD27ECDBDB008676F9 /* Inconsolata-SemiBold.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Inconsolata-SemiBold.ttf"; sourceTree = "<group>"; };
 		F7F4F0FE27ECDBDB008676F9 /* Inconsolata-Medium.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Inconsolata-Medium.ttf"; sourceTree = "<group>"; };
 		F7F4F0FE27ECDBDB008676F9 /* Inconsolata-Medium.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Inconsolata-Medium.ttf"; sourceTree = "<group>"; };
 		F7F4F0FF27ECDBDB008676F9 /* Inconsolata-Black.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Inconsolata-Black.ttf"; sourceTree = "<group>"; };
 		F7F4F0FF27ECDBDB008676F9 /* Inconsolata-Black.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Inconsolata-Black.ttf"; sourceTree = "<group>"; };
@@ -1238,6 +1241,7 @@
 		F7F878AD1FB9E3B900599E4F /* NCEndToEndMetadata.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NCEndToEndMetadata.swift; sourceTree = "<group>"; };
 		F7F878AD1FB9E3B900599E4F /* NCEndToEndMetadata.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NCEndToEndMetadata.swift; sourceTree = "<group>"; };
 		F7F9D1BA25397CE000D9BFF5 /* NCViewer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NCViewer.swift; sourceTree = "<group>"; };
 		F7F9D1BA25397CE000D9BFF5 /* NCViewer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NCViewer.swift; sourceTree = "<group>"; };
 		F7FAFD3928BFA947000777FE /* NCNotification+Menu.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "NCNotification+Menu.swift"; sourceTree = "<group>"; };
 		F7FAFD3928BFA947000777FE /* NCNotification+Menu.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "NCNotification+Menu.swift"; sourceTree = "<group>"; };
+		F7FC5EE02A1768D700D921F5 /* NCCapabilitiesView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NCCapabilitiesView.swift; sourceTree = "<group>"; };
 		F7FC7D551DC1F93800BB2C6A /* libz.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libz.tbd; path = usr/lib/libz.tbd; sourceTree = SDKROOT; };
 		F7FC7D551DC1F93800BB2C6A /* libz.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libz.tbd; path = usr/lib/libz.tbd; sourceTree = SDKROOT; };
 		F7FF2CB02842159500EBB7A1 /* NCSectionHeader.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = NCSectionHeader.xib; sourceTree = "<group>"; };
 		F7FF2CB02842159500EBB7A1 /* NCSectionHeader.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = NCSectionHeader.xib; sourceTree = "<group>"; };
 /* End PBXFileReference section */
 /* End PBXFileReference section */
@@ -1280,6 +1284,7 @@
 				F72CD01227A7E92400E59476 /* JGProgressHUD in Frameworks */,
 				F72CD01227A7E92400E59476 /* JGProgressHUD in Frameworks */,
 				F73ADD2126554F8E0069EA0D /* SwiftEntryKit in Frameworks */,
 				F73ADD2126554F8E0069EA0D /* SwiftEntryKit in Frameworks */,
 				F7EBCDCF277B81FF00A4EF67 /* UICKeyChainStore in Frameworks */,
 				F7EBCDCF277B81FF00A4EF67 /* UICKeyChainStore in Frameworks */,
+				F70821D829E59E6D001CA2D7 /* TagListView in Frameworks */,
 				F72D7EB7263B1207000B3DFC /* MarkdownKit in Frameworks */,
 				F72D7EB7263B1207000B3DFC /* MarkdownKit in Frameworks */,
 			);
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 			runOnlyForDeploymentPostprocessing = 0;
@@ -1314,7 +1319,6 @@
 			buildActionMask = 2147483647;
 			buildActionMask = 2147483647;
 			files = (
 			files = (
 				F7D56B1A2972405500FA46C4 /* Mantis in Frameworks */,
 				F7D56B1A2972405500FA46C4 /* Mantis in Frameworks */,
-				F76DA941277B75870082465B /* KTVHTTPCache.xcframework in Frameworks */,
 				F7ED547C25EEA65400956C55 /* QRCodeReader in Frameworks */,
 				F7ED547C25EEA65400956C55 /* QRCodeReader in Frameworks */,
 				F788ECC7263AAAFA00ADC67F /* MarkdownKit in Frameworks */,
 				F788ECC7263AAAFA00ADC67F /* MarkdownKit in Frameworks */,
 				F77BC3EB293E5268005F2B08 /* Swifter in Frameworks */,
 				F77BC3EB293E5268005F2B08 /* Swifter in Frameworks */,
@@ -1326,18 +1330,19 @@
 				F758A01227A7F03E0069468B /* JGProgressHUD in Frameworks */,
 				F758A01227A7F03E0069468B /* JGProgressHUD in Frameworks */,
 				F77333882927A72100466E35 /* OpenSSL in Frameworks */,
 				F77333882927A72100466E35 /* OpenSSL in Frameworks */,
 				F76DA966277B76F30082465B /* UICKeyChainStore in Frameworks */,
 				F76DA966277B76F30082465B /* UICKeyChainStore in Frameworks */,
+				F7792DE529EEE02D005930CE /* MobileVLCKit.xcframework in Frameworks */,
 				F753BA93281FD8020015BFB6 /* EasyTipView in Frameworks */,
 				F753BA93281FD8020015BFB6 /* EasyTipView in Frameworks */,
 				F76DA95B277B75A90082465B /* TOPasscodeViewController.xcframework in Frameworks */,
 				F76DA95B277B75A90082465B /* TOPasscodeViewController.xcframework in Frameworks */,
 				F76DA963277B760E0082465B /* Queuer in Frameworks */,
 				F76DA963277B760E0082465B /* Queuer in Frameworks */,
 				F72AD70D28C24B93006CB92D /* NextcloudKit in Frameworks */,
 				F72AD70D28C24B93006CB92D /* NextcloudKit in Frameworks */,
 				F70B86752642CE3B00ED5349 /* FirebaseCrashlytics in Frameworks */,
 				F70B86752642CE3B00ED5349 /* FirebaseCrashlytics in Frameworks */,
+				F7A1050E29E587AF00FFD92B /* TagListView in Frameworks */,
 				F76DA969277B77EA0082465B /* DropDown in Frameworks */,
 				F76DA969277B77EA0082465B /* DropDown in Frameworks */,
 				F75EAED826D2552E00F4320E /* MarqueeLabel in Frameworks */,
 				F75EAED826D2552E00F4320E /* MarqueeLabel in Frameworks */,
 				F710FC7A277B7D0000AA9FBF /* Realm in Frameworks */,
 				F710FC7A277B7D0000AA9FBF /* Realm in Frameworks */,
 				F72DA9B425F53E4E00B87DB1 /* SwiftRichString in Frameworks */,
 				F72DA9B425F53E4E00B87DB1 /* SwiftRichString in Frameworks */,
 				F74E7720277A2EF40013B958 /* XLForm in Frameworks */,
 				F74E7720277A2EF40013B958 /* XLForm in Frameworks */,
 				F73ADD1C265546890069EA0D /* SwiftEntryKit in Frameworks */,
 				F73ADD1C265546890069EA0D /* SwiftEntryKit in Frameworks */,
-				F76DA93F277B75870082465B /* KTVCocoaHTTPServer.xcframework in Frameworks */,
 			);
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 			runOnlyForDeploymentPostprocessing = 0;
 		};
 		};
@@ -1483,17 +1488,6 @@
 			path = "Rename file";
 			path = "Rename file";
 			sourceTree = "<group>";
 			sourceTree = "<group>";
 		};
 		};
-		F710E80C1EF95C9C00DC2427 /* Intro */ = {
-			isa = PBXGroup;
-			children = (
-				F749C10923C4A5330027D966 /* NCIntro.storyboard */,
-				F749C10723C4A5330027D966 /* NCIntroCollectionViewCell.swift */,
-				F749C10A23C4A5340027D966 /* NCIntroCollectionViewCell.xib */,
-				F749C10823C4A5330027D966 /* NCIntroViewController.swift */,
-			);
-			path = Intro;
-			sourceTree = "<group>";
-		};
 		F713418B2597513800768D21 /* PushNotification */ = {
 		F713418B2597513800768D21 /* PushNotification */ = {
 			isa = PBXGroup;
 			isa = PBXGroup;
 			children = (
 			children = (
@@ -1638,8 +1632,7 @@
 		F73FAEE224D2CA830090692E /* Diagnostics */ = {
 		F73FAEE224D2CA830090692E /* Diagnostics */ = {
 			isa = PBXGroup;
 			isa = PBXGroup;
 			children = (
 			children = (
-				F70A58BF24D0545100DED00D /* NCCapabilitiesViewController.storyboard */,
-				F70A58BD24D0349500DED00D /* NCCapabilitiesViewController.swift */,
+				F7FC5EE02A1768D700D921F5 /* NCCapabilitiesView.swift */,
 			);
 			);
 			path = Diagnostics;
 			path = Diagnostics;
 			sourceTree = "<group>";
 			sourceTree = "<group>";
@@ -1660,6 +1653,15 @@
 			path = Networking;
 			path = Networking;
 			sourceTree = "<group>";
 			sourceTree = "<group>";
 		};
 		};
+		F757CC8929E82D0500F31428 /* Groupfolders */ = {
+			isa = PBXGroup;
+			children = (
+				F757CC8A29E82D0500F31428 /* NCGroupfolders.storyboard */,
+				F757CC8B29E82D0500F31428 /* NCGroupfolders.swift */,
+			);
+			path = Groupfolders;
+			sourceTree = "<group>";
+		};
 		F758B41E212C516300515F55 /* Scan document */ = {
 		F758B41E212C516300515F55 /* Scan document */ = {
 			isa = PBXGroup;
 			isa = PBXGroup;
 			children = (
 			children = (
@@ -1694,6 +1696,17 @@
 			path = "Collection Common";
 			path = "Collection Common";
 			sourceTree = "<group>";
 			sourceTree = "<group>";
 		};
 		};
+		F761856529E98543006EB3B0 /* Intro */ = {
+			isa = PBXGroup;
+			children = (
+				F761856629E98543006EB3B0 /* NCIntro.storyboard */,
+				F761856729E98543006EB3B0 /* NCIntroViewController.swift */,
+				F761856829E98543006EB3B0 /* NCIntroCollectionViewCell.swift */,
+				F761856929E98543006EB3B0 /* NCIntroCollectionViewCell.xib */,
+			);
+			path = Intro;
+			sourceTree = "<group>";
+		};
 		F765F72E25237E3F00391DBE /* Recent */ = {
 		F765F72E25237E3F00391DBE /* Recent */ = {
 			isa = PBXGroup;
 			isa = PBXGroup;
 			children = (
 			children = (
@@ -1802,11 +1815,11 @@
 		F79018B1240962C7007C9B6D /* NCViewerMedia */ = {
 		F79018B1240962C7007C9B6D /* NCViewerMedia */ = {
 			isa = PBXGroup;
 			isa = PBXGroup;
 			children = (
 			children = (
-				F79EDA9E26B004980007D134 /* NCPlayer */,
+				F718C24D254D507B00C5C256 /* NCViewerMediaDetailView.swift */,
 				F70753F62542A9C000972D44 /* NCViewerMediaPage.storyboard */,
 				F70753F62542A9C000972D44 /* NCViewerMediaPage.storyboard */,
 				F70753EA2542A99800972D44 /* NCViewerMediaPage.swift */,
 				F70753EA2542A99800972D44 /* NCViewerMediaPage.swift */,
-				F718C24D254D507B00C5C256 /* NCViewerMediaDetailView.swift */,
 				F70753F02542A9A200972D44 /* NCViewerMedia.swift */,
 				F70753F02542A9A200972D44 /* NCViewerMedia.swift */,
+				F79EDA9E26B004980007D134 /* NCPlayer */,
 			);
 			);
 			path = NCViewerMedia;
 			path = NCViewerMedia;
 			sourceTree = "<group>";
 			sourceTree = "<group>";
@@ -1848,11 +1861,9 @@
 		F79EDA9E26B004980007D134 /* NCPlayer */ = {
 		F79EDA9E26B004980007D134 /* NCPlayer */ = {
 			isa = PBXGroup;
 			isa = PBXGroup;
 			children = (
 			children = (
-				F7F4F0F227ECDBA4008676F9 /* NCSubtitle */,
 				F79EDAA126B004980007D134 /* NCPlayer.swift */,
 				F79EDAA126B004980007D134 /* NCPlayer.swift */,
 				F732D23227CF8AED000B0F1B /* NCPlayerToolBar.xib */,
 				F732D23227CF8AED000B0F1B /* NCPlayerToolBar.xib */,
 				F79EDA9F26B004980007D134 /* NCPlayerToolBar.swift */,
 				F79EDA9F26B004980007D134 /* NCPlayerToolBar.swift */,
-				F716B75E26F09DF600D37EFC /* NCKTVHTTPCache.swift */,
 			);
 			);
 			path = NCPlayer;
 			path = NCPlayer;
 			sourceTree = "<group>";
 			sourceTree = "<group>";
@@ -1955,6 +1966,7 @@
 				F7D68FCB28CB9051009139F3 /* NCManageDatabase+DashboardWidget.swift */,
 				F7D68FCB28CB9051009139F3 /* NCManageDatabase+DashboardWidget.swift */,
 				F78A10BE29322E8A008499B8 /* NCManageDatabase+Directory.swift */,
 				F78A10BE29322E8A008499B8 /* NCManageDatabase+Directory.swift */,
 				F72FD3B4297ED49A00075D28 /* NCManageDatabase+E2EE.swift */,
 				F72FD3B4297ED49A00075D28 /* NCManageDatabase+E2EE.swift */,
+				F757CC8129E7F88B00F31428 /* NCManageDatabase+Groupfolders.swift */,
 				F7BF9D812934CA21009EE9A6 /* NCManageDatabase+LayoutForView.swift */,
 				F7BF9D812934CA21009EE9A6 /* NCManageDatabase+LayoutForView.swift */,
 				AF4BF61827562A4B0081CEEF /* NCManageDatabase+Metadata.swift */,
 				AF4BF61827562A4B0081CEEF /* NCManageDatabase+Metadata.swift */,
 				F749B649297B0CBB00087535 /* NCManageDatabase+Share.swift */,
 				F749B649297B0CBB00087535 /* NCManageDatabase+Share.swift */,
@@ -2017,6 +2029,7 @@
 		F7C1CDD91E6DFC6F005D92BE /* Brand */ = {
 		F7C1CDD91E6DFC6F005D92BE /* Brand */ = {
 			isa = PBXGroup;
 			isa = PBXGroup;
 			children = (
 			children = (
+				F761856529E98543006EB3B0 /* Intro */,
 				F700222B1EC479840080073F /* Custom.xcassets */,
 				F700222B1EC479840080073F /* Custom.xcassets */,
 				F7362A1E220C853A005101B5 /* LaunchScreen.storyboard */,
 				F7362A1E220C853A005101B5 /* LaunchScreen.storyboard */,
 				F78E2D6429AF02DB0024D4F3 /* Database.swift */,
 				F78E2D6429AF02DB0024D4F3 /* Database.swift */,
@@ -2138,15 +2151,6 @@
 			path = UserStatus;
 			path = UserStatus;
 			sourceTree = "<group>";
 			sourceTree = "<group>";
 		};
 		};
-		F7F4F0F227ECDBA4008676F9 /* NCSubtitle */ = {
-			isa = PBXGroup;
-			children = (
-				F7F4F0F327ECDBA4008676F9 /* NCSubtitles.swift */,
-				F7F4F0F527ECDBA4008676F9 /* NCSubtitlePlayer.swift */,
-			);
-			path = NCSubtitle;
-			sourceTree = "<group>";
-		};
 		F7F4F0FB27ECDBDA008676F9 /* Font */ = {
 		F7F4F0FB27ECDBDA008676F9 /* Font */ = {
 			isa = PBXGroup;
 			isa = PBXGroup;
 			children = (
 			children = (
@@ -2216,7 +2220,7 @@
 				F7A0D14E259229FA008F8A13 /* Extensions */,
 				F7A0D14E259229FA008F8A13 /* Extensions */,
 				F7A3214D1E9E2A070069AD1B /* Favorites */,
 				F7A3214D1E9E2A070069AD1B /* Favorites */,
 				F7725A5D251F33BB00D125E0 /* Files */,
 				F7725A5D251F33BB00D125E0 /* Files */,
-				F710E80C1EF95C9C00DC2427 /* Intro */,
+				F757CC8929E82D0500F31428 /* Groupfolders */,
 				F7BFFA621A24D7300044ED85 /* Login */,
 				F7BFFA621A24D7300044ED85 /* Login */,
 				F7EC9CB921185F2000F1C5CE /* Media */,
 				F7EC9CB921185F2000F1C5CE /* Media */,
 				371B5A2F23D0B04B00FAFAE9 /* Menu */,
 				371B5A2F23D0B04B00FAFAE9 /* Menu */,
@@ -2257,6 +2261,7 @@
 		F7FC7D541DC1F93700BB2C6A /* Frameworks */ = {
 		F7FC7D541DC1F93700BB2C6A /* Frameworks */ = {
 			isa = PBXGroup;
 			isa = PBXGroup;
 			children = (
 			children = (
+				F7792DE429EEE02D005930CE /* MobileVLCKit.xcframework */,
 				F783031028B4C86200B84583 /* libc++.1.tbd */,
 				F783031028B4C86200B84583 /* libc++.1.tbd */,
 				F783031128B4C86200B84583 /* libc++abi.tbd */,
 				F783031128B4C86200B84583 /* libc++abi.tbd */,
 				F783030E28B4C83F00B84583 /* libc++.tbd */,
 				F783030E28B4C83F00B84583 /* libc++.tbd */,
@@ -2454,6 +2459,7 @@
 				F7EBCDCE277B81FF00A4EF67 /* UICKeyChainStore */,
 				F7EBCDCE277B81FF00A4EF67 /* UICKeyChainStore */,
 				F72CD01127A7E92400E59476 /* JGProgressHUD */,
 				F72CD01127A7E92400E59476 /* JGProgressHUD */,
 				F72AD70E28C24BA1006CB92D /* NextcloudKit */,
 				F72AD70E28C24BA1006CB92D /* NextcloudKit */,
+				F70821D729E59E6D001CA2D7 /* TagListView */,
 			);
 			);
 			productName = "Share Ext";
 			productName = "Share Ext";
 			productReference = F7CE8AFB1DC1F8D8009CAE48 /* Share.appex */;
 			productReference = F7CE8AFB1DC1F8D8009CAE48 /* Share.appex */;
@@ -2551,6 +2557,7 @@
 				F77BC3EA293E5268005F2B08 /* Swifter */,
 				F77BC3EA293E5268005F2B08 /* Swifter */,
 				F7D56B192972405500FA46C4 /* Mantis */,
 				F7D56B192972405500FA46C4 /* Mantis */,
 				F787AC08298BCB4A0001BB00 /* SVGKitSwift */,
 				F787AC08298BCB4A0001BB00 /* SVGKitSwift */,
+				F7A1050D29E587AF00FFD92B /* TagListView */,
 			);
 			);
 			productName = "Crypto Cloud";
 			productName = "Crypto Cloud";
 			productReference = F7CE8AFA1DC1F8D8009CAE48 /* Nextcloud.app */;
 			productReference = F7CE8AFA1DC1F8D8009CAE48 /* Nextcloud.app */;
@@ -2709,6 +2716,7 @@
 				F77333862927A72100466E35 /* XCRemoteSwiftPackageReference "OpenSSL" */,
 				F77333862927A72100466E35 /* XCRemoteSwiftPackageReference "OpenSSL" */,
 				F77BC3E9293E5268005F2B08 /* XCRemoteSwiftPackageReference "swifter" */,
 				F77BC3E9293E5268005F2B08 /* XCRemoteSwiftPackageReference "swifter" */,
 				F7D56B182972405400FA46C4 /* XCRemoteSwiftPackageReference "Mantis" */,
 				F7D56B182972405400FA46C4 /* XCRemoteSwiftPackageReference "Mantis" */,
+				F7A1050C29E587AF00FFD92B /* XCRemoteSwiftPackageReference "TagListView" */,
 			);
 			);
 			productRefGroup = F7F67B9F1A24D27800EE80DA;
 			productRefGroup = F7F67B9F1A24D27800EE80DA;
 			projectDirPath = "";
 			projectDirPath = "";
@@ -2799,6 +2807,7 @@
 				F77444F622281649000D5EB0 /* NCGridMediaCell.xib in Resources */,
 				F77444F622281649000D5EB0 /* NCGridMediaCell.xib in Resources */,
 				F78ACD4421903CF20088454D /* NCListCell.xib in Resources */,
 				F78ACD4421903CF20088454D /* NCListCell.xib in Resources */,
 				F7F4F10727ECDBDB008676F9 /* Inconsolata-Black.ttf in Resources */,
 				F7F4F10727ECDBDB008676F9 /* Inconsolata-Black.ttf in Resources */,
+				F761856D29E98543006EB3B0 /* NCIntroCollectionViewCell.xib in Resources */,
 				F78ACD4621903D010088454D /* NCGridCell.xib in Resources */,
 				F78ACD4621903D010088454D /* NCGridCell.xib in Resources */,
 				F7F4F10827ECDBDB008676F9 /* Inconsolata-ExtraLight.ttf in Resources */,
 				F7F4F10827ECDBDB008676F9 /* Inconsolata-ExtraLight.ttf in Resources */,
 				F72685E727C78E490019EF5E /* InfoPlist.strings in Resources */,
 				F72685E727C78E490019EF5E /* InfoPlist.strings in Resources */,
@@ -2813,6 +2822,7 @@
 				F765F73225237E3F00391DBE /* NCRecent.storyboard in Resources */,
 				F765F73225237E3F00391DBE /* NCRecent.storyboard in Resources */,
 				F78F74342163757000C2ADAD /* NCTrash.storyboard in Resources */,
 				F78F74342163757000C2ADAD /* NCTrash.storyboard in Resources */,
 				F702F30225EE5D2C008F8E80 /* english.txt in Resources */,
 				F702F30225EE5D2C008F8E80 /* english.txt in Resources */,
+				F757CC8C29E82D0500F31428 /* NCGroupfolders.storyboard in Resources */,
 				F79A65C32191D90F00FF6DCC /* NCSelect.storyboard in Resources */,
 				F79A65C32191D90F00FF6DCC /* NCSelect.storyboard in Resources */,
 				F7226EDC1EE4089300EBECB1 /* Main.storyboard in Resources */,
 				F7226EDC1EE4089300EBECB1 /* Main.storyboard in Resources */,
 				F7EFC0C6256BC77700461AAD /* NCMoreUserCell.xib in Resources */,
 				F7EFC0C6256BC77700461AAD /* NCMoreUserCell.xib in Resources */,
@@ -2832,7 +2842,6 @@
 				F7E0CDCF265CE8610044854E /* NCUserStatus.storyboard in Resources */,
 				F7E0CDCF265CE8610044854E /* NCUserStatus.storyboard in Resources */,
 				F76D3CF32428B94E005DFA87 /* NCViewerPDFSearchCell.xib in Resources */,
 				F76D3CF32428B94E005DFA87 /* NCViewerPDFSearchCell.xib in Resources */,
 				F7CA212E25F1333300826ABB /* NCAccountRequest.storyboard in Resources */,
 				F7CA212E25F1333300826ABB /* NCAccountRequest.storyboard in Resources */,
-				F749C10E23C4A5340027D966 /* NCIntroCollectionViewCell.xib in Resources */,
 				F717402D24F699A5000C87D5 /* NCFavorite.storyboard in Resources */,
 				F717402D24F699A5000C87D5 /* NCFavorite.storyboard in Resources */,
 				F723B3DD22FC6D1D00301EFE /* NCShareCommentsCell.xib in Resources */,
 				F723B3DD22FC6D1D00301EFE /* NCShareCommentsCell.xib in Resources */,
 				F78ACD4B21903F850088454D /* NCTrashListCell.xib in Resources */,
 				F78ACD4B21903F850088454D /* NCTrashListCell.xib in Resources */,
@@ -2841,12 +2850,11 @@
 				F700510122DF63AC003A3356 /* NCShare.storyboard in Resources */,
 				F700510122DF63AC003A3356 /* NCShare.storyboard in Resources */,
 				F787704F22E7019900F287A9 /* NCShareLinkCell.xib in Resources */,
 				F787704F22E7019900F287A9 /* NCShareLinkCell.xib in Resources */,
 				F70753F72542A9C000972D44 /* NCViewerMediaPage.storyboard in Resources */,
 				F70753F72542A9C000972D44 /* NCViewerMediaPage.storyboard in Resources */,
-				F70A58C024D0545100DED00D /* NCCapabilitiesViewController.storyboard in Resources */,
 				F7F4F10627ECDBDB008676F9 /* Inconsolata-Medium.ttf in Resources */,
 				F7F4F10627ECDBDB008676F9 /* Inconsolata-Medium.ttf in Resources */,
 				F7AC934A296193050002BC0F /* Reasons to use Nextcloud.pdf in Resources */,
 				F7AC934A296193050002BC0F /* Reasons to use Nextcloud.pdf in Resources */,
-				F749C10D23C4A5340027D966 /* NCIntro.storyboard in Resources */,
 				F7A60F87292D215000FCE1F2 /* NCShareAccounts.storyboard in Resources */,
 				F7A60F87292D215000FCE1F2 /* NCShareAccounts.storyboard in Resources */,
 				F7239877253D86D300257F49 /* NCEmptyView.xib in Resources */,
 				F7239877253D86D300257F49 /* NCEmptyView.xib in Resources */,
+				F761856A29E98543006EB3B0 /* NCIntro.storyboard in Resources */,
 				F747BA1F22354D2000971601 /* NCCreateFormUploadVoiceNote.storyboard in Resources */,
 				F747BA1F22354D2000971601 /* NCCreateFormUploadVoiceNote.storyboard in Resources */,
 				F719D9E0288D37A300762E33 /* NCColorPicker.storyboard in Resources */,
 				F719D9E0288D37A300762E33 /* NCColorPicker.storyboard in Resources */,
 				F7651A8A23A2A3F2001403D2 /* NCCreateFormUploadDocuments.storyboard in Resources */,
 				F7651A8A23A2A3F2001403D2 /* NCCreateFormUploadDocuments.storyboard in Resources */,
@@ -2934,6 +2942,7 @@
 				F749B64F297B0CBB00087535 /* NCManageDatabase+Share.swift in Sources */,
 				F749B64F297B0CBB00087535 /* NCManageDatabase+Share.swift in Sources */,
 				D575039F27146F93008DC9DC /* String+Extension.swift in Sources */,
 				D575039F27146F93008DC9DC /* String+Extension.swift in Sources */,
 				F769CA1A2966EA3C00039397 /* ComponentView.swift in Sources */,
 				F769CA1A2966EA3C00039397 /* ComponentView.swift in Sources */,
+				F757CC8829E7F88B00F31428 /* NCManageDatabase+Groupfolders.swift in Sources */,
 				F73D5E4A246DE09200DF6467 /* NCElementsJSON.swift in Sources */,
 				F73D5E4A246DE09200DF6467 /* NCElementsJSON.swift in Sources */,
 				F79B646326CA661600838ACA /* UIControl+Extension.swift in Sources */,
 				F79B646326CA661600838ACA /* UIControl+Extension.swift in Sources */,
 				F78A10C429322E8A008499B8 /* NCManageDatabase+Directory.swift in Sources */,
 				F78A10C429322E8A008499B8 /* NCManageDatabase+Directory.swift in Sources */,
@@ -2988,6 +2997,7 @@
 				F7490E7529882BE2009DCE94 /* NCManageDatabase+Directory.swift in Sources */,
 				F7490E7529882BE2009DCE94 /* NCManageDatabase+Directory.swift in Sources */,
 				F7490E7929882C2F009DCE94 /* NCElementsJSON.swift in Sources */,
 				F7490E7929882C2F009DCE94 /* NCElementsJSON.swift in Sources */,
 				F7490E8729882CA8009DCE94 /* ThreadSafeDictionary.swift in Sources */,
 				F7490E8729882CA8009DCE94 /* ThreadSafeDictionary.swift in Sources */,
+				F757CC8729E7F88B00F31428 /* NCManageDatabase+Groupfolders.swift in Sources */,
 				F7490E8229882C80009DCE94 /* NCManageDatabase+E2EE.swift in Sources */,
 				F7490E8229882C80009DCE94 /* NCManageDatabase+E2EE.swift in Sources */,
 				F7490E7829882C28009DCE94 /* NCUtility.swift in Sources */,
 				F7490E7829882C28009DCE94 /* NCUtility.swift in Sources */,
 				F7490E7F29882C73009DCE94 /* NCManageDatabase+Activity.swift in Sources */,
 				F7490E7F29882C73009DCE94 /* NCManageDatabase+Activity.swift in Sources */,
@@ -3042,6 +3052,7 @@
 				F7EDE4E0262D7BAF00414FE6 /* NCGridCell.swift in Sources */,
 				F7EDE4E0262D7BAF00414FE6 /* NCGridCell.swift in Sources */,
 				F7A76DC8256A71CD00119AB3 /* UIImage+Extension.swift in Sources */,
 				F7A76DC8256A71CD00119AB3 /* UIImage+Extension.swift in Sources */,
 				F7B8CD96261AF401007C1359 /* NCNetworkingChunkedUpload.swift in Sources */,
 				F7B8CD96261AF401007C1359 /* NCNetworkingChunkedUpload.swift in Sources */,
+				F757CC8529E7F88B00F31428 /* NCManageDatabase+Groupfolders.swift in Sources */,
 				F7BAADC91ED5A87C00B7EAD4 /* NCDatabase.swift in Sources */,
 				F7BAADC91ED5A87C00B7EAD4 /* NCDatabase.swift in Sources */,
 				F7817D0129802D5F00FFBC65 /* NCViewCertificateDetails.swift in Sources */,
 				F7817D0129802D5F00FFBC65 /* NCViewCertificateDetails.swift in Sources */,
 				F7D57C8B26317BDE00DE301D /* NCAccountRequest.swift in Sources */,
 				F7D57C8B26317BDE00DE301D /* NCAccountRequest.swift in Sources */,
@@ -3092,6 +3103,7 @@
 				F793E59D28B761E7005E4B02 /* NCNetworking.swift in Sources */,
 				F793E59D28B761E7005E4B02 /* NCNetworking.swift in Sources */,
 				F78302FC28B4C3F300B84583 /* NCElementsJSON.swift in Sources */,
 				F78302FC28B4C3F300B84583 /* NCElementsJSON.swift in Sources */,
 				F7BF9D832934CA21009EE9A6 /* NCManageDatabase+LayoutForView.swift in Sources */,
 				F7BF9D832934CA21009EE9A6 /* NCManageDatabase+LayoutForView.swift in Sources */,
+				F757CC8329E7F88B00F31428 /* NCManageDatabase+Groupfolders.swift in Sources */,
 				F749B652297B0F2400087535 /* NCManageDatabase+Avatar.swift in Sources */,
 				F749B652297B0F2400087535 /* NCManageDatabase+Avatar.swift in Sources */,
 				F783030628B4C51E00B84583 /* String+Extension.swift in Sources */,
 				F783030628B4C51E00B84583 /* String+Extension.swift in Sources */,
 				F77ED59328C9CEA000E24ED0 /* ToolbarWidgetProvider.swift in Sources */,
 				F77ED59328C9CEA000E24ED0 /* ToolbarWidgetProvider.swift in Sources */,
@@ -3121,6 +3133,7 @@
 				F7245926289BB59300474787 /* ThreadSafeDictionary.swift in Sources */,
 				F7245926289BB59300474787 /* ThreadSafeDictionary.swift in Sources */,
 				F76673F022C90434007ED366 /* FileProviderUtility.swift in Sources */,
 				F76673F022C90434007ED366 /* FileProviderUtility.swift in Sources */,
 				F7434B3420E23FD700417916 /* NCDatabase.swift in Sources */,
 				F7434B3420E23FD700417916 /* NCDatabase.swift in Sources */,
+				F757CC8629E7F88B00F31428 /* NCManageDatabase+Groupfolders.swift in Sources */,
 				F702F2D125EE5B5C008F8E80 /* NCGlobal.swift in Sources */,
 				F702F2D125EE5B5C008F8E80 /* NCGlobal.swift in Sources */,
 				F76D364828A4F8BF00214537 /* NCActivityIndicator.swift in Sources */,
 				F76D364828A4F8BF00214537 /* NCActivityIndicator.swift in Sources */,
 				F7817D0229802D7700FFBC65 /* NCViewCertificateDetails.swift in Sources */,
 				F7817D0229802D7700FFBC65 /* NCViewCertificateDetails.swift in Sources */,
@@ -3168,15 +3181,14 @@
 				F769CA172965AB7C00039397 /* NCUploadAssets.swift in Sources */,
 				F769CA172965AB7C00039397 /* NCUploadAssets.swift in Sources */,
 				F7AE00F8230E81CB007ACF8A /* NCBrowserWeb.swift in Sources */,
 				F7AE00F8230E81CB007ACF8A /* NCBrowserWeb.swift in Sources */,
 				F702F30825EE5D47008F8E80 /* NCPopupViewController.swift in Sources */,
 				F702F30825EE5D47008F8E80 /* NCPopupViewController.swift in Sources */,
-				F70A58BE24D0349500DED00D /* NCCapabilitiesViewController.swift in Sources */,
 				F733598125C1C188002ABA72 /* NCAskAuthorization.swift in Sources */,
 				F733598125C1C188002ABA72 /* NCAskAuthorization.swift in Sources */,
 				370D26AF248A3D7A00121797 /* NCCellProtocol.swift in Sources */,
 				370D26AF248A3D7A00121797 /* NCCellProtocol.swift in Sources */,
 				F77B0DF51D118A16002130FE /* CCUtility.m in Sources */,
 				F77B0DF51D118A16002130FE /* CCUtility.m in Sources */,
 				F70D87D025EE6E58008CBBBD /* NCRenameFile.swift in Sources */,
 				F70D87D025EE6E58008CBBBD /* NCRenameFile.swift in Sources */,
-				F7F4F0F727ECDBA4008676F9 /* NCSubtitles.swift in Sources */,
 				F71CD6CA2930D7B1006C95C1 /* NCApplicationHandle.swift in Sources */,
 				F71CD6CA2930D7B1006C95C1 /* NCApplicationHandle.swift in Sources */,
 				F790110E21415BF600D7B136 /* NCViewerRichdocument.swift in Sources */,
 				F790110E21415BF600D7B136 /* NCViewerRichdocument.swift in Sources */,
 				F78ACD4021903CC20088454D /* NCGridCell.swift in Sources */,
 				F78ACD4021903CC20088454D /* NCGridCell.swift in Sources */,
+				F761856B29E98543006EB3B0 /* NCIntroViewController.swift in Sources */,
 				F75B0ABD244C4DBB00E58DCA /* NCActionCenter.swift in Sources */,
 				F75B0ABD244C4DBB00E58DCA /* NCActionCenter.swift in Sources */,
 				AF935067276B84E700BD078F /* NCMenu+FloatingPanel.swift in Sources */,
 				AF935067276B84E700BD078F /* NCMenu+FloatingPanel.swift in Sources */,
 				F702F2CD25EE5B4F008F8E80 /* AppDelegate.swift in Sources */,
 				F702F2CD25EE5B4F008F8E80 /* AppDelegate.swift in Sources */,
@@ -3191,6 +3203,7 @@
 				AF1A9B6427D0CA1E00F17A9E /* UIAlertController+Extension.swift in Sources */,
 				AF1A9B6427D0CA1E00F17A9E /* UIAlertController+Extension.swift in Sources */,
 				F73B422C2476764F00A30FD3 /* NCNotification.swift in Sources */,
 				F73B422C2476764F00A30FD3 /* NCNotification.swift in Sources */,
 				371B5A2E23D0B04500FAFAE9 /* NCMenu.swift in Sources */,
 				371B5A2E23D0B04500FAFAE9 /* NCMenu.swift in Sources */,
+				F757CC8229E7F88B00F31428 /* NCManageDatabase+Groupfolders.swift in Sources */,
 				F79EDAA326B004980007D134 /* NCPlayerToolBar.swift in Sources */,
 				F79EDAA326B004980007D134 /* NCPlayerToolBar.swift in Sources */,
 				F77444F8222816D5000D5EB0 /* NCPickerViewController.swift in Sources */,
 				F77444F8222816D5000D5EB0 /* NCPickerViewController.swift in Sources */,
 				F77BB74A2899857B0090FC19 /* UINavigationController+Extension.swift in Sources */,
 				F77BB74A2899857B0090FC19 /* UINavigationController+Extension.swift in Sources */,
@@ -3203,14 +3216,12 @@
 				AF4BF61927562A4B0081CEEF /* NCManageDatabase+Metadata.swift in Sources */,
 				AF4BF61927562A4B0081CEEF /* NCManageDatabase+Metadata.swift in Sources */,
 				F78A18B623CDD07D00F681F3 /* NCViewerRichWorkspaceWebView.swift in Sources */,
 				F78A18B623CDD07D00F681F3 /* NCViewerRichWorkspaceWebView.swift in Sources */,
 				AFA2AC8527849604008E1EA7 /* NCActivityCommentView.swift in Sources */,
 				AFA2AC8527849604008E1EA7 /* NCActivityCommentView.swift in Sources */,
-				F716B75F26F09DF600D37EFC /* NCKTVHTTPCache.swift in Sources */,
 				AFCE353727E4ED7B00FEA6C2 /* NCShareCells.swift in Sources */,
 				AFCE353727E4ED7B00FEA6C2 /* NCShareCells.swift in Sources */,
 				AF36077127BFA4E8001A243D /* ParallelWorker.swift in Sources */,
 				AF36077127BFA4E8001A243D /* ParallelWorker.swift in Sources */,
 				F75A9EE623796C6F0044CFCE /* NCNetworking.swift in Sources */,
 				F75A9EE623796C6F0044CFCE /* NCNetworking.swift in Sources */,
 				F758B460212C56A400515F55 /* NCScan.swift in Sources */,
 				F758B460212C56A400515F55 /* NCScan.swift in Sources */,
 				F78ACD52219046DC0088454D /* NCSectionHeaderFooter.swift in Sources */,
 				F78ACD52219046DC0088454D /* NCSectionHeaderFooter.swift in Sources */,
 				F7490E902988F0C2009DCE94 /* NCCreateFormUploadAssets.swift in Sources */,
 				F7490E902988F0C2009DCE94 /* NCCreateFormUploadAssets.swift in Sources */,
-				F749C10C23C4A5340027D966 /* NCIntroViewController.swift in Sources */,
 				F710D2022405826100A6033D /* NCViewer+Menu.swift in Sources */,
 				F710D2022405826100A6033D /* NCViewer+Menu.swift in Sources */,
 				F765E9CD295C585800A09ED8 /* NCUploadScanDocument.swift in Sources */,
 				F765E9CD295C585800A09ED8 /* NCUploadScanDocument.swift in Sources */,
 				F77A697D250A0FBC00FF1708 /* NCCollectionViewCommon+Menu.swift in Sources */,
 				F77A697D250A0FBC00FF1708 /* NCCollectionViewCommon+Menu.swift in Sources */,
@@ -3231,6 +3242,7 @@
 				F75C0C4823D1FAE300163CC8 /* NCRichWorkspaceCommon.swift in Sources */,
 				F75C0C4823D1FAE300163CC8 /* NCRichWorkspaceCommon.swift in Sources */,
 				F78ACD4A21903F850088454D /* NCTrashListCell+NCTrashCellProtocol.swift in Sources */,
 				F78ACD4A21903F850088454D /* NCTrashListCell+NCTrashCellProtocol.swift in Sources */,
 				F7B8CD91261AF3F7007C1359 /* NCNetworkingChunkedUpload.swift in Sources */,
 				F7B8CD91261AF3F7007C1359 /* NCNetworkingChunkedUpload.swift in Sources */,
+				F757CC8D29E82D0500F31428 /* NCGroupfolders.swift in Sources */,
 				F760329F252F0F8E0015A421 /* NCTransferCell.swift in Sources */,
 				F760329F252F0F8E0015A421 /* NCTransferCell.swift in Sources */,
 				AF68326A27BE65A90010BF0B /* NCMenuAction.swift in Sources */,
 				AF68326A27BE65A90010BF0B /* NCMenuAction.swift in Sources */,
 				F7682FE023C36B0500983A04 /* NCMainTabBar.swift in Sources */,
 				F7682FE023C36B0500983A04 /* NCMainTabBar.swift in Sources */,
@@ -3244,12 +3256,12 @@
 				AF2D7C7C2742556F00ADF566 /* NCShareLinkCell.swift in Sources */,
 				AF2D7C7C2742556F00ADF566 /* NCShareLinkCell.swift in Sources */,
 				F7E41316294A19B300839300 /* UIView+Extension.swift in Sources */,
 				F7E41316294A19B300839300 /* UIView+Extension.swift in Sources */,
 				F7C30E00291BD2610017149B /* NCNetworkingE2EERename.swift in Sources */,
 				F7C30E00291BD2610017149B /* NCNetworkingE2EERename.swift in Sources */,
-				F7F4F0F927ECDBA4008676F9 /* NCSubtitlePlayer.swift in Sources */,
 				F7651A8B23A2A3F2001403D2 /* NCCreateFormUploadDocuments.swift in Sources */,
 				F7651A8B23A2A3F2001403D2 /* NCCreateFormUploadDocuments.swift in Sources */,
 				F74AF3A4247FB6AE00AC767B /* NCUtilityFileSystem.swift in Sources */,
 				F74AF3A4247FB6AE00AC767B /* NCUtilityFileSystem.swift in Sources */,
 				F7239871253D86B600257F49 /* NCEmptyDataSet.swift in Sources */,
 				F7239871253D86B600257F49 /* NCEmptyDataSet.swift in Sources */,
 				AFCE353327E4ED1900FEA6C2 /* UIToolbar+Extension.swift in Sources */,
 				AFCE353327E4ED1900FEA6C2 /* UIToolbar+Extension.swift in Sources */,
 				8491B1CD273BBA82001C8C5B /* UIViewController+Menu.swift in Sources */,
 				8491B1CD273BBA82001C8C5B /* UIViewController+Menu.swift in Sources */,
+				F761856C29E98543006EB3B0 /* NCIntroCollectionViewCell.swift in Sources */,
 				F75DD765290ABB25002EB562 /* Intent.intentdefinition in Sources */,
 				F75DD765290ABB25002EB562 /* Intent.intentdefinition in Sources */,
 				F702F2F725EE5CED008F8E80 /* NCLogin.swift in Sources */,
 				F702F2F725EE5CED008F8E80 /* NCLogin.swift in Sources */,
 				F7E98C1627E0D0FC001F9F19 /* NCManageDatabase+Video.swift in Sources */,
 				F7E98C1627E0D0FC001F9F19 /* NCManageDatabase+Video.swift in Sources */,
@@ -3266,7 +3278,6 @@
 				F79EDAA526B004980007D134 /* NCPlayer.swift in Sources */,
 				F79EDAA526B004980007D134 /* NCPlayer.swift in Sources */,
 				F7C1EEA525053A9C00866ACC /* NCDataSource.swift in Sources */,
 				F7C1EEA525053A9C00866ACC /* NCDataSource.swift in Sources */,
 				F713FF002472764100214AF6 /* UIImage+animatedGIF.m in Sources */,
 				F713FF002472764100214AF6 /* UIImage+animatedGIF.m in Sources */,
-				F749C10B23C4A5340027D966 /* NCIntroCollectionViewCell.swift in Sources */,
 				AFCE353527E4ED5900FEA6C2 /* DateFormatter+Extension.swift in Sources */,
 				AFCE353527E4ED5900FEA6C2 /* DateFormatter+Extension.swift in Sources */,
 				F718C24E254D507B00C5C256 /* NCViewerMediaDetailView.swift in Sources */,
 				F718C24E254D507B00C5C256 /* NCViewerMediaDetailView.swift in Sources */,
 				F7145610296433C80038D028 /* NCDocumentCamera.swift in Sources */,
 				F7145610296433C80038D028 /* NCDocumentCamera.swift in Sources */,
@@ -3302,6 +3313,7 @@
 				F726EEEC1FED1C820030B9C8 /* NCEndToEndInitialize.swift in Sources */,
 				F726EEEC1FED1C820030B9C8 /* NCEndToEndInitialize.swift in Sources */,
 				F79A65C62191D95E00FF6DCC /* NCSelect.swift in Sources */,
 				F79A65C62191D95E00FF6DCC /* NCSelect.swift in Sources */,
 				F75D19E325EFE09000D74598 /* NCTrash+Menu.swift in Sources */,
 				F75D19E325EFE09000D74598 /* NCTrash+Menu.swift in Sources */,
+				F7FC5EE12A1768D700D921F5 /* NCCapabilitiesView.swift in Sources */,
 				F70CAE3A1F8CF31A008125FD /* NCEndToEndEncryption.m in Sources */,
 				F70CAE3A1F8CF31A008125FD /* NCEndToEndEncryption.m in Sources */,
 				AF93471B27E2361E002537EE /* NCShareAdvancePermission.swift in Sources */,
 				AF93471B27E2361E002537EE /* NCShareAdvancePermission.swift in Sources */,
 				F77BC3ED293E528A005F2B08 /* NCConfigServer.swift in Sources */,
 				F77BC3ED293E528A005F2B08 /* NCConfigServer.swift in Sources */,
@@ -3381,6 +3393,7 @@
 				F7A8D74128F18254008BBE1C /* UIColor+Extension.swift in Sources */,
 				F7A8D74128F18254008BBE1C /* UIColor+Extension.swift in Sources */,
 				F7A8D73428F17E12008BBE1C /* NCDatabase.swift in Sources */,
 				F7A8D73428F17E12008BBE1C /* NCDatabase.swift in Sources */,
 				F7A8D74028F18212008BBE1C /* UIImage+Extension.swift in Sources */,
 				F7A8D74028F18212008BBE1C /* UIImage+Extension.swift in Sources */,
+				F757CC8429E7F88B00F31428 /* NCManageDatabase+Groupfolders.swift in Sources */,
 				F78E2D6729AF02DB0024D4F3 /* Database.swift in Sources */,
 				F78E2D6729AF02DB0024D4F3 /* Database.swift in Sources */,
 				F7A8D73628F17E1A008BBE1C /* NCManageDatabase+Activity.swift in Sources */,
 				F7A8D73628F17E1A008BBE1C /* NCManageDatabase+Activity.swift in Sources */,
 				F7A8D73E28F181E2008BBE1C /* NCUserBaseUrl.swift in Sources */,
 				F7A8D73E28F181E2008BBE1C /* NCUserBaseUrl.swift in Sources */,
@@ -3941,7 +3954,7 @@
 				CLANG_WARN_UNREACHABLE_CODE = YES;
 				CLANG_WARN_UNREACHABLE_CODE = YES;
 				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
 				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
 				COPY_PHASE_STRIP = NO;
 				COPY_PHASE_STRIP = NO;
-				CURRENT_PROJECT_VERSION = 5;
+				CURRENT_PROJECT_VERSION = 23;
 				DEVELOPMENT_TEAM = NKUJUXUJ3B;
 				DEVELOPMENT_TEAM = NKUJUXUJ3B;
 				ENABLE_STRICT_OBJC_MSGSEND = YES;
 				ENABLE_STRICT_OBJC_MSGSEND = YES;
 				ENABLE_TESTABILITY = YES;
 				ENABLE_TESTABILITY = YES;
@@ -3965,7 +3978,7 @@
 					"@executable_path/Frameworks",
 					"@executable_path/Frameworks",
 					"@executable_path/../../Frameworks",
 					"@executable_path/../../Frameworks",
 				);
 				);
-				MARKETING_VERSION = 4.8.0;
+				MARKETING_VERSION = 4.8.1;
 				ONLY_ACTIVE_ARCH = YES;
 				ONLY_ACTIVE_ARCH = YES;
 				OTHER_LDFLAGS = "";
 				OTHER_LDFLAGS = "";
 				SDKROOT = iphoneos;
 				SDKROOT = iphoneos;
@@ -4004,7 +4017,7 @@
 				CLANG_WARN_UNREACHABLE_CODE = YES;
 				CLANG_WARN_UNREACHABLE_CODE = YES;
 				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
 				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
 				COPY_PHASE_STRIP = NO;
 				COPY_PHASE_STRIP = NO;
-				CURRENT_PROJECT_VERSION = 5;
+				CURRENT_PROJECT_VERSION = 23;
 				DEVELOPMENT_TEAM = NKUJUXUJ3B;
 				DEVELOPMENT_TEAM = NKUJUXUJ3B;
 				ENABLE_STRICT_OBJC_MSGSEND = YES;
 				ENABLE_STRICT_OBJC_MSGSEND = YES;
 				ENABLE_TESTABILITY = YES;
 				ENABLE_TESTABILITY = YES;
@@ -4026,7 +4039,7 @@
 					"@executable_path/Frameworks",
 					"@executable_path/Frameworks",
 					"@executable_path/../../Frameworks",
 					"@executable_path/../../Frameworks",
 				);
 				);
-				MARKETING_VERSION = 4.8.0;
+				MARKETING_VERSION = 4.8.1;
 				ONLY_ACTIVE_ARCH = YES;
 				ONLY_ACTIVE_ARCH = YES;
 				OTHER_LDFLAGS = "";
 				OTHER_LDFLAGS = "";
 				SDKROOT = iphoneos;
 				SDKROOT = iphoneos;
@@ -4259,7 +4272,7 @@
 			repositoryURL = "https://github.com/nextcloud/NextcloudKit";
 			repositoryURL = "https://github.com/nextcloud/NextcloudKit";
 			requirement = {
 			requirement = {
 				kind = exactVersion;
 				kind = exactVersion;
-				version = 2.1.0;
+				version = 2.4.0;
 			};
 			};
 		};
 		};
 		F788ECC5263AAAF900ADC67F /* XCRemoteSwiftPackageReference "MarkdownKit" */ = {
 		F788ECC5263AAAF900ADC67F /* XCRemoteSwiftPackageReference "MarkdownKit" */ = {
@@ -4270,6 +4283,14 @@
 				minimumVersion = 1.7.1;
 				minimumVersion = 1.7.1;
 			};
 			};
 		};
 		};
+		F7A1050C29E587AF00FFD92B /* XCRemoteSwiftPackageReference "TagListView" */ = {
+			isa = XCRemoteSwiftPackageReference;
+			repositoryURL = "https://github.com/ElaWorkshop/TagListView";
+			requirement = {
+				kind = upToNextMajorVersion;
+				minimumVersion = 1.0.0;
+			};
+		};
 		F7BB7E4527A18C56009B9F29 /* XCRemoteSwiftPackageReference "Parchment" */ = {
 		F7BB7E4527A18C56009B9F29 /* XCRemoteSwiftPackageReference "Parchment" */ = {
 			isa = XCRemoteSwiftPackageReference;
 			isa = XCRemoteSwiftPackageReference;
 			repositoryURL = "https://github.com/rechsteiner/Parchment";
 			repositoryURL = "https://github.com/rechsteiner/Parchment";
@@ -4302,6 +4323,11 @@
 			package = F76DA964277B76F10082465B /* XCRemoteSwiftPackageReference "UICKeyChainStore" */;
 			package = F76DA964277B76F10082465B /* XCRemoteSwiftPackageReference "UICKeyChainStore" */;
 			productName = UICKeyChainStore;
 			productName = UICKeyChainStore;
 		};
 		};
+		F70821D729E59E6D001CA2D7 /* TagListView */ = {
+			isa = XCSwiftPackageProductDependency;
+			package = F7A1050C29E587AF00FFD92B /* XCRemoteSwiftPackageReference "TagListView" */;
+			productName = TagListView;
+		};
 		F70B86742642CE3B00ED5349 /* FirebaseCrashlytics */ = {
 		F70B86742642CE3B00ED5349 /* FirebaseCrashlytics */ = {
 			isa = XCSwiftPackageProductDependency;
 			isa = XCSwiftPackageProductDependency;
 			package = F70B86732642CE3B00ED5349 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */;
 			package = F70B86732642CE3B00ED5349 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */;
@@ -4487,6 +4513,11 @@
 			package = F788ECC5263AAAF900ADC67F /* XCRemoteSwiftPackageReference "MarkdownKit" */;
 			package = F788ECC5263AAAF900ADC67F /* XCRemoteSwiftPackageReference "MarkdownKit" */;
 			productName = MarkdownKit;
 			productName = MarkdownKit;
 		};
 		};
+		F7A1050D29E587AF00FFD92B /* TagListView */ = {
+			isa = XCSwiftPackageProductDependency;
+			package = F7A1050C29E587AF00FFD92B /* XCRemoteSwiftPackageReference "TagListView" */;
+			productName = TagListView;
+		};
 		F7A8D72328F1771B008BBE1C /* NextcloudKit */ = {
 		F7A8D72328F1771B008BBE1C /* NextcloudKit */ = {
 			isa = XCSwiftPackageProductDependency;
 			isa = XCSwiftPackageProductDependency;
 			package = F783034028B511D200B84583 /* XCRemoteSwiftPackageReference "NextcloudKit" */;
 			package = F783034028B511D200B84583 /* XCRemoteSwiftPackageReference "NextcloudKit" */;

+ 3 - 1
iOSClient/AppDelegate.swift

@@ -52,6 +52,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterD
     let listFilesVC = ThreadSafeDictionary<String,NCFiles>()
     let listFilesVC = ThreadSafeDictionary<String,NCFiles>()
     let listFavoriteVC = ThreadSafeDictionary<String,NCFavorite>()
     let listFavoriteVC = ThreadSafeDictionary<String,NCFavorite>()
     let listOfflineVC = ThreadSafeDictionary<String,NCOffline>()
     let listOfflineVC = ThreadSafeDictionary<String,NCOffline>()
+    let listGroupfoldersVC = ThreadSafeDictionary<String,NCGroupfolders>()
 
 
     var disableSharesView: Bool = false
     var disableSharesView: Bool = false
     var documentPickerViewController: NCDocumentPickerViewController?
     var documentPickerViewController: NCDocumentPickerViewController?
@@ -462,9 +463,11 @@ class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterD
 
 
         } else if openLoginWeb {
         } else if openLoginWeb {
 
 
+            // Used also for reinsert the account (change passwd)
             if activeLoginWeb?.view.window == nil {
             if activeLoginWeb?.view.window == nil {
                 activeLoginWeb = UIStoryboard(name: "NCLogin", bundle: nil).instantiateViewController(withIdentifier: "NCLoginWeb") as? NCLoginWeb
                 activeLoginWeb = UIStoryboard(name: "NCLogin", bundle: nil).instantiateViewController(withIdentifier: "NCLoginWeb") as? NCLoginWeb
                 activeLoginWeb?.urlBase = urlBase
                 activeLoginWeb?.urlBase = urlBase
+                activeLoginWeb?.user = user
                 showLoginViewController(activeLoginWeb, contextViewController: viewController)
                 showLoginViewController(activeLoginWeb, contextViewController: viewController)
             }
             }
 
 
@@ -577,7 +580,6 @@ class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterD
         if serverVersionMajor > 0 {
         if serverVersionMajor > 0 {
             NextcloudKit.shared.setup(nextcloudVersion: serverVersionMajor)
             NextcloudKit.shared.setup(nextcloudVersion: serverVersionMajor)
         }
         }
-        NCKTVHTTPCache.shared.restartProxy(user: user, password: password)
 
 
         DispatchQueue.main.async {
         DispatchQueue.main.async {
             if UIApplication.shared.applicationState != .background && accountTestBackup != accountTest {
             if UIApplication.shared.applicationState != .background && accountTestBackup != accountTest {

+ 3 - 1
iOSClient/Data/NCElementsJSON.swift

@@ -54,7 +54,7 @@ import UIKit
     @objc public let capabilitiesE2EEEnabled: Array = ["ocs", "data", "capabilities", "end-to-end-encryption", "enabled"]
     @objc public let capabilitiesE2EEEnabled: Array = ["ocs", "data", "capabilities", "end-to-end-encryption", "enabled"]
     @objc public let capabilitiesE2EEApiVersion: Array = ["ocs", "data", "capabilities", "end-to-end-encryption", "api-version"]
     @objc public let capabilitiesE2EEApiVersion: Array = ["ocs", "data", "capabilities", "end-to-end-encryption", "api-version"]
 
 
-    @objc public let capabilitiesExternalSitesExists: Array = ["ocs", "data", "capabilities", "external"]
+    @objc public let capabilitiesExternalSites: Array = ["ocs", "data", "capabilities", "external"]
 
 
     @objc public let capabilitiesRichdocumentsMimetypes: Array = ["ocs", "data", "capabilities", "richdocuments", "mimetypes"]
     @objc public let capabilitiesRichdocumentsMimetypes: Array = ["ocs", "data", "capabilities", "richdocuments", "mimetypes"]
 
 
@@ -70,4 +70,6 @@ import UIKit
 
 
     @objc public let capabilitiesUserStatusEnabled: Array = ["ocs", "data", "capabilities", "user_status", "enabled"]
     @objc public let capabilitiesUserStatusEnabled: Array = ["ocs", "data", "capabilities", "user_status", "enabled"]
     @objc public let capabilitiesUserStatusSupportsEmoji: Array = ["ocs", "data", "capabilities", "user_status", "supports_emoji"]
     @objc public let capabilitiesUserStatusSupportsEmoji: Array = ["ocs", "data", "capabilities", "user_status", "supports_emoji"]
+
+    @objc public let capabilitiesGroupfoldersEnabled: Array = ["ocs", "data", "capabilities", "groupfolders", "hasGroupFolders"]
 }
 }

+ 94 - 0
iOSClient/Data/NCManageDatabase+Groupfolders.swift

@@ -0,0 +1,94 @@
+//
+//  NCManageDatabase+LayoutForView.swift
+//  Nextcloud
+//
+//  Created by Marino Faggiana on 28/11/22.
+//  Copyright © 2022 Marino Faggiana. All rights reserved.
+//
+//  Author Marino Faggiana <marino.faggiana@nextcloud.com>
+//
+//  This program is free software: you can redistribute it and/or modify
+//  it under the terms of the GNU General Public License as published by
+//  the Free Software Foundation, either version 3 of the License, or
+//  (at your option) any later version.
+//
+//  This program is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+//  GNU General Public License for more details.
+//
+//  You should have received a copy of the GNU General Public License
+//  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+//
+
+import Foundation
+import RealmSwift
+import NextcloudKit
+import SwiftyJSON
+
+class TableGroupfolders: Object {
+
+    @Persisted var account = ""
+    @Persisted var acl: Bool = false
+    @Persisted var groups: List<TableGroupfoldersGroups>
+    @Persisted var id: Int = 0
+    @Persisted var manage: Data?
+    @Persisted var mountPoint = ""
+    @Persisted var quota: Int = 0
+    @Persisted var size: Int = 0
+}
+
+class TableGroupfoldersGroups: Object {
+
+    @Persisted var account = ""
+    @Persisted var group = ""
+    @Persisted var permission: Int = 0
+
+    convenience init(account: String, group: String, permission: Int) {
+        self.init()
+
+        self.account = account
+        self.group = group
+        self.permission = permission
+    }
+}
+
+extension NCManageDatabase {
+
+    func addGroupfolders(account: String, groupfolders: [NKGroupfolders]) {
+
+        let realm = try! Realm()
+
+        do {
+            try realm.write {
+
+                let tableGroupfolders = realm.objects(TableGroupfolders.self).filter("account == %@", account)
+                realm.delete(tableGroupfolders)
+
+                let tableGroupfoldersGroups = realm.objects(TableGroupfoldersGroups.self).filter("account == %@", account)
+                realm.delete(tableGroupfoldersGroups)
+
+                for groupfolder in groupfolders {
+
+                    let obj = TableGroupfolders()
+
+                    obj.account = account
+                    obj.acl = groupfolder.acl
+                    for group in groupfolder.groups ?? [:] {
+                        let objGroups = TableGroupfoldersGroups(account: account, group: group.key, permission: (group.value as? Int ?? 0))
+                        obj.groups.append(objGroups)
+                    }
+                    obj.id = groupfolder.id
+                    obj.manage = groupfolder.manage
+                    obj.mountPoint = groupfolder.mountPoint
+                    obj.quota = groupfolder.quota
+                    obj.size = groupfolder.size
+
+                    realm.add(obj)
+                }
+            }
+        } catch let error {
+            NextcloudKit.shared.nkCommonInstance.writeLog("Could not write to database: \(error)")
+        }
+    }
+}

+ 60 - 14
iOSClient/Data/NCManageDatabase+Metadata.swift

@@ -91,6 +91,7 @@ class tableMetadata: Object, NCUserBaseUrl {
     @objc dynamic var size: Int64 = 0
     @objc dynamic var size: Int64 = 0
     @objc dynamic var status: Int = 0
     @objc dynamic var status: Int = 0
     @objc dynamic var subline: String?
     @objc dynamic var subline: String?
+    let tags = List<String>()
     @objc dynamic var trashbinFileName = ""
     @objc dynamic var trashbinFileName = ""
     @objc dynamic var trashbinOriginalLocation = ""
     @objc dynamic var trashbinOriginalLocation = ""
     @objc dynamic var trashbinDeletionTime = NSDate()
     @objc dynamic var trashbinDeletionTime = NSDate()
@@ -143,6 +144,22 @@ extension tableMetadata {
         sharePermissionsCollaborationServices == NCGlobal.shared.permissionReadShare && classFile == NKCommon.TypeClassFile.document.rawValue
         sharePermissionsCollaborationServices == NCGlobal.shared.permissionReadShare && classFile == NKCommon.TypeClassFile.document.rawValue
     }
     }
 
 
+    var isMovie: Bool {
+        return classFile == NKCommon.TypeClassFile.audio.rawValue || classFile == NKCommon.TypeClassFile.video.rawValue
+    }
+
+    var isVideo: Bool {
+        return classFile == NKCommon.TypeClassFile.video.rawValue
+    }
+
+    var isAudio: Bool {
+        return classFile == NKCommon.TypeClassFile.audio.rawValue
+    }
+
+    var isImage: Bool {
+        return classFile == NKCommon.TypeClassFile.image.rawValue
+    }
+
     var isSavebleAsImage: Bool {
     var isSavebleAsImage: Bool {
         classFile == NKCommon.TypeClassFile.image.rawValue && contentType != "image/svg+xml"
         classFile == NKCommon.TypeClassFile.image.rawValue && contentType != "image/svg+xml"
     }
     }
@@ -285,6 +302,9 @@ extension NCManageDatabase {
         for element in file.shareType {
         for element in file.shareType {
             metadata.shareType.append(element)
             metadata.shareType.append(element)
         }
         }
+        for element in file.tags {
+            metadata.tags.append(element)
+        }
         metadata.size = file.size
         metadata.size = file.size
         metadata.classFile = file.classFile
         metadata.classFile = file.classFile
         //FIXME: iOS 12.0,* don't detect UTI text/markdown, text/x-markdown
         //FIXME: iOS 12.0,* don't detect UTI text/markdown, text/x-markdown
@@ -533,7 +553,19 @@ extension NCManageDatabase {
                         // update
                         // update
                         // Workaround: check lock bc no etag changes if lock runs out in directory
                         // Workaround: check lock bc no etag changes if lock runs out in directory
                         // https://github.com/nextcloud/server/issues/8477
                         // https://github.com/nextcloud/server/issues/8477
-                        if result.status == NCGlobal.shared.metadataStatusNormal && (result.etag != metadata.etag || result.fileNameView != metadata.fileNameView || result.date != metadata.date || result.permissions != metadata.permissions || result.hasPreview != metadata.hasPreview || result.note != metadata.note || result.lock != metadata.lock || result.shareType != metadata.shareType || result.sharePermissionsCloudMesh != metadata.sharePermissionsCloudMesh || result.sharePermissionsCollaborationServices != metadata.sharePermissionsCollaborationServices || result.favorite != metadata.favorite) {
+                        if result.status == NCGlobal.shared.metadataStatusNormal &&
+                            (result.etag != metadata.etag ||
+                             result.fileNameView != metadata.fileNameView ||
+                             result.date != metadata.date ||
+                             result.permissions != metadata.permissions ||
+                             result.hasPreview != metadata.hasPreview ||
+                             result.note != metadata.note ||
+                             result.lock != metadata.lock ||
+                             result.shareType != metadata.shareType ||
+                             result.sharePermissionsCloudMesh != metadata.sharePermissionsCloudMesh ||
+                             result.sharePermissionsCollaborationServices != metadata.sharePermissionsCollaborationServices ||
+                             result.favorite != metadata.favorite ||
+                             result.tags != metadata.tags) {
                             ocIdsUdate.append(metadata.ocId)
                             ocIdsUdate.append(metadata.ocId)
                             realm.add(tableMetadata.init(value: metadata), update: .all)
                             realm.add(tableMetadata.init(value: metadata), update: .all)
                         } else if result.status == NCGlobal.shared.metadataStatusNormal && addCompareLivePhoto && result.livePhoto != metadata.livePhoto {
                         } else if result.status == NCGlobal.shared.metadataStatusNormal && addCompareLivePhoto && result.livePhoto != metadata.livePhoto {
@@ -1057,27 +1089,41 @@ extension NCManageDatabase {
         return getMetadata(predicate: NSPredicate(format: "account == %@ AND serverUrl == %@ AND fileNameView == %@", account, serverUrl, fileNameConflict))
         return getMetadata(predicate: NSPredicate(format: "account == %@ AND serverUrl == %@ AND fileNameView == %@", account, serverUrl, fileNameConflict))
     }
     }
 
 
-    func getSubtitles(account: String, serverUrl: String, fileName: String) -> (all:[tableMetadata], existing:[tableMetadata]) {
+    func getNumMetadatasInUpload() -> Int {
 
 
         let realm = try! Realm()
         let realm = try! Realm()
-        let nameOnly = (fileName as NSString).deletingPathExtension + "."
-        var metadatas: [tableMetadata] = []
 
 
-        let results = realm.objects(tableMetadata.self).filter("account == %@ AND serverUrl == %@ AND fileName BEGINSWITH[c] %@ AND fileName ENDSWITH[c] '.srt'", account, serverUrl, nameOnly)
-        for result in results {
-            if CCUtility.fileProviderStorageExists(result) {
-                metadatas.append(result)
-            }
-        }
-        return(Array(results.map { tableMetadata.init(value: $0) }), Array(metadatas.map { tableMetadata.init(value: $0) }))
+        let num = realm.objects(tableMetadata.self).filter(NSPredicate(format: "status == %i || status == %i",  NCGlobal.shared.metadataStatusInUpload, NCGlobal.shared.metadataStatusUploading)).count
+
+        return num
     }
     }
 
 
-    func getNumMetadatasInUpload() -> Int {
+    func getMetadataFromDirectory(account: String, serverUrl: String) -> tableMetadata? {
 
 
         let realm = try! Realm()
         let realm = try! Realm()
 
 
-        let num = realm.objects(tableMetadata.self).filter(NSPredicate(format: "status == %i || status == %i",  NCGlobal.shared.metadataStatusInUpload, NCGlobal.shared.metadataStatusUploading)).count
+        guard let directory = realm.objects(tableDirectory.self).filter("account == %@ AND serverUrl == %@", account, serverUrl).first else { return nil }
+        guard let result = realm.objects(tableMetadata.self).filter("ocId == %@", directory.ocId).first else { return nil }
 
 
-        return num
+        return tableMetadata.init(value: result)
+    }
+
+    func getMetadatasFromGroupfolders(account: String, urlBase: String, userId: String) -> [tableMetadata] {
+
+        let realm = try! Realm()
+        var metadatas: [tableMetadata] = []
+        let homeServerUrl = NCUtilityFileSystem.shared.getHomeServer(urlBase: urlBase, userId: userId)
+
+        let groupfolders = realm.objects(TableGroupfolders.self).filter("account == %@", account)
+        for groupfolder in groupfolders {
+            let mountPoint = groupfolder.mountPoint.hasPrefix("/") ? groupfolder.mountPoint : "/" + groupfolder.mountPoint
+            let serverUrlFileName = homeServerUrl + mountPoint
+            if let directory = realm.objects(tableDirectory.self).filter("account == %@ AND serverUrl == %@", account, serverUrlFileName).first,
+               let metadata = realm.objects(tableMetadata.self).filter("ocId == %@", directory.ocId).first {
+                metadatas.append(tableMetadata(value: metadata))
+            }
+        }
+
+        return metadatas
     }
     }
 }
 }

+ 58 - 59
iOSClient/Data/NCManageDatabase+Video.swift

@@ -25,27 +25,28 @@ import Foundation
 import RealmSwift
 import RealmSwift
 import NextcloudKit
 import NextcloudKit
 
 
-class tableVideo: Object {
-
-    @objc dynamic var account = ""
-    @objc dynamic var duration: Int64 = 0
-    @objc dynamic var ocId = ""
-    @objc dynamic var time: Int64 = 0
-    @objc dynamic var codecNameVideo: String?
-    @objc dynamic var codecNameAudio: String?
-    @objc dynamic var codecAudioChannelLayout: String?
-    @objc dynamic var codecAudioLanguage: String?
-    @objc dynamic var codecMaxCompatibility: Bool = false
-    @objc dynamic var codecQuality: String?
-
-    override static func primaryKey() -> String {
-        return "ocId"
-    }
+typealias tableVideo = tableVideoV4
+class tableVideoV4: Object {
+
+    @Persisted var account = ""
+    @Persisted(primaryKey: true) var ocId = ""
+    @Persisted var position: Float?
+    @Persisted var width: Int?
+    @Persisted var height: Int?
+    @Persisted var length: Int?
+    @Persisted var codecNameVideo: String?
+    @Persisted var codecNameAudio: String?
+    @Persisted var codecAudioChannelLayout: String?
+    @Persisted var codecAudioLanguage: String?
+    @Persisted var codecMaxCompatibility: Bool = false
+    @Persisted var codecQuality: String?
+    @Persisted var currentAudioTrackIndex: Int?
+    @Persisted var currentVideoSubTitleIndex: Int?
 }
 }
 
 
 extension NCManageDatabase {
 extension NCManageDatabase {
 
 
-    func addVideoTime(metadata: tableMetadata, time: CMTime?, durationTime: CMTime?) {
+    func addVideo(metadata: tableMetadata, position: Float? = nil, width: Int? = nil, height: Int? = nil, length: Int? = nil, currentAudioTrackIndex: Int? = nil, currentVideoSubTitleIndex: Int? = nil) {
 
 
         if metadata.livePhoto { return }
         if metadata.livePhoto { return }
         let realm = try! Realm()
         let realm = try! Realm()
@@ -54,27 +55,54 @@ extension NCManageDatabase {
             try realm.write {
             try realm.write {
                 if let result = realm.objects(tableVideo.self).filter("account == %@ AND ocId == %@", metadata.account, metadata.ocId).first {
                 if let result = realm.objects(tableVideo.self).filter("account == %@ AND ocId == %@", metadata.account, metadata.ocId).first {
 
 
-                    if let durationTime = durationTime {
-                        result.duration = durationTime.convertScale(1000, method: .default).value
+                    if let position = position {
+                        result.position = position
+                    }
+                    if let width = width {
+                        result.width = width
+                    }
+                    if let height = height {
+                        result.height = height
+                    }
+                    if let length = length {
+                        result.length = length
+                    }
+                    if let currentAudioTrackIndex = currentAudioTrackIndex {
+                        result.currentAudioTrackIndex = currentAudioTrackIndex
                     }
                     }
-                    if let time = time {
-                        result.time = time.convertScale(1000, method: .default).value
+                    if let currentVideoSubTitleIndex = currentVideoSubTitleIndex {
+                        result.currentVideoSubTitleIndex = currentVideoSubTitleIndex
                     }
                     }
+
                     realm.add(result, update: .all)
                     realm.add(result, update: .all)
 
 
                 } else {
                 } else {
 
 
-                    let addObject = tableVideo()
+                    let result = tableVideo()
 
 
-                    addObject.account = metadata.account
-                    if let durationTime = durationTime {
-                        addObject.duration = durationTime.convertScale(1000, method: .default).value
+                    result.account = metadata.account
+                    result.ocId = metadata.ocId
+
+                    if let position = position {
+                        result.position = position
                     }
                     }
-                    addObject.ocId = metadata.ocId
-                    if let time = time {
-                        addObject.time = time.convertScale(1000, method: .default).value
+                    if let width = width {
+                        result.width = width
                     }
                     }
-                    realm.add(addObject, update: .all)
+                    if let height = height {
+                        result.height = height
+                    }
+                    if let length = length {
+                        result.length = length
+                    }
+                    if let currentAudioTrackIndex = currentAudioTrackIndex {
+                        result.currentAudioTrackIndex = currentAudioTrackIndex
+                    }
+                    if let currentVideoSubTitleIndex = currentVideoSubTitleIndex {
+                        result.currentVideoSubTitleIndex = currentVideoSubTitleIndex
+                    }
+                    
+                    realm.add(result, update: .all)
                 }
                 }
             }
             }
         } catch let error {
         } catch let error {
@@ -124,36 +152,7 @@ extension NCManageDatabase {
 
 
         return tableVideo.init(value: result)
         return tableVideo.init(value: result)
     }
     }
-
-    func getVideoDurationTime(metadata: tableMetadata?) -> CMTime? {
-        guard let metadata = metadata else { return nil }
-
-        if metadata.livePhoto { return nil }
-        let realm = try! Realm()
-
-        guard let result = realm.objects(tableVideo.self).filter("account == %@ AND ocId == %@", metadata.account, metadata.ocId).first else {
-            return nil
-        }
-
-        if result.duration == 0 { return nil }
-        let duration = CMTimeMake(value: result.duration, timescale: 1000)
-        return duration
-    }
-
-    func getVideoTime(metadata: tableMetadata) -> CMTime? {
-
-        if metadata.livePhoto { return nil }
-        let realm = try! Realm()
-
-        guard let result = realm.objects(tableVideo.self).filter("account == %@ AND ocId == %@", metadata.account, metadata.ocId).first else {
-            return nil
-        }
-
-        if result.time == 0 { return nil }
-        let time = CMTimeMake(value: result.time, timescale: 1000)
-        return time
-    }
-
+    
     func deleteVideo(metadata: tableMetadata) {
     func deleteVideo(metadata: tableMetadata) {
 
 
         let realm = try! Realm()
         let realm = try! Realm()

+ 17 - 10
iOSClient/Data/NCManageDatabase.swift

@@ -70,7 +70,7 @@ class NCManageDatabase: NSObject {
             let config = Realm.Configuration(
             let config = Realm.Configuration(
                 fileURL: dirGroup?.appendingPathComponent(NCGlobal.shared.appDatabaseNextcloud + "/" + databaseName),
                 fileURL: dirGroup?.appendingPathComponent(NCGlobal.shared.appDatabaseNextcloud + "/" + databaseName),
                 schemaVersion: databaseSchemaVersion,
                 schemaVersion: databaseSchemaVersion,
-                objectTypes: [tableMetadata.self, tableLocalFile.self, tableDirectory.self, tableTag.self, tableAccount.self, tableCapabilities.self, tablePhotoLibrary.self, tableE2eEncryption.self, tableE2eEncryptionLock.self, tableShare.self, tableChunk.self, tableAvatar.self, tableDashboardWidget.self, tableDashboardWidgetButton.self, NCDBLayoutForView.self]
+                objectTypes: [tableMetadata.self, tableLocalFile.self, tableDirectory.self, tableTag.self, tableAccount.self, tableCapabilities.self, tablePhotoLibrary.self, tableE2eEncryption.self, tableE2eEncryptionLock.self, tableE2eMetadata.self, tableShare.self, tableChunk.self, tableAvatar.self, tableDashboardWidget.self, tableDashboardWidgetButton.self, NCDBLayoutForView.self]
             )
             )
 
 
             Realm.Configuration.defaultConfiguration = config
             Realm.Configuration.defaultConfiguration = config
@@ -95,6 +95,10 @@ class NCManageDatabase: NSObject {
                         migration.deleteData(forType: tableMetadata.className())
                         migration.deleteData(forType: tableMetadata.className())
                     }
                     }
 
 
+                    if oldSchemaVersion < 292 {
+                        migration.deleteData(forType: tableVideo.className())
+                    }
+
                 }, shouldCompactOnLaunch: { totalBytes, usedBytes in
                 }, shouldCompactOnLaunch: { totalBytes, usedBytes in
 
 
                     // totalBytes refers to the size of the file on disk in bytes (data + free space)
                     // totalBytes refers to the size of the file on disk in bytes (data + free space)
@@ -108,14 +112,14 @@ class NCManageDatabase: NSObject {
 
 
             do {
             do {
                 _ = try Realm(configuration: configCompact)
                 _ = try Realm(configuration: configCompact)
-            } catch {
+            } catch let error {
                 if let databaseFileUrlPath = databaseFileUrlPath {
                 if let databaseFileUrlPath = databaseFileUrlPath {
                     do {
                     do {
 #if !EXTENSION
 #if !EXTENSION
-                        let error = NKError(errorCode: NCGlobal.shared.errorInternalError, errorDescription: "_database_corrupt_")
-                        NCContentPresenter.shared.showError(error: error, priority: .max)
+                        let nkError = NKError(errorCode: NCGlobal.shared.errorInternalError, errorDescription: error.localizedDescription)
+                        NCContentPresenter.shared.showError(error: nkError, priority: .max)
 #endif
 #endif
-                        NextcloudKit.shared.nkCommonInstance.writeLog("DATABASE CORRUPT: removed")
+                        NextcloudKit.shared.nkCommonInstance.writeLog("DATABASE ERROR: \(error.localizedDescription)")
                         try FileManager.default.removeItem(at: databaseFileUrlPath)
                         try FileManager.default.removeItem(at: databaseFileUrlPath)
                     } catch {}
                     } catch {}
                 }
                 }
@@ -132,16 +136,16 @@ class NCManageDatabase: NSObject {
         // Verify Database, if corrupt remove it
         // Verify Database, if corrupt remove it
         do {
         do {
             _ = try Realm()
             _ = try Realm()
-        } catch {
+        } catch let error {
             if let databaseFileUrlPath = databaseFileUrlPath {
             if let databaseFileUrlPath = databaseFileUrlPath {
                 do {
                 do {
 #if !EXTENSION
 #if !EXTENSION
-                    let error = NKError(errorCode: NCGlobal.shared.errorInternalError, errorDescription: "_database_corrupt_")
-                    NCContentPresenter.shared.showError(error: error, priority: .max)
+                    let nkError = NKError(errorCode: NCGlobal.shared.errorInternalError, errorDescription: error.localizedDescription)
+                    NCContentPresenter.shared.showError(error: nkError, priority: .max)
 #endif
 #endif
-                    NextcloudKit.shared.nkCommonInstance.writeLog("DATABASE CORRUPT: removed")
+                    NextcloudKit.shared.nkCommonInstance.writeLog("DATABASE ERROR: \(error.localizedDescription)")
                     try FileManager.default.removeItem(at: databaseFileUrlPath)
                     try FileManager.default.removeItem(at: databaseFileUrlPath)
-                } catch {}
+                } catch { }
             }
             }
         }
         }
 
 
@@ -190,8 +194,11 @@ class NCManageDatabase: NSObject {
         self.clearTable(tableDirectory.self, account: account)
         self.clearTable(tableDirectory.self, account: account)
         self.clearTable(tableE2eEncryption.self, account: account)
         self.clearTable(tableE2eEncryption.self, account: account)
         self.clearTable(tableE2eEncryptionLock.self, account: account)
         self.clearTable(tableE2eEncryptionLock.self, account: account)
+        self.clearTable(tableE2eMetadata.self, account: account)
         self.clearTable(tableExternalSites.self, account: account)
         self.clearTable(tableExternalSites.self, account: account)
         self.clearTable(tableGPS.self, account: nil)
         self.clearTable(tableGPS.self, account: nil)
+        self.clearTable(TableGroupfolders.self, account: account)
+        self.clearTable(TableGroupfoldersGroups.self, account: account)
         self.clearTable(NCDBLayoutForView.self, account: account)
         self.clearTable(NCDBLayoutForView.self, account: account)
         self.clearTable(tableLocalFile.self, account: account)
         self.clearTable(tableLocalFile.self, account: account)
         self.clearTable(tableMetadata.self, account: account)
         self.clearTable(tableMetadata.self, account: account)

+ 236 - 0
iOSClient/Diagnostics/NCCapabilitiesView.swift

@@ -0,0 +1,236 @@
+//
+//  NCCapabilitiesView.swift
+//  Nextcloud
+//
+//  Created by Marino Faggiana on 19/05/23.
+//  Copyright © 2023 Marino Faggiana. All rights reserved.
+//
+
+import SwiftUI
+import NextcloudKit
+
+@objc class NCHostingCapabilitiesView: NSObject {
+
+    @objc func makeShipDetailsUI() -> UIViewController {
+
+        let capabilitiesStatus = NCCapabilitiesViewOO()
+        let view = NCCapabilitiesView(capabilitiesStatus: capabilitiesStatus)
+        let vc = UIHostingController(rootView: view)
+        vc.title = NSLocalizedString("_capabilities_", comment: "")
+        return vc
+    }
+}
+
+class NCCapabilitiesViewOO: ObservableObject {
+
+    struct Capability: Identifiable, Hashable {
+        let id = UUID()
+        let text: String
+        let image: UIImage
+        let available: Bool
+    }
+
+    @Published var capabililies: [Capability] = []
+    @Published var json = "Lorem ipsum dolor sit amet.\nEa voluptas aperiam aut inventore saepe in tenetur modi.\nCum sint tempore sed maiores quos aut quaerat deleniti.\nQui beatae quia qui repellat sunt in Quis libero aut quidem porro non explicabo tenetur et natus doloribus non voluptatum consequatur.\n"
+    @Published var homeServer = ""
+
+    init() {
+
+        if ProcessInfo.processInfo.environment["XCODE_RUNNING_FOR_PREVIEWS"] == "1" {
+            capabililies = [Capability(text: "File sharing", image: UIImage(named: "share")!.resizeImage(size: CGSize(width: 25, height: 25))!, available: true),
+                            Capability(text: "Externa site", image: UIImage(systemName: "network")!, available: false)
+            ]
+            homeServer = "https://cloud.nextcloud.com/remote.php.dav/files/marino/"
+        } else {
+            guard let activeAccount = NCManageDatabase.shared.getActiveAccount() else { return }
+            homeServer = NCUtilityFileSystem.shared.getHomeServer(urlBase: activeAccount.urlBase, userId: activeAccount.userId) + "/"
+            getCapabilities(account: activeAccount.account)
+        }
+    }
+
+    func getCapabilities(account: String) {
+
+        NextcloudKit.shared.getCapabilities { account, data, error in
+            if error == .success, let data = data {
+                NCManageDatabase.shared.addCapabilitiesJSon(data, account: account)
+                let serverVersionMajor = NCManageDatabase.shared.getCapabilitiesServerInt(account: account, elements: NCElementsJSON.shared.capabilitiesVersionMajor)
+                if serverVersionMajor >= NCGlobal.shared.nextcloudVersion18 {
+                    NextcloudKit.shared.NCTextObtainEditorDetails { account, editors, creators, _, error in
+                        if error == .success {
+                            NCManageDatabase.shared.addDirectEditing(account: account, editors: editors, creators: creators)
+                            self.updateCapabilities(account: account)
+                        }
+                    }
+                } else {
+                    self.updateCapabilities(account: account)
+                }
+            } else {
+                self.updateCapabilities(account: account)
+            }
+        }
+
+        updateCapabilities(account: account)
+    }
+
+    func updateCapabilities(account: String) {
+
+        var available: Bool = false
+
+        capabililies.removeAll()
+        json = ""
+
+        // FILE SHARING
+        available = NCManageDatabase.shared.getCapabilitiesServerBool(account: account, elements: NCElementsJSON.shared.capabilitiesFileSharingApiEnabled, exists: false)
+        capabililies.append(Capability(text: "File sharing", image: UIImage(named: "share")!.resizeImage(size: CGSize(width: 25, height: 25))!, available: available))
+
+        // EXTERNAL SITE
+        available = NCManageDatabase.shared.getCapabilitiesServerBool(account: account, elements: NCElementsJSON.shared.capabilitiesExternalSites, exists: true)
+        capabililies.append(Capability(text: "External site", image: UIImage(systemName: "network")!, available: available))
+
+        // E2EE
+        available = NCManageDatabase.shared.getCapabilitiesServerBool(account: account, elements: NCElementsJSON.shared.capabilitiesE2EEEnabled, exists: false)
+        capabililies.append(Capability(text: "End-to-End Encryption", image: UIImage(systemName: "lock")!, available: available))
+
+        // ACTIVITY
+        if NCManageDatabase.shared.getCapabilitiesServerArray(account: account, elements: NCElementsJSON.shared.capabilitiesActivity) == nil {
+            available = false
+        } else {
+            available = true
+        }
+        capabililies.append(Capability(text: "Activity", image: UIImage(systemName: "bolt")!, available: available))
+
+        // NOTIFICATION
+        if NCManageDatabase.shared.getCapabilitiesServerArray(account: account, elements: NCElementsJSON.shared.capabilitiesNotification) == nil {
+            available = false
+        } else {
+            available = true
+        }
+        capabililies.append(Capability(text: "Notification", image: UIImage(systemName: "bell")!, available: available))
+
+        // DELETE FILES
+        available = NCManageDatabase.shared.getCapabilitiesServerBool(account: account, elements: NCElementsJSON.shared.capabilitiesFilesUndelete, exists: false)
+        capabililies.append(Capability(text: "Deleted files", image: UIImage(systemName: "trash")!, available: available))
+
+        // TEXT - ONLYOFFICE
+        var textEditor = false
+        var onlyofficeEditors = false
+        if let editors = NCManageDatabase.shared.getDirectEditingEditors(account: account) {
+            for editor in editors {
+                if editor.editor == NCGlobal.shared.editorText {
+                    textEditor = true
+                } else if editor.editor == NCGlobal.shared.editorOnlyoffice {
+                    onlyofficeEditors = true
+                }
+            }
+        }
+        capabililies.append(Capability(text: "Text", image: UIImage(named: "text")!.resizeImage(size: CGSize(width: 25, height: 25))!, available: textEditor))
+        capabililies.append(Capability(text: "ONLYOFFICE", image: UIImage(named: "onlyoffice")!.resizeImage(size: CGSize(width: 25, height: 25))!, available: onlyofficeEditors))
+
+        // COLLABORA
+        if NCManageDatabase.shared.getCapabilitiesServerArray(account: account, elements: NCElementsJSON.shared.capabilitiesRichdocumentsMimetypes) == nil {
+            available = false
+        } else {
+            available = true
+        }
+        capabililies.append(Capability(text: "Collabora", image: UIImage(named: "collabora")!.resizeImage(size: CGSize(width: 25, height: 25))!, available: available))
+
+        // USER STATUS
+        available = NCManageDatabase.shared.getCapabilitiesServerBool(account: account, elements: NCElementsJSON.shared.capabilitiesUserStatusEnabled, exists: false)
+        capabililies.append(Capability(text: "User Status", image: UIImage(systemName: "moon")!, available: available))
+
+        // COMMENTS
+        available = NCManageDatabase.shared.getCapabilitiesServerBool(account: account, elements: NCElementsJSON.shared.capabilitiesFilesComments, exists: false)
+        capabililies.append(Capability(text: "Comments", image: UIImage(systemName: "ellipsis.bubble")!, available: available))
+
+        // LOCK FILE
+        let hasLockCapability = NCManageDatabase.shared.getCapabilitiesServerInt(account: account, elements: NCElementsJSON.shared.capabilitiesFilesLockVersion) >= 1
+        if hasLockCapability {
+            available = false
+        } else {
+            available = true
+        }
+        capabililies.append(Capability(text: "Lock file", image: UIImage(systemName: "lock")!, available: available))
+
+        // GROUP FOLDERS
+        available = NCManageDatabase.shared.getCapabilitiesServerBool(account: account, elements: NCElementsJSON.shared.capabilitiesGroupfoldersEnabled, exists: false)
+        capabililies.append(Capability(text: "Group folders", image: UIImage(systemName: "person.2")!, available: available))
+
+        if let json = NCManageDatabase.shared.getCapabilities(account: account) {
+            self.json = json
+        }
+    }
+}
+
+struct NCCapabilitiesView: View {
+
+    @ObservedObject var capabilitiesViewOO: NCCapabilitiesViewOO
+
+    init(capabilitiesStatus: NCCapabilitiesViewOO) {
+        self.capabilitiesViewOO = capabilitiesStatus
+    }
+
+    var body: some View {
+        VStack {
+            List {
+                Section {
+                    ForEach(capabilitiesViewOO.capabililies, id: \.id) { capability in
+                        HStack {
+                            CapabilityName(text: capability.text, image: Image(uiImage: capability.image))
+                            CapabilityStatus(available: capability.available)
+                        }
+                    }
+                }
+                Section {
+                    CapabilityName(text: capabilitiesViewOO.homeServer, image: Image(uiImage: UIImage(systemName: "house")!))
+                }
+                Section {
+                    ScrollView(.horizontal) {
+                        Text(capabilitiesViewOO.json)
+                            .font(.system(size: 12))
+                    }
+                }
+            }
+        }
+        .frame(maxWidth: .infinity, alignment: .top)
+    }
+
+    struct CapabilityName: View {
+
+        @State var text: String = ""
+        @State var image: Image
+
+        var body: some View {
+            Label {
+                Text(text)
+                    .font(.system(size: 15))
+                    .foregroundColor(Color(UIColor.systemGray))
+            } icon: {
+                image
+                    .renderingMode(.template)
+                    .foregroundColor(Color(UIColor.systemGray))
+            }
+            .frame(maxWidth: .infinity, alignment: .leading)
+        }
+    }
+
+    struct CapabilityStatus: View {
+
+        @State var available: Bool
+
+        var body: some View {
+            if available {
+                Image(systemName: "checkmark.circle.fill")
+                    .foregroundColor(.green)
+            } else {
+                Image(systemName: "multiply.circle.fill")
+                    .foregroundColor(.red)
+            }
+        }
+    }
+}
+
+struct NCCapabilitiesView_Previews: PreviewProvider {
+    static var previews: some View {
+        NCCapabilitiesView(capabilitiesStatus: NCCapabilitiesViewOO())
+    }
+}

+ 0 - 690
iOSClient/Diagnostics/NCCapabilitiesViewController.storyboard

@@ -1,690 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="20037" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="vTK-Er-kbZ">
-    <device id="retina6_1" orientation="portrait" appearance="light"/>
-    <dependencies>
-        <deployment identifier="iOS"/>
-        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="20020"/>
-        <capability name="Safe area layout guides" minToolsVersion="9.0"/>
-        <capability name="System colors in document resources" minToolsVersion="11.0"/>
-        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
-    </dependencies>
-    <scenes>
-        <!--Capabilities View Controller-->
-        <scene sceneID="UF0-FW-gHK">
-            <objects>
-                <viewController id="7oH-vf-YqN" customClass="NCCapabilitiesViewController" customModule="Nextcloud" customModuleProvider="target" sceneMemberID="viewController">
-                    <view key="view" contentMode="scaleToFill" id="Aja-Mn-6Wc">
-                        <rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
-                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
-                        <subviews>
-                            <scrollView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="hTE-ys-qsF">
-                                <rect key="frame" x="0.0" y="88" width="414" height="774"/>
-                                <subviews>
-                                    <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Sms-Ez-fLO" userLabel="View Capabilities">
-                                        <rect key="frame" x="5" y="5" width="404" height="600"/>
-                                        <subviews>
-                                            <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="jdW-oZ-cH8" userLabel="FileSharing">
-                                                <rect key="frame" x="0.0" y="0.0" width="404" height="50"/>
-                                                <subviews>
-                                                    <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="share" translatesAutoresizingMaskIntoConstraints="NO" id="G9c-Nd-Ikl">
-                                                        <rect key="frame" x="0.0" y="10" width="30" height="30"/>
-                                                        <constraints>
-                                                            <constraint firstAttribute="width" constant="30" id="2jt-3Q-W9U"/>
-                                                            <constraint firstAttribute="height" constant="30" id="qw0-LB-a0S"/>
-                                                        </constraints>
-                                                    </imageView>
-                                                    <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="File sharing" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Olg-V3-URE">
-                                                        <rect key="frame" x="40" y="16" width="234" height="18"/>
-                                                        <fontDescription key="fontDescription" type="system" pointSize="15"/>
-                                                        <nil key="textColor"/>
-                                                        <nil key="highlightedColor"/>
-                                                    </label>
-                                                    <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Available" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="SbT-rU-lJ8">
-                                                        <rect key="frame" x="279" y="12.5" width="120" height="25"/>
-                                                        <color key="backgroundColor" systemColor="systemGray4Color"/>
-                                                        <constraints>
-                                                            <constraint firstAttribute="height" constant="25" id="Yf6-Er-ibu"/>
-                                                            <constraint firstAttribute="width" constant="120" id="bqY-hB-VuU"/>
-                                                        </constraints>
-                                                        <fontDescription key="fontDescription" type="system" pointSize="12"/>
-                                                        <nil key="textColor"/>
-                                                        <nil key="highlightedColor"/>
-                                                    </label>
-                                                </subviews>
-                                                <color key="backgroundColor" systemColor="systemBackgroundColor"/>
-                                                <constraints>
-                                                    <constraint firstAttribute="height" constant="50" id="486-j7-SKp"/>
-                                                    <constraint firstItem="SbT-rU-lJ8" firstAttribute="centerY" secondItem="jdW-oZ-cH8" secondAttribute="centerY" id="4Ao-MF-e1N"/>
-                                                    <constraint firstItem="G9c-Nd-Ikl" firstAttribute="leading" secondItem="jdW-oZ-cH8" secondAttribute="leading" id="Bnm-Im-c7M"/>
-                                                    <constraint firstItem="G9c-Nd-Ikl" firstAttribute="centerY" secondItem="jdW-oZ-cH8" secondAttribute="centerY" id="Jxk-cZ-ezx"/>
-                                                    <constraint firstItem="Olg-V3-URE" firstAttribute="centerY" secondItem="jdW-oZ-cH8" secondAttribute="centerY" id="RXs-zW-MT4"/>
-                                                    <constraint firstItem="Olg-V3-URE" firstAttribute="leading" secondItem="G9c-Nd-Ikl" secondAttribute="trailing" constant="10" id="XZo-QH-gpr"/>
-                                                    <constraint firstItem="SbT-rU-lJ8" firstAttribute="leading" secondItem="Olg-V3-URE" secondAttribute="trailing" constant="5" id="wW2-QT-gGz"/>
-                                                    <constraint firstAttribute="trailing" secondItem="SbT-rU-lJ8" secondAttribute="trailing" constant="5" id="z63-kb-OIf"/>
-                                                </constraints>
-                                            </view>
-                                            <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="mSC-JU-xuk" userLabel="external Site">
-                                                <rect key="frame" x="0.0" y="50" width="404" height="50"/>
-                                                <subviews>
-                                                    <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="externalsites" translatesAutoresizingMaskIntoConstraints="NO" id="JWO-C0-32L">
-                                                        <rect key="frame" x="0.0" y="10" width="30" height="30"/>
-                                                        <constraints>
-                                                            <constraint firstAttribute="height" constant="30" id="cuQ-hf-WGC"/>
-                                                            <constraint firstAttribute="width" constant="30" id="hun-lk-Hyf"/>
-                                                        </constraints>
-                                                    </imageView>
-                                                    <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="External site" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="g2c-tp-kiW">
-                                                        <rect key="frame" x="40" y="16" width="234" height="18"/>
-                                                        <fontDescription key="fontDescription" type="system" pointSize="15"/>
-                                                        <nil key="textColor"/>
-                                                        <nil key="highlightedColor"/>
-                                                    </label>
-                                                    <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Available" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="ivv-te-kaP">
-                                                        <rect key="frame" x="279" y="12.5" width="120" height="25"/>
-                                                        <color key="backgroundColor" systemColor="systemGray4Color"/>
-                                                        <constraints>
-                                                            <constraint firstAttribute="width" constant="120" id="KRE-Ez-UvG"/>
-                                                            <constraint firstAttribute="height" constant="25" id="xhy-Qg-h6R"/>
-                                                        </constraints>
-                                                        <fontDescription key="fontDescription" type="system" pointSize="12"/>
-                                                        <nil key="textColor"/>
-                                                        <nil key="highlightedColor"/>
-                                                    </label>
-                                                </subviews>
-                                                <color key="backgroundColor" systemColor="systemBackgroundColor"/>
-                                                <constraints>
-                                                    <constraint firstAttribute="trailing" secondItem="ivv-te-kaP" secondAttribute="trailing" constant="5" id="4K1-tJ-Cun"/>
-                                                    <constraint firstItem="JWO-C0-32L" firstAttribute="centerY" secondItem="mSC-JU-xuk" secondAttribute="centerY" id="FLD-bX-ETy"/>
-                                                    <constraint firstItem="ivv-te-kaP" firstAttribute="leading" secondItem="g2c-tp-kiW" secondAttribute="trailing" constant="5" id="VuF-Q1-hEp"/>
-                                                    <constraint firstItem="g2c-tp-kiW" firstAttribute="leading" secondItem="JWO-C0-32L" secondAttribute="trailing" constant="10" id="fWw-rx-nFV"/>
-                                                    <constraint firstAttribute="height" constant="50" id="pLI-AP-DaV"/>
-                                                    <constraint firstItem="JWO-C0-32L" firstAttribute="leading" secondItem="mSC-JU-xuk" secondAttribute="leading" id="pyK-ZG-7fZ"/>
-                                                    <constraint firstItem="g2c-tp-kiW" firstAttribute="centerY" secondItem="mSC-JU-xuk" secondAttribute="centerY" id="rtm-fS-6ec"/>
-                                                    <constraint firstItem="ivv-te-kaP" firstAttribute="centerY" secondItem="mSC-JU-xuk" secondAttribute="centerY" id="wCm-7E-nJ3"/>
-                                                </constraints>
-                                            </view>
-                                            <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="nVq-4i-FNy" userLabel="end to end encryption">
-                                                <rect key="frame" x="0.0" y="100" width="404" height="50"/>
-                                                <subviews>
-                                                    <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="lock" translatesAutoresizingMaskIntoConstraints="NO" id="S7m-5Z-ktw">
-                                                        <rect key="frame" x="0.0" y="10" width="30" height="30"/>
-                                                        <constraints>
-                                                            <constraint firstAttribute="height" constant="30" id="edD-t9-G1B"/>
-                                                            <constraint firstAttribute="width" constant="30" id="nPu-CX-Ilf"/>
-                                                        </constraints>
-                                                    </imageView>
-                                                    <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="End-to-End Encryption" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="5cZ-yL-XdC">
-                                                        <rect key="frame" x="40" y="16" width="234" height="18"/>
-                                                        <fontDescription key="fontDescription" type="system" pointSize="15"/>
-                                                        <nil key="textColor"/>
-                                                        <nil key="highlightedColor"/>
-                                                    </label>
-                                                    <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Available" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="M82-8U-M4Q">
-                                                        <rect key="frame" x="279" y="12.5" width="120" height="25"/>
-                                                        <color key="backgroundColor" systemColor="systemGray4Color"/>
-                                                        <constraints>
-                                                            <constraint firstAttribute="height" constant="25" id="L0G-30-siH"/>
-                                                            <constraint firstAttribute="width" constant="120" id="z0Z-Hz-edq"/>
-                                                        </constraints>
-                                                        <fontDescription key="fontDescription" type="system" pointSize="12"/>
-                                                        <nil key="textColor"/>
-                                                        <nil key="highlightedColor"/>
-                                                    </label>
-                                                </subviews>
-                                                <color key="backgroundColor" systemColor="systemBackgroundColor"/>
-                                                <constraints>
-                                                    <constraint firstItem="5cZ-yL-XdC" firstAttribute="leading" secondItem="S7m-5Z-ktw" secondAttribute="trailing" constant="10" id="HOl-vJ-SDL"/>
-                                                    <constraint firstAttribute="height" constant="50" id="X1d-TH-FfQ"/>
-                                                    <constraint firstItem="S7m-5Z-ktw" firstAttribute="centerY" secondItem="nVq-4i-FNy" secondAttribute="centerY" id="cUj-Mb-Gza"/>
-                                                    <constraint firstItem="5cZ-yL-XdC" firstAttribute="centerY" secondItem="nVq-4i-FNy" secondAttribute="centerY" id="fKw-6d-s4Z"/>
-                                                    <constraint firstItem="M82-8U-M4Q" firstAttribute="centerY" secondItem="nVq-4i-FNy" secondAttribute="centerY" id="nnA-zZ-9te"/>
-                                                    <constraint firstItem="S7m-5Z-ktw" firstAttribute="leading" secondItem="nVq-4i-FNy" secondAttribute="leading" id="sX7-dg-Goj"/>
-                                                    <constraint firstItem="M82-8U-M4Q" firstAttribute="leading" secondItem="5cZ-yL-XdC" secondAttribute="trailing" constant="5" id="vjo-Od-7Gr"/>
-                                                    <constraint firstAttribute="trailing" secondItem="M82-8U-M4Q" secondAttribute="trailing" constant="5" id="zg8-Za-Rla"/>
-                                                </constraints>
-                                            </view>
-                                            <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="lGp-bh-Ysz" userLabel="Activity">
-                                                <rect key="frame" x="0.0" y="150" width="404" height="50"/>
-                                                <subviews>
-                                                    <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="activity" translatesAutoresizingMaskIntoConstraints="NO" id="tl5-S1-p9X">
-                                                        <rect key="frame" x="0.0" y="10" width="30" height="30"/>
-                                                        <constraints>
-                                                            <constraint firstAttribute="height" constant="30" id="Hb3-9B-Zsk"/>
-                                                            <constraint firstAttribute="width" constant="30" id="Zmw-Ck-dGs"/>
-                                                        </constraints>
-                                                    </imageView>
-                                                    <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Activity" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="SIY-IW-w6O">
-                                                        <rect key="frame" x="40" y="16" width="51" height="18"/>
-                                                        <fontDescription key="fontDescription" type="system" pointSize="15"/>
-                                                        <nil key="textColor"/>
-                                                        <nil key="highlightedColor"/>
-                                                    </label>
-                                                    <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Available" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="dyb-1O-dIA">
-                                                        <rect key="frame" x="279" y="12.5" width="120" height="25"/>
-                                                        <color key="backgroundColor" systemColor="systemGray4Color"/>
-                                                        <constraints>
-                                                            <constraint firstAttribute="height" constant="25" id="C3a-Ec-xJv"/>
-                                                            <constraint firstAttribute="width" constant="120" id="IB5-Hq-R4j"/>
-                                                        </constraints>
-                                                        <fontDescription key="fontDescription" type="system" pointSize="12"/>
-                                                        <nil key="textColor"/>
-                                                        <nil key="highlightedColor"/>
-                                                    </label>
-                                                </subviews>
-                                                <color key="backgroundColor" systemColor="systemBackgroundColor"/>
-                                                <constraints>
-                                                    <constraint firstAttribute="trailing" secondItem="dyb-1O-dIA" secondAttribute="trailing" constant="5" id="0fh-7J-NUN"/>
-                                                    <constraint firstAttribute="height" constant="50" id="OMI-4q-89Q"/>
-                                                    <constraint firstItem="dyb-1O-dIA" firstAttribute="centerY" secondItem="lGp-bh-Ysz" secondAttribute="centerY" id="OPb-RB-lic"/>
-                                                    <constraint firstItem="SIY-IW-w6O" firstAttribute="leading" secondItem="tl5-S1-p9X" secondAttribute="trailing" constant="10" id="Q9g-cC-zme"/>
-                                                    <constraint firstItem="tl5-S1-p9X" firstAttribute="leading" secondItem="lGp-bh-Ysz" secondAttribute="leading" id="cFK-we-PT6"/>
-                                                    <constraint firstItem="tl5-S1-p9X" firstAttribute="centerY" secondItem="lGp-bh-Ysz" secondAttribute="centerY" id="fyW-bz-dN0"/>
-                                                    <constraint firstItem="SIY-IW-w6O" firstAttribute="centerY" secondItem="lGp-bh-Ysz" secondAttribute="centerY" id="xCh-5R-1WK"/>
-                                                </constraints>
-                                            </view>
-                                            <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="UPC-L1-VKj" userLabel="Notification">
-                                                <rect key="frame" x="0.0" y="200" width="404" height="50"/>
-                                                <subviews>
-                                                    <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="notification" translatesAutoresizingMaskIntoConstraints="NO" id="cgb-3g-trc">
-                                                        <rect key="frame" x="0.0" y="10" width="30" height="30"/>
-                                                        <constraints>
-                                                            <constraint firstAttribute="height" constant="30" id="3RZ-6t-QNW"/>
-                                                            <constraint firstAttribute="width" constant="30" id="Rpr-ox-Bhc"/>
-                                                        </constraints>
-                                                    </imageView>
-                                                    <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Notification" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="W6x-fO-A6L">
-                                                        <rect key="frame" x="40" y="16" width="79" height="18"/>
-                                                        <fontDescription key="fontDescription" type="system" pointSize="15"/>
-                                                        <nil key="textColor"/>
-                                                        <nil key="highlightedColor"/>
-                                                    </label>
-                                                    <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Available" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="WAg-Hw-sQS">
-                                                        <rect key="frame" x="279" y="12.5" width="120" height="25"/>
-                                                        <color key="backgroundColor" systemColor="systemGray4Color"/>
-                                                        <constraints>
-                                                            <constraint firstAttribute="height" constant="25" id="NEz-tu-8Rk"/>
-                                                            <constraint firstAttribute="width" constant="120" id="zjs-JE-2aB"/>
-                                                        </constraints>
-                                                        <fontDescription key="fontDescription" type="system" pointSize="12"/>
-                                                        <nil key="textColor"/>
-                                                        <nil key="highlightedColor"/>
-                                                    </label>
-                                                </subviews>
-                                                <color key="backgroundColor" systemColor="systemBackgroundColor"/>
-                                                <constraints>
-                                                    <constraint firstItem="cgb-3g-trc" firstAttribute="centerY" secondItem="UPC-L1-VKj" secondAttribute="centerY" id="28g-Vd-Pdh"/>
-                                                    <constraint firstItem="W6x-fO-A6L" firstAttribute="centerY" secondItem="UPC-L1-VKj" secondAttribute="centerY" id="Ah1-f7-KrB"/>
-                                                    <constraint firstAttribute="trailing" secondItem="WAg-Hw-sQS" secondAttribute="trailing" constant="5" id="BpJ-RQ-B1k"/>
-                                                    <constraint firstItem="WAg-Hw-sQS" firstAttribute="centerY" secondItem="UPC-L1-VKj" secondAttribute="centerY" id="OGo-Ns-IU0"/>
-                                                    <constraint firstAttribute="height" constant="50" id="VOs-so-anE"/>
-                                                    <constraint firstItem="cgb-3g-trc" firstAttribute="leading" secondItem="UPC-L1-VKj" secondAttribute="leading" id="e2z-tZ-5bX"/>
-                                                    <constraint firstItem="W6x-fO-A6L" firstAttribute="leading" secondItem="cgb-3g-trc" secondAttribute="trailing" constant="10" id="zGE-fg-e3h"/>
-                                                </constraints>
-                                            </view>
-                                            <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="8nf-zJ-Qas" userLabel="Notification">
-                                                <rect key="frame" x="0.0" y="250" width="404" height="50"/>
-                                                <subviews>
-                                                    <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="delete" translatesAutoresizingMaskIntoConstraints="NO" id="8Zc-9W-n27">
-                                                        <rect key="frame" x="0.0" y="10" width="30" height="30"/>
-                                                        <constraints>
-                                                            <constraint firstAttribute="width" constant="30" id="GE1-Yd-rOr"/>
-                                                            <constraint firstAttribute="height" constant="30" id="aQW-Uy-znK"/>
-                                                        </constraints>
-                                                    </imageView>
-                                                    <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Deleted files" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="EVN-t6-jzB">
-                                                        <rect key="frame" x="40" y="16" width="85.5" height="18"/>
-                                                        <fontDescription key="fontDescription" type="system" pointSize="15"/>
-                                                        <nil key="textColor"/>
-                                                        <nil key="highlightedColor"/>
-                                                    </label>
-                                                    <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Available" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="8hg-qK-qvz">
-                                                        <rect key="frame" x="279" y="12.5" width="120" height="25"/>
-                                                        <color key="backgroundColor" systemColor="systemGray4Color"/>
-                                                        <constraints>
-                                                            <constraint firstAttribute="width" constant="120" id="Ns2-PG-H7R"/>
-                                                            <constraint firstAttribute="height" constant="25" id="b2x-qE-hf6"/>
-                                                        </constraints>
-                                                        <fontDescription key="fontDescription" type="system" pointSize="12"/>
-                                                        <nil key="textColor"/>
-                                                        <nil key="highlightedColor"/>
-                                                    </label>
-                                                </subviews>
-                                                <color key="backgroundColor" systemColor="systemBackgroundColor"/>
-                                                <constraints>
-                                                    <constraint firstItem="8Zc-9W-n27" firstAttribute="leading" secondItem="8nf-zJ-Qas" secondAttribute="leading" id="0gl-yZ-NHn"/>
-                                                    <constraint firstItem="EVN-t6-jzB" firstAttribute="centerY" secondItem="8nf-zJ-Qas" secondAttribute="centerY" id="5dv-S0-9bY"/>
-                                                    <constraint firstItem="8Zc-9W-n27" firstAttribute="centerY" secondItem="8nf-zJ-Qas" secondAttribute="centerY" id="9H1-hH-E2o"/>
-                                                    <constraint firstAttribute="height" constant="50" id="NJt-Ob-qAJ"/>
-                                                    <constraint firstAttribute="trailing" secondItem="8hg-qK-qvz" secondAttribute="trailing" constant="5" id="VS2-55-BeI"/>
-                                                    <constraint firstItem="8hg-qK-qvz" firstAttribute="centerY" secondItem="8nf-zJ-Qas" secondAttribute="centerY" id="ceB-3o-Qpt"/>
-                                                    <constraint firstItem="EVN-t6-jzB" firstAttribute="leading" secondItem="8Zc-9W-n27" secondAttribute="trailing" constant="10" id="rDk-Z6-y2x"/>
-                                                </constraints>
-                                            </view>
-                                            <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="ZNB-jF-9zg" userLabel="direct editing">
-                                                <rect key="frame" x="0.0" y="300" width="404" height="50"/>
-                                                <subviews>
-                                                    <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="text" translatesAutoresizingMaskIntoConstraints="NO" id="iCB-2A-phO">
-                                                        <rect key="frame" x="0.0" y="10" width="30" height="30"/>
-                                                        <constraints>
-                                                            <constraint firstAttribute="width" constant="30" id="Ww6-2V-i4r"/>
-                                                            <constraint firstAttribute="height" constant="30" id="kdP-OK-U2a"/>
-                                                        </constraints>
-                                                    </imageView>
-                                                    <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Text" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="FOv-Ld-QFB">
-                                                        <rect key="frame" x="40" y="16" width="29" height="18"/>
-                                                        <fontDescription key="fontDescription" type="system" pointSize="15"/>
-                                                        <nil key="textColor"/>
-                                                        <nil key="highlightedColor"/>
-                                                    </label>
-                                                    <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Available" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="uiz-H8-p3D">
-                                                        <rect key="frame" x="279" y="12.5" width="120" height="25"/>
-                                                        <color key="backgroundColor" systemColor="systemGray4Color"/>
-                                                        <constraints>
-                                                            <constraint firstAttribute="height" constant="25" id="Eqf-R1-eKB"/>
-                                                            <constraint firstAttribute="width" constant="120" id="i0a-tu-JgU"/>
-                                                        </constraints>
-                                                        <fontDescription key="fontDescription" type="system" pointSize="12"/>
-                                                        <nil key="textColor"/>
-                                                        <nil key="highlightedColor"/>
-                                                    </label>
-                                                </subviews>
-                                                <color key="backgroundColor" systemColor="systemBackgroundColor"/>
-                                                <constraints>
-                                                    <constraint firstItem="uiz-H8-p3D" firstAttribute="centerY" secondItem="ZNB-jF-9zg" secondAttribute="centerY" id="0dR-3w-1sQ"/>
-                                                    <constraint firstAttribute="height" constant="50" id="4UX-0n-U4U"/>
-                                                    <constraint firstAttribute="trailing" secondItem="uiz-H8-p3D" secondAttribute="trailing" constant="5" id="Rma-z3-oCf"/>
-                                                    <constraint firstItem="iCB-2A-phO" firstAttribute="leading" secondItem="ZNB-jF-9zg" secondAttribute="leading" id="cF1-co-eQB"/>
-                                                    <constraint firstItem="iCB-2A-phO" firstAttribute="centerY" secondItem="ZNB-jF-9zg" secondAttribute="centerY" id="gSQ-hN-iBx"/>
-                                                    <constraint firstItem="FOv-Ld-QFB" firstAttribute="leading" secondItem="iCB-2A-phO" secondAttribute="trailing" constant="10" id="kiE-oZ-ky6"/>
-                                                    <constraint firstItem="FOv-Ld-QFB" firstAttribute="centerY" secondItem="ZNB-jF-9zg" secondAttribute="centerY" id="vHG-Fk-kEj"/>
-                                                </constraints>
-                                            </view>
-                                            <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="dhs-06-3RT" userLabel="Collabora">
-                                                <rect key="frame" x="0.0" y="350" width="404" height="50"/>
-                                                <subviews>
-                                                    <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="collabora" translatesAutoresizingMaskIntoConstraints="NO" id="GXZ-Rj-WCE">
-                                                        <rect key="frame" x="0.0" y="10" width="30" height="30"/>
-                                                        <constraints>
-                                                            <constraint firstAttribute="height" constant="30" id="kcH-Br-yZB"/>
-                                                            <constraint firstAttribute="width" constant="30" id="ros-hl-Jec"/>
-                                                        </constraints>
-                                                    </imageView>
-                                                    <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Collabora" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="IJ7-i8-AvX">
-                                                        <rect key="frame" x="40" y="16" width="65.5" height="18"/>
-                                                        <fontDescription key="fontDescription" type="system" pointSize="15"/>
-                                                        <nil key="textColor"/>
-                                                        <nil key="highlightedColor"/>
-                                                    </label>
-                                                    <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Available" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="30w-oC-gZl">
-                                                        <rect key="frame" x="279" y="12.5" width="120" height="25"/>
-                                                        <color key="backgroundColor" systemColor="systemGray4Color"/>
-                                                        <constraints>
-                                                            <constraint firstAttribute="height" constant="25" id="E6x-vP-Fs9"/>
-                                                            <constraint firstAttribute="width" constant="120" id="nGc-gZ-jaG"/>
-                                                        </constraints>
-                                                        <fontDescription key="fontDescription" type="system" pointSize="12"/>
-                                                        <nil key="textColor"/>
-                                                        <nil key="highlightedColor"/>
-                                                    </label>
-                                                </subviews>
-                                                <color key="backgroundColor" systemColor="systemBackgroundColor"/>
-                                                <constraints>
-                                                    <constraint firstItem="30w-oC-gZl" firstAttribute="centerY" secondItem="dhs-06-3RT" secondAttribute="centerY" id="0G9-Hl-zZn"/>
-                                                    <constraint firstItem="IJ7-i8-AvX" firstAttribute="centerY" secondItem="dhs-06-3RT" secondAttribute="centerY" id="8Rv-kP-XDs"/>
-                                                    <constraint firstItem="GXZ-Rj-WCE" firstAttribute="centerY" secondItem="dhs-06-3RT" secondAttribute="centerY" id="DiJ-1E-bIC"/>
-                                                    <constraint firstItem="IJ7-i8-AvX" firstAttribute="leading" secondItem="GXZ-Rj-WCE" secondAttribute="trailing" constant="10" id="M7l-uB-RhH"/>
-                                                    <constraint firstAttribute="trailing" secondItem="30w-oC-gZl" secondAttribute="trailing" constant="5" id="XrQ-4B-UnP"/>
-                                                    <constraint firstItem="GXZ-Rj-WCE" firstAttribute="leading" secondItem="dhs-06-3RT" secondAttribute="leading" id="lCd-tJ-nvi"/>
-                                                    <constraint firstAttribute="height" constant="50" id="xgw-IO-enA"/>
-                                                </constraints>
-                                            </view>
-                                            <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="LTt-2C-rPb" userLabel="OnlyOffice">
-                                                <rect key="frame" x="0.0" y="400" width="404" height="50"/>
-                                                <subviews>
-                                                    <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="onlyoffice" translatesAutoresizingMaskIntoConstraints="NO" id="xvv-h0-9bM">
-                                                        <rect key="frame" x="0.0" y="10" width="30" height="30"/>
-                                                        <constraints>
-                                                            <constraint firstAttribute="width" constant="30" id="bUx-KW-ZGu"/>
-                                                            <constraint firstAttribute="height" constant="30" id="wKp-TM-dCw"/>
-                                                        </constraints>
-                                                    </imageView>
-                                                    <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="ONLYOFFICE" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Tq3-cS-wup">
-                                                        <rect key="frame" x="40" y="16" width="89.5" height="18"/>
-                                                        <fontDescription key="fontDescription" type="system" pointSize="15"/>
-                                                        <nil key="textColor"/>
-                                                        <nil key="highlightedColor"/>
-                                                    </label>
-                                                    <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Available" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="ucV-YG-5ht">
-                                                        <rect key="frame" x="279" y="12.5" width="120" height="25"/>
-                                                        <color key="backgroundColor" systemColor="systemGray4Color"/>
-                                                        <constraints>
-                                                            <constraint firstAttribute="height" constant="25" id="8Xe-4g-RxY"/>
-                                                            <constraint firstAttribute="width" constant="120" id="m3G-CE-aso"/>
-                                                        </constraints>
-                                                        <fontDescription key="fontDescription" type="system" pointSize="12"/>
-                                                        <nil key="textColor"/>
-                                                        <nil key="highlightedColor"/>
-                                                    </label>
-                                                </subviews>
-                                                <color key="backgroundColor" systemColor="systemBackgroundColor"/>
-                                                <constraints>
-                                                    <constraint firstItem="Tq3-cS-wup" firstAttribute="leading" secondItem="xvv-h0-9bM" secondAttribute="trailing" constant="10" id="G34-W8-fhW"/>
-                                                    <constraint firstAttribute="height" constant="50" id="Glo-gX-j6q"/>
-                                                    <constraint firstItem="xvv-h0-9bM" firstAttribute="centerY" secondItem="LTt-2C-rPb" secondAttribute="centerY" id="mYd-TV-lVh"/>
-                                                    <constraint firstItem="ucV-YG-5ht" firstAttribute="centerY" secondItem="LTt-2C-rPb" secondAttribute="centerY" id="qmu-3J-9Xj"/>
-                                                    <constraint firstAttribute="trailing" secondItem="ucV-YG-5ht" secondAttribute="trailing" constant="5" id="tva-Qw-rYM"/>
-                                                    <constraint firstItem="xvv-h0-9bM" firstAttribute="leading" secondItem="LTt-2C-rPb" secondAttribute="leading" id="vkH-IQ-IUb"/>
-                                                    <constraint firstItem="Tq3-cS-wup" firstAttribute="centerY" secondItem="LTt-2C-rPb" secondAttribute="centerY" id="xlI-tP-AMe"/>
-                                                </constraints>
-                                            </view>
-                                            <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="2Pp-Kb-YMc" userLabel="User Status">
-                                                <rect key="frame" x="0.0" y="450" width="404" height="50"/>
-                                                <subviews>
-                                                    <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="userStatusAway" translatesAutoresizingMaskIntoConstraints="NO" id="Nxp-H1-Pob">
-                                                        <rect key="frame" x="0.0" y="10" width="30" height="30"/>
-                                                        <constraints>
-                                                            <constraint firstAttribute="height" constant="30" id="qzU-OP-bvd"/>
-                                                            <constraint firstAttribute="width" constant="30" id="t5O-mN-Xyd"/>
-                                                        </constraints>
-                                                    </imageView>
-                                                    <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="User Status" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="LID-IE-L9Z">
-                                                        <rect key="frame" x="40" y="16" width="80.5" height="18"/>
-                                                        <fontDescription key="fontDescription" type="system" pointSize="15"/>
-                                                        <nil key="textColor"/>
-                                                        <nil key="highlightedColor"/>
-                                                    </label>
-                                                    <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Available" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="5Sj-5h-jgb">
-                                                        <rect key="frame" x="279" y="12.5" width="120" height="25"/>
-                                                        <color key="backgroundColor" systemColor="systemGray4Color"/>
-                                                        <constraints>
-                                                            <constraint firstAttribute="width" constant="120" id="IJ3-gv-UjC"/>
-                                                            <constraint firstAttribute="height" constant="25" id="wiA-JQ-GDr"/>
-                                                        </constraints>
-                                                        <fontDescription key="fontDescription" type="system" pointSize="12"/>
-                                                        <nil key="textColor"/>
-                                                        <nil key="highlightedColor"/>
-                                                    </label>
-                                                </subviews>
-                                                <color key="backgroundColor" systemColor="systemBackgroundColor"/>
-                                                <constraints>
-                                                    <constraint firstItem="LID-IE-L9Z" firstAttribute="leading" secondItem="Nxp-H1-Pob" secondAttribute="trailing" constant="10" id="4Pl-0O-5J4"/>
-                                                    <constraint firstItem="Nxp-H1-Pob" firstAttribute="leading" secondItem="2Pp-Kb-YMc" secondAttribute="leading" id="9yK-6i-taC"/>
-                                                    <constraint firstAttribute="height" constant="50" id="UUO-ej-PcK"/>
-                                                    <constraint firstAttribute="trailing" secondItem="5Sj-5h-jgb" secondAttribute="trailing" constant="5" id="iu9-2g-hKA"/>
-                                                    <constraint firstItem="LID-IE-L9Z" firstAttribute="centerY" secondItem="2Pp-Kb-YMc" secondAttribute="centerY" id="lFh-r6-Yvh"/>
-                                                    <constraint firstItem="Nxp-H1-Pob" firstAttribute="centerY" secondItem="2Pp-Kb-YMc" secondAttribute="centerY" id="ocY-iN-t73"/>
-                                                    <constraint firstItem="5Sj-5h-jgb" firstAttribute="centerY" secondItem="2Pp-Kb-YMc" secondAttribute="centerY" id="peY-Iv-kLA"/>
-                                                </constraints>
-                                            </view>
-                                            <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="S24-Wc-fps" userLabel="Comments">
-                                                <rect key="frame" x="0.0" y="498" width="404" height="50"/>
-                                                <subviews>
-                                                    <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="comments" translatesAutoresizingMaskIntoConstraints="NO" id="cYf-px-izj">
-                                                        <rect key="frame" x="0.0" y="10" width="30" height="30"/>
-                                                        <constraints>
-                                                            <constraint firstAttribute="width" constant="30" id="gdA-CQ-Wu0"/>
-                                                            <constraint firstAttribute="height" constant="30" id="xGI-Zv-SQC"/>
-                                                        </constraints>
-                                                    </imageView>
-                                                    <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Comments" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="AEw-vE-bsf">
-                                                        <rect key="frame" x="40" y="16" width="74.5" height="18"/>
-                                                        <fontDescription key="fontDescription" type="system" pointSize="15"/>
-                                                        <nil key="textColor"/>
-                                                        <nil key="highlightedColor"/>
-                                                    </label>
-                                                    <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Available" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="lVT-MG-7kN">
-                                                        <rect key="frame" x="279" y="12.5" width="120" height="25"/>
-                                                        <color key="backgroundColor" systemColor="systemGray4Color"/>
-                                                        <constraints>
-                                                            <constraint firstAttribute="width" constant="120" id="TPY-VV-LmQ"/>
-                                                            <constraint firstAttribute="height" constant="25" id="WwT-hU-yOT"/>
-                                                        </constraints>
-                                                        <fontDescription key="fontDescription" type="system" pointSize="12"/>
-                                                        <nil key="textColor"/>
-                                                        <nil key="highlightedColor"/>
-                                                    </label>
-                                                </subviews>
-                                                <color key="backgroundColor" systemColor="systemBackgroundColor"/>
-                                                <constraints>
-                                                    <constraint firstAttribute="height" constant="50" id="3iW-tC-sQm"/>
-                                                    <constraint firstItem="AEw-vE-bsf" firstAttribute="leading" secondItem="cYf-px-izj" secondAttribute="trailing" constant="10" id="6bS-1j-tEi"/>
-                                                    <constraint firstItem="lVT-MG-7kN" firstAttribute="centerY" secondItem="S24-Wc-fps" secondAttribute="centerY" id="6zR-QZ-UEn"/>
-                                                    <constraint firstItem="cYf-px-izj" firstAttribute="leading" secondItem="S24-Wc-fps" secondAttribute="leading" id="Ahj-Nc-bRa"/>
-                                                    <constraint firstItem="cYf-px-izj" firstAttribute="centerY" secondItem="S24-Wc-fps" secondAttribute="centerY" id="BO8-tt-rX5"/>
-                                                    <constraint firstItem="AEw-vE-bsf" firstAttribute="centerY" secondItem="S24-Wc-fps" secondAttribute="centerY" id="ete-pJ-l2X"/>
-                                                    <constraint firstAttribute="trailing" secondItem="lVT-MG-7kN" secondAttribute="trailing" constant="5" id="zCZ-du-XT5"/>
-                                                </constraints>
-                                            </view>
-                                            <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="npG-0C-m3A" userLabel="Lock">
-                                                <rect key="frame" x="0.0" y="550" width="404" height="50"/>
-                                                <subviews>
-                                                    <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="lock" translatesAutoresizingMaskIntoConstraints="NO" id="eAC-Li-gKO">
-                                                        <rect key="frame" x="0.0" y="10" width="30" height="30"/>
-                                                        <constraints>
-                                                            <constraint firstAttribute="height" constant="30" id="JsP-Q6-6yG"/>
-                                                            <constraint firstAttribute="width" constant="30" id="WUk-lh-3Vb"/>
-                                                        </constraints>
-                                                    </imageView>
-                                                    <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Lock file" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="SCj-6t-sXN">
-                                                        <rect key="frame" x="40" y="16" width="57.5" height="18"/>
-                                                        <fontDescription key="fontDescription" type="system" pointSize="15"/>
-                                                        <nil key="textColor"/>
-                                                        <nil key="highlightedColor"/>
-                                                    </label>
-                                                    <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Available" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="db5-st-O6M">
-                                                        <rect key="frame" x="279" y="12.5" width="120" height="25"/>
-                                                        <color key="backgroundColor" systemColor="systemGray4Color"/>
-                                                        <constraints>
-                                                            <constraint firstAttribute="width" constant="120" id="Vfm-Rm-l7N"/>
-                                                            <constraint firstAttribute="height" constant="25" id="oam-XV-KqH"/>
-                                                        </constraints>
-                                                        <fontDescription key="fontDescription" type="system" pointSize="12"/>
-                                                        <nil key="textColor"/>
-                                                        <nil key="highlightedColor"/>
-                                                    </label>
-                                                </subviews>
-                                                <color key="backgroundColor" systemColor="systemBackgroundColor"/>
-                                                <constraints>
-                                                    <constraint firstItem="db5-st-O6M" firstAttribute="centerY" secondItem="npG-0C-m3A" secondAttribute="centerY" id="0X7-Jw-OjP"/>
-                                                    <constraint firstItem="eAC-Li-gKO" firstAttribute="leading" secondItem="npG-0C-m3A" secondAttribute="leading" id="1yz-QU-lXY"/>
-                                                    <constraint firstAttribute="height" constant="50" id="6GQ-cE-Nz3"/>
-                                                    <constraint firstItem="SCj-6t-sXN" firstAttribute="centerY" secondItem="npG-0C-m3A" secondAttribute="centerY" id="Ocs-LT-OYb"/>
-                                                    <constraint firstItem="eAC-Li-gKO" firstAttribute="centerY" secondItem="npG-0C-m3A" secondAttribute="centerY" id="SlK-BL-Nba"/>
-                                                    <constraint firstAttribute="trailing" secondItem="db5-st-O6M" secondAttribute="trailing" constant="5" id="Upi-tI-m1R"/>
-                                                    <constraint firstItem="SCj-6t-sXN" firstAttribute="leading" secondItem="eAC-Li-gKO" secondAttribute="trailing" constant="10" id="dgu-xW-E8T"/>
-                                                </constraints>
-                                            </view>
-                                        </subviews>
-                                        <color key="backgroundColor" systemColor="systemBackgroundColor"/>
-                                        <constraints>
-                                            <constraint firstItem="lGp-bh-Ysz" firstAttribute="leading" secondItem="Sms-Ez-fLO" secondAttribute="leading" id="0qE-PV-O2f"/>
-                                            <constraint firstAttribute="trailing" secondItem="8nf-zJ-Qas" secondAttribute="trailing" id="0vv-HQ-Qqx"/>
-                                            <constraint firstAttribute="height" constant="600" id="6nU-Cb-MzH"/>
-                                            <constraint firstItem="mSC-JU-xuk" firstAttribute="leading" secondItem="Sms-Ez-fLO" secondAttribute="leading" id="9Nq-du-3ah"/>
-                                            <constraint firstItem="S24-Wc-fps" firstAttribute="leading" secondItem="Sms-Ez-fLO" secondAttribute="leading" id="Aad-cm-E1T"/>
-                                            <constraint firstAttribute="trailing" secondItem="S24-Wc-fps" secondAttribute="trailing" id="Ajf-er-GBr"/>
-                                            <constraint firstItem="ZNB-jF-9zg" firstAttribute="leading" secondItem="Sms-Ez-fLO" secondAttribute="leading" id="GdE-lt-vZC"/>
-                                            <constraint firstAttribute="trailing" secondItem="nVq-4i-FNy" secondAttribute="trailing" id="HSG-Ia-fYc"/>
-                                            <constraint firstItem="npG-0C-m3A" firstAttribute="top" secondItem="S24-Wc-fps" secondAttribute="bottom" constant="2" id="IQe-Xv-U7D"/>
-                                            <constraint firstItem="S24-Wc-fps" firstAttribute="top" secondItem="2Pp-Kb-YMc" secondAttribute="bottom" constant="-2" id="ML8-GT-9hb"/>
-                                            <constraint firstAttribute="trailing" secondItem="2Pp-Kb-YMc" secondAttribute="trailing" id="NG8-Nu-ic6"/>
-                                            <constraint firstItem="LTt-2C-rPb" firstAttribute="top" secondItem="dhs-06-3RT" secondAttribute="bottom" id="Nm6-NH-AC9"/>
-                                            <constraint firstItem="npG-0C-m3A" firstAttribute="leading" secondItem="Sms-Ez-fLO" secondAttribute="leading" id="QH1-s3-UQ7"/>
-                                            <constraint firstItem="UPC-L1-VKj" firstAttribute="leading" secondItem="Sms-Ez-fLO" secondAttribute="leading" id="QcN-sd-pHM"/>
-                                            <constraint firstItem="LTt-2C-rPb" firstAttribute="leading" secondItem="Sms-Ez-fLO" secondAttribute="leading" id="SUy-Mo-oAO"/>
-                                            <constraint firstItem="jdW-oZ-cH8" firstAttribute="top" secondItem="Sms-Ez-fLO" secondAttribute="top" id="UBW-Mx-NTs"/>
-                                            <constraint firstItem="8nf-zJ-Qas" firstAttribute="top" secondItem="UPC-L1-VKj" secondAttribute="bottom" id="UqS-Lx-6mL"/>
-                                            <constraint firstItem="dhs-06-3RT" firstAttribute="leading" secondItem="Sms-Ez-fLO" secondAttribute="leading" id="UwG-6b-pEk"/>
-                                            <constraint firstItem="nVq-4i-FNy" firstAttribute="top" secondItem="mSC-JU-xuk" secondAttribute="bottom" id="VfU-sj-S9y"/>
-                                            <constraint firstAttribute="trailing" secondItem="npG-0C-m3A" secondAttribute="trailing" id="bLv-wr-d5v"/>
-                                            <constraint firstAttribute="trailing" secondItem="lGp-bh-Ysz" secondAttribute="trailing" id="bUd-8w-D8k"/>
-                                            <constraint firstItem="UPC-L1-VKj" firstAttribute="top" secondItem="lGp-bh-Ysz" secondAttribute="bottom" id="br5-nz-w7h"/>
-                                            <constraint firstItem="8nf-zJ-Qas" firstAttribute="leading" secondItem="Sms-Ez-fLO" secondAttribute="leading" id="dsm-XA-dZD"/>
-                                            <constraint firstItem="jdW-oZ-cH8" firstAttribute="leading" secondItem="Sms-Ez-fLO" secondAttribute="leading" id="eNi-cO-UFd"/>
-                                            <constraint firstItem="nVq-4i-FNy" firstAttribute="leading" secondItem="Sms-Ez-fLO" secondAttribute="leading" id="efi-mm-hvP"/>
-                                            <constraint firstAttribute="trailing" secondItem="LTt-2C-rPb" secondAttribute="trailing" id="erZ-V1-p76"/>
-                                            <constraint firstAttribute="trailing" secondItem="UPC-L1-VKj" secondAttribute="trailing" id="f2Y-D9-fMV"/>
-                                            <constraint firstItem="2Pp-Kb-YMc" firstAttribute="leading" secondItem="Sms-Ez-fLO" secondAttribute="leading" id="fQm-C9-02f"/>
-                                            <constraint firstAttribute="trailing" secondItem="dhs-06-3RT" secondAttribute="trailing" id="ijj-gU-Gdk"/>
-                                            <constraint firstItem="2Pp-Kb-YMc" firstAttribute="top" secondItem="LTt-2C-rPb" secondAttribute="bottom" id="jbS-we-vDH"/>
-                                            <constraint firstAttribute="trailing" secondItem="jdW-oZ-cH8" secondAttribute="trailing" id="k81-ap-Nwy"/>
-                                            <constraint firstItem="lGp-bh-Ysz" firstAttribute="top" secondItem="nVq-4i-FNy" secondAttribute="bottom" id="l7m-bA-t7c"/>
-                                            <constraint firstItem="dhs-06-3RT" firstAttribute="top" secondItem="ZNB-jF-9zg" secondAttribute="bottom" id="mJv-Ta-ZbY"/>
-                                            <constraint firstAttribute="trailing" secondItem="mSC-JU-xuk" secondAttribute="trailing" id="pBU-xQ-0qV"/>
-                                            <constraint firstAttribute="trailing" secondItem="ZNB-jF-9zg" secondAttribute="trailing" id="v5H-SV-MvM"/>
-                                            <constraint firstItem="ZNB-jF-9zg" firstAttribute="top" secondItem="8nf-zJ-Qas" secondAttribute="bottom" id="w6t-hz-cPZ"/>
-                                            <constraint firstItem="mSC-JU-xuk" firstAttribute="top" secondItem="jdW-oZ-cH8" secondAttribute="bottom" id="y2u-2j-cif"/>
-                                        </constraints>
-                                    </view>
-                                    <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="ogC-ph-Xdr" userLabel="View Link">
-                                        <rect key="frame" x="5" y="620" width="404" height="40"/>
-                                        <subviews>
-                                            <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Home server" textAlignment="natural" lineBreakMode="characterWrap" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="PD5-8h-ZLm">
-                                                <rect key="frame" x="40" y="0.0" width="359" height="40"/>
-                                                <constraints>
-                                                    <constraint firstAttribute="height" constant="40" id="hBZ-cQ-ZHg"/>
-                                                </constraints>
-                                                <fontDescription key="fontDescription" type="system" pointSize="15"/>
-                                                <nil key="textColor"/>
-                                                <nil key="highlightedColor"/>
-                                            </label>
-                                            <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="home" translatesAutoresizingMaskIntoConstraints="NO" id="pyf-iS-YYP">
-                                                <rect key="frame" x="0.0" y="5" width="30" height="30"/>
-                                                <constraints>
-                                                    <constraint firstAttribute="height" constant="30" id="LkI-Fd-YBH"/>
-                                                    <constraint firstAttribute="width" constant="30" id="SVh-sE-fdn"/>
-                                                </constraints>
-                                            </imageView>
-                                        </subviews>
-                                        <color key="backgroundColor" systemColor="systemBackgroundColor"/>
-                                        <constraints>
-                                            <constraint firstAttribute="trailing" secondItem="PD5-8h-ZLm" secondAttribute="trailing" constant="5" id="71i-FN-PmV"/>
-                                            <constraint firstItem="pyf-iS-YYP" firstAttribute="leading" secondItem="ogC-ph-Xdr" secondAttribute="leading" id="D7Q-nx-Lcr"/>
-                                            <constraint firstAttribute="height" constant="40" id="HZv-dy-zeu"/>
-                                            <constraint firstItem="PD5-8h-ZLm" firstAttribute="top" secondItem="ogC-ph-Xdr" secondAttribute="top" id="m3v-SO-f43"/>
-                                            <constraint firstItem="PD5-8h-ZLm" firstAttribute="leading" secondItem="pyf-iS-YYP" secondAttribute="trailing" constant="10" id="pD9-5x-n4a"/>
-                                            <constraint firstItem="pyf-iS-YYP" firstAttribute="top" secondItem="ogC-ph-Xdr" secondAttribute="top" constant="5" id="uht-S6-R6J"/>
-                                        </constraints>
-                                    </view>
-                                    <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="OO4-N7-9vp" userLabel="View JSON">
-                                        <rect key="frame" x="0.0" y="670" width="414" height="40.5"/>
-                                        <subviews>
-                                            <textView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" scrollEnabled="NO" editable="NO" textAlignment="natural" translatesAutoresizingMaskIntoConstraints="NO" id="RIO-6X-GG1">
-                                                <rect key="frame" x="5" y="5" width="404" height="30.5"/>
-                                                <color key="backgroundColor" systemColor="systemGray4Color"/>
-                                                <color key="textColor" systemColor="labelColor"/>
-                                                <fontDescription key="fontDescription" type="system" pointSize="12"/>
-                                                <textInputTraits key="textInputTraits" autocapitalizationType="sentences"/>
-                                            </textView>
-                                        </subviews>
-                                        <color key="backgroundColor" systemColor="systemBackgroundColor"/>
-                                        <constraints>
-                                            <constraint firstItem="RIO-6X-GG1" firstAttribute="leading" secondItem="OO4-N7-9vp" secondAttribute="leading" constant="5" id="63w-yC-mGi"/>
-                                            <constraint firstAttribute="trailing" secondItem="RIO-6X-GG1" secondAttribute="trailing" constant="5" id="9cj-M6-K3f"/>
-                                            <constraint firstItem="RIO-6X-GG1" firstAttribute="top" secondItem="OO4-N7-9vp" secondAttribute="top" constant="5" id="ODH-TK-qMG"/>
-                                            <constraint firstAttribute="bottom" secondItem="RIO-6X-GG1" secondAttribute="bottom" constant="5" id="ajP-yK-idK"/>
-                                        </constraints>
-                                    </view>
-                                </subviews>
-                                <constraints>
-                                    <constraint firstItem="ogC-ph-Xdr" firstAttribute="top" secondItem="hTE-ys-qsF" secondAttribute="top" constant="620" id="9yP-Qs-EjJ"/>
-                                    <constraint firstItem="OO4-N7-9vp" firstAttribute="top" secondItem="hTE-ys-qsF" secondAttribute="top" constant="670" id="A9O-TK-Vz6" userLabel="View JSON.top = top + 550"/>
-                                    <constraint firstAttribute="trailing" secondItem="ogC-ph-Xdr" secondAttribute="trailing" constant="5" id="JLe-vC-Oyq"/>
-                                    <constraint firstAttribute="bottom" secondItem="OO4-N7-9vp" secondAttribute="bottom" id="MpX-OZ-MDh"/>
-                                    <constraint firstItem="OO4-N7-9vp" firstAttribute="width" secondItem="hTE-ys-qsF" secondAttribute="width" id="PWW-C3-Qcw"/>
-                                    <constraint firstItem="OO4-N7-9vp" firstAttribute="leading" secondItem="hTE-ys-qsF" secondAttribute="leading" id="Q4I-CY-qdY"/>
-                                    <constraint firstAttribute="trailing" secondItem="OO4-N7-9vp" secondAttribute="trailing" id="cmw-yc-oJP"/>
-                                    <constraint firstAttribute="trailing" secondItem="Sms-Ez-fLO" secondAttribute="trailing" constant="5" id="coa-ak-YgW"/>
-                                    <constraint firstItem="ogC-ph-Xdr" firstAttribute="leading" secondItem="hTE-ys-qsF" secondAttribute="leading" constant="5" id="dBH-cz-20F"/>
-                                    <constraint firstItem="Sms-Ez-fLO" firstAttribute="leading" secondItem="hTE-ys-qsF" secondAttribute="leading" constant="5" id="rIR-0f-qtc"/>
-                                    <constraint firstItem="Sms-Ez-fLO" firstAttribute="top" secondItem="hTE-ys-qsF" secondAttribute="top" constant="5" id="tsB-Td-qaK"/>
-                                </constraints>
-                            </scrollView>
-                        </subviews>
-                        <viewLayoutGuide key="safeArea" id="uBS-U0-Obf"/>
-                        <color key="backgroundColor" systemColor="systemBackgroundColor"/>
-                        <constraints>
-                            <constraint firstItem="uBS-U0-Obf" firstAttribute="trailing" secondItem="hTE-ys-qsF" secondAttribute="trailing" id="CvM-Hx-Hy6"/>
-                            <constraint firstItem="hTE-ys-qsF" firstAttribute="top" secondItem="uBS-U0-Obf" secondAttribute="top" id="Lar-wg-a7V"/>
-                            <constraint firstItem="hTE-ys-qsF" firstAttribute="leading" secondItem="uBS-U0-Obf" secondAttribute="leading" id="Mye-Fv-DDH"/>
-                            <constraint firstItem="uBS-U0-Obf" firstAttribute="bottom" secondItem="hTE-ys-qsF" secondAttribute="bottom" id="aJj-P3-LeK"/>
-                        </constraints>
-                    </view>
-                    <navigationItem key="navigationItem" id="fnR-ht-Muv"/>
-                    <connections>
-                        <outlet property="homeImage" destination="pyf-iS-YYP" id="gAh-bM-f5J"/>
-                        <outlet property="homeServer" destination="PD5-8h-ZLm" id="Hge-8o-YY1"/>
-                        <outlet property="imageActivity" destination="tl5-S1-p9X" id="pT5-X7-R2q"/>
-                        <outlet property="imageCollabora" destination="GXZ-Rj-WCE" id="cOv-xH-ZKC"/>
-                        <outlet property="imageComments" destination="cYf-px-izj" id="lU6-Vu-AKk"/>
-                        <outlet property="imageDeletedFiles" destination="8Zc-9W-n27" id="XYP-JN-JFc"/>
-                        <outlet property="imageEndToEndEncryption" destination="S7m-5Z-ktw" id="0Pv-Yt-YJB"/>
-                        <outlet property="imageExternalSite" destination="JWO-C0-32L" id="JKi-n1-5IQ"/>
-                        <outlet property="imageFileSharing" destination="G9c-Nd-Ikl" id="Wha-2g-8o0"/>
-                        <outlet property="imageLockFile" destination="eAC-Li-gKO" id="hHH-Pl-uOW"/>
-                        <outlet property="imageNotification" destination="cgb-3g-trc" id="fa5-99-76C"/>
-                        <outlet property="imageOnlyOffice" destination="xvv-h0-9bM" id="tw2-is-KHy"/>
-                        <outlet property="imageText" destination="iCB-2A-phO" id="uit-Ku-oOF"/>
-                        <outlet property="imageUserStatus" destination="Nxp-H1-Pob" id="LQg-7M-CNd"/>
-                        <outlet property="statusActivity" destination="dyb-1O-dIA" id="BfC-ZI-Wcr"/>
-                        <outlet property="statusCollabora" destination="30w-oC-gZl" id="wnj-OE-UQZ"/>
-                        <outlet property="statusComments" destination="lVT-MG-7kN" id="7tn-cz-EhW"/>
-                        <outlet property="statusDeletedFiles" destination="8hg-qK-qvz" id="xtt-gI-H0a"/>
-                        <outlet property="statusEndToEndEncryption" destination="M82-8U-M4Q" id="S9e-h3-GpF"/>
-                        <outlet property="statusExternalSite" destination="ivv-te-kaP" id="qzS-eo-Dq3"/>
-                        <outlet property="statusFileSharing" destination="SbT-rU-lJ8" id="zqA-0V-TLr"/>
-                        <outlet property="statusLockFile" destination="db5-st-O6M" id="dRt-zm-Qd7"/>
-                        <outlet property="statusNotification" destination="WAg-Hw-sQS" id="T5C-Ch-11o"/>
-                        <outlet property="statusOnlyOffice" destination="ucV-YG-5ht" id="11e-La-p9K"/>
-                        <outlet property="statusText" destination="uiz-H8-p3D" id="wLb-D2-MNS"/>
-                        <outlet property="statusUserStatus" destination="5Sj-5h-jgb" id="EXQ-7b-UCf"/>
-                        <outlet property="textView" destination="RIO-6X-GG1" id="lPs-Ev-hQf"/>
-                    </connections>
-                </viewController>
-                <placeholder placeholderIdentifier="IBFirstResponder" id="0OV-l8-tBJ" sceneMemberID="firstResponder"/>
-            </objects>
-            <point key="canvasLocation" x="910.14492753623199" y="133.25892857142856"/>
-        </scene>
-        <!--Navigation Controller-->
-        <scene sceneID="YbF-Ed-KAp">
-            <objects>
-                <navigationController automaticallyAdjustsScrollViewInsets="NO" id="vTK-Er-kbZ" sceneMemberID="viewController">
-                    <toolbarItems/>
-                    <navigationBar key="navigationBar" contentMode="scaleToFill" insetsLayoutMarginsFromSafeArea="NO" id="f2L-7c-zw8">
-                        <rect key="frame" x="0.0" y="44" width="414" height="44"/>
-                        <autoresizingMask key="autoresizingMask"/>
-                    </navigationBar>
-                    <nil name="viewControllers"/>
-                    <connections>
-                        <segue destination="7oH-vf-YqN" kind="relationship" relationship="rootViewController" id="ZBj-sH-5gE"/>
-                    </connections>
-                </navigationController>
-                <placeholder placeholderIdentifier="IBFirstResponder" id="RAt-Xm-BSR" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
-            </objects>
-            <point key="canvasLocation" x="0.0" y="133.25892857142856"/>
-        </scene>
-    </scenes>
-    <resources>
-        <image name="activity" width="512" height="512"/>
-        <image name="collabora" width="425" height="425"/>
-        <image name="comments" width="425" height="425"/>
-        <image name="delete" width="425" height="425"/>
-        <image name="externalsites" width="425" height="425"/>
-        <image name="home" width="120" height="120"/>
-        <image name="lock" width="24" height="24"/>
-        <image name="notification" width="512" height="512"/>
-        <image name="onlyoffice" width="425" height="425"/>
-        <image name="share" width="512" height="512"/>
-        <image name="text" width="425" height="425"/>
-        <image name="userStatusAway" width="425" height="425"/>
-        <systemColor name="labelColor">
-            <color white="0.0" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
-        </systemColor>
-        <systemColor name="systemBackgroundColor">
-            <color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
-        </systemColor>
-        <systemColor name="systemGray4Color">
-            <color red="0.81960784313725488" green="0.81960784313725488" blue="0.83921568627450982" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
-        </systemColor>
-    </resources>
-</document>

+ 0 - 350
iOSClient/Diagnostics/NCCapabilitiesViewController.swift

@@ -1,350 +0,0 @@
-//
-//  NCCapabilitiesViewController.swift
-//  Nextcloud
-//
-//  Created by Marino Faggiana on 28/07/2020.
-//  Copyright © 2020 Marino Faggiana. All rights reserved.
-//
-//  Author Marino Faggiana <marino.faggiana@nextcloud.com>
-//
-//  This program is free software: you can redistribute it and/or modify
-//  it under the terms of the GNU General Public License as published by
-//  the Free Software Foundation, either version 3 of the License, or
-//  (at your option) any later version.
-//
-//  This program is distributed in the hope that it will be useful,
-//  but WITHOUT ANY WARRANTY; without even the implied warranty of
-//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-//  GNU General Public License for more details.
-//
-//  You should have received a copy of the GNU General Public License
-//  along with this program.  If not, see <http://www.gnu.org/licenses/>.
-//
-
-import UIKit
-import NextcloudKit
-
-class NCCapabilitiesViewController: UIViewController, UIDocumentInteractionControllerDelegate {
-
-    @IBOutlet weak var textView: UITextView!
-
-    @IBOutlet weak var imageFileSharing: UIImageView!
-    @IBOutlet weak var statusFileSharing: UILabel!
-
-    @IBOutlet weak var imageExternalSite: UIImageView!
-    @IBOutlet weak var statusExternalSite: UILabel!
-
-    @IBOutlet weak var imageEndToEndEncryption: UIImageView!
-    @IBOutlet weak var statusEndToEndEncryption: UILabel!
-
-    @IBOutlet weak var imageActivity: UIImageView!
-    @IBOutlet weak var statusActivity: UILabel!
-
-    @IBOutlet weak var imageNotification: UIImageView!
-    @IBOutlet weak var statusNotification: UILabel!
-
-    @IBOutlet weak var imageDeletedFiles: UIImageView!
-    @IBOutlet weak var statusDeletedFiles: UILabel!
-
-    @IBOutlet weak var imageUserStatus: UIImageView!
-    @IBOutlet weak var statusUserStatus: UILabel!
-
-    @IBOutlet weak var imageComments: UIImageView!
-    @IBOutlet weak var statusComments: UILabel!
-
-    @IBOutlet weak var imageText: UIImageView!
-    @IBOutlet weak var statusText: UILabel!
-
-    @IBOutlet weak var imageCollabora: UIImageView!
-    @IBOutlet weak var statusCollabora: UILabel!
-
-    @IBOutlet weak var imageOnlyOffice: UIImageView!
-    @IBOutlet weak var statusOnlyOffice: UILabel!
-
-    @IBOutlet weak var homeImage: UIImageView!
-    @IBOutlet weak var homeServer: UILabel!
-
-    @IBOutlet weak var imageLockFile: UIImageView!
-    @IBOutlet weak var statusLockFile: UILabel!
-
-    private let appDelegate = UIApplication.shared.delegate as! AppDelegate
-    private var documentController: UIDocumentInteractionController?
-    private var account: String = ""
-    private var capabilitiesText = ""
-    // private var timer: Timer?
-
-    // MARK: - View Life Cycle
-
-    override func viewDidLoad() {
-        super.viewDidLoad()
-
-        self.title = NSLocalizedString("_capabilities_", comment: "")
-
-        let shareImage = UIImage(named: "shareFill")!.image(color: .gray, size: 25)
-        self.navigationItem.rightBarButtonItem = UIBarButtonItem(image: shareImage, style: UIBarButtonItem.Style.plain, target: self, action: #selector(share))
-        self.navigationItem.leftBarButtonItem = UIBarButtonItem(title: NSLocalizedString("_done_", comment: ""), style: UIBarButtonItem.Style.plain, target: self, action: #selector(close))
-
-        textView.layer.cornerRadius = 15
-        textView.layer.masksToBounds = true
-        textView.backgroundColor = .secondarySystemBackground
-
-        statusFileSharing.layer.cornerRadius = 12.5
-        statusFileSharing.layer.borderWidth = 0.5
-        statusFileSharing.layer.borderColor = UIColor.systemGray.cgColor
-        statusFileSharing.layer.masksToBounds = true
-        statusFileSharing.backgroundColor = .secondarySystemBackground
-
-        statusExternalSite.layer.cornerRadius = 12.5
-        statusExternalSite.layer.borderWidth = 0.5
-        statusExternalSite.layer.borderColor = UIColor.systemGray.cgColor
-        statusExternalSite.layer.masksToBounds = true
-        statusExternalSite.backgroundColor = .secondarySystemBackground
-
-        statusEndToEndEncryption.layer.cornerRadius = 12.5
-        statusEndToEndEncryption.layer.borderWidth = 0.5
-        statusEndToEndEncryption.layer.borderColor = UIColor.systemGray.cgColor
-        statusEndToEndEncryption.layer.masksToBounds = true
-        statusEndToEndEncryption.backgroundColor = .secondarySystemBackground
-
-        statusActivity.layer.cornerRadius = 12.5
-        statusActivity.layer.borderWidth = 0.5
-        statusActivity.layer.borderColor = UIColor.systemGray.cgColor
-        statusActivity.layer.masksToBounds = true
-        statusActivity.backgroundColor = .secondarySystemBackground
-
-        statusNotification.layer.cornerRadius = 12.5
-        statusNotification.layer.borderWidth = 0.5
-        statusNotification.layer.borderColor = UIColor.systemGray.cgColor
-        statusNotification.layer.masksToBounds = true
-        statusNotification.backgroundColor = .secondarySystemBackground
-
-        statusDeletedFiles.layer.cornerRadius = 12.5
-        statusDeletedFiles.layer.borderWidth = 0.5
-        statusDeletedFiles.layer.borderColor = UIColor.systemGray.cgColor
-        statusDeletedFiles.layer.masksToBounds = true
-        statusDeletedFiles.backgroundColor = .secondarySystemBackground
-
-        statusText.layer.cornerRadius = 12.5
-        statusText.layer.borderWidth = 0.5
-        statusText.layer.borderColor = UIColor.systemGray.cgColor
-        statusText.layer.masksToBounds = true
-        statusText.backgroundColor = .secondarySystemBackground
-
-        statusCollabora.layer.cornerRadius = 12.5
-        statusCollabora.layer.borderWidth = 0.5
-        statusCollabora.layer.borderColor = UIColor.systemGray.cgColor
-        statusCollabora.layer.masksToBounds = true
-        statusCollabora.backgroundColor = .secondarySystemBackground
-
-        statusOnlyOffice.layer.cornerRadius = 12.5
-        statusOnlyOffice.layer.borderWidth = 0.5
-        statusOnlyOffice.layer.borderColor = UIColor.systemGray.cgColor
-        statusOnlyOffice.layer.masksToBounds = true
-        statusOnlyOffice.backgroundColor = .secondarySystemBackground
-
-        statusUserStatus.layer.cornerRadius = 12.5
-        statusUserStatus.layer.borderWidth = 0.5
-        statusUserStatus.layer.borderColor = UIColor.systemGray.cgColor
-        statusUserStatus.layer.masksToBounds = true
-        statusUserStatus.backgroundColor = .secondarySystemBackground
-
-        statusComments.layer.cornerRadius = 12.5
-        statusComments.layer.borderWidth = 0.5
-        statusComments.layer.borderColor = UIColor.systemGray.cgColor
-        statusComments.layer.masksToBounds = true
-        statusComments.backgroundColor = .secondarySystemBackground
-
-        statusLockFile.layer.cornerRadius = 12.5
-        statusLockFile.layer.borderWidth = 0.5
-        statusLockFile.layer.borderColor = UIColor.systemGray.cgColor
-        statusLockFile.layer.masksToBounds = true
-        statusLockFile.backgroundColor = .secondarySystemBackground
-
-        imageFileSharing.image = UIImage(named: "share")!.image(color: UIColor.systemGray, size: 50)
-        imageExternalSite.image = NCUtility.shared.loadImage(named: "network", color: UIColor.systemGray)
-        imageEndToEndEncryption.image = NCUtility.shared.loadImage(named: "lock", color: UIColor.systemGray)
-        imageActivity.image = UIImage(named: "bolt")!.image(color: UIColor.systemGray, size: 50)
-        imageNotification.image = NCUtility.shared.loadImage(named: "bell", color: UIColor.systemGray)
-        imageDeletedFiles.image = NCUtility.shared.loadImage(named: "trash", color: UIColor.systemGray)
-        imageText.image = UIImage(named: "text")!.image(color: UIColor.systemGray, size: 50)
-        imageCollabora.image = UIImage(named: "collabora")!.image(color: UIColor.systemGray, size: 50)
-        imageOnlyOffice.image = UIImage(named: "onlyoffice")!.image(color: UIColor.systemGray, size: 50)
-        imageUserStatus.image = UIImage(named: "userStatusAway")!.image(color: UIColor.systemGray, size: 50)
-        imageComments.image = UIImage(named: "comments")!.image(color: UIColor.systemGray, size: 50)
-        imageLockFile.image = UIImage(named: "lock")!.image(color: UIColor.systemGray, size: 50)
-
-        guard let activeAccount = NCManageDatabase.shared.getActiveAccount() else { return }
-        self.account = activeAccount.account
-
-        if let text = NCManageDatabase.shared.getCapabilities(account: activeAccount.account) {
-            capabilitiesText = text
-            updateCapabilities()
-        } else {
-            let error = NKError(errorCode: NCGlobal.shared.errorInternalError, errorDescription: "_no_capabilities_found_")
-            NCContentPresenter.shared.showError(error: error, priority: .max)
-
-            DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) {
-                self.dismiss(animated: true, completion: nil)
-            }
-        }
-
-        homeImage.image = UIImage(named: "home")!.image(color: UIColor.systemGray, size: 50)
-        homeServer.text = NCUtilityFileSystem.shared.getHomeServer(urlBase: appDelegate.urlBase, userId: appDelegate.userId) + "/"
-    }
-
-    @objc func updateCapabilities() {
-
-        NextcloudKit.shared.getCapabilities { account, data, error in
-            if error == .success && data != nil {
-                NCManageDatabase.shared.addCapabilitiesJSon(data!, account: account)
-
-                // EDITORS
-                let serverVersionMajor = NCManageDatabase.shared.getCapabilitiesServerInt(account: account, elements: NCElementsJSON.shared.capabilitiesVersionMajor)
-                if serverVersionMajor >= NCGlobal.shared.nextcloudVersion18 {
-                    NextcloudKit.shared.NCTextObtainEditorDetails { account, editors, creators, data, error in
-                        if error == .success && account == self.appDelegate.account {
-                            NCManageDatabase.shared.addDirectEditing(account: account, editors: editors, creators: creators)
-                            self.readCapabilities()
-                        }
-                        if self.view.window != nil {
-                            // self.timer = Timer.scheduledTimer(timeInterval: 5, target: self, selector: #selector(self.updateCapabilities), userInfo: nil, repeats: false)
-                        }
-                    }
-                } else {
-                    if self.view.window != nil {
-                        // self.timer = Timer.scheduledTimer(timeInterval: 5, target: self, selector: #selector(self.updateCapabilities), userInfo: nil, repeats: false)
-                    }
-                }
-
-                if let text = NCManageDatabase.shared.getCapabilities(account: account) {
-                    self.capabilitiesText = text
-                }
-                self.readCapabilities()
-            }
-        }
-
-        readCapabilities()
-    }
-
-    @objc func share() {
-        // timer?.invalidate()
-        self.dismiss(animated: true) {
-            let fileURL = NSURL.fileURL(withPath: NSTemporaryDirectory(), isDirectory: true).appendingPathComponent("capabilities.txt")
-            do {
-                try self.capabilitiesText.write(to: fileURL, atomically: true, encoding: .utf8)
-
-                if let view = self.appDelegate.window?.rootViewController?.view {
-                    self.documentController = UIDocumentInteractionController(url: fileURL)
-                    self.documentController?.delegate = self
-                    self.documentController?.presentOptionsMenu(from: CGRect.zero, in: view, animated: true)
-                }
-            } catch { }
-        }
-    }
-
-    @objc func close() {
-        // timer?.invalidate()
-        self.dismiss(animated: true, completion: nil)
-    }
-
-    func readCapabilities() {
-
-        textView.text = capabilitiesText
-
-        if NCManageDatabase.shared.getCapabilitiesServerBool(account: account, elements: NCElementsJSON.shared.capabilitiesFileSharingApiEnabled, exists: false) {
-            statusFileSharing.text = "✓ " + NSLocalizedString("_available_", comment: "")
-        } else {
-            statusFileSharing.text = NSLocalizedString("_not_available_", comment: "")
-        }
-
-        if NCManageDatabase.shared.getCapabilitiesServerBool(account: account, elements: NCElementsJSON.shared.capabilitiesExternalSitesExists, exists: true) {
-            statusExternalSite.text = "✓ " + NSLocalizedString("_available_", comment: "")
-        } else {
-            statusExternalSite.text = NSLocalizedString("_not_available_", comment: "")
-        }
-
-        let isE2EEEnabled = NCManageDatabase.shared.getCapabilitiesServerBool(account: account, elements: NCElementsJSON.shared.capabilitiesE2EEEnabled, exists: false)
-        // let versionE2EE = NCManageDatabase.shared.getCapabilitiesServerString(account: account, elements: NCElementsJSON.shared.capabilitiesE2EEApiVersion)
-
-        if isE2EEEnabled {
-            statusEndToEndEncryption.text = "✓ " + NSLocalizedString("_available_", comment: "")
-        } else {
-            statusEndToEndEncryption.text = NSLocalizedString("_not_available_", comment: "")
-        }
-
-        let activity = NCManageDatabase.shared.getCapabilitiesServerArray(account: account, elements: NCElementsJSON.shared.capabilitiesActivity)
-        if activity != nil {
-            statusActivity.text = "✓ " + NSLocalizedString("_available_", comment: "")
-        } else {
-            statusActivity.text = NSLocalizedString("_not_available_", comment: "")
-        }
-
-        let notification = NCManageDatabase.shared.getCapabilitiesServerArray(account: account, elements: NCElementsJSON.shared.capabilitiesNotification)
-        if notification != nil {
-            statusNotification.text = "✓ " + NSLocalizedString("_available_", comment: "")
-        } else {
-            statusNotification.text = NSLocalizedString("_not_available_", comment: "")
-        }
-
-        let deleteFiles = NCManageDatabase.shared.getCapabilitiesServerBool(account: account, elements: NCElementsJSON.shared.capabilitiesFilesUndelete, exists: false)
-        if deleteFiles {
-            statusDeletedFiles.text = "✓ " + NSLocalizedString("_available_", comment: "")
-        } else {
-            statusDeletedFiles.text = NSLocalizedString("_not_available_", comment: "")
-        }
-
-        var textEditor = false
-        var onlyofficeEditors = false
-        if let editors = NCManageDatabase.shared.getDirectEditingEditors(account: account) {
-            for editor in editors {
-                if editor.editor == NCGlobal.shared.editorText {
-                    textEditor = true
-                } else if editor.editor == NCGlobal.shared.editorOnlyoffice {
-                    onlyofficeEditors = true
-                }
-            }
-        }
-
-        if textEditor {
-            statusText.text = "✓ " + NSLocalizedString("_available_", comment: "")
-        } else {
-            statusText.text = NSLocalizedString("_not_available_", comment: "")
-        }
-
-        let richdocumentsMimetypes = NCManageDatabase.shared.getCapabilitiesServerArray(account: account, elements: NCElementsJSON.shared.capabilitiesRichdocumentsMimetypes)
-        if richdocumentsMimetypes != nil {
-            statusCollabora.text = "✓ " + NSLocalizedString("_available_", comment: "")
-        } else {
-            statusCollabora.text = NSLocalizedString("_not_available_", comment: "")
-        }
-
-        if onlyofficeEditors {
-            statusOnlyOffice.text = "✓ " + NSLocalizedString("_available_", comment: "")
-        } else {
-            statusOnlyOffice.text = NSLocalizedString("_not_available_", comment: "")
-        }
-
-        let userStatus = NCManageDatabase.shared.getCapabilitiesServerBool(account: account, elements: NCElementsJSON.shared.capabilitiesUserStatusEnabled, exists: false)
-        if userStatus {
-            statusUserStatus.text = "✓ " + NSLocalizedString("_available_", comment: "")
-        } else {
-            statusUserStatus.text = NSLocalizedString("_not_available_", comment: "")
-        }
-
-        let comments = NCManageDatabase.shared.getCapabilitiesServerBool(account: account, elements: NCElementsJSON.shared.capabilitiesFilesComments, exists: false)
-        if comments {
-            statusComments.text = "✓ " + NSLocalizedString("_available_", comment: "")
-        } else {
-            statusComments.text = NSLocalizedString("_not_available_", comment: "")
-        }
-
-        let hasLockCapability = NCManageDatabase.shared.getCapabilitiesServerInt(account: appDelegate.account, elements: NCElementsJSON.shared.capabilitiesFilesLockVersion) >= 1
-        if hasLockCapability {
-            statusLockFile.text = "✓ " + NSLocalizedString("_available_", comment: "")
-        } else {
-            statusLockFile.text = NSLocalizedString("_not_available_", comment: "")
-        }
-
-        print("end.")
-    }
-}

+ 53 - 0
iOSClient/Groupfolders/NCGroupfolders.storyboard

@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="21701" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="EFX-fO-Oip">
+    <device id="retina5_9" orientation="portrait" appearance="light"/>
+    <dependencies>
+        <deployment identifier="iOS"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="21678"/>
+        <capability name="Safe area layout guides" minToolsVersion="9.0"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+    </dependencies>
+    <scenes>
+        <!--Groupfolders-->
+        <scene sceneID="X4W-6b-l7s">
+            <objects>
+                <viewController storyboardIdentifier="NCGroupfolders.storyboard" extendedLayoutIncludesOpaqueBars="YES" id="EFX-fO-Oip" customClass="NCGroupfolders" customModule="Nextcloud" customModuleProvider="target" sceneMemberID="viewController">
+                    <view key="view" contentMode="scaleToFill" id="QEs-gO-Cmp">
+                        <rect key="frame" x="0.0" y="0.0" width="375" height="812"/>
+                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                        <subviews>
+                            <collectionView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" dataMode="prototypes" translatesAutoresizingMaskIntoConstraints="NO" id="Zaz-Cl-qpZ">
+                                <rect key="frame" x="0.0" y="0.0" width="375" height="813"/>
+                                <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                                <collectionViewFlowLayout key="collectionViewLayout" minimumLineSpacing="0.0" minimumInteritemSpacing="0.0" id="fF1-wd-0xN">
+                                    <size key="itemSize" width="0.0" height="0.0"/>
+                                    <size key="headerReferenceSize" width="0.0" height="0.0"/>
+                                    <size key="footerReferenceSize" width="0.0" height="0.0"/>
+                                    <inset key="sectionInset" minX="0.0" minY="0.0" maxX="0.0" maxY="0.0"/>
+                                </collectionViewFlowLayout>
+                                <cells/>
+                                <connections>
+                                    <outlet property="dataSource" destination="EFX-fO-Oip" id="2On-qP-zuG"/>
+                                    <outlet property="delegate" destination="EFX-fO-Oip" id="s3n-CL-8X2"/>
+                                </connections>
+                            </collectionView>
+                        </subviews>
+                        <viewLayoutGuide key="safeArea" id="Meh-VD-wWh"/>
+                        <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                        <constraints>
+                            <constraint firstItem="Zaz-Cl-qpZ" firstAttribute="leading" secondItem="Meh-VD-wWh" secondAttribute="leading" id="1bp-sm-u0X"/>
+                            <constraint firstItem="Meh-VD-wWh" firstAttribute="trailing" secondItem="Zaz-Cl-qpZ" secondAttribute="trailing" id="aNd-UL-hmu"/>
+                            <constraint firstItem="Meh-VD-wWh" firstAttribute="bottom" secondItem="Zaz-Cl-qpZ" secondAttribute="bottom" constant="-35" id="aNr-tf-2AH"/>
+                            <constraint firstItem="Zaz-Cl-qpZ" firstAttribute="top" secondItem="QEs-gO-Cmp" secondAttribute="top" id="tji-wt-R7s"/>
+                        </constraints>
+                    </view>
+                    <connections>
+                        <outlet property="collectionView" destination="Zaz-Cl-qpZ" id="8oA-Gx-z7T"/>
+                    </connections>
+                </viewController>
+                <placeholder placeholderIdentifier="IBFirstResponder" id="JJ0-Le-6eT" userLabel="First Responder" sceneMemberID="firstResponder"/>
+            </objects>
+            <point key="canvasLocation" x="256.80000000000001" y="228.32512315270938"/>
+        </scene>
+    </scenes>
+</document>

+ 129 - 0
iOSClient/Groupfolders/NCGroupfolders.swift

@@ -0,0 +1,129 @@
+//
+//  NCGroupfolders.swift
+//  Nextcloud
+//
+//  Created by Marino Faggiana on 14/04/2023.
+//  Copyright © 2023 Marino Faggiana. All rights reserved.
+//
+//  Author Marino Faggiana <marino.faggiana@nextcloud.com>
+//
+//  This program is free software: you can redistribute it and/or modify
+//  it under the terms of the GNU General Public License as published by
+//  the Free Software Foundation, either version 3 of the License, or
+//  (at your option) any later version.
+//
+//  This program is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+//  GNU General Public License for more details.
+//
+//  You should have received a copy of the GNU General Public License
+//  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+//
+
+import UIKit
+import NextcloudKit
+
+class NCGroupfolders: NCCollectionViewCommon {
+
+    // MARK: - View Life Cycle
+
+    required init?(coder aDecoder: NSCoder) {
+        super.init(coder: aDecoder)
+
+        titleCurrentFolder = NSLocalizedString("_group_folders_", comment: "")
+        layoutKey = NCGlobal.shared.layoutViewGroupfolders
+        enableSearchBar = false
+        headerMenuButtonsCommand = false
+        headerMenuButtonsView = true
+        headerRichWorkspaceDisable = true
+        emptyImage = UIImage(named: "folder_group")?.image(color: NCBrandColor.shared.brandElement, size: UIScreen.main.bounds.width)
+        emptyTitle = "_files_no_files_"
+        emptyDescription = "_tutorial_groupfolders_view_"
+    }
+
+    override func viewWillAppear(_ animated: Bool) {
+        super.viewWillAppear(animated)
+
+        navigationController?.setFileAppreance()
+    }
+
+    // MARK: - DataSource + NC Endpoint
+
+    override func reloadDataSource(forced: Bool = true) {
+        super.reloadDataSource()
+
+        var metadatas: [tableMetadata] = []
+
+        if self.serverUrl.isEmpty {
+            metadatas = NCManageDatabase.shared.getMetadatasFromGroupfolders(account: self.appDelegate.account, urlBase: self.appDelegate.urlBase, userId: self.appDelegate.userId)
+        } else {
+            metadatas = NCManageDatabase.shared.getMetadatas(predicate: NSPredicate(format: "account == %@ AND serverUrl == %@", self.appDelegate.account, self.serverUrl))
+        }
+
+        self.dataSource = NCDataSource(
+            metadatas: metadatas,
+            account: self.appDelegate.account,
+            sort: self.layoutForView?.sort,
+            ascending: self.layoutForView?.ascending,
+            directoryOnTop: self.layoutForView?.directoryOnTop,
+            favoriteOnTop: true,
+            filterLivePhoto: true,
+            groupByField: self.groupByField,
+            providers: self.providers,
+            searchResults: self.searchResults)
+
+        DispatchQueue.main.async {
+            self.isReloadDataSourceNetworkInProgress = false
+            self.refreshControl.endRefreshing()
+            self.collectionView.reloadData()
+        }
+    }
+
+    override func reloadDataSourceNetwork(forced: Bool = false) {
+        super.reloadDataSourceNetwork(forced: forced)
+
+        isReloadDataSourceNetworkInProgress = true
+        collectionView?.reloadData()
+
+        if serverUrl.isEmpty {
+
+            let homeServerUrl = NCUtilityFileSystem.shared.getHomeServer(urlBase: self.appDelegate.urlBase, userId: self.appDelegate.userId)
+            let options = NKRequestOptions(queue: NextcloudKit.shared.nkCommonInstance.backgroundQueue)
+
+            NextcloudKit.shared.getGroupfolders(options: options) { account, results, _, error in
+
+                if error == .success, let groupfolders = results {
+
+                    NCManageDatabase.shared.addGroupfolders(account: account, groupfolders: groupfolders)
+
+                    Task {
+                        for groupfolder in groupfolders {
+                            let mountPoint = groupfolder.mountPoint.hasPrefix("/") ? groupfolder.mountPoint : "/" + groupfolder.mountPoint
+                            let serverUrlFileName = homeServerUrl + mountPoint
+                            if NCManageDatabase.shared.getMetadataFromDirectory(account: self.appDelegate.account, serverUrl: serverUrlFileName) == nil {
+                                let results = await NextcloudKit.shared.readFileOrFolder(serverUrlFileName: serverUrlFileName, depth: "0", showHiddenFiles: CCUtility.getShowHiddenFiles())
+                                if results.error == .success, let file = results.files.first {
+                                    let isDirectoryE2EE = NCUtility.shared.isDirectoryE2EE(file: file)
+                                    let metadata = NCManageDatabase.shared.convertFileToMetadata(file, isDirectoryE2EE: isDirectoryE2EE)
+                                    NCManageDatabase.shared.addMetadata(metadata)
+                                    NCManageDatabase.shared.addDirectory(encrypted: isDirectoryE2EE, favorite: metadata.favorite, ocId: metadata.ocId, fileId: metadata.fileId, etag: nil, permissions: metadata.permissions, serverUrl: serverUrlFileName, account: metadata.account)
+                                }
+                            }
+                        }
+                        self.reloadDataSource()
+                    }
+                } else if error != .success {
+                    self.reloadDataSource()
+                    NCContentPresenter.shared.showError(error: error)
+                }
+            }
+        } else {
+
+            networkReadFolder(forced: forced) { _, _, _, _, _ in
+
+                self.reloadDataSource()
+            }
+        }
+    }
+}

+ 0 - 15
iOSClient/Images.xcassets/arrow.left.arrow.right.imageset/Contents.json

@@ -1,15 +0,0 @@
-{
-  "images" : [
-    {
-      "filename" : "transfer.pdf",
-      "idiom" : "universal"
-    }
-  ],
-  "info" : {
-    "author" : "xcode",
-    "version" : 1
-  },
-  "properties" : {
-    "preserves-vector-representation" : true
-  }
-}

BIN
iOSClient/Images.xcassets/arrow.left.arrow.right.imageset/transfer.pdf


+ 0 - 15
iOSClient/Images.xcassets/audioOff.imageset/Contents.json

@@ -1,15 +0,0 @@
-{
-  "images" : [
-    {
-      "filename" : "audioOff.pdf",
-      "idiom" : "universal"
-    }
-  ],
-  "info" : {
-    "author" : "xcode",
-    "version" : 1
-  },
-  "properties" : {
-    "preserves-vector-representation" : true
-  }
-}

+ 0 - 53
iOSClient/Images.xcassets/audioOff.imageset/audioOff.pdf

@@ -1,53 +0,0 @@
-%PDF-1.4
-%Óëéá
-1 0 obj
-<</Creator (Mozilla/5.0 \(Macintosh; Intel Mac OS X 10_15_7\) AppleWebKit/537.36 \(KHTML, like Gecko\) BoxySVG/3.42.2 Chrome/83.0.4103.122 Electron/9.1.2 Safari/537.36)
-/Producer (Skia/PDF m83)
-/CreationDate (D:20201031065104+00'00')
-/ModDate (D:20201031065104+00'00')>>
-endobj
-3 0 obj
-<</ca 1
-/BM /Normal>>
-endobj
-4 0 obj
-<</Filter /FlateDecode
-/Length 174>> stream
-xœmNK1Ýs
-Ö&"Ж¶'píÊ?‹õþ‰´u̘I߃Â{�†ÚÙsK«RqÁÓh"Fæ‘lMŸg8nðî3‘ЉkWú­\d·x}A"È"{ΠBÁ:—º°	œ×Ô¹2å²tÝߨ„A•ú^rÌTIú­Š¤Òl&â&ê—M¯é²Ñ�jFòñ¶Rä¡‘)å±÷™žà8x¾‡BL
-endstream
-endobj
-2 0 obj
-<</Type /Page
-/Resources <</ProcSet [/PDF /Text /ImageB /ImageC /ImageI]
-/ExtGState <</G3 3 0 R>>>>
-/MediaBox [0 0 28.08 28.08]
-/Contents 4 0 R
-/StructParents 0
-/Parent 5 0 R>>
-endobj
-5 0 obj
-<</Type /Pages
-/Count 1
-/Kids [2 0 R]>>
-endobj
-6 0 obj
-<</Type /Catalog
-/Pages 5 0 R>>
-endobj
-xref
-0 7
-0000000000 65535 f 
-0000000015 00000 n 
-0000000582 00000 n 
-0000000301 00000 n 
-0000000338 00000 n 
-0000000774 00000 n 
-0000000829 00000 n 
-trailer
-<</Size 7
-/Root 6 0 R
-/Info 1 0 R>>
-startxref
-876
-%%EOF

+ 0 - 15
iOSClient/Images.xcassets/audioOn.imageset/Contents.json

@@ -1,15 +0,0 @@
-{
-  "images" : [
-    {
-      "filename" : "audioOn.pdf",
-      "idiom" : "universal"
-    }
-  ],
-  "info" : {
-    "author" : "xcode",
-    "version" : 1
-  },
-  "properties" : {
-    "preserves-vector-representation" : true
-  }
-}

+ 0 - 52
iOSClient/Images.xcassets/audioOn.imageset/audioOn.pdf

@@ -1,52 +0,0 @@
-%PDF-1.4
-%Óëéá
-1 0 obj
-<</Creator (Mozilla/5.0 \(Macintosh; Intel Mac OS X 10_15_7\) AppleWebKit/537.36 \(KHTML, like Gecko\) BoxySVG/3.42.2 Chrome/83.0.4103.122 Electron/9.1.2 Safari/537.36)
-/Producer (Skia/PDF m83)
-/CreationDate (D:20201031060355+00'00')
-/ModDate (D:20201031060355+00'00')>>
-endobj
-3 0 obj
-<</ca 1
-/BM /Normal>>
-endobj
-4 0 obj
-<</Filter /FlateDecode
-/Length 232>> stream
-xœU�MnÄ0…÷>ëJC
Ž
9Á¬»šXýY4•ÚÞ_ꃸÕÔ–‚	�Çg³¶=Uìߥê\�æQ>KÔD¬>î�_Ïåö@ÐlìCDª¦Óÿ&�×F¯ßE6jBGœ:ëNïnî9t°ôŠ%$;9»ž,HDi–ˆ�Å–ä¯MŒ}#Šó*Îð×Êf1Àa ¬hvª‡Î2kDc“°ƒØÁ/m
_Ä38{¨�uª¬	؃ªƒ×$ÔÆ{B´BF„@ò¾goc¼Ï¯ë,�vx7èÐag@Aë·üÖòûV^ÊöÄßVì
-endstream
-endobj
-2 0 obj
-<</Type /Page
-/Resources <</ProcSet [/PDF /Text /ImageB /ImageC /ImageI]
-/ExtGState <</G3 3 0 R>>>>
-/MediaBox [0 0 28.08 28.08]
-/Contents 4 0 R
-/StructParents 0
-/Parent 5 0 R>>
-endobj
-5 0 obj
-<</Type /Pages
-/Count 1
-/Kids [2 0 R]>>
-endobj
-6 0 obj
-<</Type /Catalog
-/Pages 5 0 R>>
-endobj
-xref
-0 7
-0000000000 65535 f 
-0000000015 00000 n 
-0000000640 00000 n 
-0000000301 00000 n 
-0000000338 00000 n 
-0000000832 00000 n 
-0000000887 00000 n 
-trailer
-<</Size 7
-/Root 6 0 R
-/Info 1 0 R>>
-startxref
-934
-%%EOF

+ 0 - 15
iOSClient/Images.xcassets/audioPlayFull.imageset/Contents.json

@@ -1,15 +0,0 @@
-{
-  "images" : [
-    {
-      "idiom" : "universal",
-      "filename" : "audioPlayFull.pdf"
-    }
-  ],
-  "info" : {
-    "version" : 1,
-    "author" : "xcode"
-  },
-  "properties" : {
-    "preserves-vector-representation" : true
-  }
-}

BIN
iOSClient/Images.xcassets/audioPlayFull.imageset/audioPlayFull.pdf


+ 0 - 15
iOSClient/Images.xcassets/bell.imageset/Contents.json

@@ -1,15 +0,0 @@
-{
-  "images" : [
-    {
-      "filename" : "bell-outline.pdf",
-      "idiom" : "universal"
-    }
-  ],
-  "info" : {
-    "author" : "xcode",
-    "version" : 1
-  },
-  "properties" : {
-    "preserves-vector-representation" : true
-  }
-}

BIN
iOSClient/Images.xcassets/bell.imageset/bell-outline.pdf


+ 0 - 15
iOSClient/Images.xcassets/bolt.imageset/Contents.json

@@ -1,15 +0,0 @@
-{
-  "images" : [
-    {
-      "filename" : "lightning-bolt-outline.svg",
-      "idiom" : "universal"
-    }
-  ],
-  "info" : {
-    "author" : "xcode",
-    "version" : 1
-  },
-  "properties" : {
-    "preserves-vector-representation" : true
-  }
-}

+ 0 - 1
iOSClient/Images.xcassets/bolt.imageset/lightning-bolt-outline.svg

@@ -1 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="24" height="24" viewBox="0 0 24 24"><path d="M11 9.47V11H14.76L13 14.53V13H9.24L11 9.47M13 1L6 15H11V23L18 9H13V1Z" /></svg>

+ 0 - 15
iOSClient/Images.xcassets/captions.bubble.imageset/Contents.json

@@ -1,15 +0,0 @@
-{
-  "images" : [
-    {
-      "filename" : "subtitles-outline.svg",
-      "idiom" : "universal"
-    }
-  ],
-  "info" : {
-    "author" : "xcode",
-    "version" : 1
-  },
-  "properties" : {
-    "preserves-vector-representation" : true
-  }
-}

+ 0 - 1
iOSClient/Images.xcassets/captions.bubble.imageset/subtitles-outline.svg

@@ -1 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="24" height="24" viewBox="0 0 24 24"><path d="M20,4A2,2 0 0,1 22,6V18A2,2 0 0,1 20,20H4A2,2 0 0,1 2,18V6A2,2 0 0,1 4,4H20M20,18V6H4V18H20M6,10H8V12H6V10M6,14H14V16H6V14M16,14H18V16H16V14M10,10H18V12H10V10Z" /></svg>

+ 0 - 15
iOSClient/Images.xcassets/doc.on.clipboard.imageset/Contents.json

@@ -1,15 +0,0 @@
-{
-  "images" : [
-    {
-      "filename" : "doc.on.clipboard.svg",
-      "idiom" : "universal"
-    }
-  ],
-  "info" : {
-    "author" : "xcode",
-    "version" : 1
-  },
-  "properties" : {
-    "preserves-vector-representation" : true
-  }
-}

+ 0 - 1
iOSClient/Images.xcassets/doc.on.clipboard.imageset/doc.on.clipboard.svg

@@ -1 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="24" height="24" viewBox="0 0 24 24"><path d="M15 23C13.9 23 13 22.11 13 21V12C13 10.9 13.9 10 15 10H19L23 14V21C23 22.11 22.11 23 21 23H15M15 21H21V14.83L18.17 12H15V21M19 3C20.1 3 21 3.9 21 5V9.17L19.83 8H19V5H17V7H7V5H5V19H11V21H5C3.9 21 3 20.1 3 19V5C3 3.9 3.9 3 5 3H9.18C9.6 1.84 10.7 1 12 1C13.3 1 14.4 1.84 14.82 3H19M12 3C11.45 3 11 3.45 11 4C11 4.55 11.45 5 12 5C12.55 5 13 4.55 13 4C13 3.45 12.55 3 12 3Z" /></svg>

+ 0 - 1
iOSClient/Images.xcassets/doc.on.doc.imageset/copy.svg

@@ -1 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="24" height="24" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z" /></svg>

BIN
iOSClient/Images.xcassets/doc.text.viewfinder.imageset/scan.pdf


+ 0 - 26
iOSClient/Images.xcassets/encrypted.imageset/Contents.json

@@ -1,26 +0,0 @@
-{
-  "images" : [
-    {
-      "filename" : "encrypted.png",
-      "idiom" : "universal",
-      "scale" : "1x"
-    },
-    {
-      "filename" : "encrypted@2x.png",
-      "idiom" : "universal",
-      "scale" : "2x"
-    },
-    {
-      "filename" : "encrypted@3x.png",
-      "idiom" : "universal",
-      "scale" : "3x"
-    }
-  ],
-  "info" : {
-    "author" : "xcode",
-    "version" : 1
-  },
-  "properties" : {
-    "preserves-vector-representation" : true
-  }
-}

BIN
iOSClient/Images.xcassets/encrypted.imageset/encrypted.png


BIN
iOSClient/Images.xcassets/encrypted.imageset/encrypted@2x.png


BIN
iOSClient/Images.xcassets/encrypted.imageset/encrypted@3x.png


+ 0 - 15
iOSClient/Images.xcassets/forward.imageset/Contents.json

@@ -1,15 +0,0 @@
-{
-  "images" : [
-    {
-      "filename" : "forward.svg",
-      "idiom" : "universal"
-    }
-  ],
-  "info" : {
-    "author" : "xcode",
-    "version" : 1
-  },
-  "properties" : {
-    "preserves-vector-representation" : true
-  }
-}

+ 0 - 1
iOSClient/Images.xcassets/forward.imageset/forward.svg

@@ -1 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="24" height="24" viewBox="0 0 24 24"><path d="M15,9.9L18,12L15,14.1V9.9M6,9.9L9,12L6,14.1V9.9M13,6V18L21.5,12L13,6M4,6V18L12.5,12L4,6Z" /></svg>

+ 0 - 15
iOSClient/Images.xcassets/gobackward.10.imageset/Contents.json

@@ -1,15 +0,0 @@
-{
-  "images" : [
-    {
-      "filename" : "gobackward.15.svg",
-      "idiom" : "universal"
-    }
-  ],
-  "info" : {
-    "author" : "xcode",
-    "version" : 1
-  },
-  "properties" : {
-    "preserves-vector-representation" : true
-  }
-}

+ 0 - 4
iOSClient/Images.xcassets/gobackward.10.imageset/gobackward.15.svg

@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg version="1.1" width="24" height="24" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
-  <path d="M 13.5 3 C 8.529 3 4.5 7.029 4.5 12 L 1.5 12 L 5.5 16 L 9.5 12 L 6.5 12 C 6.5 8.134 9.634 5 13.5 5 C 17.366 5 20.5 8.134 20.5 12 C 20.5 15.866 17.366 19 13.5 19 C 12 19 10.59 18.5 9.44 17.7 L 8 19.14 C 9.54 20.3 11.44 21 13.5 21 C 18.471 21 22.5 16.971 22.5 12 C 22.5 7.029 18.471 3 13.5 3 M 15.5 12 C 15.5 10.895 14.605 10 13.5 10 C 12.395 10 11.5 10.895 11.5 12 C 11.5 13.105 12.395 14 13.5 14 C 14.605 14 15.5 13.105 15.5 12 Z"/>
-</svg>

+ 0 - 15
iOSClient/Images.xcassets/goforward.10.imageset/Contents.json

@@ -1,15 +0,0 @@
-{
-  "images" : [
-    {
-      "filename" : "goforward.15.svg",
-      "idiom" : "universal"
-    }
-  ],
-  "info" : {
-    "author" : "xcode",
-    "version" : 1
-  },
-  "properties" : {
-    "preserves-vector-representation" : true
-  }
-}

+ 0 - 4
iOSClient/Images.xcassets/goforward.10.imageset/goforward.15.svg

@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg version="1.1" width="24" height="24" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
-  <path d="M 13.5 21 C 8.529 21 4.5 16.971 4.5 12 L 1.5 12 L 5.5 8 L 9.5 12 L 6.5 12 C 6.5 15.866 9.634 19 13.5 19 C 17.366 19 20.5 15.866 20.5 12 C 20.5 8.134 17.366 5 13.5 5 C 12 5 10.59 5.5 9.44 6.3 L 8 4.86 C 9.54 3.7 11.44 3 13.5 3 C 18.471 3 22.5 7.029 22.5 12 C 22.5 16.971 18.471 21 13.5 21 M 15.5 12 C 15.5 13.105 14.605 14 13.5 14 C 12.395 14 11.5 13.105 11.5 12 C 11.5 10.895 12.395 10 13.5 10 C 14.605 10 15.5 10.895 15.5 12 Z" transform="matrix(-1, 0, 0, -1, 24, 24)"/>
-</svg>

+ 0 - 1
iOSClient/Images.xcassets/play.fill.imageset/play.svg

@@ -1 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="24" height="24" viewBox="0 0 24 24"><path d="M8,5.14V19.14L19,12.14L8,5.14Z" /></svg>

+ 0 - 16
iOSClient/Images.xcassets/plus-slash-minus.imageset/Contents.json

@@ -1,16 +0,0 @@
-{
-  "images" : [
-    {
-      "filename" : "plus-slash-minus.pdf",
-      "idiom" : "universal"
-    }
-  ],
-  "info" : {
-    "author" : "xcode",
-    "version" : 1
-  },
-  "properties" : {
-    "preserves-vector-representation" : true,
-    "template-rendering-intent" : "template"
-  }
-}

BIN
iOSClient/Images.xcassets/plus-slash-minus.imageset/plus-slash-minus.pdf


+ 0 - 26
iOSClient/Images.xcassets/plus.imageset/Contents.json

@@ -1,26 +0,0 @@
-{
-  "images" : [
-    {
-      "filename" : "add.png",
-      "idiom" : "universal",
-      "scale" : "1x"
-    },
-    {
-      "filename" : "add@2x.png",
-      "idiom" : "universal",
-      "scale" : "2x"
-    },
-    {
-      "filename" : "add@3x.png",
-      "idiom" : "universal",
-      "scale" : "3x"
-    }
-  ],
-  "info" : {
-    "author" : "xcode",
-    "version" : 1
-  },
-  "properties" : {
-    "preserves-vector-representation" : true
-  }
-}

BIN
iOSClient/Images.xcassets/plus.imageset/add.png


BIN
iOSClient/Images.xcassets/plus.imageset/add@2x.png


BIN
iOSClient/Images.xcassets/plus.imageset/add@3x.png


+ 0 - 15
iOSClient/Images.xcassets/recent.imageset/Contents.json

@@ -1,15 +0,0 @@
-{
-  "images" : [
-    {
-      "filename" : "recent.pdf",
-      "idiom" : "universal"
-    }
-  ],
-  "info" : {
-    "author" : "xcode",
-    "version" : 1
-  },
-  "properties" : {
-    "preserves-vector-representation" : true
-  }
-}

BIN
iOSClient/Images.xcassets/recent.imageset/recent.pdf


+ 0 - 15
iOSClient/Images.xcassets/scan.imageset/Contents.json

@@ -1,15 +0,0 @@
-{
-  "images" : [
-    {
-      "filename" : "icons8-scan.svg",
-      "idiom" : "universal"
-    }
-  ],
-  "info" : {
-    "author" : "xcode",
-    "version" : 1
-  },
-  "properties" : {
-    "preserves-vector-representation" : true
-  }
-}

+ 0 - 1
iOSClient/Images.xcassets/scan.imageset/icons8-scan.svg

@@ -1 +0,0 @@
-<svg fill="#000000" xmlns="http://www.w3.org/2000/svg"  viewBox="0 0 24 24" width="24px" height="24px"><path d="M 2,5 C 2,3.34 3.34,2 5,2 H 7.5 V 4 H 5 C 4.44,4 4,4.44 4,5 V 7.5 H 2 Z M 19,4 H 16.5 V 2 H 19 c 1.65,0 3,1.34 3,3 V 7.5 H 20 V 5 C 20,4.44 19.55,4 19,4 Z M 4,16.5 V 19 c 0,0.55 0.44,1 1,1 h 2.5 v 2 H 5 C 3.34,22 2,20.65 2,19 V 16.5 Z M 20,19 v -2.5 h 2 V 19 c 0,1.65 -1.35,3 -3,3 H 16.5 V 20 H 19 c 0.55,0 1,-0.45 1,-1 z M 17,13 H 7 v -2 h 10 z"/></svg>

+ 1 - 4
iOSClient/Images.xcassets/doc.text.viewfinder.imageset/Contents.json → iOSClient/Images.xcassets/speaker0.imageset/Contents.json

@@ -1,15 +1,12 @@
 {
 {
   "images" : [
   "images" : [
     {
     {
-      "filename" : "scan.pdf",
+      "filename" : "speaker0.svg",
       "idiom" : "universal"
       "idiom" : "universal"
     }
     }
   ],
   ],
   "info" : {
   "info" : {
     "author" : "xcode",
     "author" : "xcode",
     "version" : 1
     "version" : 1
-  },
-  "properties" : {
-    "preserves-vector-representation" : true
   }
   }
 }
 }

+ 8 - 0
iOSClient/Images.xcassets/speaker0.imageset/speaker0.svg

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg viewBox="0,0,256,256" width="50px" height="50px" fill-rule="nonzero" xmlns="http://www.w3.org/2000/svg">
+  <g fill="#000000" fill-rule="nonzero" stroke="none" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="10" stroke-dasharray="" stroke-dashoffset="0" font-family="none" font-weight="none" font-size="none" text-anchor="none" style="mix-blend-mode: normal" transform="matrix(1, 0, 0, 1, 16.912527, 1.101919)">
+    <g transform="translate(239.02716,16.80287) rotate(90) scale(5.12,5.12)">
+      <path d="M24.15625,3c-0.30469,0 -0.60547,0.0625 -0.90625,0.15625c-0.60547,0.19141 -1.18359,0.55078 -1.6875,1.0625l-11.75,11.75h-6.8125c-1.66797,0 -3.03125,1.36328 -3.03125,3.03125v12c0,1.66797 1.36328,3.03125 3.03125,3.03125h6.8125l11.71875,11.65625c1.11719,1.12109 2.55078,1.61328 3.71875,1.0625c1.17578,-0.55469 1.75,-1.89062 1.75,-3.4375v-37c0,-1.5 -0.76562,-2.74609 -1.9375,-3.15625c-0.29297,-0.10156 -0.60156,-0.15625 -0.90625,-0.15625zM24.1875,5c0.10156,0 0.17969,0.00781 0.25,0.03125c0.28516,0.09766 0.5625,0.35156 0.5625,1.28125v37c0,1.06641 -0.35156,1.54297 -0.59375,1.65625c-0.24219,0.11328 -0.73047,0.125 -1.5,-0.65625l-12.59375,-12.59375c-0.01953,-0.01172 -0.04297,-0.02344 -0.0625,-0.03125c0.07422,0.06641 -0.25,-0.56641 -0.25,-0.9375v-11.5c0,-0.37109 0.33594,-1.01172 0.25,-0.9375c0.02344,-0.01953 0.04297,-0.03906 0.0625,-0.0625l12.65625,-12.625c0.46875,-0.47266 0.91016,-0.62109 1.21875,-0.625zM3,18.03125h5.1875c-0.12891,0.38281 -0.1875,0.80078 -0.1875,1.21875v11.5c0,0.41797 0.0625,0.83203 0.1875,1.21875h-5.1875c-0.53906,0 -0.96875,-0.42969 -0.96875,-0.96875v-12c0,-0.53906 0.42969,-0.96875 0.96875,-0.96875zM31.90625,18.96875c-0.04297,0.00781 -0.08594,0.01953 -0.125,0.03125c-0.375,0.06641 -0.67578,0.33984 -0.78125,0.70313c-0.10547,0.36719 0.00391,0.75781 0.28125,1.01563l4.28125,4.28125l-4.28125,4.28125c-0.39844,0.39844 -0.39844,1.03906 0,1.4375c0.39844,0.39844 1.03906,0.39844 1.4375,0l4.28125,-4.28125l4.28125,4.28125c0.39844,0.39844 1.03906,0.39844 1.4375,0c0.39844,-0.39844 0.39844,-1.03906 0,-1.4375l-4.28125,-4.28125l4.28125,-4.28125c0.32422,-0.30078 0.41016,-0.77734 0.21484,-1.17187c-0.19141,-0.39844 -0.625,-0.61719 -1.05859,-0.54687c-0.22266,0.02344 -0.43359,0.125 -0.59375,0.28125l-4.28125,4.28125l-4.28125,-4.28125c-0.20703,-0.22266 -0.50781,-0.33594 -0.8125,-0.3125z"/>
+    </g>
+  </g>
+</svg>

+ 1 - 4
iOSClient/Images.xcassets/play.fill.imageset/Contents.json → iOSClient/Images.xcassets/speaker1.imageset/Contents.json

@@ -1,15 +1,12 @@
 {
 {
   "images" : [
   "images" : [
     {
     {
-      "filename" : "play.svg",
+      "filename" : "speaker1.svg",
       "idiom" : "universal"
       "idiom" : "universal"
     }
     }
   ],
   ],
   "info" : {
   "info" : {
     "author" : "xcode",
     "author" : "xcode",
     "version" : 1
     "version" : 1
-  },
-  "properties" : {
-    "preserves-vector-representation" : true
   }
   }
 }
 }

+ 8 - 0
iOSClient/Images.xcassets/speaker1.imageset/speaker1.svg

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg viewBox="0,0,256,256" width="50px" height="50px" fill-rule="nonzero" xmlns="http://www.w3.org/2000/svg">
+  <g fill="#000000" fill-rule="nonzero" stroke="none" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="10" stroke-dasharray="" stroke-dashoffset="0" font-family="none" font-weight="none" font-size="none" text-anchor="none" style="mix-blend-mode: normal" transform="matrix(1, 0, 0, 1, 29.158455, 5.359102)">
+    <g transform="translate(226.78124,30.5609) rotate(90) scale(5.12,5.12)">
+      <path d="M24.15625,3c-0.30469,0 -0.60547,0.0625 -0.90625,0.15625c-0.60547,0.19141 -1.18359,0.55078 -1.6875,1.0625l-11.75,11.75h-6.8125c-1.66797,0 -3.03125,1.36328 -3.03125,3.03125v12c0,1.66797 1.36328,3.03125 3.03125,3.03125h6.8125l11.71875,11.65625c1.11719,1.12109 2.55078,1.61328 3.71875,1.0625c1.17578,-0.55469 1.75,-1.89062 1.75,-3.4375v-37c0,-1.5 -0.76562,-2.74609 -1.9375,-3.15625c-0.29297,-0.10156 -0.60156,-0.15625 -0.90625,-0.15625zM24.1875,5c0.10156,0 0.17969,0.00781 0.25,0.03125c0.28516,0.09766 0.5625,0.35156 0.5625,1.28125v37c0,1.06641 -0.35156,1.54297 -0.59375,1.65625c-0.24219,0.11328 -0.73047,0.125 -1.5,-0.65625l-12.59375,-12.59375c-0.01953,-0.01172 -0.04297,-0.02344 -0.0625,-0.03125c0.07422,0.06641 -0.25,-0.56641 -0.25,-0.9375v-11.5c0,-0.37109 0.33594,-1.01172 0.25,-0.9375c0.02344,-0.01953 0.04297,-0.03906 0.0625,-0.0625l12.65625,-12.625c0.46875,-0.47266 0.91016,-0.62109 1.21875,-0.625zM3,18.03125h5.1875c-0.12891,0.38281 -0.1875,0.80078 -0.1875,1.21875v11.5c0,0.41797 0.0625,0.83203 0.1875,1.21875h-5.1875c-0.53906,0 -0.96875,-0.42969 -0.96875,-0.96875v-12c0,-0.53906 0.42969,-0.96875 0.96875,-0.96875zM30.53125,18.40625c-0.48437,0.05859 -0.85156,0.45703 -0.875,0.94531c-0.02344,0.48438 0.30469,0.91797 0.78125,1.02344c2.04688,0.53516 3.5625,2.40234 3.5625,4.625c0,2.22266 -1.51562,4.08984 -3.5625,4.625c-0.53516,0.13672 -0.85547,0.68359 -0.71875,1.21875c0.13672,0.53516 0.68359,0.85547 1.21875,0.71875c2.91016,-0.76172 5.0625,-3.42578 5.0625,-6.5625c0,-3.13672 -2.15234,-5.80078 -5.0625,-6.5625c-0.13281,-0.03906 -0.26953,-0.04687 -0.40625,-0.03125z"/>
+    </g>
+  </g>
+</svg>

+ 1 - 4
iOSClient/Images.xcassets/doc.on.doc.imageset/Contents.json → iOSClient/Images.xcassets/speaker2.imageset/Contents.json

@@ -1,15 +1,12 @@
 {
 {
   "images" : [
   "images" : [
     {
     {
-      "filename" : "copy.svg",
+      "filename" : "speaker2.svg",
       "idiom" : "universal"
       "idiom" : "universal"
     }
     }
   ],
   ],
   "info" : {
   "info" : {
     "author" : "xcode",
     "author" : "xcode",
     "version" : 1
     "version" : 1
-  },
-  "properties" : {
-    "preserves-vector-representation" : true
   }
   }
 }
 }

File diff suppressed because it is too large
+ 4 - 0
iOSClient/Images.xcassets/speaker2.imageset/speaker2.svg


+ 1 - 4
iOSClient/Images.xcassets/video.imageset/Contents.json → iOSClient/Images.xcassets/speaker3.imageset/Contents.json

@@ -1,15 +1,12 @@
 {
 {
   "images" : [
   "images" : [
     {
     {
-      "filename" : "video.svg",
+      "filename" : "speaker3.svg",
       "idiom" : "universal"
       "idiom" : "universal"
     }
     }
   ],
   ],
   "info" : {
   "info" : {
     "author" : "xcode",
     "author" : "xcode",
     "version" : 1
     "version" : 1
-  },
-  "properties" : {
-    "preserves-vector-representation" : true
   }
   }
 }
 }

File diff suppressed because it is too large
+ 4 - 0
iOSClient/Images.xcassets/speaker3.imageset/speaker3.svg


+ 0 - 15
iOSClient/Images.xcassets/textRecognition.imageset/Contents.json

@@ -1,15 +0,0 @@
-{
-  "images" : [
-    {
-      "filename" : "textRecognition.png",
-      "idiom" : "universal"
-    }
-  ],
-  "info" : {
-    "author" : "xcode",
-    "version" : 1
-  },
-  "properties" : {
-    "preserves-vector-representation" : true
-  }
-}

BIN
iOSClient/Images.xcassets/textRecognition.imageset/textRecognition.png


+ 0 - 15
iOSClient/Images.xcassets/themeLightDark.imageset/Contents.json

@@ -1,15 +0,0 @@
-{
-  "images" : [
-    {
-      "idiom" : "universal",
-      "filename" : "themeLightDark.pdf"
-    }
-  ],
-  "info" : {
-    "version" : 1,
-    "author" : "xcode"
-  },
-  "properties" : {
-    "preserves-vector-representation" : true
-  }
-}

BIN
iOSClient/Images.xcassets/themeLightDark.imageset/themeLightDark.pdf


+ 0 - 15
iOSClient/Images.xcassets/transferDown.imageset/Contents.json

@@ -1,15 +0,0 @@
-{
-  "images" : [
-    {
-      "idiom" : "universal",
-      "filename" : "transferDown.pdf"
-    }
-  ],
-  "info" : {
-    "version" : 1,
-    "author" : "xcode"
-  },
-  "properties" : {
-    "preserves-vector-representation" : true
-  }
-}

+ 0 - 53
iOSClient/Images.xcassets/transferDown.imageset/transferDown.pdf

@@ -1,53 +0,0 @@
-%PDF-1.4
-%Óëéá
-1 0 obj
-<</Creator (Chromium)
-/Producer (Skia/PDF m69)
-/CreationDate (D:20190715105909+00'00')
-/ModDate (D:20190715105909+00'00')>>
-endobj
-2 0 obj
-<</Filter /FlateDecode
-/Length 132>> stream
-xœUŽK
-‚1„÷sЬk“ØÖžÀµ+ >ýõþ`šZÑfÈ|h­þ(Ú¬ÃϪé´à�NXKò<㸢»å©©œóÖoÿ7;Üì#]_àLJK·D
»�ª©·2
-ÕÑÐ2‰óh°:œÆ_Ú`ßK½T»[,$2ã†.8ؼQ.Â
-endstream
-endobj
-3 0 obj
-<</Type /Catalog
-/Pages 4 0 R>>
-endobj
-4 0 obj
-<</Type /Pages
-/Count 1
-/Kids [5 0 R]>>
-endobj
-5 0 obj
-<</Type /Page
-/Resources <</ProcSets [/PDF /Text /ImageB /ImageC /ImageI]
-/ExtGState <</G0 6 0 R>>>>
-/MediaBox [0 0 330 330]
-/Contents 2 0 R
-/Parent 4 0 R>>
-endobj
-6 0 obj
-<</ca 1
-/BM /Normal>>
-endobj
-xref
-0 7
-0000000000 65535 f 
-0000000015 00000 n 
-0000000154 00000 n 
-0000000356 00000 n 
-0000000403 00000 n 
-0000000458 00000 n 
-0000000630 00000 n 
-trailer
-<</Size 7
-/Root 3 0 R
-/Info 1 0 R>>
-startxref
-667
-%%EOF

+ 0 - 15
iOSClient/Images.xcassets/tray.and.arrow.down.imageset/Contents.json

@@ -1,15 +0,0 @@
-{
-  "images" : [
-    {
-      "filename" : "archive-arrow-down-outline.svg",
-      "idiom" : "universal"
-    }
-  ],
-  "info" : {
-    "author" : "xcode",
-    "version" : 1
-  },
-  "properties" : {
-    "preserves-vector-representation" : true
-  }
-}

+ 0 - 1
iOSClient/Images.xcassets/tray.and.arrow.down.imageset/archive-arrow-down-outline.svg

@@ -1 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="24" height="24" viewBox="0 0 24 24"><path d="M20 21H4V10H6V19H18V10H20V21M3 3H21V9H3V3M5 5V7H19V5M10.5 11V14H8L12 18L16 14H13.5V11" /></svg>

+ 0 - 26
iOSClient/Images.xcassets/utorrent.imageset/Contents.json

@@ -1,26 +0,0 @@
-{
-  "images" : [
-    {
-      "filename" : "utorrent.png",
-      "idiom" : "universal",
-      "scale" : "1x"
-    },
-    {
-      "filename" : "utorrent@2x.png",
-      "idiom" : "universal",
-      "scale" : "2x"
-    },
-    {
-      "filename" : "utorrent@3x.png",
-      "idiom" : "universal",
-      "scale" : "3x"
-    }
-  ],
-  "info" : {
-    "author" : "xcode",
-    "version" : 1
-  },
-  "properties" : {
-    "preserves-vector-representation" : true
-  }
-}

BIN
iOSClient/Images.xcassets/utorrent.imageset/utorrent.png


BIN
iOSClient/Images.xcassets/utorrent.imageset/utorrent@2x.png


BIN
iOSClient/Images.xcassets/utorrent.imageset/utorrent@3x.png


+ 0 - 1
iOSClient/Images.xcassets/video.imageset/video.svg

@@ -1 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="24" height="24" viewBox="0 0 24 24"><path d="M15,8V16H5V8H15M16,6H4A1,1 0 0,0 3,7V17A1,1 0 0,0 4,18H16A1,1 0 0,0 17,17V13.5L21,17.5V6.5L17,10.5V7A1,1 0 0,0 16,6Z" /></svg>

+ 0 - 16
iOSClient/Images.xcassets/zoomInMedia.imageset/Contents.json

@@ -1,16 +0,0 @@
-{
-  "images" : [
-    {
-      "filename" : "plus.pdf",
-      "idiom" : "universal"
-    }
-  ],
-  "info" : {
-    "author" : "xcode",
-    "version" : 1
-  },
-  "properties" : {
-    "preserves-vector-representation" : true,
-    "template-rendering-intent" : "template"
-  }
-}

BIN
iOSClient/Images.xcassets/zoomInMedia.imageset/plus.pdf


+ 0 - 16
iOSClient/Images.xcassets/zoomOutMedia.imageset/Contents.json

@@ -1,16 +0,0 @@
-{
-  "images" : [
-    {
-      "filename" : "minus.pdf",
-      "idiom" : "universal"
-    }
-  ],
-  "info" : {
-    "author" : "xcode",
-    "version" : 1
-  },
-  "properties" : {
-    "preserves-vector-representation" : true,
-    "template-rendering-intent" : "template"
-  }
-}

BIN
iOSClient/Images.xcassets/zoomOutMedia.imageset/minus.pdf


+ 9 - 12
iOSClient/Login/NCLoginWeb.swift

@@ -28,7 +28,6 @@ import FloatingPanel
 
 
 class NCLoginWeb: UIViewController {
 class NCLoginWeb: UIViewController {
 
 
-    var activityIndicator: UIActivityIndicatorView!
     var webView: WKWebView?
     var webView: WKWebView?
     let appDelegate = UIApplication.shared.delegate as! AppDelegate
     let appDelegate = UIApplication.shared.delegate as! AppDelegate
     var titleView: String = ""
     var titleView: String = ""
@@ -93,16 +92,9 @@ class NCLoginWeb: UIViewController {
         webView!.topAnchor.constraint(equalTo: view.topAnchor, constant: 0).isActive = true
         webView!.topAnchor.constraint(equalTo: view.topAnchor, constant: 0).isActive = true
         webView!.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: 0).isActive = true
         webView!.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: 0).isActive = true
 
 
-        activityIndicator = UIActivityIndicatorView(style: .medium)
-        activityIndicator.center = self.view.center
-        activityIndicator.startAnimating()
-        
-        self.view.addSubview(activityIndicator)
-        
         // AppConfig
         // AppConfig
         if let serverUrl = configServerUrl {
         if let serverUrl = configServerUrl {
             if let username = self.configUsername, let password = configAppPassword {
             if let username = self.configUsername, let password = configAppPassword {
-                activityIndicator.stopAnimating()
                 createAccount(server: serverUrl, username: username, password: password)
                 createAccount(server: serverUrl, username: username, password: password)
                 return
                 return
             } else if let username = self.configUsername, let password = configPassword {
             } else if let username = self.configUsername, let password = configPassword {
@@ -157,6 +149,12 @@ class NCLoginWeb: UIViewController {
         }
         }
     }
     }
 
 
+    override func viewWillDisappear(_ animated: Bool) {
+        super.viewWillDisappear(animated)
+
+        NCActivityIndicator.shared.stop()
+    }
+
     override func viewDidDisappear(_ animated: Bool) {
     override func viewDidDisappear(_ animated: Bool) {
         super.viewDidDisappear(animated)
         super.viewDidDisappear(animated)
 
 
@@ -185,7 +183,6 @@ class NCLoginWeb: UIViewController {
     func getAppPassword(serverUrl: String, username: String, password: String) {
     func getAppPassword(serverUrl: String, username: String, password: String) {
         
         
         NextcloudKit.shared.getAppPassword(serverUrl: serverUrl, username: username, password: password) { token, data, error in
         NextcloudKit.shared.getAppPassword(serverUrl: serverUrl, username: username, password: password) { token, data, error in
-            self.activityIndicator.stopAnimating()
             if error == .success, let password = token {
             if error == .success, let password = token {
                 self.createAccount(server: serverUrl, username: username, password: password)
                 self.createAccount(server: serverUrl, username: username, password: password)
             } else {
             } else {
@@ -277,12 +274,12 @@ extension NCLoginWeb: WKNavigationDelegate {
     }
     }
 
 
     func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) {
     func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) {
-        print("didStartProvisionalNavigation")
+        NCActivityIndicator.shared.startActivity(style: .medium, blurEffect: false)
     }
     }
 
 
     func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
     func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
-        activityIndicator.stopAnimating()
-        print("didFinishProvisionalNavigation")
+
+        NCActivityIndicator.shared.stop()
 
 
         if loginFlowV2Available {
         if loginFlowV2Available {
             DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
             DispatchQueue.main.asyncAfter(deadline: .now() + 1) {

+ 33 - 5
iOSClient/Login/NCViewCertificateDetails.swift

@@ -22,6 +22,7 @@
 //
 //
 
 
 import UIKit
 import UIKit
+import SwiftUI
 
 
 public protocol NCViewCertificateDetailsDelegate: AnyObject {
 public protocol NCViewCertificateDetailsDelegate: AnyObject {
     func viewCertificateDetailsDismiss(host: String)
     func viewCertificateDetailsDismiss(host: String)
@@ -38,22 +39,26 @@ class NCViewCertificateDetails: UIViewController {
     @IBOutlet weak var scrollView: UIScrollView!
     @IBOutlet weak var scrollView: UIScrollView!
     @IBOutlet weak var textView: UITextView!
     @IBOutlet weak var textView: UITextView!
 
 
-    private let directoryCertificate = CCUtility.getDirectoryCerificates()!
     public var delegate: NCViewCertificateDetailsDelegate?
     public var delegate: NCViewCertificateDetailsDelegate?
     @objc public var host: String = ""
     @objc public var host: String = ""
+    public var fileNamePath: String = ""
+    @objc public var certificateTitle = NSLocalizedString("_certificate_view_", comment: "")
 
 
     // MARK: - View Life Cycle
     // MARK: - View Life Cycle
 
 
     override func viewDidLoad() {
     override func viewDidLoad() {
         super.viewDidLoad()
         super.viewDidLoad()
 
 
-        self.navigationItem.title = NSLocalizedString("_certificate_details_", comment: "")
+        self.navigationItem.title = certificateTitle
         buttonCancel.title = NSLocalizedString("_close_", comment: "")
         buttonCancel.title = NSLocalizedString("_close_", comment: "")
 
 
-        let certNamePathTXT = directoryCertificate + "/" + host + ".txt"
-        if FileManager.default.fileExists(atPath: certNamePathTXT) {
+        if fileNamePath.isEmpty {
+            fileNamePath = CCUtility.getDirectoryCerificates()! + "/" + host + ".txt"
+        }
+
+        if FileManager.default.fileExists(atPath: fileNamePath) {
             do {
             do {
-                let text = try String(contentsOfFile: certNamePathTXT, encoding: .utf8)
+                let text = try String(contentsOfFile: fileNamePath, encoding: .utf8)
                 let font = UIFont.systemFont(ofSize: 13)
                 let font = UIFont.systemFont(ofSize: 13)
                 let attributes = [NSAttributedString.Key.font: font] as [NSAttributedString.Key: Any]
                 let attributes = [NSAttributedString.Key.font: font] as [NSAttributedString.Key: Any]
                 var contentRect = NSString(string: text).boundingRect(with: CGSize(width: CGFloat.greatestFiniteMagnitude, height: 0), options: NSStringDrawingOptions.usesLineFragmentOrigin, attributes: attributes, context: nil)
                 var contentRect = NSString(string: text).boundingRect(with: CGSize(width: CGFloat.greatestFiniteMagnitude, height: 0), options: NSStringDrawingOptions.usesLineFragmentOrigin, attributes: attributes, context: nil)
@@ -95,3 +100,26 @@ class NCViewCertificateDetails: UIViewController {
         self.dismiss(animated: true, completion: nil)
         self.dismiss(animated: true, completion: nil)
     }
     }
 }
 }
+
+// MARK: - UIViewControllerRepresentable
+
+struct NCViewCertificateDetailsRepresentable: UIViewControllerRepresentable {
+
+    typealias UIViewControllerType = UINavigationController
+    var fileNamePath: String
+    var title: String
+
+    func makeUIViewController(context: Context) -> UINavigationController {
+
+        let storyboard = UIStoryboard(name: "NCViewCertificateDetails", bundle: nil)
+        let navigationController = storyboard.instantiateInitialViewController() as? UINavigationController
+        let viewController = navigationController?.topViewController as? NCViewCertificateDetails
+
+        viewController?.fileNamePath = fileNamePath
+        viewController?.certificateTitle = title
+
+        return navigationController!
+    }
+
+    func updateUIViewController(_ uiViewController: UINavigationController, context: Context) { }
+}

+ 35 - 60
iOSClient/Main/Collection Common/NCCollectionViewCommon.swift

@@ -353,59 +353,22 @@ class NCCollectionViewCommon: UIViewController, UIGestureRecognizerDelegate, UIS
     @objc func deleteFile(_ notification: NSNotification) {
     @objc func deleteFile(_ notification: NSNotification) {
 
 
         guard let userInfo = notification.userInfo as NSDictionary?,
         guard let userInfo = notification.userInfo as NSDictionary?,
-              let ocId = userInfo["ocId"] as? String,
-              let fileNameView = userInfo["fileNameView"] as? String,
-              let serverUrl = userInfo["serverUrl"] as? String,
-              serverUrl == self.serverUrl,
-              let account = userInfo["account"] as? String,
-              account == appDelegate.account,
-              let onlyLocalCache = userInfo["onlyLocalCache"] as? Bool
+              let error = userInfo["error"] as? NKError
         else { return }
         else { return }
 
 
-        if fileNameView.lowercased() == NCGlobal.shared.fileNameRichWorkspace.lowercased() {
-            reloadDataSourceNetwork(forced: true)
-        } else if onlyLocalCache {
-            self.collectionView?.reloadData()
-        } else {
-            let (indexPath, sameSections) = dataSource.deleteMetadata(ocId: ocId)
-            if let indexPath = indexPath, dataSource.metadatas.count > 0 {
-                if sameSections && (indexPath.section < collectionView.numberOfSections && indexPath.row < collectionView.numberOfItems(inSection: indexPath.section)) {
-                    collectionView?.performBatchUpdates({
-                        collectionView?.deleteItems(at: [indexPath])
-                    }, completion: { _ in
-                        self.collectionView?.reloadData()
-                    })
-                } else {
-                    self.collectionView?.reloadData()
-                }
-            } else {
-                reloadDataSource()
-            }
+        if error == .success {
+            reloadDataSource()
         }
         }
     }
     }
 
 
     @objc func moveFile(_ notification: NSNotification) {
     @objc func moveFile(_ notification: NSNotification) {
 
 
         guard let userInfo = notification.userInfo as NSDictionary?,
         guard let userInfo = notification.userInfo as NSDictionary?,
-              let ocId = userInfo["ocId"] as? String,
               let serverUrlFrom = userInfo["serverUrlFrom"] as? String,
               let serverUrlFrom = userInfo["serverUrlFrom"] as? String,
               serverUrlFrom == self.serverUrl
               serverUrlFrom == self.serverUrl
         else { return }
         else { return }
 
 
-        let (indexPath, sameSections) = dataSource.deleteMetadata(ocId: ocId)
-        if let indexPath = indexPath {
-            if sameSections && (indexPath.section < collectionView.numberOfSections && indexPath.row < collectionView.numberOfItems(inSection: indexPath.section)) {
-                collectionView?.performBatchUpdates({
-                    collectionView?.deleteItems(at: [indexPath])
-                }, completion: { _ in
-                    self.collectionView?.reloadData()
-                })
-            } else {
-                self.collectionView?.reloadData()
-            }
-        } else {
-            reloadDataSource()
-        }
+        reloadDataSource()
     }
     }
 
 
     @objc func copyFile(_ notification: NSNotification) {
     @objc func copyFile(_ notification: NSNotification) {
@@ -583,27 +546,13 @@ class NCCollectionViewCommon: UIViewController, UIGestureRecognizerDelegate, UIS
     @objc func uploadCancelFile(_ notification: NSNotification) {
     @objc func uploadCancelFile(_ notification: NSNotification) {
 
 
         guard let userInfo = notification.userInfo as NSDictionary?,
         guard let userInfo = notification.userInfo as NSDictionary?,
-              let ocId = userInfo["ocId"] as? String,
               let serverUrl = userInfo["serverUrl"] as? String,
               let serverUrl = userInfo["serverUrl"] as? String,
               serverUrl == self.serverUrl,
               serverUrl == self.serverUrl,
               let account = userInfo["account"] as? String,
               let account = userInfo["account"] as? String,
               account == appDelegate.account
               account == appDelegate.account
         else { return }
         else { return }
 
 
-        let (indexPath, sameSections) = dataSource.deleteMetadata(ocId: ocId)
-        if let indexPath = indexPath {
-            if sameSections && (indexPath.section < collectionView.numberOfSections && indexPath.row < collectionView.numberOfItems(inSection: indexPath.section)) {
-                collectionView?.performBatchUpdates({
-                    collectionView?.deleteItems(at: [indexPath])
-                }, completion: { _ in
-                    self.collectionView?.reloadData()
-                })
-            } else {
-                self.collectionView?.reloadData()
-            }
-        } else {
-            reloadDataSource()
-        }
+        reloadDataSource()
     }
     }
 
 
     @objc func triggerProgressTask(_ notification: NSNotification) {
     @objc func triggerProgressTask(_ notification: NSNotification) {
@@ -894,7 +843,7 @@ class NCCollectionViewCommon: UIViewController, UIGestureRecognizerDelegate, UIS
         if isEditMode { return }
         if isEditMode { return }
         guard let metadata = NCManageDatabase.shared.getMetadataFromOcId(objectId) else { return }
         guard let metadata = NCManageDatabase.shared.getMetadataFromOcId(objectId) else { return }
 
 
-        NCActionCenter.shared.openShare(viewController: self, metadata: metadata, indexPage: .sharing)
+        NCActionCenter.shared.openShare(viewController: self, metadata: metadata, page: .sharing)
     }
     }
 
 
     func tapMoreGridItem(with objectId: String, namedButtonMore: String, image: UIImage?, sender: Any) {
     func tapMoreGridItem(with objectId: String, namedButtonMore: String, image: UIImage?, sender: Any) {
@@ -1269,6 +1218,29 @@ class NCCollectionViewCommon: UIViewController, UIGestureRecognizerDelegate, UIS
                 }
                 }
             }
             }
         }
         }
+
+        // GROUPFOLDERS
+        if layoutKey == NCGlobal.shared.layoutViewGroupfolders && !pushed {
+
+            if let viewController = appDelegate.listGroupfoldersVC[serverUrlPush] {
+
+                if viewController.isViewLoaded {
+                    pushViewController(viewController: viewController)
+                }
+
+            } else {
+
+                if let viewController: NCGroupfolders = UIStoryboard(name: "NCGroupfolders", bundle: nil).instantiateInitialViewController() as? NCGroupfolders {
+
+                    viewController.serverUrl = serverUrlPush
+                    viewController.titleCurrentFolder = metadata.fileNameView
+
+                    appDelegate.listGroupfoldersVC[serverUrlPush] = viewController
+
+                    pushViewController(viewController: viewController)
+                }
+            }
+        }
     }
     }
 }
 }
 
 
@@ -1319,10 +1291,10 @@ extension NCCollectionViewCommon: UICollectionViewDelegate {
             
             
             let imageIcon = UIImage(contentsOfFile: CCUtility.getDirectoryProviderStorageIconOcId(metadata.ocId, etag: metadata.etag))
             let imageIcon = UIImage(contentsOfFile: CCUtility.getDirectoryProviderStorageIconOcId(metadata.ocId, etag: metadata.etag))
 
 
-            if metadata.classFile == NKCommon.TypeClassFile.image.rawValue || metadata.classFile == NKCommon.TypeClassFile.video.rawValue || metadata.classFile == NKCommon.TypeClassFile.audio.rawValue {
+            if metadata.isImage || metadata.isMovie {
                 var metadatas: [tableMetadata] = []
                 var metadatas: [tableMetadata] = []
                 for metadata in metadataSourceForAllSections {
                 for metadata in metadataSourceForAllSections {
-                    if metadata.classFile == NKCommon.TypeClassFile.image.rawValue || metadata.classFile == NKCommon.TypeClassFile.video.rawValue || metadata.classFile == NKCommon.TypeClassFile.audio.rawValue {
+                    if metadata.isImage || metadata.isMovie {
                         metadatas.append(metadata)
                         metadatas.append(metadata)
                     }
                     }
                 }
                 }
@@ -1680,6 +1652,9 @@ extension NCCollectionViewCommon: UICollectionViewDataSource {
             cell.fileTitleLabel?.attributedText = attributedString
             cell.fileTitleLabel?.attributedText = attributedString
         }
         }
 
 
+        // Add TAGS
+        cell.setTags(tags: Array(metadata.tags))
+
         // ** IMPORT MUST BE AT THE END **
         // ** IMPORT MUST BE AT THE END **
         //
         //
         if !metadata.isSharable {
         if !metadata.isSharable {
@@ -1712,7 +1687,7 @@ extension NCCollectionViewCommon: UICollectionViewDataSource {
                 if headerMenuButtonsCommand && !isSearchingMode {
                 if headerMenuButtonsCommand && !isSearchingMode {
                     let imageButton2 = isDirectoryE2EE ? UIImage(named: "folderEncrypted") : UIImage(named: "folder")
                     let imageButton2 = isDirectoryE2EE ? UIImage(named: "folderEncrypted") : UIImage(named: "folder")
                     let titleButton2 = isDirectoryE2EE ? NSLocalizedString("_create_folder_e2ee_", comment: "") : NSLocalizedString("_create_folder_", comment: "")
                     let titleButton2 = isDirectoryE2EE ? NSLocalizedString("_create_folder_e2ee_", comment: "") : NSLocalizedString("_create_folder_", comment: "")
-                    header.setButtonsCommand(heigt: NCGlobal.shared.heightButtonsCommand, imageButton1: UIImage(named: "addImage"), titleButton1: NSLocalizedString("_upload_", comment: ""), imageButton2: imageButton2, titleButton2: titleButton2, imageButton3: UIImage(named: "scan"), titleButton3: NSLocalizedString("_scan_", comment: ""))
+                    header.setButtonsCommand(heigt: NCGlobal.shared.heightButtonsCommand, imageButton1: UIImage(named: "addImage"), titleButton1: NSLocalizedString("_upload_", comment: ""), imageButton2: imageButton2, titleButton2: titleButton2, imageButton3: UIImage(systemName: "doc.text.viewfinder"), titleButton3: NSLocalizedString("_scan_", comment: ""))
                 } else {
                 } else {
                     header.setButtonsCommand(heigt: 0)
                     header.setButtonsCommand(heigt: 0)
                 }
                 }

+ 6 - 0
iOSClient/Main/Collection Common/NCGridCell.swift

@@ -22,6 +22,7 @@
 //
 //
 
 
 import UIKit
 import UIKit
+import TagListView
 
 
 class NCGridCell: UICollectionViewCell, UIGestureRecognizerDelegate, NCCellProtocol, NCTrashCellProtocol {
 class NCGridCell: UICollectionViewCell, UIGestureRecognizerDelegate, NCCellProtocol, NCTrashCellProtocol {
 
 
@@ -35,6 +36,7 @@ class NCGridCell: UICollectionViewCell, UIGestureRecognizerDelegate, NCCellProto
     @IBOutlet weak var buttonMore: UIButton!
     @IBOutlet weak var buttonMore: UIButton!
     @IBOutlet weak var imageVisualEffect: UIVisualEffectView!
     @IBOutlet weak var imageVisualEffect: UIVisualEffectView!
     @IBOutlet weak var progressView: UIProgressView!
     @IBOutlet weak var progressView: UIProgressView!
+    var tagListView: TagListView?
 
 
     internal var objectId = ""
     internal var objectId = ""
     private var user = ""
     private var user = ""
@@ -82,6 +84,10 @@ class NCGridCell: UICollectionViewCell, UIGestureRecognizerDelegate, NCCellProto
         get { return imageFavorite }
         get { return imageFavorite }
         set { imageFavorite = newValue }
         set { imageFavorite = newValue }
     }
     }
+    var cellTagListView: TagListView? {
+        get { return nil}
+        set { tagListView = nil }
+    }
 
 
     override func awakeFromNib() {
     override func awakeFromNib() {
         super.awakeFromNib()
         super.awakeFromNib()

+ 33 - 0
iOSClient/Main/Collection Common/NCListCell.swift

@@ -22,6 +22,7 @@
 //
 //
 
 
 import UIKit
 import UIKit
+import TagListView
 
 
 class NCListCell: UICollectionViewCell, UIGestureRecognizerDelegate, NCCellProtocol {
 class NCListCell: UICollectionViewCell, UIGestureRecognizerDelegate, NCCellProtocol {
 
 
@@ -44,6 +45,8 @@ class NCListCell: UICollectionViewCell, UIGestureRecognizerDelegate, NCCellProto
     @IBOutlet weak var titleTrailingConstraint: NSLayoutConstraint!
     @IBOutlet weak var titleTrailingConstraint: NSLayoutConstraint!
     @IBOutlet weak var infoTrailingConstraint: NSLayoutConstraint!
     @IBOutlet weak var infoTrailingConstraint: NSLayoutConstraint!
 
 
+    @IBOutlet weak var tagListView: TagListView!
+
     private var objectId = ""
     private var objectId = ""
     private var user = ""
     private var user = ""
 
 
@@ -105,6 +108,10 @@ class NCListCell: UICollectionViewCell, UIGestureRecognizerDelegate, NCCellProto
         get { return separator }
         get { return separator }
         set { separator = newValue }
         set { separator = newValue }
     }
     }
+    var cellTagListView: TagListView? {
+        get { return tagListView}
+        set { tagListView = newValue }
+    }
  
  
     override func awakeFromNib() {
     override func awakeFromNib() {
         super.awakeFromNib()
         super.awakeFromNib()
@@ -275,6 +282,32 @@ class NCListCell: UICollectionViewCell, UIGestureRecognizerDelegate, NCCellProto
         accessibilityLabel = label
         accessibilityLabel = label
         accessibilityValue = value
         accessibilityValue = value
     }
     }
+
+    func setTags(tags: [String]) {
+        tagListView.removeAllTags()
+        if tags.isEmpty {
+            tagListView.isHidden = true
+            labelInfo.isHidden = false
+        } else {
+            tagListView.isHidden = false
+            labelInfo.isHidden = true
+            if let tag = tags.first {
+                tagListView.addTag(tag)
+                if UIDevice.current.userInterfaceIdiom == .pad {
+                    if tags.count >= 2 {
+                        tagListView.addTag(tags[1])
+                    }
+                    if tags.count > 2 {
+                        tagListView.addTag("+\(tags.count-2)")
+                    }
+                } else {
+                    if tags.count > 1 {
+                        tagListView.addTag("+\(tags.count-1)")
+                    }
+                }
+            }
+        }
+    }
 }
 }
 
 
 protocol NCListCellDelegate: AnyObject {
 protocol NCListCellDelegate: AnyObject {

+ 62 - 22
iOSClient/Main/Collection Common/NCListCell.xib

@@ -1,71 +1,96 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <?xml version="1.0" encoding="UTF-8"?>
-<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="20037" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
-    <device id="retina4_7" orientation="portrait" appearance="light"/>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="21701" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
+    <device id="retina4_7" orientation="landscape" appearance="light"/>
     <dependencies>
     <dependencies>
         <deployment identifier="iOS"/>
         <deployment identifier="iOS"/>
-        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="20020"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="21678"/>
         <capability name="Safe area layout guides" minToolsVersion="9.0"/>
         <capability name="Safe area layout guides" minToolsVersion="9.0"/>
+        <capability name="System colors in document resources" minToolsVersion="11.0"/>
         <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
         <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
     </dependencies>
     </dependencies>
     <objects>
     <objects>
         <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
         <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
         <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
         <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
         <collectionViewCell opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" reuseIdentifier="listCell" id="jxV-Pk-fPt" customClass="NCListCell" customModule="Nextcloud" customModuleProvider="target">
         <collectionViewCell opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" reuseIdentifier="listCell" id="jxV-Pk-fPt" customClass="NCListCell" customModule="Nextcloud" customModuleProvider="target">
-            <rect key="frame" x="0.0" y="0.0" width="600" height="60"/>
+            <rect key="frame" x="0.0" y="0.0" width="669" height="148"/>
             <autoresizingMask key="autoresizingMask"/>
             <autoresizingMask key="autoresizingMask"/>
             <view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" insetsLayoutMarginsFromSafeArea="NO">
             <view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" insetsLayoutMarginsFromSafeArea="NO">
-                <rect key="frame" x="0.0" y="0.0" width="600" height="60"/>
+                <rect key="frame" x="0.0" y="0.0" width="669" height="148"/>
                 <autoresizingMask key="autoresizingMask"/>
                 <autoresizingMask key="autoresizingMask"/>
                 <subviews>
                 <subviews>
                     <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFill" translatesAutoresizingMaskIntoConstraints="NO" id="w2m-Vw-hpd" userLabel="ImageItem">
                     <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFill" translatesAutoresizingMaskIntoConstraints="NO" id="w2m-Vw-hpd" userLabel="ImageItem">
-                        <rect key="frame" x="10" y="10" width="40" height="40"/>
+                        <rect key="frame" x="10" y="54" width="40" height="40"/>
                         <constraints>
                         <constraints>
                             <constraint firstAttribute="height" constant="40" id="Dpd-Xj-z4U"/>
                             <constraint firstAttribute="height" constant="40" id="Dpd-Xj-z4U"/>
                             <constraint firstAttribute="width" constant="40" id="v0e-MW-EeE"/>
                             <constraint firstAttribute="width" constant="40" id="v0e-MW-EeE"/>
                         </constraints>
                         </constraints>
                     </imageView>
                     </imageView>
                     <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="7Q9-Tv-9yo" userLabel="imageStatus">
                     <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="7Q9-Tv-9yo" userLabel="imageStatus">
-                        <rect key="frame" x="5" y="40" width="15" height="15"/>
+                        <rect key="frame" x="5" y="84" width="15" height="15"/>
                         <constraints>
                         <constraints>
                             <constraint firstAttribute="width" constant="15" id="f8p-9B-Rgw"/>
                             <constraint firstAttribute="width" constant="15" id="f8p-9B-Rgw"/>
                             <constraint firstAttribute="height" constant="15" id="ndy-wW-xdL"/>
                             <constraint firstAttribute="height" constant="15" id="ndy-wW-xdL"/>
                         </constraints>
                         </constraints>
                     </imageView>
                     </imageView>
                     <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="C4K-Nv-phA" userLabel="imageFavorite">
                     <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="C4K-Nv-phA" userLabel="imageFavorite">
-                        <rect key="frame" x="40" y="5" width="15" height="15"/>
+                        <rect key="frame" x="40" y="49" width="15" height="15"/>
                         <constraints>
                         <constraints>
                             <constraint firstAttribute="width" constant="15" id="hXC-b9-Q2V"/>
                             <constraint firstAttribute="width" constant="15" id="hXC-b9-Q2V"/>
                             <constraint firstAttribute="height" constant="15" id="mPH-zc-eH5"/>
                             <constraint firstAttribute="height" constant="15" id="mPH-zc-eH5"/>
                         </constraints>
                         </constraints>
                     </imageView>
                     </imageView>
                     <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="AyA-hP-r6w" userLabel="imageSelect">
                     <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="AyA-hP-r6w" userLabel="imageSelect">
-                        <rect key="frame" x="10" y="17.5" width="25" height="25"/>
+                        <rect key="frame" x="10" y="61.5" width="25" height="25"/>
                         <constraints>
                         <constraints>
                             <constraint firstAttribute="width" constant="25" id="bIF-gu-6Jj"/>
                             <constraint firstAttribute="width" constant="25" id="bIF-gu-6Jj"/>
                             <constraint firstAttribute="height" constant="25" id="nJa-oj-gcQ"/>
                             <constraint firstAttribute="height" constant="25" id="nJa-oj-gcQ"/>
                         </constraints>
                         </constraints>
                     </imageView>
                     </imageView>
                     <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="H4E-G2-C1H" userLabel="imageLocal">
                     <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="H4E-G2-C1H" userLabel="imageLocal">
-                        <rect key="frame" x="40" y="40" width="15" height="15"/>
+                        <rect key="frame" x="40" y="84" width="15" height="15"/>
                         <constraints>
                         <constraints>
                             <constraint firstAttribute="width" constant="15" id="BEs-Rd-5Ov"/>
                             <constraint firstAttribute="width" constant="15" id="BEs-Rd-5Ov"/>
                             <constraint firstAttribute="height" constant="15" id="N8h-3R-JpE"/>
                             <constraint firstAttribute="height" constant="15" id="N8h-3R-JpE"/>
                         </constraints>
                         </constraints>
                     </imageView>
                     </imageView>
                     <label opaque="NO" userInteractionEnabled="NO" tag="101" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" lineBreakMode="middleTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="UtT-L6-mgW" userLabel="labelTitle">
                     <label opaque="NO" userInteractionEnabled="NO" tag="101" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" lineBreakMode="middleTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="UtT-L6-mgW" userLabel="labelTitle">
-                        <rect key="frame" x="60" y="13" width="450" height="18"/>
+                        <rect key="frame" x="60" y="13" width="519" height="18"/>
                         <fontDescription key="fontDescription" type="system" pointSize="15"/>
                         <fontDescription key="fontDescription" type="system" pointSize="15"/>
                         <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                         <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                         <nil key="highlightedColor"/>
                         <nil key="highlightedColor"/>
                     </label>
                     </label>
                     <label opaque="NO" userInteractionEnabled="NO" tag="102" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" lineBreakMode="middleTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="AXX-71-9Q6" userLabel="labelInfo">
                     <label opaque="NO" userInteractionEnabled="NO" tag="102" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" lineBreakMode="middleTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="AXX-71-9Q6" userLabel="labelInfo">
-                        <rect key="frame" x="60" y="31" width="450" height="15"/>
+                        <rect key="frame" x="60" y="120" width="519" height="15"/>
                         <fontDescription key="fontDescription" type="system" pointSize="12"/>
                         <fontDescription key="fontDescription" type="system" pointSize="12"/>
                         <color key="textColor" red="0.59999999999999998" green="0.59999999999999998" blue="0.59999999999999998" alpha="1" colorSpace="calibratedRGB"/>
                         <color key="textColor" red="0.59999999999999998" green="0.59999999999999998" blue="0.59999999999999998" alpha="1" colorSpace="calibratedRGB"/>
                         <nil key="highlightedColor"/>
                         <nil key="highlightedColor"/>
                     </label>
                     </label>
+                    <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="z1r-ZA-ft8" customClass="TagListView" customModule="TagListView">
+                        <rect key="frame" x="60" y="124" width="519" height="15"/>
+                        <color key="backgroundColor" systemColor="systemBackgroundColor"/>
+                        <constraints>
+                            <constraint firstAttribute="height" constant="15" id="9NQ-gM-wQ6"/>
+                        </constraints>
+                        <userDefinedRuntimeAttributes>
+                            <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                                <real key="value" value="8"/>
+                            </userDefinedRuntimeAttribute>
+                            <userDefinedRuntimeAttribute type="number" keyPath="borderWidth">
+                                <real key="value" value="1"/>
+                            </userDefinedRuntimeAttribute>
+                            <userDefinedRuntimeAttribute type="color" keyPath="textColor">
+                                <color key="value" systemColor="systemGrayColor"/>
+                            </userDefinedRuntimeAttribute>
+                            <userDefinedRuntimeAttribute type="color" keyPath="tagBackgroundColor">
+                                <color key="value" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                            </userDefinedRuntimeAttribute>
+                            <userDefinedRuntimeAttribute type="color" keyPath="borderColor">
+                                <color key="value" systemColor="systemGray5Color"/>
+                            </userDefinedRuntimeAttribute>
+                        </userDefinedRuntimeAttributes>
+                    </view>
                     <button opaque="NO" alpha="0.29999999999999999" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="o4u-0K-Qpt" userLabel="buttonShare">
                     <button opaque="NO" alpha="0.29999999999999999" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="o4u-0K-Qpt" userLabel="buttonShare">
-                        <rect key="frame" x="515" y="1" width="40" height="58"/>
+                        <rect key="frame" x="584" y="45" width="40" height="58"/>
                         <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
                         <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
                         <constraints>
                         <constraints>
                             <constraint firstAttribute="height" constant="58" id="WOg-y5-5UA"/>
                             <constraint firstAttribute="height" constant="58" id="WOg-y5-5UA"/>
@@ -76,14 +101,14 @@
                         </connections>
                         </connections>
                     </button>
                     </button>
                     <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="jc6-Vg-TaS" userLabel="imageShared">
                     <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="jc6-Vg-TaS" userLabel="imageShared">
-                        <rect key="frame" x="520" y="15" width="30" height="30"/>
+                        <rect key="frame" x="589" y="59" width="30" height="30"/>
                         <constraints>
                         <constraints>
                             <constraint firstAttribute="height" constant="30" id="Cvy-nZ-zyD"/>
                             <constraint firstAttribute="height" constant="30" id="Cvy-nZ-zyD"/>
                             <constraint firstAttribute="width" constant="30" id="jfe-Fg-vA8"/>
                             <constraint firstAttribute="width" constant="30" id="jfe-Fg-vA8"/>
                         </constraints>
                         </constraints>
                     </imageView>
                     </imageView>
                     <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="yhy-xd-w5C" userLabel="buttonMore">
                     <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="yhy-xd-w5C" userLabel="buttonMore">
-                        <rect key="frame" x="560" y="0.0" width="40" height="60"/>
+                        <rect key="frame" x="629" y="44" width="40" height="60"/>
                         <constraints>
                         <constraints>
                             <constraint firstAttribute="width" constant="40" id="ZgH-mI-l2k"/>
                             <constraint firstAttribute="width" constant="40" id="ZgH-mI-l2k"/>
                             <constraint firstAttribute="height" constant="60" id="woC-64-Tyc"/>
                             <constraint firstAttribute="height" constant="60" id="woC-64-Tyc"/>
@@ -93,17 +118,17 @@
                         </connections>
                         </connections>
                     </button>
                     </button>
                     <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="dgL-g5-Nkc" userLabel="imageMore">
                     <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="dgL-g5-Nkc" userLabel="imageMore">
-                        <rect key="frame" x="567.5" y="17.5" width="25" height="25"/>
+                        <rect key="frame" x="636.5" y="61.5" width="25" height="25"/>
                         <constraints>
                         <constraints>
                             <constraint firstAttribute="width" constant="25" id="05P-NL-pd8"/>
                             <constraint firstAttribute="width" constant="25" id="05P-NL-pd8"/>
                             <constraint firstAttribute="height" constant="25" id="Jet-eo-x1M"/>
                             <constraint firstAttribute="height" constant="25" id="Jet-eo-x1M"/>
                         </constraints>
                         </constraints>
                     </imageView>
                     </imageView>
                     <progressView hidden="YES" opaque="NO" contentMode="scaleToFill" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="m2p-oJ-j15">
                     <progressView hidden="YES" opaque="NO" contentMode="scaleToFill" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="m2p-oJ-j15">
-                        <rect key="frame" x="60" y="49" width="450" height="4"/>
+                        <rect key="frame" x="60" y="137" width="519" height="4"/>
                     </progressView>
                     </progressView>
                     <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Egg-cb-EhZ" userLabel="separator">
                     <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Egg-cb-EhZ" userLabel="separator">
-                        <rect key="frame" x="50" y="59" width="550" height="1"/>
+                        <rect key="frame" x="50" y="147" width="619" height="1"/>
                         <color key="backgroundColor" white="0.0" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
                         <color key="backgroundColor" white="0.0" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
                         <color key="tintColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
                         <color key="tintColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
                         <constraints>
                         <constraints>
@@ -115,14 +140,16 @@
             <viewLayoutGuide key="safeArea" id="Gu8-oz-zWa"/>
             <viewLayoutGuide key="safeArea" id="Gu8-oz-zWa"/>
             <constraints>
             <constraints>
                 <constraint firstItem="Gu8-oz-zWa" firstAttribute="trailing" secondItem="m2p-oJ-j15" secondAttribute="trailing" constant="90" id="2zI-li-v77"/>
                 <constraint firstItem="Gu8-oz-zWa" firstAttribute="trailing" secondItem="m2p-oJ-j15" secondAttribute="trailing" constant="90" id="2zI-li-v77"/>
+                <constraint firstItem="Gu8-oz-zWa" firstAttribute="trailing" secondItem="z1r-ZA-ft8" secondAttribute="trailing" constant="90" id="467-SN-bxI"/>
                 <constraint firstItem="H4E-G2-C1H" firstAttribute="leading" secondItem="w2m-Vw-hpd" secondAttribute="trailing" constant="-10" id="6fN-Jc-WID"/>
                 <constraint firstItem="H4E-G2-C1H" firstAttribute="leading" secondItem="w2m-Vw-hpd" secondAttribute="trailing" constant="-10" id="6fN-Jc-WID"/>
                 <constraint firstItem="Gu8-oz-zWa" firstAttribute="bottom" secondItem="Egg-cb-EhZ" secondAttribute="bottom" id="81D-sw-EaX"/>
                 <constraint firstItem="Gu8-oz-zWa" firstAttribute="bottom" secondItem="Egg-cb-EhZ" secondAttribute="bottom" id="81D-sw-EaX"/>
+                <constraint firstItem="AXX-71-9Q6" firstAttribute="leading" secondItem="w2m-Vw-hpd" secondAttribute="trailing" constant="10" id="Bxx-kv-KT3"/>
                 <constraint firstItem="w2m-Vw-hpd" firstAttribute="top" secondItem="C4K-Nv-phA" secondAttribute="bottom" constant="-10" id="DB1-jf-rpE"/>
                 <constraint firstItem="w2m-Vw-hpd" firstAttribute="top" secondItem="C4K-Nv-phA" secondAttribute="bottom" constant="-10" id="DB1-jf-rpE"/>
                 <constraint firstItem="o4u-0K-Qpt" firstAttribute="centerY" secondItem="Gu8-oz-zWa" secondAttribute="centerY" id="HFM-sM-wJr"/>
                 <constraint firstItem="o4u-0K-Qpt" firstAttribute="centerY" secondItem="Gu8-oz-zWa" secondAttribute="centerY" id="HFM-sM-wJr"/>
                 <constraint firstItem="Egg-cb-EhZ" firstAttribute="leading" secondItem="w2m-Vw-hpd" secondAttribute="trailing" id="JCm-UU-Pxu"/>
                 <constraint firstItem="Egg-cb-EhZ" firstAttribute="leading" secondItem="w2m-Vw-hpd" secondAttribute="trailing" id="JCm-UU-Pxu"/>
                 <constraint firstItem="dgL-g5-Nkc" firstAttribute="centerY" secondItem="yhy-xd-w5C" secondAttribute="centerY" id="OMy-Cu-HAx"/>
                 <constraint firstItem="dgL-g5-Nkc" firstAttribute="centerY" secondItem="yhy-xd-w5C" secondAttribute="centerY" id="OMy-Cu-HAx"/>
                 <constraint firstItem="UtT-L6-mgW" firstAttribute="leading" secondItem="w2m-Vw-hpd" secondAttribute="trailing" constant="10" id="PQ8-0b-fLa"/>
                 <constraint firstItem="UtT-L6-mgW" firstAttribute="leading" secondItem="w2m-Vw-hpd" secondAttribute="trailing" constant="10" id="PQ8-0b-fLa"/>
-                <constraint firstItem="AXX-71-9Q6" firstAttribute="leading" secondItem="w2m-Vw-hpd" secondAttribute="trailing" constant="10" id="Qvq-r5-AX9"/>
+                <constraint firstItem="z1r-ZA-ft8" firstAttribute="leading" secondItem="w2m-Vw-hpd" secondAttribute="trailing" constant="10" id="RJQ-ha-NSq"/>
                 <constraint firstItem="AyA-hP-r6w" firstAttribute="leading" secondItem="Gu8-oz-zWa" secondAttribute="leading" constant="10" id="RYl-cO-cCN"/>
                 <constraint firstItem="AyA-hP-r6w" firstAttribute="leading" secondItem="Gu8-oz-zWa" secondAttribute="leading" constant="10" id="RYl-cO-cCN"/>
                 <constraint firstItem="Gu8-oz-zWa" firstAttribute="bottom" secondItem="m2p-oJ-j15" secondAttribute="bottom" constant="7" id="SYv-gc-ahx"/>
                 <constraint firstItem="Gu8-oz-zWa" firstAttribute="bottom" secondItem="m2p-oJ-j15" secondAttribute="bottom" constant="7" id="SYv-gc-ahx"/>
                 <constraint firstItem="C4K-Nv-phA" firstAttribute="leading" secondItem="w2m-Vw-hpd" secondAttribute="trailing" constant="-10" id="Sof-wy-toF"/>
                 <constraint firstItem="C4K-Nv-phA" firstAttribute="leading" secondItem="w2m-Vw-hpd" secondAttribute="trailing" constant="-10" id="Sof-wy-toF"/>
@@ -132,7 +159,7 @@
                 <constraint firstItem="7Q9-Tv-9yo" firstAttribute="top" secondItem="w2m-Vw-hpd" secondAttribute="bottom" constant="-10" id="XbB-4a-WpA"/>
                 <constraint firstItem="7Q9-Tv-9yo" firstAttribute="top" secondItem="w2m-Vw-hpd" secondAttribute="bottom" constant="-10" id="XbB-4a-WpA"/>
                 <constraint firstItem="yhy-xd-w5C" firstAttribute="centerY" secondItem="Gu8-oz-zWa" secondAttribute="centerY" id="ZO7-Ny-L3I"/>
                 <constraint firstItem="yhy-xd-w5C" firstAttribute="centerY" secondItem="Gu8-oz-zWa" secondAttribute="centerY" id="ZO7-Ny-L3I"/>
                 <constraint firstItem="m2p-oJ-j15" firstAttribute="leading" secondItem="w2m-Vw-hpd" secondAttribute="trailing" constant="10" id="Zyr-qM-9qP"/>
                 <constraint firstItem="m2p-oJ-j15" firstAttribute="leading" secondItem="w2m-Vw-hpd" secondAttribute="trailing" constant="10" id="Zyr-qM-9qP"/>
-                <constraint firstItem="Gu8-oz-zWa" firstAttribute="bottom" secondItem="AXX-71-9Q6" secondAttribute="bottom" constant="14" id="d06-sn-I3Y"/>
+                <constraint firstAttribute="bottom" secondItem="AXX-71-9Q6" secondAttribute="bottom" constant="13" id="d06-sn-I3Y"/>
                 <constraint firstItem="jc6-Vg-TaS" firstAttribute="centerX" secondItem="o4u-0K-Qpt" secondAttribute="centerX" id="fAq-0d-u57"/>
                 <constraint firstItem="jc6-Vg-TaS" firstAttribute="centerX" secondItem="o4u-0K-Qpt" secondAttribute="centerX" id="fAq-0d-u57"/>
                 <constraint firstItem="Gu8-oz-zWa" firstAttribute="trailing" secondItem="Egg-cb-EhZ" secondAttribute="trailing" id="k8f-bU-D6I"/>
                 <constraint firstItem="Gu8-oz-zWa" firstAttribute="trailing" secondItem="Egg-cb-EhZ" secondAttribute="trailing" id="k8f-bU-D6I"/>
                 <constraint firstItem="w2m-Vw-hpd" firstAttribute="leading" secondItem="Gu8-oz-zWa" secondAttribute="leading" constant="10" id="mBb-ff-7HD"/>
                 <constraint firstItem="w2m-Vw-hpd" firstAttribute="leading" secondItem="Gu8-oz-zWa" secondAttribute="leading" constant="10" id="mBb-ff-7HD"/>
@@ -143,9 +170,10 @@
                 <constraint firstItem="Gu8-oz-zWa" firstAttribute="trailing" secondItem="yhy-xd-w5C" secondAttribute="trailing" id="s2S-RP-cw5"/>
                 <constraint firstItem="Gu8-oz-zWa" firstAttribute="trailing" secondItem="yhy-xd-w5C" secondAttribute="trailing" id="s2S-RP-cw5"/>
                 <constraint firstItem="AyA-hP-r6w" firstAttribute="centerY" secondItem="Gu8-oz-zWa" secondAttribute="centerY" id="sJp-0x-bdC"/>
                 <constraint firstItem="AyA-hP-r6w" firstAttribute="centerY" secondItem="Gu8-oz-zWa" secondAttribute="centerY" id="sJp-0x-bdC"/>
                 <constraint firstItem="Gu8-oz-zWa" firstAttribute="trailing" secondItem="o4u-0K-Qpt" secondAttribute="trailing" constant="45" id="tOD-Sd-Uhy"/>
                 <constraint firstItem="Gu8-oz-zWa" firstAttribute="trailing" secondItem="o4u-0K-Qpt" secondAttribute="trailing" constant="45" id="tOD-Sd-Uhy"/>
+                <constraint firstAttribute="bottom" secondItem="z1r-ZA-ft8" secondAttribute="bottom" constant="9" id="wfc-n7-tCT"/>
                 <constraint firstItem="jc6-Vg-TaS" firstAttribute="centerY" secondItem="o4u-0K-Qpt" secondAttribute="centerY" id="xnq-6u-TXH"/>
                 <constraint firstItem="jc6-Vg-TaS" firstAttribute="centerY" secondItem="o4u-0K-Qpt" secondAttribute="centerY" id="xnq-6u-TXH"/>
             </constraints>
             </constraints>
-            <size key="customSize" width="650" height="58"/>
+            <size key="customSize" width="719" height="146"/>
             <connections>
             <connections>
                 <outlet property="buttonMore" destination="yhy-xd-w5C" id="agm-M9-xtq"/>
                 <outlet property="buttonMore" destination="yhy-xd-w5C" id="agm-M9-xtq"/>
                 <outlet property="buttonShared" destination="o4u-0K-Qpt" id="5hT-Su-kWL"/>
                 <outlet property="buttonShared" destination="o4u-0K-Qpt" id="5hT-Su-kWL"/>
@@ -163,9 +191,21 @@
                 <outlet property="progressView" destination="m2p-oJ-j15" id="yFv-KS-nEy"/>
                 <outlet property="progressView" destination="m2p-oJ-j15" id="yFv-KS-nEy"/>
                 <outlet property="separator" destination="Egg-cb-EhZ" id="uhq-Nc-z8K"/>
                 <outlet property="separator" destination="Egg-cb-EhZ" id="uhq-Nc-z8K"/>
                 <outlet property="separatorHeightConstraint" destination="G5S-67-boG" id="B6g-qe-MTb"/>
                 <outlet property="separatorHeightConstraint" destination="G5S-67-boG" id="B6g-qe-MTb"/>
+                <outlet property="tagListView" destination="z1r-ZA-ft8" id="3mW-9T-7Bm"/>
                 <outlet property="titleTrailingConstraint" destination="Tq4-bB-YMV" id="v4n-j5-ZWT"/>
                 <outlet property="titleTrailingConstraint" destination="Tq4-bB-YMV" id="v4n-j5-ZWT"/>
             </connections>
             </connections>
-            <point key="canvasLocation" x="97.599999999999994" y="129.53523238380811"/>
+            <point key="canvasLocation" x="128.18590704647679" y="198.40000000000001"/>
         </collectionViewCell>
         </collectionViewCell>
     </objects>
     </objects>
+    <resources>
+        <systemColor name="systemBackgroundColor">
+            <color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+        </systemColor>
+        <systemColor name="systemGray5Color">
+            <color red="0.89803921568627454" green="0.89803921568627454" blue="0.91764705882352937" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+        </systemColor>
+        <systemColor name="systemGrayColor">
+            <color red="0.55686274509803924" green="0.55686274509803924" blue="0.57647058823529407" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+        </systemColor>
+    </resources>
 </document>
 </document>

+ 18 - 7
iOSClient/Main/Main.storyboard

@@ -1,9 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <?xml version="1.0" encoding="UTF-8"?>
-<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="21225" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="FkP-Lh-8zt">
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="21701" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="FkP-Lh-8zt">
     <device id="retina6_1" orientation="portrait" appearance="light"/>
     <device id="retina6_1" orientation="portrait" appearance="light"/>
     <dependencies>
     <dependencies>
         <deployment identifier="iOS"/>
         <deployment identifier="iOS"/>
-        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="21207"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="21678"/>
         <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
         <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
     </dependencies>
     </dependencies>
     <scenes>
     <scenes>
@@ -136,6 +136,7 @@
                         <segue destination="z7i-Sl-6Di" kind="show" identifier="segueShares" id="c59-fC-R3W"/>
                         <segue destination="z7i-Sl-6Di" kind="show" identifier="segueShares" id="c59-fC-R3W"/>
                         <segue destination="3YH-o1-17m" kind="relationship" relationship="rootViewController" id="les-zO-92u"/>
                         <segue destination="3YH-o1-17m" kind="relationship" relationship="rootViewController" id="les-zO-92u"/>
                         <segue destination="rhU-g7-7AK" kind="show" identifier="segueSettings" id="jMB-ji-wIR"/>
                         <segue destination="rhU-g7-7AK" kind="show" identifier="segueSettings" id="jMB-ji-wIR"/>
+                        <segue destination="hGk-eR-32T" kind="show" identifier="segueGroupfolders" id="Sfw-Dn-3uD"/>
                     </connections>
                     </connections>
                 </navigationController>
                 </navigationController>
                 <placeholder placeholderIdentifier="IBFirstResponder" id="D7n-Z1-9wU" userLabel="First Responder" sceneMemberID="firstResponder"/>
                 <placeholder placeholderIdentifier="IBFirstResponder" id="D7n-Z1-9wU" userLabel="First Responder" sceneMemberID="firstResponder"/>
@@ -180,7 +181,7 @@
                 </viewControllerPlaceholder>
                 </viewControllerPlaceholder>
                 <placeholder placeholderIdentifier="IBFirstResponder" id="EoH-78-6Yh" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
                 <placeholder placeholderIdentifier="IBFirstResponder" id="EoH-78-6Yh" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
             </objects>
             </objects>
-            <point key="canvasLocation" x="10209" y="291"/>
+            <point key="canvasLocation" x="10204" y="265"/>
         </scene>
         </scene>
         <!--NCTransfers.storyboard-->
         <!--NCTransfers.storyboard-->
         <scene sceneID="IDy-4E-Qqv">
         <scene sceneID="IDy-4E-Qqv">
@@ -190,7 +191,7 @@
                 </viewControllerPlaceholder>
                 </viewControllerPlaceholder>
                 <placeholder placeholderIdentifier="IBFirstResponder" id="X5c-xg-peQ" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
                 <placeholder placeholderIdentifier="IBFirstResponder" id="X5c-xg-peQ" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
             </objects>
             </objects>
-            <point key="canvasLocation" x="10201" y="366"/>
+            <point key="canvasLocation" x="10196" y="327"/>
         </scene>
         </scene>
         <!--NCRecent.storyboard-->
         <!--NCRecent.storyboard-->
         <scene sceneID="nO2-dy-n7J">
         <scene sceneID="nO2-dy-n7J">
@@ -200,7 +201,7 @@
                 </viewControllerPlaceholder>
                 </viewControllerPlaceholder>
                 <placeholder placeholderIdentifier="IBFirstResponder" id="rsS-r1-oFg" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
                 <placeholder placeholderIdentifier="IBFirstResponder" id="rsS-r1-oFg" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
             </objects>
             </objects>
-            <point key="canvasLocation" x="10190" y="445"/>
+            <point key="canvasLocation" x="10184" y="382"/>
         </scene>
         </scene>
         <!--NCShares.storyboard-->
         <!--NCShares.storyboard-->
         <scene sceneID="eRk-6B-fMu">
         <scene sceneID="eRk-6B-fMu">
@@ -210,7 +211,7 @@
                 </viewControllerPlaceholder>
                 </viewControllerPlaceholder>
                 <placeholder placeholderIdentifier="IBFirstResponder" id="olY-7a-lXK" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
                 <placeholder placeholderIdentifier="IBFirstResponder" id="olY-7a-lXK" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
             </objects>
             </objects>
-            <point key="canvasLocation" x="10190" y="538"/>
+            <point key="canvasLocation" x="10183" y="437"/>
         </scene>
         </scene>
         <!--NCSettings.storyboard-->
         <!--NCSettings.storyboard-->
         <scene sceneID="FRF-y9-mZJ">
         <scene sceneID="FRF-y9-mZJ">
@@ -220,7 +221,17 @@
                 </viewControllerPlaceholder>
                 </viewControllerPlaceholder>
                 <placeholder placeholderIdentifier="IBFirstResponder" id="bcK-1B-gxh" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
                 <placeholder placeholderIdentifier="IBFirstResponder" id="bcK-1B-gxh" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
             </objects>
             </objects>
-            <point key="canvasLocation" x="10190" y="619"/>
+            <point key="canvasLocation" x="10191" y="488"/>
+        </scene>
+        <!--NCGroupfolders.storyboard-->
+        <scene sceneID="kED-94-ouZ">
+            <objects>
+                <viewControllerPlaceholder storyboardName="NCGroupfolders" referencedIdentifier="NCGroupfolders.storyboard" id="hGk-eR-32T" sceneMemberID="viewController">
+                    <navigationItem key="navigationItem" id="vBT-eK-wJG"/>
+                </viewControllerPlaceholder>
+                <placeholder placeholderIdentifier="IBFirstResponder" id="R0O-cD-1ke" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
+            </objects>
+            <point key="canvasLocation" x="10212" y="536"/>
         </scene>
         </scene>
         <!--NCFiles.storyboard-->
         <!--NCFiles.storyboard-->
         <scene sceneID="xwl-IR-lkD">
         <scene sceneID="xwl-IR-lkD">

+ 34 - 6
iOSClient/Main/NCActionCenter.swift

@@ -188,18 +188,46 @@ class NCActionCenter: NSObject, UIDocumentInteractionControllerDelegate, NCSelec
 
 
     // MARK: -
     // MARK: -
 
 
-    func openShare(viewController: UIViewController, metadata: tableMetadata, indexPage: NCGlobal.NCSharePagingIndex) {
+    func openShare(viewController: UIViewController, metadata: tableMetadata, page: NCBrandOptions.NCInfoPagingTab) {
 
 
         let serverUrlFileName = metadata.serverUrl + "/" + metadata.fileName
         let serverUrlFileName = metadata.serverUrl + "/" + metadata.fileName
+        var page = page
+
         NCActivityIndicator.shared.start(backgroundView: viewController.view)
         NCActivityIndicator.shared.start(backgroundView: viewController.view)
         NCNetworking.shared.readFile(serverUrlFileName: serverUrlFileName, queue: .main) { _, metadata, error in
         NCNetworking.shared.readFile(serverUrlFileName: serverUrlFileName, queue: .main) { _, metadata, error in
+
             NCActivityIndicator.shared.stop()
             NCActivityIndicator.shared.stop()
+
             if let metadata = metadata, error == .success {
             if let metadata = metadata, error == .success {
+
+                var pages: [NCBrandOptions.NCInfoPagingTab] = []
+
                 let shareNavigationController = UIStoryboard(name: "NCShare", bundle: nil).instantiateInitialViewController() as? UINavigationController
                 let shareNavigationController = UIStoryboard(name: "NCShare", bundle: nil).instantiateInitialViewController() as? UINavigationController
                 let shareViewController = shareNavigationController?.topViewController as? NCSharePaging
                 let shareViewController = shareNavigationController?.topViewController as? NCSharePaging
+                let activity = NCManageDatabase.shared.getCapabilitiesServerArray(account: metadata.account, elements: NCElementsJSON.shared.capabilitiesActivity)
+
+                for value in NCBrandOptions.NCInfoPagingTab.allCases {
+                    pages.append(value)
+                }
+
+                if activity == nil, let idx = pages.firstIndex(of: .activity) {
+                    pages.remove(at: idx)
+                }
+                if !metadata.isSharable, let idx = pages.firstIndex(of: .sharing) {
+                    pages.remove(at: idx)
+                }
+                (pages, page) = NCApplicationHandle().filterPages(pages: pages, page: page, metadata: metadata)
+
+                if pages.contains(page) {
+                    shareViewController?.page = page
+                } else if let page = pages.first {
+                    shareViewController?.page = page
+                } else {
+                    return
+                }
 
 
+                shareViewController?.pages = pages
                 shareViewController?.metadata = metadata
                 shareViewController?.metadata = metadata
-                shareViewController?.indexPage = indexPage
 
 
                 shareNavigationController?.modalPresentationStyle = .formSheet
                 shareNavigationController?.modalPresentationStyle = .formSheet
                 if let shareNavigationController = shareNavigationController {
                 if let shareNavigationController = shareNavigationController {
@@ -285,7 +313,7 @@ class NCActionCenter: NSObject, UIDocumentInteractionControllerDelegate, NCSelec
         let printInfo = UIPrintInfo(dictionary: nil)
         let printInfo = UIPrintInfo(dictionary: nil)
 
 
         printInfo.jobName = fileNameURL.lastPathComponent
         printInfo.jobName = fileNameURL.lastPathComponent
-        printInfo.outputType = metadata.classFile == NKCommon.TypeClassFile.image.rawValue ? .photo : .general
+        printInfo.outputType = metadata.isImage ? .photo : .general
         printController.printInfo = printInfo
         printController.printInfo = printInfo
         printController.showsNumberOfCopies = true
         printController.showsNumberOfCopies = true
 
 
@@ -330,7 +358,7 @@ class NCActionCenter: NSObject, UIDocumentInteractionControllerDelegate, NCSelec
             let errorSave = NKError(errorCode: NCGlobal.shared.errorFileNotSaved, errorDescription: "_file_not_saved_cameraroll_")
             let errorSave = NKError(errorCode: NCGlobal.shared.errorFileNotSaved, errorDescription: "_file_not_saved_cameraroll_")
 
 
             do {
             do {
-                if metadata.classFile == NKCommon.TypeClassFile.image.rawValue {
+                if metadata.isImage {
                     let data = try Data(contentsOf: URL(fileURLWithPath: fileNamePath))
                     let data = try Data(contentsOf: URL(fileURLWithPath: fileNamePath))
                     PHPhotoLibrary.shared().performChanges({
                     PHPhotoLibrary.shared().performChanges({
                         let assetRequest = PHAssetCreationRequest.forAsset()
                         let assetRequest = PHAssetCreationRequest.forAsset()
@@ -340,7 +368,7 @@ class NCActionCenter: NSObject, UIDocumentInteractionControllerDelegate, NCSelec
                             NCContentPresenter.shared.messageNotification("_save_selected_files_", error: errorSave, delay: NCGlobal.shared.dismissAfterSecond, type: NCContentPresenter.messageType.error)
                             NCContentPresenter.shared.messageNotification("_save_selected_files_", error: errorSave, delay: NCGlobal.shared.dismissAfterSecond, type: NCContentPresenter.messageType.error)
                         }
                         }
                     }
                     }
-                } else if metadata.classFile == NKCommon.TypeClassFile.video.rawValue {
+                } else if metadata.isVideo {
                     PHPhotoLibrary.shared().performChanges({
                     PHPhotoLibrary.shared().performChanges({
                         PHAssetChangeRequest.creationRequestForAssetFromVideo(atFileURL: URL(fileURLWithPath: fileNamePath))
                         PHAssetChangeRequest.creationRequestForAssetFromVideo(atFileURL: URL(fileURLWithPath: fileNamePath))
                     }) { success, _ in
                     }) { success, _ in
@@ -464,7 +492,7 @@ class NCActionCenter: NSObject, UIDocumentInteractionControllerDelegate, NCSelec
                     let toPath = CCUtility.getDirectoryProviderStorageOcId(ocId!, fileNameView: fileName)!
                     let toPath = CCUtility.getDirectoryProviderStorageOcId(ocId!, fileNameView: fileName)!
                     NCUtilityFileSystem.shared.moveFile(atPath: fileNameLocalPath, toPath: toPath)
                     NCUtilityFileSystem.shared.moveFile(atPath: fileNameLocalPath, toPath: toPath)
                     NCManageDatabase.shared.addLocalFile(account: account, etag: etag!, ocId: ocId!, fileName: fileName)
                     NCManageDatabase.shared.addLocalFile(account: account, etag: etag!, ocId: ocId!, fileName: fileName)
-                    NotificationCenter.default.postOnMainThread(name: NCGlobal.shared.notificationCenterReloadDataSourceNetworkForced, userInfo: ["serverUrl": serverUrl])
+                    NotificationCenter.default.postOnMainThread(name: NCGlobal.shared.notificationCenterReloadDataSourceNetworkForced)
                 } else if afError?.isExplicitlyCancelledError ?? false {
                 } else if afError?.isExplicitlyCancelledError ?? false {
                     print("cancel")
                     print("cancel")
                 } else {
                 } else {

+ 8 - 0
iOSClient/Main/NCCellProtocol.swift

@@ -22,6 +22,7 @@
 //
 //
 
 
 import UIKit
 import UIKit
+import TagListView
 
 
 protocol NCCellProtocol {
 protocol NCCellProtocol {
 
 
@@ -39,6 +40,7 @@ protocol NCCellProtocol {
     var fileSharedImage: UIImageView? { get set }
     var fileSharedImage: UIImageView? { get set }
     var fileMoreImage: UIImageView? { get set }
     var fileMoreImage: UIImageView? { get set }
     var cellSeparatorView: UIView? { get set }
     var cellSeparatorView: UIView? { get set }
+    var cellTagListView: TagListView? { get set }
 
 
     func titleInfoTrailingDefault()
     func titleInfoTrailingDefault()
     func titleInfoTrailingFull()
     func titleInfoTrailingFull()
@@ -49,6 +51,7 @@ protocol NCCellProtocol {
     func selectMode(_ status: Bool)
     func selectMode(_ status: Bool)
     func selected(_ status: Bool)
     func selected(_ status: Bool)
     func setAccessibility(label: String, value: String)
     func setAccessibility(label: String, value: String)
+    func setTags(tags: [String])
 }
 }
 
 
 extension NCCellProtocol {
 extension NCCellProtocol {
@@ -104,6 +107,10 @@ extension NCCellProtocol {
         get { return nil }
         get { return nil }
         set {}
         set {}
     }
     }
+    var cellTagListView: TagListView? {
+        get { return nil }
+        set {}
+    }
 
 
     func titleInfoTrailingDefault() {}
     func titleInfoTrailingDefault() {}
     func titleInfoTrailingFull() {}
     func titleInfoTrailingFull() {}
@@ -114,4 +121,5 @@ extension NCCellProtocol {
     func selectMode(_ status: Bool) {}
     func selectMode(_ status: Bool) {}
     func selected(_ status: Bool) {}
     func selected(_ status: Bool) {}
     func setAccessibility(label: String, value: String) {}
     func setAccessibility(label: String, value: String) {}
+    func setTags(tags: [String]) { }
 }
 }

+ 43 - 12
iOSClient/Main/NCPickerViewController.swift

@@ -125,15 +125,20 @@ class customPhotoPickerViewController: TLPhotosPickerViewController {
 class NCDocumentPickerViewController: NSObject, UIDocumentPickerDelegate {
 class NCDocumentPickerViewController: NSObject, UIDocumentPickerDelegate {
 
 
     let appDelegate = UIApplication.shared.delegate as! AppDelegate
     let appDelegate = UIApplication.shared.delegate as! AppDelegate
+    var isViewerMedia: Bool
+    var viewController: UIViewController?
 
 
     @discardableResult
     @discardableResult
-    init (tabBarController: UITabBarController) {
+    init (tabBarController: UITabBarController, isViewerMedia: Bool, allowsMultipleSelection: Bool, viewController: UIViewController? = nil) {
+
+        self.isViewerMedia = isViewerMedia
+        self.viewController = viewController
         super.init()
         super.init()
 
 
-        let documentProviderMenu = UIDocumentPickerViewController(documentTypes: ["public.data"], in: .import)
+        let documentProviderMenu = UIDocumentPickerViewController(forOpeningContentTypes: [UTType.data])
 
 
         documentProviderMenu.modalPresentationStyle = .formSheet
         documentProviderMenu.modalPresentationStyle = .formSheet
-        documentProviderMenu.allowsMultipleSelection = true
+        documentProviderMenu.allowsMultipleSelection = allowsMultipleSelection
         documentProviderMenu.popoverPresentationController?.sourceView = tabBarController.tabBar
         documentProviderMenu.popoverPresentationController?.sourceView = tabBarController.tabBar
         documentProviderMenu.popoverPresentationController?.sourceRect = tabBarController.tabBar.bounds
         documentProviderMenu.popoverPresentationController?.sourceRect = tabBarController.tabBar.bounds
         documentProviderMenu.delegate = self
         documentProviderMenu.delegate = self
@@ -143,15 +148,31 @@ class NCDocumentPickerViewController: NSObject, UIDocumentPickerDelegate {
 
 
     func documentPicker(_ controller: UIDocumentPickerViewController, didPickDocumentsAt urls: [URL]) {
     func documentPicker(_ controller: UIDocumentPickerViewController, didPickDocumentsAt urls: [URL]) {
 
 
-        for url in urls {
+        let ocId = NSUUID().uuidString
+
+        if isViewerMedia,
+            let urlIn = urls.first,
+            let url = self.copySecurityScopedResource(url: urlIn, urlOut: FileManager.default.temporaryDirectory.appendingPathComponent(urlIn.lastPathComponent)),
+            let viewController = self.viewController {
 
 
             let fileName = url.lastPathComponent
             let fileName = url.lastPathComponent
-            let serverUrl = appDelegate.activeServerUrl
-            let ocId = NSUUID().uuidString
-            let atPath = url.path
-            let toPath = CCUtility.getDirectoryProviderStorageOcId(ocId, fileNameView: fileName)!
+            let metadata = NCManageDatabase.shared.createMetadata(account: appDelegate.account, user: appDelegate.user, userId: appDelegate.userId, fileName: fileName, fileNameView: fileName, ocId: ocId, serverUrl: "", urlBase: appDelegate.urlBase, url: url.path, contentType: "")
+            if metadata.classFile == NKCommon.TypeClassFile.unknow.rawValue {
+                metadata.classFile = NKCommon.TypeClassFile.video.rawValue
+            }
+            NCManageDatabase.shared.addMetadata(metadata)
+            NCViewer.shared.view(viewController: viewController, metadata: metadata, metadatas: [metadata], imageIcon: nil)
+
+        } else {
+
+            for urlIn in urls {
 
 
-            if NCUtilityFileSystem.shared.copyFile(atPath: atPath, toPath: toPath) {
+                let fileName = urlIn.lastPathComponent
+                let toPath = CCUtility.getDirectoryProviderStorageOcId(ocId, fileNameView: fileName)!
+                let urlOut = URL(fileURLWithPath: toPath)
+                let serverUrl = appDelegate.activeServerUrl
+
+                guard let url = self.copySecurityScopedResource(url: urlIn, urlOut: urlOut) else { continue }
 
 
                 let metadataForUpload = NCManageDatabase.shared.createMetadata(account: appDelegate.account, user: appDelegate.user, userId: appDelegate.userId, fileName: fileName, fileNameView: fileName, ocId: ocId, serverUrl: serverUrl, urlBase: appDelegate.urlBase, url: "", contentType: "")
                 let metadataForUpload = NCManageDatabase.shared.createMetadata(account: appDelegate.account, user: appDelegate.user, userId: appDelegate.userId, fileName: fileName, fileNameView: fileName, ocId: ocId, serverUrl: serverUrl, urlBase: appDelegate.urlBase, url: "", contentType: "")
 
 
@@ -174,11 +195,21 @@ class NCDocumentPickerViewController: NSObject, UIDocumentPickerDelegate {
                 } else {
                 } else {
                     NCNetworkingProcessUpload.shared.createProcessUploads(metadatas: [metadataForUpload], completion: { _ in })
                     NCNetworkingProcessUpload.shared.createProcessUploads(metadatas: [metadataForUpload], completion: { _ in })
                 }
                 }
+            }
+        }
+    }
+
+    func copySecurityScopedResource(url: URL, urlOut: URL) -> URL? {
 
 
-            } else {
-                let error = NKError(errorCode: NCGlobal.shared.errorInternalError, errorDescription: "_read_file_error_")
-                NCContentPresenter.shared.showError(error: error)
+        try? FileManager.default.removeItem(at: urlOut)
+        if url.startAccessingSecurityScopedResource() {
+            do {
+                try FileManager.default.copyItem(at: url, to: urlOut)
+                url.stopAccessingSecurityScopedResource()
+                return urlOut
+            } catch {
             }
             }
         }
         }
+        return nil
     }
     }
 }
 }

+ 20 - 12
iOSClient/Media/NCMedia.swift

@@ -31,6 +31,7 @@ class NCMedia: UIViewController, NCEmptyDataSetDelegate, NCSelectDelegate {
     private var emptyDataSet: NCEmptyDataSet?
     private var emptyDataSet: NCEmptyDataSet?
     private var mediaCommandView: NCMediaCommandView?
     private var mediaCommandView: NCMediaCommandView?
     private var gridLayout: NCGridMediaLayout!
     private var gridLayout: NCGridMediaLayout!
+    internal var documentPickerViewController: NCDocumentPickerViewController?
 
 
     internal let appDelegate = UIApplication.shared.delegate as! AppDelegate
     internal let appDelegate = UIApplication.shared.delegate as! AppDelegate
 
 
@@ -169,20 +170,27 @@ class NCMedia: UIViewController, NCEmptyDataSetDelegate, NCSelectDelegate {
     @objc func deleteFile(_ notification: NSNotification) {
     @objc func deleteFile(_ notification: NSNotification) {
 
 
         guard let userInfo = notification.userInfo as NSDictionary?,
         guard let userInfo = notification.userInfo as NSDictionary?,
-              let ocId = userInfo["ocId"] as? String
+              let ocIds = userInfo["ocId"] as? [String],
+              let error = userInfo["error"] as? NKError
         else { return }
         else { return }
 
 
-        let indexes = self.metadatas.indices.filter { self.metadatas[$0].ocId == ocId }
-        let metadatas = self.metadatas.filter { $0.ocId != ocId }
-        self.metadatas = metadatas
-
-        if self.metadatas.count == 0 {
-            collectionView?.reloadData()
-        } else if let row = indexes.first {
-            let indexPath = IndexPath(row: row, section: 0)
-            collectionView?.deleteItems(at: [indexPath])
+        if error == .success {
+            var items: [IndexPath] = []
+            var index: Int = 0
+            for metadata in metadatas {
+                if ocIds.contains(metadata.ocId) {
+                    self.metadatas.remove(at: index)
+                    items.append(IndexPath(row: index, section: 0))
+                }
+                if ocIds.count == items.count { break }
+                index += 1
+            }
+            if ocIds.count == items.count {
+                self.collectionView?.deleteItems(at: items)
+            } else {
+                self.reloadDataSourceWithCompletion { _ in }
+            }
         }
         }
-
         self.updateMediaControlVisibility()
         self.updateMediaControlVisibility()
     }
     }
 
 
@@ -393,7 +401,7 @@ extension NCMedia: UICollectionViewDataSource {
             cell.fileObjectId = metadata.ocId
             cell.fileObjectId = metadata.ocId
             cell.fileUser = metadata.ownerId
             cell.fileUser = metadata.ownerId
 
 
-            if metadata.classFile == NKCommon.TypeClassFile.video.rawValue || metadata.classFile == NKCommon.TypeClassFile.audio.rawValue {
+            if metadata.isMovie {
                 cell.imageStatus.image = cacheImages.cellPlayImage
                 cell.imageStatus.image = cacheImages.cellPlayImage
             } else if metadata.livePhoto && livePhoto {
             } else if metadata.livePhoto && livePhoto {
                 cell.imageStatus.image = cacheImages.cellLivePhotoImage
                 cell.imageStatus.image = cacheImages.cellLivePhotoImage

+ 21 - 19
iOSClient/Media/NCMediaCommandView.xib

@@ -1,9 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <?xml version="1.0" encoding="UTF-8"?>
-<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="17701" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
-    <device id="retina3_5" orientation="portrait" appearance="light"/>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="21701" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
+    <device id="retina6_12" orientation="portrait" appearance="light"/>
     <dependencies>
     <dependencies>
         <deployment identifier="iOS"/>
         <deployment identifier="iOS"/>
-        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="17703"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="21678"/>
+        <capability name="Image references" minToolsVersion="12.0"/>
         <capability name="Safe area layout guides" minToolsVersion="9.0"/>
         <capability name="Safe area layout guides" minToolsVersion="9.0"/>
         <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
         <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
     </dependencies>
     </dependencies>
@@ -11,11 +12,11 @@
         <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
         <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
         <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
         <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
         <view contentMode="scaleToFill" id="iN0-l3-epB" customClass="NCMediaCommandView" customModule="Nextcloud" customModuleProvider="target">
         <view contentMode="scaleToFill" id="iN0-l3-epB" customClass="NCMediaCommandView" customModule="Nextcloud" customModuleProvider="target">
-            <rect key="frame" x="0.0" y="0.0" width="320" height="480"/>
+            <rect key="frame" x="0.0" y="0.0" width="393" height="852"/>
             <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
             <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
             <subviews>
             <subviews>
                 <visualEffectView opaque="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="i1s-Qa-dG1">
                 <visualEffectView opaque="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="i1s-Qa-dG1">
-                    <rect key="frame" x="224" y="10" width="40" height="40"/>
+                    <rect key="frame" x="297" y="69" width="40" height="40"/>
                     <view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" insetsLayoutMarginsFromSafeArea="NO" id="e3Q-e0-SQa">
                     <view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" insetsLayoutMarginsFromSafeArea="NO" id="e3Q-e0-SQa">
                         <rect key="frame" x="0.0" y="0.0" width="40" height="40"/>
                         <rect key="frame" x="0.0" y="0.0" width="40" height="40"/>
                         <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
                         <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
@@ -28,7 +29,7 @@
                                 </constraints>
                                 </constraints>
                                 <color key="tintColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
                                 <color key="tintColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
                                 <inset key="imageEdgeInsets" minX="12" minY="12" maxX="12" maxY="12"/>
                                 <inset key="imageEdgeInsets" minX="12" minY="12" maxX="12" maxY="12"/>
-                                <state key="normal" image="plus-slash-minus">
+                                <state key="normal" image="plus.slash.minus" catalog="system">
                                     <color key="titleColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
                                     <color key="titleColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
                                 </state>
                                 </state>
                                 <state key="disabled">
                                 <state key="disabled">
@@ -39,10 +40,10 @@
                                 </connections>
                                 </connections>
                             </button>
                             </button>
                             <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="ZkU-dK-sp1">
                             <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="ZkU-dK-sp1">
-                                <rect key="frame" x="0.0" y="0.0" width="19.5" height="40"/>
+                                <rect key="frame" x="0.0" y="0.0" width="19.666666666666668" height="40"/>
                                 <color key="tintColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
                                 <color key="tintColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
                                 <inset key="imageEdgeInsets" minX="12" minY="12" maxX="12" maxY="12"/>
                                 <inset key="imageEdgeInsets" minX="12" minY="12" maxX="12" maxY="12"/>
-                                <state key="normal" image="zoomInMedia">
+                                <state key="normal" image="plus" catalog="system">
                                     <color key="titleColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
                                     <color key="titleColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
                                 </state>
                                 </state>
                                 <state key="disabled">
                                 <state key="disabled">
@@ -53,18 +54,19 @@
                                 </connections>
                                 </connections>
                             </button>
                             </button>
                             <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="NwM-bk-QAK">
                             <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="NwM-bk-QAK">
-                                <rect key="frame" x="19.5" y="8" width="1" height="24"/>
+                                <rect key="frame" x="19.666666666666686" y="8" width="1" height="24"/>
                                 <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
                                 <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
                                 <constraints>
                                 <constraints>
                                     <constraint firstAttribute="width" constant="1" id="1cE-rd-mYI"/>
                                     <constraint firstAttribute="width" constant="1" id="1cE-rd-mYI"/>
                                 </constraints>
                                 </constraints>
                             </view>
                             </view>
                             <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="swp-Cd-CbD">
                             <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="swp-Cd-CbD">
-                                <rect key="frame" x="20.5" y="0.0" width="19.5" height="40"/>
+                                <rect key="frame" x="20.666666666666686" y="0.0" width="19.333333333333329" height="40"/>
                                 <color key="tintColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
                                 <color key="tintColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
                                 <inset key="imageEdgeInsets" minX="12" minY="12" maxX="12" maxY="12"/>
                                 <inset key="imageEdgeInsets" minX="12" minY="12" maxX="12" maxY="12"/>
-                                <state key="normal" image="zoomOutMedia">
+                                <state key="normal">
                                     <color key="titleColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
                                     <color key="titleColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                                    <imageReference key="image" image="minus" catalog="system" symbolScale="default"/>
                                 </state>
                                 </state>
                                 <state key="disabled">
                                 <state key="disabled">
                                     <color key="titleColor" white="0.66666666666666663" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
                                     <color key="titleColor" white="0.66666666666666663" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
@@ -97,7 +99,7 @@
                     <blurEffect style="regular"/>
                     <blurEffect style="regular"/>
                 </visualEffectView>
                 </visualEffectView>
                 <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="IxY-xH-yZQ">
                 <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="IxY-xH-yZQ">
-                    <rect key="frame" x="8" y="10" width="208" height="40"/>
+                    <rect key="frame" x="8" y="69" width="281" height="40"/>
                     <constraints>
                     <constraints>
                         <constraint firstAttribute="height" constant="40" id="S6o-Pa-sxy"/>
                         <constraint firstAttribute="height" constant="40" id="S6o-Pa-sxy"/>
                     </constraints>
                     </constraints>
@@ -106,7 +108,7 @@
                     <nil key="highlightedColor"/>
                     <nil key="highlightedColor"/>
                 </label>
                 </label>
                 <visualEffectView opaque="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="enp-xt-Y5y">
                 <visualEffectView opaque="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="enp-xt-Y5y">
-                    <rect key="frame" x="272" y="10" width="40" height="40"/>
+                    <rect key="frame" x="345" y="69" width="40" height="40"/>
                     <view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" insetsLayoutMarginsFromSafeArea="NO" id="KKR-Hr-av8">
                     <view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" insetsLayoutMarginsFromSafeArea="NO" id="KKR-Hr-av8">
                         <rect key="frame" x="0.0" y="0.0" width="40" height="40"/>
                         <rect key="frame" x="0.0" y="0.0" width="40" height="40"/>
                         <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
                         <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
@@ -115,7 +117,7 @@
                                 <rect key="frame" x="0.0" y="0.0" width="40" height="40"/>
                                 <rect key="frame" x="0.0" y="0.0" width="40" height="40"/>
                                 <color key="tintColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
                                 <color key="tintColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
                                 <inset key="imageEdgeInsets" minX="4" minY="4" maxX="4" maxY="4"/>
                                 <inset key="imageEdgeInsets" minX="4" minY="4" maxX="4" maxY="4"/>
-                                <state key="normal" image="more"/>
+                                <state key="normal" image="ellipsis" catalog="system"/>
                                 <connections>
                                 <connections>
                                     <action selector="moreButtonPressed:" destination="iN0-l3-epB" eventType="touchUpInside" id="EeF-Eg-Pqi"/>
                                     <action selector="moreButtonPressed:" destination="iN0-l3-epB" eventType="touchUpInside" id="EeF-Eg-Pqi"/>
                                 </connections>
                                 </connections>
@@ -135,7 +137,7 @@
                     <blurEffect style="regular"/>
                     <blurEffect style="regular"/>
                 </visualEffectView>
                 </visualEffectView>
                 <activityIndicatorView hidden="YES" opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" hidesWhenStopped="YES" style="white" translatesAutoresizingMaskIntoConstraints="NO" id="XVj-jD-9KA">
                 <activityIndicatorView hidden="YES" opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" hidesWhenStopped="YES" style="white" translatesAutoresizingMaskIntoConstraints="NO" id="XVj-jD-9KA">
-                    <rect key="frame" x="150" y="-9" width="20" height="20"/>
+                    <rect key="frame" x="186.66666666666666" y="50" width="20" height="20"/>
                     <color key="color" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
                     <color key="color" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
                 </activityIndicatorView>
                 </activityIndicatorView>
             </subviews>
             </subviews>
@@ -168,9 +170,9 @@
         </view>
         </view>
     </objects>
     </objects>
     <resources>
     <resources>
-        <image name="more" width="425" height="425"/>
-        <image name="plus-slash-minus" width="512" height="512"/>
-        <image name="zoomInMedia" width="512" height="512"/>
-        <image name="zoomOutMedia" width="512" height="512"/>
+        <image name="ellipsis" catalog="system" width="128" height="37"/>
+        <image name="minus" catalog="system" width="128" height="26"/>
+        <image name="plus" catalog="system" width="128" height="113"/>
+        <image name="plus.slash.minus" catalog="system" width="128" height="115"/>
     </resources>
     </resources>
 </document>
 </document>

+ 2 - 2
iOSClient/Menu/AppDelegate+Menu.swift

@@ -57,7 +57,7 @@ extension AppDelegate {
             NCMenuAction(
             NCMenuAction(
                 title: NSLocalizedString("_upload_file_", comment: ""), icon: UIImage(named: "file")!.image(color: UIColor.systemGray, size: 50), action: { _ in
                 title: NSLocalizedString("_upload_file_", comment: ""), icon: UIImage(named: "file")!.image(color: UIColor.systemGray, size: 50), action: { _ in
                     if let tabBarController = self.window?.rootViewController as? UITabBarController {
                     if let tabBarController = self.window?.rootViewController as? UITabBarController {
-                        self.documentPickerViewController = NCDocumentPickerViewController(tabBarController: tabBarController)
+                        self.documentPickerViewController = NCDocumentPickerViewController(tabBarController: tabBarController, isViewerMedia: false, allowsMultipleSelection: true)
                     }
                     }
                 }
                 }
             )
             )
@@ -86,7 +86,7 @@ extension AppDelegate {
 
 
         actions.append(
         actions.append(
             NCMenuAction(
             NCMenuAction(
-                title: NSLocalizedString("_scans_document_", comment: ""), icon: NCUtility.shared.loadImage(named: "scan"), action: { _ in
+                title: NSLocalizedString("_scans_document_", comment: ""), icon: NCUtility.shared.loadImage(named: "doc.text.viewfinder"), action: { _ in
                     if let viewController = appDelegate.window?.rootViewController {
                     if let viewController = appDelegate.window?.rootViewController {
                         NCDocumentCamera.shared.openScannerDocument(viewController: viewController)
                         NCDocumentCamera.shared.openScannerDocument(viewController: viewController)
                     }
                     }

+ 1 - 1
iOSClient/Menu/NCCollectionViewCommon+Menu.swift

@@ -82,7 +82,7 @@ extension NCCollectionViewCommon {
                     icon: NCUtility.shared.loadImage(named: "info"),
                     icon: NCUtility.shared.loadImage(named: "info"),
                     order: 10,
                     order: 10,
                     action: { _ in
                     action: { _ in
-                        NCActionCenter.shared.openShare(viewController: self, metadata: metadata, indexPage: .activity)
+                        NCActionCenter.shared.openShare(viewController: self, metadata: metadata, page: .activity)
                     }
                     }
                 )
                 )
             )
             )

Some files were not shown because too many files changed in this diff