Browse Source

add title chapter selection view

Tobias Conradi 9 years ago
parent
commit
5b433794b6

+ 18 - 0
Apple-TV/Playback/Playback Info/VLCPlaybackInfoChaptersTVViewController.h

@@ -0,0 +1,18 @@
+/*****************************************************************************
+ * VLC for iOS
+ *****************************************************************************
+ * Copyright (c) 2015 VideoLAN. All rights reserved.
+ * $Id$
+ *
+ * Authors: Tobias Conradi <videolan # tobias-conradi.de>
+ *
+ * Refer to the COPYING file of the official project for license.
+ *****************************************************************************/
+
+#import "VLCPlaybackInfoPanelTVViewController.h"
+
+@interface VLCPlaybackInfoChaptersTVViewController : VLCPlaybackInfoPanelTVViewController
+@property (nonatomic, weak) IBOutlet UICollectionView *titlesCollectionView;
+@property (nonatomic, weak) IBOutlet UICollectionView *chaptersCollectionView;
+
+@end

+ 146 - 0
Apple-TV/Playback/Playback Info/VLCPlaybackInfoChaptersTVViewController.m

@@ -0,0 +1,146 @@
+/*****************************************************************************
+ * VLC for iOS
+ *****************************************************************************
+ * Copyright (c) 2015 VideoLAN. All rights reserved.
+ * $Id$
+ *
+ * Authors: Tobias Conradi <videolan # tobias-conradi.de>
+ *
+ * Refer to the COPYING file of the official project for license.
+ *****************************************************************************/
+
+#import "VLCPlaybackInfoChaptersTVViewController.h"
+#import "VLCPlaybackInfoCollectionViewDataSource.h"
+#import "VLCPlaybackInfoTVCollectionViewCell.h"
+#import "VLCPlaybackInfoTVCollectionSectionTitleView.h"
+
+#define CONTENT_INSET 20.
+@interface VLCPlaybackInfoTitlesDataSource : VLCPlaybackInfoCollectionViewDataSource <UICollectionViewDataSource, UICollectionViewDelegate>
+// other collectionView which sould be updated when selection changes
+@property (nonatomic) UICollectionView *dependendCollectionView;
+@end
+
+@interface VLCPlaybackInfoChaptersTVViewController ()
+@property (nonatomic) IBOutlet VLCPlaybackInfoTitlesDataSource *titlesDataSource;
+@property (nonatomic) IBOutlet VLCPlaybackInfoCollectionViewDataSource *chaptersDataSource;
+@end
+
+@implementation VLCPlaybackInfoChaptersTVViewController
+
+- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
+{
+    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
+    if (self) {
+        self.title = NSLocalizedString(@"CHAPTER_SELECTION_TITLE", nil);
+    }
+    return self;
+}
+
+- (void)viewDidLoad
+{
+    [super viewDidLoad];
+    UINib *nib = [UINib nibWithNibName:@"VLCPlaybackInfoTVCollectionViewCell" bundle:nil];
+    NSString *identifier = [VLCPlaybackInfoTVCollectionViewCell identifier];
+
+    [self.titlesCollectionView registerNib:nib forCellWithReuseIdentifier:identifier];
+    [VLCPlaybackInfoTVCollectionSectionTitleView registerInCollectionView:self.titlesCollectionView];
+
+    [self.chaptersCollectionView registerNib:nib forCellWithReuseIdentifier:identifier];
+    [VLCPlaybackInfoTVCollectionSectionTitleView registerInCollectionView:self.chaptersCollectionView];
+
+    NSLocale *currentLocale = [NSLocale currentLocale];
+
+    self.titlesDataSource.title = [NSLocalizedString(@"TITLE", nil) uppercaseStringWithLocale:currentLocale];
+    self.titlesDataSource.cellIdentifier = [VLCPlaybackInfoTVCollectionViewCell identifier];
+    self.chaptersDataSource.title = [NSLocalizedString(@"CHAPTER", nil) uppercaseStringWithLocale:currentLocale];
+    self.chaptersDataSource.cellIdentifier = [VLCPlaybackInfoTVCollectionViewCell identifier];
+
+    self.titlesDataSource.dependendCollectionView = self.chaptersCollectionView;
+
+    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(mediaPlayerChanged) name:VLCPlaybackControllerPlaybackMetadataDidChange object:nil];
+}
+
+- (void)dealloc
+{
+    [[NSNotificationCenter defaultCenter] removeObserver:self];
+}
+
+- (void)viewWillAppear:(BOOL)animated
+{
+    [super viewWillAppear:animated];
+    [self mediaPlayerChanged];
+}
+
+- (CGSize)preferredContentSize
+{
+    CGFloat prefferedHeight = MAX(self.titlesCollectionView.contentSize.height, self.chaptersCollectionView.contentSize.height) + CONTENT_INSET;
+    return CGSizeMake(CGRectGetWidth(self.view.bounds), prefferedHeight);
+}
+
+- (void)mediaPlayerChanged
+{
+    [self.titlesCollectionView reloadData];
+    [self.chaptersCollectionView reloadData];
+}
+
+@end
+
+
+@interface VLCPlaybackInfoChaptersDataSource : VLCPlaybackInfoCollectionViewDataSource <UICollectionViewDataSource, UICollectionViewDelegate>
+@end
+
+@implementation VLCPlaybackInfoTitlesDataSource
+- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
+{
+    return self.mediaPlayer.numberOfTitles;
+}
+
+- (void)collectionView:(UICollectionView *)collectionView willDisplayCell:(UICollectionViewCell *)cell forItemAtIndexPath:(NSIndexPath *)indexPath
+{
+    VLCPlaybackInfoTVCollectionViewCell *trackCell = (VLCPlaybackInfoTVCollectionViewCell*)cell;
+    NSInteger row = indexPath.row;
+
+    BOOL isSelected = self.mediaPlayer.currentTitleIndex == row;
+    trackCell.selectionMarkerVisible = isSelected;
+
+    NSDictionary *description = self.mediaPlayer.titleDescriptions[row];
+    NSString *tileName = [NSString stringWithFormat:@"%@ (%@)", description[VLCTitleDescriptionName], [[VLCTime timeWithNumber:description[VLCTitleDescriptionDuration]] stringValue]];
+    trackCell.titleLabel.text = tileName;
+}
+
+-(void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath
+{
+    self.mediaPlayer.currentTitleIndex = (int)indexPath.row;
+    [collectionView reloadData];
+    [self.dependendCollectionView reloadData];
+}
+@end
+
+@implementation VLCPlaybackInfoChaptersDataSource
+- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
+{
+    VLCMediaPlayer *player = self.mediaPlayer;
+    return [player numberOfChaptersForTitle:player.currentTitleIndex];
+}
+
+- (void)collectionView:(UICollectionView *)collectionView willDisplayCell:(UICollectionViewCell *)cell forItemAtIndexPath:(NSIndexPath *)indexPath
+{
+    VLCPlaybackInfoTVCollectionViewCell *trackCell = (VLCPlaybackInfoTVCollectionViewCell*)cell;
+    NSInteger row = indexPath.row;
+    VLCMediaPlayer *player = self.mediaPlayer;
+
+    BOOL isSelected = player.currentChapterIndex == row;
+    trackCell.selectionMarkerVisible = isSelected;
+
+    NSDictionary *description = [player chapterDescriptionsOfTitle:player.currentTitleIndex][row];
+    NSString *chapterTitle = [NSString stringWithFormat:@"%@ (%@)", description[VLCChapterDescriptionName], [[VLCTime timeWithNumber:description[VLCChapterDescriptionDuration]] stringValue]];
+    trackCell.titleLabel.text = chapterTitle;
+}
+
+-(void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath
+{
+    self.mediaPlayer.currentChapterIndex = (int)indexPath.row;
+    [collectionView reloadData];
+}
+
+@end

+ 67 - 0
Apple-TV/Playback/Playback Info/VLCPlaybackInfoChaptersTVViewController.xib

@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<document type="com.apple.InterfaceBuilder.AppleTV.XIB" version="3.0" toolsVersion="9060" systemVersion="15B42" targetRuntime="AppleTV" propertyAccessControl="none" useAutolayout="YES">
+    <dependencies>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="9051"/>
+    </dependencies>
+    <objects>
+        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="VLCPlaybackInfoChaptersTVViewController">
+            <connections>
+                <outlet property="chaptersCollectionView" destination="YZb-MS-8i8" id="xuU-oT-fOR"/>
+                <outlet property="chaptersDataSource" destination="Z5d-WW-D76" id="adK-ss-psh"/>
+                <outlet property="titlesCollectionView" destination="rYJ-pW-rFQ" id="NgZ-KP-IoP"/>
+                <outlet property="titlesDataSource" destination="odX-Um-Jiy" id="VQb-1o-5L3"/>
+                <outlet property="view" destination="iN0-l3-epB" id="Rsf-oc-98a"/>
+            </connections>
+        </placeholder>
+        <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
+        <view contentMode="scaleToFill" id="iN0-l3-epB">
+            <rect key="frame" x="0.0" y="0.0" width="1920" height="500"/>
+            <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+            <subviews>
+                <collectionView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" dataMode="none" translatesAutoresizingMaskIntoConstraints="NO" id="YZb-MS-8i8">
+                    <rect key="frame" x="1060" y="0.0" width="660" height="500"/>
+                    <animations/>
+                    <collectionViewFlowLayout key="collectionViewLayout" minimumLineSpacing="10" minimumInteritemSpacing="10" id="2bC-W2-ECp" customClass="VLCFullWidthCollectionViewFlowLayout">
+                        <size key="itemSize" width="660" height="50"/>
+                        <size key="headerReferenceSize" width="660" height="50"/>
+                        <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>
+                    <connections>
+                        <outlet property="dataSource" destination="Z5d-WW-D76" id="CEX-jp-S6S"/>
+                        <outlet property="delegate" destination="Z5d-WW-D76" id="t1D-sI-B0C"/>
+                    </connections>
+                </collectionView>
+                <collectionView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" dataMode="none" translatesAutoresizingMaskIntoConstraints="NO" id="rYJ-pW-rFQ">
+                    <rect key="frame" x="200" y="0.0" width="660" height="500"/>
+                    <animations/>
+                    <collectionViewFlowLayout key="collectionViewLayout" minimumLineSpacing="10" minimumInteritemSpacing="10" id="ceq-Lt-V8g" customClass="VLCFullWidthCollectionViewFlowLayout">
+                        <size key="itemSize" width="660" height="50"/>
+                        <size key="headerReferenceSize" width="660" height="50"/>
+                        <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>
+                    <connections>
+                        <outlet property="dataSource" destination="odX-Um-Jiy" id="0oK-qY-Aiz"/>
+                        <outlet property="delegate" destination="odX-Um-Jiy" id="hDT-5c-OYk"/>
+                    </connections>
+                </collectionView>
+            </subviews>
+            <animations/>
+            <constraints>
+                <constraint firstAttribute="bottom" secondItem="rYJ-pW-rFQ" secondAttribute="bottom" priority="500" id="5QS-de-XaJ"/>
+                <constraint firstItem="rYJ-pW-rFQ" firstAttribute="top" secondItem="iN0-l3-epB" secondAttribute="top" id="Grw-co-Uag"/>
+                <constraint firstItem="rYJ-pW-rFQ" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" constant="200" id="HMO-0c-28f"/>
+                <constraint firstItem="YZb-MS-8i8" firstAttribute="top" secondItem="iN0-l3-epB" secondAttribute="top" id="lJk-bE-qdA"/>
+                <constraint firstItem="YZb-MS-8i8" firstAttribute="width" secondItem="rYJ-pW-rFQ" secondAttribute="width" id="mvl-Qm-zsX"/>
+                <constraint firstAttribute="bottom" secondItem="YZb-MS-8i8" secondAttribute="bottom" priority="500" id="twj-q2-HtE"/>
+                <constraint firstAttribute="trailing" secondItem="YZb-MS-8i8" secondAttribute="trailing" constant="200" id="xiO-53-o5T"/>
+                <constraint firstItem="YZb-MS-8i8" firstAttribute="leading" secondItem="rYJ-pW-rFQ" secondAttribute="trailing" constant="200" id="xqK-zW-jRW"/>
+            </constraints>
+            <freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
+            <point key="canvasLocation" x="384" y="420"/>
+        </view>
+        <customObject id="odX-Um-Jiy" customClass="VLCPlaybackInfoTitlesDataSource"/>
+        <customObject id="Z5d-WW-D76" customClass="VLCPlaybackInfoChaptersDataSource"/>
+    </objects>
+</document>

+ 20 - 0
Apple-TV/Playback/Playback Info/VLCPlaybackInfoCollectionViewDataSource.h

@@ -0,0 +1,20 @@
+/*****************************************************************************
+ * VLC for iOS
+ *****************************************************************************
+ * Copyright (c) 2015 VideoLAN. All rights reserved.
+ * $Id$
+ *
+ * Authors: Tobias Conradi <videolan # tobias-conradi.de>
+ *
+ * Refer to the COPYING file of the official project for license.
+ *****************************************************************************/
+
+#import <Foundation/Foundation.h>
+
+@interface VLCPlaybackInfoCollectionViewDataSource : NSObject
+@property (nonatomic, readonly) VLCMediaPlayer *mediaPlayer;
+@property (nonatomic) NSString *title;
+@property (nonatomic) NSString *cellIdentifier;
+
+- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath;
+@end

+ 36 - 0
Apple-TV/Playback/Playback Info/VLCPlaybackInfoCollectionViewDataSource.m

@@ -0,0 +1,36 @@
+/*****************************************************************************
+ * VLC for iOS
+ *****************************************************************************
+ * Copyright (c) 2015 VideoLAN. All rights reserved.
+ * $Id$
+ *
+ * Authors: Tobias Conradi <videolan # tobias-conradi.de>
+ *
+ * Refer to the COPYING file of the official project for license.
+ *****************************************************************************/
+
+#import "VLCPlaybackInfoCollectionViewDataSource.h"
+#import "VLCPlaybackInfoTVCollectionSectionTitleView.h"
+
+@implementation VLCPlaybackInfoCollectionViewDataSource
+
+- (VLCMediaPlayer *)mediaPlayer
+{
+    return [VLCPlaybackController sharedInstance].mediaPlayer;
+}
+
+- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath
+{
+    VLCPlaybackInfoTVCollectionSectionTitleView *header = [collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:[VLCPlaybackInfoTVCollectionSectionTitleView identifier] forIndexPath:indexPath];
+
+    BOOL showTitle = [collectionView numberOfItemsInSection:indexPath.section] != 0;
+    header.titleLabel.text = showTitle ? self.title : nil;
+    return header;
+}
+
+- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
+{
+    return [collectionView dequeueReusableCellWithReuseIdentifier:self.cellIdentifier forIndexPath:indexPath];
+}
+
+@end

+ 1 - 1
Apple-TV/Playback/Playback Info/VLCPlaybackInfoTrackTVTitleView.h

@@ -11,7 +11,7 @@
 
 #import <UIKit/UIKit.h>
 
-@interface VLCPlaybackInfoTrackTVTitleView : UICollectionReusableView
+@interface VLCPlaybackInfoTVCollectionSectionTitleView : UICollectionReusableView
 @property (nonatomic) UILabel *titleLabel;
 
 + (void)registerInCollectionView:(UICollectionView *)collectionView;

+ 3 - 3
Apple-TV/Playback/Playback Info/VLCPlaybackInfoTrackTVTitleView.m

@@ -9,9 +9,9 @@
  * Refer to the COPYING file of the official project for license.
  *****************************************************************************/
 
-#import "VLCPlaybackInfoTrackTVTitleView.h"
+#import "VLCPlaybackInfoTVCollectionSectionTitleView.h"
 
-@implementation VLCPlaybackInfoTrackTVTitleView
+@implementation VLCPlaybackInfoTVCollectionSectionTitleView
 
 - (instancetype)initWithFrame:(CGRect)frame
 {
@@ -34,7 +34,7 @@
 
 + (NSString *)identifier
 {
-    return @"VLCPlaybackInfoTrackTVTitleView";
+    return @"VLCPlaybackInfoTVCollectionSectionTitleView";
 }
 
 

+ 1 - 1
Apple-TV/Playback/Playback Info/VLCPlaybackInfoTrackTVCell.h

@@ -11,7 +11,7 @@
 
 #import <UIKit/UIKit.h>
 
-@interface VLCPlaybackInfoTrackTVCell : UICollectionViewCell
+@interface VLCPlaybackInfoTVCollectionViewCell : UICollectionViewCell
 @property (nonatomic) IBOutlet UILabel *selectionMarkerView;
 @property (nonatomic) IBOutlet UILabel *titleLabel;
 @property (nonatomic) BOOL selectionMarkerVisible;

+ 3 - 3
Apple-TV/Playback/Playback Info/VLCPlaybackInfoTrackTVCell.m

@@ -9,13 +9,13 @@
  * Refer to the COPYING file of the official project for license.
  *****************************************************************************/
 
-#import "VLCPlaybackInfoTrackTVCell.h"
+#import "VLCPlaybackInfoTVCollectionViewCell.h"
 
-@implementation VLCPlaybackInfoTrackTVCell
+@implementation VLCPlaybackInfoTVCollectionViewCell
 
 + (NSString *)identifier
 {
-    return @"VLCPlaybackInfoTrackTVCell";
+    return @"VLCPlaybackInfoTVCollectionViewCell";
 }
 
 - (void)awakeFromNib

+ 3 - 3
Apple-TV/Playback/Playback Info/VLCPlaybackInfoTrackTVCell.xib

@@ -6,7 +6,7 @@
     <objects>
         <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
         <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
-        <collectionViewCell opaque="NO" multipleTouchEnabled="YES" contentMode="center" reuseIdentifier="VLCPlaybackInfoTrackTVCell" id="m1I-s4-RPj" customClass="VLCPlaybackInfoTrackTVCell">
+        <collectionViewCell opaque="NO" multipleTouchEnabled="YES" contentMode="center" reuseIdentifier="VLCPlaybackInfoTVCollectionViewCell" id="m1I-s4-RPj" customClass="VLCPlaybackInfoTVCollectionViewCell">
             <rect key="frame" x="0.0" y="0.0" width="460" height="56"/>
             <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
             <view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center">
@@ -17,14 +17,14 @@
                         <rect key="frame" x="48" y="0.0" width="412" height="56"/>
                         <animations/>
                         <fontDescription key="fontDescription" style="UICTFontTextStyleBody"/>
-                        <color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
+                        <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
                         <nil key="highlightedColor"/>
                     </label>
                     <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="500" text="✔︎" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="YMP-ov-ixd">
                         <rect key="frame" x="8" y="0.0" width="32" height="56"/>
                         <animations/>
                         <fontDescription key="fontDescription" style="UICTFontTextStyleHeadline"/>
-                        <color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
+                        <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
                         <nil key="highlightedColor"/>
                     </label>
                 </subviews>

+ 3 - 2
Apple-TV/Playback/Playback Info/VLCPlaybackInfoTVViewController.m

@@ -14,7 +14,7 @@
 #import "VLCPlaybackInfoMediaInfoTVViewController.h"
 #import "VLCPlaybackInfoTVAnimators.h"
 #import "VLCPlaybackInfoTracksTVViewController.h"
-
+#import "VLCPlaybackInfoChaptersTVViewController.h"
 
 // just for appearance reasons
 @interface VLCPlaybackInfoTVTabBarController : UITabBarController
@@ -27,9 +27,10 @@
 - (NSArray<UIViewController*>*)tabViewControllers
 {
     return @[
-             [[VLCPlaybackInfoRateTVViewController alloc] initWithNibName:nil bundle:nil],
              [[VLCPlaybackInfoMediaInfoTVViewController alloc] initWithNibName:nil bundle:nil],
+             [[VLCPlaybackInfoChaptersTVViewController alloc] initWithNibName:nil bundle:nil],
              [[VLCPlaybackInfoTracksTVViewController alloc] initWithNibName:nil bundle:nil],
+             [[VLCPlaybackInfoRateTVViewController alloc] initWithNibName:nil bundle:nil],
              ];
 }
 

+ 13 - 37
Apple-TV/Playback/Playback Info/VLCPlaybackInfoTracksTVViewController.m

@@ -10,20 +10,16 @@
  *****************************************************************************/
 
 #import "VLCPlaybackInfoTracksTVViewController.h"
-#import "VLCPlaybackInfoTrackTVCell.h"
-#import "VLCPlaybackInfoTrackTVTitleView.h"
+#import "VLCPlaybackInfoTVCollectionViewCell.h"
+#import "VLCPlaybackInfoTVCollectionSectionTitleView.h"
+#import "VLCPlaybackInfoCollectionViewDataSource.h"
 
 #define CONTENT_INSET 20.
 
-@interface VLCPlaybackInfoTracksDataSource : NSObject
-@property (nonatomic, readonly) VLCMediaPlayer *mediaPlayer;
-@property (nonatomic) NSString *title;
-- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath;
-@end
 
-@interface VLCPlaybackInfoTracksDataSourceAudio : VLCPlaybackInfoTracksDataSource <UICollectionViewDataSource, UICollectionViewDelegate>
+@interface VLCPlaybackInfoTracksDataSourceAudio : VLCPlaybackInfoCollectionViewDataSource <UICollectionViewDataSource, UICollectionViewDelegate>
 @end
-@interface VLCPlaybackInfoTracksDataSourceSubtitle : VLCPlaybackInfoTracksDataSource <UICollectionViewDataSource, UICollectionViewDelegate>
+@interface VLCPlaybackInfoTracksDataSourceSubtitle : VLCPlaybackInfoCollectionViewDataSource <UICollectionViewDataSource, UICollectionViewDelegate>
 @end
 
 
@@ -48,17 +44,18 @@
 - (void)viewDidLoad
 {
     [super viewDidLoad];
-    UINib *nib = [UINib nibWithNibName:@"VLCPlaybackInfoTrackTVCell" bundle:nil];
-    NSString *identifier = [VLCPlaybackInfoTrackTVCell identifier];
+    UINib *nib = [UINib nibWithNibName:@"VLCPlaybackInfoTVCollectionViewCell" bundle:nil];
+    NSString *identifier = [VLCPlaybackInfoTVCollectionViewCell identifier];
     [self.audioTrackCollectionView registerNib:nib forCellWithReuseIdentifier:identifier];
     [self.subtitleTrackCollectionView registerNib:nib forCellWithReuseIdentifier:identifier];
-    [VLCPlaybackInfoTrackTVTitleView registerInCollectionView:self.audioTrackCollectionView];
-    [VLCPlaybackInfoTrackTVTitleView registerInCollectionView:self.subtitleTrackCollectionView];
+    [VLCPlaybackInfoTVCollectionSectionTitleView registerInCollectionView:self.audioTrackCollectionView];
+    [VLCPlaybackInfoTVCollectionSectionTitleView registerInCollectionView:self.subtitleTrackCollectionView];
 
     NSLocale *currentLocale = [NSLocale currentLocale];
     self.audioDataSource.title = [NSLocalizedString(@"AUDIO", nil) uppercaseStringWithLocale:currentLocale];
+    self.audioDataSource.cellIdentifier = [VLCPlaybackInfoTVCollectionViewCell identifier];
     self.subtitleDataSource.title = [NSLocalizedString(@"SUBTITLES", nil) uppercaseStringWithLocale:currentLocale];
-
+    self.subtitleDataSource.cellIdentifier = [VLCPlaybackInfoTVCollectionViewCell identifier];
     [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(mediaPlayerChanged) name:VLCPlaybackControllerPlaybackMetadataDidChange object:nil];
 }
 
@@ -87,27 +84,6 @@
 
 @end
 
-@implementation VLCPlaybackInfoTracksDataSource
-- (VLCMediaPlayer *)mediaPlayer
-{
-    return [VLCPlaybackController sharedInstance].mediaPlayer;
-}
-
-- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath
-{
-    VLCPlaybackInfoTrackTVTitleView *header = [collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:[VLCPlaybackInfoTrackTVTitleView identifier] forIndexPath:indexPath];
-
-    BOOL showTitle = [collectionView numberOfItemsInSection:indexPath.section] != 0;
-    header.titleLabel.text = showTitle ? self.title : nil;
-    return header;
-}
-
-- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
-{
-    return [collectionView dequeueReusableCellWithReuseIdentifier:[VLCPlaybackInfoTrackTVCell identifier] forIndexPath:indexPath];
-}
-@end
-
 @implementation VLCPlaybackInfoTracksDataSourceAudio
 - (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
 {
@@ -116,7 +92,7 @@
 
 - (void)collectionView:(UICollectionView *)collectionView willDisplayCell:(UICollectionViewCell *)cell forItemAtIndexPath:(NSIndexPath *)indexPath
 {
-    VLCPlaybackInfoTrackTVCell *trackCell = (VLCPlaybackInfoTrackTVCell*)cell;
+    VLCPlaybackInfoTVCollectionViewCell *trackCell = (VLCPlaybackInfoTVCollectionViewCell*)cell;
     NSInteger row = indexPath.row;
     BOOL isSelected = [self.mediaPlayer.audioTrackIndexes[row] intValue] == self.mediaPlayer.currentAudioTrackIndex;
     trackCell.selectionMarkerVisible = isSelected;
@@ -144,7 +120,7 @@
 }
 - (void)collectionView:(UICollectionView *)collectionView willDisplayCell:(UICollectionViewCell *)cell forItemAtIndexPath:(NSIndexPath *)indexPath
 {
-    VLCPlaybackInfoTrackTVCell *trackCell = (VLCPlaybackInfoTrackTVCell*)cell;
+    VLCPlaybackInfoTVCollectionViewCell *trackCell = (VLCPlaybackInfoTVCollectionViewCell*)cell;
     NSInteger row = indexPath.row;
     BOOL isSelected = [self.mediaPlayer.videoSubTitlesIndexes[row] intValue] == self.mediaPlayer.currentVideoSubTitleIndex;
     trackCell.selectionMarkerVisible = isSelected;

BIN
Resources/de.lproj/Localizable.strings


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

@@ -7,6 +7,9 @@
 "OPEN_TRACK_PANEL"="Open track selection";
 "CHOOSE_TITLE"="Choose Title";
 "CHOOSE_CHAPTER"="Choose Chapter";
+"CHAPTER_SELECTION_TITLE"="Chapters";
+"TITLE"="Title";
+"CHAPTER"="Chapter";
 "MINIMIZE_PLAYBACK_VIEW"="Minimize playback";
 "FULLSCREEN_PLAYBACK"="Play in fullscreen";
 "TRACK_SELECTION"="Track Selection";

+ 32 - 16
VLC for iOS.xcodeproj/project.pbxproj

@@ -352,10 +352,10 @@
 		DD3EFF5D1BDEBCE500B68579 /* VLCLocalServerDiscoveryController.m in Sources */ = {isa = PBXBuildFile; fileRef = DD3EFF2B1BDEBCE500B68579 /* VLCLocalServerDiscoveryController.m */; };
 		DD3EFF5E1BDEBCE500B68579 /* VLCLocalServerDiscoveryController.m in Sources */ = {isa = PBXBuildFile; fileRef = DD3EFF2B1BDEBCE500B68579 /* VLCLocalServerDiscoveryController.m */; };
 		DD4089E91BF63AD00022745E /* VLCPlaybackInfoTracksTVViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = DD4089E81BF63AD00022745E /* VLCPlaybackInfoTracksTVViewController.xib */; };
-		DD4089EF1BF646540022745E /* VLCPlaybackInfoTrackTVCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = DD4089EE1BF646540022745E /* VLCPlaybackInfoTrackTVCell.xib */; };
-		DD4089F21BF6467E0022745E /* VLCPlaybackInfoTrackTVCell.m in Sources */ = {isa = PBXBuildFile; fileRef = DD4089F11BF6467E0022745E /* VLCPlaybackInfoTrackTVCell.m */; };
+		DD4089EF1BF646540022745E /* VLCPlaybackInfoTVCollectionViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = DD4089EE1BF646540022745E /* VLCPlaybackInfoTVCollectionViewCell.xib */; };
+		DD4089F21BF6467E0022745E /* VLCPlaybackInfoTVCollectionViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = DD4089F11BF6467E0022745E /* VLCPlaybackInfoTVCollectionViewCell.m */; };
 		DD4089F51BF6556F0022745E /* VLCFullWidthCollectionViewFlowLayout.m in Sources */ = {isa = PBXBuildFile; fileRef = DD4089F41BF6556F0022745E /* VLCFullWidthCollectionViewFlowLayout.m */; };
-		DD4089FA1BF659030022745E /* VLCPlaybackInfoTrackTVTitleView.m in Sources */ = {isa = PBXBuildFile; fileRef = DD4089F91BF659030022745E /* VLCPlaybackInfoTrackTVTitleView.m */; };
+		DD4089FA1BF659030022745E /* VLCPlaybackInfoTVCollectionSectionTitleView.m in Sources */ = {isa = PBXBuildFile; fileRef = DD4089F91BF659030022745E /* VLCPlaybackInfoTVCollectionSectionTitleView.m */; };
 		DD490B171BE6BA580010F335 /* VLCIRTVTapGestureRecognizer.m in Sources */ = {isa = PBXBuildFile; fileRef = DD490B161BE6BA580010F335 /* VLCIRTVTapGestureRecognizer.m */; };
 		DD490B1F1BE95B5C0010F335 /* VLCSiriRemoteGestureRecognizer.m in Sources */ = {isa = PBXBuildFile; fileRef = DD490B1E1BE95B5C0010F335 /* VLCSiriRemoteGestureRecognizer.m */; };
 		DD510B701B14E564003BA71C /* VLCPlayerDisplayController.m in Sources */ = {isa = PBXBuildFile; fileRef = DD510B6F1B14E564003BA71C /* VLCPlayerDisplayController.m */; };
@@ -372,6 +372,9 @@
 		DD8095F91BE6268A0065D8E1 /* VLCPlaybackInfoPanelTVViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = DD8095F81BE6268A0065D8E1 /* VLCPlaybackInfoPanelTVViewController.m */; };
 		DD8F84311B00EB3B0009138A /* VLCPlaybackController+MediaLibrary.m in Sources */ = {isa = PBXBuildFile; fileRef = DD8F84301B00EB3B0009138A /* VLCPlaybackController+MediaLibrary.m */; };
 		DD9D8F5F1C00C73F00B4060F /* VLCDeleteHintTVView.m in Sources */ = {isa = PBXBuildFile; fileRef = DD9D8F5E1C00C73F00B4060F /* VLCDeleteHintTVView.m */; };
+		DD9D8F651C01F96700B4060F /* VLCPlaybackInfoChaptersTVViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = DD9D8F631C01F96700B4060F /* VLCPlaybackInfoChaptersTVViewController.m */; };
+		DD9D8F681C01FAB500B4060F /* VLCPlaybackInfoChaptersTVViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = DD9D8F671C01FAB500B4060F /* VLCPlaybackInfoChaptersTVViewController.xib */; };
+		DD9D8F6B1C01FE5B00B4060F /* VLCPlaybackInfoCollectionViewDataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = DD9D8F6A1C01FE5B00B4060F /* VLCPlaybackInfoCollectionViewDataSource.m */; };
 		DDAD5C2B1BB999CA006AFD3B /* VLCMovieViewControlPanel.xib in Resources */ = {isa = PBXBuildFile; fileRef = DDAD5C2A1BB999CA006AFD3B /* VLCMovieViewControlPanel.xib */; };
 		DDB7C6A41BAEB28200E6570E /* WKInterfaceController+VLCConnectionAlert.m in Sources */ = {isa = PBXBuildFile; fileRef = DD9FBE761BAD6BB600FFE77A /* WKInterfaceController+VLCConnectionAlert.m */; };
 		DDB959421AFBB30500BB8CFF /* MappingModel_2_5_to_2_6.xcmappingmodel in Sources */ = {isa = PBXBuildFile; fileRef = DDB959411AFBB30500BB8CFF /* MappingModel_2_5_to_2_6.xcmappingmodel */; };
@@ -1074,13 +1077,13 @@
 		DD3EFF2B1BDEBCE500B68579 /* VLCLocalServerDiscoveryController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VLCLocalServerDiscoveryController.m; sourceTree = "<group>"; };
 		DD3EFF2C1BDEBCE500B68579 /* VLCNetworkServerBrowser-Protocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "VLCNetworkServerBrowser-Protocol.h"; sourceTree = "<group>"; };
 		DD4089E81BF63AD00022745E /* VLCPlaybackInfoTracksTVViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = VLCPlaybackInfoTracksTVViewController.xib; path = "Playback/Playback Info/VLCPlaybackInfoTracksTVViewController.xib"; sourceTree = "<group>"; };
-		DD4089EE1BF646540022745E /* VLCPlaybackInfoTrackTVCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = VLCPlaybackInfoTrackTVCell.xib; path = "Playback/Playback Info/VLCPlaybackInfoTrackTVCell.xib"; sourceTree = "<group>"; };
-		DD4089F01BF6467E0022745E /* VLCPlaybackInfoTrackTVCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VLCPlaybackInfoTrackTVCell.h; sourceTree = "<group>"; };
-		DD4089F11BF6467E0022745E /* VLCPlaybackInfoTrackTVCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VLCPlaybackInfoTrackTVCell.m; sourceTree = "<group>"; };
+		DD4089EE1BF646540022745E /* VLCPlaybackInfoTVCollectionViewCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = VLCPlaybackInfoTVCollectionViewCell.xib; path = "Playback/Playback Info/VLCPlaybackInfoTVCollectionViewCell.xib"; sourceTree = "<group>"; };
+		DD4089F01BF6467E0022745E /* VLCPlaybackInfoTVCollectionViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VLCPlaybackInfoTVCollectionViewCell.h; sourceTree = "<group>"; };
+		DD4089F11BF6467E0022745E /* VLCPlaybackInfoTVCollectionViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VLCPlaybackInfoTVCollectionViewCell.m; sourceTree = "<group>"; };
 		DD4089F31BF6556F0022745E /* VLCFullWidthCollectionViewFlowLayout.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VLCFullWidthCollectionViewFlowLayout.h; path = "UI Elements/VLCFullWidthCollectionViewFlowLayout.h"; sourceTree = "<group>"; };
 		DD4089F41BF6556F0022745E /* VLCFullWidthCollectionViewFlowLayout.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = VLCFullWidthCollectionViewFlowLayout.m; path = "UI Elements/VLCFullWidthCollectionViewFlowLayout.m"; sourceTree = "<group>"; };
-		DD4089F81BF659030022745E /* VLCPlaybackInfoTrackTVTitleView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VLCPlaybackInfoTrackTVTitleView.h; sourceTree = "<group>"; };
-		DD4089F91BF659030022745E /* VLCPlaybackInfoTrackTVTitleView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VLCPlaybackInfoTrackTVTitleView.m; sourceTree = "<group>"; };
+		DD4089F81BF659030022745E /* VLCPlaybackInfoTVCollectionSectionTitleView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VLCPlaybackInfoTVCollectionSectionTitleView.h; sourceTree = "<group>"; };
+		DD4089F91BF659030022745E /* VLCPlaybackInfoTVCollectionSectionTitleView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VLCPlaybackInfoTVCollectionSectionTitleView.m; sourceTree = "<group>"; };
 		DD490B151BE6BA580010F335 /* VLCIRTVTapGestureRecognizer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VLCIRTVTapGestureRecognizer.h; sourceTree = "<group>"; };
 		DD490B161BE6BA580010F335 /* VLCIRTVTapGestureRecognizer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VLCIRTVTapGestureRecognizer.m; sourceTree = "<group>"; };
 		DD490B1D1BE95B5C0010F335 /* VLCSiriRemoteGestureRecognizer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VLCSiriRemoteGestureRecognizer.h; sourceTree = "<group>"; };
@@ -1124,6 +1127,11 @@
 		DD8F84301B00EB3B0009138A /* VLCPlaybackController+MediaLibrary.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "VLCPlaybackController+MediaLibrary.m"; path = "Sources/VLCPlaybackController+MediaLibrary.m"; sourceTree = SOURCE_ROOT; };
 		DD9D8F5D1C00C73F00B4060F /* VLCDeleteHintTVView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VLCDeleteHintTVView.h; sourceTree = "<group>"; };
 		DD9D8F5E1C00C73F00B4060F /* VLCDeleteHintTVView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VLCDeleteHintTVView.m; sourceTree = "<group>"; };
+		DD9D8F621C01F96700B4060F /* VLCPlaybackInfoChaptersTVViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VLCPlaybackInfoChaptersTVViewController.h; sourceTree = "<group>"; };
+		DD9D8F631C01F96700B4060F /* VLCPlaybackInfoChaptersTVViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VLCPlaybackInfoChaptersTVViewController.m; sourceTree = "<group>"; };
+		DD9D8F671C01FAB500B4060F /* VLCPlaybackInfoChaptersTVViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = VLCPlaybackInfoChaptersTVViewController.xib; path = "Playback/Playback Info/VLCPlaybackInfoChaptersTVViewController.xib"; sourceTree = "<group>"; };
+		DD9D8F691C01FE5B00B4060F /* VLCPlaybackInfoCollectionViewDataSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VLCPlaybackInfoCollectionViewDataSource.h; sourceTree = "<group>"; };
+		DD9D8F6A1C01FE5B00B4060F /* VLCPlaybackInfoCollectionViewDataSource.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VLCPlaybackInfoCollectionViewDataSource.m; sourceTree = "<group>"; };
 		DD9FBE751BAD6BB600FFE77A /* WKInterfaceController+VLCConnectionAlert.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "WKInterfaceController+VLCConnectionAlert.h"; sourceTree = "<group>"; };
 		DD9FBE761BAD6BB600FFE77A /* WKInterfaceController+VLCConnectionAlert.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "WKInterfaceController+VLCConnectionAlert.m"; sourceTree = "<group>"; };
 		DD9FBE791BADA8E300FFE77A /* VLC WatchKit Extension.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.xml; name = "VLC WatchKit Extension.entitlements"; path = "../VLC WatchKit Extension.entitlements"; sourceTree = "<group>"; };
@@ -1852,11 +1860,12 @@
 				7DEC8BDD1BD67899006E1093 /* VLCFullscreenMovieTVViewController.xib */,
 				DD8095E41BE3F4240065D8E1 /* VLCPlaybackInfoTVViewController.xib */,
 				DD8095EA1BE4F04E0065D8E1 /* VLCPlaybackInfoRateTVViewController.xib */,
+				DD9D8F671C01FAB500B4060F /* VLCPlaybackInfoChaptersTVViewController.xib */,
 				7D7EF3D91BD56B5900CD4CEE /* VLCOpenNetworkStreamTVViewController.xib */,
 				DDEAECF51BDFEAFA00756C83 /* VLCLocalNetworkServerTVCell.xib */,
 				7D51B3AF1BF0EEF4005AF4D5 /* VLCPlaybackInfoMediaInfoTVViewController.xib */,
 				DD4089E81BF63AD00022745E /* VLCPlaybackInfoTracksTVViewController.xib */,
-				DD4089EE1BF646540022745E /* VLCPlaybackInfoTrackTVCell.xib */,
+				DD4089EE1BF646540022745E /* VLCPlaybackInfoTVCollectionViewCell.xib */,
 				7DC0B56F1C0094370027BFAD /* VLCSettingsViewController.xib */,
 			);
 			name = xibs;
@@ -2351,10 +2360,14 @@
 				7D51B3AE1BF0EEF4005AF4D5 /* VLCPlaybackInfoMediaInfoTVViewController.m */,
 				DD1B31F11BF637D500A369B6 /* VLCPlaybackInfoTracksTVViewController.h */,
 				DD1B31F21BF637D500A369B6 /* VLCPlaybackInfoTracksTVViewController.m */,
-				DD4089F01BF6467E0022745E /* VLCPlaybackInfoTrackTVCell.h */,
-				DD4089F11BF6467E0022745E /* VLCPlaybackInfoTrackTVCell.m */,
-				DD4089F81BF659030022745E /* VLCPlaybackInfoTrackTVTitleView.h */,
-				DD4089F91BF659030022745E /* VLCPlaybackInfoTrackTVTitleView.m */,
+				DD9D8F621C01F96700B4060F /* VLCPlaybackInfoChaptersTVViewController.h */,
+				DD9D8F631C01F96700B4060F /* VLCPlaybackInfoChaptersTVViewController.m */,
+				DD4089F01BF6467E0022745E /* VLCPlaybackInfoTVCollectionViewCell.h */,
+				DD4089F11BF6467E0022745E /* VLCPlaybackInfoTVCollectionViewCell.m */,
+				DD4089F81BF659030022745E /* VLCPlaybackInfoTVCollectionSectionTitleView.h */,
+				DD4089F91BF659030022745E /* VLCPlaybackInfoTVCollectionSectionTitleView.m */,
+				DD9D8F691C01FE5B00B4060F /* VLCPlaybackInfoCollectionViewDataSource.h */,
+				DD9D8F6A1C01FE5B00B4060F /* VLCPlaybackInfoCollectionViewDataSource.m */,
 			);
 			path = "Playback Info";
 			sourceTree = "<group>";
@@ -2639,10 +2652,11 @@
 				7D405ED61BEA1F56006ED886 /* jquery-1.10.1.min.js in Resources */,
 				7DEC8BE91BD68BC9006E1093 /* Settings.bundle in Resources */,
 				7D405ED51BEA1F56006ED886 /* Raleway.woff in Resources */,
+				DD9D8F681C01FAB500B4060F /* VLCPlaybackInfoChaptersTVViewController.xib in Resources */,
 				6B4E33D21BF2A39400A35255 /* playerControl.js in Resources */,
 				7DC0B5711C0094370027BFAD /* VLCSettingsViewController.xib in Resources */,
 				7D405ED81BEA1F56006ED886 /* jquery.iframe-transport.js in Resources */,
-				DD4089EF1BF646540022745E /* VLCPlaybackInfoTrackTVCell.xib in Resources */,
+				DD4089EF1BF646540022745E /* VLCPlaybackInfoTVCollectionViewCell.xib in Resources */,
 				DD3EAC131BE26166003668DA /* VLCRemoteBrowsingTVCell.xib in Resources */,
 				7D3E528C1BD7B5E100309D15 /* VLCCloudServicesTVViewController.xib in Resources */,
 				7D405EDA1BEA1F56006ED886 /* style.css in Resources */,
@@ -2842,6 +2856,7 @@
 				DD3EFF441BDEBCE500B68579 /* VLCSharedLibraryParser.m in Sources */,
 				DD3EFF5E1BDEBCE500B68579 /* VLCLocalServerDiscoveryController.m in Sources */,
 				DD8095E01BE3EFC20065D8E1 /* VLCPlaybackInfoTVViewController.m in Sources */,
+				DD9D8F651C01F96700B4060F /* VLCPlaybackInfoChaptersTVViewController.m in Sources */,
 				7DEC8C1F1BD6A113006E1093 /* UIDevice+VLC.m in Sources */,
 				DDEAECFE1BDFFAEE00756C83 /* Reachability.m in Sources */,
 				7DF383C41BF2329500D71A5C /* VLCDropboxCollectionViewController.m in Sources */,
@@ -2904,7 +2919,7 @@
 				DD490B1F1BE95B5C0010F335 /* VLCSiriRemoteGestureRecognizer.m in Sources */,
 				DD3EFF3C1BDEBCE500B68579 /* VLCNetworkServerBrowserVLCMedia.m in Sources */,
 				7D1334801BE132F10012E919 /* VLCNetworkServerBrowserUPnP.m in Sources */,
-				DD4089FA1BF659030022745E /* VLCPlaybackInfoTrackTVTitleView.m in Sources */,
+				DD4089FA1BF659030022745E /* VLCPlaybackInfoTVCollectionSectionTitleView.m in Sources */,
 				7DF383D01BF24BB100D71A5C /* VLCBoxCollectionViewController.m in Sources */,
 				DDEAECC71BDEC79D00756C83 /* VLCLocalNetworkServiceBrowserSAP.m in Sources */,
 				7D1329441BA1F10100BE647E /* AppleTVAppDelegate.m in Sources */,
@@ -2912,7 +2927,7 @@
 				7DC71D291BC83590001FACAA /* UIColor+Presets.m in Sources */,
 				DD8095DB1BE3C42F0065D8E1 /* VLCBufferingBar.m in Sources */,
 				7D4408591BDA8DCA0080FB42 /* VLCBoxController.m in Sources */,
-				DD4089F21BF6467E0022745E /* VLCPlaybackInfoTrackTVCell.m in Sources */,
+				DD4089F21BF6467E0022745E /* VLCPlaybackInfoTVCollectionViewCell.m in Sources */,
 				DD3EAC0A1BE2192A003668DA /* VLCServerBrowsingController.m in Sources */,
 				DD3EFF341BDEBCE500B68579 /* VLCLocalNetworkServiceBrowserMediaDiscoverer.m in Sources */,
 				DD3EFF421BDEBCE500B68579 /* VLCNetworkServerBrowserSharedLibrary.m in Sources */,
@@ -2920,6 +2935,7 @@
 				DD490B171BE6BA580010F335 /* VLCIRTVTapGestureRecognizer.m in Sources */,
 				7DC5A3EC1BF63F4B00CFEBA8 /* VLCMediaFileDiscoverer.m in Sources */,
 				7D3E528B1BD7B5E100309D15 /* VLCCloudServicesTVViewController.m in Sources */,
+				DD9D8F6B1C01FE5B00B4060F /* VLCPlaybackInfoCollectionViewDataSource.m in Sources */,
 				7D405ED41BEA150C006ED886 /* VLCActivityManager.m in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;