Forráskód Böngészése

VLCGoogleDriveController: Implement files sorting

This adds the VLCCloudSortingSpecifierManager which allows sorting by name or date
Zhizhang Deng 6 éve
szülő
commit
4504063c5d

+ 3 - 0
Resources/Base.lproj/Localizable.strings

@@ -330,3 +330,6 @@
 
 /* New strings */
 "Settings" = "Settings";
+
+"MODIFIED_DATE" = "Modified date";
+"NAME" = "Name";

+ 3 - 0
Resources/en.lproj/Localizable.strings

@@ -312,3 +312,6 @@
 "MOVIES" = "Movies";
 "SONGS" = "Songs";
 "PLAYLISTS" = "Playlists";
+
+"MODIFIED_DATE" = "Modified date";
+"NAME" = "Name";

+ 71 - 0
Sources/VLCCloudSortingSpecifierManager.swift

@@ -0,0 +1,71 @@
+/*****************************************************************************
+ * VLCCloudSortingSpecifierManager.swift
+ * VLC for iOS
+ *****************************************************************************
+ * Copyright © 2018 VLC authors and VideoLAN
+ * $Id$
+ *
+ * Authors: Zhizhang Deng <andy@dzz007.com>
+ *
+ * Refer to the COPYING file of the official project for license.
+ *****************************************************************************/
+
+import UIKit
+
+class VLCCloudSortingSpecifierManager: NSObject {
+    @objc weak var controller: VLCCloudStorageTableViewController!
+    
+    var items: NSArray {
+        let items: NSArray = [NSLocalizedString("NAME", comment: ""),
+            NSLocalizedString("MODIFIED_DATE", comment: "")]
+        return items
+    }
+    
+    @objc var selectedIndex: IndexPath {
+        return IndexPath(row: controller.controller.sortBy.rawValue, section: 0)
+    }
+    
+    @objc init(controller: VLCCloudStorageTableViewController) {
+        self.controller = controller
+        super.init()
+    }
+}
+
+// MARK: VLCActionSheetDelegate
+
+extension VLCCloudSortingSpecifierManager: VLCActionSheetDelegate {
+    
+    func headerViewTitle() -> String? {
+        return NSLocalizedString("SORT_BY", comment: "")
+    }
+    
+    func itemAtIndexPath(_ indexPath: IndexPath) -> Any? {
+        return items[indexPath.row]
+    }
+    
+    func actionSheet(collectionView: UICollectionView, didSelectItem item: Any, At indexPath: IndexPath) {
+        controller?.controller!.sortBy = VLCCloudSortingCriteria.init(rawValue: items.index(of: item))!
+        controller?.requestInformationForCurrentPath()
+    }
+}
+
+// MARK: VLCActionSheetDataSource
+
+extension VLCCloudSortingSpecifierManager: VLCActionSheetDataSource {
+    
+    func numberOfRows() -> Int {
+        return items.count
+    }
+    
+    func actionSheet(collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
+        guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: VLCSettingsSheetCell.identifier, for: indexPath) as? VLCSettingsSheetCell else {
+            return UICollectionViewCell()
+        }
+        
+        if indexPath.row < items.count {
+            cell.name.text = items[indexPath.row] as? String
+        }
+        
+        return cell
+    }
+}

+ 8 - 0
Sources/VLCCloudStorageController.h

@@ -8,6 +8,11 @@
 
 #import <Foundation/Foundation.h>
 
+typedef NS_ENUM (NSInteger, VLCCloudSortingCriteria) {
+    VLCCloudSortingCriteriaName,
+    VLCCloudSortingCriteriaModifiedDate
+};
+
 @protocol VLCCloudStorageDelegate <NSObject>
 
 @required
@@ -28,11 +33,14 @@
 @property (nonatomic, readwrite) BOOL isAuthorized;
 @property (nonatomic, readonly) NSArray *currentListFiles;
 @property (nonatomic, readonly) BOOL canPlayAll;
+@property (nonatomic, readwrite) VLCCloudSortingCriteria sortBy;
+
 
 + (instancetype)sharedInstance;
 
 - (void)startSession;
 - (void)logout;
 - (void)requestDirectoryListingAtPath:(NSString *)path;
+- (BOOL)supportSorting;
 
 @end

+ 3 - 0
Sources/VLCCloudStorageController.m

@@ -25,5 +25,8 @@
 {
     // nop
 }
+- (BOOL)supportSorting {
+    return NO;  //Return NO by default. If a subclass implemented sorting, override this method to return YES
+}
 
 @end

+ 1 - 0
Sources/VLCCloudStorageTableViewController.h

@@ -22,6 +22,7 @@
 @property (nonatomic, strong) IBOutlet UIImageView *cloudStorageLogo;
 
 @property (nonatomic, strong) UIBarButtonItem *numberOfFilesBarButtonItem;
+@property (nonatomic, strong) UIBarButtonItem *sortBarButtonItem;
 @property (nonatomic, strong) VLCCloudStorageController *controller;
 @property (nonatomic, strong) NSString *currentPath;
 @property (nonatomic) BOOL authorizationInProgress;

+ 48 - 5
Sources/VLCCloudStorageTableViewController.m

@@ -20,6 +20,8 @@
 @interface VLCCloudStorageTableViewController()
 {
     VLCProgressView *_progressView;
+    VLCActionSheet *sheet;
+    VLCCloudSortingSpecifierManager *manager;
     UIRefreshControl *_refreshControl;
     UIBarButtonItem *_progressBarButtonItem;
     UIBarButtonItem *_logoutButton;
@@ -58,7 +60,9 @@
     self.tableView.rowHeight = [VLCCloudStorageTableViewCell heightOfCell];
 
     _numberOfFilesBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:[NSString stringWithFormat:NSLocalizedString(@"NUM_OF_FILES", nil), 0] style:UIBarButtonItemStylePlain target:nil action:nil];
-    [_numberOfFilesBarButtonItem setTitleTextAttributes:@{ NSFontAttributeName : [UIFont systemFontOfSize:11.] } forState:UIControlStateNormal];
+    _sortBarButtonItem = [[UIBarButtonItem alloc] initWithTitle: [NSString stringWithFormat:NSLocalizedString(@"SORT", nil), 0]
+                                                          style:UIBarButtonItemStylePlain target:self action:@selector(sortButtonClicked:)];
+    _sortBarButtonItem.tintColor = PresentationTheme.current.colors.orangeUI;
     _numberOfFilesBarButtonItem.tintColor = PresentationTheme.current.colors.orangeUI;
 
     _activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
@@ -73,6 +77,13 @@
     _progressView = [VLCProgressView new];
     _progressBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:_progressView];
     _progressView.tintColor = PresentationTheme.current.colors.orangeUI;
+    
+    sheet = [[VLCActionSheet alloc] init];
+    manager = [[VLCCloudSortingSpecifierManager alloc] initWithController: self];
+    sheet.dataSource = manager;
+    sheet.delegate = manager;
+    sheet.modalPresentationStyle = UIModalPresentationCustom;
+    [sheet.collectionView registerClass:[VLCSettingsSheetCell class] forCellWithReuseIdentifier:VLCSettingsSheetCell.identifier];
 
     [self _showProgressInToolbar:NO];
     [self updateForTheme];
@@ -138,10 +149,23 @@
         self.numberOfFilesBarButtonItem.title = NSLocalizedString(@"ONE_FILE", nil);
 }
 
+- (NSArray*)_generateToolbarItemsWithSortButton : (BOOL)withsb
+{
+    NSMutableArray* result = [NSMutableArray array];
+    if (withsb)
+    {
+        [result addObjectsFromArray:@[[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil], _sortBarButtonItem]];
+    }
+    [result addObjectsFromArray:@[[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil], _numberOfFilesBarButtonItem, [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil]]];
+    return result;
+}
+
 - (void)_showProgressInToolbar:(BOOL)value
 {
-    if (!value)
-        [self setToolbarItems:@[[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil], _numberOfFilesBarButtonItem, [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil]] animated:YES];
+    if (!value) {
+        [self setToolbarItems:[self _generateToolbarItemsWithSortButton:[self.controller supportSorting]] animated:YES];
+        
+    }
     else {
         _progressView.progressBar.progress = 0.;
         [self setToolbarItems:@[[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil], _progressBarButtonItem, [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil]] animated:YES];
@@ -203,13 +227,25 @@
 
 - (void)updateViewAfterSessionChange
 {
+    BOOL hasProgressbar = NO;
+    for (id item in self.toolbarItems) {
+        if (item == _progressBarButtonItem) {
+            hasProgressbar = YES;
+        }
+    }
+    if (!hasProgressbar) {
+        //Only show sorting button and number of files button when there is no progress bar in the toolbar
+        //Only show sorting button when controller support sorting and is authorized
+        [self setToolbarItems:[self _generateToolbarItemsWithSortButton:self.controller.isAuthorized && [self.controller supportSorting]] animated:YES];
+       
+    }
     if (self.controller.canPlayAll) {
         self.navigationItem.rightBarButtonItems = @[_logoutButton, [UIBarButtonItem themedPlayAllButtonWithTarget:self andSelector:@selector(playAllAction:)]];
     } else {
         self.navigationItem.rightBarButtonItem = _logoutButton;
     }
 
-    if(_authorizationInProgress || [self.controller isAuthorized]) {
+    if (_authorizationInProgress || [self.controller isAuthorized]) {
         if (self.loginToCloudStorageView.superview) {
             [self.loginToCloudStorageView removeFromSuperview];
         }
@@ -225,7 +261,7 @@
     if (self.currentPath == nil) {
         self.currentPath = @"";
     }
-    if([self.controller.currentListFiles count] == 0)
+    if ([self.controller.currentListFiles count] == 0)
         [self requestInformationForCurrentPath];
 }
 
@@ -235,6 +271,13 @@
     [self updateViewAfterSessionChange];
 }
 
+- (void)sortButtonClicked:(UIBarButtonItem*)sender
+{
+    [self presentViewController:self->sheet animated:YES completion:^{
+        [self->sheet.collectionView selectItemAtIndexPath:self->manager.selectedIndex animated:NO scrollPosition:UICollectionViewScrollPositionCenteredVertically];
+    }];
+}
+
 - (IBAction)loginAction:(id)sender
 {
 }

+ 1 - 1
Sources/VLCGoogleDriveController.h

@@ -23,5 +23,5 @@
 - (void)streamFile:(GTLRDrive_File *)file;
 - (void)downloadFileToDocumentFolder:(GTLRDrive_File *)file;
 - (BOOL)hasMoreFiles;
-
+- (BOOL)supportSorting;
 @end

+ 12 - 8
Sources/VLCGoogleDriveController.m

@@ -53,6 +53,7 @@
 
     dispatch_once(&pred, ^{
         sharedInstance = [VLCGoogleDriveController new];
+        sharedInstance.sortBy = VLCCloudSortingCriteriaName; //Default sort by file names
     });
 
     return sharedInstance;
@@ -141,6 +142,11 @@
     return NO;
 }
 
+- (BOOL)supportSorting
+{
+    return YES; //Google drive controller implemented sorting
+}
+
 - (void)requestDirectoryListingAtPath:(NSString *)path
 {
     if (self.isAuthorized) {
@@ -186,6 +192,12 @@
     //the results don't come in alphabetical order when paging. So the maxresult (default 100) is set to 1000 in order to get a few more files at once.
     //query.pageSize = 1000;
     query.fields = @"files(*)";
+    
+    //Set orderBy parameter based on sortBy
+    if (self.sortBy == VLCCloudSortingCriteriaName)
+        query.orderBy = @"folder,name,modifiedTime desc";
+    else
+        query.orderBy = @"modifiedTime desc,folder,name";
 
     if (![_folderId isEqualToString:@""]) {
         parentName = [_folderId lastPathComponent];
@@ -276,14 +288,6 @@
 
     APLog(@"found filtered metadata for %lu files", (unsigned long)_currentFileList.count);
 
-    //the files come in a chaotic order so we order alphabetically
-     NSArray *sortedArray = [_currentFileList sortedArrayUsingComparator:^NSComparisonResult(id a, id b) {
-        NSString *first = [(GTLRDrive_File *)a name];
-        NSString *second = [(GTLRDrive_File *)b name];
-        return [first compare:second];
-    }];
-    _currentFileList = sortedArray;
-
     if ([self.delegate respondsToSelector:@selector(mediaListUpdated)])
         [self.delegate mediaListUpdated];
 }

+ 6 - 4
VLC.xcodeproj/project.pbxproj

@@ -248,8 +248,8 @@
 		7DF90B4A1BE7A8110059C0E3 /* IASKSettingsReader.m in Sources */ = {isa = PBXBuildFile; fileRef = 7DF90B471BE7A8110059C0E3 /* IASKSettingsReader.m */; };
 		7DF90B4B1BE7A8110059C0E3 /* IASKSpecifier.m in Sources */ = {isa = PBXBuildFile; fileRef = 7DF90B491BE7A8110059C0E3 /* IASKSpecifier.m */; };
 		7DF9352F1958AB0600E60FD4 /* UIColor+Presets.m in Sources */ = {isa = PBXBuildFile; fileRef = 7DF9352E1958AB0600E60FD4 /* UIColor+Presets.m */; };
-		8D222DC220F779F1009C0D34 /* MediaEditCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8D222DC120F779F1009C0D34 /* MediaEditCell.swift */; };
 		81334053F6D89AB90E14A1C3 /* libPods-VLC-iOSTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 91CCB170FBC97B6B93B99E0A /* libPods-VLC-iOSTests.a */; };
+		8D222DC220F779F1009C0D34 /* MediaEditCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8D222DC120F779F1009C0D34 /* MediaEditCell.swift */; };
 		8D43712D2056AF1600F36458 /* VLCRendererDiscovererManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8D43712C2056AF1600F36458 /* VLCRendererDiscovererManager.swift */; };
 		8D437154205808FF00F36458 /* VLCActionSheet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8D437153205808FF00F36458 /* VLCActionSheet.swift */; };
 		8D4F9B472141630000E478BE /* MediaModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8D4F9B462141630000E478BE /* MediaModel.swift */; };
@@ -294,6 +294,7 @@
 		CC1BBC56170493C100A20CBF /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CC1BBC55170493C100A20CBF /* QuartzCore.framework */; };
 		CC1BBC58170493E100A20CBF /* CoreData.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CC1BBC57170493E100A20CBF /* CoreData.framework */; };
 		CCE2A22E17A5859E00D9EAAD /* CoreText.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CCE2A22D17A5859E00D9EAAD /* CoreText.framework */; };
+		D0AF091F220A741300076D07 /* VLCCloudSortingSpecifierManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0AF091E220A741300076D07 /* VLCCloudSortingSpecifierManager.swift */; };
 		D0B4747EFAB8D3C480603D86 /* libPods-VLC-iOSUITests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 65EC8984D840047F50AA00A1 /* libPods-VLC-iOSUITests.a */; };
 		D6E034ED1CC284FC0037F516 /* VLCStreamingHistoryCell.m in Sources */ = {isa = PBXBuildFile; fileRef = D6E034EC1CC284FC0037F516 /* VLCStreamingHistoryCell.m */; };
 		DD13A37B1BEE2FAA00A35554 /* VLCMaskView.m in Sources */ = {isa = PBXBuildFile; fileRef = DD13A37A1BEE2FAA00A35554 /* VLCMaskView.m */; };
@@ -417,7 +418,7 @@
 		2B1BC34A3BC4BCE7588BD68A /* Pods-VLC-tvOS.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-VLC-tvOS.release.xcconfig"; path = "Pods/Target Support Files/Pods-VLC-tvOS/Pods-VLC-tvOS.release.xcconfig"; sourceTree = "<group>"; };
 		3B75A76DF6589FE678357D42 /* Pods-VLC-iOS.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-VLC-iOS.debug.xcconfig"; path = "Pods/Target Support Files/Pods-VLC-iOS/Pods-VLC-iOS.debug.xcconfig"; sourceTree = "<group>"; };
 		3E95DC30A81B2AF9F7442E00 /* Pods-VLC-iOSTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-VLC-iOSTests.debug.xcconfig"; path = "Pods/Target Support Files/Pods-VLC-iOSTests/Pods-VLC-iOSTests.debug.xcconfig"; sourceTree = "<group>"; };
-        411453B8219C48DA002D94E1 /* Launch Screen.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = "Launch Screen.storyboard"; sourceTree = "<group>"; };
+		411453B8219C48DA002D94E1 /* Launch Screen.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = "Launch Screen.storyboard"; sourceTree = "<group>"; };
 		41251ECB1FD0C5C100099110 /* VLC-iOS-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "VLC-iOS-Bridging-Header.h"; path = "vlc-ios/VLC-iOS-Bridging-Header.h"; sourceTree = SOURCE_ROOT; };
 		41251ECE1FD0CF7900099110 /* AppCoordinator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = AppCoordinator.swift; path = Sources/Coordinators/AppCoordinator.swift; sourceTree = SOURCE_ROOT; };
 		41273A391A955C4100A2EF77 /* VLCMigrationViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VLCMigrationViewController.h; path = Sources/VLCMigrationViewController.h; sourceTree = SOURCE_ROOT; };
@@ -754,8 +755,6 @@
 		7DBBF189183AB4300009A339 /* VLCEmptyLibraryView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = VLCEmptyLibraryView.xib; path = Resources/VLCEmptyLibraryView.xib; sourceTree = SOURCE_ROOT; };
 		7DBBF18F183AB4300009A339 /* VLCNetworkListCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = VLCNetworkListCell.xib; path = Resources/VLCNetworkListCell.xib; sourceTree = SOURCE_ROOT; };
 		7DBBF191183AB4300009A339 /* VLCMovieViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = VLCMovieViewController.xib; path = Resources/VLCMovieViewController.xib; sourceTree = SOURCE_ROOT; };
-		7DBC85611A50B8860098D388 /* LiveAuthDialog_iPad.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = LiveAuthDialog_iPad.xib; path = ImportedSources/OneDrive/src/LiveSDK/Library/Internal/LiveAuthDialog_iPad.xib; sourceTree = SOURCE_ROOT; };
-		7DBC85621A50B8860098D388 /* LiveAuthDialog_iPhone.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = LiveAuthDialog_iPhone.xib; path = ImportedSources/OneDrive/src/LiveSDK/Library/Internal/LiveAuthDialog_iPhone.xib; sourceTree = SOURCE_ROOT; };
 		7DC0B56D1C0094370027BFAD /* VLCSettingsViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VLCSettingsViewController.h; sourceTree = "<group>"; };
 		7DC0B56E1C0094370027BFAD /* VLCSettingsViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VLCSettingsViewController.m; sourceTree = "<group>"; };
 		7DC0B56F1C0094370027BFAD /* VLCSettingsViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = VLCSettingsViewController.xib; sourceTree = "<group>"; };
@@ -878,6 +877,7 @@
 		CCAF837E17DE46D800E3578F /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = pl.lproj/Localizable.strings; sourceTree = "<group>"; };
 		CCE2A22D17A5859E00D9EAAD /* CoreText.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreText.framework; path = System/Library/Frameworks/CoreText.framework; sourceTree = SDKROOT; };
 		CE6CC455148EC65B1D66CC66 /* libPods-VLC-iOS.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-VLC-iOS.a"; sourceTree = BUILT_PRODUCTS_DIR; };
+		D0AF091E220A741300076D07 /* VLCCloudSortingSpecifierManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = VLCCloudSortingSpecifierManager.swift; path = Sources/VLCCloudSortingSpecifierManager.swift; sourceTree = "<group>"; };
 		D6E034EB1CC284FC0037F516 /* VLCStreamingHistoryCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VLCStreamingHistoryCell.h; path = Sources/VLCStreamingHistoryCell.h; sourceTree = SOURCE_ROOT; };
 		D6E034EC1CC284FC0037F516 /* VLCStreamingHistoryCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = VLCStreamingHistoryCell.m; path = Sources/VLCStreamingHistoryCell.m; sourceTree = SOURCE_ROOT; };
 		DD13A3791BEE2FAA00A35554 /* VLCMaskView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VLCMaskView.h; path = "UI Elements/VLCMaskView.h"; sourceTree = "<group>"; };
@@ -1327,6 +1327,7 @@
 				7D7F9C0C1BFBB05400508518 /* VLCRemoteBrowsingTVCell+CloudStorage.m */,
 				9B088306183D7BEC004B5C2A /* VLCCloudStorageTableViewController.h */,
 				9B088307183D7BEC004B5C2A /* VLCCloudStorageTableViewController.m */,
+				D0AF091E220A741300076D07 /* VLCCloudSortingSpecifierManager.swift */,
 				4184AA131A5492070063DF5A /* VLCCloudStorageController.h */,
 				4184AA141A5492070063DF5A /* VLCCloudStorageController.m */,
 			);
@@ -3016,6 +3017,7 @@
 				8DE18890210B53E000A091D2 /* AudioModel.swift in Sources */,
 				8DE18898210F144B00A091D2 /* GenreModel.swift in Sources */,
 				419A2C661F37A4B70069D224 /* VLCStringsForLocalization.m in Sources */,
+				D0AF091F220A741300076D07 /* VLCCloudSortingSpecifierManager.swift in Sources */,
 				DDA1B9091CE902EE0076BC45 /* VLCNetworkServerLoginInformation+Keychain.m in Sources */,
 				8DE18892210B5BAD00A091D2 /* ArtistModel.swift in Sources */,
 				7D30F3DF183AB31E00FFC021 /* VLCWiFiUploadTableViewCell.m in Sources */,

+ 1 - 0
vlc-ios/VLC-iOS-Bridging-Header.h

@@ -27,3 +27,4 @@
 #import "VLCHTTPUploaderController.h"
 #import "VLCMediaFileDiscoverer.h"
 #import "VLCMigrationViewController.h"
+#import "VLCCloudStorageTableViewController.h"