diff options
| author | Claude <noreply@anthropic.com> | 2026-04-10 21:08:13 +0000 |
|---|---|---|
| committer | Claude <noreply@anthropic.com> | 2026-04-10 21:08:13 +0000 |
| commit | 11226211d9bbfd9ec255d9a957531faaa9ace1ee (patch) | |
| tree | 5d749a8b2161e5440c1d8c0bae2e356f33d15a01 /android-app/app/src/main/res | |
| parent | bf57713ef0e378ebedd518f4fb243328de08179d (diff) | |
Add boat profiles and overhaul pre-trip departure briefing
- BoatProfileRepository: Moshi+SharedPrefs persistence, pre-seeds
Erickson 23 (155%/100%/65% headsails, 2 reefs) and Cal 20 (1 reef)
- PreTripModels: expand with SailConfig, ConditionSlice, RouteProjection,
WatchItem, SimilarTripSummary; full BoatProfile with sail inventory
- PreTripReportGenerator: full rewrite — 4-hour conditions window,
Honokohau candidate-heading route projection with TWA scoring and
current-component calc, boat-specific sail plan from inventory,
hazard watchlist, similar-trip comparison via past GPX tracks
- PreTripReportViewModel: inject BoatProfileRepository, fix GPS to
LocationService.bestPosition (Honokohau fallback), pass full
forecastItems list and pastTracks to generator
- PreTripReportFragment: boat selector ChipGroup, auto-generate on open,
render all sections (conditions table, route, sail plan, watchlist,
similar trips)
- fragment_pretrip_report.xml: redesign with all report cards
- item_condition_column.xml: new layout for conditions-window columns
- NavApplication: instantiate BoatProfileRepository as app singleton
https://claude.ai/code/session_01HXPjBsogsJVRwCiekDGkJX
Diffstat (limited to 'android-app/app/src/main/res')
| -rw-r--r-- | android-app/app/src/main/res/layout/fragment_pretrip_report.xml | 246 | ||||
| -rw-r--r-- | android-app/app/src/main/res/layout/item_condition_column.xml | 44 |
2 files changed, 231 insertions, 59 deletions
diff --git a/android-app/app/src/main/res/layout/fragment_pretrip_report.xml b/android-app/app/src/main/res/layout/fragment_pretrip_report.xml index d7ede49..5f3fb67 100644 --- a/android-app/app/src/main/res/layout/fragment_pretrip_report.xml +++ b/android-app/app/src/main/res/layout/fragment_pretrip_report.xml @@ -1,32 +1,32 @@ <?xml version="1.0" encoding="utf-8"?> -<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" +<ScrollView + xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" - android:background="?attr/colorSurface"> + android:background="?attr/colorBackground"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" - android:padding="24dp"> + android:padding="16dp"> + <!-- ── Title ──────────────────────────────────────────────── --> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" - android:text="Pre-Trip Planning" - android:textSize="24sp" - android:textStyle="bold" + android:text="Departure Briefing" + android:textAppearance="?attr/textAppearanceHeadlineSmall" android:layout_marginBottom="16dp" /> - <!-- Boat Config (Simple for now) --> + <!-- ── Boat selector ──────────────────────────────────────── --> <com.google.android.material.card.MaterialCardView android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginBottom="24dp" - app:cardCornerRadius="12dp" - app:strokeWidth="1dp" - app:strokeColor="?attr/colorOutlineVariant"> + android:layout_marginBottom="12dp" + app:cardElevation="2dp" + app:cardCornerRadius="12dp"> <LinearLayout android:layout_width="match_parent" @@ -37,108 +37,236 @@ <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" - android:text="Vessel Profile" - android:textStyle="bold" + android:text="VESSEL" + android:textSize="11sp" + android:textAllCaps="true" + android:letterSpacing="0.12" + android:textColor="?attr/colorOnSurfaceVariant" android:layout_marginBottom="8dp" /> + <com.google.android.material.chip.ChipGroup + android:id="@+id/chip_group_boats" + android:layout_width="match_parent" + android:layout_height="wrap_content" + app:singleSelection="true" + app:selectionRequired="true" /> + + </LinearLayout> + </com.google.android.material.card.MaterialCardView> + + <!-- ── Generate button + progress ─────────────────────────── --> + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="horizontal" + android:gravity="center_vertical" + android:layout_marginBottom="16dp"> + + <com.google.android.material.button.MaterialButton + android:id="@+id/btn_generate_pretrip" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_weight="1" + android:text="Refresh Briefing" /> + + <ProgressBar + android:id="@+id/progress_pretrip" + android:layout_width="32dp" + android:layout_height="32dp" + android:layout_marginStart="12dp" + android:visibility="gone" /> + </LinearLayout> + + <!-- ── Conditions window ───────────────────────────────────── --> + <com.google.android.material.card.MaterialCardView + android:id="@+id/card_conditions" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginBottom="12dp" + android:visibility="gone" + app:cardElevation="2dp" + app:cardCornerRadius="12dp"> + + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="vertical" + android:padding="16dp"> + <TextView - android:id="@+id/tv_vessel_info" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:text="35ft Sloop (Monohull)" - android:textSize="14sp" /> + android:text="CONDITIONS WINDOW" + android:textSize="11sp" + android:textAllCaps="true" + android:letterSpacing="0.12" + android:textColor="?attr/colorOnSurfaceVariant" + android:layout_marginBottom="12dp" /> + + <!-- 4-column table built programmatically --> + <LinearLayout + android:id="@+id/conditions_table" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="horizontal" /> </LinearLayout> </com.google.android.material.card.MaterialCardView> - <!-- Report Content --> + <!-- ── Route projection ────────────────────────────────────── --> <com.google.android.material.card.MaterialCardView - android:id="@+id/card_report" + android:id="@+id/card_route" android:layout_width="match_parent" android:layout_height="wrap_content" + android:layout_marginBottom="12dp" android:visibility="gone" - app:cardCornerRadius="16dp" - app:cardElevation="4dp"> + app:cardElevation="2dp" + app:cardCornerRadius="12dp"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" - android:padding="20dp"> + android:padding="16dp"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" - android:text="Weather Summary" - android:textStyle="bold" - android:textSize="18sp" + android:text="ROUTE PROJECTION" + android:textSize="11sp" + android:textAllCaps="true" + android:letterSpacing="0.12" + android:textColor="?attr/colorOnSurfaceVariant" android:layout_marginBottom="8dp" /> <TextView - android:id="@+id/tv_weather_summary" + android:id="@+id/tv_route" android:layout_width="match_parent" android:layout_height="wrap_content" - android:textSize="16sp" - android:layout_marginBottom="16dp" /> + android:textAppearance="?attr/textAppearanceBodyMedium" + android:lineSpacingMultiplier="1.3" /> - <View - android:layout_width="match_parent" - android:layout_height="1dp" - android:background="?attr/colorOutlineVariant" - android:layout_marginBottom="16dp" /> + </LinearLayout> + </com.google.android.material.card.MaterialCardView> + + <!-- ── Sail plan ───────────────────────────────────────────── --> + <com.google.android.material.card.MaterialCardView + android:id="@+id/card_sail_plan" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginBottom="12dp" + android:visibility="gone" + app:cardElevation="2dp" + app:cardCornerRadius="12dp"> + + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="vertical" + android:padding="16dp"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" - android:text="Routing Suggestion" - android:textStyle="bold" - android:textSize="18sp" + android:text="SAIL PLAN" + android:textSize="11sp" + android:textAllCaps="true" + android:letterSpacing="0.12" + android:textColor="?attr/colorOnSurfaceVariant" android:layout_marginBottom="8dp" /> <TextView - android:id="@+id/tv_routing_content" + android:id="@+id/tv_sail_plan" android:layout_width="match_parent" android:layout_height="wrap_content" - android:textSize="16sp" - android:layout_marginBottom="16dp" /> + android:textAppearance="?attr/textAppearanceBodyMedium" + android:lineSpacingMultiplier="1.4" /> - <View - android:layout_width="match_parent" - android:layout_height="1dp" - android:background="?attr/colorOutlineVariant" - android:layout_marginBottom="16dp" /> + </LinearLayout> + </com.google.android.material.card.MaterialCardView> + + <!-- ── Watch list ──────────────────────────────────────────── --> + <com.google.android.material.card.MaterialCardView + android:id="@+id/card_watchlist" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginBottom="12dp" + android:visibility="gone" + app:cardElevation="2dp" + app:cardCornerRadius="12dp" + app:strokeColor="?attr/colorError" + app:strokeWidth="1dp"> + + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="vertical" + android:padding="16dp"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" - android:text="Sail Plan" - android:textStyle="bold" - android:textSize="18sp" + android:text="WATCH FOR" + android:textSize="11sp" + android:textAllCaps="true" + android:letterSpacing="0.12" + android:textColor="?attr/colorOnSurfaceVariant" android:layout_marginBottom="8dp" /> <TextView - android:id="@+id/tv_sail_plan_content" + android:id="@+id/tv_watchlist" android:layout_width="match_parent" android:layout_height="wrap_content" - android:textSize="16sp" /> + android:textAppearance="?attr/textAppearanceBodyMedium" + android:lineSpacingMultiplier="1.5" /> </LinearLayout> </com.google.android.material.card.MaterialCardView> - <com.google.android.material.button.MaterialButton - android:id="@+id/btn_generate_pretrip" + <!-- ── Similar trips ───────────────────────────────────────── --> + <com.google.android.material.card.MaterialCardView + android:id="@+id/card_similar" android:layout_width="match_parent" - android:layout_height="60dp" - android:layout_marginTop="24dp" - android:text="GENERATE PRE-TRIP REPORT" /> + android:layout_height="wrap_content" + android:layout_marginBottom="12dp" + android:visibility="gone" + app:cardElevation="2dp" + app:cardCornerRadius="12dp"> - <ProgressBar - android:id="@+id/progress_pretrip" - android:layout_width="wrap_content" + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="vertical" + android:padding="16dp"> + + <TextView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="SIMILAR TRIPS" + android:textSize="11sp" + android:textAllCaps="true" + android:letterSpacing="0.12" + android:textColor="?attr/colorOnSurfaceVariant" + android:layout_marginBottom="8dp" /> + + <TextView + android:id="@+id/tv_similar" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:textAppearance="?attr/textAppearanceBodyMedium" + android:lineSpacingMultiplier="1.3" /> + + </LinearLayout> + </com.google.android.material.card.MaterialCardView> + + <!-- ── Error state ─────────────────────────────────────────── --> + <TextView + android:id="@+id/tv_error" + android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_gravity="center" - android:layout_marginTop="16dp" - android:visibility="gone" /> + android:visibility="gone" + android:textColor="?attr/colorError" + android:textAppearance="?attr/textAppearanceBodyMedium" /> </LinearLayout> </ScrollView> diff --git a/android-app/app/src/main/res/layout/item_condition_column.xml b/android-app/app/src/main/res/layout/item_condition_column.xml new file mode 100644 index 0000000..1ffcd55 --- /dev/null +++ b/android-app/app/src/main/res/layout/item_condition_column.xml @@ -0,0 +1,44 @@ +<?xml version="1.0" encoding="utf-8"?> +<LinearLayout + xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_weight="1" + android:orientation="vertical" + android:gravity="center_horizontal" + android:padding="4dp"> + + <TextView + android:id="@+id/col_label" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:textSize="10sp" + android:textAllCaps="true" + android:letterSpacing="0.08" + android:textColor="?attr/colorOnSurfaceVariant" + android:layout_marginBottom="4dp" /> + + <TextView + android:id="@+id/col_wind" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:textAppearance="?attr/textAppearanceTitleMedium" + android:layout_marginBottom="2dp" /> + + <TextView + android:id="@+id/col_wind_dir" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:textAppearance="?attr/textAppearanceBodySmall" + android:textColor="?attr/colorOnSurfaceVariant" + android:layout_marginBottom="4dp" /> + + <TextView + android:id="@+id/col_sky" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:textSize="10sp" + android:textColor="?attr/colorOnSurfaceVariant" + android:gravity="center" /> + +</LinearLayout> |
