summaryrefslogtreecommitdiff
path: root/android-app
diff options
context:
space:
mode:
Diffstat (limited to 'android-app')
-rw-r--r--android-app/app/src/main/kotlin/org/terst/nav/MainActivity.kt21
-rw-r--r--android-app/app/src/main/res/drawable/ic_night_mode.xml10
-rw-r--r--android-app/app/src/main/res/layout/activity_main.xml14
-rwxr-xr-xandroid-app/app/src/main/res/values/colors.xml29
-rwxr-xr-xandroid-app/app/src/main/res/values/themes.xml26
5 files changed, 90 insertions, 10 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()
diff --git a/android-app/app/src/main/res/drawable/ic_night_mode.xml b/android-app/app/src/main/res/drawable/ic_night_mode.xml
new file mode 100644
index 0000000..b19aeb7
--- /dev/null
+++ b/android-app/app/src/main/res/drawable/ic_night_mode.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24"
+ android:viewportHeight="24">
+ <path
+ android:fillColor="?attr/colorOnSurface"
+ android:pathData="M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9 9,-4.03 9,-9c0,-0.46-0.04,-0.92-0.1,-1.36-0.98,1.37-2.58,2.26-4.4,2.26-2.98,0-5.4,-2.42-5.4,-5.4 0,-1.81 0.89,-3.42 2.26,-4.4C13,3.04 12.54,3 12,3z"/>
+</vector>
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 6832daa..ca13105 100644
--- a/android-app/app/src/main/res/layout/activity_main.xml
+++ b/android-app/app/src/main/res/layout/activity_main.xml
@@ -53,6 +53,20 @@
app:layout_constraintTop_toBottomOf="@id/nav_hud"
app:layout_constraintEnd_toEndOf="parent" />
+ <!-- Night mode toggle FAB -->
+ <com.google.android.material.floatingactionbutton.FloatingActionButton
+ android:id="@+id/fab_night_mode"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="4dp"
+ android:layout_marginEnd="12dp"
+ android:contentDescription="Toggle night mode"
+ app:srcCompat="@drawable/ic_night_mode"
+ app:fabSize="mini"
+ app:elevation="8dp"
+ app:layout_constraintTop_toBottomOf="@id/fab_layers"
+ app:layout_constraintEnd_toEndOf="parent" />
+
<!-- Crosshair — visible when not following (panning) -->
<ImageView
android:id="@+id/map_crosshair"
diff --git a/android-app/app/src/main/res/values/colors.xml b/android-app/app/src/main/res/values/colors.xml
index c3b115c..5aefcae 100755
--- a/android-app/app/src/main/res/values/colors.xml
+++ b/android-app/app/src/main/res/values/colors.xml
@@ -56,11 +56,28 @@
<color name="wave_shimmer">#50FFFFFF</color>
<color name="wave_whitecap">#80FFFFFF</color>
- <!-- Night Vision Mode (Stays Red) -->
- <color name="night_red_primary">#FFFF0000</color>
- <color name="night_red_variant">#FFBB0000</color>
- <color name="night_on_red">#FF000000</color>
+ <!-- Night Vision Mode (red-on-black; preserves dark adaptation) -->
<color name="night_background">#FF000000</color>
- <color name="night_surface">#FF110000</color>
- <color name="night_on_surface">#FFFF0000</color>
+ <color name="night_surface">#FF0F0000</color>
+ <color name="night_surface_variant">#FF1C0000</color>
+ <color name="night_surface_bright">#FF200000</color>
+
+ <color name="night_on_surface">#FFFF3300</color>
+ <color name="night_on_surface_variant">#FFCC2200</color>
+
+ <color name="night_outline">#FF3D0000</color>
+ <color name="night_outline_variant">#FF1F0000</color>
+
+ <color name="night_primary">#FFFF3300</color>
+ <color name="night_on_primary">#FF000000</color>
+ <color name="night_primary_container">#FF1C0000</color>
+ <color name="night_on_primary_container">#FFFF3300</color>
+
+ <color name="night_secondary">#FF881100</color>
+ <color name="night_on_secondary">#FF000000</color>
+ <color name="night_secondary_container">#FF1C0000</color>
+ <color name="night_on_secondary_container">#FFFF3300</color>
+
+ <color name="night_error">#FFFF6B6B</color>
+ <color name="night_on_error">#FF000000</color>
</resources>
diff --git a/android-app/app/src/main/res/values/themes.xml b/android-app/app/src/main/res/values/themes.xml
index 93f5209..25af4e8 100755
--- a/android-app/app/src/main/res/values/themes.xml
+++ b/android-app/app/src/main/res/values/themes.xml
@@ -27,14 +27,32 @@
<item name="android:windowLightStatusBar">false</item>
</style>
- <!-- Night Vision Theme (Stays Dark and Red) -->
- <style name="Theme.Nav.NightVision" parent="Theme.Material3.DayNight.NoActionBar">
- <item name="colorPrimary">@color/night_red_primary</item>
- <item name="colorOnPrimary">@color/night_on_red</item>
+ <!-- Night Vision Theme (red-on-black; preserves dark adaptation) -->
+ <style name="Theme.Nav.NightVision" parent="Theme.Material3.Dark.NoActionBar">
+ <item name="colorPrimary">@color/night_primary</item>
+ <item name="colorOnPrimary">@color/night_on_primary</item>
+ <item name="colorPrimaryContainer">@color/night_primary_container</item>
+ <item name="colorOnPrimaryContainer">@color/night_on_primary_container</item>
+
+ <item name="colorSecondary">@color/night_secondary</item>
+ <item name="colorOnSecondary">@color/night_on_secondary</item>
+ <item name="colorSecondaryContainer">@color/night_secondary_container</item>
+ <item name="colorOnSecondaryContainer">@color/night_on_secondary_container</item>
+
<item name="android:colorBackground">@color/night_background</item>
<item name="colorSurface">@color/night_surface</item>
<item name="colorOnSurface">@color/night_on_surface</item>
+ <item name="colorSurfaceVariant">@color/night_surface_variant</item>
+ <item name="colorOnSurfaceVariant">@color/night_on_surface_variant</item>
+
+ <item name="colorOutline">@color/night_outline</item>
+ <item name="colorOutlineVariant">@color/night_outline_variant</item>
+
+ <item name="colorError">@color/night_error</item>
+ <item name="colorOnError">@color/night_on_error</item>
+
<item name="android:statusBarColor" tools:targetApi="l">@color/night_background</item>
+ <item name="android:navigationBarColor">@color/night_background</item>
<item name="android:windowLightStatusBar">false</item>
</style>