diff options
Diffstat (limited to 'android-app/app/src/main/kotlin')
| -rw-r--r-- | android-app/app/src/main/kotlin/org/terst/nav/AnchorWatchData.kt | 35 | ||||
| -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 |
