fix(oled): full OLED coverage sweep + App Detail concurrency fix#47
Merged
Conversation
…creens) Three OLED coverage gaps where a grey backdrop showed instead of pure black: - SourceDetailView: same frame-after-background bug as AppDetailView — the content card painted altBackground on its content-sized rounded rect, then the call site expanded it with .frame(minHeight:) afterward, leaving the bottom transparent. Moved minHeight onto the card's own frame so the fill covers the full height. - AppExtensionView: List had no scrollContentBackground(.hidden) + altBackground, so the default grouped grey showed through in OLED. - OperationsLoggingControlView: same missing list-background pattern. All five tab roots and other migrated list screens already apply the OLED-aware altBackground; card/icon placeholder surfaces are left as intentional elevation. https://claude.ai/code/session_017rnLQsvspk1uZDExv3rUxx
…vers The three notification observers in AppDetailModel fire on OperationQueue.main but their blocks are @sendable, so mutating the @mainactor appTick triggered a Swift 6 isolation warning ("main actor-isolated property can not be mutated from a Sendable closure"). Since the blocks always run on the main thread, wrap the mutation in MainActor.assumeIsolated — correct, no extra async hop, warning cleared. https://claude.ai/code/session_017rnLQsvspk1uZDExv3rUxx
Contributor
|
Download the artifacts for this pull request (nightly.link): |
Contributor
|
Builds for this Pull Request are available at |
…eystroke
The Anisette Server List URL field's onChange fired getCurrentListOfServers() on
every keystroke, launching a URLSession request against each partial (invalid) URL.
The author had muted the toast ("don't spam") but left the fetch itself in place.
Debounce: cancel the pending fetch and wait 300ms for a typing pause before fetching.
https://claude.ai/code/session_017rnLQsvspk1uZDExv3rUxx
…ed queue processNextInQueue's update completion runs on a later main-queue tick and calls updateQueue.removeFirst() unconditionally. If the queue was cleared in that window (navigation lost, a sibling failure, or cancel calling cancelRemainingQueue), the removeFirst() would crash. Bail out when the queue is empty — cancelRemainingQueue has already reset button states and progress. https://claude.ai/code/session_017rnLQsvspk1uZDExv3rUxx
…ivergence Document that InstallAppOperation.scheduleSelfUpdateBackgrounding dropped upstream's `installing` guard flag. Audited 2026-06-28 and left as-is (practically a no-op since installIPA blocks until the user backgrounds the app); recorded so a future session doesn't re-discover it blind. Includes the parity-restore recipe if ever needed. https://claude.ai/code/session_017rnLQsvspk1uZDExv3rUxx
Contributor
|
Builds for this Pull Request are available at |
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.
Changes
OLED coverage sweep — close every spot where a grey backdrop showed instead of pure black with OLED on:
frame-after-backgroundbug as App Detail:altBackgroundwas painted on the content-sized rounded rect, then the call site expanded it with.frame(minHeight:), leaving the bottom transparent. MovedminHeightonto the card's own frame so the fill covers the full height..scrollContentBackground(.hidden)+altBackground; the default grouped grey was showing through.Audited and left as-is (verified): all five tab roots and the other migrated list screens already apply OLED-aware
altBackground; the Authentication screen uses an intentional fixedSettingsBackground; card/icon-placeholder surfaces are deliberate elevation, not page-level leaks.Concurrency
AppDetailModel's three notification observers fire onOperationQueue.mainbut their@Sendableblocks mutated the@MainActor appTick, tripping a Swift 6 isolation warning. Wrapped the mutation inMainActor.assumeIsolated.Logic bugs (from a 3-area audit: Settings / tabs+detail / operations)
URLSessionfetch on every keystroke (against each partial, invalid URL). Added a 300 ms debounce.processNextInQueue's async completion calledupdateQueue.removeFirst()unconditionally; guarded against an already-cleared queue to avoid a crash.The audit otherwise found the migrated SwiftUI screens and the operation pipeline clean — no other critical/high logic bugs. One low-confidence self-update divergence (
InstallAppOperationdropped aninstallingguard) was audited, judged a practical no-op, and documented in.claude/gotchas.mdrather than touched (delicate self-update timing, near-zero upside).🤖 Generated with Claude Code
https://claude.ai/code/session_017rnLQsvspk1uZDExv3rUxx