Simplify the voice message cursor animation
Instead of tweening the cursor to the end of the media and correcting the
tween when it drifts from the player, extrapolate the progress on every
frame from the latest player sample, using the time elapsed since it was
received and the playback speed. Each new sample becomes the new starting
point, so the cursor cannot drift and no snapping, restart detection or
pending seek tracking is needed.
The progress is read in the draw phase, so playback only redraws the
canvas on each frame. The frame loop is not affected by the system
animator duration scale.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>