summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--android-app/app/src/main/kotlin/org/terst/nav/MainActivity.kt44
-rw-r--r--android-app/app/src/main/res/layout/activity_main.xml25
2 files changed, 69 insertions, 0 deletions
diff --git a/android-app/app/src/main/kotlin/org/terst/nav/MainActivity.kt b/android-app/app/src/main/kotlin/org/terst/nav/MainActivity.kt
index cfc8d6d..4b090e7 100644
--- a/android-app/app/src/main/kotlin/org/terst/nav/MainActivity.kt
+++ b/android-app/app/src/main/kotlin/org/terst/nav/MainActivity.kt
@@ -91,6 +91,10 @@ class MainActivity : AppCompatActivity(), SafetyFragment.SafetyListener {
private lateinit var bottomNav: BottomNavigationView
private lateinit var mapCrosshair: View
private lateinit var inclinometerView: org.terst.nav.ui.InclinometerView
+ private lateinit var fishingOverlay: org.terst.nav.ui.fishing.FishingOverlayView
+ private lateinit var fabFishing: FloatingActionButton
+ private lateinit var fishingModeManager: org.terst.nav.ui.fishing.FishingModeManager
+ private var lastCogDeg: Double = 0.0
// HUD value TextViews
private lateinit var hudSog: TextView
@@ -275,6 +279,7 @@ class MainActivity : AppCompatActivity(), SafetyFragment.SafetyListener {
setupBottomNavigation()
setupHandlers()
setupMap()
+ setupFishingMode()
// Hidden dev log — long-press the drag handle on the instrument sheet
findViewById<View>(R.id.drag_handle).setOnLongClickListener {
DevLogSheet().show(supportFragmentManager, "dev_log")
@@ -689,6 +694,7 @@ class MainActivity : AppCompatActivity(), SafetyFragment.SafetyListener {
mapHandler?.setupWindLayer(style, windArrowBitmap)
mapHandler?.setupFadLayer(style, layerManager.fadsEnabled)
mapHandler?.updateFadLayer(FadData.toFeatures())
+ mapHandler?.setupFishingLayer(style)
// Eagerly load conditions at style-ready time so the HUD is never blank
// on startup — the camera-idle may fire before GPS fixes, this is the backstop.
maplibreMap.cameraPosition.target?.let { center ->
@@ -731,6 +737,42 @@ class MainActivity : AppCompatActivity(), SafetyFragment.SafetyListener {
}
}
+ private fun setupFishingMode() {
+ fishingOverlay = findViewById(R.id.fishing_overlay)
+ fabFishing = findViewById(R.id.fab_fishing)
+ fishingModeManager = org.terst.nav.ui.fishing.FishingModeManager(this)
+
+ fabFishing.setOnClickListener {
+ val active = !fishingModeManager.isActive
+ fishingModeManager.isActive = active
+ fishingOverlay.visibility = if (active) View.VISIBLE else View.GONE
+ loadedStyleFlow.value?.let { style ->
+ layerManager.setSstEnabled(style, active)
+ }
+ updateFishingOverlay()
+ }
+
+ if (fishingModeManager.isActive) {
+ fishingOverlay.visibility = View.VISIBLE
+ }
+ }
+
+ private fun updateFishingOverlay() {
+ if (!fishingModeManager.isActive) return
+ val cond = viewModel.marineConditions.value ?: return
+ val pos = viewModel.currentPosition.value ?: return
+ val target = fishingModeManager.computeTarget(
+ boatLat = pos.first,
+ boatLon = pos.second,
+ boatCogDeg = lastCogDeg,
+ tempC = cond.tempC ?: return,
+ currentKt = cond.currentSpeedKt ?: 0.0,
+ currentDirDeg = cond.currentDirDeg ?: 0.0
+ ) ?: return
+ fishingOverlay.bind(target)
+ mapHandler?.updateFishingBearing(pos.first, pos.second, target.bearingDeg)
+ }
+
private var thermalAlarmPlayer: MediaPlayer? = null
private fun startThermalMonitoring() {
@@ -797,6 +839,7 @@ class MainActivity : AppCompatActivity(), SafetyFragment.SafetyListener {
mapHandler?.centerOnLocation(gpsData.latitude, gpsData.longitude)
mapHandler?.updateUserPosition(gpsData.latitude, gpsData.longitude, gpsData.cog.toFloat())
viewModel.addGpsPoint(gpsData.latitude, gpsData.longitude, gpsData.sog, gpsData.cog)
+ lastCogDeg = gpsData.cog
// HUD — SOG and COG from GPS
lastSogKnots = gpsData.sog
hudSog.text = unitPrefs.formatSpeed(gpsData.sog)
@@ -854,6 +897,7 @@ class MainActivity : AppCompatActivity(), SafetyFragment.SafetyListener {
if (c == null) return@collect
lastConditions = c
applyConditions(c)
+ updateFishingOverlay()
}
}
val conditionSpinners = listOf(
diff --git a/android-app/app/src/main/res/layout/activity_main.xml b/android-app/app/src/main/res/layout/activity_main.xml
index d3b7942..1a54722 100644
--- a/android-app/app/src/main/res/layout/activity_main.xml
+++ b/android-app/app/src/main/res/layout/activity_main.xml
@@ -102,6 +102,31 @@
android:focusable="true"
android:background="?attr/colorSurface" />
+ <!-- Fishing mode overlay card — bottom-start, above bottom sheet -->
+ <org.terst.nav.ui.fishing.FishingOverlayView
+ android:id="@+id/fishing_overlay"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginStart="8dp"
+ android:layout_marginBottom="140dp"
+ android:visibility="gone"
+ app:layout_constraintBottom_toBottomOf="parent"
+ app:layout_constraintStart_toStartOf="parent" />
+
+ <!-- Fishing mode FAB — bottom-start -->
+ <com.google.android.material.floatingactionbutton.FloatingActionButton
+ android:id="@+id/fab_fishing"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginStart="16dp"
+ android:layout_marginBottom="80dp"
+ android:src="@drawable/ic_fish"
+ android:contentDescription="Fishing mode"
+ app:fabSize="mini"
+ app:elevation="8dp"
+ app:layout_constraintBottom_toBottomOf="parent"
+ app:layout_constraintStart_toStartOf="parent" />
+
<com.google.android.material.button.MaterialButton
android:id="@+id/fab_recenter"
android:layout_width="wrap_content"