diff --git a/ios/App/AudiobookshelfUnitTests/Shared/player/util/PlayerTimeUtilsTests.swift b/ios/App/AudiobookshelfUnitTests/Shared/player/util/PlayerTimeUtilsTests.swift index 91bc8403..21c1745b 100644 --- a/ios/App/AudiobookshelfUnitTests/Shared/player/util/PlayerTimeUtilsTests.swift +++ b/ios/App/AudiobookshelfUnitTests/Shared/player/util/PlayerTimeUtilsTests.swift @@ -12,9 +12,41 @@ final class PlayerTimeUtilsTests: XCTestCase { func testCalcSeekBackTime() { let currentTime: Double = 1000 - let threeSecondsAgo = Date(timeIntervalSinceNow: -3) - let lastPlayedMs = threeSecondsAgo.timeIntervalSince1970 * 1000 - XCTAssertEqual(PlayerTimeUtils.calcSeekBackTime(currentTime: currentTime, lastPlayedMs: lastPlayedMs), 998) + + // 1. Nil lastPlayedMs → should seek back 5s + XCTAssertEqual(PlayerTimeUtils.calcSeekBackTime(currentTime: currentTime, lastPlayedMs: nil), 995) + + // 2. Played ~3s ago (<6s) → should seek back 2s + let played3sAgo = Date(timeIntervalSinceNow: -3).timeIntervalSince1970 * 1000 + XCTAssertEqual(PlayerTimeUtils.calcSeekBackTime(currentTime: currentTime, lastPlayedMs: played3sAgo), 998) + + // 3. Played ~8s ago (6-12s range) → should seek back 10s + let played8sAgo = Date(timeIntervalSinceNow: -8).timeIntervalSince1970 * 1000 + XCTAssertEqual(PlayerTimeUtils.calcSeekBackTime(currentTime: currentTime, lastPlayedMs: played8sAgo), 990) + + // 4. Played ~20s ago (12-30s range) → should seek back 15s + let played20sAgo = Date(timeIntervalSinceNow: -20).timeIntervalSince1970 * 1000 + XCTAssertEqual(PlayerTimeUtils.calcSeekBackTime(currentTime: currentTime, lastPlayedMs: played20sAgo), 985) + + // 5. Played ~60s ago (30-180s range) → should seek back 20s + let played60sAgo = Date(timeIntervalSinceNow: -60).timeIntervalSince1970 * 1000 + XCTAssertEqual(PlayerTimeUtils.calcSeekBackTime(currentTime: currentTime, lastPlayedMs: played60sAgo), 980) + + // 6. Played ~300s ago (180-3600s range) → should seek back 25s + let played300sAgo = Date(timeIntervalSinceNow: -300).timeIntervalSince1970 * 1000 + XCTAssertEqual(PlayerTimeUtils.calcSeekBackTime(currentTime: currentTime, lastPlayedMs: played300sAgo), 975) + + // 7. Played ~4000s ago (>3600s range) → should seek back 29s + let played4000sAgo = Date(timeIntervalSinceNow: -4000).timeIntervalSince1970 * 1000 + XCTAssertEqual(PlayerTimeUtils.calcSeekBackTime(currentTime: currentTime, lastPlayedMs: played4000sAgo), 971) + + // 8. Edge case where currentTime is small and would go negative + XCTAssertEqual(PlayerTimeUtils.calcSeekBackTime(currentTime: 3, lastPlayedMs: played3sAgo), 1) + XCTAssertEqual(PlayerTimeUtils.calcSeekBackTime(currentTime: 1, lastPlayedMs: played3sAgo), 0) + + // 9. Edge case: negative lastPlayedMs (should be treated as an old timestamp) + XCTAssertEqual(PlayerTimeUtils.calcSeekBackTime(currentTime: currentTime, lastPlayedMs: -5000), 971) + } func testCalcSeekBackTimeWithZeroCurrentTime() { @@ -27,7 +59,7 @@ final class PlayerTimeUtilsTests: XCTestCase { func testTimeSinceLastPlayed() throws { let fiveSecondsAgo = Date(timeIntervalSinceNow: -5) let lastPlayedMs = fiveSecondsAgo.timeIntervalSince1970 * 1000 - XCTAssertEqual(PlayerTimeUtils.timeSinceLastPlayed(lastPlayedMs)!, -5, accuracy: 1.0) + XCTAssertEqual(PlayerTimeUtils.timeSinceLastPlayed(lastPlayedMs)!, 5, accuracy: 1.0) XCTAssertNil(PlayerTimeUtils.timeSinceLastPlayed(nil)) } diff --git a/ios/App/Shared/player/util/PlayerTimeUtils.swift b/ios/App/Shared/player/util/PlayerTimeUtils.swift index 24fc00a1..e38bdcad 100644 --- a/ios/App/Shared/player/util/PlayerTimeUtils.swift +++ b/ios/App/Shared/player/util/PlayerTimeUtils.swift @@ -21,10 +21,13 @@ class PlayerTimeUtils { static internal func timeSinceLastPlayed(_ lastPlayedMs: Double?) -> TimeInterval? { guard let lastPlayedMs = lastPlayedMs else { return nil } let lastPlayed = Date(timeIntervalSince1970: lastPlayedMs / 1000) - return lastPlayed.timeIntervalSinceNow + return Date().timeIntervalSince(lastPlayed) } static internal func timeToSeekBackForSinceLastPlayed(_ sinceLastPlayed: TimeInterval?) -> TimeInterval { + if isAutoRewindDisabled(){ + return 0 + } if let sinceLastPlayed = sinceLastPlayed { if sinceLastPlayed < 6 { return 2 @@ -44,4 +47,9 @@ class PlayerTimeUtils { } } + static internal func isAutoRewindDisabled() -> Bool { + let deviceSettings = Database.shared.getDeviceSettings() + return deviceSettings.disableAutoRewind + } + } diff --git a/pages/settings.vue b/pages/settings.vue index 258d7375..1feec30f 100644 --- a/pages/settings.vue +++ b/pages/settings.vue @@ -36,7 +36,7 @@
{{ $strings.HeaderPlaybackSettings }}
-