| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091 |
- //
- // VideoView.swift
- // LoopKitUI
- //
- // Created by Rick Pasetto on 4/13/21.
- // Copyright © 2021 Tidepool Project. All rights reserved.
- //
- import SwiftUI
- import AVKit
- /// Opens a Swift `VideoPlayer` on the given URL in a new page
- public struct VideoView: View {
- @Environment(\.dismissAction) var dismiss
- let url: URL?
- let autoPlay: Bool
-
- private class PlayerHolder {
- private let prevCategory: AVAudioSession.Category?
- private var player: AVPlayer?
-
- init(overrideMuteSwitch: Bool) {
- if overrideMuteSwitch {
- prevCategory = AVAudioSession.sharedInstance().category
- } else {
- prevCategory = nil
- }
- }
-
- func destroy() {
- if let prevCategory = prevCategory {
- try? AVAudioSession.sharedInstance().setCategory(prevCategory)
- }
- }
-
- func player(for url: URL, autoPlay: Bool) -> AVPlayer {
- if let player = player {
- return player
- } else {
- let player = AVPlayer(url: url)
- if autoPlay, player.timeControlStatus == .paused {
- player.play()
- } else if !autoPlay, player.timeControlStatus == .playing {
- player.pause()
- }
- if prevCategory != nil {
- // Overrides mute switch (Silent mode) on the phone
- try? AVAudioSession.sharedInstance().setCategory(AVAudioSession.Category.playback)
- }
- self.player = player
- return player
- }
- }
- }
- private let playerHolder: PlayerHolder
- public init(url: URL?, autoPlay: Bool, overrideMuteSwitch: Bool = false) {
- self.url = url
- self.autoPlay = autoPlay
- self.playerHolder = PlayerHolder(overrideMuteSwitch: overrideMuteSwitch)
- }
-
- public var body: some View {
- HStack {
- Spacer()
- Button(LocalizedString("Done", comment: "Video player done button label"), action: dismiss)
- }
- .padding()
- if let url = url {
- VideoPlayer(player: playerHolder.player(for: url, autoPlay: autoPlay))
- .onDisappear {
- playerHolder.destroy()
- }
- } else {
- Spacer()
- Image(systemName: "questionmark.video")
- .resizable()
- .scaledToFit()
- .frame(width: 100, height: 100, alignment: .center)
- Spacer()
- }
- }
- }
- struct VideoView_Previews: PreviewProvider {
- static var previews: some View {
- VideoView(url: nil, autoPlay: true, overrideMuteSwitch: true)
- }
- }
|