1
1
mirror of https://github.com/danbee/persephone synced 2025-03-04 08:39:11 +00:00
persephone/iOS/Components/Now Playing/NowPlayingBarViewController.swift
2021-02-14 09:13:19 -05:00

135 lines
3.8 KiB
Swift

//
// NowPlayingViewController.swift
// Persephone-iOS
//
// Created by Dan Barber on 2020-5-15.
// Copyright © 2020 Dan Barber. All rights reserved.
//
import UIKit
import ReSwift
import Kingfisher
class NowPlayingBarViewController: UIViewController {
@IBOutlet var separatorHeight: NSLayoutConstraint!
@IBOutlet var playPauseButton: UIButton!
@IBOutlet var nextButton: UIButton!
@IBOutlet var songTitle: UILabel!
@IBOutlet var albumCoverView: UIImageView!
override func viewDidLoad() {
super.viewDidLoad()
separatorHeight.constant = 1 / traitCollection.displayScale
App.store.subscribe(self) {
$0.select {
($0.playerState, $0.queueState)
}
}
NotificationCenter.default.addObserver(self, selector: #selector(didConnect), name: .didConnect, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(willDisconnect), name: .willDisconnect, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(didReloadAlbumArt), name: .didReloadAlbumArt, object: nil)
albumCoverView.layer.backgroundColor = UIColor.black.cgColor
albumCoverView.layer.cornerRadius = 4
albumCoverView.layer.borderWidth = 1 / traitCollection.displayScale
albumCoverView.layer.masksToBounds = true
setAppearance()
}
override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
super.traitCollectionDidChange(previousTraitCollection)
separatorHeight.constant = 1 / traitCollection.displayScale
if traitCollection.hasDifferentColorAppearance(comparedTo: previousTraitCollection) {
setAppearance()
}
}
func setAppearance() {
let darkMode = traitCollection.userInterfaceStyle == .dark
albumCoverView.layer.borderColor = darkMode ? CGColor.albumBorderColorDark : CGColor.albumBorderColorLight
}
@objc func didConnect() {
App.mpdClient.fetchQueue()
}
@objc func willDisconnect() {
DispatchQueue.main.async {
App.store.dispatch(UpdateQueuePosAction(queuePos: -1))
App.store.dispatch(UpdateQueueAction(queue: []))
}
}
@objc func didReloadAlbumArt() {
// NO-OP
}
func setTransportControlState(_ state: PlayerState) {
guard let state = state.state else { return }
playPauseButton.isEnabled = state.isOneOf([.playing, .paused, .stopped])
nextButton.isEnabled = state.isOneOf([.playing, .paused])
if state.isOneOf([.paused, .stopped, .unknown]) {
playPauseButton.setImage(.playIconLarge, for: .normal)
} else {
playPauseButton.setImage(.pauseIconLarge, for: .normal)
}
}
func setSong(_ song: Song?) {
guard let song = song else {
self.songTitle.text = "Not Playing"
self.albumCoverView.image = .defaultCoverArt
return
}
songTitle.text = song.title
let provider = MPDAlbumArtImageDataProvider(
songUri: song.mpdSong.uriString,
cacheKey: song.album.hash
)
albumCoverView.kf.setImage(
with: .provider(provider),
placeholder: UIImage.defaultCoverArt,
options: [
.processor(DownsamplingImageProcessor(size: .queueSongCoverSize)),
.scaleFactor(traitCollection.displayScale),
]
)
}
@IBAction func playPauseButtonAction(_ sender: Any) {
App.mpdClient.playPause()
}
@IBAction func nextButtonAction(_ sender: Any) {
App.mpdClient.nextTrack()
}
@IBAction func expandNowPlaying(_ sender: Any) {
}
}
extension NowPlayingBarViewController: StoreSubscriber {
typealias StoreSubscriberStateType = (
playerState: PlayerState, queueState: QueueState
)
func newState(state: StoreSubscriberStateType) {
DispatchQueue.main.async {
self.setTransportControlState(state.playerState)
self.setSong(state.playerState.currentSong)
}
}
}