diff options
Diffstat (limited to 'android-app/app/src/main')
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> |
