From b98f267e3d2ca8cf3b6c0118ad27e13be6b81b10 Mon Sep 17 00:00:00 2001 From: Peter Stone Date: Wed, 1 Jul 2026 06:50:34 +0000 Subject: feat(ui): rewrite LayerPickerSheet — Windy-style cards, full-height, ATON/TSS MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/kotlin/org/terst/nav/MainActivity.kt | 2 + .../kotlin/org/terst/nav/ui/LayerPickerSheet.kt | 126 ++++++++++++++------- 2 files changed, 89 insertions(+), 39 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 4b090e7..7de7da8 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 @@ -436,6 +436,8 @@ class MainActivity : AppCompatActivity(), SafetyFragment.SafetyListener { val style = loadedStyleFlow.value ?: return@LayerPickerSheet layerManager.setSstEnabled(style, enabled) }, + onAtonChanged = { _ -> }, + onTssChanged = { _ -> }, unitPrefs = unitPrefs, onUnitsChanged = { refreshUnits() } ) 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 b83b638..b60af50 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 @@ -1,12 +1,16 @@ package org.terst.nav.ui +import android.app.Dialog import android.os.Bundle +import android.util.TypedValue import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import com.google.android.material.bottomsheet.BottomSheetBehavior +import com.google.android.material.bottomsheet.BottomSheetDialog import com.google.android.material.bottomsheet.BottomSheetDialogFragment -import com.google.android.material.chip.ChipGroup import com.google.android.material.card.MaterialCardView +import com.google.android.material.chip.ChipGroup import com.google.android.material.switchmaterial.SwitchMaterial import org.terst.nav.DepthUnit import org.terst.nav.PressureUnit @@ -25,55 +29,98 @@ class LayerPickerSheet( private val onDepthChanged: (Boolean) -> Unit, private val onFadsChanged: (Boolean) -> Unit, private val onSstChanged: (Boolean) -> Unit, + private val onAtonChanged: (Boolean) -> Unit, + private val onTssChanged: (Boolean) -> Unit, private val unitPrefs: UnitPrefs, private val onUnitsChanged: () -> Unit ) : BottomSheetDialogFragment() { + override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { + val dialog = super.onCreateDialog(savedInstanceState) as BottomSheetDialog + dialog.setOnShowListener { + val sheet = dialog.findViewById(com.google.android.material.R.id.design_bottom_sheet) + sheet?.let { + val behavior = BottomSheetBehavior.from(it) + behavior.state = BottomSheetBehavior.STATE_EXPANDED + behavior.skipCollapsed = true + it.layoutParams.height = ViewGroup.LayoutParams.MATCH_PARENT + } + } + return dialog + } + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View = inflater.inflate(R.layout.layout_layer_picker_sheet, container, false) override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - // ── Base map cards (TODO Task 7: wire up click listeners) ──────────── - // chip_group_base / chip_ocean / chip_satellite / chip_charts / chip_hybrid - // replaced by card_ocean / card_satellite / card_charts / card_hybrid - // Full wiring deferred to Task 7 rewrite. - - // ── Wind overlay switch ─────────────────────────────────────────────── - val windSwitch = view.findViewById(R.id.switch_wind) - windSwitch.isChecked = manager.windEnabled - windSwitch.setOnCheckedChangeListener { _, checked -> onWindChanged(checked) } - - // ── Particles switch ────────────────────────────────────────────────── - val particlesSwitch = view.findViewById(R.id.switch_particles) - particlesSwitch.isChecked = manager.particlesEnabled - particlesSwitch.setOnCheckedChangeListener { _, checked -> onParticlesChanged(checked) } + bindBaseMapCards(view) + bindOverlayToggles(view) + bindUnits(view) + } - // ── Past tracks switch ──────────────────────────────────────────────── - val pastTracksSwitch = view.findViewById(R.id.switch_past_tracks) - pastTracksSwitch.isChecked = manager.pastTracksEnabled - pastTracksSwitch.setOnCheckedChangeListener { _, checked -> onPastTracksChanged(checked) } + private fun bindBaseMapCards(view: View) { + val cards = listOf(R.id.card_ocean, R.id.card_satellite, R.id.card_charts, R.id.card_hybrid) + .map { view.findViewById(it) } + val presets = listOf(MapBasePreset.OCEAN, MapBasePreset.SATELLITE, MapBasePreset.CHARTS, MapBasePreset.HYBRID) + val selectedStroke = dpToPx(2) - // ── Seamarks switch ─────────────────────────────────────────────────── - val seamarksSwitch = view.findViewById(R.id.switch_seamarks) - seamarksSwitch.isChecked = manager.seamarksEnabled - seamarksSwitch.setOnCheckedChangeListener { _, checked -> onSeamarksChanged(checked) } + fun select(preset: MapBasePreset) { + cards.forEachIndexed { i, card -> + card.strokeWidth = if (presets[i] == preset) selectedStroke else 0 + } + } - // ── Depth contours switch ───────────────────────────────────────────── - val depthSwitch = view.findViewById(R.id.switch_depth) - depthSwitch.isChecked = manager.depthEnabled - depthSwitch.setOnCheckedChangeListener { _, checked -> onDepthChanged(checked) } + select(manager.basePreset) + cards.forEachIndexed { i, card -> + card.setOnClickListener { + select(presets[i]) + onBaseChanged(presets[i]) + } + } + } - // ── FADs switch ─────────────────────────────────────────────────────── - val fadsSwitch = view.findViewById(R.id.switch_fads) - fadsSwitch.isChecked = manager.fadsEnabled - fadsSwitch.setOnCheckedChangeListener { _, checked -> onFadsChanged(checked) } + private fun bindOverlayToggles(view: View) { + fun switch(id: Int): SwitchMaterial = view.findViewById(id) - // ── SST switch ──────────────────────────────────────────────────────── - val sstSwitch = view.findViewById(R.id.switch_sst) - sstSwitch.isChecked = manager.sstEnabled - sstSwitch.setOnCheckedChangeListener { _, checked -> onSstChanged(checked) } + switch(R.id.switch_wind).apply { + isChecked = manager.windEnabled + setOnCheckedChangeListener { _, checked -> onWindChanged(checked) } + } + switch(R.id.switch_particles).apply { + isChecked = manager.particlesEnabled + setOnCheckedChangeListener { _, checked -> onParticlesChanged(checked) } + } + switch(R.id.switch_past_tracks).apply { + isChecked = manager.pastTracksEnabled + setOnCheckedChangeListener { _, checked -> onPastTracksChanged(checked) } + } + switch(R.id.switch_seamarks).apply { + isChecked = manager.seamarksEnabled + setOnCheckedChangeListener { _, checked -> onSeamarksChanged(checked) } + } + switch(R.id.switch_depth).apply { + isChecked = manager.depthEnabled + setOnCheckedChangeListener { _, checked -> onDepthChanged(checked) } + } + switch(R.id.switch_fads).apply { + isChecked = manager.fadsEnabled + setOnCheckedChangeListener { _, checked -> onFadsChanged(checked) } + } + switch(R.id.switch_sst).apply { + isChecked = manager.sstEnabled + setOnCheckedChangeListener { _, checked -> onSstChanged(checked) } + } + switch(R.id.switch_aton).apply { + isChecked = manager.atonEnabled + setOnCheckedChangeListener { _, checked -> onAtonChanged(checked) } + } + switch(R.id.switch_tss).apply { + isChecked = manager.tssEnabled + setOnCheckedChangeListener { _, checked -> onTssChanged(checked) } + } + } - // ── Temperature chips ───────────────────────────────────────────────── + private fun bindUnits(view: View) { val chipTemp = view.findViewById(R.id.chip_group_temp) chipTemp.check(when (unitPrefs.tempUnit) { TempUnit.FAHRENHEIT -> R.id.chip_fahrenheit @@ -88,7 +135,6 @@ class LayerPickerSheet( onUnitsChanged() } - // ── Depth chips ─────────────────────────────────────────────────────── val chipDepth = view.findViewById(R.id.chip_group_depth) chipDepth.check(when (unitPrefs.depthUnit) { DepthUnit.FEET -> R.id.chip_feet @@ -103,7 +149,6 @@ class LayerPickerSheet( onUnitsChanged() } - // ── Pressure chips ──────────────────────────────────────────────────── val chipPressure = view.findViewById(R.id.chip_group_pressure) chipPressure.check(when (unitPrefs.pressureUnit) { PressureUnit.HPA -> R.id.chip_hpa @@ -118,7 +163,6 @@ class LayerPickerSheet( onUnitsChanged() } - // ── Speed chips ─────────────────────────────────────────────────────── val chipSpeed = view.findViewById(R.id.chip_group_speed) chipSpeed.check(when (unitPrefs.speedUnit) { SpeedUnit.KNOTS -> R.id.chip_knots @@ -135,4 +179,8 @@ class LayerPickerSheet( onUnitsChanged() } } + + private fun dpToPx(dp: Int): Int = + TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp.toFloat(), + resources.displayMetrics).toInt() } -- cgit v1.2.3