Android: Activity screen (year grid, month calendar, day timeline, Days) #284

Closed
opened 2026-10-17 08:24:07 +02:00 by agentic-developer · 2 comments
Collaborator

Part of #277. Needs #283.

All time: year grid Month calendar Day timeline ⋮ menu, exclusive
01-all-time-year-grid.png 02-month-calendar.png 03-day-timeline.png 05-options-menu-exclude-mixed.png

The screenshots come from a web prototype (Instrument Sans, its own colours). They give the content and behaviour. Draw them as the app draws everything else: Material 3 Expressive, StreamdTheme, ScreenBar, the components of Components.kt. The bottom bar in them is a mock.

Goal

The screen of an activity command (ActivityScreen): a header with the range pill, the tiles, the chart chosen by the range, the legend, the latest shards, the Days table and the ⋮ menu. It opens from All and from a pinned tab, like a state or a timesheet command.

Plan

Session

  1. StreamSession.activity(key, range, excludeMixed, now, offset, limit) → a plain Activity (core/Activity.kt: days, stats, series with Color, shards, range with previous / next), the only call into the bindings. The Activities interface is implemented by StreamViewModel. The Overview of an activity command for All and the badge is N active days this month.

Screen (ui/Activity.kt, pure helpers in ui/ActivityChart.kt)

  1. Header: ScreenBar with the command name and the monospaced subtitle streamd <key> · <view>, back only when drilled in. At the top right is the range pill ‹ label › (the arrows load previous / next and are disabled when closed; a tap on the label opens the sheet of #285, a no-op until then) and ⋮.
  2. Tiles: for a range, [label: shards] · [Active days: N of M days] · [Per week: x.x shards]; for a day, [date: shards] · one per series [count, "at 06:45"]. The first tile is in the inverse surface colour, and the numbers are large StreamdTheme.mono.
  3. Year grid (more than 42 days, All; 01): one horizontal strip, one column per week, Monday on top, 10 dp cells with a 3 dp gap, opened scrolled to the newest week. The weekday labels (Mo, We, Fr, Su) are fixed on the left, and the month labels are above (January and the first label carry the year). Cells: the series colour at the alpha of its level (32 %, 55 %, 78 %, 100 % over the surface, dark mode included), mixed days drawn by drawn (two halves on a 135° hard stop, three or more as wedges), none days in a neutral surface variant, future days outlined only, and today with a ring. No hint texts.
  4. Month calendar (2–42 days; 02): 7 columns, Monday first, 44 dp cells. Days outside the range are muted and cannot be tapped, and the 1st of a month reads 1 Nov. Future days are dashed and today is outlined.
  5. Day timeline (1 day; 03): one lane per series on a 0–24 h axis (labels 00, 06, 12, 18, 24, light gridlines), each shard a dot at its moment with its time as a label. Within a lane, the labels of dots less than 150 minutes apart alternate above and below. Shards are events, never bars. (Stacking dots minutes apart is a follow-up, not this ticket.)
  6. Legend under the chart: a ramp per series plus Mixed.
  7. Drill-down: a tap on a day of the grid opens its month, and a tap in the calendar opens the day. Back goes one level up (day → month → the range before). A range chosen in the sheet or by the arrows starts a new root. The back stack is kept in rememberSaveable as range texts.
  8. Latest shards: at most 5, newest first: Sat 17 Oct · 06:45 in mono, the title (shardSummary), and the series as a TagChip in its colour. A tap opens the note (NoteRequest.route). With more than 5, in every view, there's a Show all N shards button (the screen of #285, hidden until then).
  9. Days table (01, 02, 03; 05 exclusive): inclusive shows <Series> "incl. N mixed" · Mixed "also counted above" · None "no series matched"; exclusive shows <Series> only "no other series that day" · Mixed "several series that day" · None. Each row has its day count and a % of the tracked days, followed by the shards per series under "Shards". The link "… · change" opens the ⋮ menu. It is kept in the day view too, as in 03. Wording is generic: the only domain words are the series names. Strings go in strings.xml.
  10. ⋮ menu (05): Exclude mixed days, a switch with its explanation, for the session (no new call: both tables are in the report); Edit command (the form of #286; until then the generic config form of the command, or hidden); Show shards in stream (#285; hidden until then).
  11. Integration: All commands gets a section "Activity" with a mini-grid icon (ic_calendar_view_month or similar, a Material Symbol as Icons.kt says), the one-line summary and the pin. A route per activity command in the NavHost, as for state and timesheet commands (BottomBar.kt, Pins.kt).

Tests

JVM unit tests of the pure helpers: the alpha of a level, the drawn slices (1, 2, 3 series), the week columns of a range with the month labels, the label alternation of the timeline, and the generic wording in both modes. Screenshot tests (ActivityScreenshots.kt, one scene per state, TODAY of Fixtures.kt): the year grid, the month calendar, the day timeline, exclusive mode with the menu open, and a mixed day of three series. Split into an internal ActivityContent drawn by the tests, as TimesheetContent is. On the emulator: scroll to newest, drill down and back.

Docs

R35 (the app), README, AGENTS.md (the screen, core/Activity.kt).

Part of #277. Needs #283. | All time: year grid | Month calendar | Day timeline | ⋮ menu, exclusive | |---|---|---|---| | <img src="https://git.konstantinfickel.de/attachments/a5ad090d-380a-4c92-aa1a-c322ad8e7d74" width="220"> | <img src="https://git.konstantinfickel.de/attachments/2fbb547b-9c1b-475f-be59-ab92ba52c2a1" width="220"> | <img src="https://git.konstantinfickel.de/attachments/151883b1-a9b8-46a4-a71a-c4e6c3f2adf8" width="220"> | <img src="https://git.konstantinfickel.de/attachments/5b82298a-f1bb-4cad-bf6b-0fdad98b7d38" width="220"> | | `01-all-time-year-grid.png` | `02-month-calendar.png` | `03-day-timeline.png` | `05-options-menu-exclude-mixed.png` | The screenshots come from a web prototype (Instrument Sans, its own colours). They give the **content and behaviour**. Draw them as the app draws everything else: Material 3 Expressive, `StreamdTheme`, `ScreenBar`, the components of `Components.kt`. The bottom bar in them is a mock. ## Goal The screen of an activity command (`ActivityScreen`): a header with the range pill, the tiles, the chart chosen by the range, the legend, the latest shards, the Days table and the ⋮ menu. It opens from All and from a pinned tab, like a state or a timesheet command. ## Plan ### Session 1. `StreamSession.activity(key, range, excludeMixed, now, offset, limit)` → a plain `Activity` (`core/Activity.kt`: days, stats, series with `Color`, shards, range with `previous` / `next`), the only call into the bindings. The `Activities` interface is implemented by `StreamViewModel`. The `Overview` of an activity command for All and the badge is `N active days this month`. ### Screen (`ui/Activity.kt`, pure helpers in `ui/ActivityChart.kt`) 2. **Header**: `ScreenBar` with the command name and the monospaced subtitle `streamd <key> · <view>`, back only when drilled in. At the top right is the range pill `‹ label ›` (the arrows load `previous` / `next` and are disabled when closed; a tap on the label opens the sheet of #285, a no-op until then) and ⋮. 3. **Tiles**: for a range, [label: **shards**] · [Active days: N **of M days**] · [Per week: x.x shards]; for a day, [date: **shards**] · one per series [count, "at 06:45"]. The first tile is in the inverse surface colour, and the numbers are large `StreamdTheme.mono`. 4. **Year grid** (more than 42 days, All; `01`): one horizontal strip, one column per week, Monday on top, 10 dp cells with a 3 dp gap, **opened scrolled to the newest week**. The weekday labels (Mo, We, Fr, Su) are fixed on the left, and the month labels are above (January and the first label carry the year). Cells: the series colour at the alpha of its level (32 %, 55 %, 78 %, 100 % over the surface, dark mode included), mixed days drawn by `drawn` (two halves on a 135° hard stop, **three or more as wedges**), none days in a neutral surface variant, future days outlined only, and today with a ring. No hint texts. 5. **Month calendar** (2–42 days; `02`): 7 columns, Monday first, 44 dp cells. Days outside the range are muted and cannot be tapped, and the 1st of a month reads `1 Nov`. Future days are dashed and today is outlined. 6. **Day timeline** (1 day; `03`): one lane per series on a 0–24 h axis (labels 00, 06, 12, 18, 24, light gridlines), **each shard a dot** at its moment with its time as a label. Within a lane, the labels of dots less than 150 minutes apart alternate above and below. Shards are events, never bars. (Stacking dots minutes apart is a follow-up, not this ticket.) 7. **Legend** under the chart: a ramp per series plus `Mixed`. 8. **Drill-down**: a tap on a day of the grid opens its month, and a tap in the calendar opens the day. Back goes one level up (day → month → the range before). A range chosen in the sheet or by the arrows starts a new root. The back stack is kept in `rememberSaveable` as range texts. 9. **Latest shards**: at most 5, newest first: `Sat 17 Oct · 06:45` in mono, the title (`shardSummary`), and the series as a `TagChip` in its colour. A tap opens the note (`NoteRequest.route`). With more than 5, in every view, there's a `Show all N shards` button (the screen of #285, hidden until then). 10. **Days table** (`01`, `02`, `03`; `05` exclusive): inclusive shows `<Series>` "incl. N mixed" · `Mixed` "also counted above" · `None` "no series matched"; exclusive shows `<Series> only` "no other series that day" · `Mixed` "several series that day" · `None`. Each row has its day count and a % of the tracked days, followed by the shards per series under "Shards". The link "… · change" opens the ⋮ menu. It is kept in the day view too, as in `03`. **Wording is generic**: the only domain words are the series names. Strings go in `strings.xml`. 11. **⋮ menu** (`05`): *Exclude mixed days*, a switch with its explanation, for the session (no new call: both tables are in the report); *Edit command* (the form of #286; until then the generic config form of the command, or hidden); *Show shards in stream* (#285; hidden until then). 12. **Integration**: All commands gets a section "Activity" with a mini-grid icon (`ic_calendar_view_month` or similar, a Material Symbol as `Icons.kt` says), the one-line summary and the pin. A route per activity command in the `NavHost`, as for state and timesheet commands (`BottomBar.kt`, `Pins.kt`). ## Tests JVM unit tests of the pure helpers: the alpha of a level, the drawn slices (1, 2, 3 series), the week columns of a range with the month labels, the label alternation of the timeline, and the generic wording in both modes. **Screenshot tests** (`ActivityScreenshots.kt`, one scene per state, `TODAY` of `Fixtures.kt`): the year grid, the month calendar, the day timeline, exclusive mode with the menu open, and a mixed day of three series. Split into an `internal ActivityContent` drawn by the tests, as `TimesheetContent` is. On the emulator: scroll to newest, drill down and back. ## Docs R35 (the app), README, AGENTS.md (the screen, `core/Activity.kt`).
Author
Collaborator

Implementation plan

Implement the behavior and chart dimensions in the issue description using the app's Material 3 Expressive theme and components. The prototype images specify content and interaction, not typography, colours, or navigation chrome. #283 is closed; the current bindings already expose activity reports, both Days tables, range stepping, summaries, and configuration records.

Scope and decisions

  • Initial root range: all. Use the report's shape and range metadata rather than duplicating the core's selection rules.
  • Range-label taps remain a no-op until #285. Hide Show all shards and Show shards in stream until #285; no placeholder navigation.
  • Edit command opens the existing generic configuration form (which already handles Activity settings). Dedicated editing enhancements belong to #286.
  • Exclude mixed days starts from the command's setting, then stays a local session override across range changes. Switching selects the report's existing statistics without another binding call.
  • Keep current pin defaults and the two-pin limit. Activity commands become eligible for manual pins and for the existing default-command selection.
  • Dot collision stacking remains out of scope. Use project timezone throughout.
    These are implementation defaults following the ticket; clarification was requested about the temporary menu boundary, with no response received before recording this plan.

1. Session adapter and plain model

  • Add core/Activity.kt: plain activity/range/series/day/statistics/shard models, a success/failure result, and an Activities interface. Preserve indices, drawn slices, intensity level, tracked counts, both Days tables, paging total, summaries, and previous/next texts. Convert configured colours once to Compose Color, matching the proposed app model.
  • Add StreamSession.activity(key, range, excludeMixed, now, offset, limit), running bindings on the session dispatcher. StreamSession remains the app's only binding caller; StreamViewModel implements Activities and supplies the call's current instant.
  • Carry project-local today and local shard times into the model. Screens and fixtures never read the clock.
  • Extend Overview and overview rendering with “N active days this month”, using a current-month report; update the loading key set so activity overviews are actually requested.
  • Add session tests against a store fixture for mapping, timezone, default mixed setting, statistics, pagination, and failures.

2. Pure chart and presentation helpers

Add ui/ActivityChart.kt and JVM tests before each behavior:

  • Levels map to 32%, 55%, 78%, 100% alpha, composited over the theme surface. Preserve neutral None, Future and Untracked distinctions.
  • Slices use the report's drawn indices: one fill, two halves with a 135° hard stop, three or more wedges.
  • Monday-first week columns include padding outside the range; labels include the year on the first month label and every January.
  • Calendar padding is muted and noninteractive. Date labels use “1 Nov” at month boundaries.
  • Timeline positions are project-local minutes on a 0–24-hour axis; sort within each series, alternate nearby labels above/below when successive dots are less than 150 minutes apart, and restart after a larger gap.
  • Derive Days rows from the report's inclusive/exclusive arrays. Per-series mixed count is inclusive days minus exclusive days, not the global mixed total. Use provided percentages and zero-safe values. All generic wording and formatting templates belong in strings.xml.

3. Screen state and navigation

  • Add ActivityScreen and internal ActivityContent, following TimesheetScreen/TimesheetContent. Keep loading/effects in the screen; content accepts fully loaded state, today, menu state, and callbacks.
  • Keep root/drill history as saveable range strings, scoped to command key. Grid tap opens its month; calendar tap opens its date. In-screen and Android back pop day → month → original range before ordinary navigation resumes.
  • Previous/next use report texts and reset drill history to a new root; disable unavailable arrows. Reload on relevant stream updates; avoid displaying stale results after rapid range changes.
  • Provide ordinary loading, empty and error presentation. Empty activity still renders appropriate zero statistics without division errors.

4. Charts and surrounding content

  • ScreenBar: command name, mono streamd <key> · <view>, drill-back control, range pill, overflow menu.
  • Tiles: inverse-surface primary shard total; active/tracked days and shards per week for ranges; per-series counts and event times for a day. Large mono numbers.
  • Grid: one horizontally scrolling strip, 10 dp cells/3 dp gaps, fixed Mo/We/Fr/Su labels, month labels above, outlined future cells and today ring. Open at newest week after layout; make screenshot positioning deterministic because layoutlib runs no effects.
  • Calendar: seven Monday-first columns, 44 dp cells, muted outside-range dates, dashed future cells, today outline.
  • Timeline: one lane per series, grid/axis 00/06/12/18/24, one labelled dot per shard per matching lane. Fetch every shard of a day via the adapter's paging interface; a five-item preview must never truncate the timeline. Range views need only the five newest shards.
  • Legend: each series' ramp plus Mixed. Latest: at most five newest summaries, local date/time, colour chips for every matching series, note navigation at file/line via NoteRequest.
  • Days and Shards sections remain visible in day view. Inclusive wording: series “incl. N mixed”, Mixed “also counted above”, None “no series matched”. Exclusive: series “only” / “no other series that day”, Mixed “several series that day”, None. The change link opens the same menu. Use the matching inclusive/exclusive shard totals supplied by the report.
  • Overflow: explanatory Exclude mixed days switch and generic Edit command action. Add accessibility labels/semantics for chart day targets, arrows and events.

5. App integration

  • Wire Activities through MainActivity/App/StreamViewModel as needed; add an activity callback and explicit ACTIVITY dispatch in Shell/NavHost (current non-state dispatch goes to timesheet).
  • Add All commands Activity section, summary, Material Symbol grid icon, pin action and appropriate selected/unselected bottom-bar icon.
  • Extend canBePinned and cover restored/manual/default activity pins, route selection, and existing pin limits without changing existing defaults.
  • Reuse configuration editing and note routes.

6. Validation and documentation

  • Work in small behavior-focused TDD chunks: failing helper/session/navigation tests, implementation, then signed conventional commits through nix develop.
  • JVM coverage: level alpha, 1/2/3+ slices, Monday padding/month/year labels, 150-minute boundary and alternation, generic table row counts/text in both modes, no extra load on toggling, drill/back/root reset, and a day with more than five events.
  • Add ActivityScreenshots.kt with fixed Fixtures TODAY/NOW: year grid at newest, month calendar, complete day timeline, exclusive mode with menu open, three-series mixed day; light and dark. Include empty/error coverage and update All commands references for the new section. Expose state directly so no scene depends on effects.
  • Record with updateDebugScreenshotTest and inspect every changed image, then validate. Run app unit/screenshot tests via nix build .#streamd-app (not included in flake check). Use the documented bindings setup if running Gradle directly.
  • On emulator verify newest-week initial scroll, horizontal scrolling, grid → month → day → back, root reset on arrows, mixed toggle, note/edit navigation, and pins. Report any unavailable emulator verification explicitly.
  • Update README.md, AGENTS.md and REQUIREMENTS.md R35 to describe the implemented screen, core/Activity.kt adapter, navigation, and temporary #285 boundary; update relevant docs if present.
  • Finish with nix flake check. No new dependency is expected; if Gradle dependencies change, regenerate android/deps.json using the documented script.
  • Push focused commits, open a Forgejo PR referencing #284, and add the required implementation duration/token-use/findings note to the issue.
## Implementation plan Implement the behavior and chart dimensions in the issue description using the app's Material 3 Expressive theme and components. The prototype images specify content and interaction, not typography, colours, or navigation chrome. #283 is closed; the current bindings already expose activity reports, both Days tables, range stepping, summaries, and configuration records. ### Scope and decisions - Initial root range: `all`. Use the report's shape and range metadata rather than duplicating the core's selection rules. - Range-label taps remain a no-op until #285. Hide Show all shards and Show shards in stream until #285; no placeholder navigation. - Edit command opens the existing generic configuration form (which already handles Activity settings). Dedicated editing enhancements belong to #286. - Exclude mixed days starts from the command's setting, then stays a local session override across range changes. Switching selects the report's existing statistics without another binding call. - Keep current pin defaults and the two-pin limit. Activity commands become eligible for manual pins and for the existing default-command selection. - Dot collision stacking remains out of scope. Use project timezone throughout. These are implementation defaults following the ticket; clarification was requested about the temporary menu boundary, with no response received before recording this plan. ### 1. Session adapter and plain model - Add `core/Activity.kt`: plain activity/range/series/day/statistics/shard models, a success/failure result, and an `Activities` interface. Preserve indices, drawn slices, intensity level, tracked counts, both Days tables, paging total, summaries, and previous/next texts. Convert configured colours once to Compose Color, matching the proposed app model. - Add `StreamSession.activity(key, range, excludeMixed, now, offset, limit)`, running bindings on the session dispatcher. StreamSession remains the app's only binding caller; StreamViewModel implements Activities and supplies the call's current instant. - Carry project-local today and local shard times into the model. Screens and fixtures never read the clock. - Extend Overview and overview rendering with “N active days this month”, using a current-month report; update the loading key set so activity overviews are actually requested. - Add session tests against a store fixture for mapping, timezone, default mixed setting, statistics, pagination, and failures. ### 2. Pure chart and presentation helpers Add `ui/ActivityChart.kt` and JVM tests before each behavior: - Levels map to 32%, 55%, 78%, 100% alpha, composited over the theme surface. Preserve neutral None, Future and Untracked distinctions. - Slices use the report's drawn indices: one fill, two halves with a 135° hard stop, three or more wedges. - Monday-first week columns include padding outside the range; labels include the year on the first month label and every January. - Calendar padding is muted and noninteractive. Date labels use “1 Nov” at month boundaries. - Timeline positions are project-local minutes on a 0–24-hour axis; sort within each series, alternate nearby labels above/below when successive dots are less than 150 minutes apart, and restart after a larger gap. - Derive Days rows from the report's inclusive/exclusive arrays. Per-series mixed count is inclusive days minus exclusive days, not the global mixed total. Use provided percentages and zero-safe values. All generic wording and formatting templates belong in strings.xml. ### 3. Screen state and navigation - Add `ActivityScreen` and `internal ActivityContent`, following TimesheetScreen/TimesheetContent. Keep loading/effects in the screen; content accepts fully loaded state, today, menu state, and callbacks. - Keep root/drill history as saveable range strings, scoped to command key. Grid tap opens its month; calendar tap opens its date. In-screen and Android back pop day → month → original range before ordinary navigation resumes. - Previous/next use report texts and reset drill history to a new root; disable unavailable arrows. Reload on relevant stream updates; avoid displaying stale results after rapid range changes. - Provide ordinary loading, empty and error presentation. Empty activity still renders appropriate zero statistics without division errors. ### 4. Charts and surrounding content - ScreenBar: command name, mono `streamd <key> · <view>`, drill-back control, range pill, overflow menu. - Tiles: inverse-surface primary shard total; active/tracked days and shards per week for ranges; per-series counts and event times for a day. Large mono numbers. - Grid: one horizontally scrolling strip, 10 dp cells/3 dp gaps, fixed Mo/We/Fr/Su labels, month labels above, outlined future cells and today ring. Open at newest week after layout; make screenshot positioning deterministic because layoutlib runs no effects. - Calendar: seven Monday-first columns, 44 dp cells, muted outside-range dates, dashed future cells, today outline. - Timeline: one lane per series, grid/axis 00/06/12/18/24, one labelled dot per shard per matching lane. Fetch every shard of a day via the adapter's paging interface; a five-item preview must never truncate the timeline. Range views need only the five newest shards. - Legend: each series' ramp plus Mixed. Latest: at most five newest summaries, local date/time, colour chips for every matching series, note navigation at file/line via NoteRequest. - Days and Shards sections remain visible in day view. Inclusive wording: series “incl. N mixed”, Mixed “also counted above”, None “no series matched”. Exclusive: series “only” / “no other series that day”, Mixed “several series that day”, None. The change link opens the same menu. Use the matching inclusive/exclusive shard totals supplied by the report. - Overflow: explanatory Exclude mixed days switch and generic Edit command action. Add accessibility labels/semantics for chart day targets, arrows and events. ### 5. App integration - Wire Activities through MainActivity/App/StreamViewModel as needed; add an activity callback and explicit ACTIVITY dispatch in Shell/NavHost (current non-state dispatch goes to timesheet). - Add All commands Activity section, summary, Material Symbol grid icon, pin action and appropriate selected/unselected bottom-bar icon. - Extend canBePinned and cover restored/manual/default activity pins, route selection, and existing pin limits without changing existing defaults. - Reuse configuration editing and note routes. ### 6. Validation and documentation - Work in small behavior-focused TDD chunks: failing helper/session/navigation tests, implementation, then signed conventional commits through nix develop. - JVM coverage: level alpha, 1/2/3+ slices, Monday padding/month/year labels, 150-minute boundary and alternation, generic table row counts/text in both modes, no extra load on toggling, drill/back/root reset, and a day with more than five events. - Add ActivityScreenshots.kt with fixed Fixtures TODAY/NOW: year grid at newest, month calendar, complete day timeline, exclusive mode with menu open, three-series mixed day; light and dark. Include empty/error coverage and update All commands references for the new section. Expose state directly so no scene depends on effects. - Record with updateDebugScreenshotTest and inspect every changed image, then validate. Run app unit/screenshot tests via `nix build .#streamd-app` (not included in flake check). Use the documented bindings setup if running Gradle directly. - On emulator verify newest-week initial scroll, horizontal scrolling, grid → month → day → back, root reset on arrows, mixed toggle, note/edit navigation, and pins. Report any unavailable emulator verification explicitly. - Update README.md, AGENTS.md and REQUIREMENTS.md R35 to describe the implemented screen, core/Activity.kt adapter, navigation, and temporary #285 boundary; update relevant docs if present. - Finish with `nix flake check`. No new dependency is expected; if Gradle dependencies change, regenerate android/deps.json using the documented script. - Push focused commits, open a Forgejo PR referencing #284, and add the required implementation duration/token-use/findings note to the issue.
Author
Collaborator

Implemented in PR #309: #309

Three signed commits add the activity model/chart helpers, the session adapter and screen integration, and screenshot coverage/documentation. Activity commands now have All entries, pins/badges, the newest-first year grid, month calendar, complete day timeline, saveable drill history, latest note links, and both Days tables. Mixed-mode switching uses the existing report without reloading.

Validation passed: 405 JVM tests with no skips, 128 screenshot scenes, the full nix build .#streamd-app (including exact screenshot validation), and the final nix flake check. Twenty new Activity light/dark references and the updated All references were visually reviewed. Emulator interaction checks remain unverified: there is no /dev/kvm and ADB reported no connected device.

Findings: timelines need all events independently of the five-shard preview; per-series mixed-day counts are inclusive minus exclusive days; the expanded layoutlib suite needs a 2 GiB screenshot-test heap. Platform popup contents rendered blank at frame zero, so the menu uses a Material Surface overlay with outside-tap and Back dismissal. No Maven dependency changed. The range picker/full-shard actions remain in #285; Edit command opens the generic form.

Elapsed time: approximately 1 hour 43 minutes from branch creation (13:10 UTC) to PR creation (14:53 UTC), including the interruption and signing-key wait. Active execution time was not separately measured.
Token usage: this runtime does not expose reliable session token totals, so an exact count is unavailable rather than estimated.

Implemented in PR #309: https://git.konstantinfickel.de/kfickel/streamd/pulls/309 Three signed commits add the activity model/chart helpers, the session adapter and screen integration, and screenshot coverage/documentation. Activity commands now have All entries, pins/badges, the newest-first year grid, month calendar, complete day timeline, saveable drill history, latest note links, and both Days tables. Mixed-mode switching uses the existing report without reloading. Validation passed: 405 JVM tests with no skips, 128 screenshot scenes, the full `nix build .#streamd-app` (including exact screenshot validation), and the final `nix flake check`. Twenty new Activity light/dark references and the updated All references were visually reviewed. Emulator interaction checks remain unverified: there is no /dev/kvm and ADB reported no connected device. Findings: timelines need all events independently of the five-shard preview; per-series mixed-day counts are inclusive minus exclusive days; the expanded layoutlib suite needs a 2 GiB screenshot-test heap. Platform popup contents rendered blank at frame zero, so the menu uses a Material Surface overlay with outside-tap and Back dismissal. No Maven dependency changed. The range picker/full-shard actions remain in #285; Edit command opens the generic form. Elapsed time: approximately 1 hour 43 minutes from branch creation (13:10 UTC) to PR creation (14:53 UTC), including the interruption and signing-key wait. Active execution time was not separately measured. Token usage: this runtime does not expose reliable session token totals, so an exact count is unavailable rather than estimated.
Sign in to join this conversation.
No labels
android
cli
epic
planned
tui
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Reference
kfickel/streamd#284
No description provided.