feat: prioritize Bluetooth sensor data over GPS

- Restructured sensor logic to give absolute priority to Bluetooth sensors, largely ignoring GPS data for distance and speed calculations.
- Implemented downstream UI expansions, custom recording layouts, and new settings to reflect and control the new sensor-first flow.
- Added MediaNotificationListenerService and integrated media playback tracking within statistics.
- Modified VoiceAnnouncementUtils to harmonize announcements with the updated architecture.
- Added 'About This Fork' section to the README.

Note: These modifications were co-created with Antigravity AI.
This commit is contained in:
2026-09-11 14:02:57 +02:00
parent 00be0b565c
commit 7c6141f98c
50 changed files with 4338 additions and 62 deletions
@@ -143,7 +143,6 @@ public class TrackStatisticsUpdater {
}
{
// Update total distance
Distance movingDistance = null;
if (trackPoint.sensorDistance() != null) {
movingDistance = trackPoint.sensorDistance();
@@ -153,16 +152,7 @@ public class TrackStatisticsUpdater {
// GPS-based distance/speed
movingDistance = trackPoint.distanceToPrevious(lastTrackPoint);
}
if (movingDistance != null) {
currentSegment.addTotalDistance(movingDistance);
}
if (!isIdle
&& !trackPoint.isSegmentManualStart()
&& lastTrackPoint != null) {
currentSegment.addMovingTime(trackPoint, lastTrackPoint);
}
boolean isIdleTransition = false;
if (trackPoint.isIdleTriggered()) {
isIdle = true;
} else if (isIdle) {
@@ -170,6 +160,26 @@ public class TrackStatisticsUpdater {
if (movingDistance != null
&& movingDistance.greaterOrEqualThan(PreferencesUtils.getRecordingDistanceInterval())) {
isIdle = false;
isIdleTransition = true;
}
}
if (movingDistance != null && !isIdle) {
currentSegment.addTotalDistance(movingDistance);
}
if (!isIdle
&& !trackPoint.isSegmentManualStart()
&& lastTrackPoint != null) {
if (isIdleTransition) {
if (trackPoint.position().hasSpeed() && trackPoint.position().speed().toMPS() > 0) {
double timeSeconds = movingDistance.toM() / trackPoint.position().speed().toMPS();
currentSegment.addMovingTime(Duration.ofMillis((long)(timeSeconds * 1000)));
} else {
currentSegment.addMovingTime(Duration.ofMillis((long)(movingDistance.toM() * 1000)));
}
} else {
currentSegment.addMovingTime(trackPoint, lastTrackPoint);
}
}