diff options
| author | Peter Stone <thepeterstone@gmail.com> | 2026-06-30 18:48:39 +0000 |
|---|---|---|
| committer | Peter Stone <thepeterstone@gmail.com> | 2026-06-30 18:48:39 +0000 |
| commit | ddfeae7a5f109fc4e993e6697b961ea652360fc2 (patch) | |
| tree | 0369ad141c7cb916f5e1f4fe1fbbf491e78aaaca /android-app | |
| parent | 8233794366939f614a9899a11f2b7093bc32d9b8 (diff) | |
feat(fishing): wire fishing mode FAB and overlay in MainActivity
Adds FishingOverlayView + fab_fishing to layout, initializes FishingModeManager,
and wires FAB click to toggle fishing mode with SST layer and target overlay.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Diffstat (limited to 'android-app')
| -rw-r--r-- | android-app/app/src/main/kotlin/org/terst/nav/MainActivity.kt | 44 | ||||
| -rw-r--r-- | android-app/app/src/main/res/layout/activity_main.xml | 25 |
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" |
