Improve PiP

Fix #186
Fix #196
This commit is contained in:
Arkadiusz Fal
2022-08-26 22:17:21 +02:00
parent 99881ccc23
commit 60f38a80aa
13 changed files with 173 additions and 104 deletions

View File

@@ -127,6 +127,7 @@ extension Defaults.Keys {
#if !os(macOS)
static let closePiPAndOpenPlayerOnEnteringForeground = Key<Bool>("closePiPAndOpenPlayerOnEnteringForeground", default: false)
#endif
static let closePlayerOnOpeningPiP = Key<Bool>("closePlayerOnOpeningPiP", default: false)
static let recentlyOpened = Key<[RecentItem]>("recentlyOpened", default: [])

View File

@@ -95,7 +95,7 @@ extension AppleAVPlayerViewController: AVPlayerViewControllerDelegate {
}
func playerViewControllerWillBeginDismissalTransition(_: AVPlayerViewController) {
if Defaults[.pauseOnHidingPlayer] {
if Defaults[.pauseOnHidingPlayer], !playerModel.playingInPictureInPicture {
playerModel.pause()
}
dismiss(animated: false)
@@ -121,15 +121,12 @@ extension AppleAVPlayerViewController: AVPlayerViewControllerDelegate {
self.playerModel.show()
self.playerModel.setNeedsDrawing(true)
#if os(tvOS)
if self.playerModel.playingInPictureInPicture {
self.present(self.playerView, animated: false) {
completionHandler(true)
}
if self.playerModel.playingInPictureInPicture {
self.present(self.playerView, animated: false) {
completionHandler(true)
}
#else
completionHandler(true)
#endif
}
completionHandler(true)
}
}

View File

@@ -277,9 +277,11 @@ struct PlayerControls: View {
}
private var pipButton: some View {
button("PiP", systemImage: "pip") {
model.startPiP()
let image = player.transitioningToPiP ? "pip.fill" : player.pipController?.isPictureInPictureActive ?? false ? "pip.exit" : "pip.enter"
return button("PiP", systemImage: image) {
(player.pipController?.isPictureInPictureActive ?? false) ? player.closePiP() : player.startPiP()
}
.disabled(!player.pipPossible)
}
#if os(iOS)

View File

@@ -17,6 +17,7 @@ struct PlayerSettings: View {
#endif
@Default(.closePiPOnNavigation) private var closePiPOnNavigation
@Default(.closePiPOnOpeningPlayer) private var closePiPOnOpeningPlayer
@Default(.closePlayerOnOpeningPiP) private var closePlayerOnOpeningPiP
#if !os(macOS)
@Default(.closePlayerOnItemClose) private var closePlayerOnItemClose
@Default(.pauseOnEnteringBackground) private var pauseOnEnteringBackground
@@ -96,6 +97,7 @@ struct PlayerSettings: View {
Section(header: SettingsHeader(text: "Picture in Picture")) {
closePiPOnNavigationToggle
closePiPOnOpeningPlayerToggle
closePlayerOnOpeningPiPToggle
#if !os(macOS)
closePiPAndOpenPlayerOnEnteringForegroundToggle
#endif
@@ -201,6 +203,10 @@ struct PlayerSettings: View {
Toggle("Close PiP when player is opened", isOn: $closePiPOnOpeningPlayer)
}
private var closePlayerOnOpeningPiPToggle: some View {
Toggle("Close player when starting PiP", isOn: $closePlayerOnOpeningPiP)
}
#if !os(macOS)
private var closePiPAndOpenPlayerOnEnteringForegroundToggle: some View {
Toggle("Close PiP and open player when application enters foreground", isOn: $closePiPAndOpenPlayerOnEnteringForeground)

View File

@@ -167,7 +167,15 @@ struct VideoContextMenuView: View {
private var playNowInPictureInPictureButton: some View {
Button {
player.controls.startPiP(startImmediately: player.presentingPlayer && player.activeBackend == .appleAVPlayer)
player.avPlayerBackend.startPictureInPictureOnPlay = true
#if !os(macOS)
player.exitFullScreen()
#endif
if player.activeBackend != PlayerBackendType.appleAVPlayer {
player.changeActiveBackend(from: .mpv, to: .appleAVPlayer)
}
player.hide()
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {