From a0a65f784e4c8a9d4ba5c6c7031076b60af21a7e Mon Sep 17 00:00:00 2001
From: Craig Reyenga <craig.reyenga@gmail.com>
Date: Sun, 9 Mar 2025 18:29:36 -0400
Subject: [PATCH 1/4] Remove unused code from player view controller, and
 associated classes.

---
 Buildsystem/Testing/UI/VLCTestMenu.swift      |   1 -
 .../Control/VLCPlayerDisplayController.m      |   3 +-
 .../Player/AudioPlayer/AudioPlayerView.swift  |   4 -
 .../AudioPlayerViewController.swift           |  13 --
 .../MiniPlayer-iOS/AudioMiniPlayer.swift      |   4 +-
 .../Player/PlayerViewController.swift         |   3 -
 .../VideoPlayer-iOS/PlayerController.swift    |  10 -
 .../VideoPlayerViewController.swift           | 206 +-----------------
 VLC.xcodeproj/project.pbxproj                 |   6 +-
 9 files changed, 17 insertions(+), 233 deletions(-)

diff --git a/Buildsystem/Testing/UI/VLCTestMenu.swift b/Buildsystem/Testing/UI/VLCTestMenu.swift
index 86caa920f..168d9e730 100644
--- a/Buildsystem/Testing/UI/VLCTestMenu.swift
+++ b/Buildsystem/Testing/UI/VLCTestMenu.swift
@@ -78,6 +78,5 @@ class VLCTestMenu: XCTestCase {
         helper.tapTabBarItem(VLCAccessibilityIdentifier.settings)
         app.navigationBars.buttons[VLCAccessibilityIdentifier.about].tap()
         XCTAssertNotNil(app.navigationBars.buttons[VLCAccessibilityIdentifier.done])
-        XCTAssertNotNil(app.navigationBars.buttons[VLCAccessibilityIdentifier.contribute])
     }
 }
diff --git a/Sources/Playback/Control/VLCPlayerDisplayController.m b/Sources/Playback/Control/VLCPlayerDisplayController.m
index 0ce8275dc..fc92640cb 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 1b94c4be2..f9ac9b76e 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 189fcee32..2648f99be 100644
--- a/Sources/Playback/Player/AudioPlayer/AudioPlayerViewController.swift
+++ b/Sources/Playback/Player/AudioPlayer/AudioPlayerViewController.swift
@@ -435,15 +435,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 +492,6 @@ extension AudioPlayerViewController {
                                                             comment: ""))
         }
 
-        if currentState == .buffering {
-            mediaDuration = playbackService.mediaDuration
-        }
-
         if currentState == .opening || currentState == .stopped {
             resetABRepeat()
         }
diff --git a/Sources/Playback/Player/MiniPlayer-iOS/AudioMiniPlayer.swift b/Sources/Playback/Player/MiniPlayer-iOS/AudioMiniPlayer.swift
index 961431cc9..41c96f2a1 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 19490da2c..86d6df377 100644
--- a/Sources/Playback/Player/PlayerViewController.swift
+++ b/Sources/Playback/Player/PlayerViewController.swift
@@ -90,7 +90,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
@@ -280,8 +279,6 @@ class PlayerViewController: UIViewController {
 
     var addBookmarksView: AddBookmarksView? = nil
 
-    var mediaDuration: Int = 0
-
     private var isGestureActive: Bool = false
 
     private var currentPanType: PlayerPanType = .none
diff --git a/Sources/Playback/Player/VideoPlayer-iOS/PlayerController.swift b/Sources/Playback/Player/VideoPlayer-iOS/PlayerController.swift
index 07217a3b4..f1759ab28 100644
--- a/Sources/Playback/Player/VideoPlayer-iOS/PlayerController.swift
+++ b/Sources/Playback/Player/VideoPlayer-iOS/PlayerController.swift
@@ -36,14 +36,8 @@ class PlayerController: NSObject {
 
     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 +85,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 33dde55a8..8a6a38d4f 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 = {
@@ -467,22 +459,6 @@ 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() {
@@ -716,51 +692,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)
@@ -1065,31 +996,6 @@ class VideoPlayerViewController: PlayerViewController {
         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 {
@@ -1384,29 +1290,6 @@ class VideoPlayerViewController: PlayerViewController {
         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
@@ -1477,6 +1360,18 @@ class VideoPlayerViewController: PlayerViewController {
 
         playerController.isInterfaceLocked = !enabled
     }
+
+    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)
+    }
 }
 
 // MARK: - Delegation
@@ -1806,83 +1701,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 {
diff --git a/VLC.xcodeproj/project.pbxproj b/VLC.xcodeproj/project.pbxproj
index 94af9dff1..22a31cd48 100644
--- a/VLC.xcodeproj/project.pbxproj
+++ b/VLC.xcodeproj/project.pbxproj
@@ -5282,7 +5282,7 @@
 				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
 				GCC_WARN_UNUSED_FUNCTION = YES;
 				INFOPLIST_FILE = Buildsystem/Testing/UI/Info.plist;
-				IPHONEOS_DEPLOYMENT_TARGET = 9.0;
+				IPHONEOS_DEPLOYMENT_TARGET = 12;
 				LD_RUNPATH_SEARCH_PATHS = (
 					"$(inherited)",
 					"@executable_path/Frameworks",
@@ -5336,7 +5336,7 @@
 				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
 				GCC_WARN_UNUSED_FUNCTION = YES;
 				INFOPLIST_FILE = Buildsystem/Testing/UI/Info.plist;
-				IPHONEOS_DEPLOYMENT_TARGET = 9.0;
+				IPHONEOS_DEPLOYMENT_TARGET = 12;
 				LD_RUNPATH_SEARCH_PATHS = (
 					"$(inherited)",
 					"@executable_path/Frameworks",
@@ -5391,7 +5391,7 @@
 				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
 				GCC_WARN_UNUSED_FUNCTION = YES;
 				INFOPLIST_FILE = Buildsystem/Testing/UI/Info.plist;
-				IPHONEOS_DEPLOYMENT_TARGET = 9.0;
+				IPHONEOS_DEPLOYMENT_TARGET = 12;
 				LD_RUNPATH_SEARCH_PATHS = (
 					"$(inherited)",
 					"@executable_path/Frameworks",
-- 
GitLab


From 30e2fc80fc4e8e780299a195aafb1d1f7fcf9f48 Mon Sep 17 00:00:00 2001
From: Craig Reyenga <craig.reyenga@gmail.com>
Date: Sun, 9 Mar 2025 19:03:03 -0400
Subject: [PATCH 2/4] Remove duplicate brightness, and method call to set up
 gestures.

---
 .../AudioPlayerViewController.swift           | 10 +++++--
 .../Player/PlayerViewController.swift         | 30 ++++++++++++++-----
 .../VideoPlayer-iOS/PlayerController.swift    |  4 ---
 .../VideoPlayerViewController.swift           | 21 +++++--------
 4 files changed, 37 insertions(+), 28 deletions(-)

diff --git a/Sources/Playback/Player/AudioPlayer/AudioPlayerViewController.swift b/Sources/Playback/Player/AudioPlayer/AudioPlayerViewController.swift
index 2648f99be..c4a63408d 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,
+                   isBrightnessControlEnabled: 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() {
diff --git a/Sources/Playback/Player/PlayerViewController.swift b/Sources/Playback/Player/PlayerViewController.swift
index 86d6df377..f4eb3e368 100644
--- a/Sources/Playback/Player/PlayerViewController.swift
+++ b/Sources/Playback/Player/PlayerViewController.swift
@@ -279,6 +279,8 @@ class PlayerViewController: UIViewController {
 
     var addBookmarksView: AddBookmarksView? = nil
 
+    private let isBrightnessControlEnabled: Bool
+
     private var isGestureActive: Bool = false
 
     private var currentPanType: PlayerPanType = .none
@@ -365,20 +367,29 @@ class PlayerViewController: UIViewController {
     // MARK: - Init
 
 #if os(iOS)
-    @objc init(mediaLibraryService: MediaLibraryService, rendererDiscovererManager: VLCRendererDiscovererManager, playerController: PlayerController) {
+    init(mediaLibraryService: MediaLibraryService,
+         rendererDiscovererManager: VLCRendererDiscovererManager,
+         playerController: PlayerController,
+         isBrightnessControlEnabled: Bool) {
         self.mediaLibraryService = mediaLibraryService
         self.rendererDiscovererManager = rendererDiscovererManager
         self.playerController = playerController
+        self.isBrightnessControlEnabled = isBrightnessControlEnabled
+
         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.isBrightnessControlEnabled = false
+
         super.init(nibName: nil, bundle: nil)
+
         mediaNavigationBar.addGestureRecognizer(minimizeGestureRecognizer)
     }
 #endif
@@ -388,11 +399,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
@@ -422,7 +438,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 && isBrightnessControlEnabled {
             brightnessControlView.updateIcon(level: brightnessControl.fetchAndGetDeviceValue())
         }
 #endif
@@ -432,7 +448,7 @@ class PlayerViewController: UIViewController {
     override func viewDidAppear(_ animated: Bool) {
         super.viewDidAppear(animated)
 
-        if playerController.isRememberBrightnessEnabled && self is VideoPlayerViewController {
+        if playerController.isRememberBrightnessEnabled && isBrightnessControlEnabled {
             if let brightness = userDefaults.value(forKey: KVLCPlayerBrightness) as? CGFloat {
                 animateBrightness(to: brightness)
                 self.brightnessControl.value = Float(brightness)
@@ -454,7 +470,7 @@ class PlayerViewController: UIViewController {
     override func viewDidDisappear(_ animated: Bool) {
         super.viewDidDisappear(animated)
 
-        if playerController.isRememberBrightnessEnabled && self is VideoPlayerViewController {
+        if playerController.isRememberBrightnessEnabled && isBrightnessControlEnabled {
             let currentBrightness = UIScreen.main.brightness
             self.brightnessControl.value = Float(currentBrightness) // helper in indicating change in the system brightness
             userDefaults.set(currentBrightness, forKey: KVLCPlayerBrightness)
@@ -485,7 +501,7 @@ class PlayerViewController: UIViewController {
     }
 
     func setControlsHidden(_ hidden: Bool, animated: Bool) {
-        // HIDE THE CONTROLS IF NEEDED
+        // Empty implementation. Should override in subclasses.
     }
 
     func setupGestures() {
@@ -653,7 +669,7 @@ class PlayerViewController: UIViewController {
             resetABRepeatMarks(true)
             break
         default:
-            assertionFailure("VideoPlayerViewController: Unvalid button.")
+            assertionFailure("PlayerViewController: Invalid button.")
         }
     }
 
diff --git a/Sources/Playback/Player/VideoPlayer-iOS/PlayerController.swift b/Sources/Playback/Player/VideoPlayer-iOS/PlayerController.swift
index f1759ab28..261fc9c25 100644
--- a/Sources/Playback/Player/VideoPlayer-iOS/PlayerController.swift
+++ b/Sources/Playback/Player/VideoPlayer-iOS/PlayerController.swift
@@ -26,14 +26,10 @@ 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
 
     // MARK: - UserDefaults computed properties getters
diff --git a/Sources/Playback/Player/VideoPlayer-iOS/VideoPlayerViewController.swift b/Sources/Playback/Player/VideoPlayer-iOS/VideoPlayerViewController.swift
index 8a6a38d4f..6c02d0cfe 100644
--- a/Sources/Playback/Player/VideoPlayer-iOS/VideoPlayerViewController.swift
+++ b/Sources/Playback/Player/VideoPlayer-iOS/VideoPlayerViewController.swift
@@ -311,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,
+                   isBrightnessControlEnabled: true)
 
         self.playerController.delegate = self
         self.mediaNavigationBar.addGestureRecognizer(minimizeGestureRecognizer)
@@ -341,7 +346,6 @@ class VideoPlayerViewController: PlayerViewController {
         super.viewWillAppear(animated)
         playbackService.delegate = self
         playbackService.recoverPlaybackState()
-        playerController.lockedOrientation = .portrait
         navigationController?.navigationBar.isHidden = true
         mediaScrubProgressBar.updateInterfacePosition()
 
@@ -392,16 +396,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,7 +461,6 @@ class VideoPlayerViewController: PlayerViewController {
         setupObservers()
         setupViews()
         setupAccessibility()
-        setupGestures()
         setupConstraints()
 #if os(iOS)
         setupRendererDiscoverer()
-- 
GitLab


From 8766189a3c6c19395480bbd3bf03a1178a9ae380 Mon Sep 17 00:00:00 2001
From: Craig Reyenga <craig.reyenga@gmail.com>
Date: Sun, 9 Mar 2025 20:38:20 -0400
Subject: [PATCH 3/4] Remove other duplicate code from player view controllers,
 including duplicate methods in the same file.

---
 .../AudioPlayerViewController.swift           |   2 +
 .../Player/PlayerViewController.swift         |  73 +++++-----
 .../VideoPlayerViewController.swift           | 127 ++----------------
 3 files changed, 43 insertions(+), 159 deletions(-)

diff --git a/Sources/Playback/Player/AudioPlayer/AudioPlayerViewController.swift b/Sources/Playback/Player/AudioPlayer/AudioPlayerViewController.swift
index c4a63408d..eee67f0d4 100644
--- a/Sources/Playback/Player/AudioPlayer/AudioPlayerViewController.swift
+++ b/Sources/Playback/Player/AudioPlayer/AudioPlayerViewController.swift
@@ -589,6 +589,8 @@ extension AudioPlayerViewController {
 
 extension AudioPlayerViewController {
     override func mediaMoreOptionsActionSheetDidToggleInterfaceLock(state: Bool) {
+        super.mediaMoreOptionsActionSheetDidToggleInterfaceLock(state: state)
+
         setPlayerInterfaceEnabled(!state)
     }
 
diff --git a/Sources/Playback/Player/PlayerViewController.swift b/Sources/Playback/Player/PlayerViewController.swift
index f4eb3e368..7e41a4b25 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?
 
@@ -244,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
@@ -271,9 +270,7 @@ class PlayerViewController: UIViewController {
 
         return rendererButton
     }()
-#endif
 
-#if os(iOS)
     let volumeView = MPVolumeView(frame: .zero)
 #endif
 
@@ -297,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,
@@ -387,6 +381,7 @@ class PlayerViewController: UIViewController {
         self.mediaLibraryService = mediaLibraryService
         self.playerController = playerController
         self.isBrightnessControlEnabled = false
+        self.systemBrightness = 1.0
 
         super.init(nibName: nil, bundle: nil)
 
@@ -585,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 {
@@ -610,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()
@@ -1016,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) {
@@ -1096,8 +1084,6 @@ class PlayerViewController: UIViewController {
     }
 
     @objc func handleDoubleTapGesture(_ sender: UITapGestureRecognizer) {
-        // CHECK THE TAP LOCATION
-
         executeSeekFromGesture(.tap)
     }
 
@@ -1120,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/VideoPlayerViewController.swift b/Sources/Playback/Player/VideoPlayer-iOS/VideoPlayerViewController.swift
index 6c02d0cfe..65839b6ac 100644
--- a/Sources/Playback/Player/VideoPlayer-iOS/VideoPlayerViewController.swift
+++ b/Sources/Playback/Player/VideoPlayer-iOS/VideoPlayerViewController.swift
@@ -329,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
@@ -351,8 +347,6 @@ class VideoPlayerViewController: PlayerViewController {
 
         setControlsHidden(false, animated: false)
 
-        setupSeekDurations()
-
         // Make sure interface is enabled on
         setPlayerInterfaceEnabled(true)
 
@@ -458,7 +452,6 @@ class VideoPlayerViewController: PlayerViewController {
     override func viewDidLoad() {
         super.viewDidLoad()
         navigationController?.navigationBar.isHidden = true
-        setupObservers()
         setupViews()
         setupAccessibility()
         setupConstraints()
@@ -469,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()
@@ -788,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
 
@@ -828,6 +788,8 @@ class VideoPlayerViewController: PlayerViewController {
         }
     }
 
+    // MARK: - Accessibility
+
     @objc private func handleAccessibilityPlayPause() -> Bool {
         togglePlayPause()
         return true
@@ -881,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
@@ -956,39 +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)
-    }
-
     @objc private func handleLongPressGesture(_ gestureRecognizer: UILongPressGestureRecognizer) {
         guard playerController.isSpeedUpGestureEnabled,
               playbackService.isPlaying else {
@@ -1267,29 +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 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 {
@@ -1353,18 +1264,6 @@ class VideoPlayerViewController: PlayerViewController {
 
         playerController.isInterfaceLocked = !enabled
     }
-
-    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)
-    }
 }
 
 // MARK: - Delegation
@@ -1451,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)
@@ -1507,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
@@ -1604,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)
 
-- 
GitLab


From 7d01fc64d78ddbf5e8231297e294346ae306f43c Mon Sep 17 00:00:00 2001
From: Craig Reyenga <craig.reyenga@gmail.com>
Date: Sun, 13 Apr 2025 20:41:45 -0400
Subject: [PATCH 4/4] MR feedback

---
 Buildsystem/Testing/UI/VLCTestMenu.swift           |  1 +
 .../AudioPlayer/AudioPlayerViewController.swift    |  2 +-
 Sources/Playback/Player/PlayerViewController.swift | 14 +++++++-------
 .../VideoPlayerViewController.swift                |  2 +-
 VLC.xcodeproj/project.pbxproj                      |  6 +++---
 5 files changed, 13 insertions(+), 12 deletions(-)

diff --git a/Buildsystem/Testing/UI/VLCTestMenu.swift b/Buildsystem/Testing/UI/VLCTestMenu.swift
index 168d9e730..86caa920f 100644
--- a/Buildsystem/Testing/UI/VLCTestMenu.swift
+++ b/Buildsystem/Testing/UI/VLCTestMenu.swift
@@ -78,5 +78,6 @@ class VLCTestMenu: XCTestCase {
         helper.tapTabBarItem(VLCAccessibilityIdentifier.settings)
         app.navigationBars.buttons[VLCAccessibilityIdentifier.about].tap()
         XCTAssertNotNil(app.navigationBars.buttons[VLCAccessibilityIdentifier.done])
+        XCTAssertNotNil(app.navigationBars.buttons[VLCAccessibilityIdentifier.contribute])
     }
 }
diff --git a/Sources/Playback/Player/AudioPlayer/AudioPlayerViewController.swift b/Sources/Playback/Player/AudioPlayer/AudioPlayerViewController.swift
index eee67f0d4..31e324299 100644
--- a/Sources/Playback/Player/AudioPlayer/AudioPlayerViewController.swift
+++ b/Sources/Playback/Player/AudioPlayer/AudioPlayerViewController.swift
@@ -66,7 +66,7 @@ class AudioPlayerViewController: PlayerViewController {
         super.init(mediaLibraryService: mediaLibraryService,
                    rendererDiscovererManager: rendererDiscovererManager,
                    playerController: playerController,
-                   isBrightnessControlEnabled: false)
+                   isBrightnessControlAvailable: false)
         NotificationCenter.default.addObserver(self, selector: #selector(playbackSpeedHasChanged(_:)), name: Notification.Name("ChangePlaybackSpeed"), object: nil)
 
         self.playerController.delegate = self
diff --git a/Sources/Playback/Player/PlayerViewController.swift b/Sources/Playback/Player/PlayerViewController.swift
index 7e41a4b25..67fec51e1 100644
--- a/Sources/Playback/Player/PlayerViewController.swift
+++ b/Sources/Playback/Player/PlayerViewController.swift
@@ -276,7 +276,7 @@ class PlayerViewController: UIViewController {
 
     var addBookmarksView: AddBookmarksView? = nil
 
-    private let isBrightnessControlEnabled: Bool
+    private let isBrightnessControlAvailable: Bool
 
     private var isGestureActive: Bool = false
 
@@ -364,11 +364,11 @@ class PlayerViewController: UIViewController {
     init(mediaLibraryService: MediaLibraryService,
          rendererDiscovererManager: VLCRendererDiscovererManager,
          playerController: PlayerController,
-         isBrightnessControlEnabled: Bool) {
+         isBrightnessControlAvailable: Bool) {
         self.mediaLibraryService = mediaLibraryService
         self.rendererDiscovererManager = rendererDiscovererManager
         self.playerController = playerController
-        self.isBrightnessControlEnabled = isBrightnessControlEnabled
+        self.isBrightnessControlAvailable = isBrightnessControlAvailable
 
         super.init(nibName: nil, bundle: nil)
 
@@ -380,7 +380,7 @@ class PlayerViewController: UIViewController {
     init(mediaLibraryService: MediaLibraryService, playerController: PlayerController) {
         self.mediaLibraryService = mediaLibraryService
         self.playerController = playerController
-        self.isBrightnessControlEnabled = false
+        self.isBrightnessControlAvailable = false
         self.systemBrightness = 1.0
 
         super.init(nibName: nil, bundle: nil)
@@ -433,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 && isBrightnessControlEnabled {
+        if !playerController.isRememberBrightnessEnabled && isBrightnessControlAvailable {
             brightnessControlView.updateIcon(level: brightnessControl.fetchAndGetDeviceValue())
         }
 #endif
@@ -443,7 +443,7 @@ class PlayerViewController: UIViewController {
     override func viewDidAppear(_ animated: Bool) {
         super.viewDidAppear(animated)
 
-        if playerController.isRememberBrightnessEnabled && isBrightnessControlEnabled {
+        if playerController.isRememberBrightnessEnabled && isBrightnessControlAvailable {
             if let brightness = userDefaults.value(forKey: KVLCPlayerBrightness) as? CGFloat {
                 animateBrightness(to: brightness)
                 self.brightnessControl.value = Float(brightness)
@@ -465,7 +465,7 @@ class PlayerViewController: UIViewController {
     override func viewDidDisappear(_ animated: Bool) {
         super.viewDidDisappear(animated)
 
-        if playerController.isRememberBrightnessEnabled && isBrightnessControlEnabled {
+        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)
diff --git a/Sources/Playback/Player/VideoPlayer-iOS/VideoPlayerViewController.swift b/Sources/Playback/Player/VideoPlayer-iOS/VideoPlayerViewController.swift
index 65839b6ac..ceb6249f3 100644
--- a/Sources/Playback/Player/VideoPlayer-iOS/VideoPlayerViewController.swift
+++ b/Sources/Playback/Player/VideoPlayer-iOS/VideoPlayerViewController.swift
@@ -317,7 +317,7 @@ class VideoPlayerViewController: PlayerViewController {
         super.init(mediaLibraryService: mediaLibraryService,
                    rendererDiscovererManager: rendererDiscovererManager,
                    playerController: playerController,
-                   isBrightnessControlEnabled: true)
+                   isBrightnessControlAvailable: true)
 
         self.playerController.delegate = self
         self.mediaNavigationBar.addGestureRecognizer(minimizeGestureRecognizer)
diff --git a/VLC.xcodeproj/project.pbxproj b/VLC.xcodeproj/project.pbxproj
index 22a31cd48..94af9dff1 100644
--- a/VLC.xcodeproj/project.pbxproj
+++ b/VLC.xcodeproj/project.pbxproj
@@ -5282,7 +5282,7 @@
 				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
 				GCC_WARN_UNUSED_FUNCTION = YES;
 				INFOPLIST_FILE = Buildsystem/Testing/UI/Info.plist;
-				IPHONEOS_DEPLOYMENT_TARGET = 12;
+				IPHONEOS_DEPLOYMENT_TARGET = 9.0;
 				LD_RUNPATH_SEARCH_PATHS = (
 					"$(inherited)",
 					"@executable_path/Frameworks",
@@ -5336,7 +5336,7 @@
 				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
 				GCC_WARN_UNUSED_FUNCTION = YES;
 				INFOPLIST_FILE = Buildsystem/Testing/UI/Info.plist;
-				IPHONEOS_DEPLOYMENT_TARGET = 12;
+				IPHONEOS_DEPLOYMENT_TARGET = 9.0;
 				LD_RUNPATH_SEARCH_PATHS = (
 					"$(inherited)",
 					"@executable_path/Frameworks",
@@ -5391,7 +5391,7 @@
 				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
 				GCC_WARN_UNUSED_FUNCTION = YES;
 				INFOPLIST_FILE = Buildsystem/Testing/UI/Info.plist;
-				IPHONEOS_DEPLOYMENT_TARGET = 12;
+				IPHONEOS_DEPLOYMENT_TARGET = 9.0;
 				LD_RUNPATH_SEARCH_PATHS = (
 					"$(inherited)",
 					"@executable_path/Frameworks",
-- 
GitLab