summaryrefslogtreecommitdiff
path: root/docs
diff options
context:
space:
mode:
authorPeter Stone <thepeterstone@gmail.com>2026-11-03 08:54:29 +0000
committerPeter Stone <thepeterstone@gmail.com>2026-11-03 08:54:29 +0000
commit24eeda287300211a519afeb80171cb483f3f8589 (patch)
tree4b71d814bccd1d8b311e66dc162ae5caf0521533 /docs
parent913ba0e829ca20ccbb1a8db213541760dfc42a4b (diff)
Wire up the sleep timer's second mode, and make a duration extend
Peter's call on both, after the view-model work surfaced them as dead code. SleepTimer was documented as working "in two modes: a countdown, or stop at the end of the current episode", and armForEndOfEpisode, shouldStopAtEpisodeEnd and extendBy had no caller anywhere. So "stop at the end of this episode" did not exist in the app, and every duration in the sleep dialog went to armFor, which resets -- tapping 15m on a timer with thirty seconds left gave 15:00 and quietly took those thirty seconds away, the one thing extendBy's own comment says not to do. A duration now adds to a running timer and the buttons say so, "+15m" rather than "15m". The dialog offers "End of episode", and the overflow entry reads "Sleep timer - end of episode" in that mode, since there is no countdown to show. The two modes watch differently on purpose. A countdown needs a clock, so it ticks. Stopping at the end of an episode needs the moment the episode is done, and a one-second poll means a second of the next episode playing to somebody who asked to be stopped -- so it follows nowPlaying, which already republishes every second for the progress bar, and treats the queue advancing as the end whatever the last position said. Adding the mode took PlayerViewModel past its function limit, so the whole concern moved to SleepController -- the answer ListenViewModel got when it outgrew one, rather than raising the threshold a third time. SleepTimer keeps the arithmetic and stays pure. ReachabilityTest now covers classes, which is why this was invisible: it scanned `object` declarations only, and SleepTimer is a class. Classes cannot use the object check's matching -- a call names the instance, not the class -- so they get the DAO check's looser `.name(` matching, which needed three call shapes before it was honest: the ordinary call, a `::name` reference, and a trailing-lambda call with no parens at all, which is how OpmlViewModel reaches importFrom. It found one more thing, allowlisted with the reason rather than hidden: **on-device detection is dead code.** FingerprintUpdater and MidrollUpdater are never constructed -- every reference from outside their own files is a KDoc cross-reference -- and through them IntroOutroDetector, AudioCorrelation, MidrollScanner, MidrollDetector, MidrollClipStore, MediaCodecClipSource, Decimate, Fft, MonoResampler, PcmCodec, StoredClip and BreakTrack, about two thousand lines shipped in every APK. The workers went when detection moved to the server; the classes stayed. Deleting a subsystem is Peter's call, so it is recorded in the allowlist instead. Two smaller things found on the way. EpisodeDownloader's wait notification went onto ServerAudio, where the rest of the server's side of a download already lives, rather than becoming a seventh constructor parameter -- and the first attempt added it *after* the `now` clock, which silently rebound every existing trailing-lambda call site from the clock to the new hook while still compiling. The UnusedImports rule enabled earlier today caught a stale import in this very commit. 1057 tests, detekt 0, lint clean, coverage 95.17% -> 95.29%. Checked on the emulator: the dialog offers End of episode, and arming 15m shows "Sleep timer - 14:52" on the overflow entry. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_018AwnALZL6bD4VBtATDVv3B
Diffstat (limited to 'docs')
0 files changed, 0 insertions, 0 deletions