From 1c08e7345cc36e5bf98a18b3673819ab156213df Mon Sep 17 00:00:00 2001 From: Robert Gordon Date: Fri, 31 May 2019 19:11:08 +0400 Subject: [PATCH] VideoOptionsControlBar: Implement new ui components and pseudo-functionality for repeat button Made OptionsControlBar respond to device orientation Fix not working button actions. Fixed buttons not triggering respective functions when tapped. --- Resources/en.lproj/Localizable.strings | 8 + Sources/VLCMovieViewController.m | 284 ++++++++++++------ Sources/VideoOptionsControlBar.swift | 73 +++-- .../no-repeat-new.imageset/Contents.json | 23 ++ .../no-repeat-new.imageset/no-repeat-new.png | Bin 0 -> 555 bytes .../no-repeat-new@2x.png | Bin 0 -> 876 bytes .../no-repeat-new@3x.png | Bin 0 -> 1161 bytes .../repeat-new.imageset/Contents.json | 23 ++ .../repeat-new.imageset/repeat-new.png | Bin 0 -> 465 bytes .../repeat-new.imageset/repeat-new@2x.png | Bin 0 -> 706 bytes .../repeat-new.imageset/repeat-new@3x.png | Bin 0 -> 930 bytes 11 files changed, 302 insertions(+), 109 deletions(-) create mode 100644 vlc-ios/Images.xcassets/MovieController/no-repeat-new.imageset/Contents.json create mode 100644 vlc-ios/Images.xcassets/MovieController/no-repeat-new.imageset/no-repeat-new.png create mode 100644 vlc-ios/Images.xcassets/MovieController/no-repeat-new.imageset/no-repeat-new@2x.png create mode 100644 vlc-ios/Images.xcassets/MovieController/no-repeat-new.imageset/no-repeat-new@3x.png create mode 100644 vlc-ios/Images.xcassets/MovieController/repeat-new.imageset/Contents.json create mode 100644 vlc-ios/Images.xcassets/MovieController/repeat-new.imageset/repeat-new.png create mode 100644 vlc-ios/Images.xcassets/MovieController/repeat-new.imageset/repeat-new@2x.png create mode 100644 vlc-ios/Images.xcassets/MovieController/repeat-new.imageset/repeat-new@3x.png diff --git a/Resources/en.lproj/Localizable.strings b/Resources/en.lproj/Localizable.strings index 600c97da..63affcb2 100644 --- a/Resources/en.lproj/Localizable.strings +++ b/Resources/en.lproj/Localizable.strings @@ -370,3 +370,11 @@ "UNKNOWN_ARTIST" = "Unknown Artist"; "VARIOUS_ARTIST" = "Various Artists"; "UNKNOWN_ALBUM" = "Unknown Album"; + +/* New strings */ +"INTERFACE_LOCK_BUTTON" = "Lock interface"; +"INTERFACE_LOCK_HINT" = "Disable interface controls"; +"MORE_OPTIONS_BUTTON" = "More"; +"MORE_OPTIONS_HINT" = "View more option controls"; +"REPEAT_MODE_HINT" = "Change repeat mode of current item"; +"VIDEO_ASPECT_RATIO_HINT" = "Change the aspect ratio of the current video"; diff --git a/Sources/VLCMovieViewController.m b/Sources/VLCMovieViewController.m index 5d6a3359..02030d83 100644 --- a/Sources/VLCMovieViewController.m +++ b/Sources/VLCMovieViewController.m @@ -44,6 +44,7 @@ #define DEFAULT_FOV 80.f #define MAX_FOV 150.f #define MIN_FOV 20.f +#define NEW_UI 0 typedef NS_ENUM(NSInteger, VLCPanType) { VLCPanTypeNone, @@ -53,7 +54,7 @@ typedef NS_ENUM(NSInteger, VLCPanType) { VLCPanTypeProjection }; -@interface VLCMovieViewController () +@interface VLCMovieViewController () { BOOL _controlsHidden; BOOL _videoFiltersHidden; @@ -96,6 +97,7 @@ typedef NS_ENUM(NSInteger, VLCPanType) { VLCEqualizerView *_equalizerView; VLCMultiSelectionMenuView *_multiSelectionView; + VLCVideoOptionsControlBar *_videoOptionsControlBar; VLCPlaybackController *_vpc; @@ -163,14 +165,13 @@ typedef NS_ENUM(NSInteger, VLCPanType) { _saturationSlider.accessibilityLabel = _saturationLabel.text; _gammaLabel.text = NSLocalizedString(@"VFILTER_GAMMA", nil); _gammaSlider.accessibilityLabel = _gammaLabel.text; - _resetVideoFilterButton.accessibilityLabel = NSLocalizedString(@"VIDEO_FILTER_RESET_BUTTON", nil); - _multiSelectionView = [[VLCMultiSelectionMenuView alloc] init]; - _multiSelectionView.delegate = self; - _multiSelectionView.autoresizingMask = UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleTopMargin; - _multiSelectionView.hidden = YES; - [self.view addSubview:_multiSelectionView]; + #if !NEW_UI + [self setupMultiSelectionView]; + #else + [self setupVideoOptionsControlBar]; + #endif _scrubHelpLabel.text = NSLocalizedString(@"PLAYBACK_SCRUB_HELP", nil); @@ -241,6 +242,26 @@ typedef NS_ENUM(NSInteger, VLCPanType) { [self setupRendererDiscovererManager]; } +- (void) setupMultiSelectionView +{ + _multiSelectionView = [[VLCMultiSelectionMenuView alloc] init]; + _multiSelectionView.delegate = self; + _multiSelectionView.autoresizingMask = UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleTopMargin; + _multiSelectionView.hidden = YES; + _multiSelectionView.repeatMode = _vpc.repeatMode; + [self.view addSubview:_multiSelectionView]; +} + +- (void)setupVideoOptionsControlBar +{ + _videoOptionsControlBar = [[VLCVideoOptionsControlBar alloc] init]; + _videoOptionsControlBar.delegate = self; + _videoOptionsControlBar.hidden = YES; + _videoOptionsControlBar.repeatMode = _vpc.repeatMode; + _videoOptionsControlBar.spacing = 32.0f; + [self.view addSubview:_videoOptionsControlBar]; +} + - (void)setupGestureRecognizers { _tapOnVideoRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(toggleControlsVisible)]; @@ -347,8 +368,10 @@ typedef NS_ENUM(NSInteger, VLCPanType) { [NSLayoutConstraint constraintWithItem:_trackSelectorContainer attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationLessThanOrEqual toItem:self.view attribute:NSLayoutAttributeHeight multiplier:2.0/3.0 constant:0], [_videoFilterView.bottomAnchor constraintEqualToAnchor:_controllerPanel.topAnchor] ]; - [NSLayoutConstraint activateConstraints:constraints]; - + #if NEW_UI + constraints = [constraints arrayByAddingObjectsFromArray:[self getVideoOptionsConstraints]]; + #endif + [NSLayoutConstraint activateConstraints: constraints]; } - (UIButton *)doneButton @@ -450,6 +473,26 @@ typedef NS_ENUM(NSInteger, VLCPanType) { } } +- (void)layoutFrameForMultiSelectionView +{ + CGRect controllerPanelFrame = _controllerPanel.frame; + CGRect multiSelectionFrame; + + BOOL isIphone = (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone); + if (!isIphone) { + _multiSelectionView.showsEqualizer = YES; + return; + } + + BOOL isLandscape = UIInterfaceOrientationIsLandscape([[UIApplication sharedApplication] statusBarOrientation]); + _multiSelectionView.showsEqualizer = isLandscape; + + multiSelectionFrame = (CGRect){CGPointMake(0., 0.), [_multiSelectionView proposedDisplaySize]}; + multiSelectionFrame.origin.x = controllerPanelFrame.size.width - multiSelectionFrame.size.width; + multiSelectionFrame.origin.y = controllerPanelFrame.origin.y - multiSelectionFrame.size.height; + _multiSelectionView.frame = multiSelectionFrame; +} + - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; @@ -459,8 +502,13 @@ typedef NS_ENUM(NSInteger, VLCPanType) { [_vpc recoverDisplayedMetadata]; [self resetVideoFiltersSliders]; _vpc.videoOutputView = self.movieView; - _multiSelectionView.repeatMode = _vpc.repeatMode; - _multiSelectionView.shuffleMode = _vpc.isShuffleMode; + + #if !NEW_UI + _multiSelectionView.repeatMode = _vpc.repeatMode; + _multiSelectionView.shuffleMode = _vpc.isShuffleMode; + #else + _videoOptionsControlBar.repeatMode = _vpc.repeatMode; + #endif //Media is loaded in the media player, checking the projection type and configuring accordingly. [self setupForMediaProjection]; @@ -472,31 +520,10 @@ typedef NS_ENUM(NSInteger, VLCPanType) { equalizerRect.origin.x = CGRectGetMidX(self.view.bounds) - CGRectGetWidth(equalizerRect)/2.0; equalizerRect.origin.y = CGRectGetMidY(self.view.bounds) - CGRectGetHeight(equalizerRect)/2.0; _equalizerView.frame = equalizerRect; - - CGRect multiSelectionFrame; - CGRect controllerPanelFrame = _controllerPanel.frame;; - - if (UI_USER_INTERFACE_IDIOM() != UIUserInterfaceIdiomPhone) { - multiSelectionFrame = (CGRect){CGPointMake(0., 0.), [_multiSelectionView proposedDisplaySize]}; - multiSelectionFrame.origin.x = controllerPanelFrame.size.width - multiSelectionFrame.size.width; - multiSelectionFrame.origin.y = controllerPanelFrame.origin.y - multiSelectionFrame.size.height; - _multiSelectionView.frame = multiSelectionFrame; - _multiSelectionView.showsEqualizer = YES; - return; - } - - if (UIInterfaceOrientationIsLandscape([[UIApplication sharedApplication] statusBarOrientation])) { - _multiSelectionView.showsEqualizer = YES; - multiSelectionFrame = (CGRect){CGPointMake(0., 0.), [_multiSelectionView proposedDisplaySize]}; - multiSelectionFrame.origin.x = controllerPanelFrame.size.width - multiSelectionFrame.size.width; - multiSelectionFrame.origin.y = controllerPanelFrame.origin.y - multiSelectionFrame.size.height; - } else { - _multiSelectionView.showsEqualizer = NO; - multiSelectionFrame = (CGRect){CGPointMake(0., 0.), [_multiSelectionView proposedDisplaySize]}; - multiSelectionFrame.origin.x = controllerPanelFrame.size.width - multiSelectionFrame.size.width; - multiSelectionFrame.origin.y = controllerPanelFrame.origin.y - multiSelectionFrame.size.height; - } - _multiSelectionView.frame = multiSelectionFrame; + + #if !NEW_UI + [self layoutFrameForMultiSelectionView]; + #endif self.scrubViewTopConstraint.constant = CGRectGetMaxY(self.navigationController.navigationBar.frame); } @@ -648,26 +675,39 @@ typedef NS_ENUM(NSInteger, VLCPanType) { - (NSArray *)itemsForInterfaceLock { - return @[_pinchRecognizer, - _panRecognizer, - _tapRecognizer, - _doneButton, - _doubleTapRecognizer, - _timeNavigationTitleView.minimizePlaybackButton, - _timeNavigationTitleView.positionSlider, - _timeNavigationTitleView.aspectRatioButton, - _controllerPanel.playbackSpeedButton, - _controllerPanel.trackSwitcherButton, - _controllerPanel.bwdButton, - _controllerPanel.playPauseButton, - _controllerPanel.fwdButton, - _controllerPanel.videoFilterButton, - _multiSelectionView.equalizerButton, - _multiSelectionView.chapterSelectorButton, - _multiSelectionView.repeatButton, - _multiSelectionView.shuffleButton, - _controllerPanel.volumeView, - _rendererButton]; + NSArray *arr = [NSArray arrayWithObjects: + _pinchRecognizer, + _panRecognizer, + _tapRecognizer, + _doneButton, + _doubleTapRecognizer, + _timeNavigationTitleView.minimizePlaybackButton, + _timeNavigationTitleView.positionSlider, + _timeNavigationTitleView.aspectRatioButton, + _controllerPanel.playbackSpeedButton, + _controllerPanel.trackSwitcherButton, + _controllerPanel.bwdButton, + _controllerPanel.playPauseButton, + _controllerPanel.fwdButton, + _controllerPanel.videoFilterButton, + _controllerPanel.volumeView, + _rendererButton, + nil]; + #if !NEW_UI + return [arr arrayByAddingObjectsFromArray: + @[_multiSelectionView.equalizerButton, + _multiSelectionView.chapterSelectorButton, + _multiSelectionView.repeatButton, + _multiSelectionView.shuffleButton, + _controllerPanel.volumeView, + _rendererButton]]; + #else + return [arr arrayByAddingObjectsFromArray: + @[_videoOptionsControlBar.toggleFullScreenButton, + _videoOptionsControlBar.selectSubtitleButton, + _videoOptionsControlBar.moreOptionsButton, + _videoOptionsControlBar.repeatButton]]; + #endif } - (void)handlePinchGesture:(UIPinchGestureRecognizer *)recognizer @@ -724,8 +764,14 @@ typedef NS_ENUM(NSInteger, VLCPanType) { _sleepTimerContainer.alpha = 0.0f; _sleepTimerContainer.hidden = YES; } + + #if !NEW_UI _multiSelectionView.alpha = 0.0f; _multiSelectionView.hidden = YES; + #else + _videoOptionsControlBar.alpha = 0.0f; + _videoOptionsControlBar.hidden = YES; + #endif _artistNameLabel.hidden = NO; _albumNameLabel.hidden = NO; @@ -738,8 +784,14 @@ typedef NS_ENUM(NSInteger, VLCPanType) { self->_videoFilterView.alpha = alpha; self->_playbackSpeedView.alpha = alpha; self->_trackSelectorContainer.alpha = alpha; + + #if !NEW_UI + self->_multiSelectionView.alpha = alpha; + #else + self->_videoOptionsControlBar.alpha = alpha; + #endif + self->_equalizerView.alpha = alpha; - self->_multiSelectionView.alpha = alpha; if (self->_sleepTimerContainer) self->_sleepTimerContainer.alpha = alpha; @@ -758,7 +810,13 @@ typedef NS_ENUM(NSInteger, VLCPanType) { self->_equalizerView.hidden = YES; if (self->_sleepTimerContainer) self->_sleepTimerContainer.hidden = YES; - self->_multiSelectionView.hidden = YES; + + #if !NEW_UI + self->_multiSelectionView.hidden = YES; + #else + self->_videoOptionsControlBar.hidden = YES; + #endif + self->_artistNameLabel.hidden = self->_audioOnly ? NO : self->_controlsHidden; self->_albumNameLabel.hidden = self->_audioOnly ? NO : self->_controlsHidden; @@ -1118,8 +1176,10 @@ currentMediaHasTrackToChooseFrom:(BOOL)currentMediaHasTrackToChooseFrom [self.statusLabel showStatusMessage:NSLocalizedString(@"PLAYBACK_FAILED", nil)]; [_controllerPanel updateButtons]; - - _multiSelectionView.mediaHasChapters = currentMediaHasChapters; + + #if !NEW_UI + _multiSelectionView.mediaHasChapters = currentMediaHasChapters; + #endif } - (void)savePlaybackState:(VLCPlaybackController *)controller @@ -1257,32 +1317,26 @@ currentMediaHasTrackToChooseFrom:(BOOL)currentMediaHasTrackToChooseFrom [self setControlsHidden:YES animated:YES]; } -- (void)moreActions:(UIButton *)sender -{ +- (void)toggleMultiSelectionView:(UIButton *)sender { if (_multiSelectionView.hidden == NO) { [UIView animateWithDuration:.3 animations:^{ self->_multiSelectionView.hidden = YES; } - completion:^(BOOL finished){ - }]; + completion:nil]; return; } - - if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) { - if (UIInterfaceOrientationIsLandscape([[UIApplication sharedApplication] statusBarOrientation])) { - _multiSelectionView.showsEqualizer = YES; - } else { - _multiSelectionView.showsEqualizer = NO; - } - } - + + BOOL isLandscape = UIInterfaceOrientationIsLandscape([[UIApplication sharedApplication] statusBarOrientation]); + BOOL isIphone = (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone); + _multiSelectionView.showsEqualizer = (isLandscape && isIphone) || !isIphone; + CGRect workFrame = _multiSelectionView.frame; workFrame.size = [_multiSelectionView proposedDisplaySize]; workFrame.origin.x = CGRectGetMaxX(sender.frame) - workFrame.size.width; - + _multiSelectionView.alpha = 1.0f; - + /* animate */ _multiSelectionView.frame = CGRectMake(workFrame.origin.x, workFrame.origin.y + workFrame.size.height, workFrame.size.width, 0.); [UIView animateWithDuration:.3 @@ -1290,8 +1344,29 @@ currentMediaHasTrackToChooseFrom:(BOOL)currentMediaHasTrackToChooseFrom self->_multiSelectionView.frame = workFrame; self->_multiSelectionView.hidden = NO; } - completion:^(BOOL finished){ - }]; + completion:nil]; +} + +- (void) toggleVideoOptionsBar +{ + CGFloat alpha = _videoOptionsControlBar.hidden ? 1.0f : 0.0f; + BOOL hidden = !_videoOptionsControlBar.hidden; + + [UIView animateWithDuration:.3 + animations:^{ + self->_videoOptionsControlBar.alpha = alpha; + self->_videoOptionsControlBar.hidden = hidden; + } + completion:nil]; +} + +- (void)moreActions:(UIButton *)sender +{ + #if !NEW_UI + [self toggleMultiSelectionView:sender]; + #else + [self toggleVideoOptionsBar]; + #endif [self _resetIdleTimer]; } @@ -1322,7 +1397,10 @@ currentMediaHasTrackToChooseFrom:(BOOL)currentMediaHasTrackToChooseFrom NSAssert(NO, @"class not handled"); } } - _multiSelectionView.displayLock = _interfaceIsLocked; + + #if !NEW_UI + _multiSelectionView.displayLock = _interfaceIsLocked; + #endif } - (void)toggleEqualizer @@ -1379,20 +1457,30 @@ currentMediaHasTrackToChooseFrom:(BOOL)currentMediaHasTrackToChooseFrom - (void)toggleRepeatMode { [[VLCPlaybackController sharedInstance] toggleRepeatMode]; - _multiSelectionView.repeatMode = [VLCPlaybackController sharedInstance].repeatMode; + #if !NEW_UI + _multiSelectionView.repeatMode = [VLCPlaybackController sharedInstance].repeatMode; + #else + _videoOptionsControlBar.repeatMode = [VLCPlaybackController sharedInstance].repeatMode; + #endif } - (void)toggleShuffleMode { _vpc.shuffleMode = !_vpc.isShuffleMode; - _multiSelectionView.shuffleMode = _vpc.isShuffleMode; + #if !NEW_UI + _multiSelectionView.shuffleMode = _vpc.isShuffleMode; + #endif } - (void)hideMenu { [UIView animateWithDuration:.2 animations:^{ + #if !NEW_UI self->_multiSelectionView.hidden = YES; + #else + self->_videoOptionsControlBar.hidden = YES; + #endif } completion:^(BOOL finished){ }]; @@ -1691,12 +1779,10 @@ currentMediaHasTrackToChooseFrom:(BOOL)currentMediaHasTrackToChooseFrom - (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id)coordinator { [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator]; - if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) { - [coordinator animateAlongsideTransition:^(id _Nonnull context) { - if (self.artworkImageView.image) - self.trackNameLabel.hidden = YES; + if (self.artworkImageView.image) + self.trackNameLabel.hidden = YES; if (!self->_equalizerView.hidden) self->_equalizerView.hidden = YES; @@ -1710,6 +1796,14 @@ currentMediaHasTrackToChooseFrom:(BOOL)currentMediaHasTrackToChooseFrom [self setControlsHidden:NO animated:YES]; } +- (NSArray *)getVideoOptionsConstraints +{ + return @[ + [_videoOptionsControlBar.centerXAnchor constraintEqualToAnchor:self.view.centerXAnchor], + [_videoOptionsControlBar.bottomAnchor constraintEqualToAnchor:_controllerPanel.topAnchor constant:-50], + ]; +} + #pragma mark - External Display - (void)showOnDisplay:(UIView *)view @@ -1775,4 +1869,26 @@ currentMediaHasTrackToChooseFrom:(BOOL)currentMediaHasTrackToChooseFrom [self showSleepTimer]; } +#pragma mark - VLCVideoOptionsControlBarDelegate + +- (void)didSelectMoreOptions:(VLCVideoOptionsControlBar * _Nonnull)optionsBar { + [self moreActions:optionsBar.moreOptionsButton]; +} + +- (void)didSelectSubtitle:(VLCVideoOptionsControlBar * _Nonnull)optionsBar { + NSLog(@"subtitles Selected"); +} + +- (void)didToggleFullScreen:(VLCVideoOptionsControlBar * _Nonnull)optionsBar { + [_vpc toggleFullScreen]; +} + +- (void)didToggleInterfaceLock:(VLCVideoOptionsControlBar * _Nonnull)optionsBar { + [self toggleUILock]; +} + +- (void)didToggleRepeat:(VLCVideoOptionsControlBar * _Nonnull)optionsBar { + [self toggleRepeatMode]; +} + @end diff --git a/Sources/VideoOptionsControlBar.swift b/Sources/VideoOptionsControlBar.swift index 93f14e78..2203edff 100644 --- a/Sources/VideoOptionsControlBar.swift +++ b/Sources/VideoOptionsControlBar.swift @@ -9,13 +9,13 @@ * Refer to the COPYING file of the official project for license. *****************************************************************************/ -@objc (VideoOptionsControlBarDelegate) +@objc (VLCVideoOptionsControlBarDelegate) protocol VideoOptionsControlBarDelegate: class { func didToggleFullScreen(_ optionsBar: VideoOptionsControlBar) func didToggleRepeat(_ optionsBar: VideoOptionsControlBar) func didSelectSubtitle(_ optionsBar: VideoOptionsControlBar) func didSelectMoreOptions(_ optionsBar: VideoOptionsControlBar) - func didToggleOrientationLock(_ optionsBar: VideoOptionsControlBar) + func didToggleInterfaceLock(_ optionsBar: VideoOptionsControlBar) } @objc (VLCVideoOptionsControlBar) @@ -24,63 +24,86 @@ protocol VideoOptionsControlBarDelegate: class { // MARK: Instance variables weak var delegate: VideoOptionsControlBarDelegate? + var repeatMode: VLCRepeatMode { + didSet { + switch repeatMode { + case .repeatCurrentItem: + repeatButton.setImage(UIImage(named: "repeatOne-new"), for: .normal) + case .repeatAllItems: + repeatButton.setImage(UIImage(named: "repeat-new"), for: .normal) + case .doNotRepeat: + repeatButton.setImage(UIImage(named: "no-repeat-new"), for: .normal) + default: + assertionFailure("unhandled repeatmode") + } + } + } + lazy var toggleFullScreenButton: UIButton = { var toggle = UIButton(type: .system) - toggle.addTarget(self, action: #selector(toggleFullscreen), for: .touchUpInside) toggle.setImage(UIImage(named: "fullscreenIcon-new"), for: .normal) - toggle.tintColor = .orange - //TODO: add accessability options for fullScreenButton + toggle.addTarget(self, action: #selector(toggleFullscreen), for: .touchUpInside) + toggle.tintColor = .white + toggle.accessibilityLabel = NSLocalizedString("VIDEO_ASPECT_RATIO_BUTTON", comment: "") + toggle.accessibilityHint = NSLocalizedString("VIDEO_ASPECT_RATIO_HINT", comment: "") return toggle }() lazy var selectSubtitleButton: UIButton = { var subbutton = UIButton(type: .system) + subbutton.setImage(UIImage(named: "subtitlesIcon-new"), for: .normal) subbutton.addTarget(self, action: #selector(selectSubtitle), for: .touchUpInside) - subbutton.setImage(UIImage(named: "subtitleIcon-new"), for: .normal) - subbutton.tintColor = .orange - //TODO: add accessability options for selectingSubtitleButton + subbutton.tintColor = .white + subbutton.accessibilityHint = NSLocalizedString("CHOOSE_SUBTITLE_TRACK", comment: "") + subbutton.accessibilityLabel = NSLocalizedString("SUBTITLES", comment: "") return subbutton }() lazy var repeatButton: UIButton = { var rptButton = UIButton(type: .system) rptButton.addTarget(self, action: #selector(toggleRepeat), for: .touchUpInside) - rptButton.setImage(UIImage(named: "repeatOne-new"), for: .normal) - rptButton.tintColor = .orange - //TODO: add accessability options for repeatButton + rptButton.setImage(UIImage(named: "no-repeat-new"), for: .normal) + rptButton.tintColor = .white + rptButton.accessibilityHint = NSLocalizedString("REPEAT_MODE", comment: "") + rptButton.accessibilityLabel = NSLocalizedString("REPEAT_MODE_HINT", comment: "") return rptButton }() - lazy var orientationLockButton: UIButton = { - var orientLockButton = UIButton(type: .system) - orientLockButton.addTarget(self, action: #selector(toggleOrientation), for: .touchUpInside) - orientLockButton.setImage(UIImage(named: "lockIcon-new"), for: .normal) - orientLockButton.tintColor = .orange - //TODO: add accessability options for orientationLockButton - return orientLockButton + lazy var interfaceLockButton: UIButton = { + var interfaceLockButton = UIButton(type: .system) + interfaceLockButton.setImage(UIImage(named: "lock-new"), for: .normal) + interfaceLockButton.addTarget(self, action: #selector(toggleInterfaceLock), for: .touchUpInside) + interfaceLockButton.tintColor = .white + interfaceLockButton.accessibilityHint = NSLocalizedString("INTERFACE_LOCK_HINT", comment: "") + interfaceLockButton.accessibilityLabel = NSLocalizedString("INTERFACE_LOCK_BUTTON", comment: "") + return interfaceLockButton }() lazy var moreOptionsButton: UIButton = { var moreOptionsButton = UIButton(type: .system) - moreOptionsButton.addTarget(self, action: #selector(selectMoreOptions), for: .touchUpInside) moreOptionsButton.setImage(UIImage(named: "moreWhite-new"), for: .normal) - moreOptionsButton.tintColor = .orange - //TODO: add accessability options for moreOptionsButton + moreOptionsButton.addTarget(self, action: #selector(selectMoreOptions), for: .touchUpInside) + moreOptionsButton.tintColor = .white + moreOptionsButton.accessibilityHint = NSLocalizedString("MORE_OPTIONS_HINT", comment: "") + moreOptionsButton.accessibilityLabel = NSLocalizedString("MORE_OPTIONS_BUTTON", comment: "") return moreOptionsButton }() // MARK: Class Initializers required init(coder aDecoder: NSCoder) { - super.init(coder: aDecoder) + fatalError("init(coder aDecoder: NSCoder) not implemented") } override init(frame: CGRect) { + repeatMode = .doNotRepeat super.init(frame: frame) addArrangedSubview(toggleFullScreenButton) addArrangedSubview(selectSubtitleButton) addArrangedSubview(repeatButton) - addArrangedSubview(orientationLockButton) + addArrangedSubview(interfaceLockButton) addArrangedSubview(moreOptionsButton) + axis = .horizontal + translatesAutoresizingMaskIntoConstraints = false } // MARK: Button Action Buttons @@ -100,8 +123,8 @@ protocol VideoOptionsControlBarDelegate: class { delegate?.didToggleRepeat(self) } - func toggleOrientation() { - delegate?.didToggleOrientationLock(self) + func toggleInterfaceLock() { + delegate?.didToggleInterfaceLock(self) } } diff --git a/vlc-ios/Images.xcassets/MovieController/no-repeat-new.imageset/Contents.json b/vlc-ios/Images.xcassets/MovieController/no-repeat-new.imageset/Contents.json new file mode 100644 index 00000000..0d5263fb --- /dev/null +++ b/vlc-ios/Images.xcassets/MovieController/no-repeat-new.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "no-repeat-new.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "no-repeat-new@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "no-repeat-new@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/vlc-ios/Images.xcassets/MovieController/no-repeat-new.imageset/no-repeat-new.png b/vlc-ios/Images.xcassets/MovieController/no-repeat-new.imageset/no-repeat-new.png new file mode 100644 index 0000000000000000000000000000000000000000..d8ab3f5cbfc6af099770f98d1707864d648c8ae9 GIT binary patch literal 555 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 literal 0 HcmV?d00001 diff --git a/vlc-ios/Images.xcassets/MovieController/repeat-new.imageset/repeat-new@3x.png b/vlc-ios/Images.xcassets/MovieController/repeat-new.imageset/repeat-new@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..7baa21583838765e6c99aaffbf4078dd2fc22999 GIT binary patch literal 930 zcmV;T16}-yP)A1$eKj*uhx2=>;cXmSEOKog)#0?kbd6>VlAMS%kSL7fxCK$mWIPtfE9%?;`? zfGxg~iHZysMOq>$(&YyPu}vvZK8x@1JrN)f2m}JPWcjxp{sSFAz+t$QI4-ULVZh%L zAd_X$OSAM~0hZ{2!^BaM|C7T(z;WCwW;X98rv)*_Yo8G4+mz(Gpz5h)QIgYw5b;7d zXi1XOL7MaS;`4+MG7=tuaJ{0@&{W`dUJ$2CNnQxzbS0^=poh7CXLa$G#7T|_d%^<@ zNZLry`TMV9BsgLh(r0fwS=ma_EJ;bwdH$&nQSS-?cEJZUN|L7ecOSltFzWsCMh-{g z5};O4mVev@3KQ@UR+iitzk`w}nSqC}1?J`1$>A6@5Q_%x12W()h*=O(DPRbENDQ^p zMyDK3EFQw=f`J7VxPO)&&cPyO>tj}C&`Na6;RvS~lIoyLfu{e99F8~!2`=XK@zDe< zqEk+j&SVS@qf5?XXR;XZ_bk3DcP5<{RCW|w-#JyC$t0ru<$>&6|2m2#8^)ZqjBm_YctO@FJhejKWXR$VQkP8?UR8?$lQU|$!u_;zpiL2H@E>I_Eq4?PvDs2j1 z5O)-->mc!NixR~ij`Z)if>4m44$7d04H{e-c!IXg3tje&L3UkH@uzC+^!SDJ|JM?v zU6sR0VtP_Jz-9(0&^pa42IP4`SK0lOT8kv{lM(x3vZ^tH#Jr#lveh7tlHXt%CPz3% z3wj9(G#2D@DklV{r;5+^8pR;5<*Hr-F4Wue&hUS^YMTS;%L zB(3|Tw^5SzjpW-VNqfUgn%xNWSw}GkPcYI^lu6o_j$$jkTPF!H`q)P#$)}ED1csUY z_&yyzeMU%+?68b*$L09cQ49nEfj}S-2m}IwK)^Zv0xXRP6K<