IOS: Support autoRewind and disableAutoRewind setting

This commit is contained in:
Adam Traeger
2025-03-10 20:27:57 -05:00
parent f65d3213fe
commit 922601eab7
3 changed files with 46 additions and 6 deletions
@@ -12,9 +12,41 @@ final class PlayerTimeUtilsTests: XCTestCase {
func testCalcSeekBackTime() { func testCalcSeekBackTime() {
let currentTime: Double = 1000 let currentTime: Double = 1000
let threeSecondsAgo = Date(timeIntervalSinceNow: -3)
let lastPlayedMs = threeSecondsAgo.timeIntervalSince1970 * 1000 // 1. Nil lastPlayedMs should seek back 5s
XCTAssertEqual(PlayerTimeUtils.calcSeekBackTime(currentTime: currentTime, lastPlayedMs: lastPlayedMs), 998) 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() { func testCalcSeekBackTimeWithZeroCurrentTime() {
@@ -27,7 +59,7 @@ final class PlayerTimeUtilsTests: XCTestCase {
func testTimeSinceLastPlayed() throws { func testTimeSinceLastPlayed() throws {
let fiveSecondsAgo = Date(timeIntervalSinceNow: -5) let fiveSecondsAgo = Date(timeIntervalSinceNow: -5)
let lastPlayedMs = fiveSecondsAgo.timeIntervalSince1970 * 1000 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)) XCTAssertNil(PlayerTimeUtils.timeSinceLastPlayed(nil))
} }
@@ -21,10 +21,13 @@ class PlayerTimeUtils {
static internal func timeSinceLastPlayed(_ lastPlayedMs: Double?) -> TimeInterval? { static internal func timeSinceLastPlayed(_ lastPlayedMs: Double?) -> TimeInterval? {
guard let lastPlayedMs = lastPlayedMs else { return nil } guard let lastPlayedMs = lastPlayedMs else { return nil }
let lastPlayed = Date(timeIntervalSince1970: lastPlayedMs / 1000) let lastPlayed = Date(timeIntervalSince1970: lastPlayedMs / 1000)
return lastPlayed.timeIntervalSinceNow return Date().timeIntervalSince(lastPlayed)
} }
static internal func timeToSeekBackForSinceLastPlayed(_ sinceLastPlayed: TimeInterval?) -> TimeInterval { static internal func timeToSeekBackForSinceLastPlayed(_ sinceLastPlayed: TimeInterval?) -> TimeInterval {
if isAutoRewindDisabled(){
return 0
}
if let sinceLastPlayed = sinceLastPlayed { if let sinceLastPlayed = sinceLastPlayed {
if sinceLastPlayed < 6 { if sinceLastPlayed < 6 {
return 2 return 2
@@ -44,4 +47,9 @@ class PlayerTimeUtils {
} }
} }
static internal func isAutoRewindDisabled() -> Bool {
let deviceSettings = Database.shared.getDeviceSettings()
return deviceSettings.disableAutoRewind
}
} }
+1 -1
View File
@@ -36,7 +36,7 @@
<!-- Playback settings --> <!-- Playback settings -->
<p class="uppercase text-xs font-semibold text-fg-muted mb-2 mt-10">{{ $strings.HeaderPlaybackSettings }}</p> <p class="uppercase text-xs font-semibold text-fg-muted mb-2 mt-10">{{ $strings.HeaderPlaybackSettings }}</p>
<div v-if="!isiOS" class="flex items-center py-3"> <div class="flex items-center py-3">
<div class="w-10 flex justify-center" @click="toggleDisableAutoRewind"> <div class="w-10 flex justify-center" @click="toggleDisableAutoRewind">
<ui-toggle-switch v-model="settings.disableAutoRewind" @input="saveSettings" /> <ui-toggle-switch v-model="settings.disableAutoRewind" @input="saveSettings" />
</div> </div>