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_wind_arrow.xml21
-rw-r--r--android-app/app/src/main/res/layout/activity_main.xml22
-rw-r--r--android-app/app/src/main/res/layout/fragment_forecast.xml42
-rw-r--r--android-app/app/src/main/res/layout/fragment_map.xml30
-rw-r--r--android-app/app/src/main/res/layout/item_forecast.xml59
-rw-r--r--android-app/app/src/main/res/menu/bottom_nav_menu.xml11
-rw-r--r--android-app/app/src/main/res/values/colors.xml12
-rw-r--r--android-app/app/src/main/res/values/strings.xml13
-rw-r--r--android-app/app/src/main/res/values/themes.xml9
9 files changed, 219 insertions, 0 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_main.xml b/android-app/app/src/main/res/layout/activity_main.xml
new file mode 100644
index 0000000..757dbdb
--- /dev/null
+++ b/android-app/app/src/main/res/layout/activity_main.xml
@@ -0,0 +1,22 @@
+<?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">
+
+ <androidx.fragment.app.FragmentContainerView
+ android:id="@+id/fragment_container"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_marginBottom="56dp" />
+
+ <com.google.android.material.bottomnavigation.BottomNavigationView
+ android:id="@+id/bottom_nav"
+ android:layout_width="match_parent"
+ android:layout_height="56dp"
+ android:layout_gravity="bottom"
+ android:background="?attr/colorSurface"
+ app:menu="@menu/bottom_nav_menu" />
+
+</androidx.coordinatorlayout.widget.CoordinatorLayout>
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
new file mode 100644
index 0000000..2382364
--- /dev/null
+++ b/android-app/app/src/main/res/values/colors.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+ <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>
+ <color name="wind_arrow">#FFFFFFFF</color>
+ <color name="wind_slow">#4CAF50</color>
+ <color name="wind_medium">#FF9800</color>
+ <color name="wind_strong">#F44336</color>
+</resources>
diff --git a/android-app/app/src/main/res/values/strings.xml b/android-app/app/src/main/res/values/strings.xml
new file mode 100644
index 0000000..b7d3bd8
--- /dev/null
+++ b/android-app/app/src/main/res/values/strings.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+ <string name="app_name">Nav</string>
+ <string name="nav_map">Map</string>
+ <string name="nav_forecast">Forecast</string>
+ <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
new file mode 100644
index 0000000..cecd32f
--- /dev/null
+++ b/android-app/app/src/main/res/values/themes.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+ <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>
+</resources>