TrackPoint has Location as delegate instead of inheritance.

This commit is contained in:
Dennis Guse
2020-03-29 12:30:16 +02:00
parent 901cffee97
commit 194379295d
25 changed files with 288 additions and 184 deletions
@@ -311,7 +311,7 @@ public class TrackRecordingService extends Service {
long duration = stats.getTotalTime();
// Insert waypoint
Waypoint waypoint = new Waypoint(name, description, category, icon, recordingTrackId, length, duration, trackPoint, photoUrl);
Waypoint waypoint = new Waypoint(name, description, category, icon, recordingTrackId, length, duration, trackPoint.getLocation(), photoUrl);
Uri uri = contentProviderUtils.insertWaypoint(waypoint);
return ContentUris.parseId(uri);
}
@@ -568,7 +568,8 @@ public class TrackRecordingService extends Service {
return;
}
notificationManager.updateLocation(this, location, recordingGpsAccuracy);
TrackPoint trackPoint = new TrackPoint(location, getSensorDataSet());
notificationManager.updateTrackPoint(this, trackPoint, recordingGpsAccuracy);
if (!location.hasAccuracy() || location.getAccuracy() >= recordingGpsAccuracy) {
Log.d(TAG, "Ignore onLocationChangedAsync. Poor accuracy.");
@@ -583,15 +584,14 @@ public class TrackRecordingService extends Service {
TrackPoint lastValidTrackPoint = getLastValidTrackPointInCurrentSegment(track.getId());
long idleTime = 0L;
if (lastValidTrackPoint != null && location.getTime() > lastValidTrackPoint.getTime()) {
idleTime = location.getTime() - lastValidTrackPoint.getTime();
if (lastValidTrackPoint != null && location.getTime() > lastValidTrackPoint.getLocation().getTime()) {
idleTime = location.getTime() - lastValidTrackPoint.getLocation().getTime();
}
locationListenerPolicy.updateIdleTime(idleTime);
if (currentRecordingInterval != locationListenerPolicy.getDesiredPollingInterval()) {
registerLocationListener();
}
TrackPoint trackPoint = new TrackPoint(location, getSensorDataSet());
// Always insert the first segment location
if (!currentSegmentHasLocation) {
@@ -601,14 +601,14 @@ public class TrackRecordingService extends Service {
return;
}
if (!LocationUtils.isValidLocation(lastValidTrackPoint)) {
if (!LocationUtils.isValidLocation(lastValidTrackPoint.getLocation())) {
// Should not happen. The current segment should have a location. Just insert the current location.
insertTrackPoint(track, trackPoint, null);
lastTrackPoint = trackPoint;
return;
}
double distanceToLastTrackLocation = location.distanceTo(lastValidTrackPoint);
double distanceToLastTrackLocation = location.distanceTo(lastValidTrackPoint.getLocation());
if (distanceToLastTrackLocation > maxRecordingDistance) {
insertTrackPoint(track, lastTrackPoint, lastValidTrackPoint);
insertTrackPoint(track, TrackPoint.createPause(), null);
@@ -637,10 +637,10 @@ public class TrackRecordingService extends Service {
* Inserts a trackPoint.
*
* @param track the track
* @param trackPoint the trackPoint
* @param trackPoint the trackPoint
* @param lastValidTrackPoint the last valid track point, can be null
*/
private void insertTrackPoint(Track track, TrackPoint trackPoint, Location lastValidTrackPoint) {
private void insertTrackPoint(Track track, TrackPoint trackPoint, TrackPoint lastValidTrackPoint) {
if (trackPoint == null) {
Log.w(TAG, "Ignore insertLocation. trackPoint is null.");
return;
@@ -1,8 +1,9 @@
package de.dennisguse.opentracks.services;
import android.location.Location;
import androidx.annotation.VisibleForTesting;
import de.dennisguse.opentracks.content.data.TrackPoint;
import de.dennisguse.opentracks.content.sensor.SensorDataSet;
/**
@@ -82,8 +83,8 @@ class TrackRecordingServiceBinder extends android.os.Binder implements TrackReco
@VisibleForTesting
@Override
public void insertTrackPoint(TrackPoint trackPoint) {
trackRecordingService.onLocationChangedAsync(trackPoint);
public void insertLocation(Location location) {
trackRecordingService.onLocationChangedAsync(location);
}
@Override
@@ -15,9 +15,10 @@
*/
package de.dennisguse.opentracks.services;
import android.location.Location;
import androidx.annotation.VisibleForTesting;
import de.dennisguse.opentracks.content.data.TrackPoint;
import de.dennisguse.opentracks.content.sensor.SensorDataSet;
/**
@@ -95,15 +96,15 @@ public interface TrackRecordingServiceInterface {
/**
* ONLY FOR TESTING
*
* Inserts a track point in the current recording track.
* Inserts a location in the current recording track.
* <p>
* When recording a track, GPS locations are automatically inserted. This is used for
* inserting special track points or for testing.
* When recording a track, GPS locations are automatically inserted.
* This is used for inserting special track points or for testing.
*
* @param trackPoint the track point to be inserted
* @param location the location to be inserted
*/
@VisibleForTesting
void insertTrackPoint(TrackPoint trackPoint);
void insertLocation(Location location);
/**
* Gets the current sensor data. Returns null if there is no data.
@@ -5,13 +5,13 @@ import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.location.Location;
import android.os.Build;
import androidx.annotation.VisibleForTesting;
import androidx.core.app.NotificationCompat;
import de.dennisguse.opentracks.R;
import de.dennisguse.opentracks.content.data.TrackPoint;
import de.dennisguse.opentracks.util.PreferencesUtils;
import de.dennisguse.opentracks.util.StringUtils;
@@ -63,12 +63,12 @@ class TrackRecordingServiceNotificationManager {
updateNotification();
}
void updateLocation(Context context, Location location, int recordingGpsAccuracy) {
void updateTrackPoint(Context context, TrackPoint trackPoint, int recordingGpsAccuracy) {
String formattedAccuracy = context.getString(R.string.value_none);
if (location.hasAccuracy()) {
formattedAccuracy = StringUtils.formatDistance(context, location.getAccuracy(), PreferencesUtils.isMetricUnits(context));
if (trackPoint.hasAccuracy()) {
formattedAccuracy = StringUtils.formatDistance(context, trackPoint.getAccuracy(), PreferencesUtils.isMetricUnits(context));
boolean currentLocationWasAccurate = location.getAccuracy() < recordingGpsAccuracy;
boolean currentLocationWasAccurate = trackPoint.getAccuracy() < recordingGpsAccuracy;
boolean shouldAlert = !currentLocationWasAccurate && previousLocationWasAccurate;
notificationBuilder.setOnlyAlertOnce(!shouldAlert);
previousLocationWasAccurate = currentLocationWasAccurate;