diff --git a/apps/ios/Shared/Views/Chat/ChatItem/CIVideoView.swift b/apps/ios/Shared/Views/Chat/ChatItem/CIVideoView.swift index 339d119362..0a664f8d96 100644 --- a/apps/ios/Shared/Views/Chat/ChatItem/CIVideoView.swift +++ b/apps/ios/Shared/Views/Chat/ChatItem/CIVideoView.swift @@ -534,9 +534,9 @@ struct CIVideoView: View { if let item = player.currentItem { let dur = CMTimeGetSeconds(item.duration) if !dur.isInfinite && !dur.isNaN { - duration = Int(dur) + duration = wholeSeconds(dur) } - progress = Int(CMTimeGetSeconds(player.currentTime())) + progress = wholeSeconds(CMTimeGetSeconds(player.currentTime())) // `if` prevents showing Play button while the playback seeks to start and then plays if player.currentTime() != player.currentItem?.duration && player.currentTime() != .zero { videoPlaying = player.timeControlStatus == .playing || player.timeControlStatus == .waitingToPlayAtSpecifiedRate diff --git a/apps/ios/Shared/Views/Chat/ComposeMessage/ComposeVoiceView.swift b/apps/ios/Shared/Views/Chat/ComposeMessage/ComposeVoiceView.swift index 441a68fccb..48e72e2c05 100644 --- a/apps/ios/Shared/Views/Chat/ComposeMessage/ComposeVoiceView.swift +++ b/apps/ios/Shared/Views/Chat/ComposeMessage/ComposeVoiceView.swift @@ -15,12 +15,16 @@ enum VoiceMessagePlaybackState { case paused } +func wholeSeconds(_ time: TimeInterval) -> Int { + Int(exactly: time.rounded(.towardZero)) ?? 0 +} + func voiceMessageTime(_ time: TimeInterval) -> String { - durationText(Int(time)) + durationText(wholeSeconds(time)) } func voiceMessageTime_(_ time: TimeInterval?) -> String { - durationText(Int(time ?? 0)) + durationText(wholeSeconds(time ?? 0)) } struct ComposeVoiceView: View { @@ -157,7 +161,7 @@ struct ComposeVoiceView: View { var seek: (TimeInterval) -> Void var body: some View { - Slider(value: Binding(get: { progress ?? TimeInterval(0) }, set: { seek($0) }), in: 0 ... length) + Slider(value: Binding(get: { progress ?? TimeInterval(0) }, set: { seek($0) }), in: 0 ... max(length, 0)) .frame(maxWidth: .infinity) .frame(height: 4) .tint(theme.colors.primary) diff --git a/apps/ios/SimpleX Snapshots/SnapshotTests.swift b/apps/ios/SimpleX Snapshots/SnapshotTests.swift index cd70cc8d78..d039168254 100644 --- a/apps/ios/SimpleX Snapshots/SnapshotTests.swift +++ b/apps/ios/SimpleX Snapshots/SnapshotTests.swift @@ -160,6 +160,15 @@ final class SnapshotTests: XCTestCase { let rowHash = { (older: ChatItem) in ListItem(item: items[4], prevItem: items[5], nextItem: older, unreadBefore: 0).genHash(false, false) } XCTAssertNotEqual(rowHash(items[3]), rowHash(unreacted)) } + + func testVoiceMessageTimeFormatting() { + XCTAssertEqual(voiceMessageTime(90), "01:30") + XCTAssertEqual(voiceMessageTime(3600), "01:00:00") + XCTAssertEqual(voiceMessageTime(TimeInterval(Int.max)), "00:00") + XCTAssertEqual(voiceMessageTime(.nan), "00:00") + XCTAssertEqual(voiceMessageTime_(nil), "00:00") + XCTAssertEqual(voiceMessageTime_(TimeInterval(Int.max)), "00:00") + } } private func layoutCheckDir(_ env: [String: String]) -> URL {