diff --git a/Apple-TV/Playback/Playback Info/VLCPlaybackInfoChaptersTVViewController.m b/Apple-TV/Playback/Playback Info/VLCPlaybackInfoChaptersTVViewController.m index ea7b1ccacc44d34317b9fe5e534aed1a4013342d..042bb1e7efa8bc086d8b89a47bf659cea7a27ae2 100644 --- a/Apple-TV/Playback/Playback Info/VLCPlaybackInfoChaptersTVViewController.m +++ b/Apple-TV/Playback/Playback Info/VLCPlaybackInfoChaptersTVViewController.m @@ -60,11 +60,6 @@ [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(mediaPlayerChanged) name:VLCPlaybackControllerPlaybackMetadataDidChange object:nil]; } -- (void)dealloc -{ - [[NSNotificationCenter defaultCenter] removeObserver:self]; -} - + (BOOL)shouldBeVisibleForPlaybackController:(VLCPlaybackController *)vpc { return [vpc numberOfChaptersForCurrentTitle] > 1; diff --git a/Apple-TV/Playback/Playback Info/VLCPlaybackInfoMediaInfoTVViewController.m b/Apple-TV/Playback/Playback Info/VLCPlaybackInfoMediaInfoTVViewController.m index 8c3ed3d9af5df5afe0938bc3f6e54ce426ca1de3..cb210bc5648c44b847967ee6e60b846a4b5be30c 100644 --- a/Apple-TV/Playback/Playback Info/VLCPlaybackInfoMediaInfoTVViewController.m +++ b/Apple-TV/Playback/Playback Info/VLCPlaybackInfoMediaInfoTVViewController.m @@ -39,11 +39,6 @@ object:nil]; } -- (void)dealloc -{ - [[NSNotificationCenter defaultCenter] removeObserver:self]; -} - - (void)viewWillAppear:(BOOL)animated { if ([UIScreen mainScreen].traitCollection.userInterfaceStyle == UIUserInterfaceStyleDark) { diff --git a/Apple-TV/Playback/Playback Info/VLCPlaybackInfoTracksTVViewController.m b/Apple-TV/Playback/Playback Info/VLCPlaybackInfoTracksTVViewController.m index 7e65fd1902437a1980e13f6c12361acaa967ed62..657394d08cccea7e53b859b22d7d154232b7365d 100644 --- a/Apple-TV/Playback/Playback Info/VLCPlaybackInfoTracksTVViewController.m +++ b/Apple-TV/Playback/Playback Info/VLCPlaybackInfoTracksTVViewController.m @@ -60,11 +60,6 @@ [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(mediaPlayerChanged) name:VLCPlaybackControllerPlaybackMetadataDidChange object:nil]; } -- (void)dealloc -{ - [[NSNotificationCenter defaultCenter] removeObserver:self]; -} - - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; diff --git a/Apple-TV/Playback/VLCFullscreenMovieTVViewController.m b/Apple-TV/Playback/VLCFullscreenMovieTVViewController.m index 788fd40eeec9c77a45b67848d66ca7d581e997f9..00bd87806bef7213d9af735840bd9d881a8dbd17 100644 --- a/Apple-TV/Playback/VLCFullscreenMovieTVViewController.m +++ b/Apple-TV/Playback/VLCFullscreenMovieTVViewController.m @@ -181,7 +181,6 @@ typedef NS_ENUM(NSInteger, VLCPlayerScanState) [fileManager removeItemAtPath:tempSubsDirPath error:nil]; [super viewWillDisappear:animated]; - [[NSNotificationCenter defaultCenter] removeObserver:self]; } - (BOOL)canBecomeFirstResponder diff --git a/Apple-TV/VLCCloudServicesTVViewController.m b/Apple-TV/VLCCloudServicesTVViewController.m index 37e6c8d60a9fcfd1416fe9e881fb99d8dfce4384..ad87df6bdb43e73dd132018542ec045b190f8449 100644 --- a/Apple-TV/VLCCloudServicesTVViewController.m +++ b/Apple-TV/VLCCloudServicesTVViewController.m @@ -53,11 +53,6 @@ [self performSelector:@selector(updateDropbox) withObject:nil afterDelay:0.1]; } -- (void)dealloc -{ - [[NSNotificationCenter defaultCenter] removeObserver:self]; -} - - (NSString *)title { return NSLocalizedString(@"CLOUD_SERVICES", nil); diff --git a/Resources/About Contents.html b/Resources/About Contents.html index 78c2d49df7bffc6bdd969930aa78c8cf299c72b1..8e6b68a1d77353b977642f28223178c83a60ca0b 100644 --- a/Resources/About Contents.html +++ b/Resources/About Contents.html @@ -1,17 +1,17 @@ <html> <head> </head> -<body style="background-color: #1f1f1f"> +<body style="background-color: BACKGROUNDCOLOR"> <style type="text/css"> - h3 {color: #aaaaaa} - h5 {text-decoration: plain; color: #aaaaaa} - A:link {text-decoration: underline; color: #aaaaaa} - A:visited {text-decoration: none; color: #aaaaaa} - A:active {text-decoration: none; color: #aaaaaa} + h3 {color: TEXTCOLOR} + h5 {text-decoration: plain; color: TEXTCOLOR} + a:link {text-decoration: underline; color: TEXTCOLOR} + a:visited {text-decoration: none; color: TEXTCOLOR} + a:active {text-decoration: none; color: TEXTCOLOR} body { font-family: "HelveticaNeue-Light", "Helvetica Neue Light", "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif; font-weight: 300; } </style> -<div style="text-align:left; border:solid transparent 1px; padding:0.5em 1em 0.5em 1em; overflow:auto; font-size:10pt; font-family:Helvetica; color:#aaaaaa"; A:link {text-decoration: underline; color:#aaaaaa}> +<div style="text-align:left; border:solid transparent 1px; padding:0.5em 1em 0.5em 1em; overflow:auto; font-size:10pt; font-family:Helvetica; color:TEXTCOLOR"; A:link {text-decoration: underline; color:TEXTCOLOR}> <p align="center"> <table cellspacing="0" cellpadding="0"> <tr> diff --git a/Resources/Settings.bundle/Root.inApp.plist b/Resources/Settings.bundle/Root.inApp.plist index fe290b2470f12ae1f6917a1520acdbea78520983..9c21362c8d19cc7ab66b5daf384c328043161ee1 100644 --- a/Resources/Settings.bundle/Root.inApp.plist +++ b/Resources/Settings.bundle/Root.inApp.plist @@ -5,12 +5,22 @@ <key>PreferenceSpecifiers</key> <array> <dict> - <key>Type</key> - <string>PSGroupSpecifier</string> - <key>Title</key> - <string>SETTINGS_GENERIC_TITLE</string> - </dict> - <dict> + <key>Type</key> + <string>PSGroupSpecifier</string> + <key>Title</key> + <string>SETTINGS_GENERIC_TITLE</string> + </dict> + <dict> + <key>DefaultValue</key> + <string>NO</string> + <key>Key</key> + <string>darkMode</string> + <key>Title</key> + <string>SETTINGS_DARKTHEME</string> + <key>Type</key> + <string>PSToggleSwitchSpecifier</string> + </dict> + <dict> <key>DefaultValue</key> <string>NO</string> <key>Key</key> diff --git a/Resources/Settings.bundle/Root.plist b/Resources/Settings.bundle/Root.plist index 55fd0ef55680fa1c5b0bfcbfdce090adf86ea03b..c081f315226f74176dd43babb16b8bd8d6470e1c 100644 --- a/Resources/Settings.bundle/Root.plist +++ b/Resources/Settings.bundle/Root.plist @@ -10,6 +10,16 @@ <key>Title</key> <string>SETTINGS_GENERIC_TITLE</string> </dict> + <dict> + <key>DefaultValue</key> + <true/> + <key>Key</key> + <string>SETTINGS_USE_DARKTHEME</string> + <key>Title</key> + <string>SETTINGS_APPTHEME</string> + <key>Type</key> + <string>PSToggleSwitchSpecifier</string> + </dict> <dict> <key>DefaultValue</key> <true/> diff --git a/Resources/Settings.bundle/en.lproj/Root.strings b/Resources/Settings.bundle/en.lproj/Root.strings index fd04278e914c6efb49b15978d01f385e9166544d..4435a4185d22c7c9016305777ef3b8083dab31ab 100644 Binary files a/Resources/Settings.bundle/en.lproj/Root.strings and b/Resources/Settings.bundle/en.lproj/Root.strings differ diff --git a/Resources/VLCDownloadViewController.xib b/Resources/VLCDownloadViewController.xib index cfe7f035035d48d9cb5f3443430a4438d0c152fc..f6c789c3a4cafc2cea201cde2afe5788f58eead1 100644 --- a/Resources/VLCDownloadViewController.xib +++ b/Resources/VLCDownloadViewController.xib @@ -1,8 +1,12 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="9058" systemVersion="15B30a" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES"> +<?xml version="1.0" encoding="UTF-8"?> +<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="13529" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" colorMatched="YES"> + <device id="retina4_7" orientation="portrait"> + <adaptation id="fullscreen"/> + </device> <dependencies> <deployment identifier="iOS"/> - <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="9048"/> + <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="13527"/> + <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/> </dependencies> <objects> <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="VLCDownloadViewController"> @@ -29,30 +33,27 @@ <subviews> <label clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Enter any HTTP address to download the file to your $DEVICE." textAlignment="center" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" minimumFontSize="9" translatesAutoresizingMaskIntoConstraints="NO" id="95"> <rect key="frame" x="0.0" y="87" width="320" height="38"/> - <animations/> - <color key="backgroundColor" red="0.1052877679" green="0.1052846164" blue="0.1052864045" alpha="1" colorSpace="calibratedRGB"/> + <color key="backgroundColor" red="0.1052877679" green="0.1052846164" blue="0.1052864045" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> <constraints> <constraint firstAttribute="height" relation="greaterThanOrEqual" constant="38" id="vRA-2f-jer"/> </constraints> <fontDescription key="fontDescription" type="system" pointSize="14"/> - <color key="textColor" red="0.74659199620000005" green="0.74659199620000005" blue="0.74659199620000005" alpha="1" colorSpace="calibratedRGB"/> + <color key="textColor" red="0.74659199620000005" green="0.74659199620000005" blue="0.74659199620000005" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> <nil key="highlightedColor"/> </label> <textField clipsSubviews="YES" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" textAlignment="center" minimumFontSize="17" clearButtonMode="unlessEditing" translatesAutoresizingMaskIntoConstraints="NO" id="yZ7-sQ-cbO"> <rect key="frame" x="0.0" y="8" width="320" height="31"/> - <animations/> - <color key="backgroundColor" red="0.28627450980000002" green="0.28627450980000002" blue="0.28627450980000002" alpha="1" colorSpace="calibratedRGB"/> + <color key="backgroundColor" red="0.28627450980000002" green="0.28627450980000002" blue="0.28627450980000002" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> <constraints> <constraint firstAttribute="height" constant="31" id="BrP-Ow-0Rv"/> </constraints> - <color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/> + <color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> <fontDescription key="fontDescription" type="system" pointSize="14"/> <textInputTraits key="textInputTraits" autocorrectionType="no" keyboardAppearance="alert"/> </textField> <button contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="EPu-Ev-iiG"> <rect key="frame" x="0.0" y="43" width="320" height="40"/> - <animations/> - <color key="backgroundColor" white="0.0" alpha="1" colorSpace="calibratedWhite"/> + <color key="backgroundColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> <constraints> <constraint firstAttribute="height" constant="40" id="paf-BZ-9vp"/> </constraints> @@ -67,34 +68,31 @@ <subviews> <label clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Current Download.mpg" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="84"> <rect key="frame" x="11" y="11" width="150" height="17"/> - <animations/> - <color key="backgroundColor" red="0.1052877679" green="0.1052846164" blue="0.1052864045" alpha="1" colorSpace="calibratedRGB"/> + <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/> <fontDescription key="fontDescription" type="system" pointSize="14"/> - <color key="textColor" white="0.71999999999999997" alpha="1" colorSpace="calibratedWhite"/> + <color key="textColor" red="0.72000002861022949" green="0.72000002861022949" blue="0.72000002861022949" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> <nil key="highlightedColor"/> </label> <progressView contentMode="scaleToFill" progress="0.5" translatesAutoresizingMaskIntoConstraints="NO" id="85"> <rect key="frame" x="11" y="73" width="298" height="2"/> - <animations/> - <color key="backgroundColor" red="0.1052877679" green="0.1052846164" blue="0.1052864045" alpha="1" colorSpace="calibratedRGB"/> + <color key="backgroundColor" red="0.1052877679" green="0.1052846164" blue="0.1052864045" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> <constraints> <constraint firstAttribute="height" constant="2" id="Jeu-jw-vzk"/> </constraints> </progressView> <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="86"> - <rect key="frame" x="283" y="8" width="29" height="31"/> - <animations/> + <rect key="frame" x="290" y="8" width="22" height="22"/> <constraints> <constraint firstAttribute="height" relation="lessThanOrEqual" constant="31" id="VHL-kj-SOm"/> <constraint firstAttribute="width" relation="lessThanOrEqual" constant="29" id="zTY-if-NSJ"/> </constraints> <fontDescription key="fontDescription" type="boldSystem" pointSize="15"/> <state key="normal" image="flatDeleteButton.png"> - <color key="titleColor" red="0.19607843459999999" green="0.30980393290000002" blue="0.52156865600000002" alpha="1" colorSpace="calibratedRGB"/> - <color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/> + <color key="titleColor" red="0.19607843459999999" green="0.30980393290000002" blue="0.52156865600000002" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> + <color key="titleShadowColor" red="0.5" green="0.5" blue="0.5" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> </state> <state key="highlighted"> - <color key="titleColor" white="1" alpha="1" colorSpace="calibratedWhite"/> + <color key="titleColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> </state> <connections> <action selector="cancelDownload:" destination="-1" eventType="touchUpInside" id="90"/> @@ -102,39 +100,35 @@ </button> <activityIndicatorView hidden="YES" userInteractionEnabled="NO" contentMode="scaleToFill" fixedFrame="YES" hidesWhenStopped="YES" style="whiteLarge" translatesAutoresizingMaskIntoConstraints="NO" id="91"> <rect key="frame" x="0.0" y="-129" width="37" height="37"/> - <animations/> - <color key="backgroundColor" red="0.1052877679" green="0.1052846164" blue="0.1052864045" alpha="1" colorSpace="calibratedRGB"/> + <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/> + <color key="backgroundColor" red="0.1052877679" green="0.1052846164" blue="0.1052864045" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> </activityIndicatorView> <label clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="0 Kb/s" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="97"> <rect key="frame" x="11" y="48" width="42" height="17"/> - <animations/> - <color key="backgroundColor" red="0.1052877679" green="0.1052846164" blue="0.1052864045" alpha="1" colorSpace="calibratedRGB"/> + <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/> <fontDescription key="fontDescription" type="system" pointSize="14"/> - <color key="textColor" name="secondarySelectedControlColor" catalog="System" colorSpace="catalog"/> + <color key="textColor" red="0.79277843236923218" green="0.79277843236923218" blue="0.79277843236923218" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> <nil key="highlightedColor"/> </label> <label clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="00:00:00" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="98"> <rect key="frame" x="248.5" y="48" width="60.5" height="17"/> - <animations/> - <color key="backgroundColor" red="0.1052877679" green="0.1052846164" blue="0.1052864045" alpha="1" colorSpace="calibratedRGB"/> + <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/> <fontDescription key="fontDescription" type="system" pointSize="14"/> - <color key="textColor" name="secondarySelectedControlColor" catalog="System" colorSpace="catalog"/> + <color key="textColor" red="0.79277843236923218" green="0.79277843236923218" blue="0.79277843236923218" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> <nil key="highlightedColor"/> </label> <label clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="0%" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="99"> <rect key="frame" x="150" y="48" width="20" height="17"/> - <animations/> - <color key="backgroundColor" red="0.1052877679" green="0.1052846164" blue="0.1052864045" alpha="1" colorSpace="calibratedRGB"/> + <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/> <constraints> <constraint firstAttribute="height" constant="17" id="0Fp-ES-zmf"/> </constraints> <fontDescription key="fontDescription" type="system" pointSize="14"/> - <color key="textColor" name="secondarySelectedControlColor" catalog="System" colorSpace="catalog"/> + <color key="textColor" red="0.79277843236923218" green="0.79277843236923218" blue="0.79277843236923218" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> <nil key="highlightedColor"/> </label> </subviews> - <animations/> - <color key="backgroundColor" red="0.1052877679" green="0.1052846164" blue="0.1052864045" alpha="1" colorSpace="calibratedRGB"/> + <color key="backgroundColor" red="0.1052877679" green="0.1052846164" blue="0.1052864045" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> <constraints> <constraint firstAttribute="bottom" secondItem="85" secondAttribute="bottom" constant="15" id="1Ms-oP-nb3"/> <constraint firstItem="85" firstAttribute="top" secondItem="98" secondAttribute="bottom" constant="8" id="5m8-CM-by5"/> @@ -155,19 +149,17 @@ </view> <tableView clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" showsVerticalScrollIndicator="NO" style="plain" separatorStyle="default" rowHeight="44" sectionHeaderHeight="22" sectionFooterHeight="22" translatesAutoresizingMaskIntoConstraints="NO" id="69"> <rect key="frame" x="0.0" y="223" width="320" height="160"/> - <animations/> - <color key="backgroundColor" red="0.1052877679" green="0.1052846164" blue="0.1052864045" alpha="1" colorSpace="calibratedRGB"/> - <color key="separatorColor" white="0.0" alpha="0.60999999999999999" colorSpace="custom" customColorSpace="calibratedWhite"/> - <color key="sectionIndexBackgroundColor" red="0.1052877679" green="0.1052846164" blue="0.1052864045" alpha="1" colorSpace="calibratedRGB"/> - <color key="sectionIndexTrackingBackgroundColor" red="0.30689102410000002" green="0.30688184499999999" blue="0.3068870306" alpha="1" colorSpace="calibratedRGB"/> + <color key="backgroundColor" red="0.1052877679" green="0.1052846164" blue="0.1052864045" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> + <color key="separatorColor" red="0.0" green="0.0" blue="0.0" alpha="0.60999999999999999" colorSpace="custom" customColorSpace="sRGB"/> + <color key="sectionIndexBackgroundColor" red="0.1052877679" green="0.1052846164" blue="0.1052864045" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> + <color key="sectionIndexTrackingBackgroundColor" red="0.30689102410000002" green="0.30688184499999999" blue="0.3068870306" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> <connections> <outlet property="dataSource" destination="-1" id="93"/> <outlet property="delegate" destination="-1" id="94"/> </connections> </tableView> </subviews> - <animations/> - <color key="backgroundColor" white="0.0" alpha="1" colorSpace="calibratedWhite"/> + <color key="backgroundColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> <constraints> <constraint firstAttribute="trailing" secondItem="yZ7-sQ-cbO" secondAttribute="trailing" id="6xO-qL-QAy"/> <constraint firstItem="yZ7-sQ-cbO" firstAttribute="leading" secondItem="1" secondAttribute="leading" id="Dnj-BX-p5y"/> diff --git a/Resources/VLCOpenNetworkStreamViewController.xib b/Resources/VLCOpenNetworkStreamViewController.xib index 6e6c96006805d09a00c32cd9c2e2f061bc6f1b7c..f2b895ce4ce30bf0fb14a6229b23375a17d212b0 100644 --- a/Resources/VLCOpenNetworkStreamViewController.xib +++ b/Resources/VLCOpenNetworkStreamViewController.xib @@ -1,9 +1,12 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="9058" systemVersion="15B38b" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES"> +<?xml version="1.0" encoding="UTF-8"?> +<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="13771" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" colorMatched="YES"> + <device id="retina4_7" orientation="portrait"> + <adaptation id="fullscreen"/> + </device> <dependencies> <deployment identifier="iOS"/> - <development version="6300" identifier="xcode"/> - <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="9048"/> + <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="13772"/> + <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/> </dependencies> <objects> <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="VLCOpenNetworkStreamViewController"> @@ -26,16 +29,14 @@ <subviews> <label clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Enter any HTTP, RTSP, RTMP, MMS, FTP or UDP/RTP address to open the stream directly." textAlignment="center" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" minimumFontSize="9" translatesAutoresizingMaskIntoConstraints="NO" id="27"> <rect key="frame" x="0.0" y="85" width="282" height="46"/> - <animations/> - <color key="backgroundColor" red="0.1215686275" green="0.1215686275" blue="0.1215686275" alpha="1" colorSpace="calibratedRGB"/> + <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/> <fontDescription key="fontDescription" type="system" pointSize="14"/> - <color key="textColor" red="0.74659199620000005" green="0.74659199620000005" blue="0.74659199620000005" alpha="1" colorSpace="calibratedRGB"/> + <color key="textColor" red="0.74659199620000005" green="0.74659199620000005" blue="0.74659199620000005" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> <nil key="highlightedColor"/> </label> <button contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="i2a-FY-QGC"> <rect key="frame" x="0.0" y="43" width="282" height="40"/> - <animations/> - <color key="backgroundColor" white="0.0" alpha="1" colorSpace="calibratedWhite"/> + <color key="backgroundColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> <constraints> <constraint firstAttribute="height" constant="40" id="Vsx-fz-bZs"/> </constraints> @@ -50,20 +51,17 @@ <subviews> <switch opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" translatesAutoresizingMaskIntoConstraints="NO" id="8"> <rect key="frame" x="20" y="10" width="51" height="31"/> - <animations/> - <color key="onTintColor" red="1" green="0.51764705879999995" blue="0.0" alpha="1" colorSpace="deviceRGB"/> + <color key="onTintColor" red="0.98948383331298828" green="0.43470591306686401" blue="0.032047603279352188" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> </switch> <label clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Private Playback" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="9"> - <rect key="frame" x="77" y="15.5" width="126.5" height="20.5"/> - <animations/> - <color key="backgroundColor" red="0.1215686275" green="0.1215686275" blue="0.1215686275" alpha="1" colorSpace="calibratedRGB"/> + <rect key="frame" x="77" y="15.5" width="126" height="20.5"/> + <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/> <fontDescription key="fontDescription" type="system" pointSize="17"/> - <color key="textColor" red="0.74659199620000005" green="0.74659199620000005" blue="0.74659199620000005" alpha="1" colorSpace="calibratedRGB"/> + <color key="textColor" red="0.74659199620000005" green="0.74659199620000005" blue="0.74659199620000005" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> <nil key="highlightedColor"/> </label> </subviews> - <animations/> - <color key="backgroundColor" red="0.1215686275" green="0.1215686275" blue="0.1215686275" alpha="1" colorSpace="calibratedRGB"/> + <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/> <constraints> <constraint firstItem="8" firstAttribute="top" secondItem="19" secondAttribute="top" constant="10" id="2GS-NS-3e9"/> <constraint firstAttribute="height" constant="51" id="Cm5-Z1-hUm"/> @@ -79,20 +77,17 @@ <subviews> <label clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Scan Subtitle" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Ewx-Hn-7Lc" userLabel="Label - Scan Subtitle"> <rect key="frame" x="77" y="15.5" width="101.5" height="20.5"/> - <animations/> - <color key="backgroundColor" red="0.1215686275" green="0.1215686275" blue="0.1215686275" alpha="1" colorSpace="calibratedRGB"/> + <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/> <fontDescription key="fontDescription" type="system" pointSize="17"/> - <color key="textColor" red="0.74659199620000005" green="0.74659199620000005" blue="0.74659199620000005" alpha="1" colorSpace="calibratedRGB"/> + <color key="textColor" red="0.74659199620000005" green="0.74659199620000005" blue="0.74659199620000005" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> <nil key="highlightedColor"/> </label> <switch opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" translatesAutoresizingMaskIntoConstraints="NO" id="vn6-u6-LYP"> <rect key="frame" x="20" y="10" width="51" height="31"/> - <animations/> - <color key="onTintColor" red="1" green="0.51764705879999995" blue="0.0" alpha="1" colorSpace="deviceRGB"/> + <color key="onTintColor" red="0.98948383331298828" green="0.43470591306686401" blue="0.032047603279352188" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> </switch> </subviews> - <animations/> - <color key="backgroundColor" red="0.1215686275" green="0.1215686275" blue="0.1215686275" alpha="1" colorSpace="calibratedRGB"/> + <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/> <constraints> <constraint firstItem="Ewx-Hn-7Lc" firstAttribute="centerY" secondItem="Cuf-mI-ZuN" secondAttribute="centerY" id="438-cI-fcY"/> <constraint firstAttribute="height" constant="51" id="4q4-k4-3aL"/> @@ -103,9 +98,8 @@ </view> <tableView clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" showsHorizontalScrollIndicator="NO" indicatorStyle="white" style="plain" separatorStyle="none" rowHeight="44" sectionHeaderHeight="22" sectionFooterHeight="22" translatesAutoresizingMaskIntoConstraints="NO" id="10"> <rect key="frame" x="0.0" y="237" width="282" height="145"/> - <animations/> - <color key="backgroundColor" red="0.1215686275" green="0.1215686275" blue="0.1215686275" alpha="1" colorSpace="calibratedRGB"/> - <color key="separatorColor" white="0.0" alpha="0.60999999999999999" colorSpace="custom" customColorSpace="calibratedWhite"/> + <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/> + <color key="separatorColor" red="0.0" green="0.0" blue="0.0" alpha="0.60999999999999999" colorSpace="custom" customColorSpace="sRGB"/> <connections> <outlet property="dataSource" destination="-1" id="18"/> <outlet property="delegate" destination="-1" id="17"/> @@ -113,18 +107,16 @@ </tableView> <textField clipsSubviews="YES" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" textAlignment="center" minimumFontSize="17" clearButtonMode="unlessEditing" translatesAutoresizingMaskIntoConstraints="NO" id="Ucc-ui-OIc"> <rect key="frame" x="0.0" y="8" width="282" height="31"/> - <animations/> - <color key="backgroundColor" red="0.28627450980000002" green="0.28627450980000002" blue="0.28627450980000002" alpha="1" colorSpace="calibratedRGB"/> + <color key="backgroundColor" red="0.28627450980000002" green="0.28627450980000002" blue="0.28627450980000002" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> <constraints> <constraint firstAttribute="height" constant="31" id="wUp-0d-Tui"/> </constraints> - <color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/> + <color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> <fontDescription key="fontDescription" type="system" pointSize="14"/> <textInputTraits key="textInputTraits" autocorrectionType="no" keyboardAppearance="alert"/> </textField> </subviews> - <animations/> - <color key="backgroundColor" white="0.0" alpha="1" colorSpace="calibratedWhite"/> + <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/> <constraints> <constraint firstAttribute="trailing" secondItem="19" secondAttribute="trailing" id="5U7-LM-ATZ"/> <constraint firstItem="Ucc-ui-OIc" firstAttribute="leading" secondItem="1" secondAttribute="leading" id="5wR-1o-dR8"/> diff --git a/Resources/VLCPlaylistCollectionViewCell.xib b/Resources/VLCPlaylistCollectionViewCell.xib index 3020f1e2dacbc20957000922644186774984ef3e..488727a0fcd066d680ec16575a34b361d7fa0b92 100644 --- a/Resources/VLCPlaylistCollectionViewCell.xib +++ b/Resources/VLCPlaylistCollectionViewCell.xib @@ -1,15 +1,18 @@ <?xml version="1.0" encoding="UTF-8"?> -<document type="com.apple.InterfaceBuilder3.CocoaTouch.iPad.XIB" version="3.0" toolsVersion="13771" targetRuntime="iOS.CocoaTouch.iPad" propertyAccessControl="none" useAutolayout="YES" colorMatched="YES"> +<document type="com.apple.InterfaceBuilder3.CocoaTouch.iPad.XIB" version="3.0" toolsVersion="14092" targetRuntime="iOS.CocoaTouch.iPad" propertyAccessControl="none" useAutolayout="YES" colorMatched="YES"> + <device id="ipad9_7" orientation="portrait"> + <adaptation id="fullscreen"/> + </device> <dependencies> <deployment identifier="iOS"/> - <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="13772"/> + <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14081.1"/> <capability name="Constraints to layout margins" minToolsVersion="6.0"/> <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/> </dependencies> <objects> <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/> <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/> - <collectionViewCell opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" reuseIdentifier="PlaylistCell" id="2" customClass="VLCPlaylistCollectionViewCell"> + <collectionViewCell opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" reuseIdentifier="VLCPlaylistCollectionViewCell" id="2" customClass="VLCPlaylistCollectionViewCell"> <rect key="frame" x="0.0" y="0.0" width="341" height="190"/> <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/> <view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center"> @@ -54,7 +57,7 @@ <size key="shadowOffset" width="0.0" height="0.0"/> </label> <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Meta Data" textAlignment="center" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="lP6-D2-Oef"> - <rect key="frame" x="141" y="8" width="59" height="15"/> + <rect key="frame" x="141.5" y="8" width="58.5" height="14.5"/> <fontDescription key="fontDescription" type="system" pointSize="12"/> <color key="textColor" red="1" green="1" blue="1" alpha="0.59999999999999998" colorSpace="custom" customColorSpace="sRGB"/> <nil key="highlightedColor"/> diff --git a/Resources/VLCPlaylistTableViewCell.xib b/Resources/VLCPlaylistTableViewCell.xib index 196d9cc5a047f58eab2ea01f26aac81551c362da..6a574e22b9702faef2143c86aa0e6d0792edcf06 100644 --- a/Resources/VLCPlaylistTableViewCell.xib +++ b/Resources/VLCPlaylistTableViewCell.xib @@ -1,14 +1,17 @@ <?xml version="1.0" encoding="UTF-8"?> -<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="13771" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" colorMatched="YES"> +<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="14092" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" colorMatched="YES"> + <device id="retina4_7" orientation="portrait"> + <adaptation id="fullscreen"/> + </device> <dependencies> <deployment identifier="iOS"/> - <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="13772"/> + <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14081.1"/> <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/> </dependencies> <objects> <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/> <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/> - <tableViewCell contentMode="scaleToFill" selectionStyle="blue" indentationWidth="10" reuseIdentifier="PlaylistCell" rowHeight="191" id="3" customClass="VLCPlaylistTableViewCell"> + <tableViewCell contentMode="scaleToFill" selectionStyle="blue" indentationWidth="10" reuseIdentifier="VLCPlaylistTableViewCell" rowHeight="191" id="3" customClass="VLCPlaylistTableViewCell"> <rect key="frame" x="0.0" y="0.0" width="320" height="90"/> <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/> <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="3" id="pEL-yt-P8r"> @@ -47,7 +50,7 @@ <size key="shadowOffset" width="0.0" height="0.0"/> </label> <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Meta Data" textAlignment="center" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="3xi-uj-aAV"> - <rect key="frame" x="131" y="8" width="59" height="15"/> + <rect key="frame" x="131.5" y="8" width="58.5" height="14.5"/> <fontDescription key="fontDescription" type="system" pointSize="12"/> <color key="textColor" red="1" green="1" blue="1" alpha="0.59999999999999998" colorSpace="custom" customColorSpace="sRGB"/> <nil key="highlightedColor"/> diff --git a/Resources/VLCStringsForLocalization.m b/Resources/VLCStringsForLocalization.m index 4031348076af137a36658a39569ba2d9cc9c3489..62db670ba78e4c789f2863d84d6dd2c3cebdfad4 100644 --- a/Resources/VLCStringsForLocalization.m +++ b/Resources/VLCStringsForLocalization.m @@ -37,4 +37,5 @@ NSLocalizedString(@"Passcodes did not match. Try again.", nil); NSLocalizedString(@"1 Failed Passcode Attempt", nil); NSLocalizedString(@"%d Failed Passcode Attempts", nil); NSLocalizedString(@"Next", nil); +NSLocalizedString(@"DOWNLOAD_FROM_HTTP", nil); } diff --git a/Resources/en.lproj/Localizable.strings b/Resources/en.lproj/Localizable.strings index 544ba54ff76ae90d4220bd07c9dc05a9481b7315..a3f73d9d2754999037558ce6fe357c12b404267d 100644 --- a/Resources/en.lproj/Localizable.strings +++ b/Resources/en.lproj/Localizable.strings @@ -77,8 +77,7 @@ "OPEN_NETWORK" = "Open Network Stream"; "NETWORK_TITLE" = "Network Stream"; "OPEN_NETWORK_HELP" = "Enter any HTTP, RTSP, RTMP, MMS, FTP or UDP/RTP address to open the stream directly."; -"ABOUT_APP" = "About VLC for iOS"; -"OPEN_VLC_MENU" = "Open VLC sidebar menu"; +"ABOUT_APP" = "About"; "HTTP_UPLOAD_SERVER_OFF" = "Inactive Server"; "HTTP_UPLOAD_NO_CONNECTIVITY" = "No active WiFi connection"; "OPEN_STREAM_OR_DOWNLOAD" = "Would you like to download or play this URL?"; @@ -340,3 +339,6 @@ /* New strings */ "PROTOCOL_NOT_SELECTED" = "Protocol not selected"; "Settings" = "Settings"; + +/* New strings */ +"FILE_NOT_SUPPORTED_LONG" = "FILE_NOT_SUPPORTED_LONG"; diff --git a/SharedSources/Clouds/VLCBoxCollectionViewController.m b/SharedSources/Clouds/VLCBoxCollectionViewController.m index 301bfd64a244a58db857ef9df717aa1050b5bcc7..0b612dd705c7b07ff4f1a9a473411e7d2dbc443d 100644 --- a/SharedSources/Clouds/VLCBoxCollectionViewController.m +++ b/SharedSources/Clouds/VLCBoxCollectionViewController.m @@ -37,11 +37,6 @@ return self; } -- (void)dealloc -{ - [[NSNotificationCenter defaultCenter] removeObserver:self]; -} - - (void)viewDidLoad { [super viewDidLoad]; diff --git a/SharedSources/Clouds/VLCDropboxCollectionViewController.m b/SharedSources/Clouds/VLCDropboxCollectionViewController.m index 8c1f7ad3e7b2a9a6ec58a0dcc5bc839a46eb99df..b90407c5082427905e962cd2863cf482c00d5c55 100644 --- a/SharedSources/Clouds/VLCDropboxCollectionViewController.m +++ b/SharedSources/Clouds/VLCDropboxCollectionViewController.m @@ -25,11 +25,6 @@ @implementation VLCDropboxCollectionViewController -- (void)dealloc -{ - [[NSNotificationCenter defaultCenter] removeObserver:self]; -} - - (void)viewDidLoad { [super viewDidLoad]; diff --git a/SharedSources/Coordinators/AppCoordinator.swift b/SharedSources/Coordinators/AppCoordinator.swift new file mode 100644 index 0000000000000000000000000000000000000000..33a6f3c59109a4d53d12b01ab4405cfdac88067b --- /dev/null +++ b/SharedSources/Coordinators/AppCoordinator.swift @@ -0,0 +1,35 @@ +/***************************************************************************** + * AppCoordinator.swift + * VLC for iOS + ***************************************************************************** + * Copyright (c) 2018 VideoLAN. All rights reserved. + * $Id$ + * + * Authors: Carola Nitz <nitz.carola # gmail.com> + * + * Refer to the COPYING file of the official project for license. + *****************************************************************************/ +import Foundation + +@objc(VLCService) +public class Services:NSObject { + @objc let mediaDataSource = VLCMediaDataSource() +} + +@objc class AppCoordinator : NSObject { + + var childCoordinators: [NSObject] = [] + private var tabBarController:UITabBarController + private var services = Services() + + @objc public init(tabBarController: UITabBarController) { + self.tabBarController = tabBarController + super.init() + } + + @objc public func start() { + let tabbarCoordinator = VLCTabbarCooordinator(tabBarController: self.tabBarController, services:services) + tabbarCoordinator.start() + childCoordinators.append(tabbarCoordinator) + } +} diff --git a/SharedSources/Coordinators/SortOption.swift b/SharedSources/Coordinators/SortOption.swift new file mode 100644 index 0000000000000000000000000000000000000000..acd3a86aad58a2d6ed9642591e49000d69b2d9ea --- /dev/null +++ b/SharedSources/Coordinators/SortOption.swift @@ -0,0 +1,21 @@ +/***************************************************************************** + * SortOption.swift + * VLC for iOS + ***************************************************************************** + * Copyright (c) 2018 VideoLAN. All rights reserved. + * $Id$ + * + * Authors: Carola Nitz <nitz.carola # gmail.com> + * + * Refer to the COPYING file of the official project for license. + *****************************************************************************/ + +public enum SortOption:String { + case alphabetically = "Name" + case insertonDate = "Date" + case size = "Size" + + var localizedDescription: String { + return NSLocalizedString(self.rawValue, comment: "") + } +} diff --git a/SharedSources/MediaDataSource.swift b/SharedSources/MediaDataSource.swift new file mode 100644 index 0000000000000000000000000000000000000000..af725994f62ea36d134ec5e888e0c0ab5aaceb2e --- /dev/null +++ b/SharedSources/MediaDataSource.swift @@ -0,0 +1,69 @@ +/***************************************************************************** + * MediaDataSource.swift + * VLC for iOS + ***************************************************************************** + * Copyright (c) 2018 VideoLAN. All rights reserved. + * $Id$ + * + * Authors: Carola Nitz <nitz.carola # gmail.com> + * + * Refer to the COPYING file of the official project for license. + *****************************************************************************/ + +public class MediaDataSourceAndDelegate:NSObject, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout { + + private let cellPadding:CGFloat = 5.0 + private var services: Services + public weak var delegate: UICollectionViewDelegate? + + public convenience init(services:Services) { + self.init() + self.services = services + } + + public override init() { + self.services = Services() + super.init() + } + + public func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { + return Int(services.mediaDataSource.numberOfFiles()) + } + + public func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { + if let playlistCell = collectionView.dequeueReusableCell(withReuseIdentifier: VLCPlaylistCollectionViewCell.cellIdentifier(), for: indexPath) as? VLCPlaylistCollectionViewCell { + playlistCell.mediaObject = services.mediaDataSource.object(at: UInt(indexPath.row)) + return playlistCell + } + return UICollectionViewCell() + } + + public func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { + delegate?.collectionView!(collectionView, didSelectItemAt: indexPath) + } + + public func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { + + let numberOfCells:CGFloat = collectionView.traitCollection.horizontalSizeClass == .regular ? 3.0 : 2.0 + let aspectRatio:CGFloat = 10.0 / 16.0 + + // We have the number of cells and we always have numberofCells + 1 padding spaces. -pad-[Cell]-pad-[Cell]-pad- + // we then have the entire padding, we divide the entire padding by the number of Cells to know how much needs to be substracted from ech cell + // since this might be an uneven number we ceil + var cellWidth = collectionView.bounds.size.width / numberOfCells + cellWidth = cellWidth - ceil(((numberOfCells + 1) * cellPadding) / numberOfCells) + + return CGSize(width:cellWidth, height:cellWidth * aspectRatio) + } + + public func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets { + return UIEdgeInsetsMake(cellPadding, cellPadding, cellPadding, cellPadding); + } + + public func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat { + return cellPadding + } + public func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat { + return cellPadding + } +} diff --git a/SharedSources/PresentationTheme.swift b/SharedSources/PresentationTheme.swift new file mode 100644 index 0000000000000000000000000000000000000000..522d755407f5bb0268029780477c494113e0b3a8 --- /dev/null +++ b/SharedSources/PresentationTheme.swift @@ -0,0 +1,157 @@ +/***************************************************************************** + * PresentationTheme.swift + * VLC for iOS + ***************************************************************************** + * Copyright (c) 2018 VideoLAN. All rights reserved. + * $Id$ + * + * Authors: Carola Nitz <caro # videolan.org> + * + * Refer to the COPYING file of the official project for license. + *****************************************************************************/ + +import Foundation + +extension Notification.Name { + static let VLCThemeDidChangeNotification = Notification.Name("themeDidChangeNotfication") +} + +@objcMembers public class ColorPalette : NSObject { + + public let isDark: Bool + public let name: String + public let background:UIColor + public let cellBackgroundA:UIColor + public let cellBackgroundB:UIColor + public let cellDetailTextColor:UIColor + public let cellTextColor:UIColor + public let lightTextColor:UIColor + public let sectionHeaderTextColor:UIColor + public let sectionHeaderTintColor:UIColor + public let settingsBackground:UIColor + public let settingsCellBackground:UIColor + public let settingsSeparatorColor:UIColor + public let tabBarColor:UIColor + public let orangeUI:UIColor + + public init(isDark: Bool, + name: String, + background:UIColor, + cellBackgroundA:UIColor, + cellBackgroundB:UIColor, + cellDetailTextColor:UIColor, + cellTextColor:UIColor, + lightTextColor:UIColor, + sectionHeaderTextColor:UIColor, + sectionHeaderTintColor:UIColor, + settingsBackground:UIColor, + settingsCellBackground:UIColor, + settingsSeparatorColor:UIColor, + tabBarColor:UIColor, + orangeUI:UIColor) { + self.isDark = isDark + self.name = name + self.background = background + self.cellBackgroundA = cellBackgroundA + self.cellBackgroundB = cellBackgroundB + self.cellDetailTextColor = cellDetailTextColor + self.cellTextColor = cellTextColor + self.lightTextColor = lightTextColor + self.sectionHeaderTextColor = sectionHeaderTextColor + self.sectionHeaderTintColor = sectionHeaderTintColor + self.settingsBackground = settingsBackground + self.settingsCellBackground = settingsCellBackground + self.settingsSeparatorColor = settingsSeparatorColor + self.tabBarColor = tabBarColor + self.orangeUI = orangeUI + } +} + +@objcMembers public class PresentationTheme : NSObject { + + public static let brightTheme = PresentationTheme(colors: brightPalette) + public static let darkTheme = PresentationTheme(colors: darkPalette) + + static var current: PresentationTheme = { + let isDarkTheme = UserDefaults.standard.bool(forKey: kVLCSettingAppTheme) + return isDarkTheme ? PresentationTheme.darkTheme : PresentationTheme.brightTheme + }() + { + didSet { + NotificationCenter.default.post(name: .VLCThemeDidChangeNotification, object: self) + AppearanceManager.setupAppearance(theme: self.current) + } + } + public init(colors: ColorPalette) { + self.colors = colors + } + + public let colors: ColorPalette +} + +@objc public extension UIColor { + + public convenience init(_ rgbValue:UInt32, _ alpha:CGFloat = 1.0) { + let r = CGFloat((rgbValue & 0xFF0000) >> 16)/255.0 + let g = CGFloat((rgbValue & 0xFF00) >> 8)/255.0 + let b = CGFloat(rgbValue & 0xFF)/255.0 + self.init(red: r, green: g, blue: b, alpha: 1.0) + } + + private func toHex(alpha: Bool = false) -> String? { + guard let components = cgColor.components, components.count >= 3 else { + assertionFailure() + return nil + } + let r = Float(components[0]) + let g = Float(components[1]) + let b = Float(components[2]) + var a = Float(1.0) + + if components.count == 4 { + a = Float(components[3]) + } + + if alpha { + return String(format: "#%02lX%02lX%02lX%02lX", lroundf(r * 255), lroundf(g * 255), lroundf(b * 255), lroundf(a * 255)) + } else { + return String(format: "#%02lX%02lX%02lX", lroundf(r * 255), lroundf(g * 255), lroundf(b * 255)) + } + } + + var toHex: String? { + return toHex() + } +} + +let brightPalette = ColorPalette(isDark: false, + name: "Default", + background: UIColor(0xf9f9f7), + cellBackgroundA: UIColor(0xf9f9f7), + cellBackgroundB: UIColor(0xe5e5e3), + cellDetailTextColor: UIColor(0xd3d3d3), + cellTextColor: UIColor(0x000000), + lightTextColor: UIColor(0x888888), + sectionHeaderTextColor: UIColor(0xf9f9f7), + sectionHeaderTintColor: UIColor(0xe5efe3), + settingsBackground: UIColor(0xdcdcdc), + settingsCellBackground: UIColor(0xf9f9f7), + settingsSeparatorColor: UIColor(0xd3d3d3), + tabBarColor: UIColor(0xffffff), + orangeUI: UIColor(0xff8800)) + +let darkPalette = ColorPalette(isDark: true, + name: "Dark", + background: UIColor(0x292b36), + cellBackgroundA: UIColor(0x292b36), + cellBackgroundB: UIColor(0x000000), + cellDetailTextColor: UIColor(0xd3d3d3), + cellTextColor: UIColor(0xffffff), + lightTextColor: UIColor(0xb8b8b8), + sectionHeaderTextColor: UIColor(0x828282), + sectionHeaderTintColor: UIColor(0x3c3c3c), + settingsBackground: UIColor(0x292b36), + settingsCellBackground: UIColor(0x3d3f40), + settingsSeparatorColor: UIColor(0xa9a9a9), + tabBarColor: UIColor(0xffffff), + orangeUI: UIColor(0xff8800)) diff --git a/SharedSources/ServerBrowsing/HTTP/VLCLocalNetworkServiceBrowserHTTP.m b/SharedSources/ServerBrowsing/HTTP/VLCLocalNetworkServiceBrowserHTTP.m index 6fe5c28c78f8a745ff4c39d8ce4164a46a824a41..8ac77be619304f0b50d4a49a940cd7759847dd49 100644 --- a/SharedSources/ServerBrowsing/HTTP/VLCLocalNetworkServiceBrowserHTTP.m +++ b/SharedSources/ServerBrowsing/HTTP/VLCLocalNetworkServiceBrowserHTTP.m @@ -24,9 +24,6 @@ serviceType:@"_http._tcp." domain:@""]; } -- (void)dealloc { - [[NSNotificationCenter defaultCenter] removeObserver:self]; -} - (VLCSharedLibraryParser *)httpParser { if (!_httpParser) { diff --git a/SharedSources/ServerBrowsing/VLCLocalServerDiscoveryController.m b/SharedSources/ServerBrowsing/VLCLocalServerDiscoveryController.m index 5762b61fc59ed3336d297c31eedcc70b6e5fa5d8..f9662253d5698026cd558be955617bee045c6a10 100644 --- a/SharedSources/ServerBrowsing/VLCLocalServerDiscoveryController.m +++ b/SharedSources/ServerBrowsing/VLCLocalServerDiscoveryController.m @@ -69,8 +69,6 @@ - (void)dealloc { - [[NSNotificationCenter defaultCenter] removeObserver:self]; - [_reachability stopNotifier]; [self stopDiscovery]; } diff --git a/SharedSources/VLCPlayerControlWebSocket.m b/SharedSources/VLCPlayerControlWebSocket.m index 9de0706e2658eedaca41f3a34ecc325e19848e14..86e7b88c0bf741fc1afa27fbd36d0c7c435ee24b 100644 --- a/SharedSources/VLCPlayerControlWebSocket.m +++ b/SharedSources/VLCPlayerControlWebSocket.m @@ -15,11 +15,6 @@ @implementation VLCPlayerControlWebSocket -- (void)dealloc -{ - [[NSNotificationCenter defaultCenter] removeObserver:self]; -} - - (void)didOpen { NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter]; diff --git a/Sources/AppearanceManager.swift b/Sources/AppearanceManager.swift new file mode 100644 index 0000000000000000000000000000000000000000..043bd1ff4cf2f94ad2ce04f97daa17ec629afe8f --- /dev/null +++ b/Sources/AppearanceManager.swift @@ -0,0 +1,55 @@ +/***************************************************************************** + * AppearanceManager.swift + * VLC for iOS + ***************************************************************************** + * Copyright (c) 2018 VideoLAN. All rights reserved. + * $Id$ + * + * Authors: Carola Nitz <nitz.carola # gmail.com> + * + * Refer to the COPYING file of the official project for license. + *****************************************************************************/ +import UIKit + +@objc(VLCApperanceManager) +class AppearanceManager:NSObject +{ + @objc class func setupAppearance(theme:PresentationTheme = PresentationTheme.current) + { + // Change the keyboard for UISearchBar + UITextField.appearance().keyboardAppearance = theme == PresentationTheme.darkTheme ? .dark : .light + // For the cursor + UITextField.appearance().tintColor = theme.colors.orangeUI + + // Don't override the 'Cancel' button color in the search bar with the previous UITextField call. Use the default blue color + let attributes = [NSAttributedStringKey.foregroundColor: UIColor.white] + UIBarButtonItem.appearance(whenContainedInInstancesOf: [UISearchBar.self]).setTitleTextAttributes(attributes, for: .normal) + + UINavigationBar.appearance().barTintColor = theme.colors.orangeUI + UINavigationBar.appearance(whenContainedInInstancesOf: [VLCPlaybackNavigationController.self]).barTintColor = nil + UINavigationBar.appearance().tintColor = .white + UINavigationBar.appearance().titleTextAttributes = attributes + + if #available(iOS 11.0, *) { + UINavigationBar.appearance().prefersLargeTitles = true + UINavigationBar.appearance(whenContainedInInstancesOf:[VLCPlaybackNavigationController.self]).prefersLargeTitles = false + UINavigationBar.appearance().largeTitleTextAttributes = [NSAttributedStringKey.foregroundColor : UIColor.white] + } + // For the edit selection indicators + UITableView.appearance().tintColor = theme.colors.orangeUI + UISegmentedControl.appearance().tintColor = theme.colors.orangeUI + UISwitch.appearance().onTintColor = theme.colors.orangeUI + UISearchBar.appearance().barTintColor = .white + + UITabBar.appearance().tintColor = theme.colors.orangeUI + //customization of MoreViewController + //Since there is no clean way to customize the Morecontroller appearance we're getting the class + if let moreListControllerClass = NSClassFromString("UIMoreListController") as? UIAppearanceContainer.Type { + UITableViewCell.appearance(whenContainedInInstancesOf: [moreListControllerClass.self]).backgroundColor = theme.colors.cellBackgroundA + UITableViewCell.appearance(whenContainedInInstancesOf: [moreListControllerClass.self]).textLabel?.textColor = theme.colors.cellTextColor + UITableView.appearance(whenContainedInInstancesOf: [moreListControllerClass.self]).backgroundColor = theme.colors.background + UITableView.appearance(whenContainedInInstancesOf: [moreListControllerClass.self]).separatorColor = .lightGray + UILabel.appearance(whenContainedInInstancesOf: [moreListControllerClass.self]).textColor = theme.colors.cellTextColor + } + } +} diff --git a/Sources/LocalNetworkConnectivity/RemoteNetworkDataSource.swift b/Sources/LocalNetworkConnectivity/RemoteNetworkDataSource.swift new file mode 100644 index 0000000000000000000000000000000000000000..b7b739abab0a3c8883d46092c07be339a9c3b786 --- /dev/null +++ b/Sources/LocalNetworkConnectivity/RemoteNetworkDataSource.swift @@ -0,0 +1,27 @@ +/***************************************************************************** + * RemoteNetworkDataSource.swift + * VLC for iOS + ***************************************************************************** + * Copyright (c) 2018 VideoLAN. All rights reserved. + * $Id$ + * + * Authors: Carola Nitz <nitz.carola # googlemail.com> + * + * Refer to the COPYING file of the official project for license. + *****************************************************************************/ +import Foundation + +@objc(VLCRemoteNetworkDataSource) +public class RemoteNetworkDataSource:NSObject, UITableViewDataSource { + + public func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + return 1 + } + + public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + if let wifiCell = tableView.dequeueReusableCell(withIdentifier: VLCWiFiUploadTableViewCell.cellIdentifier()) { + return wifiCell + } + return UITableViewCell() + } +} diff --git a/Sources/LocalNetworkConnectivity/VLCNetworkListViewController.m b/Sources/LocalNetworkConnectivity/VLCNetworkListViewController.m index 27010c7f71770f89ea3171784affc81a39f6a8be..7e20de66522c7e77c9d5677ee39f8923e7d83226 100644 --- a/Sources/LocalNetworkConnectivity/VLCNetworkListViewController.m +++ b/Sources/LocalNetworkConnectivity/VLCNetworkListViewController.m @@ -92,8 +92,7 @@ NSString *VLCNetworkListCellIdentifier = @"VLCNetworkListCellIdentifier"; } self.definesPresentationContext = YES; - self.navigationItem.rightBarButtonItems = @[[UIBarButtonItem themedRevealMenuButtonWithTarget:self andSelector:@selector(menuButtonAction:)], - [UIBarButtonItem themedPlayAllButtonWithTarget:self andSelector:@selector(playAllAction:)]]; + self.navigationItem.rightBarButtonItems = @[[UIBarButtonItem themedPlayAllButtonWithTarget:self andSelector:@selector(playAllAction:)]]; _searchData = [[NSMutableArray alloc] init]; [_searchData removeAllObjects]; @@ -118,6 +117,8 @@ NSString *VLCNetworkListCellIdentifier = @"VLCNetworkListCellIdentifier"; - (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; + if (self.isEditing) + [self setEditing:NO animated:YES]; } - (BOOL)shouldAutorotate @@ -128,14 +129,6 @@ NSString *VLCNetworkListCellIdentifier = @"VLCNetworkListCellIdentifier"; return YES; } -- (IBAction)menuButtonAction:(id)sender -{ - [[VLCSidebarController sharedInstance] toggleSidebar]; - - if (self.isEditing) - [self setEditing:NO animated:YES]; -} - - (IBAction)playAllAction:(id)sender { // to be implemented by subclass diff --git a/Sources/LocalNetworkConnectivity/VLCNetworkLoginViewController.m b/Sources/LocalNetworkConnectivity/VLCNetworkLoginViewController.m index 085303c75f7eb5c606c4854602ef81f5d0277b7f..6a665d2adaf28ecb733a5edfe27de64a68c8d2ca 100644 --- a/Sources/LocalNetworkConnectivity/VLCNetworkLoginViewController.m +++ b/Sources/LocalNetworkConnectivity/VLCNetworkLoginViewController.m @@ -87,11 +87,6 @@ // self.edgesForExtendedLayout = UIRectEdgeNone; } -- (void)dealloc -{ - [[NSNotificationCenter defaultCenter] removeObserver:self]; -} - - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; diff --git a/Sources/LocalNetworkConnectivity/VLCServerListViewController.h b/Sources/LocalNetworkConnectivity/VLCServerListViewController.h index e5b872b8e334262d0a617a0a5fd2ad63a0a47282..1dd69e9076fd5c779c787f6689c0fa3618693f01 100644 --- a/Sources/LocalNetworkConnectivity/VLCServerListViewController.h +++ b/Sources/LocalNetworkConnectivity/VLCServerListViewController.h @@ -15,6 +15,4 @@ @interface VLCServerListViewController : UIViewController -@property (nonatomic, strong) UITableView *tableView; - @end diff --git a/Sources/LocalNetworkConnectivity/VLCServerListViewController.m b/Sources/LocalNetworkConnectivity/VLCServerListViewController.m index 9d638a33ce4bafddea303c49d7cef3ba486e5c89..ce8d8ca11e539c3ec42586622802159b12273518 100644 --- a/Sources/LocalNetworkConnectivity/VLCServerListViewController.m +++ b/Sources/LocalNetworkConnectivity/VLCServerListViewController.m @@ -2,7 +2,7 @@ * VLCLocalServerListViewController.m * VLC for iOS ***************************************************************************** - * Copyright (c) 2013-2015 VideoLAN. All rights reserved. + * Copyright (c) 2013-2018 VideoLAN. All rights reserved. * $Id$ * * Authors: Felix Paul Kühne <fkuehne # videolan.org> @@ -10,6 +10,7 @@ * Gleb Pinigin <gpinigin # gmail.com> * Tobias Conradi <videolan # tobias-conradi.de> * Vincent L. Cone <vincent.l.cone # tuta.io> + * Carola Nitz <caro # videolan.org> * * Refer to the COPYING file of the official project for license. *****************************************************************************/ @@ -37,45 +38,87 @@ #import "VLCLocalNetworkServiceBrowserDSM.h" #import "VLCLocalNetworkServiceBrowserBonjour.h" +#import "VLCWiFiUploadTableViewCell.h" + +#import "VLC_iOS-Swift.h" + @interface VLCServerListViewController () <UITableViewDataSource, UITableViewDelegate, VLCLocalServerDiscoveryControllerDelegate, VLCNetworkLoginViewControllerDelegate> { VLCLocalServerDiscoveryController *_discoveryController; - UIBarButtonItem *_backToMenuButton; - UIRefreshControl *_refreshControl; UIActivityIndicatorView *_activityIndicator; + UITableView *_localNetworkTableView; + UITableView *_remoteNetworkTableView; + VLCRemoteNetworkDataSource *_remoteNetworkDatasource; } @end @implementation VLCServerListViewController -- (void)dealloc -{ - [[NSNotificationCenter defaultCenter] removeObserver:self]; -} - - (void)loadView { - _tableView = [[UITableView alloc] initWithFrame:[UIScreen mainScreen].bounds style:UITableViewStylePlain]; - _tableView.backgroundColor = [UIColor VLCDarkBackgroundColor]; - _tableView.delegate = self; - _tableView.dataSource = self; - _tableView.indicatorStyle = UIScrollViewIndicatorStyleWhite; - _tableView.separatorStyle = UITableViewCellSeparatorStyleNone; - self.view = _tableView; + [super loadView]; + + _remoteNetworkDatasource = [VLCRemoteNetworkDataSource new]; + + _localNetworkTableView = [[UITableView alloc] initWithFrame:[UIScreen mainScreen].bounds style:UITableViewStylePlain]; + _localNetworkTableView.translatesAutoresizingMaskIntoConstraints = NO; + _localNetworkTableView.backgroundColor = PresentationTheme.current.colors.background; + _localNetworkTableView.delegate = self; + _localNetworkTableView.dataSource = self; + _localNetworkTableView.indicatorStyle = UIScrollViewIndicatorStyleWhite; + _localNetworkTableView.separatorStyle = UITableViewCellSeparatorStyleNone; + _localNetworkTableView.bounces = NO; + _localNetworkTableView.rowHeight = [VLCNetworkListCell heightOfCell]; + _localNetworkTableView.separatorColor = PresentationTheme.current.colors.background; + + //TODO: this is very much work in progress we need to accomodate the wificell for now + //When we know how many cells go above the the local servers we should create and move this into a headerview of the localNetworkTable + _remoteNetworkTableView = [[UITableView alloc] initWithFrame:[UIScreen mainScreen].bounds style:UITableViewStylePlain]; + _remoteNetworkTableView.translatesAutoresizingMaskIntoConstraints = NO; + _remoteNetworkTableView.backgroundColor = PresentationTheme.current.colors.background; + _remoteNetworkTableView.delegate = self; + _remoteNetworkTableView.dataSource = _remoteNetworkDatasource; + _remoteNetworkTableView.indicatorStyle = UIScrollViewIndicatorStyleWhite; + _remoteNetworkTableView.separatorStyle = UITableViewCellSeparatorStyleNone; + _remoteNetworkTableView.bounces = NO; + [_remoteNetworkTableView registerClass:[VLCWiFiUploadTableViewCell class] forCellReuseIdentifier:[VLCWiFiUploadTableViewCell cellIdentifier]]; + + _refreshControl = [[UIRefreshControl alloc] init]; + _refreshControl.backgroundColor = PresentationTheme.current.colors.background; + _refreshControl.tintColor = [UIColor whiteColor]; + [_refreshControl addTarget:self action:@selector(handleRefresh) forControlEvents:UIControlEventValueChanged]; + [_localNetworkTableView addSubview:_refreshControl]; + _activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge]; - _activityIndicator.center = _tableView.center; + _activityIndicator.center = _localNetworkTableView.center; _activityIndicator.autoresizingMask = UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleTopMargin; _activityIndicator.hidesWhenStopped = YES; - [self.view addSubview:_activityIndicator]; + [_localNetworkTableView addSubview:_activityIndicator]; + + [self.view addSubview:_localNetworkTableView]; + [self.view addSubview:_remoteNetworkTableView]; + [NSLayoutConstraint activateConstraints:@[ + [_remoteNetworkTableView.leftAnchor constraintEqualToAnchor:self.view.leftAnchor], + [_remoteNetworkTableView.rightAnchor constraintEqualToAnchor:self.view.rightAnchor], + [_remoteNetworkTableView.topAnchor constraintEqualToAnchor:self.topLayoutGuide.bottomAnchor], + [_remoteNetworkTableView.heightAnchor constraintEqualToConstant:50], + [_localNetworkTableView.topAnchor constraintEqualToAnchor:_remoteNetworkTableView.bottomAnchor], + [_localNetworkTableView.leftAnchor constraintEqualToAnchor:self.view.leftAnchor], + [_localNetworkTableView.rightAnchor constraintEqualToAnchor:self.view.rightAnchor], + [_localNetworkTableView.bottomAnchor constraintEqualToAnchor:self.view.bottomAnchor], + ]]; + self.view.backgroundColor = PresentationTheme.current.colors.background; } - (void)viewDidLoad { [super viewDidLoad]; + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(themeDidChange) name:kVLCThemeDidChangeNotification object:nil]; + NSArray *browserClasses = @[ [VLCLocalNetworkServiceBrowserManualConnect class], [VLCLocalNetworkServiceBrowserUPnP class], @@ -91,21 +134,6 @@ _discoveryController = [[VLCLocalServerDiscoveryController alloc] initWithServiceBrowserClasses:browserClasses]; _discoveryController.delegate = self; - - _backToMenuButton = [UIBarButtonItem themedRevealMenuButtonWithTarget:self andSelector:@selector(goBack:)]; - self.navigationItem.leftBarButtonItem = _backToMenuButton; - - self.tableView.rowHeight = [VLCNetworkListCell heightOfCell]; - self.tableView.separatorColor = [UIColor VLCDarkBackgroundColor]; - self.view.backgroundColor = [UIColor VLCDarkBackgroundColor]; - - self.title = NSLocalizedString(@"LOCAL_NETWORK", nil); - - _refreshControl = [[UIRefreshControl alloc] init]; - _refreshControl.backgroundColor = [UIColor VLCDarkBackgroundColor]; - _refreshControl.tintColor = [UIColor whiteColor]; - [_refreshControl addTarget:self action:@selector(handleRefresh) forControlEvents:UIControlEventValueChanged]; - [self.tableView addSubview:_refreshControl]; } - (void)viewWillDisappear:(BOOL)animated @@ -122,12 +150,6 @@ [_discoveryController startDiscovery]; } -- (IBAction)goBack:(id)sender -{ - [_discoveryController stopDiscovery]; - [[VLCSidebarController sharedInstance] toggleSidebar]; -} - - (BOOL)shouldAutorotate { UIInterfaceOrientation toInterfaceOrientation = [[UIApplication sharedApplication] statusBarOrientation]; @@ -150,18 +172,20 @@ - (void)tableView:(UITableView *)tableView willDisplayCell:(VLCNetworkListCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { - UIColor *color = (indexPath.row % 2 == 0)? [UIColor blackColor]: [UIColor VLCDarkBackgroundColor]; + if (tableView == _remoteNetworkTableView) return; + UIColor *color = (indexPath.row % 2 == 0)? PresentationTheme.current.colors.cellBackgroundB : PresentationTheme.current.colors.cellBackgroundA; cell.backgroundColor = cell.titleLabel.backgroundColor = cell.folderTitleLabel.backgroundColor = cell.subtitleLabel.backgroundColor = color; + cell.titleLabel.textColor = cell.folderTitleLabel.textColor = cell.subtitleLabel.textColor = cell.thumbnailView.tintColor = PresentationTheme.current.colors.cellTextColor; } - (void)tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view forSection:(NSInteger)section { // Text Color UITableViewHeaderFooterView *header = (UITableViewHeaderFooterView *)view; - [header.textLabel setTextColor:[UIColor colorWithRed:(130.0f/255.0f) green:(130.0f/255.0f) blue:(130.0f/255.0f) alpha:1.0f]]; + header.textLabel.textColor = PresentationTheme.current.colors.sectionHeaderTextColor; header.textLabel.font = [UIFont boldSystemFontOfSize:([UIFont systemFontSize] * 0.8f)]; - header.tintColor = [UIColor colorWithRed:(60.0f/255.0f) green:(60.0f/255.0f) blue:(60.0f/255.0f) alpha:1.0f]; + header.tintColor = PresentationTheme.current.colors.sectionHeaderTintColor; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath @@ -181,6 +205,11 @@ return cell; } +- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath +{ + return tableView == _remoteNetworkTableView ? nil : indexPath; +} + - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { [tableView deselectRowAtIndexPath:indexPath animated:YES]; @@ -230,6 +259,13 @@ [self.navigationController pushViewController:loginViewController animated:YES]; } } +#pragma mark - +- (void)themeDidChange +{ + _localNetworkTableView.backgroundColor = PresentationTheme.current.colors.background; + _localNetworkTableView.separatorColor = PresentationTheme.current.colors.background; + _refreshControl.backgroundColor = PresentationTheme.current.colors.background; +} - (void)_dismissLogin { @@ -254,7 +290,7 @@ //end the refreshing if ([_discoveryController refreshDiscoveredData]) - [self.tableView reloadData]; + [_localNetworkTableView reloadData]; [_refreshControl endRefreshing]; } @@ -286,7 +322,7 @@ - (void)discoveryFoundSomethingNew { - [self.tableView reloadData]; + [_localNetworkTableView reloadData]; } #pragma mark - custom table view appearance diff --git a/Sources/MediaViewController.swift b/Sources/MediaViewController.swift new file mode 100644 index 0000000000000000000000000000000000000000..a1a89796fdb0ca7260336e045c9eda23e55112ec --- /dev/null +++ b/Sources/MediaViewController.swift @@ -0,0 +1,137 @@ +/***************************************************************************** + * MediaViewController.swift + * VLC for iOS + ***************************************************************************** + * Copyright (c) 2018 VideoLAN. All rights reserved. + * $Id$ + * + * Authors: Carola Nitz <nitz.carola # gmail.com> + * + * Refer to the COPYING file of the official project for license. + *****************************************************************************/ + +import Foundation + +@objc public protocol VLCMediaViewControllerDelegate: class { + func mediaViewControllerDidSelectMediaObject(_ mediaViewController: VLCMediaViewController, mediaObject:NSManagedObject) + func mediaViewControllerDidSelectSort(_ mediaViewController: VLCMediaViewController) +} + +public class VLCMediaViewController: UICollectionViewController, UISearchResultsUpdating, UISearchControllerDelegate +{ + private var services: Services + private var mediaDatasourceAndDelegate:MediaDataSourceAndDelegate? + private var searchController: UISearchController? + private let searchDataSource = VLCLibrarySearchDisplayDataSource() + public weak var delegate: VLCMediaViewControllerDelegate? + + @available(iOS 11.0, *) + lazy var dragAndDropManager:VLCDragAndDropManager = { + let dragAndDropManager = VLCDragAndDropManager() + dragAndDropManager.delegate = services.mediaDataSource + return dragAndDropManager + }() + + public convenience init(services:Services) { + self.init(collectionViewLayout: UICollectionViewFlowLayout()) + self.services = services + NotificationCenter.default.addObserver(self, selector: #selector(themeDidChange), name: .VLCThemeDidChangeNotification, object: nil) + } + + public override init(collectionViewLayout layout: UICollectionViewLayout) { + self.services = Services() + super.init(collectionViewLayout: layout) + } + + @available(*, unavailable) + required public init?(coder aDecoder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + override public func viewDidLoad() { + super.viewDidLoad() + setupCollectionView() + setupSearchController() + setupNavigationBar() + _ = (MLMediaLibrary.sharedMediaLibrary() as! MLMediaLibrary).libraryDidAppear() + } + + @objc func themeDidChange() { + collectionView?.backgroundColor = PresentationTheme.current.colors.background + } + + func setupCollectionView(){ + mediaDatasourceAndDelegate = MediaDataSourceAndDelegate(services: services) + mediaDatasourceAndDelegate?.delegate = self + let playlistnib = UINib(nibName: "VLCPlaylistCollectionViewCell", bundle:nil) + collectionView?.register(playlistnib, forCellWithReuseIdentifier: VLCPlaylistCollectionViewCell.cellIdentifier()) + collectionView?.backgroundColor = PresentationTheme.current.colors.background + collectionView?.alwaysBounceVertical = true + collectionView?.dataSource = mediaDatasourceAndDelegate + collectionView?.delegate = mediaDatasourceAndDelegate + if #available(iOS 11.0, *) { + collectionView?.dragDelegate = dragAndDropManager + collectionView?.dropDelegate = dragAndDropManager + } + } + + override public func viewDidAppear(_ animated: Bool) { + super.viewDidAppear(animated) + services.mediaDataSource.updateContents(forSelection: nil) + services.mediaDataSource.addAllFolders() + services.mediaDataSource.addRemainingFiles() + collectionView?.reloadData() + + } + func setupSearchController() { + searchController = UISearchController(searchResultsController: nil) + searchController?.searchResultsUpdater = self + searchController?.dimsBackgroundDuringPresentation = false + searchController?.delegate = self + if let textfield = searchController?.searchBar.value(forKey: "searchField") as? UITextField { + if let backgroundview = textfield.subviews.first { + backgroundview.backgroundColor = UIColor.white + backgroundview.layer.cornerRadius = 10; + backgroundview.clipsToBounds = true; + } + } + if #available(iOS 11.0, *) { + navigationItem.searchController = searchController + } else { + navigationItem.titleView = searchController?.searchBar + searchController?.hidesNavigationBarDuringPresentation = false + } + } + + func setupNavigationBar() { + navigationItem.leftBarButtonItem = UIBarButtonItem(title: NSLocalizedString("Sort", comment: ""), style: .plain, target: self, action: #selector(sort)) + } + + @objc func sort() { + delegate?.mediaViewControllerDidSelectSort(self) + } + + override public func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) { + collectionView?.collectionViewLayout.invalidateLayout() + } + + //MARK: - MediaDatasourceAndDelegate + override public func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { + delegate?.mediaViewControllerDidSelectMediaObject(self, mediaObject:services.mediaDataSource.object(at: UInt(indexPath.row))) + } + + //MARK: - Search + public func updateSearchResults(for searchController: UISearchController) { + searchDataSource.shouldReloadTable(forSearch: searchController.searchBar.text, searchableFiles: services.mediaDataSource.allObjects()) + collectionView?.reloadData() + } + + public func didPresentSearchController(_ searchController: UISearchController) { + collectionView?.dataSource = searchDataSource + } + + public func didDismissSearchController(_ searchController: UISearchController) { + collectionView?.dataSource = mediaDatasourceAndDelegate + } + +} diff --git a/Sources/UIBarButtonItem+Theme.h b/Sources/UIBarButtonItem+Theme.h index d9d7e2197be84f999298fe90615adae2332034fd..01baed7070b1321ec64d820a60beeacd6f7b341a 100644 --- a/Sources/UIBarButtonItem+Theme.h +++ b/Sources/UIBarButtonItem+Theme.h @@ -11,7 +11,6 @@ *****************************************************************************/ @interface UIBarButtonItem (ThemedButtons) + (UIBarButtonItem *)themedBackButtonWithTarget:(id)target andSelector:(SEL)selector; -+ (UIBarButtonItem *)themedRevealMenuButtonWithTarget:(id)target andSelector:(SEL)selector; + (UIBarButtonItem *)themedDarkToolbarButtonWithTitle: (NSString*) title target:(id)target andSelector:(SEL)selector; + (UIBarButtonItem *)themedPlayAllButtonWithTarget:(id)target andSelector:(SEL)selector; @end diff --git a/Sources/UIBarButtonItem+Theme.m b/Sources/UIBarButtonItem+Theme.m index d352fbe2069161fd11c8e68cbd2bf875669df497..8829fc1ed49ffffb0062626d0383fe252596562d 100644 --- a/Sources/UIBarButtonItem+Theme.m +++ b/Sources/UIBarButtonItem+Theme.m @@ -26,28 +26,6 @@ return backButton; } -+ (UIBarButtonItem *)themedRevealMenuButtonWithTarget:(id)target andSelector:(SEL)selector -{ - /* After day 354 of the year, the usual VLC cone is replaced by another cone - * wearing a Father Xmas hat. - * Note: this icon doesn't represent an endorsement of The Coca-Cola Company - * and should not be confused with the idea of religious statements or propagation there off - */ - NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian]; - NSUInteger dayOfYear = [gregorian ordinalityOfUnit:NSCalendarUnitDay inUnit:NSCalendarUnitYear forDate:[NSDate date]]; - UIImage *icon; - if (dayOfYear >= 354) - icon = [UIImage imageNamed:@"vlc-xmas"]; - else - icon = [UIImage imageNamed:@"menuCone"]; - - UIBarButtonItem *menuButton = [[UIBarButtonItem alloc] initWithImage:icon style:UIBarButtonItemStylePlain target:target action:selector]; - menuButton.tintColor = [UIColor whiteColor]; - menuButton.accessibilityLabel = NSLocalizedString(@"OPEN_VLC_MENU", nil); - - return menuButton; -} - + (UIBarButtonItem *)themedDarkToolbarButtonWithTitle:(NSString*)title target:(id)target andSelector:(SEL)selector { UIBarButtonItem *button = [[UIBarButtonItem alloc] initWithTitle:title style:UIBarButtonItemStylePlain target:target action:selector]; diff --git a/Sources/VLCAboutViewController.m b/Sources/VLCAboutViewController.m index 45f1316979d3d922e45fcf9c10d0fe291999d375..c589ef9a9286bce7466ca05b36ac4cf8a63481f2 100644 --- a/Sources/VLCAboutViewController.m +++ b/Sources/VLCAboutViewController.m @@ -13,6 +13,7 @@ *****************************************************************************/ #import "VLCAboutViewController.h" +#import "VLC_iOS-Swift.h" @interface VLCAboutViewController () { @@ -26,7 +27,7 @@ - (void)loadView { self.view = [[UIView alloc] initWithFrame:[UIScreen mainScreen].bounds]; - self.view.backgroundColor = [UIColor VLCDarkBackgroundColor]; + self.view.backgroundColor = PresentationTheme.current.colors.background; self.view.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth; _webView = [[UIWebView alloc] initWithFrame:self.view.frame]; @@ -37,6 +38,8 @@ _webView.scrollView.indicatorStyle = UIScrollViewIndicatorStyleWhite; _webView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; [self.view addSubview:_webView]; + + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(themeDidChange) name:kVLCThemeDidChangeNotification object:nil]; } - (void)viewDidLoad @@ -49,14 +52,31 @@ contributeButton.tintColor = [UIColor whiteColor]; self.navigationItem.rightBarButtonItem = contributeButton; - self.navigationItem.leftBarButtonItem = [UIBarButtonItem themedRevealMenuButtonWithTarget:self andSelector:@selector(goBack:)]; + [self loadWebContent]; +} +- (void)loadWebContent +{ NSBundle *mainBundle = [NSBundle mainBundle]; - NSMutableString *htmlContent = [NSMutableString stringWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"About Contents" ofType:@"html"] encoding:NSUTF8StringEncoding error:nil]; - [htmlContent replaceOccurrencesOfString:@"VLCFORIOSVERSION" withString:[[NSString stringWithFormat:NSLocalizedString(@"VERSION_FORMAT", nil), [mainBundle objectForInfoDictionaryKey:@"CFBundleShortVersionString"]] stringByAppendingFormat:@" (%@)<br /><i>%@</i>", [mainBundle objectForInfoDictionaryKey:@"CFBundleVersion"], kVLCVersionCodename] options:NSLiteralSearch range:NSMakeRange(800, 1000)]; - [htmlContent replaceOccurrencesOfString:@"MOBILEVLCKITVERSION" withString:[NSString stringWithFormat:NSLocalizedString(@"BASED_ON_FORMAT", nil),[[VLCLibrary sharedLibrary] version]] options:NSLiteralSearch range:NSMakeRange(800, 1100)]; - [_webView loadHTMLString:[NSString stringWithString:htmlContent] baseURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] bundlePath]]]; - htmlContent = nil; + NSString *textColor = PresentationTheme.current.colors.cellTextColor.toHex; + NSString *backgroundColor = PresentationTheme.current.colors.background.toHex; + NSString *version = [NSString stringWithFormat:NSLocalizedString(@"VERSION_FORMAT", nil), [mainBundle objectForInfoDictionaryKey:@"CFBundleShortVersionString"]]; + NSString *versionBuildNumberAndCodeName = [version stringByAppendingFormat:@" (%@)<br /><i>%@</i>", [mainBundle objectForInfoDictionaryKey:@"CFBundleVersion"], kVLCVersionCodename]; + NSString *vlcLibraryVersion = [NSString stringWithFormat:NSLocalizedString(@"BASED_ON_FORMAT", nil),[[VLCLibrary sharedLibrary] version]]; + NSString *htmlFilePath = [mainBundle pathForResource:@"About Contents" ofType:@"html"]; + NSMutableString *htmlContent = [NSMutableString stringWithContentsOfFile:htmlFilePath encoding:NSUTF8StringEncoding error:nil]; + [htmlContent replaceOccurrencesOfString:@"VLCFORIOSVERSION" withString:versionBuildNumberAndCodeName options:NSLiteralSearch range:NSMakeRange(0, [htmlContent length])]; + [htmlContent replaceOccurrencesOfString:@"TEXTCOLOR" withString:textColor options:NSLiteralSearch range:NSMakeRange(0, [htmlContent length])]; + [htmlContent replaceOccurrencesOfString:@"BACKGROUNDCOLOR" withString:backgroundColor options:NSLiteralSearch range:NSMakeRange(0, [htmlContent length])]; + [htmlContent replaceOccurrencesOfString:@"MOBILEVLCKITVERSION" withString:vlcLibraryVersion options:NSLiteralSearch range:NSMakeRange(0, [htmlContent length])]; + [_webView loadHTMLString:htmlContent baseURL:[NSURL fileURLWithPath:[mainBundle bundlePath]]]; +} + +- (void)themeDidChange +{ + self.view.backgroundColor = PresentationTheme.current.colors.background; + _webView.backgroundColor = PresentationTheme.current.colors.background; + [self loadWebContent]; } - (BOOL)shouldAutorotate @@ -67,11 +87,6 @@ return YES; } -- (IBAction)goBack:(id)sender -{ - [[VLCSidebarController sharedInstance] toggleSidebar]; -} - - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { NSURL *requestURL = request.URL; @@ -83,7 +98,7 @@ - (void)webViewDidFinishLoad:(UIWebView *)webView { - _webView.backgroundColor = [UIColor VLCDarkBackgroundColor]; + _webView.backgroundColor = PresentationTheme.current.colors.background; _webView.opaque = YES; } diff --git a/Sources/VLCAlertView.m b/Sources/VLCAlertView.m index a333d0df5d9841be0d451c90a1512a8b394c4d9a..a4867fb7247250e87def79909b97cc49192a1a87 100644 --- a/Sources/VLCAlertView.m +++ b/Sources/VLCAlertView.m @@ -18,11 +18,6 @@ @implementation VLCAlertView -- (void)dealloc -{ - [[NSNotificationCenter defaultCenter] removeObserver:self]; -} - - (id)initWithTitle:(NSString *)title message:(NSString *)message cancelButtonTitle:(NSString *)cancelButtonTitle otherButtonTitles:(NSArray *)otherButtonTitles { self = [self initWithTitle:title message:message delegate:self cancelButtonTitle:cancelButtonTitle otherButtonTitles:nil]; diff --git a/Sources/VLCAppDelegate.h b/Sources/VLCAppDelegate.h index 1a9a79ea0d3c676f44f9679fdb6d54ed903fb7fa..2e689512a6271c89cd58d7c5af3ac45af9f2957a 100644 --- a/Sources/VLCAppDelegate.h +++ b/Sources/VLCAppDelegate.h @@ -15,18 +15,13 @@ *****************************************************************************/ #import "VLCMenuTableViewController.h" -#import "VLCDownloadViewController.h" #import "VLCWatchCommunication.h" #import <AppAuth/AppAuth.h> -@class VLCLibraryViewController; - extern NSString *const VLCDropboxSessionWasAuthorized; @interface VLCAppDelegate : UIResponder <UIApplicationDelegate> -@property (nonatomic, readonly) VLCLibraryViewController *libraryViewController; - @property (nonatomic, readonly) VLCWatchCommunication *watchCommunication; @property (nonatomic, strong) UIWindow *window; diff --git a/Sources/VLCAppDelegate.m b/Sources/VLCAppDelegate.m index ccac936ae669596058a4ed7bbd1ab4eba109839b..ca138c2182e276047234336bafc58b4d7d33bd4d 100644 --- a/Sources/VLCAppDelegate.m +++ b/Sources/VLCAppDelegate.m @@ -21,18 +21,16 @@ #import "VLCMediaFileDiscoverer.h" #import "NSString+SupportedMedia.h" #import "UIDevice+VLC.h" -#import "VLCLibraryViewController.h" #import "VLCHTTPUploaderController.h" #import "VLCMigrationViewController.h" #import <BoxSDK/BoxSDK.h> #import "VLCPlaybackController.h" #import "VLCPlaybackController+MediaLibrary.h" -#import "VLCPlayerDisplayController.h" #import <MediaPlayer/MediaPlayer.h> #import <HockeySDK/HockeySDK.h> -#import "VLCSidebarController.h" #import "VLCActivityManager.h" #import "VLCDropboxConstants.h" +#import "VLCDownloadViewController.h" #import <ObjectiveDropboxOfficial/ObjectiveDropboxOfficial.h> #import "VLCPlaybackNavigationController.h" #import "PAPasscodeViewController.h" @@ -48,6 +46,8 @@ NSString *const VLCDropboxSessionWasAuthorized = @"VLCDropboxSessionWasAuthorize BOOL _isComingFromHandoff; VLCWatchCommunication *_watchCommunication; VLCKeychainCoordinator *_keychainCoordinator; + AppCoordinator *appCoordinator; + UITabBarController *rootViewController; } @end @@ -101,30 +101,21 @@ NSString *const VLCDropboxSessionWasAuthorized = @"VLCDropboxSessionWasAuthorize // Configure Dropbox [DBClientsManager setupWithAppKey:kVLCDropboxAppKey]; - [self setupAppearence]; + [VLCApperanceManager setupAppearanceWithTheme:PresentationTheme.current]; // Init the HTTP Server and clean its cache [[VLCHTTPUploaderController sharedInstance] cleanCache]; self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; + rootViewController = [UITabBarController new]; + self.window.rootViewController = rootViewController; + [self.window makeKeyAndVisible]; // enable crash preventer void (^setupBlock)() = ^{ - __weak typeof(self) weakSelf = self; void (^setupLibraryBlock)() = ^{ - _libraryViewController = [[VLCLibraryViewController alloc] init]; - UINavigationController *navCon = [[UINavigationController alloc] initWithRootViewController:_libraryViewController]; - - VLCSidebarController *sidebarVC = [VLCSidebarController sharedInstance]; - sidebarVC.contentViewController = navCon; - - VLCPlayerDisplayController *playerDisplayController = [VLCPlayerDisplayController sharedInstance]; - playerDisplayController.childViewController = sidebarVC.fullViewController; - - weakSelf.window.rootViewController = playerDisplayController; + appCoordinator = [[AppCoordinator alloc] initWithTabBarController:rootViewController]; + [appCoordinator start]; }; - UINavigationController *navCon = [[UINavigationController alloc] initWithRootViewController:[[UIViewController alloc] init]]; - self.window.rootViewController = navCon; - [self.window makeKeyAndVisible]; [self validatePasscodeIfNeededWithCompletion:setupLibraryBlock]; BOOL spotlightEnabled = ![VLCKeychainCoordinator passcodeLockEnabled]; @@ -202,32 +193,6 @@ NSString *const VLCDropboxSessionWasAuthorized = @"VLCDropboxSessionWasAuthorize return YES; } -- (void)setupAppearence -{ - UIColor *vlcOrange = [UIColor VLCOrangeTintColor]; - // Change the keyboard for UISearchBar - [[UITextField appearance] setKeyboardAppearance:UIKeyboardAppearanceDark]; - // For the cursor - [[UITextField appearance] setTintColor:vlcOrange]; - // Don't override the 'Cancel' button color in the search bar with the previous UITextField call. Use the default blue color - [[UIBarButtonItem appearanceWhenContainedInInstancesOfClasses:@[[UISearchBar class]]] setTitleTextAttributes:@{[UIColor whiteColor] : NSForegroundColorAttributeName} forState:UIControlStateNormal]; - - [[UINavigationBar appearance] setBarTintColor:vlcOrange]; - [[UINavigationBar appearanceWhenContainedInInstancesOfClasses:@[[VLCPlaybackNavigationController class]]] setBarTintColor: nil]; - [[UINavigationBar appearance] setTintColor:[UIColor whiteColor]]; - [[UINavigationBar appearance] setTitleTextAttributes: @{ NSForegroundColorAttributeName : [UIColor whiteColor] }]; - // For the edit selection indicators - [[UITableView appearance] setTintColor:vlcOrange]; - [[UISwitch appearance] setOnTintColor:vlcOrange]; - [[UISearchBar appearance] setBarTintColor:vlcOrange]; - [[UISearchBar appearance] setTintColor:[UIColor whiteColor]]; -} - -- (void)dealloc -{ - [[NSNotificationCenter defaultCenter] removeObserver:self]; -} - #pragma mark - Handoff - (BOOL)application:(UIApplication *)application willContinueUserActivityWithType:(NSString *)userActivityType @@ -248,16 +213,7 @@ continueUserActivity:(NSUserActivity *)userActivity NSDictionary *dict = userActivity.userInfo; if([userActivityType isEqualToString:kVLCUserActivityLibraryMode] || [userActivityType isEqualToString:kVLCUserActivityLibrarySelection]) { - - VLCLibraryMode libraryMode = (VLCLibraryMode)[(NSNumber *)dict[@"state"] integerValue]; - - if (libraryMode <= VLCLibraryModeAllSeries) { - [[VLCSidebarController sharedInstance] selectRowAtIndexPath:[NSIndexPath indexPathForRow:libraryMode inSection:0] - scrollPosition:UITableViewScrollPositionTop]; - [self.libraryViewController setLibraryMode:libraryMode]; - } - - [self.libraryViewController restoreUserActivityState:userActivity]; + //TODO: Add restoreUserActivityState to the mediaviewcontroller _isComingFromHandoff = YES; return YES; } else { @@ -308,96 +264,112 @@ didFailToContinueUserActivityWithType:(NSString *)userActivityType return YES; } - if (_libraryViewController && url != nil) { - APLog(@"requested %@ to be opened", url); - - if (url.isFileURL) { - NSArray *searchPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); - NSString *directoryPath = searchPaths.firstObject; - NSURL *destinationURL = [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@/%@", directoryPath, url.lastPathComponent]]; - NSError *theError; - NSFileManager *manager = [NSFileManager defaultManager]; - [[NSFileManager defaultManager] moveItemAtURL:url toURL:destinationURL error:&theError]; - if (theError.code != noErr) - APLog(@"saving the file failed (%li): %@", (long)theError.code, theError.localizedDescription); - - [[VLCMediaFileDiscoverer sharedInstance] updateMediaList]; - - NSURLRelationship relationship; - [manager getRelationship:&relationship ofDirectoryAtURL:[NSURL fileURLWithPath:directoryPath] toItemAtURL:url error:&theError]; - if (relationship == NSURLRelationshipContains) { - [self playWithURL:url successCallback:nil errorCallback:nil]; - } - } else if ([url.scheme isEqualToString:@"vlc-x-callback"] || [url.host isEqualToString:@"x-callback-url"]) { - // URL confirmes to the x-callback-url specification - // vlc-x-callback://x-callback-url/action?param=value&x-success=callback - APLog(@"x-callback-url with host '%@' path '%@' parameters '%@'", url.host, url.path, url.query); - NSString *action = [url.path stringByReplacingOccurrencesOfString:@"/" withString:@""]; - NSURL *movieURL; - NSURL *successCallback; - NSURL *errorCallback; - NSString *fileName; - for (NSString *entry in [url.query componentsSeparatedByString:@"&"]) { - NSArray *keyvalue = [entry componentsSeparatedByString:@"="]; - if (keyvalue.count < 2) continue; - NSString *key = keyvalue[0]; - NSString *value = [keyvalue[1] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; - - if ([key isEqualToString:@"url"]) - movieURL = [NSURL URLWithString:value]; - else if ([key isEqualToString:@"filename"]) - fileName = value; - else if ([key isEqualToString:@"x-success"]) - successCallback = [NSURL URLWithString:value]; - else if ([key isEqualToString:@"x-error"]) - errorCallback = [NSURL URLWithString:value]; - } - if ([action isEqualToString:@"stream"] && movieURL) { - [self playWithURL:movieURL successCallback:successCallback errorCallback:errorCallback]; - } - else if ([action isEqualToString:@"download"] && movieURL) { - [self downloadMovieFromURL:movieURL fileNameOfMedia:fileName]; - } - } else { - NSString *receivedUrl = [url absoluteString]; - if ([receivedUrl length] > 6) { - NSString *verifyVlcUrl = [receivedUrl substringToIndex:6]; - if ([verifyVlcUrl isEqualToString:@"vlc://"]) { - NSString *parsedString = [receivedUrl substringFromIndex:6]; - NSUInteger location = [parsedString rangeOfString:@"//"].location; - - /* Safari & al mangle vlc://http:// so fix this */ - if (location != NSNotFound && [parsedString characterAtIndex:location - 1] != 0x3a) { // : - parsedString = [NSString stringWithFormat:@"%@://%@", [parsedString substringToIndex:location], [parsedString substringFromIndex:location+2]]; - } else { - parsedString = [receivedUrl substringFromIndex:6]; - if (![parsedString hasPrefix:@"http://"] && ![parsedString hasPrefix:@"https://"] && ![parsedString hasPrefix:@"ftp://"]) { - parsedString = [@"http://" stringByAppendingString:[receivedUrl substringFromIndex:6]]; - } - } - url = [NSURL URLWithString:parsedString]; - } - } - [[VLCSidebarController sharedInstance] selectRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] - scrollPosition:UITableViewScrollPositionNone]; - - NSString *scheme = url.scheme; - if ([scheme isEqualToString:@"http"] || [scheme isEqualToString:@"https"] || [scheme isEqualToString:@"ftp"]) { - VLCAlertView *alert = [[VLCAlertView alloc] initWithTitle:NSLocalizedString(@"OPEN_STREAM_OR_DOWNLOAD", nil) message:url.absoluteString cancelButtonTitle:NSLocalizedString(@"BUTTON_DOWNLOAD", nil) otherButtonTitles:@[NSLocalizedString(@"PLAY_BUTTON", nil)]]; - alert.completion = ^(BOOL cancelled, NSInteger buttonIndex) { - if (cancelled) - [self downloadMovieFromURL:url fileNameOfMedia:nil]; - else { - [self playWithURL:url successCallback:nil errorCallback:nil]; - } - }; - [alert show]; - } else { - [self playWithURL:url successCallback:nil errorCallback:nil]; - } - } - return YES; - } + //TODO: we need a model of URLHandlers that registers with the VLCAppdelegate + // then we can go through the list of handlers ask if they can handle the url and the first to say yes handles the call. + // that way internal if elses get encapsulated + /* + protocol VLCURLHandler { + func canHandleOpen(url: URL, options:[UIApplicationOpenURLOptionsKey:AnyObject]=[:]()) -> bool + func performOpen(url: URL, options:[UIApplicationOpenURLOptionsKey:AnyObject]=[:]()) -> bool + } */ +// if (_libraryViewController && url != nil) { +// APLog(@"%@ requested %@ to be opened", sourceApplication, url); +// +// if (url.isFileURL) { +// NSArray *searchPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); +// NSString *directoryPath = searchPaths[0]; +// NSURL *destinationURL = [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@/%@", directoryPath, url.lastPathComponent]]; +// NSError *theError; +// [[NSFileManager defaultManager] moveItemAtURL:url toURL:destinationURL error:&theError]; +// if (theError.code != noErr) +// APLog(@"saving the file failed (%li): %@", (long)theError.code, theError.localizedDescription); +// +// [[VLCMediaFileDiscoverer sharedInstance] updateMediaList]; +// } else if ([url.scheme isEqualToString:@"vlc-x-callback"] || [url.host isEqualToString:@"x-callback-url"]) { +// // URL confirmes to the x-callback-url specification +// // vlc-x-callback://x-callback-url/action?param=value&x-success=callback +// APLog(@"x-callback-url with host '%@' path '%@' parameters '%@'", url.host, url.path, url.query); +// NSString *action = [url.path stringByReplacingOccurrencesOfString:@"/" withString:@""]; +// NSURL *movieURL; +// NSURL *successCallback; +// NSURL *errorCallback; +// NSString *fileName; +// for (NSString *entry in [url.query componentsSeparatedByString:@"&"]) { +// NSArray *keyvalue = [entry componentsSeparatedByString:@"="]; +// if (keyvalue.count < 2) continue; +// NSString *key = keyvalue[0]; +// NSString *value = [keyvalue[1] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; +// +// if ([key isEqualToString:@"url"]) +// movieURL = [NSURL URLWithString:value]; +// else if ([key isEqualToString:@"filename"]) +// fileName = value; +// else if ([key isEqualToString:@"x-success"]) +// successCallback = [NSURL URLWithString:value]; +// else if ([key isEqualToString:@"x-error"]) +// errorCallback = [NSURL URLWithString:value]; +// } +// if ([action isEqualToString:@"stream"] && movieURL) { +// VLCPlaybackController *vpc = [VLCPlaybackController sharedInstance]; +// vpc.fullscreenSessionRequested = YES; +// +// VLCMediaList *medialist = [[VLCMediaList alloc] init]; +// [medialist addMedia:[VLCMedia mediaWithURL:movieURL]]; +// vpc.successCallback = successCallback; +// vpc.errorCallback = errorCallback; +// [vpc playMediaList:medialist firstIndex:0 subtitlesFilePath:nil]; +// +// } +// else if ([action isEqualToString:@"download"] && movieURL) { +// [self downloadMovieFromURL:movieURL fileNameOfMedia:fileName]; +// } +// } else { +// NSString *receivedUrl = [url absoluteString]; +// if ([receivedUrl length] > 6) { +// NSString *verifyVlcUrl = [receivedUrl substringToIndex:6]; +// if ([verifyVlcUrl isEqualToString:@"vlc://"]) { +// NSString *parsedString = [receivedUrl substringFromIndex:6]; +// NSUInteger location = [parsedString rangeOfString:@"//"].location; +// +// /* Safari & al mangle vlc://http:// so fix this */ +// if (location != NSNotFound && [parsedString characterAtIndex:location - 1] != 0x3a) { // : +// parsedString = [NSString stringWithFormat:@"%@://%@", [parsedString substringToIndex:location], [parsedString substringFromIndex:location+2]]; +// } else { +// parsedString = [receivedUrl substringFromIndex:6]; +// if (![parsedString hasPrefix:@"http://"] && ![parsedString hasPrefix:@"https://"] && ![parsedString hasPrefix:@"ftp://"]) { +// parsedString = [@"http://" stringByAppendingString:[receivedUrl substringFromIndex:6]]; +// } +// } +// url = [NSURL URLWithString:parsedString]; +// } +// } +// [[VLCSidebarController sharedInstance] selectRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] +// scrollPosition:UITableViewScrollPositionNone]; +// +// NSString *scheme = url.scheme; +// if ([scheme isEqualToString:@"http"] || [scheme isEqualToString:@"https"] || [scheme isEqualToString:@"ftp"]) { +// VLCAlertView *alert = [[VLCAlertView alloc] initWithTitle:NSLocalizedString(@"OPEN_STREAM_OR_DOWNLOAD", nil) message:url.absoluteString cancelButtonTitle:NSLocalizedString(@"BUTTON_DOWNLOAD", nil) otherButtonTitles:@[NSLocalizedString(@"PLAY_BUTTON", nil)]]; +// alert.completion = ^(BOOL cancelled, NSInteger buttonIndex) { +// if (cancelled) +// [self downloadMovieFromURL:url fileNameOfMedia:nil]; +// else { +// VLCMedia *media = [VLCMedia mediaWithURL:url]; +// VLCMediaList *medialist = [[VLCMediaList alloc] init]; +// [medialist addMedia:media]; +// [[VLCPlaybackController sharedInstance] playMediaList:medialist firstIndex:0 subtitlesFilePath:nil]; +// } +// }; +// [alert show]; +// } else { +// VLCPlaybackController *vpc = [VLCPlaybackController sharedInstance]; +// vpc.fullscreenSessionRequested = YES; +// VLCMediaList *medialist = [[VLCMediaList alloc] init]; +// [medialist addMedia:[VLCMedia mediaWithURL:url]]; +// [vpc playMediaList:medialist firstIndex:0 subtitlesFilePath:nil]; +// } +// } +// return YES; +// } return NO; } @@ -415,11 +387,10 @@ didFailToContinueUserActivityWithType:(NSString *)userActivityType return; } } - __weak typeof(self) weakself = self; [self validatePasscodeIfNeededWithCompletion:^{ - [weakself.libraryViewController updateViewContents]; + //TODO: handle updating the videoview and if ([VLCPlaybackController sharedInstance].isPlaying){ - [[VLCPlayerDisplayController sharedInstance] pushPlaybackView]; + //TODO: push playback } }]; [[MLMediaLibrary sharedMediaLibrary] applicationWillExit]; @@ -429,7 +400,8 @@ didFailToContinueUserActivityWithType:(NSString *)userActivityType { if (!_isRunningMigration && !_isComingFromHandoff) { [[MLMediaLibrary sharedMediaLibrary] updateMediaDatabase]; - [[VLCMediaFileDiscoverer sharedInstance] updateMediaList]; + // [[VLCMediaFileDiscoverer sharedInstance] updateMediaList]; + [[VLCPlaybackController sharedInstance] recoverDisplayedMetadata]; } else if(_isComingFromHandoff) { _isComingFromHandoff = NO; } @@ -454,20 +426,20 @@ didFailToContinueUserActivityWithType:(NSString *)userActivityType // TODO Should we update media db after adding new files? [sharedLibrary updateMediaDatabase]; - [_libraryViewController updateViewContents]; + // TODO: update the VideoViewController } } - (void)mediaFileDeleted:(NSString *)name { [[MLMediaLibrary sharedMediaLibrary] updateMediaDatabase]; - [_libraryViewController updateViewContents]; + // TODO: update the VideoViewController } - (void)mediaFilesFoundRequiringAdditionToStorageBackend:(NSArray<NSString *> *)foundFiles { [[MLMediaLibrary sharedMediaLibrary] addFilePaths:foundFiles]; - [[(VLCAppDelegate *)[UIApplication sharedApplication].delegate libraryViewController] updateViewContents]; + // TODO: update the VideoViewController } #pragma mark - pass code validation @@ -482,7 +454,7 @@ didFailToContinueUserActivityWithType:(NSString *)userActivityType - (void)validatePasscodeIfNeededWithCompletion:(void(^)(void))completion { if ([VLCKeychainCoordinator passcodeLockEnabled]) { - [[VLCPlayerDisplayController sharedInstance] dismissPlaybackView]; + //TODO: Dimiss playback [self.keychainCoordinator validatePasscodeWithCompletion:completion]; } else { completion(); diff --git a/Sources/VLCBoxController.m b/Sources/VLCBoxController.m index c06e95eb5e0b14a70a3e7ed4dc82aeb00067eeb8..e633c0757b46b31460db701ee98b36519934f068 100644 --- a/Sources/VLCBoxController.m +++ b/Sources/VLCBoxController.m @@ -53,11 +53,6 @@ return sharedInstance; } -- (void)dealloc -{ - [[NSNotificationCenter defaultCenter] removeObserver:self]; -} - - (void)startSession { NSNotificationCenter *defaultCenter = [NSNotificationCenter defaultCenter]; diff --git a/Sources/VLCBoxTableViewController.m b/Sources/VLCBoxTableViewController.m index 48a146569c28c366b297886367533ae30c531c23..c0aa2d21e5c49e3302f4e4a0e21b106b2b3530f0 100644 --- a/Sources/VLCBoxTableViewController.m +++ b/Sources/VLCBoxTableViewController.m @@ -41,11 +41,6 @@ return self; } -- (void)dealloc -{ - [[NSNotificationCenter defaultCenter] removeObserver:self]; -} - - (void)viewDidLoad { [super viewDidLoad]; diff --git a/Sources/VLCCloudServicesTableViewController.m b/Sources/VLCCloudServicesTableViewController.m index e8680c8ae2222b822aa0f2ea85a34240cf901d6d..99d664cd491f5bfc41091575c80765f259a151f2 100644 --- a/Sources/VLCCloudServicesTableViewController.m +++ b/Sources/VLCCloudServicesTableViewController.m @@ -22,6 +22,7 @@ #import "VLCCloudServiceCell.h" #import "VLCGoogleDriveController.h" +#import "VLC_iOS-Swift.h" @interface VLCCloudServicesTableViewController () @@ -38,12 +39,9 @@ - (void)viewDidLoad { [super viewDidLoad]; - self.title = NSLocalizedString(@"CLOUD_SERVICES", ""); - [self.tableView registerNib:[UINib nibWithNibName:@"VLCCloudServiceCell" bundle:nil] forCellReuseIdentifier:@"CloudServiceCell"]; - self.navigationItem.leftBarButtonItem = [UIBarButtonItem themedRevealMenuButtonWithTarget:self andSelector:@selector(goBack)]; - self.tableView.separatorColor = [UIColor VLCDarkBackgroundColor]; - self.tableView.backgroundColor = [UIColor VLCDarkBackgroundColor]; + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(themeDidChange) name:kVLCThemeDidChangeNotification object:nil]; + [self themeDidChange]; self.dropboxTableViewController = [[VLCDropboxTableViewController alloc] initWithNibName:@"VLCCloudStorageTableViewController" bundle:nil]; self.googleDriveTableViewController = [[VLCGoogleDriveTableViewController alloc] initWithNibName:@"VLCCloudStorageTableViewController" bundle:nil]; @@ -53,6 +51,12 @@ self.documentPickerController = [VLCDocumentPickerController new]; } +- (void)themeDidChange +{ + self.tableView.separatorColor = PresentationTheme.current.colors.background; + self.tableView.backgroundColor = PresentationTheme.current.colors.background; +} + - (void)viewWillAppear:(BOOL)animated { [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(authenticationSessionsChanged:) name:VLCOneDriveControllerSessionUpdated object:nil]; @@ -60,12 +64,6 @@ [super viewWillAppear:animated]; } -- (void)goBack -{ - [[NSNotificationCenter defaultCenter] removeObserver:self]; - [[VLCSidebarController sharedInstance] toggleSidebar]; -} - - (void)authenticationSessionsChanged:(NSNotification *)notification { [self.tableView reloadData]; @@ -80,24 +78,17 @@ - (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { - cell.backgroundColor = (indexPath.row % 2 == 0)? [UIColor blackColor]: [UIColor VLCDarkBackgroundColor]; - - if ([cell respondsToSelector:@selector(setSeparatorInset:)]) { - [cell setSeparatorInset:UIEdgeInsetsZero]; - } - - if ([cell respondsToSelector:@selector(setPreservesSuperviewLayoutMargins:)]) { - [cell setPreservesSuperviewLayoutMargins:NO]; - } - - if ([cell respondsToSelector:@selector(setLayoutMargins:)]) { - [cell setLayoutMargins:UIEdgeInsetsZero]; - } + cell.backgroundColor = (indexPath.row % 2 == 0)? PresentationTheme.current.colors.cellBackgroundA: PresentationTheme.current.colors.cellBackgroundB; + [cell setSeparatorInset:UIEdgeInsetsZero]; + [cell setPreservesSuperviewLayoutMargins:NO]; + [cell setLayoutMargins:UIEdgeInsetsZero]; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { VLCCloudServiceCell *cell = [tableView dequeueReusableCellWithIdentifier:@"CloudServiceCell" forIndexPath:indexPath]; + cell.cloudTitle.textColor = cell.cloudInformation.textColor = cell.lonesomeCloudTitle.textColor = PresentationTheme.current.colors.cellTextColor; + cell.icon.tintColor = PresentationTheme.current.colors.cellTextColor; switch (indexPath.row) { case 0: { //Dropbox diff --git a/Sources/VLCCloudStorageTableViewController.m b/Sources/VLCCloudStorageTableViewController.m index 6d098073773f6c34c5efbcac48ab7c55c1c769d4..7f7c68737db145b2d467210c8d05c27e84dfefbb 100644 --- a/Sources/VLCCloudStorageTableViewController.m +++ b/Sources/VLCCloudStorageTableViewController.m @@ -15,12 +15,12 @@ #import "VLCCloudStorageTableViewController.h" #import "VLCCloudStorageTableViewCell.h" #import "VLCProgressView.h" +#import "VLC_iOS-Swift.h" @interface VLCCloudStorageTableViewController() { VLCProgressView *_progressView; UIRefreshControl *_refreshControl; - UIBarButtonItem *_progressBarButtonItem; UIBarButtonItem *_logoutButton; } @@ -37,7 +37,7 @@ self.modalPresentationStyle = UIModalPresentationFormSheet; - UIBarButtonItem *backButton = [UIBarButtonItem themedBackButtonWithTarget:self andSelector:@selector(goBack)]; + UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:NSLocalizedString(@"BUTTON_BACK", nil) style:UIBarButtonItemStylePlain target:self action:@selector(goBack)]; self.navigationItem.leftBarButtonItem = backButton; _logoutButton = [[UIBarButtonItem alloc] initWithTitle:NSLocalizedString(@"BUTTON_LOGOUT", "") style:UIBarButtonItemStylePlain target:self action:@selector(logout)]; @@ -46,12 +46,9 @@ [self.navigationController.toolbar setBackgroundImage:[UIImage imageNamed:@"sudHeaderBg"] forToolbarPosition:UIToolbarPositionAny barMetrics:UIBarMetricsDefault]; - self.tableView.separatorColor = [UIColor VLCDarkBackgroundColor]; - self.tableView.backgroundColor = [UIColor VLCDarkBackgroundColor]; - self.view.backgroundColor = [UIColor VLCDarkBackgroundColor]; + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateForTheme) name:kVLCThemeDidChangeNotification object:nil]; _refreshControl = [[UIRefreshControl alloc] init]; - _refreshControl.backgroundColor = [UIColor VLCDarkBackgroundColor]; _refreshControl.tintColor = [UIColor whiteColor]; [_refreshControl addTarget:self action:@selector(handleRefresh) forControlEvents:UIControlEventValueChanged]; [self.tableView addSubview:_refreshControl]; @@ -62,6 +59,7 @@ _numberOfFilesBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:[NSString stringWithFormat:NSLocalizedString(@"NUM_OF_FILES", nil), 0] style:UIBarButtonItemStylePlain target:nil action:nil]; [_numberOfFilesBarButtonItem setTitleTextAttributes:@{ NSFontAttributeName : [UIFont systemFontOfSize:11.] } forState:UIControlStateNormal]; + _numberOfFilesBarButtonItem.tintColor = PresentationTheme.current.colors.orangeUI; _activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge]; _activityIndicator.hidesWhenStopped = YES; @@ -74,8 +72,20 @@ _progressView = [VLCProgressView new]; _progressBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:_progressView]; + _progressView.tintColor = PresentationTheme.current.colors.orangeUI; [self _showProgressInToolbar:NO]; + [self updateForTheme]; +} + +- (void)updateForTheme +{ + self.tableView.separatorColor = PresentationTheme.current.colors.background; + self.tableView.backgroundColor = PresentationTheme.current.colors.background; + self.view.backgroundColor = PresentationTheme.current.colors.background; + _refreshControl.backgroundColor = PresentationTheme.current.colors.background; + _activityIndicator.activityIndicatorViewStyle = PresentationTheme.current == PresentationTheme.brightTheme ? UIActivityIndicatorViewStyleGray : UIActivityIndicatorViewStyleWhiteLarge; + self.loginToCloudStorageView.backgroundColor = PresentationTheme.current.colors.background; } - (void)viewWillAppear:(BOOL)animated @@ -166,9 +176,13 @@ #pragma mark - UITableViewDelegate -- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath +- (void)tableView:(UITableView *)tableView willDisplayCell:(__kindof UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { - cell.backgroundColor = (indexPath.row % 2 == 0)? [UIColor blackColor]: [UIColor VLCDarkBackgroundColor]; + VLCCloudStorageTableViewCell *cloudcell = [cell isKindOfClass:VLCCloudStorageTableViewCell.class] ? (id)cell : nil; + cloudcell.backgroundColor = (indexPath.row % 2 == 0)? PresentationTheme.current.colors.cellBackgroundB : PresentationTheme.current.colors.cellBackgroundA; + cloudcell.titleLabel.textColor = PresentationTheme.current.colors.cellTextColor; + cloudcell.folderTitleLabel.textColor = PresentationTheme.current.colors.cellTextColor; + cloudcell.subtitleLabel.textColor = PresentationTheme.current.colors.cellDetailTextColor; } - (void)goBack diff --git a/Sources/VLCConstants.h b/Sources/VLCConstants.h index 5c71a9dba929a812a3117d20c74694b18437b7be..3d1c66242bce6fe3f1068d2e09be731ac28cf297 100644 --- a/Sources/VLCConstants.h +++ b/Sources/VLCConstants.h @@ -16,6 +16,8 @@ #define kVLCSettingPasscodeOnKey @"PasscodeProtection" #define kVLCSettingPasscodeAllowTouchID @"AllowTouchID" #define kVLCSettingPasscodeAllowFaceID @"AllowFaceID" +#define kVLCThemeDidChangeNotification @"themeDidChangeNotfication" +#define kVLCSettingAppTheme @"darkMode" #define kVLCAutomaticallyPlayNextItem @"AutomaticallyPlayNextItem" #define kVLCSettingContinueAudioInBackgroundKey @"BackgroundAudioPlayback" #define kVLCSettingStretchAudio @"audio-time-stretch" diff --git a/Sources/VLCDownloadViewController.m b/Sources/VLCDownloadViewController.m index 6a2dacbd6f7ded840b446be4ff998bc87f5a4fce..ff212a91b3eeb4dd7c1027ff59164295219a3c0b 100644 --- a/Sources/VLCDownloadViewController.m +++ b/Sources/VLCDownloadViewController.m @@ -18,6 +18,7 @@ #import "WhiteRaccoon.h" #import "NSString+SupportedMedia.h" #import "VLCHTTPFileDownloader.h" +#import "VLC_iOS-Swift.h" typedef NS_ENUM(NSUInteger, VLCDownloadScheme) { VLCDownloadSchemeNone, @@ -63,6 +64,7 @@ typedef NS_ENUM(NSUInteger, VLCDownloadScheme) { if (self){ _currentDownloads = [[NSMutableArray alloc] init]; _currentDownloadFilename = [[NSMutableArray alloc] init]; + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateForTheme) name:kVLCThemeDidChangeNotification object:nil]; } return self; } @@ -71,20 +73,16 @@ typedef NS_ENUM(NSUInteger, VLCDownloadScheme) { { [super viewDidLoad]; - NSAttributedString *coloredAttributedPlaceholder = [[NSAttributedString alloc] initWithString:@"http://myserver.com/file.mkv" attributes:@{NSForegroundColorAttributeName: [UIColor VLCLightTextColor]}]; - self.urlField.attributedPlaceholder = coloredAttributedPlaceholder; - [self.downloadButton setTitle:NSLocalizedString(@"BUTTON_DOWNLOAD", nil) forState:UIControlStateNormal]; - self.navigationItem.leftBarButtonItem = [UIBarButtonItem themedRevealMenuButtonWithTarget:self andSelector:@selector(goBack:)]; - self.title = NSLocalizedString(@"DOWNLOAD_FROM_HTTP", nil); self.whatToDownloadHelpLabel.text = [NSString stringWithFormat:NSLocalizedString(@"DOWNLOAD_FROM_HTTP_HELP", nil), [[UIDevice currentDevice] model]]; self.urlField.delegate = self; self.urlField.keyboardType = UIKeyboardTypeURL; self.progressContainer.hidden = YES; - self.downloadsTable.backgroundColor = [UIColor VLCDarkBackgroundColor]; self.downloadsTable.hidden = YES; + self.whatToDownloadHelpLabel.backgroundColor = [UIColor clearColor]; self.edgesForExtendedLayout = UIRectEdgeNone; + [self updateForTheme]; } - (void)viewWillAppear:(BOOL)animated @@ -100,6 +98,30 @@ typedef NS_ENUM(NSUInteger, VLCDownloadScheme) { [super viewWillAppear:animated]; } +- (void)updateForTheme +{ + NSAttributedString *coloredAttributedPlaceholder = [[NSAttributedString alloc] initWithString:@"http://myserver.com/file.mkv" attributes:@{NSForegroundColorAttributeName: PresentationTheme.current.colors.lightTextColor}]; + self.urlField.attributedPlaceholder = coloredAttributedPlaceholder; + self.urlField.backgroundColor = PresentationTheme.current.colors.cellBackgroundB; + self.urlField.textColor = PresentationTheme.current.colors.cellTextColor; + self.downloadsTable.backgroundColor = PresentationTheme.current.colors.background; + self.view.backgroundColor = PresentationTheme.current.colors.background; + self.downloadButton.backgroundColor = PresentationTheme.current.colors.orangeUI; + self.whatToDownloadHelpLabel.textColor = PresentationTheme.current.colors.lightTextColor; + self.progressContainer.backgroundColor = PresentationTheme.current.colors.cellBackgroundB; + self.currentDownloadLabel.textColor = PresentationTheme.current.colors.cellBackgroundB; + self.progressPercent.textColor = PresentationTheme.current.colors.cellBackgroundB; + self.speedRate.textColor = PresentationTheme.current.colors.cellBackgroundB; + self.timeDL.textColor = PresentationTheme.current.colors.cellTextColor; + [self.downloadsTable reloadData]; +} + +- (void)viewWillDisappear:(BOOL)animated +{ + [super viewWillDisappear:animated]; + [self.view endEditing:YES]; +} + #pragma mark - UI interaction - (BOOL)shouldAutorotate @@ -110,12 +132,6 @@ typedef NS_ENUM(NSUInteger, VLCDownloadScheme) { return YES; } -- (IBAction)goBack:(id)sender -{ - [self.view endEditing:YES]; - [[VLCSidebarController sharedInstance] toggleSidebar]; -} - - (IBAction)downloadAction:(id)sender { if ([self.urlField.text length] > 0) { @@ -396,8 +412,8 @@ typedef NS_ENUM(NSUInteger, VLCDownloadScheme) { UITableViewCell *cell = (UITableViewCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (cell == nil) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier]; - cell.textLabel.textColor = [UIColor whiteColor]; - cell.detailTextLabel.textColor = [UIColor VLCLightTextColor]; + cell.textLabel.textColor = PresentationTheme.current.colors.cellTextColor; + cell.detailTextLabel.textColor = PresentationTheme.current.colors.cellDetailTextColor; } NSInteger row = indexPath.row; @@ -415,7 +431,7 @@ typedef NS_ENUM(NSUInteger, VLCDownloadScheme) { - (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { - cell.backgroundColor = (indexPath.row % 2 == 0)? [UIColor blackColor]: [UIColor VLCDarkBackgroundColor]; + cell.backgroundColor = (indexPath.row % 2 == 0)? PresentationTheme.current.colors.cellBackgroundA : PresentationTheme.current.colors.cellBackgroundB; } - (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath diff --git a/SharedSources/VLCDragAndDropManager.swift b/Sources/VLCDragAndDropManager.swift similarity index 98% rename from SharedSources/VLCDragAndDropManager.swift rename to Sources/VLCDragAndDropManager.swift index b297a17d707fbb0a84b382316902e43a149314a4..6b29252a714d93314a0e193c5f8e6ccc77d110ca 100644 --- a/SharedSources/VLCDragAndDropManager.swift +++ b/Sources/VLCDragAndDropManager.swift @@ -95,7 +95,7 @@ class VLCDragAndDropManager: NSObject, UICollectionViewDragDelegate, UITableView continue } //Element dragging from another App - let placeholder = UITableViewDropPlaceholder(insertionIndexPath: destinationPath, reuseIdentifier: "PlaylistCell", rowHeight: VLCPlaylistTableViewCell.heightOfCell()) + let placeholder = UITableViewDropPlaceholder(insertionIndexPath: destinationPath, reuseIdentifier: VLCPlaylistTableViewCell.cellIdentifier(), rowHeight: VLCPlaylistTableViewCell.heightOfCell()) let placeholderContext = coordinator.drop(item.dragItem, to: placeholder) createFileWith(itemProvider:itemProvider) { [weak self] file, error in @@ -187,7 +187,7 @@ class VLCDragAndDropManager: NSObject, UICollectionViewDragDelegate, UITableView continue } //Element from another App - let placeholder = UICollectionViewDropPlaceholder(insertionIndexPath: destinationPath, reuseIdentifier: "PlaylistCell") + let placeholder = UICollectionViewDropPlaceholder(insertionIndexPath: destinationPath, reuseIdentifier: VLCPlaylistCollectionViewCell.cellIdentifier()) let placeholderContext = coordinator.drop(item.dragItem, to: placeholder) createFileWith(itemProvider:item.dragItem.itemProvider) { [weak self] file, error in diff --git a/Sources/VLCDropboxTableViewController.m b/Sources/VLCDropboxTableViewController.m index dd69630a35b7c4303ce98adae59d98e15710321b..8a0bf7961eaba38727805a006ac2495af891dea3 100644 --- a/Sources/VLCDropboxTableViewController.m +++ b/Sources/VLCDropboxTableViewController.m @@ -40,11 +40,6 @@ return self; } -- (void)dealloc -{ - [[NSNotificationCenter defaultCenter] removeObserver:self]; -} - - (void)viewDidLoad { [super viewDidLoad]; diff --git a/Sources/VLCHTTPUploaderController.m b/Sources/VLCHTTPUploaderController.m index 79644ecc6ff195395b8687e21d6b4beacb4f0f35..ffa6ef7c89888d246c3fd7a56d46acee7dae5ea9 100644 --- a/Sources/VLCHTTPUploaderController.m +++ b/Sources/VLCHTTPUploaderController.m @@ -70,11 +70,6 @@ return self; } -- (void)dealloc -{ - [[NSNotificationCenter defaultCenter] removeObserver:self]; -} - - (void)applicationDidBecomeActive: (NSNotification *)notification { if (!_httpServer.isRunning) diff --git a/Sources/VLCLibrarySearchDisplayDataSource.h b/Sources/VLCLibrarySearchDisplayDataSource.h index d872673ec3725c731641a8c9e52635715231119d..9b8e4252f0c1d3de17fa295dc1d5a593cb49ee87 100644 --- a/Sources/VLCLibrarySearchDisplayDataSource.h +++ b/Sources/VLCLibrarySearchDisplayDataSource.h @@ -10,7 +10,7 @@ * Refer to the COPYING file of the official project for license. *****************************************************************************/ -@interface VLCLibrarySearchDisplayDataSource : NSObject<UITableViewDataSource> +@interface VLCLibrarySearchDisplayDataSource : NSObject<UITableViewDataSource, UICollectionViewDataSource> - (NSManagedObject *)objectAtIndex:(NSUInteger)index; - (void)shouldReloadTableForSearchString:(NSString *)searchString searchableFiles:(NSArray *)files; diff --git a/Sources/VLCLibrarySearchDisplayDataSource.m b/Sources/VLCLibrarySearchDisplayDataSource.m index 6f4d6b49c4ef41eb31bc50281cf315c3de430b94..5b6095bfc965765f38723414368b5a8ef16f47fc 100644 --- a/Sources/VLCLibrarySearchDisplayDataSource.m +++ b/Sources/VLCLibrarySearchDisplayDataSource.m @@ -12,6 +12,7 @@ #import "VLCLibrarySearchDisplayDataSource.h" #import "VLCPlaylistTableViewCell.h" +#import "VLCPlaylistCollectionViewCell.h" @interface VLCLibrarySearchDisplayDataSource() <UITableViewDataSource> { @@ -37,7 +38,7 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { - VLCPlaylistTableViewCell *cell = (VLCPlaylistTableViewCell *)[tableView dequeueReusableCellWithIdentifier:kPlaylistCellIdentifier forIndexPath:indexPath]; + VLCPlaylistTableViewCell *cell = (VLCPlaylistTableViewCell *)[tableView dequeueReusableCellWithIdentifier:VLCPlaylistTableViewCell.cellIdentifier forIndexPath:indexPath]; NSInteger row = indexPath.row; @@ -47,6 +48,21 @@ return cell; } +- (nonnull __kindof UICollectionViewCell *)collectionView:(nonnull UICollectionView *)collectionView cellForItemAtIndexPath:(nonnull NSIndexPath *)indexPath { + VLCPlaylistCollectionViewCell *cell = (VLCPlaylistCollectionViewCell *)[collectionView dequeueReusableCellWithReuseIdentifier:VLCPlaylistCollectionViewCell.cellIdentifier forIndexPath:indexPath]; + + NSInteger row = indexPath.row; + + if (row < _searchData.count) + cell.mediaObject = _searchData[row]; + + return cell; +} + +- (NSInteger)collectionView:(nonnull UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section { + return _searchData.count; +} + - (NSManagedObject *)objectAtIndex:(NSUInteger)index { return index < _searchData.count ? _searchData[index] : nil; diff --git a/Sources/VLCLibraryViewController.m b/Sources/VLCLibraryViewController.m index 4eef04de06b7e32935c44be4bbdf32c76bee6bc6..f75a0f3179268482e337279b1a554f75c21620f2 100644 --- a/Sources/VLCLibraryViewController.m +++ b/Sources/VLCLibraryViewController.m @@ -140,7 +140,7 @@ static NSString *kUsingTableViewToShowData = @"UsingTableViewToShowData"; _tableView.tableHeaderView = _searchController.searchBar; } UINib *nib = [UINib nibWithNibName:@"VLCPlaylistTableViewCell" bundle:nil]; - [_tableView registerNib:nib forCellReuseIdentifier:kPlaylistCellIdentifier]; + [_tableView registerNib:nib forCellReuseIdentifier:VLCPlaylistTableViewCell.cellIdentifier]; } _tableView.frame = contentView.bounds; [_tableView reloadData]; @@ -161,7 +161,7 @@ static NSString *kUsingTableViewToShowData = @"UsingTableViewToShowData"; _collectionView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth; _longPressGestureRecognizer = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(_collectionViewHandleLongPressGesture:)]; [_collectionView addGestureRecognizer:_longPressGestureRecognizer]; - [_collectionView registerNib:[UINib nibWithNibName:@"VLCPlaylistCollectionViewCell" bundle:nil] forCellWithReuseIdentifier:@"PlaylistCell"]; + [_collectionView registerNib:[UINib nibWithNibName:@"VLCPlaylistCollectionViewCell" bundle:nil] forCellWithReuseIdentifier:VLCPlaylistCollectionViewCell.cellIdentifier]; } _collectionView.frame = contentView.bounds; [_collectionView reloadData]; @@ -191,7 +191,6 @@ static NSString *kUsingTableViewToShowData = @"UsingTableViewToShowData"; { [super viewDidLoad]; self.title = NSLocalizedString(@"LIBRARY_ALL_FILES", nil); - _menuButton = [UIBarButtonItem themedRevealMenuButtonWithTarget:self andSelector:@selector(leftButtonAction:)]; self.navigationItem.leftBarButtonItem = _menuButton; self.editButtonItem.title = NSLocalizedString(@"BUTTON_EDIT", nil); @@ -486,7 +485,7 @@ static NSString *kUsingTableViewToShowData = @"UsingTableViewToShowData"; _createFolderBarButtonItem.enabled = NO; [_mediaDataSource addAllShows]; } break; - //Todo: I'm not sure if updateViewContents should be called in VLCLibraryModeFolder + //TODO: I'm not sure if updateViewContents should be called in VLCLibraryModeFolder //Here should maybe be an NSAssert to prevent this but for now due to refactoring these calls would've been made in that case case VLCLibraryModeAllFiles: case VLCLibraryModeFolder: @@ -541,9 +540,7 @@ static NSString *kUsingTableViewToShowData = @"UsingTableViewToShowData"; // Customize the appearance of table view cells. - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { - static NSString *CellIdentifier = @"PlaylistCell"; - - VLCPlaylistTableViewCell *cell = (VLCPlaylistTableViewCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier]; + VLCPlaylistTableViewCell *cell = (VLCPlaylistTableViewCell *)[tableView dequeueReusableCellWithIdentifier:VLCPlaylistTableViewCell.cellIdentifier]; UISwipeGestureRecognizer *swipeRight = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeRightOnTableViewCellGestureAction:)]; [swipeRight setDirection:(UISwipeGestureRecognizerDirectionRight)]; @@ -656,7 +653,7 @@ static NSString *kUsingTableViewToShowData = @"UsingTableViewToShowData"; - (UICollectionViewCell*)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { - VLCPlaylistCollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"PlaylistCell" forIndexPath:indexPath]; + VLCPlaylistCollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:VLCPlaylistCollectionViewCell.cellIdentifier forIndexPath:indexPath]; cell.mediaObject = [_mediaDataSource objectAtIndex:indexPath.row]; @@ -1096,8 +1093,6 @@ static NSString *kUsingTableViewToShowData = @"UsingTableViewToShowData"; - (IBAction)leftButtonAction:(id)sender { - [[VLCSidebarController sharedInstance] toggleSidebar]; - if (self.isEditing) [self setEditing:NO animated:YES]; } diff --git a/Sources/VLCMediaDataSource.m b/Sources/VLCMediaDataSource.m index 592800527e7af273c972b5b2824033a6de5dcdb0..db6b533328e0a0dbb90a9321ec4cc2405d4c5ff4 100644 --- a/Sources/VLCMediaDataSource.m +++ b/Sources/VLCMediaDataSource.m @@ -34,9 +34,7 @@ array = [(MLLabel *)selection sortedFolderItems]; } _currentSelection = selection; - @synchronized(_foundMedia) { - _foundMedia = [NSMutableArray arrayWithArray:array]; - } + _foundMedia = [NSMutableArray arrayWithArray:array]; } - (NSManagedObject *)currentSelection @@ -46,76 +44,58 @@ - (NSUInteger)numberOfFiles { - @synchronized (_foundMedia) { - return [_foundMedia count]; - } + return [_foundMedia count]; } - (NSManagedObject *)objectAtIndex:(NSUInteger)index { - @synchronized (_foundMedia) { - if (index < _foundMedia.count) - return _foundMedia[index]; - } + if (index < _foundMedia.count) + return _foundMedia[index]; return nil; } - (NSUInteger)indexOfObject:(NSManagedObject *)object { - @synchronized(_foundMedia) { - return [_foundMedia indexOfObject:object]; - } + return [_foundMedia indexOfObject:object]; } - (void)insertObject:(NSManagedObject *)object atIndex:(NSUInteger)index { - @synchronized(_foundMedia) { - [_foundMedia insertObject:object atIndex:index]; - } + [_foundMedia insertObject:object atIndex:index]; } - (void)removeObjectAtIndex:(NSUInteger)index { - @synchronized(_foundMedia) { - [_foundMedia removeObjectAtIndex:index]; - } + [_foundMedia removeObjectAtIndex:index]; } - (void)moveObjectFromIndex:(NSUInteger)fromIdx toIndex:(NSUInteger)toIdx { - @synchronized(_foundMedia) { - MLFile* object = _foundMedia[fromIdx]; - if (![object isKindOfClass:[MLFile class]]) - return; - [_foundMedia removeObjectAtIndex:fromIdx]; - [_foundMedia insertObject:object atIndex:toIdx]; - object.folderTrackNumber = @(toIdx - 1); - object = [_foundMedia objectAtIndex:fromIdx]; - if (![object isKindOfClass:[MLFile class]]) - return; - object.folderTrackNumber = @(fromIdx - 1); - } + MLFile* object = _foundMedia[fromIdx]; + if (![object isKindOfClass:[MLFile class]]) + return; + [_foundMedia removeObjectAtIndex:fromIdx]; + [_foundMedia insertObject:object atIndex:toIdx]; + object.folderTrackNumber = @(toIdx - 1); + object = [_foundMedia objectAtIndex:fromIdx]; + if (![object isKindOfClass:[MLFile class]]) + return; + object.folderTrackNumber = @(fromIdx - 1); } - (void)removeAllObjects { - @synchronized(_foundMedia) { - _foundMedia = [NSMutableArray new]; - } + _foundMedia = [NSMutableArray new]; } - (NSArray *)allObjects { - @synchronized(_foundMedia) { - return [_foundMedia copy]; - } + return [_foundMedia copy]; } - (void)addObject:(NSManagedObject *)object { - @synchronized (_foundMedia) { - [_foundMedia addObject:object]; - } + [_foundMedia addObject:object]; } - (void)addAlbumsInAllAlbumMode:(BOOL)isAllAlbumMode; @@ -151,10 +131,8 @@ { for (MLFile *file in [MLFile allFiles]) { if (file.labels != nil) { - @synchronized(file.labels) { - if (file.labels.count > 0) - continue; - } + if (file.labels.count > 0) + continue; } if (!file.isShowEpisode && !file.isAlbumTrack) { diff --git a/Sources/VLCMenuTableViewController.m b/Sources/VLCMenuTableViewController.m index e978ef37b4a2111752570232769232b7c82456c7..8672502091b96e676be19f39d3baadc8ea9f3a98 100644 --- a/Sources/VLCMenuTableViewController.m +++ b/Sources/VLCMenuTableViewController.m @@ -19,14 +19,14 @@ #import "VLCSidebarViewCell.h" #import <QuartzCore/QuartzCore.h> #import "VLCWiFiUploadTableViewCell.h" -#import "VLCAppDelegate.h" +#import "VLCDownloadViewController.h" #import "VLCServerListViewController.h" #import "VLCOpenNetworkStreamViewController.h" #import "VLCSettingsController.h" #import "VLCAboutViewController.h" -#import "VLCLibraryViewController.h" #import "VLCBugreporter.h" #import "VLCCloudServicesTableViewController.h" +#import "VLC_iOS-Swift.h" #define ROW_HEIGHT 50. #define IPAD_ROW_HEIGHT 65. @@ -40,7 +40,7 @@ static NSString *CellIdentifier = @"VLCMenuCell"; static NSString *WiFiCellIdentifier = @"VLCMenuWiFiCell"; -@interface VLCMenuTableViewController () <UITableViewDataSource, UITableViewDelegate> +@interface VLCMenuTableViewController () <UITableViewDataSource, UITableViewDelegate, VLCMediaViewControllerDelegate> { NSArray *_sectionHeaderTexts; NSArray *_menuItemsSectionOne; @@ -51,6 +51,7 @@ static NSString *WiFiCellIdentifier = @"VLCMenuWiFiCell"; NSLayoutConstraint *_heightConstraint; NSLayoutConstraint *_leftTableConstraint; VLCSettingsController *_settingsController; + VLCMediaViewController *_videoViewController; } @end @@ -104,7 +105,7 @@ static NSString *WiFiCellIdentifier = @"VLCMenuWiFiCell"; [self.view addConstraint:_leftTableConstraint]; [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|->=0-[_menuTableView(==menuWidth)]" options:0 metrics:metrics views:dict]]; - [_menuTableView selectRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] animated:NO scrollPosition:UITableViewScrollPositionTop]; + [self selectRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] animated:NO scrollPosition:UITableViewScrollPositionTop]; } - (BOOL)shouldAutorotate @@ -231,10 +232,17 @@ static NSString *WiFiCellIdentifier = @"VLCMenuWiFiCell"; return _settingsController; } +- (VLCMediaViewController *)videoViewController +{ + if (!_videoViewController) { + _videoViewController = [[VLCMediaViewController alloc] initWithCollectionViewLayout:[UICollectionViewFlowLayout new]]; + } + return _videoViewController; +} + - (void)_revealItem:(NSUInteger)itemIndex inSection:(NSUInteger)sectionNumber { UIViewController *viewController; - VLCAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate]; if (sectionNumber == 1) { if (itemIndex == 0) viewController = [[VLCServerListViewController alloc] init]; @@ -252,8 +260,7 @@ static NSString *WiFiCellIdentifier = @"VLCMenuWiFiCell"; } else if (itemIndex == 1) viewController = [[VLCAboutViewController alloc] init]; } else { - viewController = appDelegate.libraryViewController; - [(VLCLibraryViewController *)viewController setLibraryMode:(int)itemIndex]; + viewController = self.videoViewController; } if (!viewController) { @@ -291,5 +298,14 @@ static NSString *WiFiCellIdentifier = @"VLCMenuWiFiCell"; if (motion == UIEventSubtypeMotionShake) [[VLCBugreporter sharedInstance] handleBugreportRequest]; } +#pragma mark - VLCMediaViewControllerDelegate +- (void)videoViewControllerDidSelectMediaObjectWithVLCMediaViewController:(VLCMediaViewController *)VLCMediaViewController mediaObject:(NSManagedObject *)mediaObject +{ + +} + +- (void)videoViewControllerDidSelectBackbuttonWithVLCMediaViewController:(VLCMediaViewController *)VLCMediaViewController { + [[VLCSidebarController sharedInstance] toggleSidebar]; +} @end diff --git a/Sources/VLCMiniPlaybackView.m b/Sources/VLCMiniPlaybackView.m index b91d2490c50a802987fe6bd51a800c1a63604cd4..bb2ef36a43782da6cfc8691d79363a488aac0d57 100644 --- a/Sources/VLCMiniPlaybackView.m +++ b/Sources/VLCMiniPlaybackView.m @@ -6,13 +6,12 @@ * $Id$ * * Author: Felix Paul Kühne <fkuehne # videolan.org> + * Carola Nitz <caro # videolan.org> * * Refer to the COPYING file of the official project for license. *****************************************************************************/ #import "VLCMiniPlaybackView.h" -#import "VLCPlaybackController.h" -#import "VLCPlayerDisplayController.h" #import "VLCMetadata.h" #import "VLC_iOS-Swift.h" @@ -38,12 +37,6 @@ self = [super initWithFrame:viewFrame]; if (self) { [self setupSubviews]; - - NSNotificationCenter *center = [NSNotificationCenter defaultCenter]; - [center addObserver:self - selector:@selector(appBecameActive:) - name:UIApplicationDidBecomeActiveNotification - object:nil]; } return self; } @@ -146,14 +139,6 @@ #endif } -- (void)appBecameActive:(NSNotification *)aNotification -{ - VLCPlayerDisplayController *pdc = [VLCPlayerDisplayController sharedInstance]; - if (pdc.displayMode == VLCPlayerDisplayControllerDisplayModeMiniplayer) { - [[VLCPlaybackController sharedInstance] recoverDisplayedMetadata]; - } -} - - (void)tapRecognized { [self pushFullPlaybackView:nil]; @@ -209,6 +194,8 @@ [self updatePlayPauseButton]; controller.delegate = self; [controller recoverDisplayedMetadata]; + _videoView.hidden = false; + controller.videoOutputView = _videoView; } - (void)mediaPlayerStateChanged:(VLCMediaPlayerState)currentState @@ -228,11 +215,6 @@ currentMediaHasTrackToChooseFrom:(BOOL)currentMediaHasTrackToChooseFrom _artworkView.image = metadata.artworkImage?: [UIImage imageNamed:@"no-artwork"]; } else { _artworkView.image = nil; - VLCPlayerDisplayController *pdc = [VLCPlayerDisplayController sharedInstance]; - if (pdc.displayMode == VLCPlayerDisplayControllerDisplayModeMiniplayer) { - _videoView.hidden = false; - controller.videoOutputView = _videoView; - } } NSString *metaDataString; diff --git a/Sources/VLCMovieViewController.h b/Sources/VLCMovieViewController.h index 3928f0d8e352775a4d79e36b34614b957c6710a2..8978d1529d32ab50e5c615d8ac1626536ec04d26 100644 --- a/Sources/VLCMovieViewController.h +++ b/Sources/VLCMovieViewController.h @@ -17,10 +17,10 @@ @class OBSlider; @class VLCStatusLabel; -@class VLCHorizontalSwipeGestureRecognizer; @class VLCVerticalSwipeGestureRecognizer; @class VLCTimeNavigationTitleView; @class VLCMovieViewControlPanelView; +@class VLCMovieViewController; typedef NS_ENUM(NSInteger, VLCMovieJumpState) { VLCMovieJumpStateDefault, @@ -28,6 +28,11 @@ typedef NS_ENUM(NSInteger, VLCMovieJumpState) { VLCMovieJumpStateBackward }; +@protocol VLCMovieViewControllerDelegate +- (void)movieViewControllerDidSelectMinimize:(VLCMovieViewController *)movieViewController; +- (BOOL)movieViewControllerShouldBeDisplayed:(VLCMovieViewController *)movieViewController; +@end + @interface VLCMovieViewController : UIViewController <UIActionSheetDelegate, VLCPlaybackControllerDelegate> @property (nonatomic, strong) IBOutlet UIView *movieView; @@ -73,6 +78,8 @@ typedef NS_ENUM(NSInteger, VLCMovieJumpState) { @property (nonatomic, strong) IBOutlet UIImageView *artworkImageView; @property (nonatomic, strong) IBOutlet NSLayoutConstraint *widthConstraint; +@property (nonatomic, weak) id<VLCMovieViewControllerDelegate> delegate; + - (IBAction)closePlayback:(id)sender; - (IBAction)minimizePlayback:(id)sender; diff --git a/Sources/VLCMovieViewController.m b/Sources/VLCMovieViewController.m index 1cc75ab564937c9b75790bf8fa211f9c52523e77..7626ac65b48a2b4ece4bc218b6f133f1d8cf3473 100644 --- a/Sources/VLCMovieViewController.m +++ b/Sources/VLCMovieViewController.m @@ -27,12 +27,11 @@ #import "VLCPlaybackController.h" #import "UIDevice+VLC.h" #import "VLCTimeNavigationTitleView.h" -#import "VLCPlayerDisplayController.h" #import "VLCAppDelegate.h" #import "VLCStatusLabel.h" #import "VLCMovieViewControlPanelView.h" #import "VLCSlider.h" -#import "VLCLibraryViewController.h" + #import "VLCTrackSelectorView.h" #import "VLCMetadata.h" #import "UIDevice+VLC.h" @@ -129,11 +128,6 @@ typedef NS_ENUM(NSInteger, VLCPanType) { [defaults registerDefaults:appDefaults]; } -- (void)dealloc -{ - [[NSNotificationCenter defaultCenter] removeObserver:self]; -} - - (void)viewDidLoad { [super viewDidLoad]; @@ -857,7 +851,7 @@ typedef NS_ENUM(NSInteger, VLCPanType) { - (IBAction)minimizePlayback:(id)sender { - [[UIApplication sharedApplication] sendAction:@selector(closeFullscreenPlayback) to:nil from:self forEvent:nil]; + [_delegate movieViewControllerDidSelectMinimize:self]; } - (IBAction)positionSliderAction:(UISlider *)sender @@ -1521,8 +1515,7 @@ currentMediaHasTrackToChooseFrom:(BOOL)currentMediaHasTrackToChooseFrom - (void)appBecameActive:(NSNotification *)aNotification { - VLCPlayerDisplayController *pdc = [VLCPlayerDisplayController sharedInstance]; - if (pdc.displayMode == VLCPlayerDisplayControllerDisplayModeFullscreen) { + if ([_delegate movieViewControllerShouldBeDisplayed:self]) { [_vpc recoverDisplayedMetadata]; if (_vpc.videoOutputView != self.movieView) { _vpc.videoOutputView = self.movieView; diff --git a/Sources/VLCOpenNetworkStreamViewController.m b/Sources/VLCOpenNetworkStreamViewController.m index 6808a2ed20b90e5feb6f755354ae4e5b20b3168a..86b9ce3f4aeddb8733711625430544f6e502fb62 100644 --- a/Sources/VLCOpenNetworkStreamViewController.m +++ b/Sources/VLCOpenNetworkStreamViewController.m @@ -18,6 +18,7 @@ #import "VLCMenuTableViewController.h" #import "VLCStreamingHistoryCell.h" #import "UIDevice+VLC.h" +#import "VLC_iOS-Swift.h" @interface VLCOpenNetworkStreamViewController () <UITableViewDataSource, UITableViewDelegate, UITextFieldDelegate, VLCStreamingHistoryCellMenuItemProtocol> { @@ -50,11 +51,6 @@ [self.historyTableView reloadData]; } -- (void)dealloc -{ - [[NSNotificationCenter defaultCenter] removeObserver:self]; -} - - (void)viewDidLoad { [super viewDidLoad]; @@ -65,6 +61,10 @@ name:NSUbiquitousKeyValueStoreDidChangeExternallyNotification object:[NSUbiquitousKeyValueStore defaultStore]]; + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(updateForTheme) + name:kVLCThemeDidChangeNotification + object:nil]; /* force store update */ NSUbiquitousKeyValueStore *ubiquitousKeyValueStore = [NSUbiquitousKeyValueStore defaultStore]; [ubiquitousKeyValueStore synchronize]; @@ -102,15 +102,11 @@ [scanSubModelabel setText:NSLocalizedString(@"SCAN_SUBTITLE_TOGGLE", nil)]; [scanSubModelabel setAdjustsFontSizeToFitWidth:YES]; [scanSubModelabel setNumberOfLines:0]; - self.title = NSLocalizedString(@"OPEN_NETWORK", nil); - self.navigationItem.leftBarButtonItem = [UIBarButtonItem themedRevealMenuButtonWithTarget:self andSelector:@selector(goBack:)]; + [self.whatToOpenHelpLabel setText:NSLocalizedString(@"OPEN_NETWORK_HELP", nil)]; self.urlField.delegate = self; self.urlField.keyboardType = UIKeyboardTypeURL; - self.historyTableView.backgroundColor = [UIColor VLCDarkBackgroundColor]; - NSAttributedString *coloredAttributedPlaceholder = [[NSAttributedString alloc] initWithString:@"http://myserver.com/file.mkv" attributes:@{NSForegroundColorAttributeName: [UIColor VLCLightTextColor]}]; - self.urlField.attributedPlaceholder = coloredAttributedPlaceholder; self.edgesForExtendedLayout = UIRectEdgeNone; // This will be called every time this VC is opened by the side menu controller @@ -123,6 +119,22 @@ UIMenuController *sharedMenuController = [UIMenuController sharedMenuController]; [sharedMenuController setMenuItems:@[renameItem]]; [sharedMenuController update]; + [self updateForTheme]; +} + +- (void)updateForTheme +{ + self.historyTableView.backgroundColor = PresentationTheme.current.colors.background; + self.view.backgroundColor = PresentationTheme.current.colors.background; + NSAttributedString *coloredAttributedPlaceholder = [[NSAttributedString alloc] initWithString:@"http://myserver.com/file.mkv" attributes:@{NSForegroundColorAttributeName: PresentationTheme.current.colors.lightTextColor}]; + self.urlField.attributedPlaceholder = coloredAttributedPlaceholder; + self.urlField.backgroundColor = PresentationTheme.current.colors.cellBackgroundB; + self.urlField.textColor = PresentationTheme.current.colors.cellTextColor; + self.privateModeLabel.textColor = PresentationTheme.current.colors.lightTextColor; + self.ScanSubModeLabel.textColor = PresentationTheme.current.colors.lightTextColor; + self.whatToOpenHelpLabel.textColor = PresentationTheme.current.colors.lightTextColor; + self.openButton.backgroundColor = PresentationTheme.current.colors.orangeUI; + [self.historyTableView reloadData]; } - (void)updatePasteboardTextInURLField @@ -150,6 +162,7 @@ NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; [defaults setBool:self.privateToggleSwitch.on forKey:kVLCPrivateWebStreaming]; [defaults setBool:self.ScanSubToggleSwitch.on forKey:kVLChttpScanSubtitle]; + [self.view endEditing:YES]; /* force update before we leave */ [[NSUbiquitousKeyValueStore defaultStore] synchronize]; @@ -170,12 +183,6 @@ return YES; } -- (IBAction)goBack:(id)sender -{ - [self.view endEditing:YES]; - [[VLCSidebarController sharedInstance] toggleSidebar]; -} - - (IBAction)openButtonAction:(id)sender { if ([self.urlField.text length] <= 0 || [NSURL URLWithString:self.urlField.text] == nil) { @@ -276,7 +283,7 @@ NSString *possibleTitle = _recentURLTitles[[@(indexPath.row) stringValue]]; cell.detailTextLabel.text = content; - cell.textLabel.text = (possibleTitle != nil) ? possibleTitle : [content lastPathComponent]; + cell.textLabel.text = possibleTitle ?: [content lastPathComponent]; return cell; } @@ -285,7 +292,9 @@ - (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { - cell.backgroundColor = (indexPath.row % 2 == 0)? [UIColor blackColor]: [UIColor VLCDarkBackgroundColor]; + cell.backgroundColor = (indexPath.row % 2 == 0)? PresentationTheme.current.colors.cellBackgroundB : PresentationTheme.current.colors.cellBackgroundA; + cell.textLabel.textColor = PresentationTheme.current.colors.cellTextColor; + cell.detailTextLabel.textColor = PresentationTheme.current.colors.cellDetailTextColor; } - (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath diff --git a/Sources/VLCPlaybackController.h b/Sources/VLCPlaybackController.h index ac879cf154cc20aaaa84645bba9a50b4abc5372e..49fce1ab82bee97700b0ab57c4a5a4fba51496a8 100644 --- a/Sources/VLCPlaybackController.h +++ b/Sources/VLCPlaybackController.h @@ -12,7 +12,6 @@ *****************************************************************************/ #import "VLCEqualizerView.h" - extern NSString *const VLCPlaybackControllerPlaybackDidStart; extern NSString *const VLCPlaybackControllerPlaybackDidPause; extern NSString *const VLCPlaybackControllerPlaybackDidResume; diff --git a/Sources/VLCPlaybackController.m b/Sources/VLCPlaybackController.m index 8a405b5d7d4ceb651a1a44237b40062558dfbcbb..d584beb9538a3d8b2c1d10f0a7368a1016f167ac 100644 --- a/Sources/VLCPlaybackController.m +++ b/Sources/VLCPlaybackController.m @@ -92,7 +92,6 @@ typedef NS_ENUM(NSUInteger, VLCAspectRatio) { - (void)dealloc { _dialogProvider = nil; - [[NSNotificationCenter defaultCenter] removeObserver:self]; } - (instancetype)init diff --git a/Sources/VLCPlayerDisplayController.h b/Sources/VLCPlayerDisplayController.h index ea54eb6e9220179df7cba2f778fd40b85ecb64ea..b03d1e80cc556d3db6e27e7d69f80aa324b9024e 100644 --- a/Sources/VLCPlayerDisplayController.h +++ b/Sources/VLCPlayerDisplayController.h @@ -24,11 +24,11 @@ typedef NS_ENUM(NSUInteger, VLCPlayerDisplayControllerDisplayMode) { @end -@interface VLCPlayerDisplayController : UIViewController +@protocol VLCPlayerDisplayControllerDelegate -+ (VLCPlayerDisplayController *)sharedInstance; +@end -@property (nonatomic, strong) UIViewController *childViewController; +@interface VLCPlayerDisplayController : UIViewController @property (nonatomic, assign) VLCPlayerDisplayControllerDisplayMode displayMode; @property (nonatomic, weak) VLCPlaybackController *playbackController; diff --git a/Sources/VLCPlayerDisplayController.m b/Sources/VLCPlayerDisplayController.m index b6a04a9ae1135721e6da3e7ce3c0a380b19a7bdc..f928dd38a5f9ad79358a6d64bfd139ff81f705e3 100644 --- a/Sources/VLCPlayerDisplayController.m +++ b/Sources/VLCPlayerDisplayController.m @@ -14,6 +14,7 @@ #import "VLCPlaybackController.h" #import "VLCMiniPlaybackView.h" #import "VLCPlaybackNavigationController.h" +#import "VLCPlaybackController+MediaLibrary.h" #if TARGET_OS_IOS #import "VLCMovieViewController.h" @@ -23,29 +24,26 @@ static NSString *const VLCPlayerDisplayControllerDisplayModeKey = @"VLCPlayerDisplayControllerDisplayMode"; -@interface VLCPlayerDisplayController () -@property (nonatomic, strong) UIViewController<VLCPlaybackControllerDelegate> *movieViewController; -@property (nonatomic, strong) UIView<VLCPlaybackControllerDelegate, VLCMiniPlaybackViewInterface> *miniPlaybackView; +@interface VLCUntouchableView: UIView @end -@implementation VLCPlayerDisplayController +@implementation VLCUntouchableView -+ (VLCPlayerDisplayController *)sharedInstance +- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event { - static VLCPlayerDisplayController *sharedInstance = nil; - static dispatch_once_t pred; + UIView *result = [super hitTest:point withEvent:event]; + return result == self ? nil : result; +} - dispatch_once(&pred, ^{ - sharedInstance = [VLCPlayerDisplayController new]; - }); +@end - return sharedInstance; -} +@interface VLCPlayerDisplayController () <VLCMovieViewControllerDelegate> +@property (nonatomic, strong) UIViewController<VLCPlaybackControllerDelegate> *movieViewController; +@property (nonatomic, strong) UIView<VLCPlaybackControllerDelegate, VLCMiniPlaybackViewInterface> *miniPlaybackView; +@property (nonatomic, strong) NSLayoutConstraint *bottomConstraint; +@end -+ (void)initialize -{ - [[NSUserDefaults standardUserDefaults] registerDefaults:@{VLCPlayerDisplayControllerDisplayModeKey : @(VLCPlayerDisplayControllerDisplayModeFullscreen)}]; -} +@implementation VLCPlayerDisplayController - (instancetype)init { @@ -55,44 +53,14 @@ static NSString *const VLCPlayerDisplayControllerDisplayModeKey = @"VLCPlayerDis [notificationCenter addObserver:self selector:@selector(playbackDidStart:) name:VLCPlaybackControllerPlaybackDidStart object:nil]; [notificationCenter addObserver:self selector:@selector(playbackDidFail:) name:VLCPlaybackControllerPlaybackDidFail object:nil]; [notificationCenter addObserver:self selector:@selector(playbackDidStop:) name:VLCPlaybackControllerPlaybackDidStop object:nil]; + [[NSUserDefaults standardUserDefaults] registerDefaults:@{VLCPlayerDisplayControllerDisplayModeKey : @(VLCPlayerDisplayControllerDisplayModeFullscreen)}]; } return self; } -- (void)dealloc -{ - [[NSNotificationCenter defaultCenter] removeObserver:self]; -} - - (void)viewDidLoad { - [super viewDidLoad]; - [self setupChildViewController]; -} - -#pragma mark - ChildViewController - -- (void)setChildViewController:(UIViewController *)childViewController -{ - if (_childViewController) { - [_childViewController willMoveToParentViewController:nil]; - [_childViewController.view removeFromSuperview]; - [_childViewController removeFromParentViewController]; - } - _childViewController = childViewController; - if (self.isViewLoaded) { - [self setupChildViewController]; - } -} - -- (void)setupChildViewController -{ - UIViewController *childViewController = self.childViewController; - if (childViewController == nil) - return; - [self addChildViewController:childViewController]; - [self.view addSubview:childViewController.view]; - [childViewController didMoveToParentViewController:self]; + self.view = [[VLCUntouchableView alloc] initWithFrame:self.view.frame]; } #pragma mark - properties @@ -107,16 +75,6 @@ static NSString *const VLCPlayerDisplayControllerDisplayModeKey = @"VLCPlayerDis [[NSUserDefaults standardUserDefaults] setInteger:displayMode forKey:VLCPlayerDisplayControllerDisplayModeKey]; } -- (void)viewSafeAreaInsetsDidChange -{ - if (@available(iOS 11.0, *)) { - [super viewSafeAreaInsetsDidChange]; - CGRect frame = _miniPlaybackView.frame; - frame.size.height = 60.0 + self.view.safeAreaInsets.bottom; - _miniPlaybackView.frame = frame; - } -} - - (VLCPlaybackController *)playbackController { if (_playbackController == nil) { _playbackController = [VLCPlaybackController sharedInstance]; @@ -129,10 +87,11 @@ static NSString *const VLCPlayerDisplayControllerDisplayModeKey = @"VLCPlayerDis if (!_movieViewController) { #if TARGET_OS_IOS _movieViewController = [[VLCMovieViewController alloc] initWithNibName:nil bundle:nil]; + ((VLCMovieViewController *)_movieViewController).delegate = self; #else _movieViewController = [[VLCFullscreenMovieTVViewController alloc] initWithNibName:nil bundle:nil]; #endif - [VLCPlaybackController sharedInstance].delegate = _movieViewController; + self.playbackController.delegate = _movieViewController; } return _movieViewController; } @@ -144,8 +103,7 @@ static NSString *const VLCPlayerDisplayControllerDisplayModeKey = @"VLCPlayerDis NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; BOOL enforceFullscreen = [[defaults objectForKey:kVLCSettingVideoFullscreenPlayback] boolValue]; - VLCPlaybackController *vpc = [VLCPlaybackController sharedInstance]; - if (vpc.fullscreenSessionRequested && enforceFullscreen) { + if (self.playbackController.fullscreenSessionRequested && enforceFullscreen) { [self showFullscreenPlayback]; return; } @@ -182,7 +140,7 @@ static NSString *const VLCPlayerDisplayControllerDisplayModeKey = @"VLCPlayerDis - (void)closeFullscreenPlayback { - [self _closeFullscreenPlayback]; + [self.movieViewController dismissViewControllerAnimated:[self shouldAnimate] completion:nil]; self.displayMode = VLCPlayerDisplayControllerDisplayModeMiniplayer; [self _showHideMiniPlaybackView]; } @@ -302,15 +260,6 @@ static NSString *const VLCPlayerDisplayControllerDisplayModeKey = @"VLCPlayerDis const BOOL activePlaybackSession = playbackController.isPlaying || playbackController.willPlay; const BOOL miniPlayerVisible = miniPlaybackView.visible; - const CGRect viewRect = self.view.bounds; - - CGFloat miniPlayerHeight = 60.; - if (@available(iOS 11.0, *)) { - miniPlayerHeight += self.view.safeAreaInsets.bottom; - } - const CGRect miniPlayerFrameIn = CGRectMake(0., viewRect.size.height-miniPlayerHeight, viewRect.size.width, miniPlayerHeight); - const CGRect miniPlayerFrameOut = CGRectMake(0., viewRect.size.height, viewRect.size.width, miniPlayerHeight); - BOOL needsShow = activePlaybackSession && !miniPlayerVisible; BOOL needsHide = !activePlaybackSession && miniPlayerVisible; @@ -322,9 +271,18 @@ static NSString *const VLCPlayerDisplayControllerDisplayModeKey = @"VLCPlayerDis void (^completionBlock)(BOOL) = nil; if (needsShow) { if (!miniPlaybackView) { - self.miniPlaybackView = miniPlaybackView = [[VLCMiniPlaybackView alloc] initWithFrame:miniPlayerFrameOut]; - miniPlaybackView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleTopMargin; + self.miniPlaybackView = miniPlaybackView = [[VLCMiniPlaybackView alloc] initWithFrame:CGRectZero]; + miniPlaybackView.translatesAutoresizingMaskIntoConstraints = NO; + miniPlaybackView.userInteractionEnabled = YES; [self.view addSubview:miniPlaybackView]; + _bottomConstraint = [miniPlaybackView.topAnchor constraintEqualToAnchor:self.view.bottomAnchor]; + [NSLayoutConstraint activateConstraints: + @[_bottomConstraint, + [miniPlaybackView.heightAnchor constraintEqualToConstant:60.0], + [miniPlaybackView.leftAnchor constraintEqualToAnchor:self.view.leftAnchor], + [miniPlaybackView.rightAnchor constraintEqualToAnchor:self.view.rightAnchor], + ]]; + [self.view layoutIfNeeded]; } miniPlaybackView.visible = YES; } else if (needsHide) { @@ -345,22 +303,27 @@ static NSString *const VLCPlayerDisplayControllerDisplayModeKey = @"VLCPlayerDis [miniPlaybackView prepareForMediaPlayback:playbackController]; if (needsShow || needsHide) { - UIViewController *childViewController = self.childViewController; - - const CGRect newMiniPlayerFrame = needsHide ? miniPlayerFrameOut : miniPlayerFrameIn; - CGRect newChildViewFrame = childViewController.view.frame; - newChildViewFrame.size.height = CGRectGetMinY(newMiniPlayerFrame)-CGRectGetMinY(newChildViewFrame); - [UIView animateWithDuration:animationDuration delay:animationDuration options:UIViewAnimationOptionBeginFromCurrentState | UIViewAnimationOptionAllowUserInteraction animations:^{ - miniPlaybackView.frame = newMiniPlayerFrame; - childViewController.view.frame = newChildViewFrame; + self.bottomConstraint.constant = needsHide ? 0 : -_miniPlaybackView.frame.size.height -self.view.layoutMargins.bottom; + [self.view layoutIfNeeded]; } completion:completionBlock]; } #endif } +#pragma mark - MovieViewControllerDelegate + +- (void)movieViewControllerDidSelectMinimize:(VLCMovieViewController *)movieViewController +{ + [self closeFullscreenPlayback]; +} + +- (BOOL)movieViewControllerShouldBeDisplayed:(VLCMovieViewController *)movieViewController +{ + return self.displayMode == VLCPlayerDisplayControllerDisplayModeFullscreen; +} @end diff --git a/Sources/VLCPlaylistCollectionViewCell.h b/Sources/VLCPlaylistCollectionViewCell.h index 7f24c597d03b004af559c660827ce2080a95db48..fdaf8621f5217be5f62f1762562ba6f3103da503 100644 --- a/Sources/VLCPlaylistCollectionViewCell.h +++ b/Sources/VLCPlaylistCollectionViewCell.h @@ -2,12 +2,13 @@ * VLCPlaylistCollectionViewCell.h * VLC for iOS ***************************************************************************** - * Copyright (c) 2013-2015 VideoLAN. All rights reserved. + * Copyright (c) 2013-2018 VideoLAN. All rights reserved. * $Id$ * * Authors: Felix Paul Kühne <fkuehne # videolan.org> * Tamas Timar <ttimar.vlc # gmail.com> * Gleb Pinigin <gpinigin # gmail.com> + * Carola Nitz <nitz.carola # gmail.com> * * Refer to the COPYING file of the official project for license. *****************************************************************************/ @@ -33,7 +34,7 @@ - (void)setEditing:(BOOL)editing animated:(BOOL)animated; - (void)selectionUpdate; -- (void)shake:(BOOL)shake; - (void)showMetadata:(BOOL)showMeta; ++ (NSString *)cellIdentifier; @end diff --git a/Sources/VLCPlaylistCollectionViewCell.m b/Sources/VLCPlaylistCollectionViewCell.m index 815f282dd7321820535b6bdb968c2f1ff656d6a9..df9d665b3c4c18b8ddd0c636f27db5ed48f79191 100644 --- a/Sources/VLCPlaylistCollectionViewCell.m +++ b/Sources/VLCPlaylistCollectionViewCell.m @@ -2,7 +2,7 @@ * VLCPlaylistCollectionViewCell.m * VLC for iOS ***************************************************************************** - * Copyright (c) 2013-2015 VideoLAN. All rights reserved. + * Copyright (c) 2013-2018 VideoLAN. All rights reserved. * $Id$ * * Authors: Felix Paul Kühne <fkuehne # videolan.org> @@ -14,7 +14,6 @@ *****************************************************************************/ #import "VLCPlaylistCollectionViewCell.h" -#import "VLCLibraryViewController.h" #import "VLCThumbnailsCache.h" #import "NSString+SupportedMedia.h" @@ -22,6 +21,7 @@ { UIImage *_checkboxEmptyImage; UIImage *_checkboxImage; + BOOL _editing; } @end @@ -41,11 +41,17 @@ [super awakeFromNib]; } ++ (NSString *)cellIdentifier +{ + return @"VLCPlaylistCollectionViewCell"; +} + - (void)setEditing:(BOOL)editing animated:(BOOL)animated { - self.isSelectedView.hidden = !editing; + _editing = editing; + self.isSelectedView.hidden = !_editing; - [self shake:editing]; + [self shake]; [self selectionUpdate]; [self _updatedDisplayedInformationForKeyPath:@"editing"]; } @@ -58,9 +64,9 @@ self.isSelectedView.image = _checkboxEmptyImage; } -- (void)shake:(BOOL)shake +- (void)shake { - if (shake) { + if (_editing) { [UIView animateWithDuration:0.3 animations:^{ self.contentView.transform = CGAffineTransformMakeScale(0.9f, 0.9f); }]; @@ -125,7 +131,6 @@ [_mediaObject removeObserver:self forKeyPath:@"album"]; [_mediaObject removeObserver:self forKeyPath:@"artist"]; [_mediaObject removeObserver:self forKeyPath:@"genre"]; - [[NSNotificationCenter defaultCenter] removeObserver:self]; [(MLFile*)_mediaObject didHide]; } } @@ -306,9 +311,7 @@ } else self.titleLabel.text = mediaFile.title; - VLCLibraryViewController *delegate = (VLCLibraryViewController*)self.collectionView.delegate; - - if (delegate.isEditing) + if (_editing) self.subtitleLabel.text = [NSString stringWithFormat:@"%@ — %@", [VLCTime timeWithNumber:[mediaFile duration]], [NSByteCountFormatter stringFromByteCount:[mediaFile fileSizeInBytes] countStyle:NSByteCountFormatterCountStyleFile]]; else { self.subtitleLabel.text = [NSString stringWithFormat:@"%@", [VLCTime timeWithNumber:[mediaFile duration]]]; diff --git a/Sources/VLCPlaylistTableViewCell.h b/Sources/VLCPlaylistTableViewCell.h index f7cbfc7e7a7e210e60b19154f4295d9f50a9f504..5c38d1c2ac363c5adddd6d41dcd7a425585d7736 100644 --- a/Sources/VLCPlaylistTableViewCell.h +++ b/Sources/VLCPlaylistTableViewCell.h @@ -12,8 +12,6 @@ *****************************************************************************/ #import <UIKit/UIKit.h> -static NSString *kPlaylistCellIdentifier = @"PlaylistCell"; - @class VLCLinearProgressIndicator; @interface VLCPlaylistTableViewCell : UITableViewCell @@ -30,6 +28,7 @@ static NSString *kPlaylistCellIdentifier = @"PlaylistCell"; @property (nonatomic, strong) NSManagedObject *mediaObject; + (CGFloat)heightOfCell; ++ (NSString *)cellIdentifier; - (void)collapsWithAnimation:(BOOL)animate; diff --git a/Sources/VLCPlaylistTableViewCell.m b/Sources/VLCPlaylistTableViewCell.m index 9b47fbb2ff6a4dba57a162006d261a84a6cc6962..506471aed30627ca147deea3a022f57f6b3b618a 100644 --- a/Sources/VLCPlaylistTableViewCell.m +++ b/Sources/VLCPlaylistTableViewCell.m @@ -34,6 +34,11 @@ [self setSelectedBackgroundView:bgColorView]; } ++ (NSString *)cellIdentifier +{ + return @"VLCPlaylistTableViewCell"; +} + - (void)dealloc { [self _removeObserver]; @@ -92,7 +97,6 @@ [_mediaObject removeObserver:self forKeyPath:@"album"]; [_mediaObject removeObserver:self forKeyPath:@"artist"]; [_mediaObject removeObserver:self forKeyPath:@"genre"]; - [[NSNotificationCenter defaultCenter] removeObserver:self]; [(MLFile*)_mediaObject didHide]; } } diff --git a/Sources/VLCSettingsController.m b/Sources/VLCSettingsController.m index abfef9457991acb7b09ea0fec15719d7afa843fb..c060d1ee3145e075be8bce8a79807813f8f7a154 100644 --- a/Sources/VLCSettingsController.m +++ b/Sources/VLCSettingsController.m @@ -13,7 +13,6 @@ *****************************************************************************/ #import "VLCSettingsController.h" -#import "VLCLibraryViewController.h" #import "IASKSettingsReader.h" #import "PAPasscodeViewController.h" #import <LocalAuthentication/LocalAuthentication.h> @@ -37,11 +36,18 @@ - (void)viewDidLoad { - self.navigationItem.leftBarButtonItem = [UIBarButtonItem themedRevealMenuButtonWithTarget:self andSelector:@selector(dismiss:)]; self.modalPresentationStyle = UIModalPresentationFormSheet; self.delegate = self; self.showDoneButton = NO; self.showCreditsFooter = NO; + [self themeDidChange]; +} + +- (void)themeDidChange +{ + self.view.backgroundColor = PresentationTheme.current.colors.settingsBackground; + self.tableView.separatorColor = PresentationTheme.current.colors.settingsSeparatorColor; + [self.tableView reloadData]; } - (void)viewWillAppear:(BOOL)animated @@ -94,6 +100,11 @@ [self updateForPasscode:nil]; } } + if ([notification.object isEqual:kVLCSettingAppTheme]) { + BOOL darkTheme = [[notification.userInfo objectForKey:kVLCSettingAppTheme] boolValue]; + PresentationTheme.current = darkTheme ? PresentationTheme.darkTheme : PresentationTheme.brightTheme; + [self themeDidChange]; + } } - (void)updateUIAndCoreSpotlightForPasscodeSetting:(BOOL)passcodeOn @@ -126,6 +137,15 @@ [self updateForPasscode:controller.passcode]; } +- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath +{ + UITableViewCell *cell = [super tableView:tableView cellForRowAtIndexPath:indexPath]; + cell.backgroundColor = PresentationTheme.current.colors.settingsCellBackground; + cell.textLabel.textColor = PresentationTheme.current.colors.cellTextColor; + cell.detailTextLabel.textColor = PresentationTheme.current.colors.cellDetailTextColor; + return cell; +} + - (void)updateForPasscode:(NSString *)passcode { NSError *error = nil; diff --git a/Sources/VLCTabBarCoordinator.swift b/Sources/VLCTabBarCoordinator.swift new file mode 100644 index 0000000000000000000000000000000000000000..ee619de008d0a45ca171fdbef778c49304d5b2ab --- /dev/null +++ b/Sources/VLCTabBarCoordinator.swift @@ -0,0 +1,172 @@ +/***************************************************************************** + * VLCTabbarCooordinator.swift + * VLC for iOS + ***************************************************************************** + * Copyright (c) 2018 VideoLAN. All rights reserved. + * $Id$ + * + * Authors: Carola Nitz <nitz.carola # gmail.com> + * + * Refer to the COPYING file of the official project for license. + *****************************************************************************/ + +import Foundation + +class VLCTabbarCooordinator: NSObject, VLCMediaViewControllerDelegate, UITabBarControllerDelegate { + + private var childCoordinators: [NSObject] = [] + private var tabBarController:UITabBarController + private var services:Services + private let displayController = VLCPlayerDisplayController() + + public init(tabBarController: UITabBarController, services:Services) { + self.tabBarController = tabBarController + self.services = services + super.init() + self.tabBarController.delegate = self + NotificationCenter.default.addObserver(self, selector: #selector(updateTheme), name: .VLCThemeDidChangeNotification, object: nil) + } + + @objc public func start() { + setupViewControllers() + updateTheme() + } + + @objc func updateTheme() { + tabBarController.tabBar.barTintColor = PresentationTheme.current.colors.tabBarColor + customizeMoreViewController() + } + + func customizeMoreViewController() { + if let UITabBarCustomizeViewClass = NSClassFromString("UITabBarCustomizeView") { + for subview in tabBarController.view.subviews where subview.isKind(of: UITabBarCustomizeViewClass) { + subview.backgroundColor = PresentationTheme.current.colors.background + subview.tintColor = PresentationTheme.current.colors.orangeUI + } + } + } + + func tabBarController(_ tabBarController: UITabBarController, willBeginCustomizing viewControllers: [UIViewController]) { + customizeMoreViewController() + } + + func setupViewControllers() { + + tabBarController.addChildViewController(displayController) + tabBarController.view.addSubview(displayController.view) + displayController.view.layoutMargins = UIEdgeInsets(top:0, left:0, bottom:tabBarController.tabBar.frame.size.height, right:0) + displayController.didMove(toParentViewController: tabBarController) + + let videoVC = VLCMediaViewController(services: services) + //this should probably not be the delegate + videoVC.delegate = self + videoVC.title = NSLocalizedString("Video",comment: "") + videoVC.tabBarItem = UITabBarItem( + title: NSLocalizedString("Video",comment: ""), + image: UIImage(named: "TVShowsIcon"), + selectedImage: UIImage(named: "TVShowsIcon")) + + // Audio + let audioVC = VLCMediaViewController(services: services) + //this should probably not be the delegate + audioVC.delegate = self + audioVC.title = NSLocalizedString("Audio",comment: "") + audioVC.tabBarItem = UITabBarItem( + title: NSLocalizedString("Audio",comment: ""), + image: UIImage(named: "MusicAlbums"), + selectedImage:UIImage(named: "MusicAlbums")) + + //Serverlist + let serverVC = VLCServerListViewController(nibName: nil, bundle: nil) + serverVC.title = NSLocalizedString("LOCAL_NETWORK", comment: "") + serverVC.tabBarItem = UITabBarItem( + title: NSLocalizedString("LOCAL_NETWORK",comment: ""), + image: UIImage(named: "Local"), + selectedImage: UIImage(named: "Local")) + + //CloudServices + let cloudVC = VLCCloudServicesTableViewController(nibName: "VLCCloudServicesTableViewController", bundle: Bundle.main) + cloudVC.title = NSLocalizedString("CLOUD_SERVICES",comment: "") + cloudVC.tabBarItem = UITabBarItem( + title: NSLocalizedString("CLOUD_SERVICES",comment: ""), + image: UIImage(named: "iCloudIcon"), + selectedImage: UIImage(named: "iCloudIcon")) + + //Settings + let settingsVC = VLCSettingsController() + settingsVC.title = NSLocalizedString("Settings",comment: "") + settingsVC.tabBarItem = UITabBarItem( + title: NSLocalizedString("Settings",comment: ""), + image: UIImage(named: "Settings"), + selectedImage: UIImage(named: "Settings")) + + //Download + let downloadVC = VLCDownloadViewController() + downloadVC.title = NSLocalizedString("DOWNLOAD_FROM_HTTP", comment:"") + downloadVC.tabBarItem = UITabBarItem( + title: NSLocalizedString("DOWNLOAD_FROM_HTTP",comment: ""), + image: UIImage(named: "Downloads"), + selectedImage: UIImage(named: "Downloads")) + + //Streaming + let streamVC = VLCOpenNetworkStreamViewController(nibName: "VLCOpenNetworkStreamViewController", bundle: Bundle.main) + streamVC.title = NSLocalizedString("OPEN_NETWORK", comment: "") + streamVC.tabBarItem = UITabBarItem( + title: NSLocalizedString("OPEN_NETWORK", comment: ""), + image: UIImage(named: "OpenNetStream"), + selectedImage: UIImage(named: "OpenNetStream")) + + //About + let aboutVC = VLCAboutViewController() + aboutVC.title = NSLocalizedString("ABOUT_APP",comment: "") + + aboutVC.tabBarItem = UITabBarItem( + title: NSLocalizedString("ABOUT_APP",comment: ""), + image: coneIcon(), + selectedImage: coneIcon()) + + let controllers = [audioVC, serverVC, videoVC, settingsVC, cloudVC, downloadVC, streamVC, aboutVC] + tabBarController.viewControllers = controllers.map { UINavigationController(rootViewController: $0)} + } + + func coneIcon() -> UIImage? { + let calendar = NSCalendar(calendarIdentifier: .gregorian) + if let dayOfYear = calendar?.ordinality(of: .day, in: .year, for: Date()) { + return dayOfYear >= 354 ? UIImage(named: "vlc-xmas") : UIImage(named: "menuCone") + } + return nil + } + + //MARK - VLCMediaViewControllerDelegate + func mediaViewControllerDidSelectMediaObject(_ VLCMediaViewController: VLCMediaViewController, mediaObject: NSManagedObject) { + playMedia(media:mediaObject) + } + + func mediaViewControllerDidSelectSort(_ VLCMediaViewController: VLCMediaViewController) { + showSortOptions() + } + + func playMedia(media: NSManagedObject) { + //that should go into a Coordinator itself + let vpc = VLCPlaybackController.sharedInstance() + vpc?.playMediaLibraryObject(media) + } + + func showSortOptions() { + //This should be in a subclass + let sortOptionsAlertController = UIAlertController(title: NSLocalizedString("Sort by",comment: ""), message: nil, preferredStyle: .actionSheet) + let sortByNameAction = UIAlertAction(title: SortOption.alphabetically.localizedDescription, style: .default) { action in + } + let sortBySizeAction = UIAlertAction(title: SortOption.size.localizedDescription, style: .default) { action in + } + let sortbyDateAction = UIAlertAction(title: SortOption.insertonDate.localizedDescription, style: .default) { action in + } + let cancelAction = UIAlertAction(title: NSLocalizedString("Cancel",comment:""), style: .cancel, handler: nil) + sortOptionsAlertController.addAction(sortByNameAction) + sortOptionsAlertController.addAction(sortbyDateAction) + sortOptionsAlertController.addAction(sortBySizeAction) + sortOptionsAlertController.addAction(cancelAction) + sortOptionsAlertController.view.tintColor = UIColor.vlcOrangeTint() + tabBarController.present(sortOptionsAlertController, animated: true) + } +} diff --git a/Sources/VLCWiFiUploadTableViewCell.h b/Sources/VLCWiFiUploadTableViewCell.h index 9d9cb2c7382754c1cdf8ff075a855f3ef3864bcd..31958e5ec31b550c74921b4efac81bd87dfe74ab 100644 --- a/Sources/VLCWiFiUploadTableViewCell.h +++ b/Sources/VLCWiFiUploadTableViewCell.h @@ -15,5 +15,6 @@ @interface VLCWiFiUploadTableViewCell : UITableViewCell - (void)toggleHTTPServer; ++ (NSString *)cellIdentifier; @end diff --git a/Sources/VLCWiFiUploadTableViewCell.m b/Sources/VLCWiFiUploadTableViewCell.m index 200492b29f8f5d440d428a661dfaea1689f9c4df..49b3e4dd75f5aba77782d68c1bc0452492c71d96 100644 --- a/Sources/VLCWiFiUploadTableViewCell.m +++ b/Sources/VLCWiFiUploadTableViewCell.m @@ -40,7 +40,11 @@ - (void)dealloc { [self.reachability stopNotifier]; - [[NSNotificationCenter defaultCenter] removeObserver:self]; +} + ++ (NSString *)cellIdentifier +{ + return @"VLCWiFiUploadTableViewCell"; } - (void)setupCell diff --git a/VLC-iOS-Bridging-Header.h b/VLC-iOS-Bridging-Header.h index a9ab5316e86871a99d63d90c2f6dc652b775166b..18f59557f367e528a512a63e0261d37edb8f3795 100644 --- a/VLC-iOS-Bridging-Header.h +++ b/VLC-iOS-Bridging-Header.h @@ -1,11 +1,21 @@ -// -// Use this file to import your target's public headers that you would like to expose to Swift. -// - #import <MediaLibraryKit/MediaLibraryKit.h> -#import "VLCPlaylistTableViewCell.h" -#import "VLCMediaDataSource.h" -#import "VLCLibraryViewController.h" +#import <MobileVLCKit/MobileVLCKit.h> #import <PAPasscode/PAPasscodeViewController.h> #import <XKKeychain/XKKeychain.h> + +#import "UIColor+Presets.h" +#import "VLCAboutViewController.h" +#import "VLCCloudServicesTableViewController.h" #import "VLCConstants.h" +#import "VLCDownloadViewController.h" +#import "VLCLibrarySearchDisplayDataSource.h" +#import "VLCMediaDataSource.h" +#import "VLCOpenNetworkStreamViewController.h" +#import "VLCPlaybackController+MediaLibrary.h" +#import "VLCPlaybackNavigationController.h" +#import "VLCPlayerDisplayController.h" +#import "VLCPlaylistTableViewCell.h" +#import "VLCPlaylistCollectionViewCell.h" +#import "VLCServerListViewController.h" +#import "VLCSettingsController.h" +#import "VLCWiFiUploadTableViewCell.h" diff --git a/VLC.xcodeproj/project.pbxproj b/VLC.xcodeproj/project.pbxproj index c5cf861b5043f2072b85f7ac0205cee3a4f9bd6c..07c7eed0863b72e0e6c3c08eb90dcfa9f6af0b9f 100644 --- a/VLC.xcodeproj/project.pbxproj +++ b/VLC.xcodeproj/project.pbxproj @@ -11,12 +11,14 @@ 26F1BFD01A770408001DF30C /* libMediaVLC.xml in Resources */ = {isa = PBXBuildFile; fileRef = 26F1BFCF1A770408001DF30C /* libMediaVLC.xml */; }; 29125E5617492219003F03E5 /* index.html in Resources */ = {isa = PBXBuildFile; fileRef = 29125E5417492219003F03E5 /* index.html */; }; 2915544317490D4A00B86CAD /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2915544217490D4A00B86CAD /* Security.framework */; }; + 41251ED01FD0CF7900099110 /* AppCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 41251ECE1FD0CF7900099110 /* AppCoordinator.swift */; }; 41273A3C1A955C4100A2EF77 /* VLCMigrationViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 41273A3A1A955C4100A2EF77 /* VLCMigrationViewController.m */; }; 41273A3D1A955C4100A2EF77 /* VLCMigrationViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 41273A3B1A955C4100A2EF77 /* VLCMigrationViewController.xib */; }; - 412BE7531FC4947400ACCC42 /* VLCMediaData+VLCDragAndDrop.swift in Sources */ = {isa = PBXBuildFile; fileRef = 412BE7521FC4947400ACCC42 /* VLCMediaData+VLCDragAndDrop.swift */; }; + 413EC987201A329D00BF412F /* SortOption.swift in Sources */ = {isa = PBXBuildFile; fileRef = 413EC986201A329D00BF412F /* SortOption.swift */; }; + 413EC98B201B4F2C00BF412F /* PresentationTheme.swift in Sources */ = {isa = PBXBuildFile; fileRef = 413EC98A201B4F2B00BF412F /* PresentationTheme.swift */; }; + 414396C22023316C005E3FAF /* AppearanceManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 414396C12023316C005E3FAF /* AppearanceManager.swift */; }; 4144C4661A0ED6C700918C89 /* Reachability.m in Sources */ = {isa = PBXBuildFile; fileRef = 7D3784E6183A99E1009EE944 /* Reachability.m */; }; 4152F1621FEF19BD00F1908B /* KeychainCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4152F1611FEF19BD00F1908B /* KeychainCoordinator.swift */; }; - 416DEFF61FEEA76A00F4FC59 /* LayoutAnchorContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 416DEFF51FEEA76A00F4FC59 /* LayoutAnchorContainer.swift */; }; 4171D35018A2C19000A16EF9 /* VLCFolderCollectionViewFlowLayout.m in Sources */ = {isa = PBXBuildFile; fileRef = 4171D34F18A2C19000A16EF9 /* VLCFolderCollectionViewFlowLayout.m */; }; 417CDA231A48D1F300D9ACE7 /* VLCCloudServicesTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 417CDA211A48D1F300D9ACE7 /* VLCCloudServicesTableViewController.m */; }; 417CDA241A48D1F300D9ACE7 /* VLCCloudServicesTableViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 417CDA221A48D1F300D9ACE7 /* VLCCloudServicesTableViewController.xib */; }; @@ -28,6 +30,13 @@ 417E68B91F321EFF00DB9BB2 /* VLCActivityViewControllerVendor.m in Sources */ = {isa = PBXBuildFile; fileRef = 417E68B81F321EFF00DB9BB2 /* VLCActivityViewControllerVendor.m */; }; 4184AA151A5492070063DF5A /* VLCCloudStorageController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4184AA141A5492070063DF5A /* VLCCloudStorageController.m */; }; 4187112B1F78F87200317B1A /* VLC_for_iOSTestVideoCodecs.m in Sources */ = {isa = PBXBuildFile; fileRef = 4187112A1F78F87200317B1A /* VLC_for_iOSTestVideoCodecs.m */; }; + 418B144720179C00000447AA /* MediaViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 418B144620179C00000447AA /* MediaViewController.swift */; }; + 418B144D20179C75000447AA /* VLCTabBarCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 418B144C20179C74000447AA /* VLCTabBarCoordinator.swift */; }; + 418B145020179CB9000447AA /* LayoutAnchorContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 418B144F20179CB9000447AA /* LayoutAnchorContainer.swift */; }; + 418B145620179DF2000447AA /* VLCMediaData+VLCDragAndDrop.swift in Sources */ = {isa = PBXBuildFile; fileRef = 418B145520179DF2000447AA /* VLCMediaData+VLCDragAndDrop.swift */; }; + 418B145920179E50000447AA /* VLCDragAndDropManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 418B145820179E50000447AA /* VLCDragAndDropManager.swift */; }; + 4195747D206A92ED00393A42 /* RemoteNetworkDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4195747C206A92ED00393A42 /* RemoteNetworkDataSource.swift */; }; + 419794C3206B9E7A009E081A /* MediaDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 419794C2206B9E7A009E081A /* MediaDataSource.swift */; }; 419A2C661F37A4B70069D224 /* VLCStringsForLocalization.m in Sources */ = {isa = PBXBuildFile; fileRef = 419A2C651F37A4B70069D224 /* VLCStringsForLocalization.m */; }; 419A2C671F37A4B70069D224 /* VLCStringsForLocalization.m in Sources */ = {isa = PBXBuildFile; fileRef = 419A2C651F37A4B70069D224 /* VLCStringsForLocalization.m */; }; 419A2C681F37A4B70069D224 /* VLCStringsForLocalization.m in Sources */ = {isa = PBXBuildFile; fileRef = 419A2C651F37A4B70069D224 /* VLCStringsForLocalization.m */; }; @@ -36,7 +45,6 @@ 41B93C011A53833B00102E8B /* VLCProgressView.m in Sources */ = {isa = PBXBuildFile; fileRef = 41B93C001A53833B00102E8B /* VLCProgressView.m */; }; 41B93C051A53835300102E8B /* VLCCloudServiceCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 41B93C031A53835300102E8B /* VLCCloudServiceCell.m */; }; 41B93C081A53853B00102E8B /* VLCCloudServiceCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 41B93C071A53853B00102E8B /* VLCCloudServiceCell.xib */; }; - 41BBF9101FC31A8E003A72CB /* VLCDragAndDropManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 41BBF90F1FC31A8E003A72CB /* VLCDragAndDropManager.swift */; }; 41CD695C1A29D72600E60BCE /* VLCBoxController.m in Sources */ = {isa = PBXBuildFile; fileRef = 41CD69591A29D72600E60BCE /* VLCBoxController.m */; }; 41CD695D1A29D72600E60BCE /* VLCBoxTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 41CD695B1A29D72600E60BCE /* VLCBoxTableViewController.m */; }; 41EB91D71F7BE6F500821AA5 /* VLCRemoteControlService.m in Sources */ = {isa = PBXBuildFile; fileRef = 417D7F5F1F7BA26200DDF36A /* VLCRemoteControlService.m */; }; @@ -138,7 +146,7 @@ 7D3CF7C42050265B00FA0C1F /* VLCFirstStepsFifthPageViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 7DC19B031868D1C400810BF7 /* VLCFirstStepsFifthPageViewController.m */; }; 7D3CF7C52050265B00FA0C1F /* VLCNetworkServerBrowserFTP.m in Sources */ = {isa = PBXBuildFile; fileRef = DD3EFEF61BDEBCE500B68579 /* VLCNetworkServerBrowserFTP.m */; }; 7D3CF7C62050265B00FA0C1F /* VLCFrostedGlasView.m in Sources */ = {isa = PBXBuildFile; fileRef = 9BADAF44185FBD9D00108BD8 /* VLCFrostedGlasView.m */; }; - 7D3CF7C72050265B00FA0C1F /* VLCDragAndDropManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 41BBF90F1FC31A8E003A72CB /* VLCDragAndDropManager.swift */; }; + 7D3CF7C72050265B00FA0C1F /* (null) in Sources */ = {isa = PBXBuildFile; }; 7D3CF7C82050265B00FA0C1F /* VLCTimeNavigationTitleView.m in Sources */ = {isa = PBXBuildFile; fileRef = DDC10BE31AEE8EA700890DC3 /* VLCTimeNavigationTitleView.m */; }; 7D3CF7C92050265B00FA0C1F /* VLCNetworkLoginViewFieldCell.m in Sources */ = {isa = PBXBuildFile; fileRef = DD870E991CEF929A00BBD4FE /* VLCNetworkLoginViewFieldCell.m */; }; 7D3CF7CA2050265B00FA0C1F /* VLCNetworkImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = DD3EAC031BE153B4003668DA /* VLCNetworkImageView.m */; }; @@ -460,7 +468,6 @@ 9BADAF45185FBD9D00108BD8 /* VLCFrostedGlasView.m in Sources */ = {isa = PBXBuildFile; fileRef = 9BADAF44185FBD9D00108BD8 /* VLCFrostedGlasView.m */; }; 9BE4D1CE183D76950006346C /* VLCCloudStorageTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 7D3784B0183A990F009EE944 /* VLCCloudStorageTableViewCell.m */; }; A79246C8170F11DF0036AAF2 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = A79246C6170F11DF0036AAF2 /* Localizable.strings */; }; - B262D8FBA3AAD4441B38B401 /* libPods-VLC-iOS-no-watch.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DD533B1D45EEA70099433D8 /* libPods-VLC-iOS-no-watch.a */; }; CC1BBC461704938300A20CBF /* libiconv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = CC1BBC451704938300A20CBF /* libiconv.dylib */; }; CC1BBC4C1704939B00A20CBF /* libsqlite3.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = CC1BBC4B1704939B00A20CBF /* libsqlite3.dylib */; }; CC1BBC4E170493A300A20CBF /* libbz2.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = CC1BBC4D170493A300A20CBF /* libbz2.dylib */; }; @@ -589,6 +596,7 @@ DDF908E01CF4E04A00108B70 /* VLCNetworkLoginDataSourceSavedLogins.m in Sources */ = {isa = PBXBuildFile; fileRef = DDF908DF1CF4E04A00108B70 /* VLCNetworkLoginDataSourceSavedLogins.m */; }; DDF908E41CFCD97400108B70 /* VLCNetworkLoginDataSourceProtocol.m in Sources */ = {isa = PBXBuildFile; fileRef = DDF908E31CFCD97400108B70 /* VLCNetworkLoginDataSourceProtocol.m */; }; E0C04F951A25B4410080331A /* VLCDocumentPickerController.m in Sources */ = {isa = PBXBuildFile; fileRef = E0C04F941A25B4410080331A /* VLCDocumentPickerController.m */; }; + F05B5506E9C799574711E71B /* libPods-VLC-iOS-no-watch.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DD533B1D45EEA70099433D8 /* libPods-VLC-iOS-no-watch.a */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -737,10 +745,15 @@ 3C12F87F27BDCE3D0A58354E /* Pods-VLC-iOS-no-watch-Debug.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-VLC-iOS-no-watch-Debug.debug.xcconfig"; path = "Pods/Target Support Files/Pods-VLC-iOS-no-watch-Debug/Pods-VLC-iOS-no-watch-Debug.debug.xcconfig"; sourceTree = "<group>"; }; 3DD533B1D45EEA70099433D8 /* libPods-VLC-iOS-no-watch.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-VLC-iOS-no-watch.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 402E6F0E5362B530B7909338 /* libPods-VLC-iOS.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-VLC-iOS.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + 41251ECB1FD0C5C100099110 /* VLC-iOS-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "VLC-iOS-Bridging-Header.h"; sourceTree = SOURCE_ROOT; }; + 41251ECE1FD0CF7900099110 /* AppCoordinator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = AppCoordinator.swift; path = SharedSources/Coordinators/AppCoordinator.swift; sourceTree = SOURCE_ROOT; }; 41273A391A955C4100A2EF77 /* VLCMigrationViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VLCMigrationViewController.h; path = Sources/VLCMigrationViewController.h; sourceTree = SOURCE_ROOT; }; 41273A3A1A955C4100A2EF77 /* VLCMigrationViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = VLCMigrationViewController.m; path = Sources/VLCMigrationViewController.m; sourceTree = SOURCE_ROOT; }; 41273A3B1A955C4100A2EF77 /* VLCMigrationViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = VLCMigrationViewController.xib; path = Sources/VLCMigrationViewController.xib; sourceTree = SOURCE_ROOT; }; 412BE7521FC4947400ACCC42 /* VLCMediaData+VLCDragAndDrop.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = "VLCMediaData+VLCDragAndDrop.swift"; path = "Sources/VLCMediaData+VLCDragAndDrop.swift"; sourceTree = SOURCE_ROOT; }; + 413EC986201A329D00BF412F /* SortOption.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = SortOption.swift; path = SharedSources/Coordinators/SortOption.swift; sourceTree = SOURCE_ROOT; }; + 413EC98A201B4F2B00BF412F /* PresentationTheme.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PresentationTheme.swift; sourceTree = "<group>"; }; + 414396C12023316C005E3FAF /* AppearanceManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = AppearanceManager.swift; path = Sources/AppearanceManager.swift; sourceTree = SOURCE_ROOT; }; 4152F1611FEF19BD00F1908B /* KeychainCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = KeychainCoordinator.swift; path = Sources/KeychainCoordinator.swift; sourceTree = "<group>"; }; 416DEFF51FEEA76A00F4FC59 /* LayoutAnchorContainer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = LayoutAnchorContainer.swift; path = Sources/LayoutAnchorContainer.swift; sourceTree = "<group>"; }; 4171D34E18A2C19000A16EF9 /* VLCFolderCollectionViewFlowLayout.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VLCFolderCollectionViewFlowLayout.h; path = Sources/VLCFolderCollectionViewFlowLayout.h; sourceTree = SOURCE_ROOT; }; @@ -800,6 +813,13 @@ 4184AA131A5492070063DF5A /* VLCCloudStorageController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VLCCloudStorageController.h; path = Sources/VLCCloudStorageController.h; sourceTree = SOURCE_ROOT; }; 4184AA141A5492070063DF5A /* VLCCloudStorageController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = VLCCloudStorageController.m; path = Sources/VLCCloudStorageController.m; sourceTree = SOURCE_ROOT; }; 4187112A1F78F87200317B1A /* VLC_for_iOSTestVideoCodecs.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = VLC_for_iOSTestVideoCodecs.m; sourceTree = "<group>"; }; + 418B144620179C00000447AA /* MediaViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = MediaViewController.swift; path = Sources/MediaViewController.swift; sourceTree = SOURCE_ROOT; }; + 418B144C20179C74000447AA /* VLCTabBarCoordinator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = VLCTabBarCoordinator.swift; path = Sources/VLCTabBarCoordinator.swift; sourceTree = SOURCE_ROOT; }; + 418B144F20179CB9000447AA /* LayoutAnchorContainer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = LayoutAnchorContainer.swift; path = Sources/LayoutAnchorContainer.swift; sourceTree = "<group>"; }; + 418B145520179DF2000447AA /* VLCMediaData+VLCDragAndDrop.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "VLCMediaData+VLCDragAndDrop.swift"; path = "Sources/VLCMediaData+VLCDragAndDrop.swift"; sourceTree = "<group>"; }; + 418B145820179E50000447AA /* VLCDragAndDropManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = VLCDragAndDropManager.swift; path = Sources/VLCDragAndDropManager.swift; sourceTree = "<group>"; }; + 4195747C206A92ED00393A42 /* RemoteNetworkDataSource.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RemoteNetworkDataSource.swift; sourceTree = "<group>"; }; + 419794C2206B9E7A009E081A /* MediaDataSource.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MediaDataSource.swift; sourceTree = "<group>"; }; 419A2C651F37A4B70069D224 /* VLCStringsForLocalization.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = VLCStringsForLocalization.m; sourceTree = "<group>"; }; 419D7F041F54176900AF69A2 /* VLCTimeNavigationTitleView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = VLCTimeNavigationTitleView.xib; path = Resources/VLCTimeNavigationTitleView.xib; sourceTree = SOURCE_ROOT; }; 41B0BC861F73ED7D0063BA26 /* VLC for iOSUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "VLC for iOSUITests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -811,8 +831,6 @@ 41B93C031A53835300102E8B /* VLCCloudServiceCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = VLCCloudServiceCell.m; path = Sources/VLCCloudServiceCell.m; sourceTree = SOURCE_ROOT; }; 41B93C071A53853B00102E8B /* VLCCloudServiceCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = VLCCloudServiceCell.xib; path = Resources/VLCCloudServiceCell.xib; sourceTree = SOURCE_ROOT; }; 41BBDCBC1F3BAD2E00B89A9C /* Base */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Base; path = Base.lproj/Localizable.strings; sourceTree = "<group>"; }; - 41BBF90E1FC31A8E003A72CB /* VLC-iOS-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "VLC-iOS-Bridging-Header.h"; sourceTree = "<group>"; }; - 41BBF90F1FC31A8E003A72CB /* VLCDragAndDropManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = VLCDragAndDropManager.swift; path = SharedSources/VLCDragAndDropManager.swift; sourceTree = SOURCE_ROOT; }; 41CD69571A29D72600E60BCE /* VLCBoxConstants.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VLCBoxConstants.h; path = Sources/VLCBoxConstants.h; sourceTree = SOURCE_ROOT; }; 41CD69581A29D72600E60BCE /* VLCBoxController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VLCBoxController.h; path = Sources/VLCBoxController.h; sourceTree = SOURCE_ROOT; }; 41CD69591A29D72600E60BCE /* VLCBoxController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = VLCBoxController.m; path = Sources/VLCBoxController.m; sourceTree = SOURCE_ROOT; }; @@ -1496,7 +1514,7 @@ 7D3CF84A2050265B00FA0C1F /* Foundation.framework in Frameworks */, 7D3CF84B2050265B00FA0C1F /* CoreGraphics.framework in Frameworks */, 7D3CF84C2050265B00FA0C1F /* libPods-VLC-iOS.a in Frameworks */, - B262D8FBA3AAD4441B38B401 /* libPods-VLC-iOS-no-watch.a in Frameworks */, + F05B5506E9C799574711E71B /* libPods-VLC-iOS-no-watch.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1585,10 +1603,23 @@ DD35678F1B6761CD00338947 /* WatchConnectivity.framework */, DD35678B1B67619700338947 /* WatchKit.framework */, DD3567891B67618F00338947 /* CoreData.framework */, + 416DEFF51FEEA76A00F4FC59 /* LayoutAnchorContainer.swift */, + 412BE7521FC4947400ACCC42 /* VLCMediaData+VLCDragAndDrop.swift */, ); name = "Recovered References"; sourceTree = "<group>"; }; + 415163B01FD0AEC700161354 /* Coordinators */ = { + isa = PBXGroup; + children = ( + 41251ECE1FD0CF7900099110 /* AppCoordinator.swift */, + 418B144C20179C74000447AA /* VLCTabBarCoordinator.swift */, + 413EC986201A329D00BF412F /* SortOption.swift */, + 414396C12023316C005E3FAF /* AppearanceManager.swift */, + ); + path = Coordinators; + sourceTree = "<group>"; + }; 41B0BC871F73ED7D0063BA26 /* VLC for iOSUITests */ = { isa = PBXGroup; children = ( @@ -1751,6 +1782,7 @@ DD3EFEEA1BDEBA3800B68579 /* VLCNetworkServerBrowserViewController.m */, DD3EFEEB1BDEBA3800B68579 /* VLCServerListViewController.h */, DD3EFEEC1BDEBA3800B68579 /* VLCServerListViewController.m */, + 4195747C206A92ED00393A42 /* RemoteNetworkDataSource.swift */, ); name = "Local Network Connectivity"; path = Sources/LocalNetworkConnectivity; @@ -1864,6 +1896,9 @@ 7D5F7AB81752658E006CCCFA /* Everything Playlist */ = { isa = PBXGroup; children = ( + 418B145520179DF2000447AA /* VLCMediaData+VLCDragAndDrop.swift */, + 418B145820179E50000447AA /* VLCDragAndDropManager.swift */, + 41251ECB1FD0C5C100099110 /* VLC-iOS-Bridging-Header.h */, 4171D34E18A2C19000A16EF9 /* VLCFolderCollectionViewFlowLayout.h */, 4171D34F18A2C19000A16EF9 /* VLCFolderCollectionViewFlowLayout.m */, 7D378493183A98D1009EE944 /* VLCPlaylistCollectionViewCell.h */, @@ -1878,9 +1913,6 @@ 41F5C0771F41ED55005EB9CB /* VLCLibrarySearchDisplayDataSource.m */, 41F5C0791F42E567005EB9CB /* VLCMediaDataSource.h */, 41F5C07A1F42E567005EB9CB /* VLCMediaDataSource.m */, - 41BBF90F1FC31A8E003A72CB /* VLCDragAndDropManager.swift */, - 41BBF90E1FC31A8E003A72CB /* VLC-iOS-Bridging-Header.h */, - 412BE7521FC4947400ACCC42 /* VLCMediaData+VLCDragAndDrop.swift */, ); name = "Everything Playlist"; sourceTree = "<group>"; @@ -2072,6 +2104,7 @@ 7D94FCE416DE7D1000F2623B /* iOS specific classes */ = { isa = PBXGroup; children = ( + 415163B01FD0AEC700161354 /* Coordinators */, 41273A391A955C4100A2EF77 /* VLCMigrationViewController.h */, 41273A3A1A955C4100A2EF77 /* VLCMigrationViewController.m */, 7D6B08BB174A72A900A05173 /* VLCConstants.h */, @@ -2265,10 +2298,12 @@ 7DEC8BE11BD686FA006E1093 /* Library */ = { isa = PBXGroup; children = ( + 418B144620179C00000447AA /* MediaViewController.swift */, 7D37849C183A98DD009EE944 /* VLCThumbnailsCache.h */, 7D37849D183A98DD009EE944 /* VLCThumbnailsCache.m */, DD7110EE1AF38B2B00854776 /* MLMediaLibrary+playlist.h */, DD7110EF1AF38B2B00854776 /* MLMediaLibrary+playlist.m */, + 419794C2206B9E7A009E081A /* MediaDataSource.swift */, ); name = Library; sourceTree = "<group>"; @@ -2284,6 +2319,7 @@ DD13A37A1BEE2FAA00A35554 /* VLCMaskView.m */, DD4089F31BF6556F0022745E /* VLCFullWidthCollectionViewFlowLayout.h */, DD4089F41BF6556F0022745E /* VLCFullWidthCollectionViewFlowLayout.m */, + 413EC98A201B4F2B00BF412F /* PresentationTheme.swift */, ); name = "UI Elements"; sourceTree = "<group>"; @@ -2493,6 +2529,7 @@ A7C3025A175A538700AD4388 /* Extensions */ = { isa = PBXGroup; children = ( + 418B144F20179CB9000447AA /* LayoutAnchorContainer.swift */, 7D3784C4183A9972009EE944 /* NSString+SupportedMedia.h */, 7D3784C5183A9972009EE944 /* NSString+SupportedMedia.m */, 7D3784C6183A9972009EE944 /* UIDevice+VLC.h */, @@ -2503,7 +2540,6 @@ 7DF9352E1958AB0600E60FD4 /* UIColor+Presets.m */, 7DEBF37D1C076ECE007A4043 /* NSString+Locale.h */, 7DEBF37E1C076EE8007A4043 /* NSString+Locale.m */, - 416DEFF51FEEA76A00F4FC59 /* LayoutAnchorContainer.swift */, ); name = Extensions; sourceTree = "<group>"; @@ -2951,6 +2987,7 @@ 7D13293C1BA1F10100BE647E = { CreatedOnToolsVersion = 7.1; DevelopmentTeam = 75GAHG3SZQ; + LastSwiftMigration = 0920; SystemCapabilities = { com.apple.BackgroundModes.appletvos = { enabled = 1; @@ -2969,7 +3006,6 @@ 7D94FCDA16DE7D1000F2623B = { DevelopmentTeam = 75GAHG3SZQ; LastSwiftMigration = 0920; - ProvisioningStyle = Automatic; SystemCapabilities = { com.apple.ApplicationGroups.iOS = { enabled = 1; @@ -2985,6 +3021,7 @@ DD3567631B6760BF00338947 = { CreatedOnToolsVersion = 7.0; DevelopmentTeam = 75GAHG3SZQ; + LastSwiftMigration = 0920; SystemCapabilities = { com.apple.ApplicationGroups.iOS = { enabled = 1; @@ -3799,7 +3836,7 @@ 7D3CF7C42050265B00FA0C1F /* VLCFirstStepsFifthPageViewController.m in Sources */, 7D3CF7C52050265B00FA0C1F /* VLCNetworkServerBrowserFTP.m in Sources */, 7D3CF7C62050265B00FA0C1F /* VLCFrostedGlasView.m in Sources */, - 7D3CF7C72050265B00FA0C1F /* VLCDragAndDropManager.swift in Sources */, + 7D3CF7C72050265B00FA0C1F /* (null) in Sources */, 7D3CF7C82050265B00FA0C1F /* VLCTimeNavigationTitleView.m in Sources */, 7D3CF7C92050265B00FA0C1F /* VLCNetworkLoginViewFieldCell.m in Sources */, 7D3CF7CA2050265B00FA0C1F /* VLCNetworkImageView.m in Sources */, @@ -3912,8 +3949,10 @@ files = ( 4144C4661A0ED6C700918C89 /* Reachability.m in Sources */, DD846BDF1D1FCCCD00699D17 /* VLCNetworkLoginDataSource.m in Sources */, + 41251ED01FD0CF7900099110 /* AppCoordinator.swift in Sources */, 4184AA151A5492070063DF5A /* VLCCloudStorageController.m in Sources */, 9BE4D1CE183D76950006346C /* VLCCloudStorageTableViewCell.m in Sources */, + 413EC98B201B4F2C00BF412F /* PresentationTheme.swift in Sources */, 41F5C07B1F42E567005EB9CB /* VLCMediaDataSource.m in Sources */, DD1CB0321BB9E005006EDDE6 /* VLCMovieViewControlPanelView.m in Sources */, DDF908D01CF4CCAA00108B70 /* VLCNetworkLoginViewButtonCell.m in Sources */, @@ -3932,16 +3971,19 @@ 7DC19B051868D1C400810BF7 /* VLCFirstStepsFifthPageViewController.m in Sources */, DD3EFF311BDEBCE500B68579 /* VLCNetworkServerBrowserFTP.m in Sources */, 9BADAF45185FBD9D00108BD8 /* VLCFrostedGlasView.m in Sources */, - 41BBF9101FC31A8E003A72CB /* VLCDragAndDropManager.swift in Sources */, DDC10BE41AEE8EA700890DC3 /* VLCTimeNavigationTitleView.m in Sources */, DD870E9A1CEF929A00BBD4FE /* VLCNetworkLoginViewFieldCell.m in Sources */, + 418B145620179DF2000447AA /* VLCMediaData+VLCDragAndDrop.swift in Sources */, + 4195747D206A92ED00393A42 /* RemoteNetworkDataSource.swift in Sources */, DD3EAC041BE153B4003668DA /* VLCNetworkImageView.m in Sources */, E0C04F951A25B4410080331A /* VLCDocumentPickerController.m in Sources */, DD2789E21B67A7BE00CED769 /* VLCWatchCommunication.m in Sources */, DDF908E01CF4E04A00108B70 /* VLCNetworkLoginDataSourceSavedLogins.m in Sources */, DD3EFF351BDEBCE500B68579 /* VLCLocalNetworkServiceBrowserNetService.m in Sources */, + 413EC987201A329D00BF412F /* SortOption.swift in Sources */, 41B93C011A53833B00102E8B /* VLCProgressView.m in Sources */, 417CDA231A48D1F300D9ACE7 /* VLCCloudServicesTableViewController.m in Sources */, + 418B145920179E50000447AA /* VLCDragAndDropManager.swift in Sources */, 7D168F7418D4A33F003FAF59 /* UIImage+Blur.m in Sources */, 7DC19ADF1868C7BB00810BF7 /* VLCFirstStepsViewController.m in Sources */, DD3EFF331BDEBCE500B68579 /* VLCLocalNetworkServiceBrowserMediaDiscoverer.m in Sources */, @@ -3958,6 +4000,7 @@ 41F9BC7C1F4F20E400268461 /* VLCTrackSelectorView.m in Sources */, 7D378499183A98D1009EE944 /* VLCPlaylistCollectionViewCell.m in Sources */, DD8F84311B00EB3B0009138A /* VLCPlaybackController+MediaLibrary.m in Sources */, + 418B144720179C00000447AA /* MediaViewController.swift in Sources */, 41EB91DD1F7BFF8500821AA5 /* VLCMetadata.m in Sources */, DD3EFF551BDEBCE500B68579 /* VLCLocalNetworkServiceBrowserDSM.m in Sources */, 7D37849A183A98D1009EE944 /* VLCPlaylistTableViewCell.m in Sources */, @@ -3978,6 +4021,7 @@ 41F5C0781F41ED55005EB9CB /* VLCLibrarySearchDisplayDataSource.m in Sources */, 7D50903218F41C7900180139 /* VLCAlertView.m in Sources */, 7DBBF182183AB3B80009A339 /* VLCAppDelegate.m in Sources */, + 418B145020179CB9000447AA /* LayoutAnchorContainer.swift in Sources */, 7D3784C0183A9938009EE944 /* VLCLinearProgressIndicator.m in Sources */, DD3EA6311AF50CFE007FF096 /* VLCWatchMessage.m in Sources */, 41CD695D1A29D72600E60BCE /* VLCBoxTableViewController.m in Sources */, @@ -3990,12 +4034,13 @@ 7D3784C8183A9972009EE944 /* NSString+SupportedMedia.m in Sources */, 417E68B91F321EFF00DB9BB2 /* VLCActivityViewControllerVendor.m in Sources */, DD3EFF5B1BDEBCE500B68579 /* VLCNetworkServerBrowserUPnP.m in Sources */, + 419794C3206B9E7A009E081A /* MediaDataSource.swift in Sources */, + 418B144D20179C75000447AA /* VLCTabBarCoordinator.swift in Sources */, DD3EABF81BE14BD6003668DA /* BasicUPnPDevice+VLC.m in Sources */, DD3EAC091BE2192A003668DA /* VLCServerBrowsingController.m in Sources */, 7D3784C9183A9972009EE944 /* UIDevice+VLC.m in Sources */, DDEAECCD1BDECCB800756C83 /* VLCNetworkListViewController.m in Sources */, 7D3784E9183A9A15009EE944 /* main.m in Sources */, - 416DEFF61FEEA76A00F4FC59 /* LayoutAnchorContainer.swift in Sources */, 7D30F3C2183AB24C00FFC021 /* VLCHTTPConnection.m in Sources */, DD3EFF371BDEBCE500B68579 /* VLCLocalNetworkServiceNetService.m in Sources */, DD3EFF511BDEBCE500B68579 /* VLCPlexWebAPI.m in Sources */, @@ -4012,7 +4057,6 @@ 7D30F3CA183AB27A00FFC021 /* VLCDownloadViewController.m in Sources */, DDEAECC61BDEC79D00756C83 /* VLCLocalNetworkServiceBrowserSAP.m in Sources */, DD3EFF491BDEBCE500B68579 /* VLCLocalNetworkServiceBrowserPlex.m in Sources */, - 412BE7531FC4947400ACCC42 /* VLCMediaData+VLCDragAndDrop.swift in Sources */, 7D30F3CD183AB29300FFC021 /* VLCMenuTableViewController.m in Sources */, DD3EFF571BDEBCE500B68579 /* VLCLocalNetworkServiceBrowserUPnP.m in Sources */, 7D9CB9DC1A4C55EF00BB74B4 /* VLCPlaybackNavigationController.m in Sources */, @@ -4024,6 +4068,7 @@ DD3EFF591BDEBCE500B68579 /* VLCLocalNetworkServiceUPnP.m in Sources */, 7D30F3D7183AB2F100FFC021 /* VLCNetworkListCell.m in Sources */, 7D1052EE1A4DCD1E00295F08 /* VLCOneDriveController.m in Sources */, + 414396C22023316C005E3FAF /* AppearanceManager.swift in Sources */, 7DAE0C371B2EF85B00C53996 /* VLCSidebarController.m in Sources */, 7D30F3DC183AB2F900FFC021 /* VLCNetworkLoginViewController.m in Sources */, 419A2C661F37A4B70069D224 /* VLCStringsForLocalization.m in Sources */, @@ -4404,6 +4449,8 @@ PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE = ""; SDKROOT = appletvos; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 3.0; TARGETED_DEVICE_FAMILY = 3; TVOS_DEPLOYMENT_TARGET = 10.2; }; @@ -4445,6 +4492,7 @@ PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE = ""; SDKROOT = appletvos; + SWIFT_VERSION = 3.0; TARGETED_DEVICE_FAMILY = 3; TVOS_DEPLOYMENT_TARGET = 10.2; }; @@ -4486,6 +4534,7 @@ PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE = ""; SDKROOT = appletvos; + SWIFT_VERSION = 3.0; TARGETED_DEVICE_FAMILY = 3; TVOS_DEPLOYMENT_TARGET = 10.2; }; @@ -4533,6 +4582,7 @@ PROVISIONING_PROFILE = ""; SKIP_INSTALL = NO; SWIFT_OBJC_BRIDGING_HEADER = "VLC-iOS-Bridging-Header.h"; + SWIFT_VERSION = 4.0; VALID_ARCHS = "arm64 armv7 armv7s"; }; name = Debug; @@ -4579,6 +4629,7 @@ "PROVISIONING_PROFILE[sdk=iphoneos*]" = ""; SKIP_INSTALL = NO; SWIFT_OBJC_BRIDGING_HEADER = "VLC-iOS-Bridging-Header.h"; + SWIFT_VERSION = 4.0; VALID_ARCHS = "arm64 armv7 armv7s"; }; name = Release; @@ -4662,7 +4713,6 @@ OTHER_LDFLAGS = "-ObjC"; PRODUCT_MODULE_NAME = VLC_iOS; SDKROOT = iphoneos; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 4.0; TARGETED_DEVICE_FAMILY = "1,2"; VALID_ARCHS = "arm64 armv7 armv7s"; @@ -4725,7 +4775,6 @@ EXCLUDED_SOURCE_FILE_NAMES = ""; GCC_C_LANGUAGE_STANDARD = gnu11; GCC_ENABLE_CPP_EXCEPTIONS = YES; - GCC_OPTIMIZATION_LEVEL = 0; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "Sources/VLC for iOS-Prefix.pch"; INFOPLIST_FILE = "Sources/VLC for iOS-Info.plist"; @@ -4742,6 +4791,7 @@ PROVISIONING_PROFILE = ""; SKIP_INSTALL = NO; SWIFT_OBJC_BRIDGING_HEADER = "VLC-iOS-Bridging-Header.h"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; VALID_ARCHS = "arm64 armv7 armv7s"; }; name = Debug; @@ -4787,6 +4837,7 @@ "PROVISIONING_PROFILE[sdk=iphoneos*]" = ""; SKIP_INSTALL = NO; SWIFT_OBJC_BRIDGING_HEADER = "VLC-iOS-Bridging-Header.h"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; VALID_ARCHS = "arm64 armv7 armv7s"; }; name = Release; @@ -4864,6 +4915,8 @@ "PROVISIONING_PROFILE[sdk=iphoneos*]" = ""; SKIP_INSTALL = NO; SWIFT_OBJC_BRIDGING_HEADER = "VLC-iOS-Bridging-Header.h"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 4.0; VALID_ARCHS = "arm64 armv7 armv7s"; }; name = Distribution; @@ -4893,12 +4946,15 @@ GCC_WARN_UNUSED_FUNCTION = YES; IBSC_MODULE = watchkitapp_Extension; INFOPLIST_FILE = "VLC WatchKit Native/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; MTL_ENABLE_DEBUG_INFO = YES; PRODUCT_BUNDLE_IDENTIFIER = "${BUNDLE_IDENTIFIER_PREFIX}.vlc-ios.watchkitapp"; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE = ""; SDKROOT = watchos; SKIP_INSTALL = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 3.0; TARGETED_DEVICE_FAMILY = 4; WATCHOS_DEPLOYMENT_TARGET = 2.0; }; @@ -4930,12 +4986,14 @@ GCC_WARN_UNUSED_FUNCTION = YES; IBSC_MODULE = watchkitapp_Extension; INFOPLIST_FILE = "VLC WatchKit Native/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; MTL_ENABLE_DEBUG_INFO = NO; PRODUCT_BUNDLE_IDENTIFIER = "${BUNDLE_IDENTIFIER_PREFIX}.vlc-ios.watchkitapp"; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE = ""; SDKROOT = watchos; SKIP_INSTALL = YES; + SWIFT_VERSION = 3.0; TARGETED_DEVICE_FAMILY = 4; WATCHOS_DEPLOYMENT_TARGET = 2.0; }; @@ -4967,12 +5025,14 @@ GCC_WARN_UNUSED_FUNCTION = YES; IBSC_MODULE = watchkitapp_Extension; INFOPLIST_FILE = "VLC WatchKit Native/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; MTL_ENABLE_DEBUG_INFO = NO; PRODUCT_BUNDLE_IDENTIFIER = "${BUNDLE_IDENTIFIER_PREFIX}.vlc-ios.watchkitapp"; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE = ""; SDKROOT = watchos; SKIP_INSTALL = YES; + SWIFT_VERSION = 3.0; TARGETED_DEVICE_FAMILY = 4; WATCHOS_DEPLOYMENT_TARGET = 2.0; }; diff --git a/vlc-ios/Images.xcassets/cloudServices/Box.imageset/Contents.json b/vlc-ios/Images.xcassets/cloudServices/Box.imageset/Contents.json index 4cc679d1445078ef32d4de5dcfd7c099e2bc6e90..f108647b87046ed435a4f6436b0c8ec29998ec37 100644 --- a/vlc-ios/Images.xcassets/cloudServices/Box.imageset/Contents.json +++ b/vlc-ios/Images.xcassets/cloudServices/Box.imageset/Contents.json @@ -2,22 +2,25 @@ "images" : [ { "idiom" : "universal", - "scale" : "1x", - "filename" : "Box.png" + "filename" : "Box.png", + "scale" : "1x" }, { "idiom" : "universal", - "scale" : "2x", - "filename" : "Box@2x.png" + "filename" : "Box@2x.png", + "scale" : "2x" }, { "idiom" : "universal", - "scale" : "3x", - "filename" : "Box@3x.png" + "filename" : "Box@3x.png", + "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" + }, + "properties" : { + "template-rendering-intent" : "template" } } \ No newline at end of file diff --git a/vlc-ios/Images.xcassets/cloudServices/Drive.imageset/Contents.json b/vlc-ios/Images.xcassets/cloudServices/Drive.imageset/Contents.json index 11647bc26d69fca34b2b068c71f9075e40835f21..a26fa9211f49e8b99eb18c6fed5a747341a2f02b 100644 --- a/vlc-ios/Images.xcassets/cloudServices/Drive.imageset/Contents.json +++ b/vlc-ios/Images.xcassets/cloudServices/Drive.imageset/Contents.json @@ -2,22 +2,25 @@ "images" : [ { "idiom" : "universal", - "scale" : "1x", - "filename" : "Drive.png" + "filename" : "Drive.png", + "scale" : "1x" }, { "idiom" : "universal", - "scale" : "2x", - "filename" : "Drive@2x.png" + "filename" : "Drive@2x.png", + "scale" : "2x" }, { "idiom" : "universal", - "scale" : "3x", - "filename" : "Drive@3x.png" + "filename" : "Drive@3x.png", + "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" + }, + "properties" : { + "template-rendering-intent" : "template" } } \ No newline at end of file diff --git a/vlc-ios/Images.xcassets/cloudServices/DriveWhite.imageset/Contents.json b/vlc-ios/Images.xcassets/cloudServices/DriveWhite.imageset/Contents.json index 9756505a3b643b4004ca42dd536ffffcd7ad6039..bf7433c400f38628049c3579e9b5f6cc0ec09a5a 100644 --- a/vlc-ios/Images.xcassets/cloudServices/DriveWhite.imageset/Contents.json +++ b/vlc-ios/Images.xcassets/cloudServices/DriveWhite.imageset/Contents.json @@ -2,22 +2,25 @@ "images" : [ { "idiom" : "universal", - "scale" : "1x", - "filename" : "DriveWhite.png" + "filename" : "DriveWhite.png", + "scale" : "1x" }, { "idiom" : "universal", - "scale" : "2x", - "filename" : "DriveWhite@2x.png" + "filename" : "DriveWhite@2x.png", + "scale" : "2x" }, { "idiom" : "universal", - "scale" : "3x", - "filename" : "DriveWhite@3x.png" + "filename" : "DriveWhite@3x.png", + "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" + }, + "properties" : { + "template-rendering-intent" : "template" } } \ No newline at end of file diff --git a/vlc-ios/Images.xcassets/cloudServices/Dropbox.imageset/Contents.json b/vlc-ios/Images.xcassets/cloudServices/Dropbox.imageset/Contents.json index 711ac31fb0c32d0fb5f862e5007b2133ec7a0fff..bc72bc218663694974ab6463485212a45816ea91 100644 --- a/vlc-ios/Images.xcassets/cloudServices/Dropbox.imageset/Contents.json +++ b/vlc-ios/Images.xcassets/cloudServices/Dropbox.imageset/Contents.json @@ -2,22 +2,25 @@ "images" : [ { "idiom" : "universal", - "scale" : "1x", - "filename" : "Dropbox.png" + "filename" : "Dropbox.png", + "scale" : "1x" }, { "idiom" : "universal", - "scale" : "2x", - "filename" : "Dropbox@2x.png" + "filename" : "Dropbox@2x.png", + "scale" : "2x" }, { "idiom" : "universal", - "scale" : "3x", - "filename" : "Dropbox@3x.png" + "filename" : "Dropbox@3x.png", + "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" + }, + "properties" : { + "template-rendering-intent" : "template" } } \ No newline at end of file diff --git a/vlc-ios/Images.xcassets/cloudServices/OneDrive.imageset/Contents.json b/vlc-ios/Images.xcassets/cloudServices/OneDrive.imageset/Contents.json index 209fa058861ba1f813e1c7a51536f90dab485e0d..c9ab98cc030f184c92b7f52e4c1c57eaef6427fe 100644 --- a/vlc-ios/Images.xcassets/cloudServices/OneDrive.imageset/Contents.json +++ b/vlc-ios/Images.xcassets/cloudServices/OneDrive.imageset/Contents.json @@ -2,22 +2,25 @@ "images" : [ { "idiom" : "universal", - "scale" : "1x", - "filename" : "OneDrive.png" + "filename" : "OneDrive.png", + "scale" : "1x" }, { "idiom" : "universal", - "scale" : "2x", - "filename" : "OneDrive@2x.png" + "filename" : "OneDrive@2x.png", + "scale" : "2x" }, { "idiom" : "universal", - "scale" : "3x", - "filename" : "OneDrive@3x.png" + "filename" : "OneDrive@3x.png", + "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" + }, + "properties" : { + "template-rendering-intent" : "template" } } \ No newline at end of file diff --git a/vlc-ios/Images.xcassets/cloudServices/OneDriveWhite.imageset/Contents.json b/vlc-ios/Images.xcassets/cloudServices/OneDriveWhite.imageset/Contents.json index 37ba992a5911681108cebbc6ef4642d80cc299dc..361ecaeab4e99e15eaa79a45950c11f601301461 100644 --- a/vlc-ios/Images.xcassets/cloudServices/OneDriveWhite.imageset/Contents.json +++ b/vlc-ios/Images.xcassets/cloudServices/OneDriveWhite.imageset/Contents.json @@ -2,22 +2,25 @@ "images" : [ { "idiom" : "universal", - "scale" : "1x", - "filename" : "OneDriveWhite.png" + "filename" : "OneDriveWhite.png", + "scale" : "1x" }, { "idiom" : "universal", - "scale" : "2x", - "filename" : "OneDriveWhite@2x.png" + "filename" : "OneDriveWhite@2x.png", + "scale" : "2x" }, { "idiom" : "universal", - "scale" : "3x", - "filename" : "OneDriveWhite@3x.png" + "filename" : "OneDriveWhite@3x.png", + "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" + }, + "properties" : { + "template-rendering-intent" : "template" } } \ No newline at end of file diff --git a/vlc-ios/Images.xcassets/cloudServices/dropbox-white.imageset/Contents.json b/vlc-ios/Images.xcassets/cloudServices/dropbox-white.imageset/Contents.json index 793510bd1a3922832ac632dcb232e07b2f4955aa..1cd5187a9b412f02a30c8856acc1c1941a7a58b7 100644 --- a/vlc-ios/Images.xcassets/cloudServices/dropbox-white.imageset/Contents.json +++ b/vlc-ios/Images.xcassets/cloudServices/dropbox-white.imageset/Contents.json @@ -2,22 +2,25 @@ "images" : [ { "idiom" : "universal", - "scale" : "1x", - "filename" : "dropbox-white.png" + "filename" : "dropbox-white.png", + "scale" : "1x" }, { "idiom" : "universal", - "scale" : "2x", - "filename" : "dropbox-white@2x.png" + "filename" : "dropbox-white@2x.png", + "scale" : "2x" }, { "idiom" : "universal", - "scale" : "3x", - "filename" : "dropbox-white@3x.png" + "filename" : "dropbox-white@3x.png", + "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" + }, + "properties" : { + "template-rendering-intent" : "template" } } \ No newline at end of file diff --git a/vlc-ios/Images.xcassets/cloudServices/iCloud.imageset/Contents.json b/vlc-ios/Images.xcassets/cloudServices/iCloud.imageset/Contents.json index 52bc133b9e1a21cee1de4b02fe42cd47d962c9d0..76e24eb69425594622ed5d9ff4407f29a34c3444 100644 --- a/vlc-ios/Images.xcassets/cloudServices/iCloud.imageset/Contents.json +++ b/vlc-ios/Images.xcassets/cloudServices/iCloud.imageset/Contents.json @@ -2,22 +2,25 @@ "images" : [ { "idiom" : "universal", - "scale" : "1x", - "filename" : "iCloud.png" + "filename" : "iCloud.png", + "scale" : "1x" }, { "idiom" : "universal", - "scale" : "2x", - "filename" : "iCloud@2x.png" + "filename" : "iCloud@2x.png", + "scale" : "2x" }, { "idiom" : "universal", - "scale" : "3x", - "filename" : "iCloud@3x.png" + "filename" : "iCloud@3x.png", + "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" + }, + "properties" : { + "template-rendering-intent" : "template" } } \ No newline at end of file diff --git a/vlc-ios/Images.xcassets/cloudServices/iCloudIcon.imageset/Contents.json b/vlc-ios/Images.xcassets/cloudServices/iCloudIcon.imageset/Contents.json index 280cbd82c9d064d441e148cdc6a40a89aaaa649e..86b2425aca18286f5529a10da8efb7500b0d3a75 100644 --- a/vlc-ios/Images.xcassets/cloudServices/iCloudIcon.imageset/Contents.json +++ b/vlc-ios/Images.xcassets/cloudServices/iCloudIcon.imageset/Contents.json @@ -2,22 +2,25 @@ "images" : [ { "idiom" : "universal", - "scale" : "1x", - "filename" : "iCloudIcon.png" + "filename" : "iCloudIcon.png", + "scale" : "1x" }, { "idiom" : "universal", - "scale" : "2x", - "filename" : "iCloudIcon@2x.png" + "filename" : "iCloudIcon@2x.png", + "scale" : "2x" }, { "idiom" : "universal", - "scale" : "3x", - "filename" : "iCloudIcon@3x.png" + "filename" : "iCloudIcon@3x.png", + "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" + }, + "properties" : { + "template-rendering-intent" : "template" } } \ No newline at end of file