diff options
| author | Peter Stone <thepeterstone@gmail.com> | 2026-03-23 04:16:32 +0000 |
|---|---|---|
| committer | Peter Stone <thepeterstone@gmail.com> | 2026-03-23 04:16:32 +0000 |
| commit | 77892d354eda07d98e2dfa5d00fca1ed1f808d8b (patch) | |
| tree | 53c05f944d616eef5cbc3ee667ad6beb18665d23 /android-app/app/src/main/res/layout | |
| parent | f024a6a1cbcb68395fe1a15d4ac852c2be2416e6 (diff) | |
feat: refactor UI to BottomNavigationView with Safety and Doc fragments
Replace FAB-based navigation with a 4-tab BottomNavigationView (Map,
Instruments, Log, Safety). Instruments use a collapsible bottom sheet;
Log and Safety display as full-screen overlay fragments.
- Add SafetyFragment with MOB and Anchor Watch controls
- Add DocFragment for in-app markdown help (Markwon: core, tables, images)
- Add layout_instruments_sheet with 3x3 instrument grid and PolarDiagramView
- Add fragment_safety and fragment_doc layouts
- Add vector drawables: ic_map, ic_instruments, ic_log, ic_safety, ic_close
- Update activity_main.xml to CoordinatorLayout with bottom sheet + overlay
- Fix: set isHideable=true before STATE_HIDDEN to avoid silent no-op from
behavior_hideable=false default; restore false on Map/Instruments tabs
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Diffstat (limited to 'android-app/app/src/main/res/layout')
4 files changed, 347 insertions, 512 deletions
diff --git a/android-app/app/src/main/res/layout/activity_main.xml b/android-app/app/src/main/res/layout/activity_main.xml index 54ad0cd..c841fc3 100644 --- a/android-app/app/src/main/res/layout/activity_main.xml +++ b/android-app/app/src/main/res/layout/activity_main.xml @@ -1,330 +1,57 @@ <?xml version="1.0" encoding="utf-8"?> -<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" +<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> - <org.maplibre.android.maps.MapView - android:id="@+id/mapView" - android:layout_width="match_parent" - android:layout_height="match_parent" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="parent" /> - - <!-- Instrument Display Container --> + <!-- Main Content Area --> <androidx.constraintlayout.widget.ConstraintLayout - android:id="@+id/instrument_display_container" android:layout_width="match_parent" android:layout_height="match_parent" - android:background="@color/instrument_background" - android:visibility="gone" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="parent"> - - <!-- Guidelines for a 3x2 grid-like layout (6 sections) --> - <androidx.constraintlayout.widget.Guideline - android:id="@+id/guideline_vertical_33" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:orientation="vertical" - app:layout_constraintGuide_percent="0.33" /> - <androidx.constraintlayout.widget.Guideline - android:id="@+id/guideline_vertical_66" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:orientation="vertical" - app:layout_constraintGuide_percent="0.66" /> - <androidx.constraintlayout.widget.Guideline - android:id="@+id/guideline_horizontal_50" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:orientation="horizontal" - app:layout_constraintGuide_percent="0.5" /> - - <!-- Wind Instrument --> - <TextView - android:id="@+id/label_wind" - style="@style/InstrumentLabel" - android:text="@string/instrument_label_wind" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="parent" - app:layout_constraintEnd_toStartOf="@+id/guideline_vertical_33" - app:layout_constraintHorizontal_bias="0.5" /> - <TextView - android:id="@+id/value_aws" - style="@style/InstrumentPrimaryValue" - tools:text="--.-" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@+id/label_wind" - app:layout_constraintEnd_toStartOf="@+id/guideline_vertical_33" - app:layout_constraintHorizontal_bias="0.5" /> - <TextView - android:id="@+id/label_aws" - style="@style/InstrumentSecondaryLabel" - android:text="@string/instrument_label_aws" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@+id/value_aws" - app:layout_constraintEnd_toStartOf="@+id/guideline_vertical_33" - app:layout_constraintHorizontal_bias="0.5" /> - <TextView - android:id="@+id/value_tws" - style="@style/InstrumentPrimaryValue" - tools:text="--.-" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@+id/label_aws" - app:layout_constraintEnd_toStartOf="@+id/guideline_vertical_33" - app:layout_constraintHorizontal_bias="0.5" /> - <TextView - android:id="@+id/label_tws" - style="@style/InstrumentSecondaryLabel" - android:text="@string/instrument_label_tws" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@+id/value_tws" - app:layout_constraintEnd_toStartOf="@+id/guideline_vertical_33" - app:layout_constraintHorizontal_bias="0.5" /> - - <!-- Compass Instrument --> - <TextView - android:id="@+id/label_compass" - style="@style/InstrumentLabel" - android:text="@string/instrument_label_compass" - app:layout_constraintStart_toStartOf="@+id/guideline_vertical_33" - app:layout_constraintTop_toTopOf="parent" - app:layout_constraintEnd_toStartOf="@+id/guideline_vertical_66" - app:layout_constraintHorizontal_bias="0.5" /> - <TextView - android:id="@+id/value_hdg" - style="@style/InstrumentPrimaryValue" - tools:text="---" - app:layout_constraintStart_toStartOf="@+id/guideline_vertical_33" - app:layout_constraintTop_toBottomOf="@+id/label_compass" - app:layout_constraintEnd_toStartOf="@+id/guideline_vertical_66" - app:layout_constraintHorizontal_bias="0.5" /> - <TextView - android:id="@+id/label_hdg" - style="@style/InstrumentSecondaryLabel" - android:text="@string/instrument_label_hdg" - app:layout_constraintStart_toStartOf="@+id/guideline_vertical_33" - app:layout_constraintTop_toBottomOf="@+id/value_hdg" - app:layout_constraintEnd_toStartOf="@+id/guideline_vertical_66" - app:layout_constraintHorizontal_bias="0.5" /> - <TextView - android:id="@+id/value_cog" - style="@style/InstrumentPrimaryValue" - tools:text="---" - app:layout_constraintStart_toStartOf="@+id/guideline_vertical_33" - app:layout_constraintTop_toBottomOf="@+id/label_hdg" - app:layout_constraintEnd_toStartOf="@+id/guideline_vertical_66" - app:layout_constraintHorizontal_bias="0.5" /> - <TextView - android:id="@+id/label_cog" - style="@style/InstrumentSecondaryLabel" - android:text="@string/instrument_label_cog" - app:layout_constraintStart_toStartOf="@+id/guideline_vertical_33" - app:layout_constraintTop_toBottomOf="@+id/value_cog" - app:layout_constraintEnd_toStartOf="@+id/guideline_vertical_66" - app:layout_constraintHorizontal_bias="0.5" /> - - <!-- Boat Speed Instrument --> - <TextView - android:id="@+id/label_boatspeed" - style="@style/InstrumentLabel" - android:text="@string/instrument_label_boatspeed" - app:layout_constraintStart_toStartOf="@+id/guideline_vertical_66" - app:layout_constraintTop_toTopOf="parent" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintHorizontal_bias="0.5" /> - <TextView - android:id="@+id/value_bsp" - style="@style/InstrumentPrimaryValue" - tools:text="--.-" - app:layout_constraintStart_toStartOf="@+id/guideline_vertical_66" - app:layout_constraintTop_toBottomOf="@+id/label_boatspeed" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintHorizontal_bias="0.5" /> - <TextView - android:id="@+id/label_bsp" - style="@style/InstrumentSecondaryLabel" - android:text="@string/instrument_label_bsp" - app:layout_constraintStart_toStartOf="@+id/guideline_vertical_66" - app:layout_constraintTop_toBottomOf="@+id/value_bsp" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintHorizontal_bias="0.5" /> - <TextView - android:id="@+id/value_sog" - style="@style/InstrumentPrimaryValue" - tools:text="--.-" - app:layout_constraintStart_toStartOf="@+id/guideline_vertical_66" - app:layout_constraintTop_toBottomOf="@+id/label_bsp" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintHorizontal_bias="0.5" /> - <TextView - android:id="@+id/label_sog" - style="@style/InstrumentSecondaryLabel" - android:text="@string/instrument_label_sog" - app:layout_constraintStart_toStartOf="@+id/guideline_vertical_66" - app:layout_constraintTop_toBottomOf="@+id/value_sog" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintHorizontal_bias="0.5" /> - - <!-- VMG Instrument --> - <TextView - android:id="@+id/label_vmg" - style="@style/InstrumentLabel" - android:text="@string/instrument_label_vmg" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="@+id/guideline_horizontal_50" - app:layout_constraintEnd_toStartOf="@+id/guideline_vertical_33" - app:layout_constraintHorizontal_bias="0.5" /> - <TextView - android:id="@+id/value_vmg" - style="@style/InstrumentPrimaryValue" - tools:text="--.-" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@+id/label_vmg" - app:layout_constraintEnd_toStartOf="@+id/guideline_vertical_33" - app:layout_constraintHorizontal_bias="0.5" /> - - <!-- Depth Instrument --> - <TextView - android:id="@+id/label_depth" - style="@style/InstrumentLabel" - android:text="@string/instrument_label_depth" - app:layout_constraintStart_toStartOf="@+id/guideline_vertical_33" - app:layout_constraintTop_toTopOf="@+id/guideline_horizontal_50" - app:layout_constraintEnd_toStartOf="@+id/guideline_vertical_66" - app:layout_constraintHorizontal_bias="0.5" /> - <TextView - android:id="@+id/value_depth" - style="@style/InstrumentPrimaryValue" - tools:text="--.-" - app:layout_constraintStart_toStartOf="@+id/guideline_vertical_33" - app:layout_constraintTop_toBottomOf="@+id/label_depth" - app:layout_constraintEnd_toStartOf="@+id/guideline_vertical_66" - app:layout_constraintHorizontal_bias="0.5" /> + android:layout_marginBottom="56dp"> <!-- Space for BottomNav --> - <!-- Polar % Instrument --> - <TextView - android:id="@+id/label_polar_pct" - style="@style/InstrumentLabel" - android:text="@string/instrument_label_polar_pct" - app:layout_constraintStart_toStartOf="@+id/guideline_vertical_66" - app:layout_constraintTop_toTopOf="@+id/guideline_horizontal_50" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintHorizontal_bias="0.5" /> - <TextView - android:id="@+id/value_polar_pct" - style="@style/InstrumentPrimaryValue" - android:text="@string/placeholder_polar_value" - app:layout_constraintStart_toStartOf="@+id/guideline_vertical_66" - app:layout_constraintTop_toBottomOf="@+id/label_polar_pct" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintHorizontal_bias="0.5" /> + <org.maplibre.android.maps.MapView + android:id="@+id/mapView" + android:layout_width="match_parent" + android:layout_height="match_parent" /> - <!-- Barometer Instrument --> - <TextView - android:id="@+id/label_barometer" - style="@style/InstrumentLabel" - android:text="@string/instrument_label_barometer" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@+id/value_vmg" - app:layout_constraintEnd_toStartOf="@+id/guideline_vertical_33" - app:layout_constraintHorizontal_bias="0.5" /> - <TextView - android:id="@+id/value_baro" - style="@style/InstrumentPrimaryValue" - tools:text="1013.2" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@+id/label_barometer" - app:layout_constraintEnd_toStartOf="@+id/guideline_vertical_33" - app:layout_constraintHorizontal_bias="0.5" /> - <TextView - android:id="@+id/label_baro_unit" - style="@style/InstrumentSecondaryLabel" - android:text="hPa" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@+id/value_baro" - app:layout_constraintEnd_toStartOf="@+id/guideline_vertical_33" - app:layout_constraintHorizontal_bias="0.5" /> - - <!-- Barometer Trend --> - <TextView - android:id="@+id/label_trend" - style="@style/InstrumentLabel" - android:text="@string/instrument_label_trend" - app:layout_constraintStart_toStartOf="@+id/guideline_vertical_33" - app:layout_constraintTop_toBottomOf="@+id/value_depth" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintHorizontal_bias="0.5" /> - - <org.terst.nav.BarometerTrendView - android:id="@+id/barometer_trend_view" - android:layout_width="0dp" - android:layout_height="0dp" - app:layout_constraintStart_toStartOf="@+id/guideline_vertical_33" - app:layout_constraintTop_toBottomOf="@+id/label_trend" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintBottom_toBottomOf="@+id/label_baro_unit" /> - - <!-- Polar Diagram View --> - <org.terst.nav.PolarDiagramView - android:id="@+id/polar_diagram_view" - android:layout_width="0dp" - android:layout_height="0dp" - android:layout_margin="16dp" - app:layout_constraintDimensionRatio="1:1" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintTop_toBottomOf="@+id/label_baro_unit" - app:layout_constraintBottom_toBottomOf="parent" - /> + <!-- Overlay Fragment Container (for Log, Safety, Help) --> + <FrameLayout + android:id="@+id/fragment_container" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:visibility="gone" + android:background="?attr/colorSurface" /> </androidx.constraintlayout.widget.ConstraintLayout> - <com.google.android.material.floatingactionbutton.FloatingActionButton - android:id="@+id/fab_tidal" - android:layout_width="wrap_content" + <!-- Collapsible Instrument Bottom Sheet --> + <androidx.cardview.widget.CardView + android:id="@+id/instrument_bottom_sheet" + android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_margin="16dp" - android:clickable="true" - android:focusable="true" - android:contentDescription="Toggle Tidal Current Overlay" - app:srcCompat="@android:drawable/ic_menu_directions" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintBottom_toTopOf="@+id/fab_toggle_instruments" /> + app:behavior_hideable="false" + app:behavior_peekHeight="120dp" + app:cardElevation="16dp" + app:cardCornerRadius="24dp" + app:layout_behavior="com.google.android.material.bottomsheet.BottomSheetBehavior"> - <com.google.android.material.floatingactionbutton.FloatingActionButton - android:id="@+id/fab_toggle_instruments" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_margin="16dp" - android:clickable="true" - android:focusable="true" - android:contentDescription="Toggle Instrument Display" - app:srcCompat="@android:drawable/ic_menu_rotate" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintBottom_toBottomOf="parent" /> + <include layout="@layout/layout_instruments_sheet" /> - <!-- Anchor FAB --> - <com.google.android.material.floatingactionbutton.FloatingActionButton - android:id="@+id/fab_anchor" - android:layout_width="wrap_content" + </androidx.cardview.widget.CardView> + + <!-- Bottom Navigation --> + <com.google.android.material.bottomnavigation.BottomNavigationView + android:id="@+id/bottom_navigation" + android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_margin="16dp" - android:clickable="true" - android:focusable="true" - android:contentDescription="@string/fab_anchor_content_description" - app:srcCompat="@android:drawable/ic_menu_myplaces" - app:backgroundTint="@color/anchor_button_background" - app:layout_constraintBottom_toTopOf="@+id/fab_mob" - app:layout_constraintStart_toStartOf="parent" /> + android:layout_gravity="bottom" + android:background="?attr/colorSurface" + app:menu="@menu/bottom_nav_menu" /> + <!-- Persistent MOB Button (Crucial for safety, always on top) --> <com.google.android.material.floatingactionbutton.FloatingActionButton android:id="@+id/fab_mob" android:layout_width="wrap_content" @@ -332,211 +59,10 @@ android:layout_margin="16dp" android:clickable="true" android:focusable="true" - android:contentDescription="@string/fab_mob_content_description" + android:contentDescription="Man Overboard" app:srcCompat="@android:drawable/ic_dialog_alert" app:backgroundTint="@color/mob_button_background" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintBottom_toBottomOf="parent" /> - - <!-- Anchor Configuration Container --> - <androidx.constraintlayout.widget.ConstraintLayout - android:id="@+id/anchor_config_container" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:background="#DD212121" - android:padding="16dp" - android:visibility="gone" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toStartOf="parent"> - - <TextView - android:id="@+id/anchor_title" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:text="@string/anchor_config_title" - android:textColor="@android:color/white" - android:textSize="20sp" - android:textStyle="bold" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="parent" /> - - <TextView - android:id="@+id/anchor_status_text" - android:layout_width="0dp" - android:layout_height="wrap_content" - android:layout_marginTop="8dp" - android:textColor="@android:color/white" - android:textSize="16sp" - tools:text="Anchor Inactive" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@+id/anchor_title" /> - - <LinearLayout - android:id="@+id/radius_control_layout" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:orientation="horizontal" - android:layout_marginTop="16dp" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@+id/anchor_status_text"> - - <Button - android:id="@+id/button_decrease_radius" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:text="-" - android:textSize="20sp" - android:minWidth="48dp" - android:layout_marginEnd="8dp" /> - - <TextView - android:id="@+id/anchor_radius_text" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:textColor="@android:color/white" - android:textSize="18sp" - android:textStyle="bold" - tools:text="Radius: 50.0m" - android:gravity="center_vertical" /> - - <Button - android:id="@+id/button_increase_radius" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:text="+" - android:textSize="20sp" - android:minWidth="48dp" - android:layout_marginStart="8dp" /> - - </LinearLayout> - - <Button - android:id="@+id/button_set_anchor" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_marginTop="16dp" - android:text="@string/button_set_anchor" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@+id/radius_control_layout" /> - - <Button - android:id="@+id/button_stop_anchor" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_marginTop="16dp" - android:text="@string/button_stop_anchor" - android:backgroundTint="@android:color/holo_red_dark" - app:layout_constraintStart_toEndOf="@+id/button_set_anchor" - app:layout_constraintTop_toBottomOf="@+id/radius_control_layout" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintHorizontal_bias="0.5" /> - - </androidx.constraintlayout.widget.ConstraintLayout> - - <!-- MOB Navigation Display Container --> - <androidx.constraintlayout.widget.ConstraintLayout - android:id="@+id/mob_navigation_container" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:background="@color/instrument_background" - android:visibility="gone" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="parent"> - - <TextView - android:id="@+id/mob_label_distance" - style="@style/InstrumentLabel" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:text="@string/mob_label_distance" - app:layout_constraintBottom_toTopOf="@+id/mob_value_distance" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintVertical_chainStyle="packed" - app:layout_constraintTop_toTopOf="parent" /> - - <TextView - android:id="@+id/mob_value_distance" - style="@style/InstrumentPrimaryValue" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - tools:text="125 m" - android:textSize="80sp" - app:layout_constraintBottom_toTopOf="@+id/mob_label_elapsed_time" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@+id/mob_label_distance" /> - - <TextView - android:id="@+id/mob_label_elapsed_time" - style="@style/InstrumentLabel" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_marginTop="32dp" - android:text="@string/mob_label_elapsed_time" - app:layout_constraintBottom_toTopOf="@+id/mob_value_elapsed_time" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@+id/mob_value_distance" /> - - <TextView - android:id="@+id/mob_value_elapsed_time" - style="@style/InstrumentPrimaryValue" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - tools:text="00:01:23" - android:textSize="60sp" - app:layout_constraintBottom_toTopOf="@+id/mob_recovered_button" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@+id/mob_label_elapsed_time" /> - - <Button - android:id="@+id/mob_recovered_button" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_marginTop="64dp" - android:text="@string/mob_button_recovered" - android:paddingStart="32dp" - android:paddingEnd="32dp" - android:paddingTop="16dp" - android:paddingBottom="16dp" - android:textSize="24sp" - android:backgroundTint="@color/mob_button_background" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@+id/mob_value_elapsed_time" /> - - </androidx.constraintlayout.widget.ConstraintLayout> - - <!-- Voice Log FAB --> - <com.google.android.material.floatingactionbutton.FloatingActionButton - android:id="@+id/fab_voice_log" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_margin="16dp" - android:clickable="true" - android:focusable="true" - android:contentDescription="Open Voice Log" - android:src="@android:drawable/ic_btn_speak_now" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintBottom_toTopOf="@+id/fab_tidal" /> - - <!-- Voice Log Fragment Container --> - <FrameLayout - android:id="@+id/voice_log_container" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:background="@android:color/white" - android:visibility="gone" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="parent" /> + app:layout_anchor="@id/bottom_navigation" + app:layout_anchorGravity="top|start" /> -</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file +</androidx.coordinatorlayout.widget.CoordinatorLayout> diff --git a/android-app/app/src/main/res/layout/fragment_doc.xml b/android-app/app/src/main/res/layout/fragment_doc.xml new file mode 100644 index 0000000..c5ecb4f --- /dev/null +++ b/android-app/app/src/main/res/layout/fragment_doc.xml @@ -0,0 +1,36 @@ +<?xml version="1.0" encoding="utf-8"?> +<androidx.coordinatorlayout.widget.CoordinatorLayout 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"> + + <com.google.android.material.appbar.AppBarLayout + android:layout_width="match_parent" + android:layout_height="wrap_content"> + + <com.google.android.material.appbar.MaterialToolbar + android:id="@+id/toolbar" + android:layout_width="match_parent" + android:layout_height="?attr/actionBarSize" + app:title="Help" /> + + </com.google.android.material.appbar.AppBarLayout> + + <androidx.core.widget.NestedScrollView + android:layout_width="match_parent" + android:layout_height="match_parent" + app:layout_behavior="@string/appbar_scrolling_view_behavior"> + + <TextView + android:id="@+id/doc_text" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:padding="24dp" + android:textColor="?attr/colorOnSurface" + android:textSize="16sp" + android:lineSpacingExtra="4dp" /> + + </androidx.core.widget.NestedScrollView> + +</androidx.coordinatorlayout.widget.CoordinatorLayout> diff --git a/android-app/app/src/main/res/layout/fragment_safety.xml b/android-app/app/src/main/res/layout/fragment_safety.xml new file mode 100644 index 0000000..5b2397e --- /dev/null +++ b/android-app/app/src/main/res/layout/fragment_safety.xml @@ -0,0 +1,107 @@ +<?xml version="1.0" encoding="utf-8"?> +<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:padding="24dp" + android:background="?attr/colorSurface"> + + <TextView + android:id="@+id/safety_title" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="Safety Dashboard" + android:textSize="24sp" + android:textStyle="bold" + android:textColor="?attr/colorOnSurface" + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintStart_toStartOf="parent" /> + + <com.google.android.material.button.MaterialButton + android:id="@+id/button_help_safety" + style="@style/Widget.Material3.Button.TextButton" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="HELP" + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintEnd_toEndOf="parent" /> + + <!-- MOB Section --> + <com.google.android.material.card.MaterialCardView + android:id="@+id/card_mob" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginTop="24dp" + app:cardCornerRadius="16dp" + app:layout_constraintTop_toBottomOf="@id/safety_title"> + + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="vertical" + android:padding="16dp" + android:gravity="center"> + + <TextView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="MAN OVERBOARD" + android:textColor="@color/md_theme_error" + android:textStyle="bold" /> + + <com.google.android.material.button.MaterialButton + android:id="@+id/button_mob_activate" + android:layout_width="match_parent" + android:layout_height="80dp" + android:layout_marginTop="16dp" + android:text="ACTIVATE MOB" + android:textSize="20sp" + app:backgroundTint="@color/md_theme_error" /> + + </LinearLayout> + + </com.google.android.material.card.MaterialCardView> + + <!-- Anchor Section --> + <com.google.android.material.card.MaterialCardView + android:id="@+id/card_anchor" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginTop="16dp" + app:cardCornerRadius="16dp" + app:layout_constraintTop_toBottomOf="@id/card_mob"> + + <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="ANCHOR WATCH" + android:textStyle="bold" /> + + <TextView + android:id="@+id/anchor_status_summary" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginTop="8dp" + android:text="Status: Inactive" + android:textColor="?attr/colorOnSurfaceVariant" /> + + <com.google.android.material.button.MaterialButton + android:id="@+id/button_anchor_config" + style="@style/Widget.Material3.Button.TonalButton" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginTop="16dp" + android:text="CONFIGURE ANCHOR WATCH" /> + + </LinearLayout> + + </com.google.android.material.card.MaterialCardView> + +</androidx.constraintlayout.widget.ConstraintLayout> diff --git a/android-app/app/src/main/res/layout/layout_instruments_sheet.xml b/android-app/app/src/main/res/layout/layout_instruments_sheet.xml new file mode 100644 index 0000000..0a84418 --- /dev/null +++ b/android-app/app/src/main/res/layout/layout_instruments_sheet.xml @@ -0,0 +1,166 @@ +<?xml version="1.0" encoding="utf-8"?> +<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:padding="16dp" + android:background="?attr/colorSurface"> + + <View + android:id="@+id/drag_handle" + android:layout_width="40dp" + android:layout_height="4dp" + android:background="@color/md_theme_outline" + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintEnd_toEndOf="parent" /> + + <!-- Grid of Instruments --> + <androidx.gridlayout.widget.GridLayout + android:id="@+id/instrument_grid" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginTop="16dp" + app:columnCount="3" + app:rowCount="3" + app:layout_constraintTop_toBottomOf="@id/drag_handle"> + + <!-- Wind: AWS --> + <LinearLayout + android:layout_width="0dp" + android:layout_height="wrap_content" + app:layout_columnWeight="1" + android:orientation="vertical" + android:gravity="center" + android:padding="8dp"> + <TextView style="@style/InstrumentLabel" android:text="AWS" /> + <TextView android:id="@+id/value_aws" style="@style/InstrumentPrimaryValue" tools:text="12.5" /> + </LinearLayout> + + <!-- Compass: HDG --> + <LinearLayout + android:layout_width="0dp" + android:layout_height="wrap_content" + app:layout_columnWeight="1" + android:orientation="vertical" + android:gravity="center" + android:padding="8dp"> + <TextView style="@style/InstrumentLabel" android:text="HDG" /> + <TextView android:id="@+id/value_hdg" style="@style/InstrumentPrimaryValue" tools:text="225" /> + </LinearLayout> + + <!-- Performance: BSP --> + <LinearLayout + android:layout_width="0dp" + android:layout_height="wrap_content" + app:layout_columnWeight="1" + android:orientation="vertical" + android:gravity="center" + android:padding="8dp"> + <TextView style="@style/InstrumentLabel" android:text="BSP" /> + <TextView android:id="@+id/value_bsp" style="@style/InstrumentPrimaryValue" tools:text="6.2" /> + </LinearLayout> + + <!-- Wind: TWS --> + <LinearLayout + android:layout_width="0dp" + android:layout_height="wrap_content" + app:layout_columnWeight="1" + android:orientation="vertical" + android:gravity="center" + android:padding="8dp"> + <TextView style="@style/InstrumentLabel" android:text="TWS" /> + <TextView android:id="@+id/value_tws" style="@style/InstrumentPrimaryValue" tools:text="15.0" /> + </LinearLayout> + + <!-- Compass: COG --> + <LinearLayout + android:layout_width="0dp" + android:layout_height="wrap_content" + app:layout_columnWeight="1" + android:orientation="vertical" + android:gravity="center" + android:padding="8dp"> + <TextView style="@style/InstrumentLabel" android:text="COG" /> + <TextView android:id="@+id/value_cog" style="@style/InstrumentPrimaryValue" tools:text="230" /> + </LinearLayout> + + <!-- Performance: SOG --> + <LinearLayout + android:layout_width="0dp" + android:layout_height="wrap_content" + app:layout_columnWeight="1" + android:orientation="vertical" + android:gravity="center" + android:padding="8dp"> + <TextView style="@style/InstrumentLabel" android:text="SOG" /> + <TextView android:id="@+id/value_sog" style="@style/InstrumentPrimaryValue" tools:text="6.5" /> + </LinearLayout> + + <!-- VMG --> + <LinearLayout + android:layout_width="0dp" + android:layout_height="wrap_content" + app:layout_columnWeight="1" + android:orientation="vertical" + android:gravity="center" + android:padding="8dp"> + <TextView style="@style/InstrumentLabel" android:text="VMG" /> + <TextView android:id="@+id/value_vmg" style="@style/InstrumentPrimaryValue" tools:text="4.2" /> + </LinearLayout> + + <!-- Depth --> + <LinearLayout + android:layout_width="0dp" + android:layout_height="wrap_content" + app:layout_columnWeight="1" + android:orientation="vertical" + android:gravity="center" + android:padding="8dp"> + <TextView style="@style/InstrumentLabel" android:text="Depth" /> + <TextView android:id="@+id/value_depth" style="@style/InstrumentPrimaryValue" tools:text="12.0" /> + </LinearLayout> + + <!-- Polar % --> + <LinearLayout + android:layout_width="0dp" + android:layout_height="wrap_content" + app:layout_columnWeight="1" + android:orientation="vertical" + android:gravity="center" + android:padding="8dp"> + <TextView style="@style/InstrumentLabel" android:text="Polar %" /> + <TextView android:id="@+id/value_polar_pct" style="@style/InstrumentPrimaryValue" tools:text="95%" /> + </LinearLayout> + + </androidx.gridlayout.widget.GridLayout> + + <!-- Additional Detail (Visible when expanded) --> + <TextView + android:id="@+id/label_baro" + style="@style/InstrumentLabel" + android:text="Barometer" + android:layout_marginTop="24dp" + app:layout_constraintTop_toBottomOf="@id/instrument_grid" + app:layout_constraintStart_toStartOf="parent" /> + + <TextView + android:id="@+id/value_baro" + style="@style/InstrumentPrimaryValue" + tools:text="1013.2 hPa" + app:layout_constraintTop_toBottomOf="@id/label_baro" + app:layout_constraintStart_toStartOf="parent" /> + + <org.terst.nav.PolarDiagramView + android:id="@+id/polar_diagram_view" + android:layout_width="0dp" + android:layout_height="0dp" + android:layout_marginTop="24dp" + app:layout_constraintDimensionRatio="1:1" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintTop_toBottomOf="@id/value_baro" + app:layout_constraintBottom_toBottomOf="parent" /> + +</androidx.constraintlayout.widget.ConstraintLayout> |
