summaryrefslogtreecommitdiff
path: root/android-app
diff options
context:
space:
mode:
authorPeter Stone <thepeterstone@gmail.com>2026-07-01 06:29:20 +0000
committerPeter Stone <thepeterstone@gmail.com>2026-07-01 06:29:20 +0000
commitb2e8624b8d1e4a545449d5e81d19fd45a57801a2 (patch)
tree9d4608484dc52034c4b31c179e1f0f8a1326e3d4 /android-app
parentc92dcd0d6407e506c84ca8bb79ab395257d7c392 (diff)
feat(layers): OCEAN base preset (Esri), ATON/TSS pref keys, all defaults false
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/ui/LayerPickerSheet.kt2
-rw-r--r--android-app/app/src/main/kotlin/org/terst/nav/ui/MapLayerManager.kt52
-rw-r--r--android-app/app/src/main/res/layout/layout_layer_picker_sheet.xml7
3 files changed, 52 insertions, 9 deletions
diff --git a/android-app/app/src/main/kotlin/org/terst/nav/ui/LayerPickerSheet.kt b/android-app/app/src/main/kotlin/org/terst/nav/ui/LayerPickerSheet.kt
index b654184..81346a8 100644
--- a/android-app/app/src/main/kotlin/org/terst/nav/ui/LayerPickerSheet.kt
+++ b/android-app/app/src/main/kotlin/org/terst/nav/ui/LayerPickerSheet.kt
@@ -35,12 +35,14 @@ class LayerPickerSheet(
// ── Base layer chips ──────────────────────────────────────────────────
val chipGroup = view.findViewById<ChipGroup>(R.id.chip_group_base)
chipGroup.check(when (manager.basePreset) {
+ MapBasePreset.OCEAN -> R.id.chip_ocean
MapBasePreset.SATELLITE -> R.id.chip_satellite
MapBasePreset.CHARTS -> R.id.chip_charts
MapBasePreset.HYBRID -> R.id.chip_hybrid
})
chipGroup.setOnCheckedStateChangeListener { _, checkedIds ->
val preset = when (checkedIds.firstOrNull()) {
+ R.id.chip_ocean -> MapBasePreset.OCEAN
R.id.chip_satellite -> MapBasePreset.SATELLITE
R.id.chip_charts -> MapBasePreset.CHARTS
R.id.chip_hybrid -> MapBasePreset.HYBRID
diff --git a/android-app/app/src/main/kotlin/org/terst/nav/ui/MapLayerManager.kt b/android-app/app/src/main/kotlin/org/terst/nav/ui/MapLayerManager.kt
index 73f6684..19f8801 100644
--- a/android-app/app/src/main/kotlin/org/terst/nav/ui/MapLayerManager.kt
+++ b/android-app/app/src/main/kotlin/org/terst/nav/ui/MapLayerManager.kt
@@ -7,7 +7,7 @@ import org.maplibre.android.style.layers.RasterLayer
import org.maplibre.android.style.sources.RasterSource
import org.maplibre.android.style.sources.TileSet
-enum class MapBasePreset { SATELLITE, CHARTS, HYBRID }
+enum class MapBasePreset { OCEAN, SATELLITE, CHARTS, HYBRID }
/**
* Manages the raster layer stack: base imagery (satellite / NOAA charts / hybrid),
@@ -26,30 +26,36 @@ class MapLayerManager(context: Context) {
var basePreset: MapBasePreset = loadBasePreset()
private set
- var windEnabled: Boolean = prefs.getBoolean(KEY_WIND, true)
+ var windEnabled: Boolean = prefs.getBoolean(KEY_WIND, false)
private set
- var particlesEnabled: Boolean = prefs.getBoolean(KEY_PARTICLES, true)
+ var particlesEnabled: Boolean = prefs.getBoolean(KEY_PARTICLES, false)
private set
- var pastTracksEnabled: Boolean = prefs.getBoolean(KEY_PAST_TRACKS, true)
+ var pastTracksEnabled: Boolean = prefs.getBoolean(KEY_PAST_TRACKS, false)
private set
- var seamarksEnabled: Boolean = prefs.getBoolean(KEY_SEAMARKS, true)
+ var seamarksEnabled: Boolean = prefs.getBoolean(KEY_SEAMARKS, false)
private set
- var depthEnabled: Boolean = prefs.getBoolean(KEY_DEPTH, false)
+ var depthEnabled: Boolean = prefs.getBoolean(KEY_DEPTH, false)
private set
- var fadsEnabled: Boolean = prefs.getBoolean(KEY_FADS, true)
+ var fadsEnabled: Boolean = prefs.getBoolean(KEY_FADS, false)
private set
- var sstEnabled: Boolean = prefs.getBoolean(KEY_SST, false)
+ var sstEnabled: Boolean = prefs.getBoolean(KEY_SST, false)
+ private set
+ var atonEnabled: Boolean = prefs.getBoolean(KEY_ATON, false)
+ private set
+ var tssEnabled: Boolean = prefs.getBoolean(KEY_TSS, false)
private set
// ── Source / Layer IDs ────────────────────────────────────────────────────
companion object {
+ const val SOURCE_OCEAN = "esri-ocean-source"
const val SOURCE_SATELLITE = "satellite-source"
const val SOURCE_CHARTS = "charts-source"
const val SOURCE_WIND = "wind-source"
const val SOURCE_SEAMARKS = "openseamap-source"
const val SOURCE_DEPTH = "osm-depth-source"
+ const val LAYER_OCEAN = "esri-ocean-layer"
const val LAYER_SATELLITE = "satellite-layer"
const val LAYER_CHARTS = "charts-layer"
const val LAYER_WIND = "wind-layer"
@@ -66,8 +72,13 @@ class MapLayerManager(context: Context) {
private const val KEY_DEPTH = "depth_enabled"
private const val KEY_FADS = "fads_enabled"
private const val KEY_SST = "sst_enabled"
+ private const val KEY_ATON = "aton_enabled"
+ private const val KEY_TSS = "tss_enabled"
// Tile URLs
+ // Esri uses {z}/{y}/{x} order (row before col); MapLibre {y}=row, {x}=col — correct
+ private const val URL_OCEAN =
+ "https://server.arcgisonline.com/ArcGIS/rest/services/Ocean/World_Ocean_Base/MapServer/tile/{z}/{y}/{x}"
private const val URL_SATELLITE =
"https://mt1.google.com/vt/lyrs=s&x={x}&y={y}&z={z}"
private const val URL_CHARTS =
@@ -97,6 +108,9 @@ class MapLayerManager(context: Context) {
*/
fun addToStyleBuilder(builder: Style.Builder) {
// ── Sources ───────────────────────────────────────────────────────────
+ builder.withSource(RasterSource(SOURCE_OCEAN,
+ TileSet("2.2.0", URL_OCEAN), 256))
+
builder.withSource(RasterSource(SOURCE_SATELLITE,
TileSet("2.2.0", URL_SATELLITE), 256))
@@ -116,6 +130,11 @@ class MapLayerManager(context: Context) {
TileSet("2.2.0", URL_SST), 256))
// ── Layers (bottom → top within raster stack) ─────────────────────────
+ builder.withLayer(RasterLayer(LAYER_OCEAN, SOURCE_OCEAN).apply {
+ setProperties(PropertyFactory.rasterOpacity(1f))
+ setProperties(PropertyFactory.visibility(visibilityFor(basePreset, LAYER_OCEAN)))
+ })
+
builder.withLayer(RasterLayer(LAYER_SATELLITE, SOURCE_SATELLITE).apply {
setProperties(PropertyFactory.rasterOpacity(1f))
setProperties(PropertyFactory.visibility(visibilityFor(basePreset, LAYER_SATELLITE)))
@@ -152,6 +171,8 @@ class MapLayerManager(context: Context) {
basePreset = preset
prefs.edit().putString(KEY_BASE, preset.name).apply()
+ style.getLayer(LAYER_OCEAN)?.setProperties(
+ PropertyFactory.visibility(visibilityFor(preset, LAYER_OCEAN)))
style.getLayer(LAYER_SATELLITE)?.setProperties(
PropertyFactory.visibility(visibilityFor(preset, LAYER_SATELLITE)))
style.getLayer(LAYER_CHARTS)?.let {
@@ -204,9 +225,22 @@ class MapLayerManager(context: Context) {
prefs.edit().putBoolean(KEY_PAST_TRACKS, enabled).apply()
}
+ /** ATONs are a vector layer in MapHandler; this just persists the pref. */
+ fun setAtonEnabled(enabled: Boolean) {
+ atonEnabled = enabled
+ prefs.edit().putBoolean(KEY_ATON, enabled).apply()
+ }
+
+ /** TSS zones are a vector layer in MapHandler; this just persists the pref. */
+ fun setTssEnabled(enabled: Boolean) {
+ tssEnabled = enabled
+ prefs.edit().putBoolean(KEY_TSS, enabled).apply()
+ }
+
// ── Helpers ───────────────────────────────────────────────────────────────
private fun visibilityFor(preset: MapBasePreset, layerId: String): String = when (layerId) {
+ LAYER_OCEAN -> if (preset == MapBasePreset.OCEAN) "visible" else "none"
LAYER_SATELLITE -> if (preset == MapBasePreset.SATELLITE || preset == MapBasePreset.HYBRID) "visible" else "none"
LAYER_CHARTS -> if (preset == MapBasePreset.CHARTS || preset == MapBasePreset.HYBRID) "visible" else "none"
else -> "visible"
@@ -218,5 +252,5 @@ class MapLayerManager(context: Context) {
private fun loadBasePreset(): MapBasePreset =
prefs.getString(KEY_BASE, null)?.let {
runCatching { MapBasePreset.valueOf(it) }.getOrNull()
- } ?: MapBasePreset.CHARTS
+ } ?: MapBasePreset.OCEAN
}
diff --git a/android-app/app/src/main/res/layout/layout_layer_picker_sheet.xml b/android-app/app/src/main/res/layout/layout_layer_picker_sheet.xml
index 0707425..b8db879 100644
--- a/android-app/app/src/main/res/layout/layout_layer_picker_sheet.xml
+++ b/android-app/app/src/main/res/layout/layout_layer_picker_sheet.xml
@@ -45,6 +45,13 @@
app:selectionRequired="true">
<com.google.android.material.chip.Chip
+ android:id="@+id/chip_ocean"
+ style="@style/Widget.Material3.Chip.Filter"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="Ocean" />
+
+ <com.google.android.material.chip.Chip
android:id="@+id/chip_satellite"
style="@style/Widget.Material3.Chip.Filter"
android:layout_width="wrap_content"