浏览代码

clean up VLCLocalServerDiscoveryController

Tobias Conradi 9 年之前
父节点
当前提交
58196c2fe7
共有 17 个文件被更改,包括 218 次插入333 次删除
  1. 0 0
      Sources/LocalNetworkConnectivity/ServerDiscovery/VLCLocalNetworkService-Protocol.h
  2. 0 0
      Sources/LocalNetworkConnectivity/ServerDiscovery/VLCLocalNetworkService.h
  3. 0 0
      Sources/LocalNetworkConnectivity/ServerDiscovery/VLCLocalNetworkService.m
  4. 0 0
      Sources/LocalNetworkConnectivity/ServerDiscovery/VLCLocalNetworkServiceBrowser-Protocol.h
  5. 0 0
      Sources/LocalNetworkConnectivity/ServerDiscovery/VLCLocalNetworkServiceBrowserManualConnect.h
  6. 0 0
      Sources/LocalNetworkConnectivity/ServerDiscovery/VLCLocalNetworkServiceBrowserManualConnect.m
  7. 0 0
      Sources/LocalNetworkConnectivity/ServerDiscovery/VLCLocalNetworkServiceBrowserMediaDiscoverer.h
  8. 0 0
      Sources/LocalNetworkConnectivity/ServerDiscovery/VLCLocalNetworkServiceBrowserMediaDiscoverer.m
  9. 0 0
      Sources/LocalNetworkConnectivity/ServerDiscovery/VLCLocalNetworkServiceBrowserNetService.h
  10. 0 0
      Sources/LocalNetworkConnectivity/ServerDiscovery/VLCLocalNetworkServiceBrowserNetService.m
  11. 0 0
      Sources/LocalNetworkConnectivity/ServerDiscovery/VLCLocalNetworkServiceBrowserUPnP.h
  12. 0 0
      Sources/LocalNetworkConnectivity/ServerDiscovery/VLCLocalNetworkServiceBrowserUPnP.m
  13. 4 9
      Sources/LocalNetworkConnectivity/VLCLocalServerDiscoveryController.h
  14. 156 0
      Sources/LocalNetworkConnectivity/ServerDiscovery/VLCLocalServerDiscoveryController.m
  15. 0 270
      Sources/LocalNetworkConnectivity/VLCLocalServerDiscoveryController.m
  16. 23 28
      Sources/LocalNetworkConnectivity/VLCServerListViewController.m
  17. 35 26
      VLC for iOS.xcodeproj/project.pbxproj

Sources/LocalNetworkConnectivity/VLCLocalNetworkService-Protocol.h → Sources/LocalNetworkConnectivity/ServerDiscovery/VLCLocalNetworkService-Protocol.h


Sources/LocalNetworkConnectivity/VLCLocalNetworkService.h → Sources/LocalNetworkConnectivity/ServerDiscovery/VLCLocalNetworkService.h


Sources/LocalNetworkConnectivity/VLCLocalNetworkService.m → Sources/LocalNetworkConnectivity/ServerDiscovery/VLCLocalNetworkService.m


Sources/LocalNetworkConnectivity/VLCLocalNetworkServiceBrowser-Protocol.h → Sources/LocalNetworkConnectivity/ServerDiscovery/VLCLocalNetworkServiceBrowser-Protocol.h


Sources/LocalNetworkConnectivity/VLCLocalNetworkServiceBrowserManualConnect.h → Sources/LocalNetworkConnectivity/ServerDiscovery/VLCLocalNetworkServiceBrowserManualConnect.h


Sources/LocalNetworkConnectivity/VLCLocalNetworkServiceBrowserManualConnect.m → Sources/LocalNetworkConnectivity/ServerDiscovery/VLCLocalNetworkServiceBrowserManualConnect.m


Sources/LocalNetworkConnectivity/VLCLocalNetworkServiceBrowserMediaDiscoverer.h → Sources/LocalNetworkConnectivity/ServerDiscovery/VLCLocalNetworkServiceBrowserMediaDiscoverer.h


Sources/LocalNetworkConnectivity/VLCLocalNetworkServiceBrowserMediaDiscoverer.m → Sources/LocalNetworkConnectivity/ServerDiscovery/VLCLocalNetworkServiceBrowserMediaDiscoverer.m


Sources/LocalNetworkConnectivity/VLCLocalNetworkServiceBrowserNetService.h → Sources/LocalNetworkConnectivity/ServerDiscovery/VLCLocalNetworkServiceBrowserNetService.h


Sources/LocalNetworkConnectivity/VLCLocalNetworkServiceBrowserNetService.m → Sources/LocalNetworkConnectivity/ServerDiscovery/VLCLocalNetworkServiceBrowserNetService.m


Sources/LocalNetworkConnectivity/VLCLocalNetworkServiceBrowserUPnP.h → Sources/LocalNetworkConnectivity/ServerDiscovery/VLCLocalNetworkServiceBrowserUPnP.h


Sources/LocalNetworkConnectivity/VLCLocalNetworkServiceBrowserUPnP.m → Sources/LocalNetworkConnectivity/ServerDiscovery/VLCLocalNetworkServiceBrowserUPnP.m


+ 4 - 9
Sources/LocalNetworkConnectivity/VLCLocalServerDiscoveryController.h

@@ -12,25 +12,20 @@
  *****************************************************************************/
 
 #import <Foundation/Foundation.h>
-#import "UPnPManager.h"
-
 #import "VLCLocalNetworkService.h"
 
-
 @protocol VLCLocalServerDiscoveryControllerDelegate <NSObject>
 - (void)discoveryFoundSomethingNew;
-
 @end
 
-
 @interface VLCLocalServerDiscoveryController : NSObject
-
 @property (nonatomic, readwrite, weak) id delegate;
-@property (nonatomic, readonly) NSArray *sectionHeaderTexts;
 
-- (id<VLCLocalNetworkService>)networkServiceForIndexPath:(NSIndexPath *)indexPath;
+- (NSUInteger)numberOfSections;
+- (NSString *)titleForSection:(NSUInteger)section;
+- (NSUInteger)numberOfItemsInSection:(NSUInteger)section;
 
-- (NSInteger)numberOfItemsInSection:(NSInteger)section;
+- (id<VLCLocalNetworkService>)networkServiceForIndexPath:(NSIndexPath *)indexPath;
 
 - (void)stopDiscovery;
 - (BOOL)refreshDiscoveredData;

+ 156 - 0
Sources/LocalNetworkConnectivity/ServerDiscovery/VLCLocalServerDiscoveryController.m

@@ -0,0 +1,156 @@
+/*****************************************************************************
+ * VLCLocalServerListViewController.m
+ * VLC for iOS
+ *****************************************************************************
+ * Copyright (c) 2013-2015 VideoLAN. All rights reserved.
+ * $Id$
+ *
+ * Authors: Felix Paul Kühne <fkuehne # videolan.org>
+ *          Pierre SAGASPE <pierre.sagaspe # me.com>
+ *          Tobias Conradi <videolan # tobias-conradi.de>
+ *
+ * Refer to the COPYING file of the official project for license.
+ *****************************************************************************/
+
+#import "VLCLocalServerDiscoveryController.h"
+
+#import "Reachability.h"
+
+#import "VLCLocalNetworkServiceBrowserNetService.h"
+#import "VLCLocalNetworkServiceBrowserMediaDiscoverer.h"
+#import "VLCLocalNetworkServiceBrowserManualConnect.h"
+#import "VLCLocalNetworkServiceBrowserUPnP.h"
+
+
+@interface VLCLocalServerDiscoveryController () <VLCLocalNetworkServiceBrowserDelegate>
+{
+    NSArray<id<VLCLocalNetworkServiceBrowser>> *_serviceBrowsers;
+    Reachability *_reachability;
+}
+
+@end
+
+@implementation VLCLocalServerDiscoveryController
+
+
+- (instancetype)init
+{
+    self = [super init];
+    if (!self)
+        return nil;
+
+    NSNotificationCenter *defaultCenter = [NSNotificationCenter defaultCenter];
+
+    [defaultCenter addObserver:self
+                      selector:@selector(stopDiscovery)
+                          name:UIApplicationWillResignActiveNotification
+                        object:[UIApplication sharedApplication]];
+
+    [defaultCenter addObserver:self
+                      selector:@selector(startDiscovery:)
+                          name:UIApplicationDidBecomeActiveNotification
+                        object:[UIApplication sharedApplication]];
+
+    _serviceBrowsers = @[
+                         [[VLCLocalNetworkServiceBrowserManualConnect alloc] init],
+                         [[VLCLocalNetworkServiceBrowserUPnP alloc] init],
+                         [[VLCLocalNetworkServiceBrowserPlex alloc] init],
+                         [[VLCLocalNetworkServiceBrowserFTP alloc] init],
+                         [[VLCLocalNetworkServiceBrowserHTTP alloc] init],
+                         [[VLCLocalNetworkServiceBrowserSAP alloc] init],
+                         [[VLCLocalNetworkServiceBrowserDSM alloc] init],
+                         ];
+
+    [_serviceBrowsers enumerateObjectsUsingBlock:^(id<VLCLocalNetworkServiceBrowser>  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
+        obj.delegate = self;
+    }];
+
+
+    _reachability = [Reachability reachabilityForLocalWiFi];
+    [_reachability startNotifier];
+
+    [self netReachabilityChanged];
+
+    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(netReachabilityChanged) name:kReachabilityChangedNotification object:nil];
+    
+    return self;
+}
+
+- (void)dealloc
+{
+    [[NSNotificationCenter defaultCenter] removeObserver:self];
+
+    [_reachability stopNotifier];
+    [self stopDiscovery];
+}
+
+- (void)startDiscovery
+{
+    if (_reachability.currentReachabilityStatus != ReachableViaWiFi) {
+        return;
+    }
+
+    [_serviceBrowsers makeObjectsPerformSelector:@selector(startDiscovery)];
+}
+
+- (void)stopDiscovery
+{
+    [_serviceBrowsers makeObjectsPerformSelector:@selector(stopDiscovery)];
+}
+
+- (BOOL)refreshDiscoveredData
+{
+    if (_reachability.currentReachabilityStatus != ReachableViaWiFi)
+        return NO;
+
+    [self stopDiscovery];
+    [self startDiscovery];
+
+    return YES;
+}
+
+#pragma mark - Reachability
+- (void)netReachabilityChanged
+{
+    if (_reachability.currentReachabilityStatus == ReachableViaWiFi) {
+        [self startDiscovery];
+    } else {
+        [self stopDiscovery];
+    }
+}
+
+#pragma mark - data source
+
+- (NSUInteger)numberOfSections {
+    return _serviceBrowsers.count;
+}
+
+- (NSString *)titleForSection:(NSUInteger)section
+{
+    id<VLCLocalNetworkServiceBrowser> browser = _serviceBrowsers[section];
+    return browser.name;
+}
+
+- (NSUInteger)numberOfItemsInSection:(NSUInteger)section
+{
+    id<VLCLocalNetworkServiceBrowser> browser = _serviceBrowsers[section];
+    return browser.numberOfItems;
+}
+
+- (id<VLCLocalNetworkService>)networkServiceForIndexPath:(NSIndexPath *)indexPath
+{
+    NSUInteger section = indexPath.section;
+    NSUInteger row = indexPath.row;
+
+    id<VLCLocalNetworkServiceBrowser> browser = _serviceBrowsers[section];
+    return [browser networkServiceForIndex:row];
+}
+
+#pragma mark - VLCLocalNetworkServiceBrowserDelegate
+- (void)localNetworkServiceBrowserDidUpdateServices:(id<VLCLocalNetworkServiceBrowser>)serviceBrowser {
+    if ([self.delegate respondsToSelector:@selector(discoveryFoundSomethingNew)]) {
+        [self.delegate discoveryFoundSomethingNew];
+    }
+}
+
+@end

+ 0 - 270
Sources/LocalNetworkConnectivity/VLCLocalServerDiscoveryController.m

@@ -1,270 +0,0 @@
-/*****************************************************************************
- * VLCLocalServerListViewController.m
- * VLC for iOS
- *****************************************************************************
- * Copyright (c) 2013-2015 VideoLAN. All rights reserved.
- * $Id$
- *
- * Authors: Felix Paul Kühne <fkuehne # videolan.org>
- *          Pierre SAGASPE <pierre.sagaspe # me.com>
- *          Tobias Conradi <videolan # tobias-conradi.de>
- *
- * Refer to the COPYING file of the official project for license.
- *****************************************************************************/
-
-#import "VLCLocalServerDiscoveryController.h"
-
-#import "VLCServerListViewController.h"
-#import "VLCPlaybackController.h"
-#import "VLCNetworkListCell.h"
-
-#import "VLCLocalPlexFolderListViewController.h"
-
-#import "VLCFTPServerListViewController.h"
-#import "VLCUPnPServerListViewController.h"
-#import "VLCDiscoveryListViewController.h"
-
-#import "VLCSharedLibraryListViewController.h"
-#import "VLCSharedLibraryParser.h"
-
-#import "VLCHTTPUploaderController.h"
-
-#import "Reachability.h"
-#import "VLCLocalNetworkServiceBrowserNetService.h"
-#import "VLCLocalNetworkServiceBrowserMediaDiscoverer.h"
-#import "VLCLocalNetworkServiceBrowserManualConnect.h"
-#import "VLCLocalNetworkServiceBrowserUPnP.h"
-
-typedef NS_ENUM(NSUInteger, VLCLocalServerSections) {
-    VLCLocalServerSectionGeneric = 0,
-    VLCLocalServerSectionUPnP,
-    VLCLocalServerSectionPlex,
-    VLCLocalServerSectionFTP,
-    VLCLocalServerSectionVLCiOS,
-    VLCLocalServerSectionSMB,
-    VLCLocalServerSectionSAP
-};
-
-
-
-@interface VLCLocalServerDiscoveryController () <VLCLocalNetworkServiceBrowserDelegate>
-{
-    id<VLCLocalNetworkServiceBrowser> _manualConnectBrowser;
-    id<VLCLocalNetworkServiceBrowser> _plexBrowser;
-    id<VLCLocalNetworkServiceBrowser> _FTPBrowser;
-    id<VLCLocalNetworkServiceBrowser> _HTTPBrowser;
-
-    id<VLCLocalNetworkServiceBrowser> _UPnPBrowser;
-
-    id<VLCLocalNetworkServiceBrowser> _sapBrowser;
-    id<VLCLocalNetworkServiceBrowser> _dsmBrowser;
-
-    Reachability *_reachability;
-
-    BOOL _setup;
-}
-
-@end
-
-@implementation VLCLocalServerDiscoveryController
-
-- (void)dealloc
-{
-    [[NSNotificationCenter defaultCenter] removeObserver:self];
-
-    [_reachability stopNotifier];
-    [self stopDiscovery];
-}
-
-- (void)stopDiscovery
-{
-    [_UPnPBrowser stopDiscovery];
-    [_sapBrowser stopDiscovery];
-    [_dsmBrowser stopDiscovery];
-
-    [_FTPBrowser stopDiscovery];
-    [_plexBrowser stopDiscovery];
-    [_HTTPBrowser stopDiscovery];
-}
-
-- (void)startDiscovery
-{
-    if (_reachability.currentReachabilityStatus != ReachableViaWiFi) {
-        return;
-    }
-
-    [_UPnPBrowser startDiscovery];
-    [_sapBrowser startDiscovery];
-    [_dsmBrowser startDiscovery];
-
-    [_FTPBrowser startDiscovery];
-    [_plexBrowser startDiscovery];
-    [_HTTPBrowser startDiscovery];
-}
-
-- (NSArray *)sectionHeaderTexts
-{
-    return @[_manualConnectBrowser.name,
-             _UPnPBrowser.name,
-             _plexBrowser.name,
-             _FTPBrowser.name,
-             _HTTPBrowser.name,
-             _dsmBrowser.name,
-             _sapBrowser.name];
-}
-
-- (instancetype)init
-{
-    self = [super init];
-    if (!self)
-        return nil;
-
-    NSNotificationCenter *defaultCenter = [NSNotificationCenter defaultCenter];
-
-    [defaultCenter addObserver:self
-                      selector:@selector(stopDiscovery)
-                          name:UIApplicationWillResignActiveNotification
-                        object:[UIApplication sharedApplication]];
-
-    [defaultCenter addObserver:self
-                      selector:@selector(startDiscovery:)
-                          name:UIApplicationDidBecomeActiveNotification
-                        object:[UIApplication sharedApplication]];
-
-    _manualConnectBrowser = [[VLCLocalNetworkServiceBrowserManualConnect alloc] init];
-
-    _plexBrowser = [[VLCLocalNetworkServiceBrowserPlex alloc] init];
-    _plexBrowser.delegate = self;
-    _FTPBrowser = [[VLCLocalNetworkServiceBrowserFTP alloc] init];
-    _FTPBrowser.delegate = self;
-    _HTTPBrowser = [[VLCLocalNetworkServiceBrowserHTTP alloc] init];
-    _HTTPBrowser.delegate = self;
-
-    _sapBrowser = [[VLCLocalNetworkServiceBrowserSAP alloc] init];
-    _sapBrowser.delegate = self;
-
-    _dsmBrowser = [[VLCLocalNetworkServiceBrowserDSM alloc] init];
-    _dsmBrowser.delegate = self;
-
-    _UPnPBrowser = [[VLCLocalNetworkServiceBrowserUPnP alloc] init];
-    _UPnPBrowser.delegate = self;
-
-    _reachability = [Reachability reachabilityForLocalWiFi];
-    [_reachability startNotifier];
-
-    [self netReachabilityChanged];
-
-    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(netReachabilityChanged) name:kReachabilityChangedNotification object:nil];
-
-    return self;
-}
-
-- (void)netReachabilityChanged
-{
-    if (_reachability.currentReachabilityStatus == ReachableViaWiFi) {
-        [self startDiscovery];
-    } else {
-        [self stopDiscovery];
-    }
-}
-
-#pragma mark - table view handling
-
-- (id<VLCLocalNetworkService>)networkServiceForIndexPath:(NSIndexPath *)indexPath
-{
-    VLCLocalServerSections section = indexPath.section;
-    NSUInteger row = indexPath.row;
-
-
-    switch (section) {
-        case VLCLocalServerSectionGeneric:
-        {
-            return [_manualConnectBrowser networkServiceForIndex:row];
-        }
-
-        case VLCLocalServerSectionUPnP:
-        {
-            return [_UPnPBrowser networkServiceForIndex:row];
-        }
-
-        case VLCLocalServerSectionPlex:
-        {
-            return [_plexBrowser networkServiceForIndex:row];
-        }
-
-        case VLCLocalServerSectionFTP:
-        {
-            return [_FTPBrowser networkServiceForIndex:row];
-        }
-
-        case VLCLocalServerSectionVLCiOS:
-        {
-            return [_HTTPBrowser networkServiceForIndex:row];
-        }
-
-        case VLCLocalServerSectionSMB:
-        {
-            return [_dsmBrowser networkServiceForIndex:row];
-        }
-
-        case VLCLocalServerSectionSAP:
-        {
-            return [_sapBrowser networkServiceForIndex:row];
-        }
-
-        default:
-            break;
-    }
-    return [[VLCLocalNetworkServiceItem alloc] initWithTile:@"FAIL"
-                                                       icon:nil];
-
-}
-
-- (NSInteger)numberOfItemsInSection:(NSInteger)section
-{
-    switch (section) {
-        case VLCLocalServerSectionGeneric:
-            return _manualConnectBrowser.numberOfItems;
-
-        case VLCLocalServerSectionUPnP:
-            return _UPnPBrowser.numberOfItems;
-
-        case VLCLocalServerSectionPlex:
-            return _plexBrowser.numberOfItems;
-
-        case VLCLocalServerSectionFTP:
-            return _FTPBrowser.numberOfItems;
-
-        case VLCLocalServerSectionVLCiOS:
-            return _HTTPBrowser.numberOfItems;
-
-        case VLCLocalServerSectionSMB:
-            return _dsmBrowser.numberOfItems;
-
-        case VLCLocalServerSectionSAP:
-            return _sapBrowser.numberOfItems;
-
-        default:
-            return 0;
-    }
-}
-
-- (BOOL)refreshDiscoveredData
-{
-    if (_reachability.currentReachabilityStatus != ReachableViaWiFi)
-         return NO;
-
-    [self stopDiscovery];
-    [self startDiscovery];
-
-    return YES;
-}
-
-#pragma mark - VLCLocalNetworkServiceBrowserDelegate
-- (void)localNetworkServiceBrowserDidUpdateServices:(id<VLCLocalNetworkServiceBrowser>)serviceBrowser {
-    if ([self.delegate respondsToSelector:@selector(discoveryFoundSomethingNew)]) {
-        [self.delegate discoveryFoundSomethingNew];
-    }
-}
-
-@end

+ 23 - 28
Sources/LocalNetworkConnectivity/VLCServerListViewController.m

@@ -30,7 +30,6 @@
     VLCLocalServerDiscoveryController *_discoveryController;
 
     UIBarButtonItem *_backToMenuButton;
-    NSArray *_sectionHeaderTexts;
 
     UIRefreshControl *_refreshControl;
     UIActivityIndicatorView *_activityIndicator;
@@ -68,8 +67,6 @@
     _discoveryController = [[VLCLocalServerDiscoveryController alloc] init];
     _discoveryController.delegate = self;
 
-    _sectionHeaderTexts = _discoveryController.sectionHeaderTexts;
-
     _backToMenuButton = [UIBarButtonItem themedRevealMenuButtonWithTarget:self andSelector:@selector(goBack:)];
     self.navigationItem.leftBarButtonItem = _backToMenuButton;
 
@@ -118,7 +115,7 @@
 
 - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
 {
-    return _sectionHeaderTexts.count;
+    return _discoveryController.numberOfSections;
 }
 
 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
@@ -275,31 +272,29 @@ confirmedWithUsername:(NSString *)username
 
 - (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
 {
-    NSObject *headerText = NSLocalizedString(_sectionHeaderTexts[section], nil);
+    NSString *headerText = [_discoveryController titleForSection:section];
     UIView *headerView = nil;
-    if (headerText != [NSNull null]) {
-        headerView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, [UIScreen mainScreen].bounds.size.height, 21.0f)];
-        headerView.backgroundColor = [UIColor VLCDarkBackgroundColor];
-
-        UILabel *textLabel = [[UILabel alloc] initWithFrame:CGRectInset(headerView.bounds, 12.0f, 0.f)];
-        textLabel.text = (NSString *) headerText;
-        textLabel.font = [UIFont boldSystemFontOfSize:([UIFont systemFontSize] * 0.8f)];
-        textLabel.shadowOffset = CGSizeMake(0.0f, 1.0f);
-        textLabel.shadowColor = [UIColor VLCDarkTextShadowColor];
-        textLabel.textColor = [UIColor colorWithRed:(118.0f/255.0f) green:(118.0f/255.0f) blue:(118.0f/255.0f) alpha:1.0f];
-        textLabel.backgroundColor = [UIColor clearColor];
-        [headerView addSubview:textLabel];
-
-        UIView *topLine = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, [UIScreen mainScreen].bounds.size.height, 1.0f)];
-        topLine.backgroundColor = [UIColor colorWithRed:(95.0f/255.0f) green:(95.0f/255.0f) blue:(95.0f/255.0f) alpha:1.0f];
-        topLine.autoresizingMask = UIViewAutoresizingFlexibleWidth;
-        [headerView addSubview:topLine];
-
-        UIView *bottomLine = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 21.0f, [UIScreen mainScreen].bounds.size.height, 1.0f)];
-        bottomLine.backgroundColor = [UIColor colorWithRed:(16.0f/255.0f) green:(16.0f/255.0f) blue:(16.0f/255.0f) alpha:1.0f];
-        bottomLine.autoresizingMask = UIViewAutoresizingFlexibleWidth;
-        [headerView addSubview:bottomLine];
-    }
+    headerView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, [UIScreen mainScreen].bounds.size.height, 21.0f)];
+    headerView.backgroundColor = [UIColor VLCDarkBackgroundColor];
+
+    UILabel *textLabel = [[UILabel alloc] initWithFrame:CGRectInset(headerView.bounds, 12.0f, 0.f)];
+    textLabel.text = (NSString *) headerText;
+    textLabel.font = [UIFont boldSystemFontOfSize:([UIFont systemFontSize] * 0.8f)];
+    textLabel.shadowOffset = CGSizeMake(0.0f, 1.0f);
+    textLabel.shadowColor = [UIColor VLCDarkTextShadowColor];
+    textLabel.textColor = [UIColor colorWithRed:(118.0f/255.0f) green:(118.0f/255.0f) blue:(118.0f/255.0f) alpha:1.0f];
+    textLabel.backgroundColor = [UIColor clearColor];
+    [headerView addSubview:textLabel];
+
+    UIView *topLine = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, [UIScreen mainScreen].bounds.size.height, 1.0f)];
+    topLine.backgroundColor = [UIColor colorWithRed:(95.0f/255.0f) green:(95.0f/255.0f) blue:(95.0f/255.0f) alpha:1.0f];
+    topLine.autoresizingMask = UIViewAutoresizingFlexibleWidth;
+    [headerView addSubview:topLine];
+
+    UIView *bottomLine = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 21.0f, [UIScreen mainScreen].bounds.size.height, 1.0f)];
+    bottomLine.backgroundColor = [UIColor colorWithRed:(16.0f/255.0f) green:(16.0f/255.0f) blue:(16.0f/255.0f) alpha:1.0f];
+    bottomLine.autoresizingMask = UIViewAutoresizingFlexibleWidth;
+    [headerView addSubview:bottomLine];
     return headerView;
 }
 

+ 35 - 26
VLC for iOS.xcodeproj/project.pbxproj

@@ -566,8 +566,8 @@
 		7D3784E8183A9A15009EE944 /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = Sources/main.m; sourceTree = SOURCE_ROOT; };
 		7D3784EA183A9A1E009EE944 /* VLC for iOS-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = "VLC for iOS-Info.plist"; path = "Sources/VLC for iOS-Info.plist"; sourceTree = SOURCE_ROOT; };
 		7D3784EB183A9A1E009EE944 /* VLC for iOS-Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "VLC for iOS-Prefix.pch"; path = "Sources/VLC for iOS-Prefix.pch"; sourceTree = SOURCE_ROOT; };
-		7D37E3981BC93F7500AFA70E /* VLCLocalServerDiscoveryController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VLCLocalServerDiscoveryController.h; path = Sources/LocalNetworkConnectivity/VLCLocalServerDiscoveryController.h; sourceTree = SOURCE_ROOT; };
-		7D37E3991BC93F7500AFA70E /* VLCLocalServerDiscoveryController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = VLCLocalServerDiscoveryController.m; path = Sources/LocalNetworkConnectivity/VLCLocalServerDiscoveryController.m; sourceTree = SOURCE_ROOT; };
+		7D37E3981BC93F7500AFA70E /* VLCLocalServerDiscoveryController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VLCLocalServerDiscoveryController.h; sourceTree = "<group>"; };
+		7D37E3991BC93F7500AFA70E /* VLCLocalServerDiscoveryController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VLCLocalServerDiscoveryController.m; sourceTree = "<group>"; };
 		7D3EB013174A353E002062C2 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = System/Library/Frameworks/SystemConfiguration.framework; sourceTree = SDKROOT; };
 		7D4136621896710500D7B4B2 /* si */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = si; path = si.lproj/Localizable.strings; sourceTree = "<group>"; };
 		7D4625861A5614A1001A80B4 /* VLCEqualizerView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VLCEqualizerView.h; path = Sources/VLCEqualizerView.h; sourceTree = SOURCE_ROOT; };
@@ -809,18 +809,18 @@
 		DDC10BE21AEE8EA700890DC3 /* VLCTimeNavigationTitleView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VLCTimeNavigationTitleView.h; path = Sources/VLCTimeNavigationTitleView.h; sourceTree = SOURCE_ROOT; };
 		DDC10BE31AEE8EA700890DC3 /* VLCTimeNavigationTitleView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = VLCTimeNavigationTitleView.m; path = Sources/VLCTimeNavigationTitleView.m; sourceTree = SOURCE_ROOT; };
 		DDE1BCE51B676B8800A4B9CE /* tr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = tr; path = tr.lproj/Localizable.strings; sourceTree = "<group>"; };
-		DDE3C8CE1BD0246500C03B8B /* VLCLocalNetworkService.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VLCLocalNetworkService.h; path = Sources/LocalNetworkConnectivity/VLCLocalNetworkService.h; sourceTree = SOURCE_ROOT; };
-		DDE3C8CF1BD0246500C03B8B /* VLCLocalNetworkService.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = VLCLocalNetworkService.m; path = Sources/LocalNetworkConnectivity/VLCLocalNetworkService.m; sourceTree = SOURCE_ROOT; };
+		DDE3C8CE1BD0246500C03B8B /* VLCLocalNetworkService.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VLCLocalNetworkService.h; sourceTree = "<group>"; };
+		DDE3C8CF1BD0246500C03B8B /* VLCLocalNetworkService.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VLCLocalNetworkService.m; sourceTree = "<group>"; };
 		DDE3C8D11BD1103300C03B8B /* VLCLocalNetworkServiceBrowser-Protocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "VLCLocalNetworkServiceBrowser-Protocol.h"; sourceTree = "<group>"; };
-		DDE3C8D41BD12E6B00C03B8B /* VLCLocalNetworkServiceBrowserNetService.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VLCLocalNetworkServiceBrowserNetService.h; path = Sources/LocalNetworkConnectivity/VLCLocalNetworkServiceBrowserNetService.h; sourceTree = SOURCE_ROOT; };
-		DDE3C8D51BD12E6B00C03B8B /* VLCLocalNetworkServiceBrowserNetService.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = VLCLocalNetworkServiceBrowserNetService.m; path = Sources/LocalNetworkConnectivity/VLCLocalNetworkServiceBrowserNetService.m; sourceTree = SOURCE_ROOT; };
+		DDE3C8D41BD12E6B00C03B8B /* VLCLocalNetworkServiceBrowserNetService.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VLCLocalNetworkServiceBrowserNetService.h; sourceTree = "<group>"; };
+		DDE3C8D51BD12E6B00C03B8B /* VLCLocalNetworkServiceBrowserNetService.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VLCLocalNetworkServiceBrowserNetService.m; sourceTree = "<group>"; };
 		DDE3C8D71BD12F6800C03B8B /* VLCLocalNetworkService-Protocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "VLCLocalNetworkService-Protocol.h"; sourceTree = "<group>"; };
-		DDE3C8DB1BD246DD00C03B8B /* VLCLocalNetworkServiceBrowserMediaDiscoverer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VLCLocalNetworkServiceBrowserMediaDiscoverer.h; path = Sources/LocalNetworkConnectivity/VLCLocalNetworkServiceBrowserMediaDiscoverer.h; sourceTree = SOURCE_ROOT; };
-		DDE3C8DC1BD246DD00C03B8B /* VLCLocalNetworkServiceBrowserMediaDiscoverer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = VLCLocalNetworkServiceBrowserMediaDiscoverer.m; path = Sources/LocalNetworkConnectivity/VLCLocalNetworkServiceBrowserMediaDiscoverer.m; sourceTree = SOURCE_ROOT; };
-		DDE3C8DE1BD24FAC00C03B8B /* VLCLocalNetworkServiceBrowserManualConnect.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VLCLocalNetworkServiceBrowserManualConnect.h; path = Sources/LocalNetworkConnectivity/VLCLocalNetworkServiceBrowserManualConnect.h; sourceTree = SOURCE_ROOT; };
-		DDE3C8DF1BD24FAC00C03B8B /* VLCLocalNetworkServiceBrowserManualConnect.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = VLCLocalNetworkServiceBrowserManualConnect.m; path = Sources/LocalNetworkConnectivity/VLCLocalNetworkServiceBrowserManualConnect.m; sourceTree = SOURCE_ROOT; };
-		DDE3C8E11BD2592300C03B8B /* VLCLocalNetworkServiceBrowserUPnP.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VLCLocalNetworkServiceBrowserUPnP.h; path = Sources/LocalNetworkConnectivity/VLCLocalNetworkServiceBrowserUPnP.h; sourceTree = SOURCE_ROOT; };
-		DDE3C8E21BD2592300C03B8B /* VLCLocalNetworkServiceBrowserUPnP.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = VLCLocalNetworkServiceBrowserUPnP.m; path = Sources/LocalNetworkConnectivity/VLCLocalNetworkServiceBrowserUPnP.m; sourceTree = SOURCE_ROOT; };
+		DDE3C8DB1BD246DD00C03B8B /* VLCLocalNetworkServiceBrowserMediaDiscoverer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VLCLocalNetworkServiceBrowserMediaDiscoverer.h; sourceTree = "<group>"; };
+		DDE3C8DC1BD246DD00C03B8B /* VLCLocalNetworkServiceBrowserMediaDiscoverer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VLCLocalNetworkServiceBrowserMediaDiscoverer.m; sourceTree = "<group>"; };
+		DDE3C8DE1BD24FAC00C03B8B /* VLCLocalNetworkServiceBrowserManualConnect.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VLCLocalNetworkServiceBrowserManualConnect.h; sourceTree = "<group>"; };
+		DDE3C8DF1BD24FAC00C03B8B /* VLCLocalNetworkServiceBrowserManualConnect.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VLCLocalNetworkServiceBrowserManualConnect.m; sourceTree = "<group>"; };
+		DDE3C8E11BD2592300C03B8B /* VLCLocalNetworkServiceBrowserUPnP.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VLCLocalNetworkServiceBrowserUPnP.h; sourceTree = "<group>"; };
+		DDE3C8E21BD2592300C03B8B /* VLCLocalNetworkServiceBrowserUPnP.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VLCLocalNetworkServiceBrowserUPnP.m; sourceTree = "<group>"; };
 		DDF157B31ACB169B00AAFBC6 /* WatchKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WatchKit.framework; path = System/Library/Frameworks/WatchKit.framework; sourceTree = SDKROOT; };
 		E09EACF57CDD22ABAE66CDD0 /* Pods-vlc-ios.distribution.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-vlc-ios.distribution.xcconfig"; path = "Pods/Target Support Files/Pods-vlc-ios/Pods-vlc-ios.distribution.xcconfig"; sourceTree = "<group>"; };
 		E0C04F931A25B4410080331A /* VLCDocumentPickerController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VLCDocumentPickerController.h; path = Sources/VLCDocumentPickerController.h; sourceTree = SOURCE_ROOT; };
@@ -1138,20 +1138,7 @@
 				7DBB78871B3028C400894467 /* Server browsing */,
 				7D30F3D5183AB2F100FFC021 /* VLCServerListViewController.h */,
 				7D30F3D6183AB2F100FFC021 /* VLCServerListViewController.m */,
-				DDE3C8D71BD12F6800C03B8B /* VLCLocalNetworkService-Protocol.h */,
-				DDE3C8CE1BD0246500C03B8B /* VLCLocalNetworkService.h */,
-				DDE3C8CF1BD0246500C03B8B /* VLCLocalNetworkService.m */,
-				DDE3C8D11BD1103300C03B8B /* VLCLocalNetworkServiceBrowser-Protocol.h */,
-				DDE3C8D41BD12E6B00C03B8B /* VLCLocalNetworkServiceBrowserNetService.h */,
-				DDE3C8D51BD12E6B00C03B8B /* VLCLocalNetworkServiceBrowserNetService.m */,
-				DDE3C8DB1BD246DD00C03B8B /* VLCLocalNetworkServiceBrowserMediaDiscoverer.h */,
-				DDE3C8DC1BD246DD00C03B8B /* VLCLocalNetworkServiceBrowserMediaDiscoverer.m */,
-				DDE3C8DE1BD24FAC00C03B8B /* VLCLocalNetworkServiceBrowserManualConnect.h */,
-				DDE3C8DF1BD24FAC00C03B8B /* VLCLocalNetworkServiceBrowserManualConnect.m */,
-				DDE3C8E11BD2592300C03B8B /* VLCLocalNetworkServiceBrowserUPnP.h */,
-				DDE3C8E21BD2592300C03B8B /* VLCLocalNetworkServiceBrowserUPnP.m */,
-				7D37E3981BC93F7500AFA70E /* VLCLocalServerDiscoveryController.h */,
-				7D37E3991BC93F7500AFA70E /* VLCLocalServerDiscoveryController.m */,
+				DDE3C8E41BD2622F00C03B8B /* Server Discovery */,
 				7D30F3DA183AB2F900FFC021 /* VLCNetworkLoginViewController.h */,
 				7D30F3DB183AB2F900FFC021 /* VLCNetworkLoginViewController.m */,
 			);
@@ -1789,6 +1776,28 @@
 			path = SharedSources;
 			sourceTree = "<group>";
 		};
+		DDE3C8E41BD2622F00C03B8B /* Server Discovery */ = {
+			isa = PBXGroup;
+			children = (
+				DDE3C8D71BD12F6800C03B8B /* VLCLocalNetworkService-Protocol.h */,
+				DDE3C8CE1BD0246500C03B8B /* VLCLocalNetworkService.h */,
+				DDE3C8CF1BD0246500C03B8B /* VLCLocalNetworkService.m */,
+				DDE3C8D11BD1103300C03B8B /* VLCLocalNetworkServiceBrowser-Protocol.h */,
+				DDE3C8D41BD12E6B00C03B8B /* VLCLocalNetworkServiceBrowserNetService.h */,
+				DDE3C8D51BD12E6B00C03B8B /* VLCLocalNetworkServiceBrowserNetService.m */,
+				DDE3C8DB1BD246DD00C03B8B /* VLCLocalNetworkServiceBrowserMediaDiscoverer.h */,
+				DDE3C8DC1BD246DD00C03B8B /* VLCLocalNetworkServiceBrowserMediaDiscoverer.m */,
+				DDE3C8DE1BD24FAC00C03B8B /* VLCLocalNetworkServiceBrowserManualConnect.h */,
+				DDE3C8DF1BD24FAC00C03B8B /* VLCLocalNetworkServiceBrowserManualConnect.m */,
+				DDE3C8E11BD2592300C03B8B /* VLCLocalNetworkServiceBrowserUPnP.h */,
+				DDE3C8E21BD2592300C03B8B /* VLCLocalNetworkServiceBrowserUPnP.m */,
+				7D37E3981BC93F7500AFA70E /* VLCLocalServerDiscoveryController.h */,
+				7D37E3991BC93F7500AFA70E /* VLCLocalServerDiscoveryController.m */,
+			);
+			name = "Server Discovery";
+			path = Sources/LocalNetworkConnectivity/ServerDiscovery;
+			sourceTree = SOURCE_ROOT;
+		};
 		E0C04F921A25B41C0080331A /* Document Picker */ = {
 			isa = PBXGroup;
 			children = (