android: event delete, confetti parity, coverage in CI #102

Merged
nalum merged 4 commits from feat/android-parity-and-ci into main 2026-08-16 19:44:31 +00:00
Owner

Stacked on #101 (merge that first; Forgejo retargets this to main). The Android parity and CI items from the #100 plan, plus one offline-queue bug found on the way.

Delete an event / the series (closes #78). CalendarRepository.deleteEvent goes through the offline queue (events.delete, OpKind.DELETE), mirroring the meal and reward deletes; the sketch drops the event's occurrence rows locally so an offline delete disappears from the board at once. The event sheet gains the web's affordance word for word — "Delete the series" for a repeating event, "Delete the whole event" for a plain one, danger-styled behind a two-step confirm with the web's "This removes every occurrence, past and future." warning — gated on EventService/Delete from the permission matrix, never a role guess. The sync chip names the queued op.

events.update replay fix. updateEvent enqueues under events.update, but the OpQueue registry never learned the name — an event edit made offline failed replay with "this change is from an older version of the app" and the change was lost as a recorded failure. Android sibling of the server-side mint gap fixed in PR #82. Registry and sync-chip label added.

Confetti parity + a buzz (closes #83). The Compose confetti is rewritten curve for curve against confetti.ts + app.css: 110 pieces in the eight mark colours, 30% round dots, a fast eased burst to a peak over the first 18% of each piece's life, a long accelerating fall past the bottom edge, and per-piece sway/tumble/phase so nothing falls in a straight line — replacing the old single-parabola burst that faded in place. Deterministic per-index hashing keeps the burst a stamp, as before. And the one thing the phone can do that the web cannot: a short confirm buzz (HapticFeedbackConstants.CONFIRM, LONG_PRESS before API 30) when the burst starts. Reduced motion still suppresses the whole celebration.

JaCoCo in the Android report (closes #76). enableUnitTestCoverage on the debug variant of both modules (release runs the same suites and would double-count), the coverage task rides the unit-test step, and the build job parses both modules' JaCoCo XML into a coverage output — skipping the committed ie/eagraiclainne/api/** protobuf codegen, whose tens of thousands of generated lines would drown the number. The sticky <!-- android-test-report --> comment gains the same **Coverage:** line the Go report has. Report only, no gate.

make check and the Android unit tests are green on every commit. On-device verification of the delete flow and the new confetti is pending — no phone was attached during this run; the coverage parse was verified against real local JaCoCo reports (2.4% of lines today, honestly low).

Stacked on #101 (merge that first; Forgejo retargets this to main). The Android parity and CI items from the #100 plan, plus one offline-queue bug found on the way. **Delete an event / the series (closes #78).** `CalendarRepository.deleteEvent` goes through the offline queue (`events.delete`, `OpKind.DELETE`), mirroring the meal and reward deletes; the sketch drops the event's occurrence rows locally so an offline delete disappears from the board at once. The event sheet gains the web's affordance word for word — "Delete the series" for a repeating event, "Delete the whole event" for a plain one, danger-styled behind a two-step confirm with the web's "This removes every occurrence, past and future." warning — gated on `EventService/Delete` from the permission matrix, never a role guess. The sync chip names the queued op. **events.update replay fix.** `updateEvent` enqueues under `events.update`, but the OpQueue registry never learned the name — an event edit made offline failed replay with "this change is from an older version of the app" and the change was lost as a recorded failure. Android sibling of the server-side mint gap fixed in PR #82. Registry and sync-chip label added. **Confetti parity + a buzz (closes #83).** The Compose confetti is rewritten curve for curve against `confetti.ts` + `app.css`: 110 pieces in the eight mark colours, 30% round dots, a fast eased burst to a peak over the first 18% of each piece's life, a long accelerating fall past the bottom edge, and per-piece sway/tumble/phase so nothing falls in a straight line — replacing the old single-parabola burst that faded in place. Deterministic per-index hashing keeps the burst a stamp, as before. And the one thing the phone can do that the web cannot: a short confirm buzz (`HapticFeedbackConstants.CONFIRM`, `LONG_PRESS` before API 30) when the burst starts. Reduced motion still suppresses the whole celebration. **JaCoCo in the Android report (closes #76).** `enableUnitTestCoverage` on the debug variant of both modules (release runs the same suites and would double-count), the coverage task rides the unit-test step, and the build job parses both modules' JaCoCo XML into a `coverage` output — skipping the committed `ie/eagraiclainne/api/**` protobuf codegen, whose tens of thousands of generated lines would drown the number. The sticky `<!-- android-test-report -->` comment gains the same `**Coverage:**` line the Go report has. Report only, no gate. `make check` and the Android unit tests are green on every commit. On-device verification of the delete flow and the new confetti is pending — no phone was attached during this run; the coverage parse was verified against real local JaCoCo reports (2.4% of lines today, honestly low).
The web event sheet has had events.delete since the queue work;
Android had cancel-this-one, join/leave and edit but no delete at all
— a surface-parity gap (system rule 1). The repository mirrors the
meal/reward deletes through the offline queue, the sheet gains a
danger-styled two-step confirm like the existing cancel, and the
affordance is gated on the permission matrix, never a role guess.
Closes #78.
updateEvent enqueues under events.update, but the OpQueue registry
never learned the name — a queued edit made offline failed replay with
'this change is from an older version of the app' and the change was
lost to a recorded failure. Android sibling of the server-side mint
gap fixed in PR #82; the SyncChip also gains the op's label.
The celebration should feel the same on every surface. Closes #83.
ci(android): JaCoCo coverage in the test report
Some checks failed
check / commits (pull_request) Successful in 9s
check / go (pull_request) Successful in 6m52s
check / web (pull_request) Successful in 11m59s
check / report (pull_request) Successful in 4s
android / build (pull_request) Successful in 34m27s
android / report (pull_request) Successful in 4s
android / report (push) Has been cancelled
check / commits (push) Has been cancelled
check / go (push) Has been cancelled
check / report (push) Has been cancelled
check / web (push) Has been cancelled
tag / tag (push) Has been cancelled
android / build (push) Has been cancelled
b9971c615f
The PR comment showed Go coverage and nothing for Android. JaCoCo
runs off the debug unit tests (release runs the same suites and would
double-count), the build job parses the percentage into an output,
and the sticky report comment gains the line. Report only, no gate —
matching how Go coverage is shown. Closes #76.

Test report

Suite Tests Result Skipped
Unit 1349 ✅ pass 1
Integration 83 ✅ pass —

Coverage: 27.8%

Updated by the check workflow · commit b9971c615f

<!-- ci-test-report --> ## Test report | Suite | Tests | Result | Skipped | | --- | --: | --- | --: | | Unit | 1349 | ✅ pass | 1 | | Integration | 83 | ✅ pass | — | **Coverage:** 27.8% <sub>Updated by the check workflow · commit b9971c615f3ca51583cac5f1ff76acfadf7cf800</sub>

Android test report

Suite Tests Result Skipped
Unit (debug) 31 ✅ pass 0

Coverage: 2.4% of lines

Updated by the android workflow · commit b9971c615f

<!-- android-test-report --> ## Android test report | Suite | Tests | Result | Skipped | | --- | --: | --- | --: | | Unit (debug) | 31 | ✅ pass | 0 | **Coverage:** 2.4% of lines <sub>Updated by the android workflow · commit b9971c615f3ca51583cac5f1ff76acfadf7cf800</sub>
nalum changed target branch from feat/notify-kinds-and-reminders to main 2026-08-16 19:44:24 +00:00
nalum merged commit b9971c615f into main 2026-08-16 19:44:31 +00:00
nalum deleted branch feat/android-parity-and-ci 2026-08-16 19:44:31 +00:00
Sign in to join this conversation.
No reviewers
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
eagraiclainne/app!102
No description provided.