This commit is contained in:
Dennis Guse
2020-04-03 20:43:02 +02:00
parent 46f8753746
commit 38a15a96b3
5 changed files with 119 additions and 142 deletions
@@ -335,7 +335,7 @@ public class ChartView extends View {
*
* @param dataPoints an array of data points to be added
*/
public void addDataPoints(List<double[]> dataPoints) {
public void addPendingPoints(List<double[]> dataPoints) {
synchronized (chartData) {
chartData.addAll(dataPoints);
for (double[] dataPoint : dataPoints) {
@@ -43,7 +43,10 @@ import de.dennisguse.opentracks.util.LocationUtils;
import de.dennisguse.opentracks.util.PreferencesUtils;
/**
* Track data hub. Receives data from {@link de.dennisguse.opentracks.content.provider.CustomContentProvider} and distributes it to {@link TrackDataListener} after some processing.
* Track data hub.
* Receives data from {@link de.dennisguse.opentracks.content.provider.CustomContentProvider} and distributes it to {@link TrackDataListener} after some processing.
*
* {@link TrackPoint}s are filtered/downsampled with a dynamic sampling frequency.
*
* @author Rodrigo Damazio
*/
@@ -377,32 +380,32 @@ public class TrackDataHub implements SharedPreferences.OnSharedPreferenceChangeL
}
}
int localNumLoadedPoints = updateSamplingState ? numLoadedPoints : 0;
long localFirstSeenLocationId = updateSamplingState ? firstSeenTrackPointId : -1L;
long localLastSeenLocationId = updateSamplingState ? lastSeenTrackPointId : -1L;
int localNumLoadedTrackPoints = updateSamplingState ? numLoadedPoints : 0;
long localFirstSeenTrackPointId = updateSamplingState ? firstSeenTrackPointId : -1L;
long localLastSeenTrackPointIdId = updateSamplingState ? lastSeenTrackPointId : -1L;
long maxPointId = updateSamplingState ? -1L : lastSeenTrackPointId;
long lastTrackPointId = contentProviderUtils.getLastTrackPointId(selectedTrackId);
int samplingFrequency = -1;
boolean includeNextPoint = false;
try (TrackPointIterator locationIterator = contentProviderUtils.getTrackPointLocationIterator(selectedTrackId, localLastSeenLocationId + 1, false)) {
try (TrackPointIterator trackPointIterator = contentProviderUtils.getTrackPointLocationIterator(selectedTrackId, localLastSeenTrackPointIdId + 1, false)) {
while (locationIterator.hasNext()) {
TrackPoint trackPoint = locationIterator.next();
long locationId = locationIterator.getTrackPointId();
while (trackPointIterator.hasNext()) {
TrackPoint trackPoint = trackPointIterator.next();
long trackPointId = trackPointIterator.getTrackPointId();
// Stop if past the last wanted point
if (maxPointId != -1L && locationId > maxPointId) {
if (maxPointId != -1L && trackPointId > maxPointId) {
break;
}
if (localFirstSeenLocationId == -1) {
localFirstSeenLocationId = locationId;
if (localFirstSeenTrackPointId == -1) {
localFirstSeenTrackPointId = trackPointId;
}
if (samplingFrequency == -1) {
long numTotalPoints = Math.max(0L, lastTrackPointId - localFirstSeenLocationId);
long numTotalPoints = Math.max(0L, lastTrackPointId - localFirstSeenTrackPointId);
samplingFrequency = 1 + (int) (numTotalPoints / targetNumPoints);
}
@@ -410,7 +413,7 @@ public class TrackDataHub implements SharedPreferences.OnSharedPreferenceChangeL
includeNextPoint = true;
} else {
// Also include the last point if the selected track is not recording.
if (includeNextPoint || (localNumLoadedPoints % samplingFrequency == 0) || (locationId == lastTrackPointId && !isSelectedTrackRecording())) {
if (includeNextPoint || (localNumLoadedTrackPoints % samplingFrequency == 0) || (trackPointId == lastTrackPointId && !isSelectedTrackRecording())) {
includeNextPoint = false;
for (TrackDataListener trackDataListener : sampledInListeners) {
trackDataListener.onSampledInTrackPoint(trackPoint);
@@ -422,15 +425,15 @@ public class TrackDataHub implements SharedPreferences.OnSharedPreferenceChangeL
}
}
localNumLoadedPoints++;
localLastSeenLocationId = locationId;
localNumLoadedTrackPoints++;
localLastSeenTrackPointIdId = trackPointId;
}
}
if (updateSamplingState) {
numLoadedPoints = localNumLoadedPoints;
firstSeenTrackPointId = localFirstSeenLocationId;
lastSeenTrackPointId = localLastSeenLocationId;
numLoadedPoints = localNumLoadedTrackPoints;
firstSeenTrackPointId = localFirstSeenTrackPointId;
lastSeenTrackPointId = localLastSeenTrackPointIdId;
}
for (TrackDataListener listener : sampledInListeners) {
@@ -48,6 +48,7 @@ import de.dennisguse.opentracks.util.UnitConversions;
/**
* A fragment to display track chart to the user.
* ChartFragment uses a {@link TrackStatisticsUpdater} internally and recomputes the {@link TrackStatistics} from the beginning.
*
* @author Sandor Dornbush
* @author Rodrigo Damazio
@@ -219,23 +220,23 @@ public class ChartFragment extends Fragment implements TrackDataListener {
@Override
public void onSampledInTrackPoint(TrackPoint trackPoint) {
if (isResumed()) {
double[] data = new double[ChartView.NUM_SERIES + 1];
fillDataPoint(trackPoint, data);
pendingPoints.add(data);
pendingPoints.add(createPendingPoint(trackPoint));
}
}
@Override
public void onSampledOutTrackPoint(TrackPoint trackPoint) {
if (isResumed()) {
fillDataPoint(trackPoint, null);
if (trackStatisticsUpdater != null) {
trackStatisticsUpdater.addTrackPoint(trackPoint, recordingDistanceInterval);
}
}
}
@Override
public void onNewTrackPointsDone() {
if (isResumed()) {
chartView.addDataPoints(pendingPoints);
chartView.addPendingPoints(pendingPoints);
pendingPoints.clear();
runOnUiThread(updateChart);
}
@@ -346,7 +347,7 @@ public class ChartFragment extends Fragment implements TrackDataListener {
}
/**
* Given a trackPoint, fill in a data point, an array of double[]. <br>
* Given a {@link TrackPoint}, fill in a data point. <br>
* data[0] = time/distance <br>
* data[1] = elevation <br>
* data[2] = speed <br>
@@ -356,10 +357,9 @@ public class ChartFragment extends Fragment implements TrackDataListener {
* data[6] = power <br>
*
* @param trackPoint the trackPoint
* @param data the data point to fill in, can be null
*/
@VisibleForTesting
void fillDataPoint(@NonNull TrackPoint trackPoint, double[] data) {
double[] createPendingPoint(@NonNull TrackPoint trackPoint) {
double timeOrDistance = Double.NaN;
double elevation = Double.NaN;
double speed = Double.NaN;
@@ -407,15 +407,7 @@ public class ChartFragment extends Fragment implements TrackDataListener {
}
//TODO: Is related to ChartView.ELEVATION_SERIES etc.
if (data != null) {
data[0] = timeOrDistance;
data[1] = elevation;
data[2] = speed;
data[3] = pace;
data[4] = heartRate;
data[5] = cadence;
data[6] = power;
}
return new double[]{timeOrDistance, elevation, speed, pace, heartRate, cadence, power};
}
@VisibleForTesting