diff options
| author | Peter Stone <thepeterstone@gmail.com> | 2026-03-15 05:49:51 +0000 |
|---|---|---|
| committer | Peter Stone <thepeterstone@gmail.com> | 2026-03-15 05:49:51 +0000 |
| commit | c3f1178d30de7f1c5c536d0863d547299f2ab54e (patch) | |
| tree | d1defece328408d165757be34070decb44101893 /android-app/app/src/main/res/layout | |
| parent | 418f6ae8c8ccb968c2674548139dab36e2ab1905 (diff) | |
| parent | 0923c55af5c63539055933509302233ee3f4b26a (diff) | |
merge: integrate weather/forecast feature from local remote
Merges wind/current overlay and weather forecast implementation:
- Weather feature: WeatherRepository, MainViewModel, MapFragment, ForecastFragment, ForecastAdapter
- Data models: WindArrow, ForecastItem, WeatherResponse, MarineResponse
- API services: WeatherApiService, MarineApiService (Open-Meteo, no key required)
- Layouts: activity_weather.xml, fragment_map.xml, fragment_forecast.xml, item_forecast.xml
- Resources: merged colors (wind_slow/medium/strong), strings, themes (Theme.NavApp added)
- Manifest: added ACCESS_COARSE_LOCATION
- build.gradle: merged deps — kept Firebase+MapLibre 11.5.1, added kotlin-kapt, retrofit, moshi, turbine
- Fix: re-packaged com.example.androidapp → org.terst.nav; weather MainActivity uses ActivityWeatherBinding
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Diffstat (limited to 'android-app/app/src/main/res/layout')
4 files changed, 151 insertions, 0 deletions
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> |
