summaryrefslogtreecommitdiff
path: root/android-app/app/src/main/kotlin
diff options
context:
space:
mode:
authorClaude <noreply@anthropic.com>2026-06-03 01:01:00 +0000
committerClaude <noreply@anthropic.com>2026-06-03 01:01:00 +0000
commit17cfd884976b4accbb2ad6af6acf3578d0c6ec53 (patch)
tree84fc18c838474608cd2350fa0bcab70e3c9c09f6 /android-app/app/src/main/kotlin
parent4ce5fc170d1ac450764e5f7443e6cfaf089e9918 (diff)
Add night vision mode toggle
Single-tap moon FAB (stacked below layers FAB) toggles red-on-black night vision mode. NightVision theme now has a full M3 color palette (surface, surfaceVariant, outline, secondary, error) all in dark red tones. Screen brightness is set to 30% in night mode and restored to system default on exit. State persists across sessions; recreate() applies the theme switch cleanly. https://claude.ai/code/session_01KXYBuAHZkvv63DeUG6XaZD
Diffstat (limited to 'android-app/app/src/main/kotlin')
-rw-r--r--android-app/app/src/main/kotlin/org/terst/nav/MainActivity.kt21
1 files changed, 21 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 da887f4..69ca666 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
@@ -54,6 +54,7 @@ import org.terst.nav.ui.safety.SafetyFragment
import org.terst.nav.ui.vessel.VesselRegistryFragment
import org.terst.nav.ui.voicelog.VoiceLogFragment
import java.util.*
+import android.view.WindowManager
import org.terst.nav.data.model.MarineConditions
import org.terst.nav.safety.AnchorWatchState
@@ -61,6 +62,11 @@ class MainActivity : AppCompatActivity(), SafetyFragment.SafetyListener {
private val featureFlags get() = (application as NavApplication).featureFlags
+ private val nightModePrefs by lazy { getSharedPreferences("night_mode", MODE_PRIVATE) }
+ private var isNightMode: Boolean
+ get() = nightModePrefs.getBoolean("enabled", false)
+ set(v) { nightModePrefs.edit().putBoolean("enabled", v).apply() }
+
private var mapView: MapView? = null
private var mobHandler: MobHandler? = null
private var instrumentHandler: InstrumentHandler? = null
@@ -75,6 +81,7 @@ class MainActivity : AppCompatActivity(), SafetyFragment.SafetyListener {
private lateinit var fragmentContainer: FrameLayout
private lateinit var fabRecordTrack: FloatingActionButton
private lateinit var fabLayers: FloatingActionButton
+ private lateinit var fabNightMode: FloatingActionButton
private lateinit var fabRecenter: MaterialButton
private lateinit var bottomSheet: CardView
private lateinit var bottomNav: BottomNavigationView
@@ -134,6 +141,7 @@ class MainActivity : AppCompatActivity(), SafetyFragment.SafetyListener {
}
override fun onCreate(savedInstanceState: Bundle?) {
+ if (isNightMode) setTheme(R.style.Theme_Nav_NightVision)
super.onCreate(savedInstanceState)
MapLibre.getInstance(this)
setContentView(R.layout.activity_main)
@@ -200,10 +208,17 @@ class MainActivity : AppCompatActivity(), SafetyFragment.SafetyListener {
fragmentContainer = findViewById(R.id.fragment_container)
fabRecordTrack = findViewById(R.id.fab_record_track)
fabLayers = findViewById(R.id.fab_layers)
+ fabNightMode = findViewById(R.id.fab_night_mode)
fabRecenter = findViewById(R.id.fab_recenter)
fabLayers.setOnClickListener {
buildLayerPickerSheet().show(supportFragmentManager, "layer_picker")
}
+ fabNightMode.setOnClickListener {
+ isNightMode = !isNightMode
+ applyScreenBrightness()
+ recreate()
+ }
+ applyScreenBrightness()
bottomSheet = findViewById(R.id.instrument_bottom_sheet)
bottomNav = findViewById(R.id.bottom_navigation)
mapCrosshair = findViewById(R.id.map_crosshair)
@@ -307,6 +322,12 @@ class MainActivity : AppCompatActivity(), SafetyFragment.SafetyListener {
}
/** Updates all static unit label TextViews to match current [unitPrefs]. */
+ private fun applyScreenBrightness() {
+ val lp = window.attributes
+ lp.screenBrightness = if (isNightMode) 0.3f else WindowManager.LayoutParams.BRIGHTNESS_OVERRIDE_NONE
+ window.attributes = lp
+ }
+
private fun applyUnitLabels() {
unitHudSog.text = unitPrefs.speedUnitLabel()
unitHudBsp.text = unitPrefs.speedUnitLabel()