1
0
mirror of https://github.com/yattee/yattee.git synced 2025-01-06 01:20:31 +05:30
yattee/Model/Player/PlayerControlsModel.swift

138 lines
3.7 KiB
Swift
Raw Normal View History

import Combine
2022-02-17 01:53:11 +05:30
import CoreMedia
2022-07-11 22:00:12 +05:30
import Defaults
2022-02-17 01:53:11 +05:30
import Foundation
import SwiftUI
final class PlayerControlsModel: ObservableObject {
2022-05-22 02:28:11 +05:30
@Published var isLoadingVideo = false
2022-02-17 01:53:11 +05:30
@Published var isPlaying = true
@Published var presentingControls = false { didSet { handlePresentationChange() } }
2022-07-11 22:00:12 +05:30
@Published var presentingControlsOverlay = false { didSet { handleSettingsOverlayPresentationChange() } }
@Published var presentingDetailsOverlay = false { didSet { handleDetailsOverlayPresentationChange() } }
2022-08-14 22:23:03 +05:30
var timer: Timer?
2022-02-17 01:53:11 +05:30
#if os(tvOS)
private(set) var reporter = PassthroughSubject<String, Never>()
#endif
2022-02-17 01:53:11 +05:30
var player: PlayerModel!
init(
isLoadingVideo: Bool = false,
isPlaying: Bool = true,
presentingControls: Bool = false,
presentingControlsOverlay: Bool = false,
2022-07-10 23:21:46 +05:30
presentingDetailsOverlay: Bool = false,
timer: Timer? = nil,
player: PlayerModel? = nil
) {
self.isLoadingVideo = isLoadingVideo
self.isPlaying = isPlaying
self.presentingControls = presentingControls
self.presentingControlsOverlay = presentingControlsOverlay
2022-07-10 23:21:46 +05:30
self.presentingDetailsOverlay = presentingDetailsOverlay
self.timer = timer
self.player = player
2022-02-17 01:53:11 +05:30
}
func handlePresentationChange() {
2022-08-24 02:44:13 +05:30
guard let player = player else { return }
if presentingControls {
2022-08-24 02:59:50 +05:30
DispatchQueue.main.async(qos: .userInteractive) { [weak self] in
player.backend.startControlsUpdates()
self?.resetTimer()
}
2022-08-24 02:44:13 +05:30
} else {
if !player.musicMode {
2022-08-24 02:59:50 +05:30
DispatchQueue.main.async(qos: .userInteractive) { [weak self] in
player.backend.stopControlsUpdates()
self?.removeTimer()
}
2022-07-10 23:21:46 +05:30
} else {
2022-08-24 02:59:50 +05:30
DispatchQueue.main.async(qos: .userInteractive) { [weak self] in
self?.presentingControls = true
}
2022-02-17 01:53:11 +05:30
}
}
}
2022-07-11 22:00:12 +05:30
func handleSettingsOverlayPresentationChange() {
player?.backend.setNeedsNetworkStateUpdates(presentingControlsOverlay && Defaults[.showMPVPlaybackStats])
2022-06-25 05:09:29 +05:30
}
2022-08-24 02:44:13 +05:30
func handleDetailsOverlayPresentationChange() {}
2022-07-11 22:00:12 +05:30
2022-07-10 23:21:46 +05:30
var presentingOverlays: Bool {
presentingDetailsOverlay || presentingControlsOverlay
}
func hideOverlays() {
presentingDetailsOverlay = false
presentingControlsOverlay = false
}
2022-02-17 01:53:11 +05:30
func show() {
2022-03-28 00:54:32 +05:30
guard !(player?.currentItem.isNil ?? true) else {
return
}
guard !presentingControls else {
return
}
2022-02-22 02:27:12 +05:30
2022-06-16 23:14:39 +05:30
player.backend.updateControls()
2022-02-17 01:53:11 +05:30
withAnimation(PlayerControls.animation) {
presentingControls = true
}
}
func hide() {
2022-06-08 02:57:48 +05:30
guard let player = player,
!player.musicMode
else {
return
}
2022-03-28 00:54:32 +05:30
2022-06-08 02:57:48 +05:30
player.backend.stopControlsUpdates()
guard !player.currentItem.isNil else {
2022-03-28 00:54:32 +05:30
return
}
guard presentingControls else {
return
}
2022-02-17 01:53:11 +05:30
withAnimation(PlayerControls.animation) {
presentingControls = false
}
}
func toggle() {
2022-06-08 02:57:48 +05:30
presentingControls ? hide() : show()
2022-02-17 01:53:11 +05:30
}
func resetTimer() {
removeTimer()
2022-06-08 02:57:48 +05:30
2022-06-08 03:35:02 +05:30
guard let player = player, !player.musicMode else {
2022-06-08 02:57:48 +05:30
return
}
2022-02-17 01:53:11 +05:30
timer = Timer.scheduledTimer(withTimeInterval: 5.0, repeats: false) { _ in
withAnimation(PlayerControls.animation) { [weak self] in
self?.presentingControls = false
}
}
}
func removeTimer() {
timer?.invalidate()
timer = nil
}
2022-03-28 00:54:32 +05:30
func update() {
2022-06-16 23:14:39 +05:30
player?.backend.updateControls()
2022-03-28 00:54:32 +05:30
}
2022-02-17 01:53:11 +05:30
}