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