Skip to content

Home-screen widget: build the thing the listing used to claim #8

Description

@StaticHumStudio

The ask

A home-screen widget.

Why this one has history

The 2.1.0 store listing claimed Widget and full media-notification controls
as a shipping feature. On 2026-08-24 that claim was deleted, because there is
no widget: no AppWidgetProvider, no Glance, no appwidget receiver in the
manifest, no widget XML anywhere in the repo. The manifest's only receiver is
DownloadActionReceiver. The media-notification half is real, which is
probably how the bullet survived a read.

So this issue is the other branch of that fix. Either the claim stays deleted
forever or this gets built and the claim comes back honestly.

Shape

Greenfield. No androidx.glance and no appwidget dependency in
app/build.gradle.kts or gradle/libs.versions.toml today.

Glance (androidx.glance:glance-appwidget) is the right tool. It is Compose-
flavored on the authoring side and compiles to RemoteViews, which is what
widgets actually run. Writing raw RemoteViews for a media widget in 2026 is
choosing pain.

Minimum useful widget, in priority order:

  1. Current book cover, title, and play/pause. That is the whole feature for
    most people.
  2. Progress through the book, and chapter position.
  3. Skip back / skip forward, matching the notification's transport.

The hard part, named up front

State. The widget process is not the app process, and GlanceAppWidget.update()
is async and has to work after the app's process has been killed. The source of
truth has to be the MediaSession in PlaybackService
(app/src/main/AndroidManifest.xml:52, a Media3 MediaLibraryService), reached
through a MediaController the widget builds on demand, not a StateFlow held
in a ViewModel that no longer exists.

Getting that wrong produces a widget that is correct while the app is open and
frozen on a stale book the rest of the time, which is worse than no widget.

Cover art is the second trap. RemoteViews bitmaps have a hard transaction
size limit and the browse-artwork work in PRs #88 to #92 already learned that
lesson once on Android Auto. Reuse whatever bounding those fixes established
rather than passing a full-size cover.

Free or unlock?

Recommend FREE, and this is a reasoned position rather than a default.

A widget is a convenience, which is normally the gated side of the line. But it
is also the app sitting on someone's home screen every day, which is reach, and
reach is the diagnosed bottleneck. Gating it hides the app from exactly the
people most likely to buy the unlock. Same reasoning that made the 30-day
Dossier and its share card free on 2026-08-16.

Not foreclosed: it is a legitimate price-ladder lever if volume ever arrives.

Post-2.1.0. Nothing here blocks the release or the price flip.

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions