summaryrefslogtreecommitdiff
path: root/android-app/app/src/main/kotlin
diff options
context:
space:
mode:
authorClaude <noreply@anthropic.com>2026-04-10 22:47:27 +0000
committerClaude <noreply@anthropic.com>2026-04-10 22:47:27 +0000
commitfc7192288109fc3542670cbeeaebe0de2a75eb74 (patch)
treed78d33ad92fb32e6a57ea3df0ebf327540597d0e /android-app/app/src/main/kotlin
parentb01a638674a313355664cc387e7da0d77a9c32d0 (diff)
Add Learn tab; move quit to Safety; remove persistent MOB FAB
UI cleanup: - Remove always-visible MOB FAB — Safety screen button is sufficient - Remove floating quit button; move to bottom of Safety screen - fragment_container is now clickable/focusable, blocking map touch-through for all overlays (trip reports, log, safety) - Record Track FAB hidden while any overlay is shown, visible on map tab New Learn tab (5th nav item): - Migration guides for Navionics and Sea People (local markdown via DocFragment) - ASA Course Catalog, ASA Online Learning, ColRegs, Sailing Flashcards (open in browser) - Remove blanket assets/ .gitignore so markdown docs are tracked https://claude.ai/code/session_01HXPjBsogsJVRwCiekDGkJX
Diffstat (limited to 'android-app/app/src/main/kotlin')
-rw-r--r--android-app/app/src/main/kotlin/org/terst/nav/MainActivity.kt20
-rw-r--r--android-app/app/src/main/kotlin/org/terst/nav/ui/learn/LearnFragment.kt56
-rw-r--r--android-app/app/src/main/kotlin/org/terst/nav/ui/safety/SafetyFragment.kt5
3 files changed, 72 insertions, 9 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 86dd531..996892e 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,9 +54,7 @@ class MainActivity : AppCompatActivity(), SafetyFragment.SafetyListener {
private lateinit var bottomSheetBehavior: BottomSheetBehavior<View>
private lateinit var fragmentContainer: FrameLayout
private lateinit var fabRecordTrack: FloatingActionButton
- private lateinit var fabMob: FloatingActionButton
private lateinit var fabRecenter: MaterialButton
- private lateinit var btnQuit: MaterialButton
private lateinit var bottomSheet: CardView
private lateinit var bottomNav: BottomNavigationView
private lateinit var mapCrosshair: View
@@ -117,9 +115,7 @@ class MainActivity : AppCompatActivity(), SafetyFragment.SafetyListener {
private fun initializeUI() {
fragmentContainer = findViewById(R.id.fragment_container)
fabRecordTrack = findViewById(R.id.fab_record_track)
- fabMob = findViewById(R.id.fab_mob)
fabRecenter = findViewById(R.id.fab_recenter)
- btnQuit = findViewById(R.id.btn_quit)
bottomSheet = findViewById(R.id.instrument_bottom_sheet)
bottomNav = findViewById(R.id.bottom_navigation)
mapCrosshair = findViewById(R.id.map_crosshair)
@@ -166,9 +162,7 @@ class MainActivity : AppCompatActivity(), SafetyFragment.SafetyListener {
} else false
}
- fabMob.setOnClickListener { onActivateMob() }
fabRecenter.setOnClickListener { mapHandler?.recenter() }
- btnQuit.setOnClickListener { onQuitRequested() }
lifecycleScope.launch {
viewModel.isRecording.collect { recording ->
@@ -280,6 +274,12 @@ class MainActivity : AppCompatActivity(), SafetyFragment.SafetyListener {
bottomSheetBehavior.state = BottomSheetBehavior.STATE_HIDDEN
true
}
+ R.id.nav_learn -> {
+ showOverlay(org.terst.nav.ui.learn.LearnFragment())
+ bottomSheetBehavior.isHideable = true
+ bottomSheetBehavior.state = BottomSheetBehavior.STATE_HIDDEN
+ true
+ }
else -> false
}
}
@@ -287,6 +287,7 @@ class MainActivity : AppCompatActivity(), SafetyFragment.SafetyListener {
private fun showOverlay(fragment: androidx.fragment.app.Fragment) {
fragmentContainer.visibility = View.VISIBLE
+ fabRecordTrack.visibility = View.GONE
supportFragmentManager.beginTransaction()
.replace(R.id.fragment_container, fragment)
.commit()
@@ -294,9 +295,10 @@ class MainActivity : AppCompatActivity(), SafetyFragment.SafetyListener {
private fun hideOverlays() {
fragmentContainer.visibility = View.GONE
+ fabRecordTrack.visibility = View.VISIBLE
}
- private fun onQuitRequested() {
+ override fun onQuitRequested() {
if (viewModel.isRecording.value) {
androidx.appcompat.app.AlertDialog.Builder(this)
.setMessage("Recording in progress. Quit and discard the current track?")
@@ -405,9 +407,9 @@ class MainActivity : AppCompatActivity(), SafetyFragment.SafetyListener {
mapCrosshair.visibility = if (following) View.GONE else View.VISIBLE
if (following) {
fadeOut(fabRecenter, gone = true)
- fadeIn(bottomNav, fabMob, fabRecordTrack)
+ fadeIn(bottomNav, fabRecordTrack)
} else {
- fadeOut(bottomNav, fabMob, fabRecordTrack, gone = true)
+ fadeOut(bottomNav, fabRecordTrack, gone = true)
fadeIn(fabRecenter)
}
}
diff --git a/android-app/app/src/main/kotlin/org/terst/nav/ui/learn/LearnFragment.kt b/android-app/app/src/main/kotlin/org/terst/nav/ui/learn/LearnFragment.kt
new file mode 100644
index 0000000..8440edb
--- /dev/null
+++ b/android-app/app/src/main/kotlin/org/terst/nav/ui/learn/LearnFragment.kt
@@ -0,0 +1,56 @@
+package org.terst.nav.ui.learn
+
+import android.content.Intent
+import android.net.Uri
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import androidx.fragment.app.Fragment
+import com.google.android.material.card.MaterialCardView
+import org.terst.nav.R
+import org.terst.nav.ui.doc.DocFragment
+
+class LearnFragment : Fragment() {
+
+ override fun onCreateView(
+ inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
+ ): View? = inflater.inflate(R.layout.fragment_learn, container, false)
+
+ override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+ super.onViewCreated(view, savedInstanceState)
+
+ // Migration guides — open local markdown docs
+ view.findViewById<MaterialCardView>(R.id.card_migrate_navionics).setOnClickListener {
+ openDoc("docs/migrate_navionics.md")
+ }
+ view.findViewById<MaterialCardView>(R.id.card_migrate_seapeople).setOnClickListener {
+ openDoc("docs/migrate_sea_people.md")
+ }
+
+ // ASA / external links — open in browser
+ view.findViewById<MaterialCardView>(R.id.card_asa_courses).setOnClickListener {
+ openUrl("https://www.asa.com/courses/")
+ }
+ view.findViewById<MaterialCardView>(R.id.card_asa_online).setOnClickListener {
+ openUrl("https://www.asa.com/online-courses/")
+ }
+ view.findViewById<MaterialCardView>(R.id.card_colregs).setOnClickListener {
+ openUrl("https://www.navcen.uscg.gov/international-regulations-for-preventing-collisions-at-sea")
+ }
+ view.findViewById<MaterialCardView>(R.id.card_flashcards).setOnClickListener {
+ openUrl("https://quizlet.com/subject/sailing/")
+ }
+ }
+
+ private fun openDoc(path: String) {
+ parentFragmentManager.beginTransaction()
+ .replace(R.id.fragment_container, DocFragment.newInstance(path))
+ .addToBackStack(null)
+ .commit()
+ }
+
+ private fun openUrl(url: String) {
+ startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(url)))
+ }
+}
diff --git a/android-app/app/src/main/kotlin/org/terst/nav/ui/safety/SafetyFragment.kt b/android-app/app/src/main/kotlin/org/terst/nav/ui/safety/SafetyFragment.kt
index 4bc0c7a..6dd7411 100644
--- a/android-app/app/src/main/kotlin/org/terst/nav/ui/safety/SafetyFragment.kt
+++ b/android-app/app/src/main/kotlin/org/terst/nav/ui/safety/SafetyFragment.kt
@@ -15,6 +15,7 @@ class SafetyFragment : Fragment() {
interface SafetyListener {
fun onActivateMob()
fun onConfigureAnchor()
+ fun onQuitRequested()
}
private var listener: SafetyListener? = null
@@ -55,6 +56,10 @@ class SafetyFragment : Fragment() {
.addToBackStack(null)
.commit()
}
+
+ view.findViewById<MaterialButton>(R.id.button_quit).setOnClickListener {
+ listener?.onQuitRequested()
+ }
}
fun updateAnchorStatus(statusText: String) {