Skip to content

feat(android): parity pass — v0.15 work cards and session headers, one trigger editor - #665

Merged
jonwiggins merged 6 commits into
mainfrom
feat/android-parity-pass
Oct 10, 2026
Merged

jonwiggins merged 6 commits into
mainfrom
feat/android-parity-pass

Conversation

@jonwiggins

Copy link
Copy Markdown
Owner

Summary

Brings the Android app to parity with what iOS shipped in v0.14.0 / v0.15.0 and with the web session sidebar, and finishes the per-feature trigger enums.

Work cards and session headers (iOS v0.15)

  • One Work card for every list, core:workfeed ui/WorkRowCard.kt (the module now depends on core:ui): the harness logo with its status dot, the name and place, the host or pod and the recency, the status, the trigger and exit condition where they matter, tappable ticket / PR badges (two at rest, up to eight expanded), and the Private tag. The Work list, the Overview's Needs-you section and board all draw it; the two per-feature copies (feature/work and feature/overview WorkRowView.kt) are gone, as the Android plan's ISSUES.md asked.
  • The feed keeps and deduplicates linked tickets and PRs (WorkFeed.workLinks, a port of the iOS function and its tests); a task's row carries its PR and the links its local terminal saw; the Overview's Needs-you section is built from the feed's rows (needsYouRows) and no longer lists a local task twice.
  • SessionIdentityHeader (core:ui) replaces the two DetailHeader uses: local terminals and pod sessions show the harness, title, location, status, usage pill and facts together, with a full-width labelled Chat / Terminal switch and the link badges scrolling in a bounded area.

One trigger editor (the connections-v2 leftover)

  • The trigger vocabulary, drafts, validation, specs and summaries move from the work form into core:ui triggers/TriggerModel.kt, with the editor (TriggerRows, TriggerTypeChips, TriggerSecretDialog) in triggers/TriggerEditor.kt. The work form's When section draws TriggerRows.
  • A Local automation's Add trigger sheet and a persistent agent's New trigger sheet now take all fourteen types (GitLab, Jira, Pylon, PagerDuty, Sentry, Alertmanager, Datadog added) through the same rows, and show a Pylon / Alertmanager / Datadog trigger's own URL and secret once after it is created. The work form shows that dialog too (the trigger creates now return the row).
  • Trigger summaries read one dialect app-wide (TriggerModelTest pins every type).

Verified

  • v0.14's pinned-sessions-first ordering and the "Signed in with" credential pick were already on Android (checked, not changed).
  • Brand marks for Pylon, PagerDuty, Sentry, Jira, GitLab, Alertmanager and Datadog were already in core:ui BrandMarks.kt; the trigger chips and rows use them.

Test plan

  • ./gradlew assembleDebug testDebugUnitTest :core:model:test :core:network:test — 174 suites, 1578 tests, 0 failed (63 skipped: the live tests without OPTIO_TEST_API_URL)
  • Roborazzi recorded for :feature:work, :feature:overview, :feature:local, :feature:sessions, :feature:agents, :feature:workform and looked at (WorkList_brands, Overview_needsYou, Automation_addTrigger, AgentTriggerSheet_*, LocalTerminal_held, SessionChat); AgentTriggerSheet_datadog is new
  • On device (emulator, API 37) against a private hermetic test API: Overview Needs-you and board cards, the Work list, a local terminal and a pod session header, a Datadog trigger created on the seeded agent and a Pylon trigger on the seeded automation — the server minted the secrets and the one-time dialog showed each URL and secret; the rows then read triggered / any event
  • Walked Overview, Work (All / Reviews / Inbox), work details, sessions, Library (Prompts / Repos / Machines / Connections) and More against the web; docs/product-followups.md ticks the deferred item

Not changed, by choice: the local terminal and pod session top bars keep Android's title + status pattern above the new identity header (iOS retitled its nav bar "Session"); the Machines page's terminal rows keep their long-press pin menu rather than the Work card.

One Work card for every list (core:workfeed ui/WorkRowCard, on core:ui): the
runtime's mark with its status dot, the name and place, the host or pod and the
recency, the status, the trigger and exit condition for work that has them,
and the ticket / PR badges (two at rest, up to eight expanded). The Work list,
the Overview's Needs-you section and board all draw it; the two per-feature
copies are gone. The feed keeps and deduplicates linked tickets and PRs, and
the Overview no longer lists a local task twice. Local terminal and pod
session headers use one SessionIdentityHeader with a full-width Chat /
Terminal switch.
…agents

The trigger vocabulary, drafts, validation, specs and summaries move to
core:ui (triggers/TriggerModel.kt) with the one editor (TriggerRows,
TriggerTypeChips, TriggerSecretDialog). The New work form's When section draws
it; a Local automation's Add trigger sheet and a persistent agent's New trigger
sheet now offer every one of the fourteen types (GitLab, Jira, Pylon,
PagerDuty, Sentry, Alertmanager and Datadog included) through the same rows,
and show a Pylon / Alertmanager / Datadog trigger's own URL and secret once
after it is created. The work form shows that dialog too.
… event collector

createAndDeleteTriggers asserted the Success event the instant createTrigger
returned, but the view model sends it on a buffered Channel that the test's
collector drains on its own Dispatchers.Default coroutine, so a slow CI box
could assert before the collector ran (passed 6/6 locally, failed on Temurin
21 in run 38078632350). Wait for it with eventually, as the sibling test does.
@jonwiggins
jonwiggins merged commit 95e924b into main Oct 10, 2026
13 checks passed
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