Repository navigation
Activity Start Flow Analysis
Status (2026-08-26): Historical. Proposals 1, 2, 4 and 6 are implemented; 3 and 5 are superseded by the activity start hub (see Activity and training plans); 7 (resume an active or draft recording from the dashboard Start) is still open.
Status: Analysis and proposal context. Current implemented behavior remains documented in Recording of activity. Implementation map: Feature map.
This document maps the current paths for starting or creating an activity, then proposes ways to reduce taps and make the intent clearer.
For a clearer breakdown of each proposed improvement, see Activity start flow simplification proposals.
Activity creation is routed through Screen.ActivityEntry (manual_entry/activity). That destination starts in ActivityEntryMode.CHOOSE_SOURCE, so most paths first land on a source chooser before they can record, create a manual entry, import a route, or use a planned workout.
Relevant code touchpoints:
-
navigation/AppNavigation.kt: dashboard quick actions, activity add action, and navigation intoScreen.ActivityEntry. -
navigation/AppNavigationManualEntryRoutes.kt: activity entry route wiring. -
features/dashboard/DashboardQuickActions.kt: dashboardLogandStartbuttons. -
features/manualentry/activity/ActivityEntryScreen.kt: permission gates and source actions. -
features/manualentry/activity/ActivityEntryFormContent.kt: mode-to-screen switch. -
features/manualentry/activity/recording/ActivityRecordingSetupScreen.kt: pre-recording setup. -
features/manualentry/activity/recording/ActivityRecordingScreen.kt: live/idle recording dashboard. -
features/activity/ActivitiesOverviewSections.kt: planned workout list, currently display-only.
The dashboard has a primary Start action, but that action still opens the generic activity entry source chooser. From there, the user picks recording, confirms setup, and for GPS activities taps start again inside the recording dashboard.
flowchart TD
A[Dashboard] -->|Start| B[Activity Entry]
C[Activities screen or workout metric] -->|Add| B
D[Manual Entry hub] -->|Activity tile| B
B --> E[Choose source]
E -->|Record GPS activity| F{Permission checks}
F -->|Needs Health Connect write| G[Health Connect permission request]
F -->|Needs notification permission| H[Android notification request]
G --> I[Recording setup]
H --> I
F -->|Already granted| I
I -->|Select/change activity type| I
I -->|Go to activity screen| J{Recording kind}
J -->|GPS route| K[Idle recording dashboard]
K -->|Start| L[Recording active]
J -->|Timed or repetition| L
L -->|Finish| M[Review draft in manual form]
M -->|Add| N[Save activity to Health Connect]
Minimum taps after the dashboard is visible:
- GPS recording:
Start->Record GPS activity->Go to activity screen->Start= 4 taps, before finish/review/save. - Timed or repetition recording:
Start->Record GPS activity->Go to activity screen= 3 taps, because setup starts those recordings immediately. - From
Log/manual entry hub: add one extra tap for the Activity tile. - Extra taps appear for permission prompts, choosing a non-default activity type, changing recording settings, finishing, reviewing, and saving.
Main friction:
-
Startdoes not start directly; it opens the source chooser. - GPS recording has two start-like decisions: setup's
Go to activity screen, then the dashboard'sStart. - The source chooser treats manual entry, plan use, route import, and recording equally even when the user came from a
Startaffordance. - The source action is named
Record GPS activity, but the recording stack also supports timed and repetition activities.
Manual activity creation can be reached through the dashboard Log action, the dashboard Start action, the activities screen add action, or the metric top-bar add action. The clearest user path is Log, but it is not the shortest because it opens the manual-entry hub first.
flowchart TD
A[Dashboard] -->|Log| B[Manual Entry hub]
B -->|Activity tile| C[Activity Entry]
D[Dashboard] -->|Start| C
E[Activities screen or workout metric] -->|Add| C
C --> F[Choose source]
F -->|Create manual| G[Manual activity form]
G -->|Fill or adjust activity fields| G
G -->|Add| H[Save activity to Health Connect]
Minimum taps:
- From dashboard
Log:Log->Activity->Create manual->Add= 4 taps, plus data entry. - From dashboard
Start:Start->Create manual->Add= 3 taps, plus data entry, but the label does not communicate manual logging. - From activities screen add action:
Add->Create manual->Add= 3 taps, plus data entry.
Main friction:
- The shortest manual route is hidden behind a button labeled
Start. - The clearer
Logroute has an extra manual-entry hub step. - The activity form includes the
Choose another sourcebutton, which is useful for recovery but reinforces that the user is inside a multi-source wizard rather than a direct log flow.
Planned workouts are visible in the activities overview, but the rows are read-only. To use a plan, the user must open activity entry, choose the plan source, choose an activity family, choose the plan, then save the prefilled manual entry.
flowchart TD
A[Activities overview] --> B[Planned workout list]
B -->|Read-only today| Z[No direct action]
C[Dashboard or activities screen] -->|Start/Add| D[Activity Entry]
D --> E[Choose source]
E -->|Create from existing plan| F[Load planned workouts]
F --> G[Choose planned workout activity]
G --> H[Choose planned workout]
H --> I[Manual activity form prefilled from plan]
I -->|Add| J[Save activity linked to planned workout]
Minimum taps:
- From dashboard
Start:Start->Create from existing plan-> activity type -> plan ->Add= 5 taps, plus any field review. - From activities screen add action:
Add->Create from existing plan-> activity type -> plan ->Add= 5 taps, plus any field review. - From the visible planned workout row: no direct path exists.
Main friction:
- The most contextual object, the planned workout row, cannot be acted on.
- The plan flow always asks for activity type first, even if there is only one planned activity type.
- The plan flow lands in manual entry, not a dedicated
Start this planexperience. - If the user saw a plan in the activities overview, they must find it again in the source picker flow.
Add route arguments or helper routes that open ActivityEntryScreen in a target mode:
manual_entry/activity?mode=recordmanual_entry/activity?mode=manualmanual_entry/activity?mode=planmanual_entry/activity?planId=...manual_entry/activity?activityTypeId=...
Then the dashboard Start button can open recording setup directly, the activities add action can open manual entry directly, and planned workout rows can open a selected plan directly.
Impact:
- GPS recording can drop from 4 taps to 3 before any deeper recording simplification.
- Manual activity from dashboard can drop from 4 taps to 2 plus data entry.
- Planned workout use can drop from 5 taps to 2 if a row opens the selected plan.
For GPS-capable activities, the setup screen already waits for a precise location fix. When the user taps the primary setup button, call startGpsRecording(initialFix) and enter the active dashboard instead of preparing an idle dashboard first.
Impact:
- GPS recording drops one tap immediately.
- The button can say
Startinstead ofGo to activity screen. - The idle dashboard can still exist for pause/resume/editing, but it no longer blocks the common path.
Use a compact sheet or panel opened from Start that prioritizes likely actions:
- Start last activity.
- Start favorite activity.
- Plans due today.
- Manual activity.
- Import route.
This keeps all options available while putting the fastest path at the top. It also avoids a full route transition before the user chooses intent.
Turn PlannedWorkoutRow into an actionable row with a primary action:
-
Startfor uncompleted plans that map to a live-recordable activity. -
LogorUse planfor plans that should prefill manual entry. -
Viewor disabled completed state for completed plans.
The row can pass planId into the activity entry route, prefill the plan, and skip the activity/plan picker screens.
After loading existing plans:
- If there is only one activity type, skip
PLAN_ACTIVITY_PICKER. - If there is only one plan for the selected type, apply it immediately.
- If a plan is scheduled for now or today, preselect it at the top.
This is a low-risk improvement because it preserves the existing screens for ambiguous cases.
Keep the dashboard simple, but make labels match intent:
- Primary:
Start workoutopens recording setup directly. - Secondary:
Logopens a compact log menu or the manual-entry hub. - Optional overflow:
Import route,Use plan, recent/favorite activities.
This removes the current ambiguity where Start is the shortest path to manual activity but not the clearest one.
If an activity recording is active or an unsaved recording draft exists, the dashboard Start action should reopen that recording/draft before offering a new source. This avoids making the user rediscover an in-progress workflow.
- Add route/start intent support to
ActivityEntryViewModelandScreen.ActivityEntry. - Wire dashboard
Startto open recording setup directly with the preferred live activity. - Change GPS setup so the primary action starts recording when a fix is ready.
- Make planned workout rows actionable and route by
planId. - Auto-skip single-choice plan picker states.
- Revisit dashboard quick action copy and layout once the direct routes exist.
This order reduces the common recording path first while building reusable navigation primitives for manual entries and planned workouts.
Generated from docs/proposals/activity-start-flow.md. Edit it there; changes made here are overwritten.
This wiki mirrors the Markdown in Hale-MTU/OpenVitals on every push to main.
Features
- Features
- Achievements
- Activity And Training Plans
- Activity Metrics
- Apple Health Import
- Beverage Logging And Caffeine
- Bluetooth LE Sensors
- Body Energy
- Body Metrics
- CoMaps Navigation Context
- CSV Import
- Cycle Tracking
- Daily Readiness
- Elevation Correction
- Feature Map
- FIT Files Import
- Food Logging
- GPX/KML/KMZ/TCX Route Import
- Health Connect Metrics Dashboard
- Health Report Export
- Heart And Vitals
- Heart Rate Recovery
- Home Screen Widgets
- Hydration
- Manual Entry Of Metrics
- Medical Records
- Metric Detail Customization
- Mindfulness
- Non Health Connect Metrics Dashboard
- Nutrition
- Offline Maps Support
- Onboarding And Permissions
- Preloaded Beverage Nutrition Reference
- Privacy, Support, And Diagnostics
- Recording Of Activity
- Reminders
- Settings And Preferences
- Sleep Score And Recovery
- Sleep Tracking
- Statistics
- Sync With Another Phone
How-to
App
- App Guide
- FAQ
- Getting Started
- Health Connect
- Install
- Local And Connected Editions
- Permissions
- Privacy
- Screenshots
- Support
Reference
- Design Reference
- Reference
- Design Guidelines for Offline & Sync
- OpenVitals UI Notes
- Reference: Data Capture
- Reference: Data Display
- Reference: Health Connect Matchmaking
- Reference: Health Connect Onboarding
- Reference: Health Connect Permissions
- Reference: Health Connect UX
- Reference: Promoting Health Connect
Engineering
- Code Analysis
- Engineering
- Flutter ↔ Kotlin test-parity matrix
- apple-health-import
- Architecture
- body-cycle-recovery
- Design system conformance
- Development
- Feature Playbook
- Flutter -> Kotlin test parity: domain/data/core/contract/state/navigation/di/bootstrap/l10n/widget_test
- Flutter → Kotlin test-parity matrix: features section
- Flutter → Kotlin test-parity matrix: ui / goldens / integration / fixtures
- Flutter-to-Kotlin test-parity matrix — dashboard + devicesync
- manual-entry
- Translations
Proposals
- Proposals
- Activity Start Flow Analysis
- Activity Start Flow Simplification Proposals
- Caffeine Detail And Future Sleep Insights
- Cycle Tracking: Design and Status
- Medical Records Through Health Connect
- Medical Records: What Is Left
Releases
- OpenVitals 2.16.0
- OpenVitals 2.15.2
- OpenVitals 2.15.1
- OpenVitals 2.15.0
- OpenVitals 2.14.5
- OpenVitals 2.14.4
- OpenVitals 2.14.3
- OpenVitals 2.14.2
- OpenVitals 2.14.1
- OpenVitals 2.14.0
- OpenVitals 2.13.0
- OpenVitals 2.12.0
- OpenVitals 2.11.2
- OpenVitals 2.11.1
- OpenVitals 2.11.0
- OpenVitals 2.10.1
- OpenVitals 2.10.0
- OpenVitals 2.9.1
- OpenVitals 2.9.0
- OpenVitals 2.8.0
- OpenVitals 2.7.3
- OpenVitals 2.7.2
- OpenVitals 2.7.1
- OpenVitals 2.7.0
- OpenVitals 2.6.6
- OpenVitals 2.6.5
- OpenVitals 2.6.4
- OpenVitals 2.6.3
- OpenVitals 2.6.2
- OpenVitals 2.6.1
- OpenVitals 2.6.0
- OpenVitals 2.5.0
- OpenVitals 2.4.1
- OpenVitals 2.4.0
- OpenVitals 2.3.2
- OpenVitals 2.3.1
- OpenVitals 2.3.0
- OpenVitals 2.2.8
- OpenVitals 2.2.7
- OpenVitals 2.2.6
- OpenVitals 2.2.5
- OpenVitals 2.2.4
- OpenVitals 2.2.3
- OpenVitals 2.2.2
- OpenVitals 2.2.1
- OpenVitals 2.2.0
- OpenVitals 2.1.0
- OpenVitals 2.0.4
- OpenVitals 2.0.3
- OpenVitals 2.0.2
- OpenVitals 2.0.1
- OpenVitals 1.9.0
- OpenVitals 1.8.0
- OpenVitals 1.7.7
- OpenVitals 1.7.6
- OpenVitals 1.7.5
- OpenVitals 1.7.4
- OpenVitals 1.7.3
- OpenVitals 1.7.2
- OpenVitals 1.7.1
- OpenVitals 1.7.0
- OpenVitals 1.6.3
- OpenVitals 1.6.2
- OpenVitals 1.6.1
- OpenVitals 1.6.0
- OpenVitals 1.5.1
- OpenVitals 1.5.0
Project