Files
simplex-chat/apps/ios/Shared/Views/Helpers/VideoPlayerView.swift
T
Stanislav Dmitrenko 2dc621a56c mobile: keep screen on while playing/recording media (#3317)
* android: keep screen on while playing/recording media

* ios: keep screen on while playing/recording media

* different implementation on ios

* Revert "android: keep screen on while playing/recording media"

This reverts commit d291f006e9.

* different implementation on android

* refactor

---------

Co-authored-by: Avently <avently@local>
Co-authored-by: Evgeny Poberezkin <2769109+epoberezkin@users.noreply.github.com>
2023-11-07 16:56:38 +00:00

67 lines
2.0 KiB
Swift

//
// Created by Avently on 30.03.2023.
// Copyright (c) 2023 SimpleX Chat. All rights reserved.
//
import Foundation
import SwiftUI
import AVKit
import Combine
struct VideoPlayerView: UIViewRepresentable {
static var players: [String: AVPlayer] = [:]
static func getOrCreatePlayer(_ url: URL, _ gallery: Bool) -> AVPlayer {
if let player = players[url.absoluteString + gallery.description] {
return player
} else {
let player = AVPlayer(url: url)
players[url.absoluteString + gallery.description] = player
return player
}
}
typealias UIViewType = UIView
let player: AVPlayer
let url: URL
let showControls: Bool
func makeUIView(context: UIViewRepresentableContext<VideoPlayerView>) -> UIView {
let controller = AVPlayerViewController()
controller.showsPlaybackControls = showControls
if #available(iOS 16.0, *) {
controller.speeds = []
}
controller.player = player
context.coordinator.controller = controller
context.coordinator.timeObserver = NotificationCenter.default.addObserver(forName: .AVPlayerItemDidPlayToEndTime, object: player.currentItem, queue: .main) { _ in
player.seek(to: CMTime.zero)
player.play()
}
context.coordinator.publisher = player.publisher(for: \.timeControlStatus).sink { status in
AppDelegate.keepScreenOn(status == .playing)
}
return controller.view
}
func updateUIView(_ uiView: UIView, context: UIViewRepresentableContext<VideoPlayerView>) {
}
func makeCoordinator() -> VideoPlayerView.Coordinator {
Coordinator()
}
class Coordinator: NSObject {
var controller: AVPlayerViewController?
var timeObserver: Any? = nil
var publisher: AnyCancellable? = nil
deinit {
if let timeObserver = timeObserver {
NotificationCenter.default.removeObserver(timeObserver)
}
publisher?.cancel()
}
}
}