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")