NCDataSource.swift 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243
  1. //
  2. // NCDataSource.swift
  3. // Nextcloud
  4. //
  5. // Created by Marino Faggiana on 06/09/2020.
  6. // Copyright © 2020 Marino Faggiana. All rights reserved.
  7. //
  8. // Author Marino Faggiana <marino.faggiana@nextcloud.com>
  9. //
  10. // This program is free software: you can redistribute it and/or modify
  11. // it under the terms of the GNU General Public License as published by
  12. // the Free Software Foundation, either version 3 of the License, or
  13. // (at your option) any later version.
  14. //
  15. // This program is distributed in the hope that it will be useful,
  16. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  17. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  18. // GNU General Public License for more details.
  19. //
  20. // You should have received a copy of the GNU General Public License
  21. // along with this program. If not, see <http://www.gnu.org/licenses/>.
  22. //
  23. import Foundation
  24. class NCDataSource: NSObject {
  25. public var metadatas: [tableMetadata] = []
  26. public var metadataLocalImage: [String:String] = [:]
  27. private var sort: String = ""
  28. private var ascending: Bool = true
  29. private var directoryOnTop: Bool = true
  30. private var filterLivePhoto: Bool = true
  31. override init() {
  32. super.init()
  33. }
  34. init(metadatasSource: [tableMetadata], sort: String, ascending: Bool, directoryOnTop: Bool, filterLivePhoto: Bool) {
  35. super.init()
  36. self.sort = sort
  37. self.ascending = ascending
  38. self.directoryOnTop = directoryOnTop
  39. self.filterLivePhoto = filterLivePhoto
  40. createMetadatas(metadatasSource: metadatasSource)
  41. }
  42. // MARK: -
  43. private func createMetadatas(metadatasSource: [tableMetadata]) {
  44. var metadatasFavorite: [tableMetadata] = []
  45. var metadatasTemp: [tableMetadata] = []
  46. var numDirectory: Int = 0
  47. var numDirectoryFavorite:Int = 0
  48. /*
  49. Metadata order
  50. */
  51. let metadatasSourceSorted = metadatasSource.sorted { (obj1:tableMetadata, obj2:tableMetadata) -> Bool in
  52. if sort == "date" {
  53. if ascending {
  54. return obj1.date.compare(obj2.date as Date) == ComparisonResult.orderedAscending
  55. } else {
  56. return obj1.date.compare(obj2.date as Date) == ComparisonResult.orderedDescending
  57. }
  58. } else if sort == "sessionTaskIdentifier" {
  59. if ascending {
  60. return obj1.sessionTaskIdentifier > obj2.sessionTaskIdentifier
  61. } else {
  62. return obj1.sessionTaskIdentifier < obj2.sessionTaskIdentifier
  63. }
  64. } else if sort == "size" {
  65. if ascending {
  66. return obj1.size > obj2.size
  67. } else {
  68. return obj1.size < obj2.size
  69. }
  70. } else {
  71. let range = Range(NSMakeRange(0, obj1.fileNameView.count), in: obj1.fileNameView)
  72. if ascending {
  73. return obj1.fileNameView.compare(obj2.fileNameView, options: .caseInsensitive, range: range, locale: .current) == ComparisonResult.orderedAscending
  74. } else {
  75. return obj1.fileNameView.compare(obj2.fileNameView, options: .caseInsensitive, range: range, locale: .current) == ComparisonResult.orderedDescending
  76. }
  77. }
  78. }
  79. /*
  80. Initialize datasource
  81. */
  82. for metadata in metadatasSourceSorted {
  83. // skipped livePhoto
  84. if metadata.ext == "mov" && metadata.livePhoto && filterLivePhoto {
  85. continue
  86. }
  87. // is Local / offline
  88. if !metadata.directory {
  89. let size = CCUtility.fileProviderStorageSize(metadata.ocId, fileNameView: metadata.fileNameView)
  90. if size > 0 {
  91. let tableLocalFile = NCManageDatabase.sharedInstance.getTableLocalFile(predicate: NSPredicate(format: "ocId == %@", metadata.ocId))
  92. if tableLocalFile == nil && size == metadata.size {
  93. NCManageDatabase.sharedInstance.addLocalFile(metadata: metadata)
  94. }
  95. if tableLocalFile?.offline ?? false {
  96. metadataLocalImage[metadata.ocId] = "offlineFlag"
  97. } else {
  98. metadataLocalImage[metadata.ocId] = "local"
  99. }
  100. }
  101. }
  102. if metadata.directory && directoryOnTop {
  103. if metadata.favorite {
  104. metadatasTemp.insert(metadata, at: numDirectoryFavorite)
  105. numDirectoryFavorite += 1
  106. numDirectory += 1
  107. } else {
  108. metadatasTemp.insert(metadata, at: numDirectory)
  109. numDirectory += 1
  110. }
  111. } else {
  112. if metadata.favorite && directoryOnTop {
  113. metadatasFavorite.append(metadata)
  114. } else {
  115. metadatasTemp.append(metadata)
  116. }
  117. }
  118. }
  119. if directoryOnTop && metadatasFavorite.count > 0 {
  120. metadatasTemp.insert(contentsOf: metadatasFavorite, at: numDirectory)
  121. }
  122. self.metadatas = metadatasTemp
  123. }
  124. // MARK: -
  125. func getFilesInformation() -> (directories: Int, files: Int, size: Double) {
  126. var directories: Int = 0
  127. var files: Int = 0
  128. var size: Double = 0
  129. for metadata in self.metadatas {
  130. if metadata.directory {
  131. directories += 1
  132. } else {
  133. files += 1
  134. }
  135. size = size + metadata.size
  136. }
  137. return (directories, files, size)
  138. }
  139. func deleteMetadata(ocId: String) -> Int? {
  140. if let index = self.getIndexMetadata(ocId: ocId) {
  141. self.metadatas.remove(at: index)
  142. return index
  143. }
  144. return nil
  145. }
  146. @discardableResult
  147. func reloadMetadata(ocId: String, ocIdTemp: String? = nil) -> Int? {
  148. var index: Int?
  149. if ocIdTemp != nil {
  150. index = self.getIndexMetadata(ocId: ocIdTemp!)
  151. } else {
  152. index = self.getIndexMetadata(ocId: ocId)
  153. }
  154. if index != nil {
  155. if let metadata = NCManageDatabase.sharedInstance.getMetadataFromOcId(ocId) {
  156. self.metadatas[index!] = metadata
  157. }
  158. }
  159. return index
  160. }
  161. func addMetadata(_ metadata: tableMetadata) -> Int? {
  162. var index: Int = 0
  163. // Already exists
  164. for metadataCount in metadatas {
  165. if metadataCount.fileNameView == metadata.fileNameView || metadataCount.ocId == metadata.ocId {
  166. metadatas[index] = metadata
  167. return index
  168. }
  169. index += 1
  170. }
  171. // Append & rebuild
  172. self.metadatas.append(metadata)
  173. createMetadatas(metadatasSource: metadatas)
  174. return getIndexMetadata(ocId: metadata.ocId)
  175. }
  176. func getIndexMetadata(ocId: String) -> Int? {
  177. var index: Int = 0
  178. for metadataCount in metadatas {
  179. if metadataCount.ocId == ocId {
  180. return index
  181. }
  182. index += 1
  183. }
  184. return nil
  185. }
  186. func numberOfItems() -> Int {
  187. return self.metadatas.count
  188. }
  189. func cellForItemAt(indexPath: IndexPath) -> tableMetadata? {
  190. let row = indexPath.row
  191. if row > self.metadatas.count - 1 {
  192. return nil
  193. } else {
  194. return self.metadatas[row]
  195. }
  196. }
  197. }