From f9ab6434103893867996a8f50a84ac874128d275 Mon Sep 17 00:00:00 2001
From: Diogo Simao Marques <dogo@videolabs.io>
Date: Thu, 7 Nov 2024 14:28:29 +0100
Subject: [PATCH] PlayerViewController: Add notifications when adding or
 removing medias to the queue

Appending a media to the queue or removing one from it can now impact
the display of the player controls.

If the play queue contains a single media after such an action, the
player controls will display the seek buttons, if not the skip buttons
will be displayed allowing the user to select different medias from
the queue.
---
 .../Player/AudioPlayer/AudioPlayerView.swift         | 12 ++++++++++++
 .../AudioPlayer/AudioPlayerViewController.swift      |  5 +++++
 Sources/Playback/Player/PlayerViewController.swift   |  9 ++++++++-
 3 files changed, 25 insertions(+), 1 deletion(-)

diff --git a/Sources/Playback/Player/AudioPlayer/AudioPlayerView.swift b/Sources/Playback/Player/AudioPlayer/AudioPlayerView.swift
index 5ebbc0978..aff0feda7 100644
--- a/Sources/Playback/Player/AudioPlayer/AudioPlayerView.swift
+++ b/Sources/Playback/Player/AudioPlayer/AudioPlayerView.swift
@@ -376,6 +376,18 @@ class AudioPlayerView: UIView, UIGestureRecognizerDelegate {
         playbackSpeedButton.alpha = enabled ? 1.0 : 0.5
     }
 
+    func shouldEnableSeekButtons(_ enabled: Bool) {
+        backwardButton.isEnabled = enabled
+        backwardButton.isHidden = !enabled
+        forwardButton.isEnabled = enabled
+        forwardButton.isHidden = !enabled
+
+        previousButton.isEnabled = !enabled
+        previousButton.isHidden = enabled
+        nextButton.isEnabled = !enabled
+        nextButton.isHidden = enabled
+    }
+
     func updateConstraints(for orientation: UIDeviceOrientation) {
         let isPad: Bool = UIDevice.current.userInterfaceIdiom == .pad
 
diff --git a/Sources/Playback/Player/AudioPlayer/AudioPlayerViewController.swift b/Sources/Playback/Player/AudioPlayer/AudioPlayerViewController.swift
index 6d5ea2b38..c25138e25 100644
--- a/Sources/Playback/Player/AudioPlayer/AudioPlayerViewController.swift
+++ b/Sources/Playback/Player/AudioPlayer/AudioPlayerViewController.swift
@@ -320,6 +320,10 @@ class AudioPlayerViewController: PlayerViewController {
 
         return orientation
     }
+
+    @objc override func updatePlayerControls() {
+        audioPlayerView.shouldEnableSeekButtons(playbackService.mediaList.count == 1)
+    }
 }
 
 // MARK: - AudioPlayerViewDelegate
@@ -439,6 +443,7 @@ extension AudioPlayerViewController {
                                       for: playbackService)
 
         audioPlayerView.updatePlayButton(isPlaying: isPlaying)
+        audioPlayerView.shouldEnableSeekButtons(playbackService.mediaList.count == 1)
 
         let image: UIImage? = isPlaying ? UIImage(named: "minimize") : UIImage(named: "close")
         let accessibilityLabel: String = isPlaying ? NSLocalizedString("MINIMIZE_BUTTON", comment: "") : NSLocalizedString("STOP_BUTTON", comment: "")
diff --git a/Sources/Playback/Player/PlayerViewController.swift b/Sources/Playback/Player/PlayerViewController.swift
index efc39d4a4..661961fa1 100644
--- a/Sources/Playback/Player/PlayerViewController.swift
+++ b/Sources/Playback/Player/PlayerViewController.swift
@@ -630,10 +630,13 @@ class PlayerViewController: UIViewController {
         volumeView.alpha = 0.00001
         view.addSubview(volumeView)
     }
-    
+
     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 setupSeekDurations() {
@@ -901,6 +904,10 @@ class PlayerViewController: UIViewController {
 
         executeSeekFromGesture(.tap)
     }
+
+    @objc func updatePlayerControls() {
+        // UPDATE THE PLAYER CONTROLS
+    }
 }
 
 // MARK: - VLCPlaybackServiceDelegate
-- 
GitLab