VB: Improve playback states

This commit is contained in:
manuroe
2022-10-19 15:01:43 +02:00
parent 8efa89616c
commit dad2f29bd5
4 changed files with 16 additions and 40 deletions
@@ -43,12 +43,14 @@ struct VoiceBroadcastPlaybackView: View {
Image("voice_broadcast_play")
.renderingMode(.original)
}
.disabled(viewModel.viewState.playbackState == .playing)
.accessibilityIdentifier("playButton")
Button { viewModel.send(viewAction: .pause) } label: {
Image("voice_broadcast_pause")
.renderingMode(.original)
}
.disabled(!(viewModel.viewState.playbackState == .playing))
.accessibilityIdentifier("pauseButton")
}
@@ -23,9 +23,11 @@ enum VoiceBroadcastPlaybackViewAction {
}
// TODO: Rename it to VoiceBroadcastPlaybackState
enum VoiceBroadcastPlaybackViewModelResult {
case played
enum VoiceBroadcastPlaybackState {
case stopped
case playing
case paused
case error
}
enum VoiceBroadcastPlaybackType {
@@ -36,12 +38,11 @@ enum VoiceBroadcastPlaybackType {
struct VoiceBroadcastPlaybackDetails {
var type: VoiceBroadcastPlaybackType
var chunks: [VoiceBroadcastChunk]
// TODO: VB Add playback state
}
struct VoiceBroadcastPlaybackViewState: BindableState {
var voiceBroadcast: VoiceBroadcastPlaybackDetails
var playbackState: VoiceBroadcastPlaybackState
var bindings: VoiceBroadcastPlaybackViewStateBindings
}
@@ -45,7 +45,7 @@ enum MockVoiceBroadcastPlaybackScreenState: MockScreenState, CaseIterable {
var screenView: ([Any], AnyView) {
let voiceBroadcastPlaybackDetails = VoiceBroadcastPlaybackDetails(type: VoiceBroadcastPlaybackType.player, chunks: [])
let viewModel = MockVoiceBroadcastPlaybackViewModel(initialViewState: VoiceBroadcastPlaybackViewState(voiceBroadcast: voiceBroadcastPlaybackDetails, bindings: VoiceBroadcastPlaybackViewStateBindings()))
let viewModel = MockVoiceBroadcastPlaybackViewModel(initialViewState: VoiceBroadcastPlaybackViewState(voiceBroadcast: voiceBroadcastPlaybackDetails, playbackState: .stopped, bindings: VoiceBroadcastPlaybackViewStateBindings()))
return (
[false, viewModel],
@@ -42,7 +42,7 @@ class VoiceBroadcastPlaybackViewModel: VoiceBroadcastPlaybackViewModelType {
self.voiceBroadcastAggregator = voiceBroadcastAggregator
let voiceBroadcastPlaybackDetails = VoiceBroadcastPlaybackDetails(type: VoiceBroadcastPlaybackType.player, chunks: [])
super.init(initialViewState: VoiceBroadcastPlaybackViewState(voiceBroadcast: voiceBroadcastPlaybackDetails, bindings: VoiceBroadcastPlaybackViewStateBindings()))
super.init(initialViewState: VoiceBroadcastPlaybackViewState(voiceBroadcast: voiceBroadcastPlaybackDetails, playbackState: .stopped, bindings: VoiceBroadcastPlaybackViewStateBindings()))
self.voiceBroadcastAggregator.delegate = self
}
@@ -68,15 +68,11 @@ class VoiceBroadcastPlaybackViewModel: VoiceBroadcastPlaybackViewModelType {
assert(false, "Cannot play. No voice broadcast data")
}
// TODO: define which context
guard let attachment = voiceBroadcast.chunks.first?.attachment else {
MXLog.debug("[VoiceBroadcastPlaybackViewModel] play: Error: No attachment")
return
}
// TODO: Update the view
cacheManager.loadAttachment(attachment, numberOfSamples: requiredNumberOfSamples) { [weak self] result in
guard let self = self else {
@@ -89,7 +85,6 @@ class VoiceBroadcastPlaybackViewModel: VoiceBroadcastPlaybackViewModelType {
return
}
// Avoid listening to old audio player delegates if the attachment for this playbackController/cell changes
self.audioPlayer?.deregisterDelegate(self)
@@ -100,25 +95,9 @@ class VoiceBroadcastPlaybackViewModel: VoiceBroadcastPlaybackViewModelType {
audioPlayer.play()
self.audioPlayer = audioPlayer
// TODO: Update the view
// self.loading = false
// self.urlToLoad = result.url
// self.duration = result.duration
// self.samples = result.samples
// if let audioPlayer = self.audioPlayer {
// if audioPlayer.isPlaying {
// //self.state = .playing
// } else if audioPlayer.currentTime > 0 {
// //self.state = .paused
// } else {
// //self.state = .stopped
// }
// }
case .failure (let error):
MXLog.error("[VoiceBroadcastPlaybackViewModel] play: loadAttachment error", context: error)
//self.state = .error
self.state.playbackState = .error
}
}
}
@@ -176,35 +155,29 @@ extension VoiceBroadcastPlaybackViewModel: VoiceMessageAudioPlayerDelegate {
func audioPlayerDidFinishLoading(_ audioPlayer: VoiceMessageAudioPlayer) {
MXLog.debug("AAAA audioPlayerDidFinishLoading")
//updateUI()
}
func audioPlayerDidStartPlaying(_ audioPlayer: VoiceMessageAudioPlayer) {
MXLog.debug("AAAA audioPlayerDidStartPlaying")
//state = .playing
state.playbackState = .playing
}
func audioPlayerDidPausePlaying(_ audioPlayer: VoiceMessageAudioPlayer) {
MXLog.debug("AAAA audioPlayerDidPausePlaying")
//state = .paused
state.playbackState = .paused
}
func audioPlayerDidStopPlaying(_ audioPlayer: VoiceMessageAudioPlayer) {
MXLog.debug("AAAA audioPlayerDidStopPlaying")
//state = .stopped
state.playbackState = .stopped
}
func audioPlayer(_ audioPlayer: VoiceMessageAudioPlayer, didFailWithError error: Error) {
MXLog.debug("AAAA audioPlayerdidFailWithError")
// state = .error
// MXLog.error("Failed playing voice message", context: error)
state.playbackState = .error
}
func audioPlayerDidFinishPlaying(_ audioPlayer: VoiceMessageAudioPlayer) {
MXLog.debug("AAAA audioPlayerDidFinishPlaying")
// TODO: but what ?
// Chunk++
// audioPlayer.seekToTime(0.0) { [weak self] _ in
// guard let self = self else { return }
// self.state = .stopped