(ui) Radial Dial Progress UI with bubbles - #87
Conversation
Ground-up redesign of the Fasting screen and underlying layers. **Dial**: Flat circular progress gauge with 10 tappable emoji milestones. Intro bloom animates the sweep on first load. Past ~4 days the tip caps at arc's end for visual consistency on long fasts. Theme-tuned dark/light palettes; stroke width and margins tuned to golden ratio. **Center/timer**: Auto-sizing single-line timer inscribed within the ring's inscribed square. Tap toggles day+hour vs. total-hours format (persisted). Phase rows (Fat Burn/Ketosis/Autophagy) open a bottom-sheet with phase details; upcoming phases shown neutrally, active in green; removed alarming red countdowns. Old AlertDialogs replaced by Material 3 ModalBottomSheet throughout (journey stage info, start/end fast, with optional Notes field on end). **Layout**: Golden-ratio-driven, height-aware layout — dial capped at ~0.382 of height, hero cluster golden-seated (0.382/0.618 spacers) above the pinned full-width Start/End Fast button, so the button never clips off-screen. Spacing scale follows Fibonacci sequence. **Settings**: Per-phase visibility toggles (Fat Burn/Ketosis/Autophagy) plus an Auto mode that reveals rows only once each phase begins (disables manual toggles when on). Reactive flow-backed, live-updating. **Post-fast state**: Dial rests muted (no pulse, no timer, rows hidden) after a fast ends; status line shows "just finished" message for an hour, then time-since-last-fast. **Duration formatting**: Unified humanized formatter replacing scattered ad-hoc formatting across 7+ call sites (timer, phase rows, share text, log stats, widget, notification), with hour-granular variants for surfaces refreshing hourly. **Content**: Fasting phase model expanded from 3 to 10 stages (blood sugar dynamics → gluconeogenesis → fat burning → ketosis → autophagy → GH surge → insulin sensitivity → immune regeneration) with cited figures; legacy 3-phase model retained for compatibility with existing consumers. **Chrome**: Removed redundant top app bar; added translucent floating icon pill (info + overflow menu with Share/About/Settings). **Notifications**: Progress-style segmented bar on newer API levels; humanized hour-granular duration in title. **Build**: Use app name for APK naming. **Data/CSV**: New CSV schema with full timestamps, duration seconds, humanized duration, and notes; DB migration adds notes column; CSV parsing with fixed timezone mismatch and import idempotency (dedupe by start-second); import/export moved to background dispatcher.
- add Csv.kt - basic `Makefile` - string translations fix for Spanish
- spanish localization for the new strings
- spanish localization for the new strings
- spanish localization for the new strings
- localization for the new strings in other languages, fix nl english placeholders
- Share text with Image - Settings: Import EasyFast ZIP backup - Settings: Import/Export iCalendar .ics and ActivityStreams 2.0 (JSON-LD) - Log stats: add Total Fasts, Total Days fasted, Longest Fast
- bring Share back to where it was before - Log: editable Notes
There was a problem hiding this comment.
Pull Request Overview
This PR implements a comprehensive overhaul of the application, including a 10-stage radial progress dial, a transition to Material 3 ModalBottomSheets, and expanded data portability via iCalendar and ActivityStreams 2.0. Codacy reports the changes are up to standards, though coverage metrics are currently unavailable. The primary concern is the complexity of the PR, which the author acknowledges is monolithic; this makes the review process more difficult and increases the likelihood of side effects in the database migrations or duration formatting logic. Additionally, the removal of the standard top app bar in favor of a floating pill icon should be verified for accessibility compliance.
About this PR
- This monolithic PR significantly increases review complexity and the risk of regressions. Future updates of this scale should be decomposed into smaller, incremental pull requests (e.g., separating database changes from UI overhauls) to ensure better auditability.
Test suggestions
- Verify the unified duration formatter correctly handles hour-granular variants vs. standard formats.
- Verify database migration integrity to ensure the notes column is added without data loss.
- Verify CSV import/export logic correctly handles timezone offsets to prevent timestamp shifting.
- Verify the 'Auto mode' logic correctly calculates phase visibility based on elapsed duration.
- Verify the background dispatcher implementation for I/O heavy tasks such as ZIP imports and ActivityStreams exports.
Prompt proposal for missing tests
Consider implementing these tests if applicable:
1. Verify the unified duration formatter correctly handles hour-granular variants vs. standard formats.
2. Verify database migration integrity to ensure the notes column is added without data loss.
3. Verify CSV import/export logic correctly handles timezone offsets to prevent timestamp shifting.
4. Verify the 'Auto mode' logic correctly calculates phase visibility based on elapsed duration.
5. Verify the background dispatcher implementation for I/O heavy tasks such as ZIP imports and ActivityStreams exports.
Low confidence findings
- The replacement of the standard top app bar with a floating pill icon may impact navigation accessibility. Ensure that this UI pattern adheres to Android accessibility standards and does not hinder users relying on screen readers or standard navigation gestures.
TIP Improve review quality by adding custom instructions
TIP How was this review? Give us feedback
Up to standards ✅🟢 Issues
|
| Metric | Results |
|---|---|
| Complexity | 522 |
| Duplication | 6 |
AI Reviewer: first review requested successfully. AI can make mistakes. Always validate suggestions.
TIP This summary will be updated as you push new changes.
- cleanup - remove logci duplication/triplication - Logbook: delete all entries - trigger Manual Add via tamp on calendar day - allow hours _and_ minutes for fast duration - use 1min refresh for FastingScreen.kt calculation logic instead of 10 millis - Manual Add: use bottom sheet instead of AlertDialog - optimize parseIcsDateTime(), parseIsoDurationMs(), parseIso8601() to reduce unnecessary object allocations, reduce RAM, use char walking state machines instead of regexes
- enable gradle config cache
- i10n sync, fix cognitive dissonance in i10n strings - sync tests
FastTrack UI Revamp
APK
An APK for the radial version built using github action (see apk.yml not the only difference from this PR's branch is the .yml github workflow this pr is on the revamp branch)
com.darkrockstudios.apps.fasttrack.revamp_v3to allow installing side-by-side with the published version)NOTE:
The APK branch already diverged from this PR branch and includes extra features not present this PR: share image, import ZIP backups from EasyFast, import/export to/from iCalendar .ics and ActivityStreams 2.0 (JSON-LD), Log tab: add Total Fasts, Total Days fasted, Longest Fast. The branch is revamp-v3 in my repo. Not including it here since this PR already has multiple overlapping scopes. @Wavesonics: let me know if you'd rather have it all here.I have included it ALL into this monolithic PR. Splitting it by scope would be just too much work, and it would probably have to be a dozen of single-scoped PR's.A more joyful fasting screen with tappable bubbles for each fasting stage. Hour/minutes display chanages to days/hours on tap:
AlertDialog replaced with material bottom sheet:

End Fast
After end fast the last fast details don't stay frozen, instead the UI shows days elapsed since last fast (after one hour).
Fat Burn, Ketosis, Autophagy
You can show/hide them now in settings or enable auto-mode (
show only active phases) which will display only those that already kicked in. To some degree they duplicate the bubbles but I left them since they provide extra context without having to interact in any way with the dial.Details
Dial: Flat circular progress gauge with 10 tappable emoji milestones. Intro bloom animates the sweep on first load. Past ~4 days the tip caps at arc's end for visual consistency on long fasts. Theme-tuned dark/light palettes; stroke width and margins tuned to golden ratio.
Center/timer: Auto-sizing single-line timer in the center of the dial. Tap toggles day+hour vs. total-hours format (persisted). Phase rows (Fat Burn/Ketosis/Autophagy) open a bottom-sheet with phase details; upcoming phases shown neutrally, active in green; removed alarming red countdowns. Old AlertDialogs replaced by Material 3 ModalBottomSheet throughout (journey stage info, start/end fast, with optional Notes field on end).
Layout: Golden-ratio-driven, height-aware layout — dial capped at ~0.382 of height, hero cluster golden-seated (0.382/0.618 spacers) above the pinned full-width Start/End Fast button, so the button never clips off-screen. Spacing scale follows Fibonacci sequence.
Settings: Per-phase visibility toggles (Fat Burn/Ketosis/Autophagy) plus an Auto mode that reveals rows only once each phase begins (disables manual toggles when on). Reactive flow-backed, live-updating.
Post-fast state: Dial rests muted (no pulse, no timer, rows hidden) after a fast ends; status line shows "just finished" message for an hour, then time-since-last-fast.
Duration formatting: Unified humanized formatter replacing scattered ad-hoc formatting across 7+ call sites (timer, phase rows, share text, log stats, widget, notification), with hour-granular variants for surfaces refreshing hourly.
Content: Fasting phase model expanded from 3 to 10 stages (blood sugar dynamics → gluconeogenesis → fat burning → ketosis → autophagy → GH surge → insulin sensitivity → immune regeneration) with cited figures; legacy 3-phase model retained for compatibility with existing consumers.
Chrome: Removed redundant top app bar; added translucent floating icon pill (Share + Info + overflow menu with About/Settings).
Notifications: Progress-style segmented bar on newer API levels; humanized hour-granular duration in title.
Build: Use app name for APK naming.
Data/CSV: New CSV schema with full timestamps, duration seconds, humanized duration, and notes; DB migration adds notes column; CSV parsing with fixed timezone mismatch and import idempotency (dedupe by start-second); import/export moved to background dispatcher.
Additional tweaks from the second iteration:
nlreplaced equivalent English dupes with actual translations....and more, see sources for details