diff --git a/Sources/Playback/Control/VLCPlayerDisplayController.m b/Sources/Playback/Control/VLCPlayerDisplayController.m index 0ce8275dcd119767c0c7bec7c3d1cea51d1246d2..fc92640cbe62687257224c603b621a64bebb30e4 100644 --- a/Sources/Playback/Control/VLCPlayerDisplayController.m +++ b/Sources/Playback/Control/VLCPlayerDisplayController.m @@ -449,8 +449,7 @@ NSString *const VLCPlayerDisplayControllerHideMiniPlayer = @"VLCPlayerDisplayCon UIViewController *rootViewController = [[[UIApplication sharedApplication] delegate] window].rootViewController; // Until VideoMiniPlayer is integrated, only AudioMiniPlayer is used. - self.miniPlaybackView = miniPlaybackView = [[VLCAudioMiniPlayer alloc] initWithService:[VLCAppCoordinator sharedInstance].mediaLibraryService - draggingDelegate:self]; + self.miniPlaybackView = miniPlaybackView = [[VLCAudioMiniPlayer alloc] initWithDraggingDelegate:self]; if (!_queueViewController) { [self initQueueViewController]; } diff --git a/Sources/Playback/Player/AudioPlayer/AudioPlayerView.swift b/Sources/Playback/Player/AudioPlayer/AudioPlayerView.swift index 1b94c4be28f1894c6b8b6f6ff2dcb4cb810176c3..f9ac9b76e11c6f654b2fd0832044e367c68f1164 100644 --- a/Sources/Playback/Player/AudioPlayer/AudioPlayerView.swift +++ b/Sources/Playback/Player/AudioPlayer/AudioPlayerView.swift @@ -23,10 +23,6 @@ protocol AudioPlayerViewDelegate: AnyObject { func audioPlayerViewDelegateDidTapRepeatButton(_ audioPlayerView: AudioPlayerView) func audioPlayerViewDelegateDidTapPlaybackSpeedButton(_ audioPlayerView: AudioPlayerView) func audioPlayerViewDelegateDidLongPressPlaybackSpeedButton(_ audioPlayerView: AudioPlayerView) - #if os(iOS) - func audioPlayerViewDelegateGetVolumeSlider(_ audioPlayerView: AudioPlayerView) -> VolumeControlView - func audioPlayerViewDelegateGetBrightnessSlider(_ audioPlayerView: AudioPlayerView) -> BrightnessControlView - #endif } class AudioPlayerView: UIView, UIGestureRecognizerDelegate { diff --git a/Sources/Playback/Player/AudioPlayer/AudioPlayerViewController.swift b/Sources/Playback/Player/AudioPlayer/AudioPlayerViewController.swift index 189fcee327eb13635b6ae4146f3daeb0e8f1c067..31e324299b642d25fa25929e359e96f1350cef56 100644 --- a/Sources/Playback/Player/AudioPlayer/AudioPlayerViewController.swift +++ b/Sources/Playback/Player/AudioPlayer/AudioPlayerViewController.swift @@ -60,8 +60,13 @@ class AudioPlayerViewController: PlayerViewController { // MARK: - Init #if os(iOS) - @objc override init(mediaLibraryService: MediaLibraryService, rendererDiscovererManager: VLCRendererDiscovererManager, playerController: PlayerController) { - super.init(mediaLibraryService: mediaLibraryService, rendererDiscovererManager: rendererDiscovererManager, playerController: playerController) + @objc init(mediaLibraryService: MediaLibraryService, + rendererDiscovererManager: VLCRendererDiscovererManager, + playerController: PlayerController) { + super.init(mediaLibraryService: mediaLibraryService, + rendererDiscovererManager: rendererDiscovererManager, + playerController: playerController, + isBrightnessControlAvailable: false) NotificationCenter.default.addObserver(self, selector: #selector(playbackSpeedHasChanged(_:)), name: Notification.Name("ChangePlaybackSpeed"), object: nil) self.playerController.delegate = self @@ -111,7 +116,6 @@ class AudioPlayerViewController: PlayerViewController { audioPlayerView.setupBackgroundColor() audioPlayerView.setupPlaybackSpeed() mediaScrubProgressBar.updateInterfacePosition() - setupGestures() playModeUpdated() if playbackService.isPlayingOnExternalScreen() { @@ -435,15 +439,6 @@ extension AudioPlayerViewController: AudioPlayerViewDelegate { } } -#if os(iOS) - func audioPlayerViewDelegateGetBrightnessSlider(_ audioPlayerView: AudioPlayerView) -> BrightnessControlView { - return brightnessControlView - } - - func audioPlayerViewDelegateGetVolumeSlider(_ audioPlayerView: AudioPlayerView) -> VolumeControlView { - return volumeControlView - } -#endif } // MARK: - VLCPlaybackServiceDelegate @@ -501,10 +496,6 @@ extension AudioPlayerViewController { comment: "")) } - if currentState == .buffering { - mediaDuration = playbackService.mediaDuration - } - if currentState == .opening || currentState == .stopped { resetABRepeat() } @@ -598,6 +589,8 @@ extension AudioPlayerViewController { extension AudioPlayerViewController { override func mediaMoreOptionsActionSheetDidToggleInterfaceLock(state: Bool) { + super.mediaMoreOptionsActionSheetDidToggleInterfaceLock(state: state) + setPlayerInterfaceEnabled(!state) } diff --git a/Sources/Playback/Player/MiniPlayer-iOS/AudioMiniPlayer.swift b/Sources/Playback/Player/MiniPlayer-iOS/AudioMiniPlayer.swift index 961431cc9d456efdc633ad7b0947205a0c8b285a..41c96f2a131699597bd7b26137bb5cbe35742692 100644 --- a/Sources/Playback/Player/MiniPlayer-iOS/AudioMiniPlayer.swift +++ b/Sources/Playback/Player/MiniPlayer-iOS/AudioMiniPlayer.swift @@ -61,7 +61,6 @@ class AudioMiniPlayer: UIView, MiniPlayer, QueueViewControllerDelegate { private let animationDuration = 0.2 - private var mediaService: MediaLibraryService private lazy var playbackService = PlaybackService.sharedInstance() private var queueViewController: QueueViewController? @@ -79,8 +78,7 @@ class AudioMiniPlayer: UIView, MiniPlayer, QueueViewControllerDelegate { } } - @objc init(service: MediaLibraryService, draggingDelegate: MiniPlayerDraggingDelegate) { - self.mediaService = service + @objc init(draggingDelegate: MiniPlayerDraggingDelegate) { self.draggingDelegate = draggingDelegate super.init(frame: .zero) initView() diff --git a/Sources/Playback/Player/PlayerViewController.swift b/Sources/Playback/Player/PlayerViewController.swift index 19490da2c9443b84708901eb96c8dc9ea9a45a0f..67fec51e1c330fead1d4d383e72793881e30d1cc 100644 --- a/Sources/Playback/Player/PlayerViewController.swift +++ b/Sources/Playback/Player/PlayerViewController.swift @@ -19,7 +19,7 @@ enum PlayerSeekState { case backward } -enum PlayerPanType { +fileprivate enum PlayerPanType { case none #if os(iOS) case brightness @@ -28,7 +28,7 @@ enum PlayerPanType { case projection } -enum PlayerSeekGestureType { +fileprivate enum PlayerSeekGestureType { case tap case swipe } @@ -72,12 +72,13 @@ class PlayerViewController: UIViewController { } // MARK: - Properties - var mediaLibraryService: MediaLibraryService + let mediaLibraryService: MediaLibraryService #if os(iOS) - var rendererDiscovererManager: VLCRendererDiscovererManager + let rendererDiscovererManager: VLCRendererDiscovererManager #endif - var playerController: PlayerController - var playbackService: PlaybackService = PlaybackService.sharedInstance() + let playerController: PlayerController + let playbackService: PlaybackService = PlaybackService.sharedInstance() + var queueViewController: QueueViewController? var alertController: UIAlertController? @@ -90,7 +91,6 @@ class PlayerViewController: UIViewController { var seekBackwardBySwipe: Int = 0 var forwardBackwardEqual: Bool = true var tapSwipeEqual: Bool = true - var numberOfTapSeek: Int = 0 var previousSeekState: PlayerSeekState = .default // MARK: UI Elements @@ -245,9 +245,7 @@ class PlayerViewController: UIViewController { vc.alpha = 0 return vc }() -#endif -#if os(iOS) lazy var rendererButton: UIButton = { let rendererButton = rendererDiscovererManager.setupRendererButton() rendererButton.tintColor = .white @@ -272,15 +270,13 @@ class PlayerViewController: UIViewController { return rendererButton }() -#endif -#if os(iOS) let volumeView = MPVolumeView(frame: .zero) #endif var addBookmarksView: AddBookmarksView? = nil - var mediaDuration: Int = 0 + private let isBrightnessControlAvailable: Bool private var isGestureActive: Bool = false @@ -298,10 +294,7 @@ class PlayerViewController: UIViewController { return deviceMotion }() - var systemBrightness: Double? - - // MARK: Constants - private let ZOOM_SENSITIVITY: CGFloat = 5 + private var systemBrightness: Double? #if os(iOS) private let screenPixelSize = CGSize(width: UIScreen.main.bounds.width, @@ -368,20 +361,30 @@ class PlayerViewController: UIViewController { // MARK: - Init #if os(iOS) - @objc init(mediaLibraryService: MediaLibraryService, rendererDiscovererManager: VLCRendererDiscovererManager, playerController: PlayerController) { + init(mediaLibraryService: MediaLibraryService, + rendererDiscovererManager: VLCRendererDiscovererManager, + playerController: PlayerController, + isBrightnessControlAvailable: Bool) { self.mediaLibraryService = mediaLibraryService self.rendererDiscovererManager = rendererDiscovererManager self.playerController = playerController + self.isBrightnessControlAvailable = isBrightnessControlAvailable + super.init(nibName: nil, bundle: nil) + mediaNavigationBar.chromeCastButton = rendererButton mediaNavigationBar.addGestureRecognizer(minimizeGestureRecognizer) systemBrightness = UIScreen.main.brightness } #else - @objc init(mediaLibraryService: MediaLibraryService, playerController: PlayerController) { + init(mediaLibraryService: MediaLibraryService, playerController: PlayerController) { self.mediaLibraryService = mediaLibraryService self.playerController = playerController + self.isBrightnessControlAvailable = false + self.systemBrightness = 1.0 + super.init(nibName: nil, bundle: nil) + mediaNavigationBar.addGestureRecognizer(minimizeGestureRecognizer) } #endif @@ -391,11 +394,16 @@ class PlayerViewController: UIViewController { } override func viewDidLoad() { + super.viewDidLoad() + setupObservers() + setupGestures() hideSystemVolumeInfo() } override func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(animated) + #if os(iOS) setupRendererDiscovererManager() #endif @@ -425,7 +433,7 @@ class PlayerViewController: UIViewController { //update the value of brightness control view //In case of remember brightness option is disabled, this will update the brightness bar with current brightness. - if !playerController.isRememberBrightnessEnabled && self is VideoPlayerViewController { + if !playerController.isRememberBrightnessEnabled && isBrightnessControlAvailable { brightnessControlView.updateIcon(level: brightnessControl.fetchAndGetDeviceValue()) } #endif @@ -435,7 +443,7 @@ class PlayerViewController: UIViewController { override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) - if playerController.isRememberBrightnessEnabled && self is VideoPlayerViewController { + if playerController.isRememberBrightnessEnabled && isBrightnessControlAvailable { if let brightness = userDefaults.value(forKey: KVLCPlayerBrightness) as? CGFloat { animateBrightness(to: brightness) self.brightnessControl.value = Float(brightness) @@ -457,7 +465,7 @@ class PlayerViewController: UIViewController { override func viewDidDisappear(_ animated: Bool) { super.viewDidDisappear(animated) - if playerController.isRememberBrightnessEnabled && self is VideoPlayerViewController { + if playerController.isRememberBrightnessEnabled && isBrightnessControlAvailable { let currentBrightness = UIScreen.main.brightness self.brightnessControl.value = Float(currentBrightness) // helper in indicating change in the system brightness userDefaults.set(currentBrightness, forKey: KVLCPlayerBrightness) @@ -488,7 +496,7 @@ class PlayerViewController: UIViewController { } func setControlsHidden(_ hidden: Bool, animated: Bool) { - // HIDE THE CONTROLS IF NEEDED + // Empty implementation. Should override in subclasses. } func setupGestures() { @@ -572,16 +580,28 @@ class PlayerViewController: UIViewController { } } - // MARK: - Private methods + func showIcon(button: UIButton) { + UIView.animate(withDuration: 0.5, animations: { + button.isHidden = false + }, completion: nil) + } - private func jumpBackwards(_ interval: Int = 10) { + func hideIcon(button: UIButton) { + UIView.animate(withDuration: 0.5, animations: { + button.isHidden = true + }, completion: nil) + } + + func jumpBackwards(_ interval: Int = 10) { playbackService.jumpBackward(Int32(interval)) } - private func jumpForwards(_ interval: Int = 10) { + func jumpForwards(_ interval: Int = 10) { playbackService.jumpForward(Int32(interval)) } + // MARK: - Private methods + private func executeSeekFromGesture(_ type: PlayerSeekGestureType) { let currentSeek: Int if numberOfGestureSeek > 0 { @@ -597,24 +617,12 @@ class PlayerViewController: UIViewController { displayAndApplySeekDuration(currentSeek) } - private func showIcon(button: UIButton) { - UIView.animate(withDuration: 0.5, animations: { - button.isHidden = false - }, completion: nil) - } - private func openOptionView(view: ActionSheetCellIdentifier) { present(moreOptionsActionSheet, animated: true, completion: { self.moreOptionsActionSheet.addView(view) }) } - private func hideIcon(button: UIButton) { - UIView.animate(withDuration: 0.5, animations: { - button.isHidden = true - }, completion: nil) - } - private func resetVideoFilters() { hideIcon(button: optionsNavigationBar.videoFiltersButton) moreOptionsActionSheet.resetVideoFilters() @@ -656,7 +664,7 @@ class PlayerViewController: UIViewController { resetABRepeatMarks(true) break default: - assertionFailure("VideoPlayerViewController: Unvalid button.") + assertionFailure("PlayerViewController: Invalid button.") } } @@ -1003,14 +1011,7 @@ class PlayerViewController: UIViewController { } @objc func handlePinchGesture(recognizer: UIPinchGestureRecognizer) { - if playbackService.currentMediaIs360Video { - let zoom: CGFloat = MediaProjection.FOV.default * -(ZOOM_SENSITIVITY * recognizer.velocity / screenPixelSize.width) - if playbackService.updateViewpoint(0, pitch: 0, - roll: 0, fov: zoom, absolute: false) { - // Clam FOV between min and max - fov = max(min(fov + zoom, MediaProjection.FOV.max), MediaProjection.FOV.min) - } - } + // Empty implementation. Override in subclasses. } @objc func handleSwipeGestures(recognizer: UISwipeGestureRecognizer) { @@ -1083,8 +1084,6 @@ class PlayerViewController: UIViewController { } @objc func handleDoubleTapGesture(_ sender: UITapGestureRecognizer) { - // CHECK THE TAP LOCATION - executeSeekFromGesture(.tap) } @@ -1107,15 +1106,18 @@ extension PlayerViewController: VLCPlaybackServiceDelegate { } func mediaPlayerStateChanged(_ currentState: VLCMediaPlayerState, isPlaying: Bool, currentMediaHasTrackToChooseFrom: Bool, currentMediaHasChapters: Bool, for playbackService: PlaybackService) { - if currentState == .opening { + switch currentState { + case .opening: applyCustomEqualizerProfileIfNeeded() - } - if currentState == .stopped { + case .stopped: moreOptionsActionSheet.resetPlaybackSpeed() mediaMoreOptionsActionSheetHideIcon(for: .playbackSpeed) moreOptionsActionSheet.resetSleepTimer() mediaMoreOptionsActionSheetHideIcon(for: .sleepTimer) + + default: + break } } diff --git a/Sources/Playback/Player/VideoPlayer-iOS/PlayerController.swift b/Sources/Playback/Player/VideoPlayer-iOS/PlayerController.swift index 07217a3b4143fdabf3de4928861f82f0081ed154..261fc9c253105b54a1a9b124fbbc09ddc77177fa 100644 --- a/Sources/Playback/Player/VideoPlayer-iOS/PlayerController.swift +++ b/Sources/Playback/Player/VideoPlayer-iOS/PlayerController.swift @@ -26,24 +26,14 @@ protocol PlayerControllerDelegate: AnyObject { class PlayerController: NSObject { weak var delegate: PlayerControllerDelegate? - private var playbackService: PlaybackService = PlaybackService.sharedInstance() - // MARK: - States var isControlsHidden: Bool = false - var lockedOrientation: UIInterfaceOrientation = .unknown - var isInterfaceLocked: Bool = false - var isTapSeeking: Bool = false - // MARK: - UserDefaults computed properties getters - var displayRemainingTime: Bool { - return UserDefaults.standard.bool(forKey: kVLCShowRemainingTime) - } - var isVolumeGestureEnabled: Bool { return UserDefaults.standard.bool(forKey: kVLCSettingVolumeGesture) } @@ -91,10 +81,6 @@ class PlayerController: NSObject { setupObservers() } - func updateUserDefaults() { - - } - private func setupObservers() { let notificationCenter = NotificationCenter.default diff --git a/Sources/Playback/Player/VideoPlayer-iOS/VideoPlayerViewController.swift b/Sources/Playback/Player/VideoPlayer-iOS/VideoPlayerViewController.swift index 33dde55a82f41e053a65dac71833a35e1e15fed4..ceb6249f3f9c07f820caf30a046a508877c0d9ab 100644 --- a/Sources/Playback/Player/VideoPlayer-iOS/VideoPlayerViewController.swift +++ b/Sources/Playback/Player/VideoPlayer-iOS/VideoPlayerViewController.swift @@ -26,8 +26,6 @@ protocol VideoPlayerViewControllerDelegate: AnyObject { class VideoPlayerViewController: PlayerViewController { @objc weak var delegate: VideoPlayerViewControllerDelegate? - var playAsAudio: Bool = false - // MARK: - Constants private let ZOOM_SENSITIVITY: CGFloat = 5 @@ -145,8 +143,6 @@ class VideoPlayerViewController: PlayerViewController { return aspectRatioActionSheet }() - let notificationCenter = NotificationCenter.default - private(set) lazy var titleSelectionView: TitleSelectionView = { #if os(iOS) let isLandscape = UIDevice.current.orientation.isLandscape @@ -160,8 +156,6 @@ class VideoPlayerViewController: PlayerViewController { return titleSelectionView }() - private var projectionLocation: CGPoint = .zero - private lazy var longPressPlaybackSpeedView: LongPressPlaybackSpeedView = { let view = LongPressPlaybackSpeedView() view.translatesAutoresizingMaskIntoConstraints = false @@ -279,8 +273,6 @@ class VideoPlayerViewController: PlayerViewController { private var isGestureActive: Bool = false - private var minimizationInitialCenter: CGPoint? - // MARK: - Popup Views lazy var trackSelectorPopupView: PopupView = { @@ -319,8 +311,13 @@ class VideoPlayerViewController: PlayerViewController { // MARK: - Init methods #if os(iOS) - @objc override init(mediaLibraryService: MediaLibraryService, rendererDiscovererManager: VLCRendererDiscovererManager, playerController: PlayerController) { - super.init(mediaLibraryService: mediaLibraryService, rendererDiscovererManager: rendererDiscovererManager, playerController: playerController) + @objc init(mediaLibraryService: MediaLibraryService, + rendererDiscovererManager: VLCRendererDiscovererManager, + playerController: PlayerController) { + super.init(mediaLibraryService: mediaLibraryService, + rendererDiscovererManager: rendererDiscovererManager, + playerController: playerController, + isBrightnessControlAvailable: true) self.playerController.delegate = self self.mediaNavigationBar.addGestureRecognizer(minimizeGestureRecognizer) @@ -332,11 +329,7 @@ class VideoPlayerViewController: PlayerViewController { @objc override init(mediaLibraryService: MediaLibraryService, playerController: PlayerController) { super.init(mediaLibraryService: mediaLibraryService, playerController: playerController) - self.mediaLibraryService = mediaLibraryService - self.playerController = playerController - self.playerController.delegate = self - systemBrightness = 1.0 self.mediaNavigationBar.addGestureRecognizer(minimizeGestureRecognizer) } #endif @@ -349,14 +342,11 @@ class VideoPlayerViewController: PlayerViewController { super.viewWillAppear(animated) playbackService.delegate = self playbackService.recoverPlaybackState() - playerController.lockedOrientation = .portrait navigationController?.navigationBar.isHidden = true mediaScrubProgressBar.updateInterfacePosition() setControlsHidden(false, animated: false) - setupSeekDurations() - // Make sure interface is enabled on setPlayerInterfaceEnabled(true) @@ -400,16 +390,6 @@ class VideoPlayerViewController: PlayerViewController { override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) -#if os(iOS) - let defaults = UserDefaults.standard - if defaults.bool(forKey: kVLCPlayerShouldRememberBrightness) { - if let brightness = defaults.value(forKey: KVLCPlayerBrightness) as? CGFloat { - animateBrightness(to: brightness) - self.brightnessControl.value = Float(brightness) - } - } -#endif - playbackService.recoverDisplayedMetadata() // The video output view is not initialized when the play as audio option was chosen @@ -467,31 +447,13 @@ class VideoPlayerViewController: PlayerViewController { override func viewDidDisappear(_ animated: Bool) { super.viewDidDisappear(animated) deviceMotion.stopDeviceMotion() -#if os(iOS) - let defaults = UserDefaults.standard - if defaults.bool(forKey: kVLCPlayerShouldRememberBrightness) { - let currentBrightness = UIScreen.main.brightness - self.brightnessControl.value = Float(currentBrightness) // helper in indicating change in the system brightness - defaults.set(currentBrightness, forKey: KVLCPlayerBrightness) - } - - //set the value of system brightness after closing the app x - //even if the Player Should Remember Brightness option is disabled - animateBrightness(to: systemBrightness!, duration: 0.35) - - // remove the observer when the view disappears to avoid breaking the brightness view value - // when the video player is not shown to save the persisted values - removePlayerBrightnessObservers() -#endif } override func viewDidLoad() { super.viewDidLoad() navigationController?.navigationBar.isHidden = true - setupObservers() setupViews() setupAccessibility() - setupGestures() setupConstraints() #if os(iOS) setupRendererDiscoverer() @@ -500,18 +462,9 @@ class VideoPlayerViewController: PlayerViewController { // MARK: - Setup methods - private func setupObservers() { - try? AVAudioSession.sharedInstance().setActive(true) - AVAudioSession.sharedInstance().addObserver(self, forKeyPath: "outputVolume", options: NSKeyValueObservingOptions.new, context: nil) - - NotificationCenter.default.addObserver(self, selector: #selector(updatePlayerControls), name: .VLCDidAppendMediaToQueue, object: nil) - NotificationCenter.default.addObserver(self, selector: #selector(updatePlayerControls), name: .VLCDidRemoveMediaFromQueue, object: nil) - } - private func setupViews() { view.backgroundColor = .black view.addSubview(mediaNavigationBar) - hideSystemVolumeInfo() videoPlayerButtons() if playerController.isRememberStateEnabled { setupVideoControlsState() @@ -716,51 +669,6 @@ class VideoPlayerViewController: PlayerViewController { titleSelectionView.mainStackView.distribution = isLandscape ? .fillEqually : .fill } -#if os(iOS) - private func addPlayerBrightnessObservers() { - NotificationCenter.default.addObserver( - self, - selector: #selector(systemBrightnessChanged), - name: UIApplication.didBecomeActiveNotification, - object: nil - ) - - NotificationCenter.default.addObserver( - self, - selector: #selector(playerWillResignActive), - name: UIApplication.willResignActiveNotification, - object: nil - ) - - NotificationCenter.default.addObserver( - self, - selector: #selector(playerWillEnterForeground), - name: UIApplication.willEnterForegroundNotification, - object: nil - ) - } - - private func removePlayerBrightnessObservers() { - NotificationCenter.default.removeObserver( - self, - name: UIApplication.didBecomeActiveNotification, - object: nil - ) - - NotificationCenter.default.removeObserver( - self, - name: UIApplication.willResignActiveNotification, - object: nil - ) - - NotificationCenter.default.removeObserver( - self, - name: UIApplication.willEnterForegroundNotification, - object: nil - ) - } -#endif - // MARK: - Private helpers #if os(iOS) @@ -864,30 +772,6 @@ class VideoPlayerViewController: PlayerViewController { ]) } - private func setupSeekDurations() { - let defaults = UserDefaults.standard - - tapSwipeEqual = defaults.bool(forKey: kVLCSettingPlaybackTapSwipeEqual) - forwardBackwardEqual = defaults.bool(forKey: kVLCSettingPlaybackForwardBackwardEqual) - seekForwardBy = defaults.integer(forKey: kVLCSettingPlaybackForwardSkipLength) - seekBackwardBy = forwardBackwardEqual ? seekForwardBy : defaults.integer(forKey: kVLCSettingPlaybackBackwardSkipLength) - seekForwardBySwipe = tapSwipeEqual ? seekForwardBy : defaults.integer(forKey: kVLCSettingPlaybackForwardSkipLengthSwipe) - - if tapSwipeEqual, forwardBackwardEqual { - // if tap = swipe, and backward = forward, then backward swipe = forward tap - seekBackwardBySwipe = seekForwardBy - } else if tapSwipeEqual, !forwardBackwardEqual { - // if tap = swipe, and backward != forward, then backward swipe = backward tap - seekBackwardBySwipe = seekBackwardBy - } else if !tapSwipeEqual, forwardBackwardEqual { - // if tap != swipe, and backward = forward, then backward swipe = forward swipe - seekBackwardBySwipe = seekForwardBySwipe - } else { - // otherwise backward swipe = backward swipe - seekBackwardBySwipe = defaults.integer(forKey: kVLCSettingPlaybackBackwardSkipLengthSwipe) - } - } - private func setupForMediaProjection() { let mediaHasProjection = playbackService.currentMediaIs360Video @@ -904,6 +788,8 @@ class VideoPlayerViewController: PlayerViewController { } } + // MARK: - Accessibility + @objc private func handleAccessibilityPlayPause() -> Bool { togglePlayPause() return true @@ -957,6 +843,11 @@ class VideoPlayerViewController: PlayerViewController { let tapPosition = sender.location(in: view) + // Limit y position in order to avoid conflicts with the bottom controls + guard tapPosition.y <= mediaScrubProgressBar.frame.origin.y else { + return + } + // Reset number(set to -1/1) of seek when orientation has been changed. if tapPosition.x < backwardBoundary { numberOfGestureSeek = previousSeekState == .forward ? -1 : numberOfGestureSeek - 1 @@ -1032,64 +923,6 @@ class VideoPlayerViewController: PlayerViewController { } } - func jumpBackwards(_ interval: Int = 10) { - playbackService.jumpBackward(Int32(interval)) - } - - func jumpForwards(_ interval: Int = 10) { - playbackService.jumpForward(Int32(interval)) - } - - @objc func handleDoubleTapGesture(recognizer: UITapGestureRecognizer) { - let screenWidth: CGFloat = view.frame.size.width - let backwardBoundary: CGFloat = screenWidth / 3.0 - let forwardBoundary: CGFloat = 2 * screenWidth / 3.0 - - let tapPosition = recognizer.location(in: view) - - // Limit y position in order to avoid conflicts with the bottom controls - if tapPosition.y > mediaScrubProgressBar.frame.origin.y { - return - } - - // Reset number(set to -1/1) of seek when orientation has been changed. - if tapPosition.x < backwardBoundary { - numberOfGestureSeek = previousSeekState == .forward ? -1 : numberOfGestureSeek - 1 - } else if tapPosition.x > forwardBoundary { - numberOfGestureSeek = previousSeekState == .backward ? 1 : numberOfGestureSeek + 1 - } else { - playbackService.switchAspectRatio(true) - return - } - //_isTapSeeking = YES; - executeSeekFromGesture(.tap) - } - - private func applyYaw(yaw: CGFloat, pitch: CGFloat) { - //Add and limit new pitch and yaw - deviceMotion.yaw += yaw - deviceMotion.pitch += pitch - - playbackService.updateViewpoint(deviceMotion.yaw, - pitch: deviceMotion.pitch, - roll: 0, - fov: fov, absolute: true) - } - - private func updateProjection(with recognizer: UIPanGestureRecognizer) { - let newLocationInView: CGPoint = recognizer.location(in: view) - - let diffX = newLocationInView.x - projectionLocation.x - let diffY = newLocationInView.y - projectionLocation.y - projectionLocation = newLocationInView - - // ScreenSizePixel width is used twice to get a constant speed on the movement. - let diffYaw = fov * -diffX / screenPixelSize.width - let diffPitch = fov * -diffY / screenPixelSize.width - - applyYaw(yaw: diffYaw, pitch: diffPitch) - } - @objc private func handleLongPressGesture(_ gestureRecognizer: UILongPressGestureRecognizer) { guard playerController.isSpeedUpGestureEnabled, playbackService.isPlaying else { @@ -1368,52 +1201,6 @@ class VideoPlayerViewController: PlayerViewController { } } - private func executeSeekFromGesture(_ type: PlayerSeekGestureType) { - - let currentSeek: Int - if numberOfGestureSeek > 0 { - currentSeek = type == .tap ? seekForwardBy : seekForwardBySwipe - totalSeekDuration = previousSeekState == .backward ? currentSeek : totalSeekDuration + currentSeek - previousSeekState = .forward - } else { - currentSeek = type == .tap ? seekBackwardBy : seekBackwardBySwipe - totalSeekDuration = previousSeekState == .forward ? -currentSeek : totalSeekDuration - currentSeek - previousSeekState = .backward - } - - displayAndApplySeekDuration(currentSeek) - } - - private func applyCustomEqualizerProfileIfNeeded() { - let userDefaults = UserDefaults.standard - guard userDefaults.bool(forKey: kVLCCustomProfileEnabled) else { - return - } - - let profileIndex = userDefaults.integer(forKey: kVLCSettingEqualizerProfile) - let encodedData = userDefaults.data(forKey: kVLCCustomEqualizerProfiles) - - guard let encodedData = encodedData, - let customProfiles = NSKeyedUnarchiver(forReadingWith: encodedData).decodeObject(forKey: "root") as? CustomEqualizerProfiles, - profileIndex < customProfiles.profiles.count else { - return - } - - let selectedProfile = customProfiles.profiles[profileIndex] - playbackService.preAmplification = CGFloat(selectedProfile.preAmpLevel) - - for (index, frequency) in selectedProfile.frequencies.enumerated() { - playbackService.setAmplification(CGFloat(frequency), forBand: UInt32(index)) - } - } - - private func hideSystemVolumeInfo() { -#if os(iOS) - volumeView.alpha = 0.00001 - view.addSubview(volumeView) -#endif - } - private func videoPlayerButtons() { let audioMedia: Bool = playbackService.metadata.isAudioOnly if audioMedia || playbackService.playAsAudio { @@ -1563,7 +1350,7 @@ extension VideoPlayerViewController { if playbackService.isPlayingOnExternalScreen() { #if os(iOS) if let renderer = playbackService.renderer { - externalVideoOutputView.updateUI(rendererName: playbackService.renderer?.name, title: metadata.title) + externalVideoOutputView.updateUI(rendererName: renderer.name, title: metadata.title) } #else externalVideoOutputView.updateUI(rendererName: nil, title: metadata.title) @@ -1619,14 +1406,6 @@ extension VideoPlayerViewController { videoPlayerControls.shuffleButton.tintColor = playbackService.isShuffleMode ? orangeColor : .white } - - override func reloadPlayQueue() { - guard let queueViewController = queueViewController else { - return - } - - queueViewController.reload() - } } // MARK: - PlayerControllerDelegate @@ -1716,6 +1495,8 @@ extension VideoPlayerViewController { extension VideoPlayerViewController { override func mediaMoreOptionsActionSheetDidToggleInterfaceLock(state: Bool) { + super.mediaMoreOptionsActionSheetDidToggleInterfaceLock(state: state) + #if os(iOS) let mask = getInterfaceOrientationMask(orientation: UIApplication.shared.statusBarOrientation) @@ -1806,83 +1587,6 @@ extension VideoPlayerViewController { } } -// MARK: - OptionsNavigationBarDelegate - -extension VideoPlayerViewController { - private func resetVideoFilters() { - hideIcon(button: optionsNavigationBar.videoFiltersButton) - moreOptionsActionSheet.resetVideoFilters() - } - - private func resetPlaybackSpeed() { - hideIcon(button: optionsNavigationBar.playbackSpeedButton) - moreOptionsActionSheet.resetPlaybackSpeed() - } - - private func resetEqualizer() { - moreOptionsActionSheet.resetEqualizer() - hideIcon(button: optionsNavigationBar.equalizerButton) - } - - private func resetSleepTimer() { - hideIcon(button: optionsNavigationBar.sleepTimerButton) - moreOptionsActionSheet.resetSleepTimer() - } - - private func resetABRepeatMarks(_ shouldDisplayView: Bool = false) { - hideIcon(button: optionsNavigationBar.abRepeatMarksButton) - aMark.removeFromSuperview() - aMark.isEnabled = false - - bMark.removeFromSuperview() - bMark.isEnabled = false - - guard let abRepeatView = abRepeatView, - shouldDisplayView else { - return - } - - mediaMoreOptionsActionSheetPresentABRepeatView(with: abRepeatView) - } - - private func showIcon(button: UIButton) { - UIView.animate(withDuration: 0.5, animations: { - button.isHidden = false - }, completion: nil) - } - - private func hideIcon(button: UIButton) { - UIView.animate(withDuration: 0.5, animations: { - button.isHidden = true - }, completion: nil) - } - - private func handleReset(button: UIButton) { - switch button { - case optionsNavigationBar.videoFiltersButton: - resetVideoFilters() - return - case optionsNavigationBar.playbackSpeedButton: - resetPlaybackSpeed() - return - case optionsNavigationBar.equalizerButton: - resetEqualizer() - return - case optionsNavigationBar.sleepTimerButton: - resetSleepTimer() - return - case optionsNavigationBar.abRepeatButton: - resetABRepeat() - return - case optionsNavigationBar.abRepeatMarksButton: - resetABRepeatMarks(true) - return - default: - assertionFailure("VideoPlayerViewController: Invalid button.") - } - } -} - // MARK: - Download More SPU extension VideoPlayerViewController {