Skip to content

Update notice: slide-in pill, highlights pop-up, download card; updater polling fix - #600

Merged
The412Banner merged 3 commits into
mainfrom
feat/update-card-ui
Oct 11, 2026
Merged

The412Banner merged 3 commits into
mainfrom
feat/update-card-ui

Conversation

@The412Banner

Copy link
Copy Markdown
Owner

Update notice as a slide-in pill, highlights pop-up and download card

Device-proven 2026-10-10 on a vc96 test build of this branch (pill → View → highlights → Update now → card at 36 MB/s → install sheet).

What changes for the user

  • The amber "Update available" strip under the top bar is gone. A pill slides out of the right edge (icon, "Update available", version + size, Dismiss / View), fully rounded with the theme-accent outline, resting 10 dp short of the edge. Dismiss hides it for this session only (the old Skip persisted the version); View slides it off and opens:
  • What's new pop-up: the release's quick highlights (five short lines, title + one sentence; "Full notes ↗" for the GitHub page), Later / Update now.
  • Download card for every Update now (pop-up, Settings, About): progress, bytes of total, speed, time left, Cancel; Retry / Release page on failure. UpdateManager no longer calls the dialog-creating HttpUtils.download(activity, …) overload, so the black first-launch setup screen can no longer appear during an update.
  • Settings → Updates lists the highlights in place of the one-line notes when the release has them.

Updater polling fix (agreed 2026-09-18)

  • Automatic checks (launch, About, opening Settings) reuse the cached answer for 6 h after a successful check; only the Settings button and the prerelease toggle force a network check. Cache split per channel.
  • Manifests are read raw from the orphan manifest branch (update.json stable, update-pre.json every cut): no download counter, no API rate limit. Falls back to the release asset / API walk until the branch exists (first release from this code creates it). The asset stays attached for older installs.

update.json

New optional fields, ignored by older builds: highlights (from <!-- update-highlight: Title | text --> comments in the notes file, else the first bullet list after the lead paragraph), size (bytes per flavor), publishedAt, apkUrl (absolute per flavor). scripts/release_notes.py writes highlights.json; release-notes-check run 38106121718 extracted four from the 3.1.6-pre3 notes.

Rollout

The first release cut from this branch is the first to carry highlights/size and to create the manifest branch; installs older than it keep the old behaviour. Delta (small) updates are a separate follow-up on their own branch.

CI: build-artifacts 38106437995 green (b02d58e, all four flavors); 38109096573 on the final commit.

The amber banner under the top bar is gone. When a newer release is
found, a pill slides out of the right edge (icon, "Update available",
version and size, Dismiss / View) and settles 10 dp short of the edge
with the theme-accent outline the dialogs use. Dismiss slides it back
off for this session only; the old Skip persisted the version for good
and left Settings as the only way back. View slides it off and opens a
pop-up with the release's quick highlights (five short lines, title
plus one sentence, "Full notes" for the GitHub page), Later / Update now.

Update now, from the pop-up, Settings or About, runs the download as a
card over the home screen: progress, bytes of total, speed, time left,
Cancel, and Retry / Release page on failure. UpdateManager publishes
the download as a StateFlow and no longer calls the dialog-creating
HttpUtils.download overload, so the first-launch setup screen can no
longer appear during an update. HttpUtils gains downloadToFile(), a
byte-level progress download with no UI of its own.

update.json carries three new optional fields the app reads from this
build on and older builds ignore: highlights (from
<!-- update-highlight: Title | text --> comments in the notes file, else
the first bullet list after the lead paragraph), size (bytes per
flavor, for the pill and the download card) and publishedAt.
release_notes.py writes highlights.json; release.yml and the notes
check carry it through and print it in the job summary. Settings lists
the highlights in place of the one-line notes when the release has them.
…polls

update.json was read from the release-asset URL, so GitHub counted every
in-app check as a download of the release: 846,893 of the repo's 992,611
"downloads" measured on 2026-09-18 were polling, and the checks fired on
every launch, every Settings open and every About dialog with no throttle.

App: check(ctx, force) answers automatic checks from the cache for six
hours after the last successful one; only the Settings button and the
prerelease toggle force a network check. The cache is per channel, so
flipping the toggle can no longer serve the other channel's answer.
The stable channel reads raw.githubusercontent.com/…/manifest/update.json
and the prerelease channel …/manifest/update-pre.json, which count nothing
and have no per-IP API limit; each falls back to the old path (release
asset / GitHub API walk) until the branch exists. Manifests may carry an
absolute apkUrl map, preferred over resolving the apk name against
releases/latest, which also fixes a cached prerelease resolving its APK
against the wrong release.

CI: update.json gains the apkUrl map; after the release is created,
release.yml commits update-pre.json (every cut) and update.json (stable
cuts) to the orphan manifest branch. The release asset stays attached for
installs older than this code.
@The412Banner
The412Banner merged commit 943894f into main Oct 11, 2026
8 checks passed
@The412Banner
The412Banner deleted the feat/update-card-ui branch October 11, 2026 03:51
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant