From c0053cf83766de5f8177ef57bd44e9ae1283073a Mon Sep 17 00:00:00 2001 From: Arkadiusz Fal Date: Mon, 22 May 2023 22:48:11 +0200 Subject: [PATCH] Fix PiP close on Mac --- Model/Player/PiPDelegate.swift | 4 +++- Shared/Player/AppleAVPlayerView.swift | 4 +--- Shared/Player/PlayerBackendView.swift | 1 + macOS/MacOSPiPDelegate.swift | 11 ++++------- 4 files changed, 9 insertions(+), 11 deletions(-) diff --git a/Model/Player/PiPDelegate.swift b/Model/Player/PiPDelegate.swift index 2fa459e2..504e6a4c 100644 --- a/Model/Player/PiPDelegate.swift +++ b/Model/Player/PiPDelegate.swift @@ -31,7 +31,9 @@ final class PiPDelegate: NSObject, AVPictureInPictureControllerDelegate { player.controls.objectWillChange.send() } - func pictureInPictureControllerWillStopPictureInPicture(_: AVPictureInPictureController) {} + func pictureInPictureControllerWillStopPictureInPicture(_: AVPictureInPictureController) { + player.show() + } func pictureInPictureController( _: AVPictureInPictureController, diff --git a/Shared/Player/AppleAVPlayerView.swift b/Shared/Player/AppleAVPlayerView.swift index 0538f94f..e553ceaa 100644 --- a/Shared/Player/AppleAVPlayerView.swift +++ b/Shared/Player/AppleAVPlayerView.swift @@ -143,14 +143,12 @@ import SwiftUI } #else struct AppleAVPlayerView: NSViewRepresentable { - @State private var pictureInPictureDelegate = MacOSPiPDelegate() - func makeNSView(context _: Context) -> some NSView { let view = AVPlayerView() view.player = PlayerModel.shared.avPlayerBackend.avPlayer view.showsFullScreenToggleButton = true view.allowsPictureInPicturePlayback = true - view.pictureInPictureDelegate = pictureInPictureDelegate + view.pictureInPictureDelegate = MacOSPiPDelegate.shared return view } diff --git a/Shared/Player/PlayerBackendView.swift b/Shared/Player/PlayerBackendView.swift index 0eda367c..7e41e42e 100644 --- a/Shared/Player/PlayerBackendView.swift +++ b/Shared/Player/PlayerBackendView.swift @@ -28,6 +28,7 @@ struct PlayerBackendView: View { { AppleAVPlayerView() } else if !avPlayerUsesSystemControls || + player.playingInPictureInPicture || player.avPlayerBackend.isStartingPiP { AppleAVPlayerLayerView() diff --git a/macOS/MacOSPiPDelegate.swift b/macOS/MacOSPiPDelegate.swift index 8927c95a..6ece9179 100644 --- a/macOS/MacOSPiPDelegate.swift +++ b/macOS/MacOSPiPDelegate.swift @@ -2,6 +2,8 @@ import AVKit import Foundation final class MacOSPiPDelegate: NSObject, AVPlayerViewPictureInPictureDelegate { + static let shared = MacOSPiPDelegate() + var playerModel: PlayerModel { .shared } func playerViewShouldAutomaticallyDismissAtPicture(inPictureStart _: AVPlayerView) -> Bool { @@ -16,19 +18,14 @@ final class MacOSPiPDelegate: NSObject, AVPlayerViewPictureInPictureDelegate { } func playerViewWillStopPicture(inPicture _: AVPlayerView) { - DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) { [weak self] in - self?.playerModel.playingInPictureInPicture = false - self?.playerModel.show() - } + playerModel.show() + playerModel.playingInPictureInPicture = false } func playerView( _: AVPlayerView, restoreUserInterfaceForPictureInPictureStopWithCompletionHandler completionHandler: (Bool) -> Void ) { - DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) { [weak self] in - self?.playerModel.show() - } completionHandler(true) } }