Cleanup: moved Raw into Aggregator.

Preparation for refactoring.
This commit is contained in:
Dennis Guse
2026-01-27 17:59:08 +01:00
parent 0f2c5adf26
commit 18ff96733e
17 changed files with 77 additions and 98 deletions
@@ -8,7 +8,6 @@ import java.util.UUID;
import de.dennisguse.opentracks.data.models.AtmosphericPressure;
import de.dennisguse.opentracks.sensors.sensorData.Aggregator;
import de.dennisguse.opentracks.sensors.sensorData.AggregatorBarometer;
import de.dennisguse.opentracks.sensors.sensorData.Raw;
import de.dennisguse.opentracks.sensors.sensorData.SensorHandlerInterface;
public class BluetoothHandlerBarometricPressure implements SensorHandlerInterface {
@@ -33,7 +32,7 @@ public class BluetoothHandlerBarometricPressure implements SensorHandlerInterfac
AtmosphericPressure value = parseEnvironmentalSensing(characteristic);
if (value == null) return;
observer.onChange(new Raw<>(observer.getNow(), value));
observer.onChange(value);
}
/**
@@ -7,7 +7,6 @@ import android.util.Pair;
import java.util.List;
import de.dennisguse.opentracks.sensors.sensorData.AggregatorCyclingCadence;
import de.dennisguse.opentracks.sensors.sensorData.Raw;
import de.dennisguse.opentracks.sensors.sensorData.SensorHandlerInterface;
public class BluetoothHandlerCyclingCadence implements SensorHandlerInterface {
@@ -33,7 +32,7 @@ public class BluetoothHandlerCyclingCadence implements SensorHandlerInterface {
if (serviceMeasurementUUID.equals(BluetoothHandlerCyclingPower.CYCLING_POWER)) {
BluetoothHandlerCyclingPower.Data data = BluetoothHandlerCyclingPower.parseCyclingPower(characteristic);
if (data != null && data.crank() != null) {
observer.onChange(new Raw<>(observer.getNow(), data.crank()));
observer.onChange(data.crank());
}
return;
}
@@ -42,7 +41,7 @@ public class BluetoothHandlerCyclingCadence implements SensorHandlerInterface {
Pair<BluetoothHandlerCyclingDistanceSpeed.WheelData, CrankData> data = BluetoothHandlerCyclingDistanceSpeed.parseCyclingCrankAndWheel(address, sensorName, characteristic);
if (data != null && data.second != null) {
observer.onChange(new Raw<>(observer.getNow(), data.second));
observer.onChange(data.second);
}
return;
}
@@ -10,7 +10,6 @@ import java.util.List;
import java.util.UUID;
import de.dennisguse.opentracks.sensors.sensorData.AggregatorCyclingDistanceSpeed;
import de.dennisguse.opentracks.sensors.sensorData.Raw;
import de.dennisguse.opentracks.sensors.sensorData.SensorHandlerInterface;
public class BluetoothHandlerCyclingDistanceSpeed implements SensorHandlerInterface {
@@ -33,9 +32,10 @@ public class BluetoothHandlerCyclingDistanceSpeed implements SensorHandlerInterf
@Override
public void handlePayload(SensorManager observer, ServiceMeasurementUUID serviceMeasurementUUID, String sensorName, String address, BluetoothGattCharacteristic characteristic) {
Pair<WheelData, BluetoothHandlerCyclingCadence.CrankData> data = parseCyclingCrankAndWheel(address, sensorName, characteristic);
if (data.first != null) {
observer.onChange(new Raw<>(observer.getNow(), data.first));
}
if (data == null) return;
if (data.first == null) return;
observer.onChange(data.first);
}
@@ -78,5 +78,6 @@ public class BluetoothHandlerCyclingDistanceSpeed implements SensorHandlerInterf
long wheelRevolutionsCount, // UINT32
int wheelRevolutionsTime // UINT16; 1/1024s
) {}
) {
}
}
@@ -10,7 +10,6 @@ import java.util.UUID;
import de.dennisguse.opentracks.data.models.Power;
import de.dennisguse.opentracks.sensors.sensorData.AggregatorCyclingPower;
import de.dennisguse.opentracks.sensors.sensorData.Raw;
import de.dennisguse.opentracks.sensors.sensorData.SensorHandlerInterface;
public class BluetoothHandlerCyclingPower implements SensorHandlerInterface {
@@ -34,9 +33,9 @@ public class BluetoothHandlerCyclingPower implements SensorHandlerInterface {
public void handlePayload(SensorManager observer, @NonNull ServiceMeasurementUUID serviceMeasurementUUID, String sensorName, String address, BluetoothGattCharacteristic characteristic) {
Data cyclingPower = parseCyclingPower(characteristic);
if (cyclingPower != null) {
observer.onChange(new Raw<>(observer.getNow(), cyclingPower));
}
if (cyclingPower == null) return;
observer.onChange(cyclingPower);
}
@@ -10,7 +10,6 @@ import java.util.UUID;
import de.dennisguse.opentracks.data.models.HeartRate;
import de.dennisguse.opentracks.sensors.sensorData.AggregatorHeartRate;
import de.dennisguse.opentracks.sensors.sensorData.Raw;
import de.dennisguse.opentracks.sensors.sensorData.SensorHandlerInterface;
public class BluetoothHandlerHeartRate implements SensorHandlerInterface {
@@ -44,9 +43,9 @@ public class BluetoothHandlerHeartRate implements SensorHandlerInterface {
public void handlePayload(SensorManager observer, @NonNull ServiceMeasurementUUID serviceMeasurementUUID, String sensorName, String address, BluetoothGattCharacteristic characteristic) {
HeartRate heartRate = parseHeartRate(characteristic);
if (heartRate != null) {
observer.onChange(new Raw<>(observer.getNow(), heartRate));
}
if (heartRate == null) return;
observer.onChange(heartRate);
}
@VisibleForTesting
@@ -12,7 +12,6 @@ import de.dennisguse.opentracks.data.models.Cadence;
import de.dennisguse.opentracks.data.models.Distance;
import de.dennisguse.opentracks.data.models.Speed;
import de.dennisguse.opentracks.sensors.sensorData.AggregatorRunning;
import de.dennisguse.opentracks.sensors.sensorData.Raw;
import de.dennisguse.opentracks.sensors.sensorData.SensorHandlerInterface;
public class BluetoothHandlerRunningSpeedAndCadence implements SensorHandlerInterface {
@@ -36,7 +35,9 @@ public class BluetoothHandlerRunningSpeedAndCadence implements SensorHandlerInte
@Override
public void handlePayload(SensorManager observer, @NonNull ServiceMeasurementUUID serviceMeasurementUUID, String sensorName, String address, BluetoothGattCharacteristic characteristic) {
Data data = parseRunningSpeedAndCadence(sensorName, characteristic);
observer.onChange(new Raw<>(observer.getNow(), data));
if (data == null) return;
observer.onChange(data);
}
@VisibleForTesting
@@ -10,7 +10,6 @@ import java.util.UUID;
import de.dennisguse.opentracks.data.models.Temperature;
import de.dennisguse.opentracks.sensors.sensorData.Aggregator;
import de.dennisguse.opentracks.sensors.sensorData.AggregatorTemperature;
import de.dennisguse.opentracks.sensors.sensorData.Raw;
import de.dennisguse.opentracks.sensors.sensorData.SensorHandlerInterface;
public class BluetoothHandlerTemperature implements SensorHandlerInterface {
@@ -34,7 +33,7 @@ public class BluetoothHandlerTemperature implements SensorHandlerInterface {
Temperature value = parseEnvironmentalSensing(characteristic);
if (value == null) return;
observer.onChange(new Raw<>(observer.getNow(), value));
observer.onChange(value);
}
/**
@@ -20,7 +20,6 @@ import de.dennisguse.opentracks.R;
import de.dennisguse.opentracks.data.models.Distance;
import de.dennisguse.opentracks.data.models.Position;
import de.dennisguse.opentracks.sensors.sensorData.AggregatorGPS;
import de.dennisguse.opentracks.sensors.sensorData.Raw;
import de.dennisguse.opentracks.services.handlers.TrackPointCreator;
import de.dennisguse.opentracks.settings.PreferencesUtils;
import de.dennisguse.opentracks.util.PermissionRequester;
@@ -32,6 +31,7 @@ public class GpsManager implements LocationListenerCompat, GpsStatusManager.GpsS
private static final String LOCATION_PROVIDER = LocationManager.GPS_PROVIDER;
//TODO Refactor to just pass information via SensorManager.
private TrackPointCreator trackPointCreator;
private SensorManager observer;
@@ -123,7 +123,7 @@ public class GpsManager implements LocationListenerCompat, GpsStatusManager.GpsS
@Override
public void onLocationChanged(@NonNull Location location) {
// Send each update to the status; please note that this TrackPoint is not stored.
Position position = Position.of(location, trackPointCreator.createNow());
Position position = Position.of(location, observer.getNow());
gpsStatusManager.onNewTrackPoint(position);
if (!position.hasValidLocation()) {
@@ -136,7 +136,7 @@ public class GpsManager implements LocationListenerCompat, GpsStatusManager.GpsS
return;
}
observer.onChange(new Raw<>(observer.getNow(), position));
observer.onChange(position);
}
@Override
@@ -28,13 +28,13 @@ import de.dennisguse.opentracks.sensors.sensorData.AggregatorGPS;
import de.dennisguse.opentracks.sensors.sensorData.AggregatorHeartRate;
import de.dennisguse.opentracks.sensors.sensorData.AggregatorRunning;
import de.dennisguse.opentracks.sensors.sensorData.AggregatorTemperature;
import de.dennisguse.opentracks.sensors.sensorData.Raw;
import de.dennisguse.opentracks.sensors.sensorData.SensorData;
import de.dennisguse.opentracks.sensors.sensorData.SensorDataSet;
import de.dennisguse.opentracks.services.handlers.TrackPointCreator;
import de.dennisguse.opentracks.settings.PreferencesUtils;
import de.dennisguse.opentracks.util.SystemUtils;
//TODO provide context and handler for different Managers (not passing via start(), but similar to getNow()).
public class SensorManager implements SharedPreferences.OnSharedPreferenceChangeListener {
private static final String TAG = SensorManager.class.getSimpleName();
@@ -145,7 +145,7 @@ public class SensorManager implements SharedPreferences.OnSharedPreferenceChange
}
public Instant getNow() {
return observer.createNow();
return observer.getNow();
}
@VisibleForTesting
@@ -225,53 +225,53 @@ public class SensorManager implements SharedPreferences.OnSharedPreferenceChange
}
@Deprecated
public void onChange(Raw<?> data) {
public void onChange(Record data) {
update(data);
observer.onChange();
}
//TODO Refactor generic "fun" here: go explicit.
private void update(@NonNull Raw<?> data) {
Object value = data.value();
private void update(@NonNull Record value) {
Instant now = getNow();
if (value instanceof HeartRate) {
this.heartRate.add((Raw<HeartRate>) data);
this.heartRate.add(now, (HeartRate) value);
return;
}
if (value instanceof Temperature) {
this.temperature.add((Raw<Temperature>) data);
this.temperature.add(now, (Temperature) value);
return;
}
if (value instanceof BluetoothHandlerCyclingCadence.CrankData) {
this.cyclingCadence.add((Raw<BluetoothHandlerCyclingCadence.CrankData>) data);
this.cyclingCadence.add(now, (BluetoothHandlerCyclingCadence.CrankData) value);
return;
}
if (value instanceof BluetoothHandlerCyclingDistanceSpeed.WheelData) {
this.cyclingDistanceSpeed.setWheelCircumference(PreferencesUtils.getWheelCircumference()); //TODO Fetch once and then listen for changes.
this.cyclingDistanceSpeed.add((Raw<BluetoothHandlerCyclingDistanceSpeed.WheelData>) data);
this.cyclingDistanceSpeed.add(now, (BluetoothHandlerCyclingDistanceSpeed.WheelData) value);
return;
}
if (value instanceof BluetoothHandlerRunningSpeedAndCadence.Data) {
this.runningDistanceSpeedCadence.add((Raw<BluetoothHandlerRunningSpeedAndCadence.Data>) data);
this.runningDistanceSpeedCadence.add(now, (BluetoothHandlerRunningSpeedAndCadence.Data) value);
return;
}
if (value instanceof BluetoothHandlerCyclingPower.Data) {
this.cyclingPower.add((Raw<BluetoothHandlerCyclingPower.Data>) data);
this.cyclingPower.add(now, (BluetoothHandlerCyclingPower.Data) value);
return;
}
if (value instanceof AtmosphericPressure) {
this.barometer.add((Raw<AtmosphericPressure>) data);
this.barometer.add(now, (AtmosphericPressure) value);
return;
}
if (value instanceof Position) {
this.gps.add((Raw<Position>) data);
this.gps.add(now, (Position) value);
return;
}
throw new UnsupportedOperationException(data.getClass().getCanonicalName() + " " + data.value().getClass().getCanonicalName());
throw new UnsupportedOperationException(value.getClass().getCanonicalName());
}
public void remove(@NonNull Aggregator<?, ?> type) {
@@ -14,7 +14,6 @@ import java.util.concurrent.TimeUnit;
import de.dennisguse.opentracks.data.models.AtmosphericPressure;
import de.dennisguse.opentracks.sensors.SensorManager;
import de.dennisguse.opentracks.sensors.sensorData.AggregatorBarometer;
import de.dennisguse.opentracks.sensors.sensorData.Raw;
public class BarometerInternal implements Driver {
@@ -34,7 +33,7 @@ public class BarometerInternal implements Driver {
return;
}
observer.onChange(new Raw<>(observer.getNow(), AtmosphericPressure.ofHPA(event.values[0])));
observer.onChange(AtmosphericPressure.ofHPA(event.values[0]));
}
@Override
@@ -29,9 +29,10 @@ public abstract class Aggregator<Input, Output> {
return sensorName != null ? sensorName : sensorAddress;
}
public final void add(Raw<Input> current) {
computeValue(current);
previous = current;
public final void add(Instant now, Input current) {
Raw next = new Raw<>(now, current);
computeValue(next);
previous = next;
}
protected abstract void computeValue(Raw<Input> current);
@@ -104,4 +105,10 @@ public abstract class Aggregator<Input, Output> {
public String toString() {
return "sensorAddress=" + sensorAddress + " data=" + aggregatedValue;
}
protected record Raw<T>(
@NonNull Instant time,
@NonNull T value
) {
}
}
@@ -1,22 +0,0 @@
package de.dennisguse.opentracks.sensors.sensorData;
import androidx.annotation.NonNull;
import androidx.annotation.VisibleForTesting;
import java.time.Clock;
import java.time.Instant;
public record Raw<T>(
@NonNull Instant time,
@NonNull T value
) {
public Raw(@NonNull Clock clock, @NonNull T value) {
this(clock.instant(), value);
}
@VisibleForTesting
public Raw(@NonNull String time, @NonNull T value) {
this(Instant.parse(time), value);
}
}
@@ -73,7 +73,7 @@ public class TrackPointCreator implements SharedPreferences.OnSharedPreferenceCh
}
public synchronized TrackPoint createSegmentStartManual() {
return TrackPoint.createSegmentStartManualWithTime(createNow());
return TrackPoint.createSegmentStartManualWithTime(getNow());
}
public synchronized TrackPoint createSegmentEnd() {
@@ -89,7 +89,7 @@ public class TrackPointCreator implements SharedPreferences.OnSharedPreferenceCh
}
public Pair<TrackPoint, SensorDataSet> createCurrentTrackPoint(@Nullable TrackPoint lastTrackPointUISpeed, @Nullable TrackPoint lastTrackPointUIAltitude, @Nullable TrackPoint lastStoredTrackPointWithLocation) {
Instant now = createNow();
Instant now = getNow();
SensorDataSet sensorDataSet = sensorManager.getSensorDataSet(now);
Position position = sensorDataSet.position().data();
@@ -123,7 +123,7 @@ public class TrackPointCreator implements SharedPreferences.OnSharedPreferenceCh
}
private TrackPoint createTrackPoint(TrackPoint.Type type) {
Instant now = createNow();
Instant now = getNow();
SensorDataSet sensorDataSet = sensorManager.getSensorDataSet(now);
@@ -146,7 +146,7 @@ public class TrackPointCreator implements SharedPreferences.OnSharedPreferenceCh
);
}
public Instant createNow() {
public Instant getNow() {
return Instant.now(clock);
}