From cacb280832c9bc610e24df4469cad129fbc59377 Mon Sep 17 00:00:00 2001 From: Bryan Van Deusen Date: Thu, 4 Jun 2026 06:50:35 -0400 Subject: [PATCH] fix(android): polling tick track update is forward-only so user Next isn't undone --- .../com/fabledsword/minstrel/player/PlayerController.kt | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/android/app/src/main/java/com/fabledsword/minstrel/player/PlayerController.kt b/android/app/src/main/java/com/fabledsword/minstrel/player/PlayerController.kt index 87318f66..9a12fa26 100644 --- a/android/app/src/main/java/com/fabledsword/minstrel/player/PlayerController.kt +++ b/android/app/src/main/java/com/fabledsword/minstrel/player/PlayerController.kt @@ -525,7 +525,11 @@ class PlayerController @Inject constructor( val newPos = effectivePosition.coerceAtLeast(0) val newDur = effectiveDuration(upnpActive, remoteState.durationMs, controller.duration) val newBuf = controller.bufferedPosition.coerceAtLeast(0) - val trackChanged = desiredIdx != current.queueIndex && desiredIdx in queueRefs.indices + // Forward-only. If desiredIdx < queueIndex, the user just pressed Next + // and Sonos's poll hasn't caught up yet -- walking backward would undo + // their press (logcat 2026-06-04 showed exactly that jump-back-then- + // forward cycle). Mirrors maybeSyncLocalCursor's forward-only policy. + val trackChanged = desiredIdx > current.queueIndex && desiredIdx in queueRefs.indices val somethingChanged = trackChanged || current.isPlaying != effectiveIsPlaying || current.positionMs != newPos ||