summaryrefslogtreecommitdiff
path: root/android-app/app/src/main/res
diff options
context:
space:
mode:
Diffstat (limited to 'android-app/app/src/main/res')
-rw-r--r--android-app/app/src/main/res/drawable/ic_anchor.xml9
-rw-r--r--android-app/app/src/main/res/drawable/ic_tidal_arrow.xml9
-rw-r--r--android-app/app/src/main/res/layout/activity_main.xml546
-rw-r--r--android-app/app/src/main/res/layout/activity_weather.xml20
-rw-r--r--android-app/app/src/main/res/layout/fragment_voice_log.xml66
-rw-r--r--android-app/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml5
-rw-r--r--android-app/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml5
-rw-r--r--android-app/app/src/main/res/raw/mob_alarm.mp31
-rwxr-xr-x[-rw-r--r--]android-app/app/src/main/res/values/colors.xml29
-rwxr-xr-xandroid-app/app/src/main/res/values/dimens.xml9
-rwxr-xr-x[-rw-r--r--]android-app/app/src/main/res/values/strings.xml50
-rwxr-xr-x[-rw-r--r--]android-app/app/src/main/res/values/themes.xml57
12 files changed, 791 insertions, 15 deletions
diff --git a/android-app/app/src/main/res/drawable/ic_anchor.xml b/android-app/app/src/main/res/drawable/ic_anchor.xml
new file mode 100644
index 0000000..2389c93
--- /dev/null
+++ b/android-app/app/src/main/res/drawable/ic_anchor.xml
@@ -0,0 +1,9 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24"
+ android:viewportHeight="24">
+ <path
+ android:fillColor="#FF000000"
+ android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM12,14c-1.1,0 -2,-0.9 -2,-2s0.9,-2 2,-2 2,0.9 2,2S13.1,14 12,14z" />
+</vector>
diff --git a/android-app/app/src/main/res/drawable/ic_tidal_arrow.xml b/android-app/app/src/main/res/drawable/ic_tidal_arrow.xml
new file mode 100644
index 0000000..973b3ea
--- /dev/null
+++ b/android-app/app/src/main/res/drawable/ic_tidal_arrow.xml
@@ -0,0 +1,9 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24"
+ android:viewportHeight="24">
+ <path
+ android:fillColor="#0000FF"
+ android:pathData="M12,2L4.5,20.29L5.21,21L12,18L18.79,21L19.5,20.29L12,2Z" />
+</vector>
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 757dbdb..54ad0cd 100644
--- a/android-app/app/src/main/res/layout/activity_main.xml
+++ b/android-app/app/src/main/res/layout/activity_main.xml
@@ -1,22 +1,542 @@
<?xml version="1.0" encoding="utf-8"?>
-<androidx.coordinatorlayout.widget.CoordinatorLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
+<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:layout_height="match_parent"
+ tools:context=".MainActivity">
- <androidx.fragment.app.FragmentContainerView
- android:id="@+id/fragment_container"
+ <org.maplibre.android.maps.MapView
+ android:id="@+id/mapView"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:layout_marginBottom="56dp" />
+ app:layout_constraintBottom_toBottomOf="parent"
+ app:layout_constraintEnd_toEndOf="parent"
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintTop_toTopOf="parent" />
- <com.google.android.material.bottomnavigation.BottomNavigationView
- android:id="@+id/bottom_nav"
+ <!-- Instrument Display Container -->
+ <androidx.constraintlayout.widget.ConstraintLayout
+ android:id="@+id/instrument_display_container"
android:layout_width="match_parent"
- android:layout_height="56dp"
- android:layout_gravity="bottom"
- android:background="?attr/colorSurface"
- app:menu="@menu/bottom_nav_menu" />
+ 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" />
+
+ <!-- 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" />
+
+ <!-- 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"
+ />
+
+ </androidx.constraintlayout.widget.ConstraintLayout>
+
+ <com.google.android.material.floatingactionbutton.FloatingActionButton
+ android:id="@+id/fab_tidal"
+ android:layout_width="wrap_content"
+ 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" />
+
+ <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" />
+
+ <!-- Anchor FAB -->
+ <com.google.android.material.floatingactionbutton.FloatingActionButton
+ android:id="@+id/fab_anchor"
+ android:layout_width="wrap_content"
+ 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" />
+
+ <com.google.android.material.floatingactionbutton.FloatingActionButton
+ android:id="@+id/fab_mob"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_margin="16dp"
+ android:clickable="true"
+ android:focusable="true"
+ android:contentDescription="@string/fab_mob_content_description"
+ 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" />
-</androidx.coordinatorlayout.widget.CoordinatorLayout>
+</androidx.constraintlayout.widget.ConstraintLayout> \ No newline at end of file
diff --git a/android-app/app/src/main/res/layout/activity_weather.xml b/android-app/app/src/main/res/layout/activity_weather.xml
new file mode 100644
index 0000000..36ea871
--- /dev/null
+++ b/android-app/app/src/main/res/layout/activity_weather.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="vertical">
+
+ <FrameLayout
+ android:id="@+id/fragment_container"
+ android:layout_width="match_parent"
+ android:layout_height="0dp"
+ android:layout_weight="1" />
+
+ <com.google.android.material.bottomnavigation.BottomNavigationView
+ android:id="@+id/bottom_nav"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ app:menu="@menu/bottom_nav_menu"
+ xmlns:app="http://schemas.android.com/apk/res-auto" />
+
+</LinearLayout>
diff --git a/android-app/app/src/main/res/layout/fragment_voice_log.xml b/android-app/app/src/main/res/layout/fragment_voice_log.xml
new file mode 100644
index 0000000..e5f864c
--- /dev/null
+++ b/android-app/app/src/main/res/layout/fragment_voice_log.xml
@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="vertical"
+ android:gravity="center"
+ android:padding="24dp">
+
+ <TextView
+ android:id="@+id/tv_status"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="Tap microphone to log"
+ android:textSize="18sp"
+ android:textAlignment="center"
+ android:layout_marginBottom="16dp" />
+
+ <TextView
+ android:id="@+id/tv_recognized"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text=""
+ android:textSize="16sp"
+ android:textAlignment="center"
+ android:padding="12dp"
+ android:minHeight="80dp"
+ android:background="#F5F5F5"
+ android:layout_marginBottom="24dp" />
+
+ <com.google.android.material.floatingactionbutton.FloatingActionButton
+ android:id="@+id/fab_mic"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:contentDescription="Start voice recognition"
+ android:src="@android:drawable/ic_btn_speak_now"
+ android:layout_marginBottom="16dp" />
+
+ <LinearLayout
+ android:id="@+id/ll_confirm_buttons"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal"
+ android:visibility="gone">
+
+ <Button
+ android:id="@+id/btn_save"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="Save"
+ android:layout_marginEnd="8dp" />
+
+ <Button
+ android:id="@+id/btn_retry"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="Retry" />
+ </LinearLayout>
+
+ <TextView
+ android:id="@+id/tv_saved_confirmation"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text=""
+ android:textSize="14sp"
+ android:layout_marginTop="16dp" />
+</LinearLayout>
diff --git a/android-app/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/android-app/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
new file mode 100644
index 0000000..52d5417
--- /dev/null
+++ b/android-app/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
+ <background android:drawable="@android:color/white" />
+ <foreground android:drawable="@drawable/ic_anchor" />
+</adaptive-icon>
diff --git a/android-app/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/android-app/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
new file mode 100644
index 0000000..52d5417
--- /dev/null
+++ b/android-app/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
+ <background android:drawable="@android:color/white" />
+ <foreground android:drawable="@drawable/ic_anchor" />
+</adaptive-icon>
diff --git a/android-app/app/src/main/res/raw/mob_alarm.mp3 b/android-app/app/src/main/res/raw/mob_alarm.mp3
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/android-app/app/src/main/res/raw/mob_alarm.mp3
@@ -0,0 +1 @@
+
diff --git a/android-app/app/src/main/res/values/colors.xml b/android-app/app/src/main/res/values/colors.xml
index 2382364..43e0076 100644..100755
--- a/android-app/app/src/main/res/values/colors.xml
+++ b/android-app/app/src/main/res/values/colors.xml
@@ -1,12 +1,41 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
+ <color name="purple_200">#FFBB86FC</color>
+ <color name="purple_500">#FF6200EE</color>
+ <color name="purple_700">#FF3700B3</color>
+ <color name="teal_200">#FF03DAC5</color>
+ <color name="teal_700">#FF018786</color>
+ <color name="black">#FF000000</color>
+ <color name="white">#FFFFFFFF</color>
+
+ <!-- Maritime theme colors -->
<color name="primary">#0D47A1</color>
<color name="primary_dark">#002171</color>
<color name="accent">#FF6D00</color>
<color name="surface">#FFFFFF</color>
<color name="on_primary">#FFFFFF</color>
+
+ <!-- Colors for instrument display -->
+ <color name="instrument_text_normal">#FFFFFFFF</color>
+ <color name="instrument_text_secondary">#B3FFFFFF</color>
+ <color name="instrument_text_alarm">#FFFF0000</color>
+ <color name="instrument_text_stale">#FFFFFF00</color>
+ <color name="instrument_background">#E61E1E1E</color>
+ <color name="mob_button_background">#FFD70000</color>
+ <color name="anchor_button_background">#3F51B5</color>
+
+ <!-- Wind overlay colors -->
<color name="wind_arrow">#FFFFFFFF</color>
<color name="wind_slow">#4CAF50</color>
<color name="wind_medium">#FF9800</color>
<color name="wind_strong">#F44336</color>
+
+ <!-- Night Vision Mode Colors -->
+ <color name="night_red_primary">#FFFF0000</color>
+ <color name="night_red_variant">#FFBB0000</color>
+ <color name="night_on_red">#FF000000</color>
+ <color name="night_background">#FF000000</color>
+ <color name="night_on_background">#FFFF0000</color>
+ <color name="night_surface">#FF110000</color>
+ <color name="night_on_surface">#FFFF0000</color>
</resources>
diff --git a/android-app/app/src/main/res/values/dimens.xml b/android-app/app/src/main/res/values/dimens.xml
new file mode 100755
index 0000000..1b65ea9
--- /dev/null
+++ b/android-app/app/src/main/res/values/dimens.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+ <!-- Font sizes for instrument display -->
+ <dimen name="text_size_instrument_primary">24sp</dimen>
+ <dimen name="text_size_instrument_secondary">18sp</dimen>
+ <dimen name="text_size_instrument_label">14sp</dimen>
+ <dimen name="instrument_margin">8dp</dimen>
+ <dimen name="instrument_padding">4dp</dimen>
+</resources>
diff --git a/android-app/app/src/main/res/values/strings.xml b/android-app/app/src/main/res/values/strings.xml
index b7d3bd8..499ba8d 100644..100755
--- a/android-app/app/src/main/res/values/strings.xml
+++ b/android-app/app/src/main/res/values/strings.xml
@@ -1,8 +1,56 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
- <string name="app_name">Nav</string>
+ <string name="app_name">nav</string>
+
+ <!-- Navigation -->
<string name="nav_map">Map</string>
<string name="nav_forecast">Forecast</string>
+
+ <!-- Instrument Labels -->
+ <string name="instrument_label_wind">WIND</string>
+ <string name="instrument_label_aws">AWS</string>
+ <string name="instrument_label_tws">TWS</string>
+ <string name="instrument_label_compass">COMPASS</string>
+ <string name="instrument_label_hdg">HDG</string>
+ <string name="instrument_label_cog">COG</string>
+ <string name="instrument_label_boatspeed">BOAT SPEED</string>
+ <string name="instrument_label_bsp">BSP</string>
+ <string name="instrument_label_sog">SOG</string>
+ <string name="instrument_label_vmg">VMG</string>
+ <string name="instrument_label_depth">DEPTH</string>
+ <string name="instrument_label_polar_pct">POLAR %</string>
+ <string name="instrument_label_barometer">BAROMETER</string>
+ <string name="instrument_label_trend">TREND</string>
+
+ <!-- Placeholder values for initial display -->
+ <string name="placeholder_aws_value">--.-</string>
+ <string name="placeholder_tws_value">--.-</string>
+ <string name="placeholder_hdg_value">---</string>
+ <string name="placeholder_cog_value">---</string>
+ <string name="placeholder_bsp_value">--.-</string>
+ <string name="placeholder_sog_value">--.-</string>
+ <string name="placeholder_vmg_value">--.-</string>
+ <string name="placeholder_depth_value">--.-</string>
+ <string name="placeholder_polar_value">---</string>
+ <string name="placeholder_baro_value">----.-</string>
+
+ <string name="fab_mob_content_description">Activate Man Overboard (MOB) alarm</string>
+ <string name="fab_anchor_content_description">Toggle Anchor Watch Configuration</string>
+
+ <!-- MOB Navigation View Strings -->
+ <string name="mob_label_distance">DISTANCE TO MOB</string>
+ <string name="mob_label_elapsed_time">ELAPSED TIME</string>
+ <string name="mob_button_recovered">RECOVERED</string>
+
+ <!-- Anchor Watch Strings -->
+ <string name="anchor_config_title">Anchor Watch</string>
+ <string name="button_set_anchor">SET ANCHOR</string>
+ <string name="button_stop_anchor">STOP WATCH</string>
+ <string name="anchor_inactive">Anchor Watch Inactive</string>
+ <string name="anchor_active_format">Anchor Set at %1$.4f, %2$.4f\nRadius: %3$.1fm\nDistance: %4$.1fm (%5$.1fm from limit)</string>
+ <string name="anchor_active_dragging_format">!!! ANCHOR DRAG !!!\nAnchor Set at %1$.4f, %2$.4f\nRadius: %3$.1fm\nDistance: %4$.1fm (%5$.1fm OVER limit)</string>
+
+ <!-- Weather / Forecast Strings -->
<string name="loading_weather">Fetching weather…</string>
<string name="error_location">Could not get location. Showing default position.</string>
<string name="error_weather">Failed to load weather data.</string>
diff --git a/android-app/app/src/main/res/values/themes.xml b/android-app/app/src/main/res/values/themes.xml
index cecd32f..abef4b9 100644..100755
--- a/android-app/app/src/main/res/values/themes.xml
+++ b/android-app/app/src/main/res/values/themes.xml
@@ -1,9 +1,64 @@
<?xml version="1.0" encoding="utf-8"?>
-<resources>
+<resources xmlns:tools="http://schemas.android.com/tools">
+ <!-- Base application theme. -->
+ <style name="Theme.Nav" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
+ <item name="colorPrimary">@color/purple_200</item>
+ <item name="colorPrimaryVariant">@color/purple_700</item>
+ <item name="colorOnPrimary">@color/black</item>
+ <item name="colorSecondary">@color/teal_200</item>
+ <item name="colorSecondaryVariant">@color/teal_200</item>
+ <item name="colorOnSecondary">@color/black</item>
+ <item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>
+ </style>
+
+ <!-- Maritime theme (weather/forecast features) -->
<style name="Theme.NavApp" parent="Theme.MaterialComponents.DayNight.NoActionBar">
<item name="colorPrimary">@color/primary</item>
<item name="colorPrimaryDark">@color/primary_dark</item>
<item name="colorAccent">@color/accent</item>
<item name="android:statusBarColor">@color/primary_dark</item>
</style>
+
+ <!-- Night Vision Theme -->
+ <style name="Theme.Nav.NightVision" parent="Theme.MaterialComponents.NoActionBar">
+ <item name="colorPrimary">@color/night_red_primary</item>
+ <item name="colorPrimaryVariant">@color/night_red_variant</item>
+ <item name="colorOnPrimary">@color/night_on_red</item>
+ <item name="colorSecondary">@color/night_red_primary</item>
+ <item name="colorSecondaryVariant">@color/night_red_variant</item>
+ <item name="colorOnSecondary">@color/night_on_red</item>
+ <item name="android:colorBackground">@color/night_background</item>
+ <item name="colorSurface">@color/night_surface</item>
+ <item name="colorOnSurface">@color/night_on_surface</item>
+ <item name="android:statusBarColor" tools:targetApi="l">@color/night_background</item>
+ </style>
+
+ <!-- Instrument Display Styles -->
+ <style name="InstrumentLabel" parent="Widget.AppCompat.TextView">
+ <item name="android:layout_width">0dp</item>
+ <item name="android:layout_height">wrap_content</item>
+ <item name="android:gravity">center</item>
+ <item name="android:textColor">@color/instrument_text_normal</item>
+ <item name="android:textSize">@dimen/text_size_instrument_label</item>
+ <item name="android:textStyle">bold</item>
+ <item name="android:paddingTop">@dimen/instrument_padding</item>
+ <item name="android:paddingBottom">@dimen/instrument_padding</item>
+ </style>
+
+ <style name="InstrumentPrimaryValue" parent="Widget.AppCompat.TextView">
+ <item name="android:layout_width">0dp</item>
+ <item name="android:layout_height">wrap_content</item>
+ <item name="android:gravity">center</item>
+ <item name="android:textColor">@color/instrument_text_normal</item>
+ <item name="android:textSize">@dimen/text_size_instrument_primary</item>
+ <item name="android:textStyle">bold</item>
+ </style>
+
+ <style name="InstrumentSecondaryLabel" parent="Widget.AppCompat.TextView">
+ <item name="android:layout_width">0dp</item>
+ <item name="android:layout_height">wrap_content</item>
+ <item name="android:gravity">center</item>
+ <item name="android:textColor">@color/instrument_text_normal</item>
+ <item name="android:textSize">@dimen/text_size_instrument_secondary</item>
+ </style>
</resources>