diff --git a/app/src/main/java/net/duhowpi/ftmsbridge/MainActivity.kt b/app/src/main/java/net/duhowpi/ftmsbridge/MainActivity.kt index 2237836..9906528 100644 --- a/app/src/main/java/net/duhowpi/ftmsbridge/MainActivity.kt +++ b/app/src/main/java/net/duhowpi/ftmsbridge/MainActivity.kt @@ -335,8 +335,9 @@ class MainActivity : AppCompatActivity() { if (isActiveTreadmill) showInclineControlDialog() else showResistanceControlDialog() } - binding.btnViewLap.setOnClickListener { setWorkoutView(false) } - binding.btnViewChart.setOnClickListener { setWorkoutView(true) } + binding.viewToggleRow.addOnButtonCheckedListener { _, checkedId, isChecked -> + if (isChecked) setWorkoutView(checkedId == R.id.btnViewChart) + } updateConnectionStatus() // Apply initial Idle UI (which also resets all metric displays). @@ -347,6 +348,7 @@ class MainActivity : AppCompatActivity() { private fun setWorkoutView(showChart: Boolean) { isChartViewActive = showChart + binding.viewToggleRow.check(if (showChart) R.id.btnViewChart else R.id.btnViewLap) binding.lapSection.visibility = if (!showChart) View.VISIBLE else View.GONE binding.chartSection.visibility = if (showChart) View.VISIBLE else View.GONE if (showChart) updateLiveChart() @@ -1161,9 +1163,7 @@ class MainActivity : AppCompatActivity() { binding.lapValueHr.text = "--" binding.lapUnitEnergy.setText(R.string.unit_kcal) // Default to lap view - isChartViewActive = false - binding.lapSection.visibility = View.VISIBLE - binding.chartSection.visibility = View.GONE + setWorkoutView(false) lifecycleScope.launch(Dispatchers.IO) { val session = WorkoutSession( startTimeMs = sessionStartTime, @@ -1824,11 +1824,9 @@ class MainActivity : AppCompatActivity() { stateMachine.applyUI() // Restore chart/lap view selection - binding.lapSection.visibility = if (!isChartViewActive) View.VISIBLE else View.GONE - binding.chartSection.visibility = if (isChartViewActive) View.VISIBLE else View.GONE + setWorkoutView(isChartViewActive) updateElapsedDisplay(elapsedTickSec) - if (isChartViewActive) updateLiveChart() } /** diff --git a/app/src/main/java/net/duhowpi/ftmsbridge/SessionStateMachine.kt b/app/src/main/java/net/duhowpi/ftmsbridge/SessionStateMachine.kt index 00007f0..a9d1d8b 100644 --- a/app/src/main/java/net/duhowpi/ftmsbridge/SessionStateMachine.kt +++ b/app/src/main/java/net/duhowpi/ftmsbridge/SessionStateMachine.kt @@ -128,7 +128,6 @@ class SessionStateMachine( // Toolbar status icons hidden binding.toolbarStatusIcons.visibility = View.GONE - binding.recordingIndicator.visibility = View.GONE // Connection indicators applyConnectionIndicators(ftmsConnected = false, hrConnected = false, hasHrDevice = false) @@ -148,7 +147,6 @@ class SessionStateMachine( binding.metricsSection.visibility = View.GONE binding.workoutButtonRow.visibility = View.GONE binding.toolbarStatusIcons.visibility = View.GONE - binding.recordingIndicator.visibility = View.GONE } // --- Connected ----------------------------------------------------------- @@ -181,7 +179,6 @@ class SessionStateMachine( // Toolbar status binding.toolbarStatusIcons.visibility = View.GONE - binding.recordingIndicator.visibility = View.GONE applyConnectionIndicators(ftmsConnected, hrConnected, hasHrDevice) @@ -208,7 +205,6 @@ class SessionStateMachine( // Hide device header; show compact toolbar indicators binding.deviceHeaderRow.visibility = View.GONE - binding.recordingIndicator.visibility = View.GONE binding.toolbarStatusIcons.visibility = View.VISIBLE applyConnectionIndicators(ftmsConnected, hrConnected, hasHrDevice) binding.toolbarIndicatorHr.visibility = if (hasHrDevice) View.VISIBLE else View.GONE @@ -263,7 +259,6 @@ class SessionStateMachine( binding.rvScanResults.visibility = View.GONE binding.txtScanStatus.visibility = View.GONE binding.deviceHeaderRow.visibility = View.GONE - binding.recordingIndicator.visibility = View.GONE binding.toolbarStatusIcons.visibility = View.VISIBLE applyConnectionIndicators(ftmsConnected = false, hrConnected = false, hasHrDevice = false) diff --git a/app/src/main/res/drawable/ic_play.xml b/app/src/main/res/drawable/ic_play.xml new file mode 100644 index 0000000..82fc1ed --- /dev/null +++ b/app/src/main/res/drawable/ic_play.xml @@ -0,0 +1,10 @@ + + + + diff --git a/app/src/main/res/layout-land/activity_main.xml b/app/src/main/res/layout-land/activity_main.xml index 7c34939..12fac59 100644 --- a/app/src/main/res/layout-land/activity_main.xml +++ b/app/src/main/res/layout-land/activity_main.xml @@ -308,24 +308,24 @@ android:layout_height="160dp" /> - + android:visibility="gone" + app:singleSelection="true" + app:selectionRequired="true" + app:checkedButton="@id/btnViewLap"> @@ -337,10 +337,9 @@ android:layout_weight="1" android:text="@string/view_chart" android:textSize="11sp" - android:layout_marginStart="4dp" app:icon="@drawable/ic_chart" app:iconSize="16dp" /> - + - - - - + app:icon="@drawable/ic_play" + app:iconSize="16dp" /> diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 8ec9fbd..6d26c0f 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -329,24 +329,24 @@ android:layout_height="220dp" /> - + android:visibility="gone" + app:singleSelection="true" + app:selectionRequired="true" + app:checkedButton="@id/btnViewLap"> @@ -358,10 +358,9 @@ android:layout_weight="1" android:text="@string/view_chart" android:textSize="13sp" - android:layout_marginStart="4dp" app:icon="@drawable/ic_chart" app:iconSize="18dp" /> - + - - - - + app:icon="@drawable/ic_play" /> diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index fe4cd92..bfc9284 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -14,17 +14,11 @@ Calen permisos de Bluetooth - Iniciar - Aturar - ● REC - ⏸ EN PAUSA - ◀ Tornar + Tornar - ▶ Iniciar - ⏸ Pausar - ▶ Reprendre - ◼ Aturar + Iniciar + Aturar Historial diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index f3da9d3..f6b7431 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -14,17 +14,11 @@ Se requieren permisos de Bluetooth - Iniciar - Detener - ● REC - ⏸ EN PAUSA - ◀ Volver + Volver - ▶ Iniciar - ⏸ Pausar - ▶ Reanudar - ◼ Detener + Iniciar + Detener Historial diff --git a/app/src/main/res/values-night/colors.xml b/app/src/main/res/values-night/colors.xml new file mode 100644 index 0000000..3e581eb --- /dev/null +++ b/app/src/main/res/values-night/colors.xml @@ -0,0 +1,23 @@ + + + + #90CAF9 + #EF9A9A + #A5D6A7 + #FFB74D + #CE93D8 + #FFF176 + #80CBC4 + #BCAAA4 + #9FA8DA + + #0D2A45 + #3E1518 + #12321A + #3A2410 + #2E1236 + #33300E + #0C2B28 + #2B211E + #171C3B + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 6cffabe..794ffd8 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -14,17 +14,11 @@ Bluetooth permissions are required - Start - Stop - ● REC - ⏸ PAUSED - ◀ Back + Back - ▶ Start - ⏸ Pause - ▶ Resume - ◼ Stop + Start + Stop History diff --git a/fastlane/metadata/android/en-US/changelogs/6.txt b/fastlane/metadata/android/en-US/changelogs/6.txt index 34e6ea1..d8a6c4f 100644 --- a/fastlane/metadata/android/en-US/changelogs/6.txt +++ b/fastlane/metadata/android/en-US/changelogs/6.txt @@ -1 +1,4 @@ -Add user-facing changes for the next release here. +- Cleaner workout controls: proper play/stop icons instead of text symbols +- Lap/Chart switch now highlights the active view +- Metric cards now adapt to dark mode +- Removed unused on-screen elements diff --git a/tools/lint.py b/tools/lint.py index 6b4232c..8a45a8d 100755 --- a/tools/lint.py +++ b/tools/lint.py @@ -20,6 +20,7 @@ from __future__ import annotations import argparse +import re import sys from pathlib import Path from xml.etree import ElementTree as ET @@ -108,6 +109,10 @@ def _check_language_parity() -> list[str]: return [] base_names = _get_string_names(base) for lang_dir in sorted(RES_DIR.glob("values-*")): + # Only locale qualifiers (e.g. values-es, values-zh-rCN); skip + # mode/config qualifiers like values-night or values-v31. + if not re.fullmatch(r"values-[a-z]{2,3}(-r[A-Z]{2})?", lang_dir.name): + continue lang_file = lang_dir / "strings.xml" if not lang_file.exists(): issues.append(f"{lang_dir.name}: missing strings.xml")