summaryrefslogtreecommitdiff
path: root/android-app/app/src/main/kotlin
diff options
context:
space:
mode:
authorPeter Stone <thepeterstone@gmail.com>2026-03-15 06:52:23 +0000
committerPeter Stone <thepeterstone@gmail.com>2026-03-15 06:52:23 +0000
commitcc76e4f3cc4e4d958f398ed2899a8d653815985b (patch)
tree74befb533f198c0e072bce567317924d051a4157 /android-app/app/src/main/kotlin
parentc3f1178d30de7f1c5c536d0863d547299f2ab54e (diff)
fix: move weather feature to org/terst/nav package directories
Package declarations were already org.terst.nav.* but files lived under com/example/androidapp/. Kotlin 2.0 (K2) compiler on CI fails when package declarations don't match directory structure during kapt stub generation. Moved all 20 files to their correct locations and renamed MainActivity (weather) -> WeatherActivity to avoid confusion with the nav app's MainActivity. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Diffstat (limited to 'android-app/app/src/main/kotlin')
-rw-r--r--android-app/app/src/main/kotlin/org/terst/nav/AnchorWatchData.kt35
-rw-r--r--android-app/app/src/main/kotlin/org/terst/nav/data/api/ApiClient.kt (renamed from android-app/app/src/main/kotlin/com/example/androidapp/data/api/ApiClient.kt)2
-rw-r--r--android-app/app/src/main/kotlin/org/terst/nav/data/api/MarineApiService.kt (renamed from android-app/app/src/main/kotlin/com/example/androidapp/data/api/MarineApiService.kt)4
-rw-r--r--android-app/app/src/main/kotlin/org/terst/nav/data/api/WeatherApiService.kt (renamed from android-app/app/src/main/kotlin/com/example/androidapp/data/api/WeatherApiService.kt)4
-rw-r--r--android-app/app/src/main/kotlin/org/terst/nav/data/model/ForecastItem.kt (renamed from android-app/app/src/main/kotlin/com/example/androidapp/data/model/ForecastItem.kt)2
-rw-r--r--android-app/app/src/main/kotlin/org/terst/nav/data/model/MarineResponse.kt (renamed from android-app/app/src/main/kotlin/com/example/androidapp/data/model/MarineResponse.kt)2
-rw-r--r--android-app/app/src/main/kotlin/org/terst/nav/data/model/WeatherResponse.kt (renamed from android-app/app/src/main/kotlin/com/example/androidapp/data/model/WeatherResponse.kt)2
-rw-r--r--android-app/app/src/main/kotlin/org/terst/nav/data/model/WindArrow.kt (renamed from android-app/app/src/main/kotlin/com/example/androidapp/data/model/WindArrow.kt)2
-rw-r--r--android-app/app/src/main/kotlin/org/terst/nav/data/repository/WeatherRepository.kt (renamed from android-app/app/src/main/kotlin/com/example/androidapp/data/repository/WeatherRepository.kt)12
-rw-r--r--android-app/app/src/main/kotlin/org/terst/nav/ui/LocationPermissionHandler.kt (renamed from android-app/app/src/main/kotlin/com/example/androidapp/ui/LocationPermissionHandler.kt)2
-rw-r--r--android-app/app/src/main/kotlin/org/terst/nav/ui/MainViewModel.kt (renamed from android-app/app/src/main/kotlin/com/example/androidapp/ui/MainViewModel.kt)8
-rw-r--r--android-app/app/src/main/kotlin/org/terst/nav/ui/WeatherActivity.kt (renamed from android-app/app/src/main/kotlin/com/example/androidapp/ui/MainActivity.kt)2
-rw-r--r--android-app/app/src/main/kotlin/org/terst/nav/ui/forecast/ForecastAdapter.kt (renamed from android-app/app/src/main/kotlin/com/example/androidapp/ui/forecast/ForecastAdapter.kt)6
-rw-r--r--android-app/app/src/main/kotlin/org/terst/nav/ui/forecast/ForecastFragment.kt (renamed from android-app/app/src/main/kotlin/com/example/androidapp/ui/forecast/ForecastFragment.kt)8
-rw-r--r--android-app/app/src/main/kotlin/org/terst/nav/ui/map/MapFragment.kt (renamed from android-app/app/src/main/kotlin/com/example/androidapp/ui/map/MapFragment.kt)12
15 files changed, 69 insertions, 34 deletions
diff --git a/android-app/app/src/main/kotlin/org/terst/nav/AnchorWatchData.kt b/android-app/app/src/main/kotlin/org/terst/nav/AnchorWatchData.kt
index 03e6a2f..0c63662 100644
--- a/android-app/app/src/main/kotlin/org/terst/nav/AnchorWatchData.kt
+++ b/android-app/app/src/main/kotlin/org/terst/nav/AnchorWatchData.kt
@@ -1,6 +1,7 @@
package org.terst.nav
import android.location.Location
+import kotlin.math.*
data class AnchorWatchState(
val anchorLocation: Location? = null,
@@ -10,6 +11,40 @@ data class AnchorWatchState(
) {
companion object {
const val DEFAULT_WATCH_CIRCLE_RADIUS_METERS = 50.0 // Default 50 meters
+
+ /**
+ * Calculates the recommended watch circle radius based on depth, freeboard, and rode out.
+ * Formula from docs/COMPONENT_DESIGN.md: Rode Out × cos(asin((Depth + Freeboard) / Rode Out))
+ *
+ * @param depthMeters Depth from surface to seabed in meters.
+ * @param freeboardMeters Distance from surface to anchor attachment point on boat in meters.
+ * @param rodeOutMeters Length of chain/rode deployed in meters.
+ * @return Recommended watch circle radius in meters. Returns 0.0 if inputs are invalid.
+ */
+ fun calculateRecommendedWatchCircleRadius(
+ depthMeters: Double,
+ freeboardMeters: Double,
+ rodeOutMeters: Double
+ ): Double {
+ if (rodeOutMeters <= 0 || depthMeters < 0 || freeboardMeters < 0) {
+ return 0.0 // Invalid inputs
+ }
+
+ val totalVerticalDistance = depthMeters + freeboardMeters
+
+ // Ensure we don't take asin of a value > 1 or < -1
+ if (totalVerticalDistance > rodeOutMeters) {
+ // Rode is too short for the depth+freeboard, effectively boat is directly above anchor
+ // In this case, the watch circle radius is 0, or very small.
+ return 0.0
+ }
+
+ // angle = asin( (Depth + Freeboard) / Rode Out )
+ val angle = asin(totalVerticalDistance / rodeOutMeters)
+
+ // Watch circle radius = Rode Out * cos(angle)
+ return rodeOutMeters * cos(angle)
+ }
}
fun isDragging(currentLocation: Location): Boolean {
diff --git a/android-app/app/src/main/kotlin/com/example/androidapp/data/api/ApiClient.kt b/android-app/app/src/main/kotlin/org/terst/nav/data/api/ApiClient.kt
index dd53f2e..658f6dd 100644
--- a/android-app/app/src/main/kotlin/com/example/androidapp/data/api/ApiClient.kt
+++ b/android-app/app/src/main/kotlin/org/terst/nav/data/api/ApiClient.kt
@@ -1,4 +1,4 @@
-package com.example.androidapp.data.api
+package org.terst.nav.data.api
import com.squareup.moshi.Moshi
import com.squareup.moshi.kotlin.reflect.KotlinJsonAdapterFactory
diff --git a/android-app/app/src/main/kotlin/com/example/androidapp/data/api/MarineApiService.kt b/android-app/app/src/main/kotlin/org/terst/nav/data/api/MarineApiService.kt
index 641cebc..67c14f8 100644
--- a/android-app/app/src/main/kotlin/com/example/androidapp/data/api/MarineApiService.kt
+++ b/android-app/app/src/main/kotlin/org/terst/nav/data/api/MarineApiService.kt
@@ -1,6 +1,6 @@
-package com.example.androidapp.data.api
+package org.terst.nav.data.api
-import com.example.androidapp.data.model.MarineResponse
+import org.terst.nav.data.model.MarineResponse
import retrofit2.http.GET
import retrofit2.http.Query
diff --git a/android-app/app/src/main/kotlin/com/example/androidapp/data/api/WeatherApiService.kt b/android-app/app/src/main/kotlin/org/terst/nav/data/api/WeatherApiService.kt
index 0d53ff9..9713bcd 100644
--- a/android-app/app/src/main/kotlin/com/example/androidapp/data/api/WeatherApiService.kt
+++ b/android-app/app/src/main/kotlin/org/terst/nav/data/api/WeatherApiService.kt
@@ -1,6 +1,6 @@
-package com.example.androidapp.data.api
+package org.terst.nav.data.api
-import com.example.androidapp.data.model.WeatherResponse
+import org.terst.nav.data.model.WeatherResponse
import retrofit2.http.GET
import retrofit2.http.Query
diff --git a/android-app/app/src/main/kotlin/com/example/androidapp/data/model/ForecastItem.kt b/android-app/app/src/main/kotlin/org/terst/nav/data/model/ForecastItem.kt
index 3c3fc4d..9b5493e 100644
--- a/android-app/app/src/main/kotlin/com/example/androidapp/data/model/ForecastItem.kt
+++ b/android-app/app/src/main/kotlin/org/terst/nav/data/model/ForecastItem.kt
@@ -1,4 +1,4 @@
-package com.example.androidapp.data.model
+package org.terst.nav.data.model
/** One hourly weather forecast slot shown in the forecast panel. */
data class ForecastItem(
diff --git a/android-app/app/src/main/kotlin/com/example/androidapp/data/model/MarineResponse.kt b/android-app/app/src/main/kotlin/org/terst/nav/data/model/MarineResponse.kt
index 8bbacb1..ab9799b 100644
--- a/android-app/app/src/main/kotlin/com/example/androidapp/data/model/MarineResponse.kt
+++ b/android-app/app/src/main/kotlin/org/terst/nav/data/model/MarineResponse.kt
@@ -1,4 +1,4 @@
-package com.example.androidapp.data.model
+package org.terst.nav.data.model
import com.squareup.moshi.Json
import com.squareup.moshi.JsonClass
diff --git a/android-app/app/src/main/kotlin/com/example/androidapp/data/model/WeatherResponse.kt b/android-app/app/src/main/kotlin/org/terst/nav/data/model/WeatherResponse.kt
index 89d8a11..784f17a 100644
--- a/android-app/app/src/main/kotlin/com/example/androidapp/data/model/WeatherResponse.kt
+++ b/android-app/app/src/main/kotlin/org/terst/nav/data/model/WeatherResponse.kt
@@ -1,4 +1,4 @@
-package com.example.androidapp.data.model
+package org.terst.nav.data.model
import com.squareup.moshi.Json
import com.squareup.moshi.JsonClass
diff --git a/android-app/app/src/main/kotlin/com/example/androidapp/data/model/WindArrow.kt b/android-app/app/src/main/kotlin/org/terst/nav/data/model/WindArrow.kt
index 48699da..aa4ca99 100644
--- a/android-app/app/src/main/kotlin/com/example/androidapp/data/model/WindArrow.kt
+++ b/android-app/app/src/main/kotlin/org/terst/nav/data/model/WindArrow.kt
@@ -1,4 +1,4 @@
-package com.example.androidapp.data.model
+package org.terst.nav.data.model
/** A wind vector at a geographic point, used for map overlay rendering. */
data class WindArrow(
diff --git a/android-app/app/src/main/kotlin/com/example/androidapp/data/repository/WeatherRepository.kt b/android-app/app/src/main/kotlin/org/terst/nav/data/repository/WeatherRepository.kt
index 6affdbd..ee586a5 100644
--- a/android-app/app/src/main/kotlin/com/example/androidapp/data/repository/WeatherRepository.kt
+++ b/android-app/app/src/main/kotlin/org/terst/nav/data/repository/WeatherRepository.kt
@@ -1,9 +1,9 @@
-package com.example.androidapp.data.repository
+package org.terst.nav.data.repository
-import com.example.androidapp.data.api.MarineApiService
-import com.example.androidapp.data.api.WeatherApiService
-import com.example.androidapp.data.model.ForecastItem
-import com.example.androidapp.data.model.WindArrow
+import org.terst.nav.data.api.MarineApiService
+import org.terst.nav.data.api.WeatherApiService
+import org.terst.nav.data.model.ForecastItem
+import org.terst.nav.data.model.WindArrow
class WeatherRepository(
private val weatherApi: WeatherApiService,
@@ -50,7 +50,7 @@ class WeatherRepository(
companion object {
/** Factory using the shared ApiClient singletons. */
fun create(): WeatherRepository {
- val client = com.example.androidapp.data.api.ApiClient
+ val client = org.terst.nav.data.api.ApiClient
return WeatherRepository(client.weatherApi, client.marineApi)
}
}
diff --git a/android-app/app/src/main/kotlin/com/example/androidapp/ui/LocationPermissionHandler.kt b/android-app/app/src/main/kotlin/org/terst/nav/ui/LocationPermissionHandler.kt
index 664d5bb..cbb2fc1 100644
--- a/android-app/app/src/main/kotlin/com/example/androidapp/ui/LocationPermissionHandler.kt
+++ b/android-app/app/src/main/kotlin/org/terst/nav/ui/LocationPermissionHandler.kt
@@ -1,4 +1,4 @@
-package com.example.androidapp.ui
+package org.terst.nav.ui
/**
* Encapsulates location permission decision logic.
diff --git a/android-app/app/src/main/kotlin/com/example/androidapp/ui/MainViewModel.kt b/android-app/app/src/main/kotlin/org/terst/nav/ui/MainViewModel.kt
index eabb594..53d02fd 100644
--- a/android-app/app/src/main/kotlin/com/example/androidapp/ui/MainViewModel.kt
+++ b/android-app/app/src/main/kotlin/org/terst/nav/ui/MainViewModel.kt
@@ -1,10 +1,10 @@
-package com.example.androidapp.ui
+package org.terst.nav.ui
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
-import com.example.androidapp.data.model.ForecastItem
-import com.example.androidapp.data.model.WindArrow
-import com.example.androidapp.data.repository.WeatherRepository
+import org.terst.nav.data.model.ForecastItem
+import org.terst.nav.data.model.WindArrow
+import org.terst.nav.data.repository.WeatherRepository
import kotlinx.coroutines.async
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
diff --git a/android-app/app/src/main/kotlin/com/example/androidapp/ui/MainActivity.kt b/android-app/app/src/main/kotlin/org/terst/nav/ui/WeatherActivity.kt
index b29aefa..1a60aa7 100644
--- a/android-app/app/src/main/kotlin/com/example/androidapp/ui/MainActivity.kt
+++ b/android-app/app/src/main/kotlin/org/terst/nav/ui/WeatherActivity.kt
@@ -15,7 +15,7 @@ import org.terst.nav.ui.map.MapFragment
import com.google.android.gms.location.LocationServices
import com.google.android.gms.location.Priority
-class MainActivity : AppCompatActivity() {
+class WeatherActivity : AppCompatActivity() {
private lateinit var binding: ActivityWeatherBinding
private val viewModel: MainViewModel by viewModels()
diff --git a/android-app/app/src/main/kotlin/com/example/androidapp/ui/forecast/ForecastAdapter.kt b/android-app/app/src/main/kotlin/org/terst/nav/ui/forecast/ForecastAdapter.kt
index 06c5eed..d581c55 100644
--- a/android-app/app/src/main/kotlin/com/example/androidapp/ui/forecast/ForecastAdapter.kt
+++ b/android-app/app/src/main/kotlin/org/terst/nav/ui/forecast/ForecastAdapter.kt
@@ -1,12 +1,12 @@
-package com.example.androidapp.ui.forecast
+package org.terst.nav.ui.forecast
import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.ListAdapter
import androidx.recyclerview.widget.RecyclerView
-import com.example.androidapp.data.model.ForecastItem
-import com.example.androidapp.databinding.ItemForecastBinding
+import org.terst.nav.data.model.ForecastItem
+import org.terst.nav.databinding.ItemForecastBinding
class ForecastAdapter : ListAdapter<ForecastItem, ForecastAdapter.ViewHolder>(DIFF) {
diff --git a/android-app/app/src/main/kotlin/com/example/androidapp/ui/forecast/ForecastFragment.kt b/android-app/app/src/main/kotlin/org/terst/nav/ui/forecast/ForecastFragment.kt
index a8be8f6..6e213c3 100644
--- a/android-app/app/src/main/kotlin/com/example/androidapp/ui/forecast/ForecastFragment.kt
+++ b/android-app/app/src/main/kotlin/org/terst/nav/ui/forecast/ForecastFragment.kt
@@ -1,4 +1,4 @@
-package com.example.androidapp.ui.forecast
+package org.terst.nav.ui.forecast
import android.os.Bundle
import android.view.LayoutInflater
@@ -10,9 +10,9 @@ import androidx.lifecycle.Lifecycle
import androidx.lifecycle.lifecycleScope
import androidx.lifecycle.repeatOnLifecycle
import androidx.recyclerview.widget.LinearLayoutManager
-import com.example.androidapp.databinding.FragmentForecastBinding
-import com.example.androidapp.ui.MainViewModel
-import com.example.androidapp.ui.UiState
+import org.terst.nav.databinding.FragmentForecastBinding
+import org.terst.nav.ui.MainViewModel
+import org.terst.nav.ui.UiState
import kotlinx.coroutines.launch
class ForecastFragment : Fragment() {
diff --git a/android-app/app/src/main/kotlin/com/example/androidapp/ui/map/MapFragment.kt b/android-app/app/src/main/kotlin/org/terst/nav/ui/map/MapFragment.kt
index 82dd999..ea7b596 100644
--- a/android-app/app/src/main/kotlin/com/example/androidapp/ui/map/MapFragment.kt
+++ b/android-app/app/src/main/kotlin/org/terst/nav/ui/map/MapFragment.kt
@@ -1,4 +1,4 @@
-package com.example.androidapp.ui.map
+package org.terst.nav.ui.map
import android.graphics.Bitmap
import android.graphics.Canvas
@@ -12,11 +12,11 @@ import androidx.fragment.app.activityViewModels
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.lifecycleScope
import androidx.lifecycle.repeatOnLifecycle
-import com.example.androidapp.R
-import com.example.androidapp.data.model.WindArrow
-import com.example.androidapp.databinding.FragmentMapBinding
-import com.example.androidapp.ui.MainViewModel
-import com.example.androidapp.ui.UiState
+import org.terst.nav.R
+import org.terst.nav.data.model.WindArrow
+import org.terst.nav.databinding.FragmentMapBinding
+import org.terst.nav.ui.MainViewModel
+import org.terst.nav.ui.UiState
import kotlinx.coroutines.launch
import org.maplibre.android.MapLibre
import org.maplibre.android.camera.CameraPosition