CCSection.m 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311
  1. //
  2. // CCSection.m
  3. // Nextcloud iOS
  4. //
  5. // Created by Marino Faggiana on 04/02/16.
  6. // Copyright (c) 2017 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 "CCSection.h"
  24. #import "CCExifGeo.h"
  25. #import "NCBridgeSwift.h"
  26. @implementation CCSectionDataSourceMetadata
  27. - (id)init {
  28. self = [super init];
  29. _allRecordsDataSource = [[NSMutableDictionary alloc] init];
  30. _allFileID = [[NSMutableArray alloc] init];
  31. _sections = [[NSMutableArray alloc] init];
  32. _sectionArrayRow = [[NSMutableDictionary alloc] init];
  33. _fileIDIndexPath = [[NSMutableDictionary alloc] init];
  34. _image = 0;
  35. _video = 0;
  36. _directories = 0;
  37. _files = 0;
  38. _totalSize = 0;
  39. return self;
  40. }
  41. - (id)copyWithZone: (NSZone *) zone
  42. {
  43. CCSectionDataSourceMetadata *sectionDataSourceMetadata = [[CCSectionDataSourceMetadata allocWithZone: zone] init];
  44. [sectionDataSourceMetadata setAllRecordsDataSource: self.allRecordsDataSource];
  45. [sectionDataSourceMetadata setAllFileID: self.allFileID];
  46. [sectionDataSourceMetadata setSections: self.sections];
  47. [sectionDataSourceMetadata setSectionArrayRow: self.sectionArrayRow];
  48. [sectionDataSourceMetadata setFileIDIndexPath: self.fileIDIndexPath];
  49. [sectionDataSourceMetadata setVideo: self.video];
  50. [sectionDataSourceMetadata setImage: self.image];
  51. [sectionDataSourceMetadata setDirectories: self.directories];
  52. [sectionDataSourceMetadata setFiles: self.files];
  53. [sectionDataSourceMetadata setTotalSize: self.totalSize];
  54. return sectionDataSourceMetadata;
  55. }
  56. @end
  57. @implementation CCSectionMetadata
  58. //
  59. // orderByField : nil, date, typeFile
  60. //
  61. + (CCSectionDataSourceMetadata *)creataDataSourseSectionMetadata:(NSArray *)arrayMetadatas listProgressMetadata:(NSMutableDictionary *)listProgressMetadata groupByField:(NSString *)groupByField filterFileID:(NSArray *)filterFileID filterTypeFileImage:(BOOL)filterTypeFileImage filterTypeFileVideo:(BOOL)filterTypeFileVideo activeAccount:(NSString *)activeAccount
  62. {
  63. id dataSection;
  64. NSMutableArray *metadatas = [NSMutableArray new];
  65. NSMutableDictionary *dictionaryEtagMetadataForIndexPath = [NSMutableDictionary new];
  66. CCSectionDataSourceMetadata *sectionDataSource = [CCSectionDataSourceMetadata new];
  67. /*
  68. Initialize datasource
  69. */
  70. NSInteger numDirectory = 0;
  71. NSInteger numDirectoryFavorite = 0;
  72. BOOL directoryOnTop = [CCUtility getDirectoryOnTop];
  73. NSMutableArray *metadataFilesFavorite = [NSMutableArray new];
  74. for (tableMetadata *metadata in arrayMetadatas) {
  75. // *** LIST : DO NOT INSERT ***
  76. if (metadata.status == k_metadataStatusHide || [filterFileID containsObject: metadata.fileID] || (filterTypeFileImage == YES && [metadata.typeFile isEqualToString: k_metadataTypeFile_image]) || (filterTypeFileVideo == YES && [metadata.typeFile isEqualToString: k_metadataTypeFile_video])) {
  77. continue;
  78. }
  79. if ([listProgressMetadata objectForKey:metadata.fileID] && [groupByField isEqualToString:@"session"]) {
  80. [metadatas insertObject:metadata atIndex:0];
  81. } else {
  82. if (metadata.directory && directoryOnTop) {
  83. if (metadata.favorite) {
  84. [metadatas insertObject:metadata atIndex:numDirectoryFavorite++];
  85. numDirectory++;
  86. } else {
  87. [metadatas insertObject:metadata atIndex:numDirectory++];
  88. }
  89. } else {
  90. if (metadata.favorite && directoryOnTop) {
  91. [metadataFilesFavorite addObject:metadata];
  92. } else {
  93. [metadatas addObject:metadata];
  94. }
  95. }
  96. }
  97. }
  98. if (directoryOnTop && metadataFilesFavorite.count > 0)
  99. [metadatas insertObjects:metadataFilesFavorite atIndexes:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(numDirectoryFavorite, metadataFilesFavorite.count)]]; // Add Favorite files at end of favorite folders
  100. /*
  101. sectionArrayRow
  102. */
  103. for (tableMetadata *metadata in metadatas) {
  104. if ([metadata.session length] > 0 && [groupByField isEqualToString:@"session"]) {
  105. if ([metadata.session containsString:@"wwan"]) dataSection = [@"." stringByAppendingString:metadata.session];
  106. else dataSection = metadata.session;
  107. }
  108. else if ([groupByField isEqualToString:@"none"]) dataSection = @"_none_";
  109. else if ([groupByField isEqualToString:@"date"]) dataSection = [CCUtility datetimeWithOutTime:metadata.date];
  110. else if ([groupByField isEqualToString:@"alphabetic"]) dataSection = [[metadata.fileNameView substringToIndex:1] uppercaseString];
  111. else if ([groupByField isEqualToString:@"typefile"]) dataSection = metadata.typeFile;
  112. if (!dataSection) dataSection = @"_none_";
  113. NSMutableArray *metadatasSection = [sectionDataSource.sectionArrayRow objectForKey:dataSection];
  114. if (metadatasSection) {
  115. // ROW ++
  116. [metadatasSection addObject:metadata.fileID];
  117. [sectionDataSource.sectionArrayRow setObject:metadatasSection forKey:dataSection];
  118. } else {
  119. // SECTION ++
  120. metadatasSection = [[NSMutableArray alloc] initWithObjects:metadata.fileID, nil];
  121. [sectionDataSource.sectionArrayRow setObject:metadatasSection forKey:dataSection];
  122. }
  123. if (metadata && [metadata.fileID length] > 0)
  124. [dictionaryEtagMetadataForIndexPath setObject:metadata forKey:metadata.fileID];
  125. }
  126. /*
  127. Sections order
  128. */
  129. BOOL ascending;
  130. if ([groupByField isEqualToString:@"date"]) ascending = NO;
  131. else ascending = YES;
  132. NSArray *sortSections = [[sectionDataSource.sectionArrayRow allKeys] sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
  133. if ([groupByField isEqualToString:@"session"]) {
  134. if ([obj1 isKindOfClass:[NSString class]] && [obj1 containsString:@"download"]) return NSOrderedAscending;
  135. if ([obj2 isKindOfClass:[NSString class]] && [obj2 containsString:@"download"]) return NSOrderedDescending;
  136. if ([obj1 isKindOfClass:[NSString class]] && [obj1 containsString:@"upload"]) return NSOrderedAscending;
  137. if ([obj2 isKindOfClass:[NSString class]] && [obj2 containsString:@"upload"]) return NSOrderedDescending;
  138. }
  139. // Directory at Top
  140. if ([obj1 isKindOfClass:[NSString class]] && [obj1 containsString: k_metadataTypeFile_directory]) return NSOrderedAscending;
  141. if ([obj2 isKindOfClass:[NSString class]] && [obj2 containsString: k_metadataTypeFile_directory]) return NSOrderedDescending;
  142. if (ascending) return [obj1 compare:obj2];
  143. else return [obj2 compare:obj1];
  144. }];
  145. /*
  146. create allEtag, allRecordsDataSource, fileIDIndexPath, section
  147. */
  148. NSInteger indexSection = 0;
  149. NSInteger indexRow = 0;
  150. for (id section in sortSections) {
  151. [sectionDataSource.sections addObject:section];
  152. NSArray *rows = [sectionDataSource.sectionArrayRow objectForKey:section];
  153. for (NSString *fileID in rows) {
  154. tableMetadata *metadata = [dictionaryEtagMetadataForIndexPath objectForKey:fileID];
  155. if (metadata.fileID) {
  156. [sectionDataSource.allFileID addObject:metadata.fileID];
  157. [sectionDataSource.allRecordsDataSource setObject:metadata forKey:metadata.fileID];
  158. [sectionDataSource.fileIDIndexPath setObject:[NSIndexPath indexPathForRow:indexRow inSection:indexSection] forKey:metadata.fileID];
  159. if ([metadata.typeFile isEqualToString: k_metadataTypeFile_image])
  160. sectionDataSource.image++;
  161. if ([metadata.typeFile isEqualToString: k_metadataTypeFile_video])
  162. sectionDataSource.video++;
  163. if (metadata.directory)
  164. sectionDataSource.directories++;
  165. else {
  166. sectionDataSource.files++;
  167. sectionDataSource.totalSize = sectionDataSource.totalSize + metadata.size;
  168. }
  169. indexRow++;
  170. }
  171. }
  172. indexSection++;
  173. indexRow = 0;
  174. }
  175. /*
  176. end
  177. */
  178. return sectionDataSource;
  179. }
  180. + (void)removeAllObjectsSectionDataSource:(CCSectionDataSourceMetadata *)sectionDataSource
  181. {
  182. [sectionDataSource.allRecordsDataSource removeAllObjects];
  183. [sectionDataSource.allFileID removeAllObjects];
  184. [sectionDataSource.sections removeAllObjects];
  185. [sectionDataSource.sectionArrayRow removeAllObjects];
  186. [sectionDataSource.fileIDIndexPath removeAllObjects];
  187. sectionDataSource.image = 0;
  188. sectionDataSource.video = 0;
  189. sectionDataSource.directories = 0;
  190. sectionDataSource.files = 0;
  191. sectionDataSource.totalSize = 0;
  192. }
  193. @end
  194. @implementation CCSectionDataSourceActivity
  195. - (id)init {
  196. self = [super init];
  197. _sections = [NSMutableArray new];
  198. _sectionArrayRow = [NSMutableDictionary new];
  199. return self;
  200. }
  201. @end
  202. @implementation CCSectionActivity
  203. + (CCSectionDataSourceActivity *)creataDataSourseSectionActivity:(NSArray *)records activeAccount:(NSString *)activeAccount
  204. {
  205. CCSectionDataSourceActivity *sectionDataSource = [CCSectionDataSourceActivity new];
  206. NSDate *oldDate = [NSDate date];
  207. for (tableActivity *record in records) {
  208. NSDateComponents* comps = [[NSCalendar currentCalendar] components:NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay fromDate:record.date];
  209. NSDate *date = [[NSCalendar currentCalendar] dateFromComponents:comps];
  210. if ([oldDate compare:date] != NSOrderedSame) {
  211. [sectionDataSource.sections addObject:date];
  212. oldDate = date;
  213. }
  214. NSMutableArray *activities = [sectionDataSource.sectionArrayRow objectForKey:date];
  215. if (activities) {
  216. // ROW ++
  217. [activities addObject:record];
  218. [sectionDataSource.sectionArrayRow setObject:activities forKey:date];
  219. } else {
  220. // SECTION ++
  221. activities = [[NSMutableArray alloc] initWithObjects:record, nil];
  222. [sectionDataSource.sectionArrayRow setObject:activities forKey:date];
  223. }
  224. }
  225. return sectionDataSource;
  226. }
  227. @end