Fix screensaver dismiss-app after handoff, silent Immich fallback, and forced gradient (#146, #103, #142, #144)#147
Merged
Conversation
#146) The "open when dismissed" target only worked for ~2 minutes: Android force-wakes any third-party DreamService, and the PhotoFramePreviewActivity continuation frame that takes over dismissed with a bare finish(). Route its tap-exit through ScreensaverDismiss.launchChosenApp, gated to the DreamPolicy continuation launch by a new EXTRA_LAUNCH_DISMISS_APP extra so on-demand previews (settings, face picker, MQTT command) still return to their caller, and the night clock stays dark. The same tap now also flips PresenceHub to INTERACTIVE — finishing an Activity fires no dream-stop, so the hub stayed stuck on DREAMING and MQTT screen/state never reported "interactive" after the handoff (issue #103). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DRTP7kN5WbzXFGoCWYR89s
Every failure in the Immich chain was runCatching{}.getOrNull() with zero
logging, so an album-filtered fetch that fails looks identical to success
with the stock feed — undiagnosable from a user report. Non-2xx responses
now log the method, endpoint, status, and the first 300 chars of the
server's error body under ImmortalImmich; empty/failed listings and the
built-in-feed fallback log too.
Diagnostic groundwork for #142 (album selection silently falls back);
the root-cause fix follows once the server-side response is confirmed.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DRTP7kN5WbzXFGoCWYR89s
FaceRenderer drew the bottom scrim unconditionally on every non-full-bleed face, even with every widget turned off — art-frame setups couldn't show the photo clean to the edge. New showGradient setting (default on, so the original look is unchanged) wired through the settings registry, so it appears on-device and on the phone remote. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DRTP7kN5WbzXFGoCWYR89s
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Three fixes from the issue triage, one commit each.
1. "Open app on dismiss" dies after the ~2-minute handoff (closes #146, most of #103)
PhotoDreamService's tap handler launches the chosen dismiss target, but thePhotoFramePreviewActivitycontinuation frame — which takes over when Android force-wakes the DreamService, i.e. most of the frame's lifetime under the default ALWAYS_ON mode — dismissed with a barefinish(). Its tap-exit now:ScreensaverDismiss.launchChosenApp(), gated to theDreamPolicycontinuation relaunch via a newEXTRA_LAUNCH_DISMISS_APPintent extra — deliberate on-demand starts (settings preview, face picker, welcome preview, header button, MQTTscreensavercommand) still return to their caller, and the night clock always stays dark;PresenceHub.onInteraction()— finishing an Activity fires no dream-stop, so the hub stayed stuck onDREAMINGand MQTTscreen/statenever publishedinteractiveafter the handoff (MQTT screen/state never publishes "interactive" when Immortal overlay screensaver is dismissed on Gen-2 Portal #103, Gen-2 report);ImmortalFrametag (the Open app (Home Assistant) on dismiss (Screen Saver) not working #146 reporter hit a "no logs at all" wall here).2. Immich failures fall back to the stock feed with zero trace (#142, part 1 of 2)
The whole Immich chain was
runCatching { … }.getOrNull()with no logging, by design — which made #142 (album selection silently showing the built-in feed) undiagnosable from user reports. Non-2xx responses now log method/endpoint/status plus the first 300 chars of the server's error body underImmortalImmich, and the fallback swap logs underImmortalPhotoFrame. The root-cause fix for the album filter follows once the reporter's curl test confirms what the server actually returns (asked on the issue).3. Legibility gradient can't be disabled (closes #144)
FaceRendererdrew the bottom scrim unconditionally on every non-full-bleed face, even with every widget off. NewshowGradientsetting (default on — the original look is unchanged), wired through the settings registry so it appears on-device and on the phone remote, gates the scrim.Testing
./gradlew :app:testDebugUnitTestgreen, including the settings-registry completeness tripwires picking up the newshowGradientspec.immortal/{id}/screen/state) — the reporters of both issues have offered to test.🤖 Generated with Claude Code
https://claude.ai/code/session_01DRTP7kN5WbzXFGoCWYR89s
Generated by Claude Code