diff options
Diffstat (limited to 'android-app/app/src/main/res')
9 files changed, 235 insertions, 25 deletions
diff --git a/android-app/app/src/main/res/drawable/ic_wind_arrow.xml b/android-app/app/src/main/res/drawable/ic_wind_arrow.xml new file mode 100644 index 0000000..110f1b3 --- /dev/null +++ b/android-app/app/src/main/res/drawable/ic_wind_arrow.xml @@ -0,0 +1,21 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Wind-direction arrow pointing UP (north). + MapLibre rotates the icon to match wind direction via icon-rotate expression. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + + <!-- Arrowhead pointing up --> + <path + android:fillColor="#FFFFFF" + android:pathData="M12,2 L18,14 L12,11 L6,14 Z" /> + <!-- Shaft --> + <path + android:fillColor="#FFFFFF" + android:pathData="M11,11 L11,22 L13,22 L13,11 Z" /> + +</vector> 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_forecast.xml b/android-app/app/src/main/res/layout/fragment_forecast.xml new file mode 100644 index 0000000..aca38ba --- /dev/null +++ b/android-app/app/src/main/res/layout/fragment_forecast.xml @@ -0,0 +1,42 @@ +<?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:background="?attr/colorSurface"> + + <TextView + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:paddingHorizontal="16dp" + android:paddingTop="16dp" + android:paddingBottom="8dp" + android:text="7-Day Forecast" + android:textAppearance="?attr/textAppearanceHeadline6" + android:textColor="?attr/colorOnSurface" /> + + <ProgressBar + android:id="@+id/progress" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center" + android:visibility="gone" /> + + <TextView + android:id="@+id/error_text" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:padding="16dp" + android:textColor="@color/wind_strong" + android:visibility="gone" /> + + <androidx.recyclerview.widget.RecyclerView + android:id="@+id/forecast_list" + android:layout_width="match_parent" + android:layout_height="0dp" + android:layout_weight="1" + android:clipToPadding="false" + android:paddingBottom="8dp" /> + +</LinearLayout> diff --git a/android-app/app/src/main/res/layout/fragment_map.xml b/android-app/app/src/main/res/layout/fragment_map.xml new file mode 100644 index 0000000..e5b86b7 --- /dev/null +++ b/android-app/app/src/main/res/layout/fragment_map.xml @@ -0,0 +1,30 @@ +<?xml version="1.0" encoding="utf-8"?> +<FrameLayout + 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"> + + <org.maplibre.android.maps.MapView + android:id="@+id/map_view" + android:layout_width="match_parent" + android:layout_height="match_parent" + app:maplibre_cameraTargetLat="37.0" + app:maplibre_cameraTargetLng="-122.0" + app:maplibre_cameraZoom="5.0" /> + + <!-- Loading / error overlay --> + <TextView + android:id="@+id/status_text" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="top|center_horizontal" + android:layout_marginTop="16dp" + android:background="#AA000000" + android:paddingHorizontal="12dp" + android:paddingVertical="4dp" + android:textColor="#FFFFFF" + android:textSize="14sp" + android:visibility="gone" /> + +</FrameLayout> diff --git a/android-app/app/src/main/res/layout/item_forecast.xml b/android-app/app/src/main/res/layout/item_forecast.xml new file mode 100644 index 0000000..473661a --- /dev/null +++ b/android-app/app/src/main/res/layout/item_forecast.xml @@ -0,0 +1,59 @@ +<?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="wrap_content" + android:orientation="horizontal" + android:paddingHorizontal="16dp" + android:paddingVertical="12dp" + android:gravity="center_vertical"> + + <!-- Time --> + <TextView + android:id="@+id/tv_time" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_weight="2" + android:textAppearance="?attr/textAppearanceBody2" + android:textColor="?attr/colorOnSurface" /> + + <!-- Weather description --> + <TextView + android:id="@+id/tv_description" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_weight="3" + android:textAppearance="?attr/textAppearanceBody2" + android:textColor="?attr/colorOnSurface" /> + + <!-- Wind --> + <TextView + android:id="@+id/tv_wind" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_weight="2" + android:gravity="end" + android:textAppearance="?attr/textAppearanceBody2" + android:textColor="?attr/colorOnSurface" /> + + <!-- Temperature --> + <TextView + android:id="@+id/tv_temp" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_weight="1.5" + android:gravity="end" + android:textAppearance="?attr/textAppearanceBody2" + android:textColor="?attr/colorOnSurface" /> + + <!-- Precip probability --> + <TextView + android:id="@+id/tv_precip" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_weight="1.5" + android:gravity="end" + android:textAppearance="?attr/textAppearanceBody2" + android:textColor="@color/primary" /> + +</LinearLayout> diff --git a/android-app/app/src/main/res/menu/bottom_nav_menu.xml b/android-app/app/src/main/res/menu/bottom_nav_menu.xml new file mode 100644 index 0000000..6922dee --- /dev/null +++ b/android-app/app/src/main/res/menu/bottom_nav_menu.xml @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="utf-8"?> +<menu xmlns:android="http://schemas.android.com/apk/res/android"> + <item + android:id="@+id/nav_map" + android:icon="@android:drawable/ic_dialog_map" + android:title="@string/nav_map" /> + <item + android:id="@+id/nav_forecast" + android:icon="@android:drawable/ic_dialog_info" + android:title="@string/nav_forecast" /> +</menu> diff --git a/android-app/app/src/main/res/values/colors.xml b/android-app/app/src/main/res/values/colors.xml index 32f5036..43e0076 100755 --- a/android-app/app/src/main/res/values/colors.xml +++ b/android-app/app/src/main/res/values/colors.xml @@ -1,3 +1,4 @@ +<?xml version="1.0" encoding="utf-8"?> <resources> <color name="purple_200">#FFBB86FC</color> <color name="purple_500">#FF6200EE</color> @@ -7,21 +8,34 @@ <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> <!-- White for normal text on dark background --> - <color name="instrument_text_secondary">#B3FFFFFF</color> <!-- 70% white --> - <color name="instrument_text_alarm">#FFFF0000</color> <!-- Red for alarm --> - <color name="instrument_text_stale">#FFFFFF00</color> <!-- Yellow for stale data --> - <color name="instrument_background">#E61E1E1E</color> <!-- Slightly transparent dark grey --> - <color name="mob_button_background">#FFD70000</color> <!-- High-contrast red for MOB button --> + <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> <!-- Bright red for primary elements --> - <color name="night_red_variant">#FFBB0000</color> <!-- Slightly darker red for variants --> - <color name="night_on_red">#FF000000</color> <!-- Black text on red background --> - <color name="night_background">#FF000000</color> <!-- Pure black background --> - <color name="night_on_background">#FFFF0000</color> <!-- Bright red text on black background --> - <color name="night_surface">#FF110000</color> <!-- Very dark red surface color --> - <color name="night_on_surface">#FFFF0000</color> <!-- Red text on dark red surface --> -</resources>
\ No newline at end of file + <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/strings.xml b/android-app/app/src/main/res/values/strings.xml index cec4850..499ba8d 100755 --- a/android-app/app/src/main/res/values/strings.xml +++ b/android-app/app/src/main/res/values/strings.xml @@ -1,6 +1,11 @@ +<?xml version="1.0" encoding="utf-8"?> <resources> <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> @@ -44,4 +49,13 @@ <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> + <string name="wind_speed_fmt">%.0f kt</string> + <string name="temp_fmt">%.0f °C</string> + <string name="precip_fmt">%d%%</string> + <string name="permission_rationale">Location is needed to show weather for your current position.</string> </resources> diff --git a/android-app/app/src/main/res/values/themes.xml b/android-app/app/src/main/res/values/themes.xml index 612bba1..abef4b9 100755 --- a/android-app/app/src/main/res/values/themes.xml +++ b/android-app/app/src/main/res/values/themes.xml @@ -1,37 +1,36 @@ +<?xml version="1.0" encoding="utf-8"?> <resources xmlns:tools="http://schemas.android.com/tools"> <!-- Base application theme. --> <style name="Theme.Nav" parent="Theme.MaterialComponents.DayNight.DarkActionBar"> - <!-- Primary brand color. --> <item name="colorPrimary">@color/purple_200</item> <item name="colorPrimaryVariant">@color/purple_700</item> <item name="colorOnPrimary">@color/black</item> - <!-- Secondary brand color. --> <item name="colorSecondary">@color/teal_200</item> <item name="colorSecondaryVariant">@color/teal_200</item> <item name="colorOnSecondary">@color/black</item> - <!-- Status bar color. --> <item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item> - <!-- Customize your theme here. --> + </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"> - <!-- Primary brand color. --> <item name="colorPrimary">@color/night_red_primary</item> <item name="colorPrimaryVariant">@color/night_red_variant</item> <item name="colorOnPrimary">@color/night_on_red</item> - <!-- Secondary brand color. --> <item name="colorSecondary">@color/night_red_primary</item> <item name="colorSecondaryVariant">@color/night_red_variant</item> <item name="colorOnSecondary">@color/night_on_red</item> - <!-- Background color --> <item name="android:colorBackground">@color/night_background</item> - <!-- Surface color --> <item name="colorSurface">@color/night_surface</item> <item name="colorOnSurface">@color/night_on_surface</item> - <!-- Status bar color. --> <item name="android:statusBarColor" tools:targetApi="l">@color/night_background</item> - <!-- Customize your theme here. --> </style> <!-- Instrument Display Styles --> @@ -62,4 +61,4 @@ <item name="android:textColor">@color/instrument_text_normal</item> <item name="android:textSize">@dimen/text_size_instrument_secondary</item> </style> -</resources>
\ No newline at end of file +</resources> |
