Commit cb77dc7e authored by Soomin Lee's avatar Soomin Lee

Chromecast: Initial integration

parent 6c02f625
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="13189.4" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES">
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="14109" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES">
<device id="retina4_7" orientation="portrait">
<adaptation id="fullscreen"/>
</device>
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="13165.3"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14088"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<objects>
......@@ -21,7 +21,7 @@
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
<subviews>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="Sdb-a5-RTT">
<rect key="frame" x="662" y="5" width="30" height="30"/>
<rect key="frame" x="670" y="5" width="30" height="30"/>
<constraints>
<constraint firstAttribute="height" constant="30" id="Ap6-VL-6UH"/>
<constraint firstAttribute="width" constant="30" id="dEx-l7-vH3"/>
......@@ -40,7 +40,7 @@
</connections>
</button>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="x1t-3m-s0G">
<rect key="frame" x="618" y="5" width="44" height="30"/>
<rect key="frame" x="626" y="5" width="44" height="30"/>
<constraints>
<constraint firstAttribute="height" constant="30" id="fv5-Cp-MOv"/>
</constraints>
......@@ -76,7 +76,7 @@
</connections>
</button>
<slider opaque="NO" contentMode="scaleToFill" semanticContentAttribute="playback" insetsLayoutMarginsFromSafeArea="NO" contentHorizontalAlignment="center" contentVerticalAlignment="center" value="0.5" minValue="0.0" maxValue="1" translatesAutoresizingMaskIntoConstraints="NO" id="axb-6M-lSX" userLabel="Position Slider" customClass="VLCOBSlider">
<rect key="frame" x="28" y="5" width="584" height="31"/>
<rect key="frame" x="28" y="5" width="592" height="31"/>
<accessibility key="accessibilityConfiguration">
<accessibilityTraits key="traits" updatesFrequently="YES"/>
</accessibility>
......@@ -99,7 +99,7 @@
<constraint firstItem="axb-6M-lSX" firstAttribute="trailing" secondItem="x1t-3m-s0G" secondAttribute="leading" constant="-8" id="l05-q4-Dha"/>
<constraint firstItem="x1t-3m-s0G" firstAttribute="centerY" secondItem="SbC-6V-aXT" secondAttribute="centerY" id="mIZ-5x-1r6"/>
<constraint firstItem="SBq-Am-6MD" firstAttribute="leading" secondItem="SbC-6V-aXT" secondAttribute="leading" id="mf3-NF-cwy"/>
<constraint firstAttribute="trailing" secondItem="Sdb-a5-RTT" secondAttribute="trailing" constant="8" id="uI1-3o-gyT"/>
<constraint firstAttribute="trailing" secondItem="Sdb-a5-RTT" secondAttribute="trailing" id="uI1-3o-gyT"/>
<constraint firstItem="axb-6M-lSX" firstAttribute="leading" secondItem="SBq-Am-6MD" secondAttribute="trailing" id="zQP-Wv-QPC"/>
</constraints>
<nil key="simulatedStatusBarMetrics"/>
......
......@@ -25,6 +25,7 @@
"ONE_SPU_TRACK" = "One subtitles track";
"PLAYING_EXTERNALLY_TITLE" = "TV Connected";
"PLAYING_EXTERNALLY_TITLE_CHROMECAST" = "Chromecast Connected";
"PLAYING_EXTERNALLY_DESC" = "This video is playing on the TV";
"VFILTER_HUE" = "Hue";
......@@ -70,6 +71,9 @@
"PRIVATE_PLAYBACK_TOGGLE" = "Private Playback";
"SCAN_SUBTITLE_TOGGLE" = "Scan for Subtitles (http-only)";
"BUTTON_RENDERER" = "Casting devices";
"BUTTON_RENDERER_HINT" = "Show a menu of available casting devices";
"UPGRADING_LIBRARY" = "Upgrading Media Library";
"UNTITLED_SHOW" = "Untitled Show";
"UNKNOWN" = "Unknown";
......@@ -115,6 +119,7 @@
"SECTION_HEADER_LIBRARY" = "Media Library";
"STREAMVC_DETAILTEXT" = "Play streams directly without downloading";
"DOWNLOADVC_DETAILTEXT" = "Download files directly to your device";
"HEADER_TITLE_RENDERER" = "Select a casting device";
"LOCAL_NETWORK" = "Local Network";
"CONNECT_TO_SERVER" = "Connect to Server";
......
......@@ -14,6 +14,7 @@ import Foundation
@objc(VLCService)
public class Services: NSObject {
@objc let mediaDataSource = VLCMediaDataSource()
@objc let rendererDiscovererManager = VLCRendererDiscovererManager(presentingViewController: nil)
}
@objc class AppCoordinator: NSObject {
......
......@@ -24,6 +24,8 @@ public class VLCMediaViewController: UICollectionViewController, UISearchResults
private var searchController: UISearchController?
private let searchDataSource = VLCLibrarySearchDisplayDataSource()
private var mediaType: VLCMediaType
private var rendererButton: UIButton
public weak var delegate: VLCMediaViewControllerDelegate?
@available(iOS 11.0, *)
......@@ -49,6 +51,7 @@ public class VLCMediaViewController: UICollectionViewController, UISearchResults
init(services: Services, type: VLCMediaType) {
self.services = services
mediaType = type
self.rendererButton = services.rendererDiscovererManager.setupRendererButton()
super.init(collectionViewLayout: UICollectionViewFlowLayout())
NotificationCenter.default.addObserver(self, selector: #selector(themeDidChange), name: .VLCThemeDidChangeNotification, object: nil)
if mediaType.category == .video {
......@@ -73,9 +76,20 @@ public class VLCMediaViewController: UICollectionViewController, UISearchResults
setupCollectionView()
setupSearchController()
setupNavigationBar()
setupRendererButton()
_ = (MLMediaLibrary.sharedMediaLibrary() as! MLMediaLibrary).libraryDidAppear()
}
public override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
let manager = services.rendererDiscovererManager
if manager.discoverers.isEmpty {
// Either didn't start or stopped before
manager.start()
}
manager.presentingViewController = self
}
@objc func themeDidChange() {
collectionView?.backgroundColor = PresentationTheme.current.colors.background
}
......@@ -128,6 +142,11 @@ public class VLCMediaViewController: UICollectionViewController, UISearchResults
collectionView?.backgroundView = collectionView?.numberOfItems(inSection: 0) == 0 ? emptyView : nil
}
// MARK: Renderer
private func setupRendererButton() {
navigationItem.rightBarButtonItem = UIBarButtonItem(customView: rendererButton)
}
@objc func sort() {
delegate?.mediaViewControllerDidSelectSort(self)
}
......@@ -154,5 +173,4 @@ public class VLCMediaViewController: UICollectionViewController, UISearchResults
public func didDismissSearchController(_ searchController: UISearchController) {
collectionView?.dataSource = mediaDataSourceAndDelegate
}
}
This diff is collapsed.
/*****************************************************************************
* VLCActionSheetCell.swift
*
* Copyright © 2018 VLC authors and VideoLAN
* Copyright © 2018 Videolabs
*
* Authors: Soomin Lee <bubu@mikan.io>
*
* Refer to the COPYING file of the official project for license.
*****************************************************************************/
class VLCActionSheetCell: UICollectionViewCell {
static let identifier = "VLCActionSheetCell"
let icon: UIImageView = {
let icon = UIImageView()
icon.translatesAutoresizingMaskIntoConstraints = false
icon.contentMode = .scaleAspectFit
return icon
}()
let name: UILabel = {
let name = UILabel()
name.textColor = PresentationTheme.current.colors.cellTextColor
name.font = UIFont.systemFont(ofSize: 15)
name.translatesAutoresizingMaskIntoConstraints = false
return name
}()
let stackView: UIStackView = {
let stackView = UIStackView()
stackView.spacing = 15.0
stackView.axis = .horizontal
stackView.alignment = .center
stackView.translatesAutoresizingMaskIntoConstraints = false
return stackView
}()
override init(frame: CGRect) {
super.init(frame: frame)
setupViews()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
setupViews()
}
private func setupViews() {
backgroundColor = PresentationTheme.current.colors.background
stackView.addArrangedSubview(icon)
stackView.addArrangedSubview(name)
addSubview(stackView)
var guide: LayoutAnchorContainer = self
if #available(iOS 11.0, *) {
guide = safeAreaLayoutGuide
}
NSLayoutConstraint.activate([
icon.heightAnchor.constraint(equalToConstant: 25),
icon.widthAnchor.constraint(equalTo: icon.heightAnchor),
name.trailingAnchor.constraint(equalTo: stackView.trailingAnchor),
name.centerYAnchor.constraint(equalTo: stackView.centerYAnchor),
stackView.leadingAnchor.constraint(equalTo: guide.leadingAnchor, constant: 20),
stackView.trailingAnchor.constraint(equalTo: guide.trailingAnchor, constant: -20),
stackView.heightAnchor.constraint(equalTo: heightAnchor),
stackView.topAnchor.constraint(equalTo: topAnchor)
])
}
}
/*****************************************************************************
* VLCActionSheetSectionHeader.swift
*
* Copyright © 2018 VLC authors and VideoLAN
* Copyright © 2018 Videolabs
*
* Authors: Soomin Lee <bubu@mikan.io>
*
* Refer to the COPYING file of the official project for license.
*****************************************************************************/
class VLCActionSheetSectionHeader: UIView {
static let identifier = "VLCActionSheetSectionHeader"
let title: UILabel = {
let title = UILabel()
title.font = UIFont.systemFont(ofSize: 13)
title.translatesAutoresizingMaskIntoConstraints = false
return title
}()
let separator: UIView = {
let separator = UIView()
separator.backgroundColor = .lightGray
separator.translatesAutoresizingMaskIntoConstraints = false
return separator
}()
lazy var guide: LayoutAnchorContainer = {
var guide: LayoutAnchorContainer = self
if #available(iOS 11.0, *) {
guide = safeAreaLayoutGuide
}
return guide
}()
override init(frame: CGRect) {
super.init(frame: frame)
setupTitle()
setupSeparator()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
setupTitle()
setupSeparator()
}
fileprivate func setupSeparator() {
addSubview(separator)
NSLayoutConstraint.activate([
separator.leadingAnchor.constraint(equalTo: guide.leadingAnchor, constant: 20),
separator.trailingAnchor.constraint(equalTo: guide.trailingAnchor, constant: -20),
separator.heightAnchor.constraint(equalToConstant: 0.5),
separator.topAnchor.constraint(equalTo: bottomAnchor, constant: -1)
])
}
fileprivate func setupTitle() {
addSubview(title)
NSLayoutConstraint.activate([
title.leadingAnchor.constraint(equalTo: guide.leadingAnchor, constant: 20),
title.centerYAnchor.constraint(equalTo: centerYAnchor),
title.centerXAnchor.constraint(equalTo: centerXAnchor),
title.topAnchor.constraint(equalTo: topAnchor)
])
}
}
......@@ -16,6 +16,7 @@
#import "VLCPlaybackController.h"
@class OBSlider;
@class VLCService;
@class VLCStatusLabel;
@class VLCVerticalSwipeGestureRecognizer;
@class VLCTimeNavigationTitleView;
......@@ -80,6 +81,8 @@ typedef NS_ENUM(NSInteger, VLCMovieJumpState) {
@property (nonatomic, weak) id<VLCMovieViewControllerDelegate> delegate;
- (instancetype)initWithServices:(VLCService *)services;
- (IBAction)closePlayback:(id)sender;
- (IBAction)minimizePlayback:(id)sender;
......@@ -102,5 +105,6 @@ typedef NS_ENUM(NSInteger, VLCMovieJumpState) {
- (void)toggleUILock;
- (void)toggleChapterAndTitleSelector;
- (void)hideMenu;
- (void)setupCastWithCurrentRenderer;
@end
This diff is collapsed.
......@@ -92,6 +92,8 @@ currentMediaHasTrackToChooseFrom:(BOOL)currentMediaHasTrackToChooseFrom
@property (nonatomic, readonly) NSDictionary *mediaOptionsDictionary;
@property (nonatomic, readonly) NSTimer* sleepTimer;
@property (nonatomic) VLCRendererItem *renderer;
+ (VLCPlaybackController *)sharedInstance;
- (VLCTime *)playedTime;
#pragma mark - playback
......@@ -133,4 +135,6 @@ currentMediaHasTrackToChooseFrom:(BOOL)currentMediaHasTrackToChooseFrom
- (void)playMediaList:(VLCMediaList *)mediaList firstIndex:(NSInteger)index subtitlesFilePath:(NSString *)subsFilePath;
- (void)openVideoSubTitlesFromFile:(NSString *)pathToFile;
- (void)mediaPlayerSetRenderer:(VLCRendererItem *)renderer;
@end
......@@ -237,6 +237,8 @@ typedef NS_ENUM(NSUInteger, VLCAspectRatio) {
[_mediaPlayer addObserver:self forKeyPath:@"time" options:0 context:nil];
[_mediaPlayer addObserver:self forKeyPath:@"remainingTime" options:0 context:nil];
[_mediaPlayer setRendererItem:_renderer];
[_listPlayer playItemAtNumber:@(_itemInMediaListToBePlayedFirst)];
if ([self.delegate respondsToSelector:@selector(prepareForMediaPlayback:)])
......@@ -1234,7 +1236,7 @@ typedef NS_ENUM(NSUInteger, VLCAspectRatio) {
{
_preBackgroundWrapperView = _videoOutputViewWrapper;
if (_mediaPlayer.audioTrackIndexes.count > 0)
if (!_renderer && _mediaPlayer.audioTrackIndexes.count > 0)
[self setVideoTrackEnabled:false];
}
......@@ -1325,4 +1327,11 @@ typedef NS_ENUM(NSUInteger, VLCAspectRatio) {
kVLCSettingHardwareDecoding : [defaults objectForKey:kVLCSettingHardwareDecoding]};
}
#pragma mark - Renderer
- (void)mediaPlayerSetRenderer:(VLCRendererItem *)renderer
{
[_mediaPlayer setRendererItem:renderer];
}
@end
......@@ -11,6 +11,7 @@
*****************************************************************************/
@class VLCPlaybackController;
@class VLCService;
typedef NS_ENUM(NSUInteger, VLCPlayerDisplayControllerDisplayMode) {
VLCPlayerDisplayControllerDisplayModeFullscreen,
......@@ -33,6 +34,13 @@ typedef NS_ENUM(NSUInteger, VLCPlayerDisplayControllerDisplayMode) {
@property (nonatomic, assign) VLCPlayerDisplayControllerDisplayMode displayMode;
@property (nonatomic, weak) VLCPlaybackController *playbackController;
- (instancetype)init NS_UNAVAILABLE;
- (instancetype)initWithNibName:(NSString *)nibNameOrNil
bundle:(NSBundle *)nibBundleOrNil NS_UNAVAILABLE;
- (instancetype)initWithCoder:(NSCoder *)aDecoder NS_UNAVAILABLE;
- (instancetype)initWithServices:(id)services NS_DESIGNATED_INITIALIZER;
- (void)showFullscreenPlayback;
- (void)closeFullscreenPlayback;
......
......@@ -17,6 +17,7 @@
#import "VLCPlaybackController+MediaLibrary.h"
#if TARGET_OS_IOS
#import "VLC_iOS-Swift.h"
#import "VLCMovieViewController.h"
#else
#import "VLCFullscreenMovieTVViewController.h"
......@@ -41,14 +42,19 @@ static NSString *const VLCPlayerDisplayControllerDisplayModeKey = @"VLCPlayerDis
@property (nonatomic, strong) UIViewController<VLCPlaybackControllerDelegate> *movieViewController;
@property (nonatomic, strong) UIView<VLCPlaybackControllerDelegate, VLCMiniPlaybackViewInterface> *miniPlaybackView;
@property (nonatomic, strong) NSLayoutConstraint *bottomConstraint;
@property (nonatomic, strong) VLCService *services;
@end
@implementation VLCPlayerDisplayController
- (instancetype)init
- (instancetype)initWithServices:(id)services
{
self = [super init];
self = [super initWithNibName:nil bundle:nil];
if (self) {
NSAssert([services isKindOfClass:[VLCService class]], @"VLCPlayerDisplayController: Injected services class issue");
_services = services;
NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter];
[notificationCenter addObserver:self selector:@selector(playbackDidStart:) name:VLCPlaybackControllerPlaybackDidStart object:nil];
[notificationCenter addObserver:self selector:@selector(playbackDidFail:) name:VLCPlaybackControllerPlaybackDidFail object:nil];
......@@ -86,7 +92,7 @@ static NSString *const VLCPlayerDisplayControllerDisplayModeKey = @"VLCPlayerDis
{
if (!_movieViewController) {
#if TARGET_OS_IOS
_movieViewController = [[VLCMovieViewController alloc] initWithNibName:nil bundle:nil];
_movieViewController = [[VLCMovieViewController alloc] initWithServices:_services];
((VLCMovieViewController *)_movieViewController).delegate = self;
#else
_movieViewController = [[VLCFullscreenMovieTVViewController alloc] initWithNibName:nil bundle:nil];
......
This diff is collapsed.
......@@ -17,11 +17,12 @@ class VLCTabbarCooordinator: NSObject, VLCMediaViewControllerDelegate {
private var childCoordinators: [NSObject] = []
private var tabBarController: UITabBarController
private var services: Services
private let displayController = VLCPlayerDisplayController()
private var displayController: VLCPlayerDisplayController
public init(tabBarController: UITabBarController, services: Services) {
self.tabBarController = tabBarController
self.services = services
self.displayController = VLCPlayerDisplayController(services: services)
super.init()
NotificationCenter.default.addObserver(self, selector: #selector(updateTheme), name: .VLCThemeDidChangeNotification, object: nil)
}
......
......@@ -19,3 +19,4 @@
#import "VLCServerListViewController.h"
#import "VLCSettingsController.h"
#import "VLCWiFiUploadTableViewCell.h"
#import "VLCMovieViewController.h"
......@@ -239,6 +239,11 @@
7DF9352F1958AB0600E60FD4 /* UIColor+Presets.m in Sources */ = {isa = PBXBuildFile; fileRef = 7DF9352E1958AB0600E60FD4 /* UIColor+Presets.m */; };
8DD6516F208C89BC0052EE68 /* VLCAccessibilityIdentifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8DD6516E208C89BC0052EE68 /* VLCAccessibilityIdentifier.swift */; };
8DD65170208C89C00052EE68 /* VLCAccessibilityIdentifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8DD6516E208C89BC0052EE68 /* VLCAccessibilityIdentifier.swift */; };
7DFFD4071D42436B00A41B0A /* VLCExtensionDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 7DFFD4061D42436B00A41B0A /* VLCExtensionDelegate.m */; };
8D43712D2056AF1600F36458 /* VLCRendererDiscovererManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8D43712C2056AF1600F36458 /* VLCRendererDiscovererManager.swift */; };
8D437154205808FF00F36458 /* VLCActionSheet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8D437153205808FF00F36458 /* VLCActionSheet.swift */; };
8DD651BA208F6AF00052EE68 /* VLCActionSheetCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8DD651B9208F6AF00052EE68 /* VLCActionSheetCell.swift */; };
8DD651C4208F786F0052EE68 /* VLCActionSheetSectionHeader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8DD651C3208F786F0052EE68 /* VLCActionSheetSectionHeader.swift */; };
8F91EC79195CEC7900F5BCBA /* VLCOpenInActivity.m in Sources */ = {isa = PBXBuildFile; fileRef = 8F91EC78195CEC7900F5BCBA /* VLCOpenInActivity.m */; };
8F91EC7F195E1DAB00F5BCBA /* AssetsLibrary.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8F91EC7E195E1DAB00F5BCBA /* AssetsLibrary.framework */; };
9B088308183D7BEC004B5C2A /* VLCCloudStorageTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 9B088307183D7BEC004B5C2A /* VLCCloudStorageTableViewController.m */; };
......@@ -935,6 +940,10 @@
8B9DD09C453D2346D109D586 /* Pods-VLC-TV.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-VLC-TV.debug.xcconfig"; path = "Pods/Target Support Files/Pods-VLC-TV/Pods-VLC-TV.debug.xcconfig"; sourceTree = "<group>"; };
8C707B9BB2C5681D50CC9B99 /* Pods-VLC-tvOS-Debug.distribution.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-VLC-tvOS-Debug.distribution.xcconfig"; path = "Pods/Target Support Files/Pods-VLC-tvOS-Debug/Pods-VLC-tvOS-Debug.distribution.xcconfig"; sourceTree = "<group>"; };
8DD6516E208C89BC0052EE68 /* VLCAccessibilityIdentifier.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VLCAccessibilityIdentifier.swift; sourceTree = "<group>"; };
8D43712C2056AF1600F36458 /* VLCRendererDiscovererManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = VLCRendererDiscovererManager.swift; path = Sources/VLCRendererDiscovererManager.swift; sourceTree = "<group>"; };
8D437153205808FF00F36458 /* VLCActionSheet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VLCActionSheet.swift; sourceTree = "<group>"; };
8DD651B9208F6AF00052EE68 /* VLCActionSheetCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VLCActionSheetCell.swift; sourceTree = "<group>"; };
8DD651C3208F786F0052EE68 /* VLCActionSheetSectionHeader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VLCActionSheetSectionHeader.swift; sourceTree = "<group>"; };
8DEAD87A672248D0A6790405 /* libPods-vlc-ios.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-vlc-ios.a"; sourceTree = BUILT_PRODUCTS_DIR; };
8F91EC77195CEC7900F5BCBA /* VLCOpenInActivity.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VLCOpenInActivity.h; path = Sources/VLCOpenInActivity.h; sourceTree = SOURCE_ROOT; };
8F91EC78195CEC7900F5BCBA /* VLCOpenInActivity.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = VLCOpenInActivity.m; path = Sources/VLCOpenInActivity.m; sourceTree = SOURCE_ROOT; };
......@@ -1438,6 +1447,7 @@
DDC10BE31AEE8EA700890DC3 /* VLCTimeNavigationTitleView.m */,
DD1CB0581BBAC549006EDDE6 /* VLCVolumeView.h */,
DD1CB0591BBAC549006EDDE6 /* VLCVolumeView.m */,
8DD651B0208F62B70052EE68 /* VLCActionSheet */,
);
name = "UI Elements";
sourceTree = "<group>";
......@@ -1563,6 +1573,7 @@
DDAD5C2D1BB9A1E6006AFD3B /* VLCMovieViewControlPanelView.m */,
41F9BC7A1F4F20E400268461 /* VLCTrackSelectorView.h */,
41F9BC7B1F4F20E400268461 /* VLCTrackSelectorView.m */,
8D43712C2056AF1600F36458 /* VLCRendererDiscovererManager.swift */,
);
name = Playback;
sourceTree = "<group>";
......@@ -2073,6 +2084,17 @@
name = Dropbox;
sourceTree = "<group>";
};
8DD651B0208F62B70052EE68 /* VLCActionSheet */ = {
isa = PBXGroup;
children = (
8D437153205808FF00F36458 /* VLCActionSheet.swift */,
8DD651B9208F6AF00052EE68 /* VLCActionSheetCell.swift */,
8DD651C3208F786F0052EE68 /* VLCActionSheetSectionHeader.swift */,
);
name = VLCActionSheet;
path = Sources/VLCActionSheet;
sourceTree = "<group>";
};
9B51719A17EDEC8900F8FBA7 /* GoogleDrive */ = {
isa = PBXGroup;
children = (
......@@ -3153,6 +3175,7 @@
8F91EC79195CEC7900F5BCBA /* VLCOpenInActivity.m in Sources */,
7D37848F183A98B6009EE944 /* VLCMovieViewController.m in Sources */,
DD3EFF4D1BDEBCE500B68579 /* VLCNetworkServerBrowserPlex.m in Sources */,
8D437154205808FF00F36458 /* VLCActionSheet.swift in Sources */,
DDF908E41CFCD97400108B70 /* VLCNetworkLoginDataSourceProtocol.m in Sources */,
7D378492183A98BF009EE944 /* VLCExternalDisplayController.m in Sources */,
41F9BC7C1F4F20E400268461 /* VLCTrackSelectorView.m in Sources */,
......@@ -3163,12 +3186,14 @@
8DD65170208C89C00052EE68 /* VLCAccessibilityIdentifier.swift in Sources */,
DD3EFF551BDEBCE500B68579 /* VLCLocalNetworkServiceBrowserDSM.m in Sources */,
7D37849A183A98D1009EE944 /* VLCPlaylistTableViewCell.m in Sources */,
8DD651C4208F786F0052EE68 /* VLCActionSheetSectionHeader.swift in Sources */,
7D37849E183A98DD009EE944 /* VLCThumbnailsCache.m in Sources */,
DD3EFF411BDEBCE500B68579 /* VLCNetworkServerBrowserSharedLibrary.m in Sources */,
7D3784A1183A98EB009EE944 /* VLCBugreporter.m in Sources */,
7D3784A6183A98F5009EE944 /* VLCAboutViewController.m in Sources */,
7D3784A7183A98F5009EE944 /* VLCSettingsController.m in Sources */,
CADFAD08207D128200103F33 /* VLCEmptyLibraryView.m in Sources */,
8D43712D2056AF1600F36458 /* VLCRendererDiscovererManager.swift in Sources */,
7DC19AE41868C8EC00810BF7 /* VLCFirstStepsFirstPageViewController.m in Sources */,
7D3784AD183A9906009EE944 /* VLCDropboxController.m in Sources */,
7D3784AE183A9906009EE944 /* VLCDropboxTableViewController.m in Sources */,
......@@ -3192,6 +3217,7 @@
417E68B91F321EFF00DB9BB2 /* VLCActivityViewControllerVendor.m in Sources */,
DD3EFF5B1BDEBCE500B68579 /* VLCNetworkServerBrowserUPnP.m in Sources */,
419794C3206B9E7A009E081A /* MediaDataSourceAndDelegate.swift in Sources */,
8DD651BA208F6AF00052EE68 /* VLCActionSheetCell.swift in Sources */,
418B144D20179C75000447AA /* VLCTabBarCoordinator.swift in Sources */,
DD3EABF81BE14BD6003668DA /* BasicUPnPDevice+VLC.m in Sources */,
DD3EAC091BE2192A003668DA /* VLCServerBrowsingController.m in Sources */,
......
{
"info" : {
"version" : 1,
"author" : "xcode"
}
}
\ No newline at end of file
{
"images" : [
{
"idiom" : "universal",
"filename" : "renderer_normal.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "renderer_normal@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "renderer_normal@3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
\ No newline at end of file
{
"images" : [
{
"idiom" : "universal",
"filename" : "renderer_normal_black.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "renderer_normal_black@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "renderer_normal_black@3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
\ No newline at end of file
{
"images" : [
{
"idiom" : "universal",
"filename" : "renderer_full_normal_black.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "renderer_full_normal_black@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "renderer_full_normal_black@3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
\ No newline at end of file
{
"images" : [
{
"idiom" : "universal",
"filename" : "renderer_full_normal.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "renderer_full_normal@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "renderer_full_normal@3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
\ No newline at end of file
{
"images" : [
{
"idiom" : "universal",
"filename" : "group95.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "group95@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "group95@3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
\ No newline at end of file