chore: the play interrupts event could be sent with the notification
This commit is contained in:
parent
7556e57de9
commit
2657dde184
|
@ -37,7 +37,11 @@ extension StatusSection {
|
|||
StatusSection.configure(
|
||||
cell: cell,
|
||||
dependency: dependency,
|
||||
readableLayoutFrame: tableView.readableContentGuide.layoutFrame, timestampUpdatePublisher: timestampUpdatePublisher, toot: timelineIndex.toot, requestUserID: timelineIndex.userID, statusItemAttribute: attribute
|
||||
readableLayoutFrame: tableView.readableContentGuide.layoutFrame,
|
||||
timestampUpdatePublisher: timestampUpdatePublisher,
|
||||
toot: timelineIndex.toot,
|
||||
requestUserID: timelineIndex.userID,
|
||||
statusItemAttribute: attribute
|
||||
)
|
||||
}
|
||||
cell.delegate = statusTableViewCellDelegate
|
||||
|
@ -52,7 +56,11 @@ extension StatusSection {
|
|||
StatusSection.configure(
|
||||
cell: cell,
|
||||
dependency: dependency,
|
||||
readableLayoutFrame: tableView.readableContentGuide.layoutFrame, timestampUpdatePublisher: timestampUpdatePublisher, toot: toot, requestUserID: requestUserID, statusItemAttribute: attribute
|
||||
readableLayoutFrame: tableView.readableContentGuide.layoutFrame,
|
||||
timestampUpdatePublisher: timestampUpdatePublisher,
|
||||
toot: toot,
|
||||
requestUserID: requestUserID,
|
||||
statusItemAttribute: attribute
|
||||
)
|
||||
}
|
||||
cell.delegate = statusTableViewCellDelegate
|
||||
|
@ -168,7 +176,7 @@ extension StatusSection {
|
|||
// set audio
|
||||
if let audioAttachment = mediaAttachments.filter({ $0.type == .audio }).first {
|
||||
cell.statusView.audioView.isHidden = false
|
||||
AudioContainerViewModel.configure(cell: cell, audioAttachment: audioAttachment, videoPlaybackService: dependency.context.videoPlaybackService)
|
||||
AudioContainerViewModel.configure(cell: cell, audioAttachment: audioAttachment )
|
||||
} else {
|
||||
cell.statusView.audioView.isHidden = true
|
||||
}
|
||||
|
|
|
@ -141,7 +141,7 @@ extension HomeTimelineViewController {
|
|||
|
||||
override func viewDidDisappear(_ animated: Bool) {
|
||||
super.viewDidDisappear(animated)
|
||||
|
||||
context.videoPlaybackService.viewDidDisappear(from: self)
|
||||
}
|
||||
|
||||
override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
|
||||
|
@ -236,7 +236,10 @@ extension HomeTimelineViewController: UITableViewDelegate {
|
|||
func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
|
||||
handleTableView(tableView, willDisplay: cell, forRowAt: indexPath)
|
||||
}
|
||||
|
||||
|
||||
func tableView(_ tableView: UITableView, didEndDisplaying cell: UITableViewCell, forRowAt indexPath: IndexPath) {
|
||||
handleTableView(tableView, didEndDisplaying: cell, forRowAt: indexPath)
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: - ContentOffsetAdjustableTimelineViewControllerDelegate
|
||||
|
|
|
@ -81,6 +81,10 @@ extension PublicTimelineViewController {
|
|||
)
|
||||
}
|
||||
|
||||
override func viewDidDisappear(_ animated: Bool) {
|
||||
super.viewDidDisappear(animated)
|
||||
context.videoPlaybackService.viewDidDisappear(from: self)
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: - UIScrollViewDelegate
|
||||
|
@ -103,6 +107,7 @@ extension PublicTimelineViewController {
|
|||
// MARK: - UITableViewDelegate
|
||||
extension PublicTimelineViewController: UITableViewDelegate {
|
||||
func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
|
||||
|
||||
guard let diffableDataSource = viewModel.diffableDataSource else { return 100 }
|
||||
guard let item = diffableDataSource.itemIdentifier(for: indexPath) else { return 100 }
|
||||
|
||||
|
@ -114,8 +119,11 @@ extension PublicTimelineViewController: UITableViewDelegate {
|
|||
}
|
||||
|
||||
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {}
|
||||
|
||||
func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
|
||||
handleTableView(tableView, willDisplay: cell, forRowAt: indexPath)
|
||||
}
|
||||
func tableView(_ tableView: UITableView, didEndDisplaying cell: UITableViewCell, forRowAt indexPath: IndexPath) {
|
||||
handleTableView(tableView, didEndDisplaying: cell, forRowAt: indexPath)
|
||||
guard let diffableDataSource = viewModel.diffableDataSource else { return }
|
||||
guard let item = diffableDataSource.itemIdentifier(for: indexPath) else { return }
|
||||
|
||||
|
|
|
@ -12,8 +12,7 @@ import UIKit
|
|||
class AudioContainerViewModel {
|
||||
static func configure(
|
||||
cell: StatusTableViewCell,
|
||||
audioAttachment: Attachment,
|
||||
videoPlaybackService: VideoPlaybackService
|
||||
audioAttachment: Attachment
|
||||
) {
|
||||
guard let duration = audioAttachment.meta?.original?.duration else { return }
|
||||
let audioView = cell.statusView.audioView
|
||||
|
@ -26,15 +25,12 @@ class AudioContainerViewModel {
|
|||
AudioPlayer.shared.pause()
|
||||
} else {
|
||||
AudioPlayer.shared.resume()
|
||||
videoPlaybackService.pauseWhenPlayAudio()
|
||||
}
|
||||
if AudioPlayer.shared.currentTimeSubject.value == 0 {
|
||||
AudioPlayer.shared.playAudio(audioAttachment: audioAttachment)
|
||||
videoPlaybackService.pauseWhenPlayAudio()
|
||||
}
|
||||
} else {
|
||||
AudioPlayer.shared.playAudio(audioAttachment: audioAttachment)
|
||||
videoPlaybackService.pauseWhenPlayAudio()
|
||||
}
|
||||
}
|
||||
.store(in: &cell.disposeBag)
|
||||
|
|
|
@ -14,6 +14,7 @@ import UIKit
|
|||
final class VideoPlayerViewModel {
|
||||
var disposeBag = Set<AnyCancellable>()
|
||||
|
||||
static let appWillPlayVideoNotification = NSNotification.Name(rawValue: "appWillPlayVideoNotification")
|
||||
// input
|
||||
let previewImageURL: URL?
|
||||
let videoURL: URL
|
||||
|
@ -63,7 +64,7 @@ final class VideoPlayerViewModel {
|
|||
.sink { [weak self] timeControlStatus in
|
||||
guard let _ = self else { return }
|
||||
guard timeControlStatus == .playing else { return }
|
||||
AudioPlayer.shared.pauseIfNeed()
|
||||
NotificationCenter.default.post(name: VideoPlayerViewModel.appWillPlayVideoNotification, object: nil)
|
||||
switch videoKind {
|
||||
case .gif:
|
||||
break
|
||||
|
|
|
@ -12,6 +12,9 @@ import Foundation
|
|||
import UIKit
|
||||
|
||||
final class AudioPlayer: NSObject {
|
||||
|
||||
static let appWillPlayAudioNotification = NSNotification.Name(rawValue: "appWillPlayAudioNotification")
|
||||
|
||||
var disposeBag = Set<AnyCancellable>()
|
||||
|
||||
var player = AVPlayer()
|
||||
|
@ -45,6 +48,7 @@ extension AudioPlayer {
|
|||
return
|
||||
}
|
||||
|
||||
pushWillPlayAudioNotification()
|
||||
if audioAttachment == attachment {
|
||||
if self.playbackState.value == .stopped {
|
||||
self.seekToTime(time: .zero)
|
||||
|
@ -83,6 +87,12 @@ extension AudioPlayer {
|
|||
}
|
||||
}
|
||||
.store(in: &disposeBag)
|
||||
NotificationCenter.default.publisher(for: VideoPlayerViewModel.appWillPlayVideoNotification)
|
||||
.sink { [weak self] _ in
|
||||
guard let self = self else { return }
|
||||
self.pauseIfNeed()
|
||||
}
|
||||
.store(in: &disposeBag)
|
||||
|
||||
timeObserver = player.addPeriodicTimeObserver(forInterval: CMTimeMake(value: 1, timescale: CMTimeScale(NSEC_PER_SEC)), queue: DispatchQueue.main, using: { [weak self] time in
|
||||
guard let self = self else { return }
|
||||
|
@ -119,10 +129,14 @@ extension AudioPlayer {
|
|||
.store(in: &disposeBag)
|
||||
}
|
||||
|
||||
func pushWillPlayAudioNotification() {
|
||||
NotificationCenter.default.post(name: AudioPlayer.appWillPlayAudioNotification, object: nil)
|
||||
}
|
||||
func isPlaying() -> Bool {
|
||||
return self.playbackState.value == .readyToPlay || self.playbackState.value == .playing
|
||||
return playbackState.value == .readyToPlay || playbackState.value == .playing
|
||||
}
|
||||
func resume() {
|
||||
pushWillPlayAudioNotification()
|
||||
player.play()
|
||||
playbackState.value = .playing
|
||||
}
|
||||
|
|
|
@ -90,6 +90,13 @@ extension VideoPlaybackService {
|
|||
self.playerViewModel(viewModel, didUpdateTimeControlStatus: timeControlStatus)
|
||||
}
|
||||
.store(in: &disposeBag)
|
||||
|
||||
NotificationCenter.default.publisher(for: AudioPlayer.appWillPlayAudioNotification)
|
||||
.sink { [weak self] _ in
|
||||
guard let self = self else { return }
|
||||
self.pauseWhenPlayAudio()
|
||||
}
|
||||
.store(in: &disposeBag)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue