TrackRecordingService: cleanup.

This commit is contained in:
Dennis Guse
2020-04-12 21:30:14 +02:00
parent 9b97cdfcd1
commit 0d87c65b49
@@ -74,7 +74,8 @@ public class TrackRecordingService extends Service {
private static final String TAG = TrackRecordingService.class.getSimpleName(); private static final String TAG = TrackRecordingService.class.getSimpleName();
// The following variables are set in onCreate: // The following variables are set in onCreate:
private ExecutorService executorService; @Deprecated //TODO Should not be necessary
private ExecutorService executorService; // Enforces order of location changes.
private ContentProviderUtils contentProviderUtils; private ContentProviderUtils contentProviderUtils;
private LocationManager locationManager; private LocationManager locationManager;
private PeriodicTaskExecutor voiceExecutor; private PeriodicTaskExecutor voiceExecutor;
@@ -138,7 +139,6 @@ public class TrackRecordingService extends Service {
private TrackStatisticsUpdater trackStatisticsUpdater; private TrackStatisticsUpdater trackStatisticsUpdater;
private TrackPoint lastTrackPoint; private TrackPoint lastTrackPoint;
private boolean currentSegmentHasLocation;
private boolean isIdle; private boolean isIdle;
private TrackRecordingServiceBinder binder = new TrackRecordingServiceBinder(this); private TrackRecordingServiceBinder binder = new TrackRecordingServiceBinder(this);
@@ -366,8 +366,8 @@ public class TrackRecordingService extends Service {
track.getTrackStatistics().setStopTime_ms(System.currentTimeMillis()); track.getTrackStatistics().setStopTime_ms(System.currentTimeMillis());
trackStatisticsUpdater = new TrackStatisticsUpdater(track.getTrackStatistics()); trackStatisticsUpdater = new TrackStatisticsUpdater(track.getTrackStatistics());
insertTrackPoint(track, TrackPoint.createPause(), null); insertTrackPoint(track, TrackPoint.createPause());
insertTrackPoint(track, TrackPoint.createResume(), null); insertTrackPoint(track, TrackPoint.createResume());
// Update shared preferences. // Update shared preferences.
updateRecordingState(trackId, false); updateRecordingState(trackId, false);
@@ -394,14 +394,12 @@ public class TrackRecordingService extends Service {
return; return;
} }
// Update shared preferences updateRecordingState(recordingTrackId, false);
recordingTrackPaused = false;
PreferencesUtils.setBoolean(this, R.string.recording_track_paused_key, false);
// Update database // Update database
Track track = contentProviderUtils.getTrack(recordingTrackId); Track track = contentProviderUtils.getTrack(recordingTrackId);
if (track != null) { if (track != null) {
insertTrackPoint(track, TrackPoint.createResume(), null); insertTrackPoint(track, TrackPoint.createResume());
} }
startRecording(); startRecording();
@@ -415,7 +413,6 @@ public class TrackRecordingService extends Service {
remoteSensorManager = new BluetoothRemoteSensorManager(this); remoteSensorManager = new BluetoothRemoteSensorManager(this);
remoteSensorManager.start(); remoteSensorManager.start();
lastTrackPoint = null; lastTrackPoint = null;
currentSegmentHasLocation = false;
isIdle = false; isIdle = false;
startGps(); startGps();
@@ -444,22 +441,21 @@ public class TrackRecordingService extends Service {
// Need to remember the recordingTrackId before setting it to -1L // Need to remember the recordingTrackId before setting it to -1L
long trackId = recordingTrackId; long trackId = recordingTrackId;
boolean paused = recordingTrackPaused; boolean wasPaused = recordingTrackPaused;
// Update shared preferences
updateRecordingState(PreferencesUtils.RECORDING_TRACK_ID_DEFAULT, true); updateRecordingState(PreferencesUtils.RECORDING_TRACK_ID_DEFAULT, true);
// Update database // Update database
Track track = contentProviderUtils.getTrack(trackId); Track track = contentProviderUtils.getTrack(trackId);
if (track != null) { if (track != null) {
// If not paused, add the last location // If not wasPaused, add the last location
if (!paused) { if (!wasPaused) {
if (lastTrackPoint != null) { if (lastTrackPoint != null) {
insertTrackPoint(track, lastTrackPoint, getLastValidTrackPointInCurrentSegment(trackId)); insertTrackPointIfNewer(track, lastTrackPoint);
} }
// Update the recording track time // Update the recording track time
updateRecordingTrack(track); updateTrackTotalTime(track);
} }
String trackName = TrackNameUtils.getTrackName(this, trackId, track.getTrackStatistics().getStartTime_ms()); String trackName = TrackNameUtils.getTrackName(this, trackId, track.getTrackStatistics().getStartTime_ms());
@@ -477,16 +473,14 @@ public class TrackRecordingService extends Service {
return; return;
} }
// Update shared preferences updateRecordingState(recordingTrackId, true);
recordingTrackPaused = true;
PreferencesUtils.setBoolean(this, R.string.recording_track_paused_key, true);
// Update database // Update database
Track track = contentProviderUtils.getTrack(recordingTrackId); Track track = contentProviderUtils.getTrack(recordingTrackId);
if (track != null) { if (track != null) {
insertTrackPoint(track, lastTrackPoint, getLastValidTrackPointInCurrentSegment(track.getId())); insertTrackPointIfNewer(track, lastTrackPoint);
insertTrackPoint(track, TrackPoint.createPause(), null); insertTrackPoint(track, TrackPoint.createPause());
} }
endRecording(false); endRecording(false);
@@ -536,14 +530,19 @@ public class TrackRecordingService extends Service {
* @return the location or null * @return the location or null
*/ */
private TrackPoint getLastValidTrackPointInCurrentSegment(long trackId) { private TrackPoint getLastValidTrackPointInCurrentSegment(long trackId) {
if (!currentSegmentHasLocation) { if (!currentSegmentHasTrackPoint()) {
return null; return null;
} }
return contentProviderUtils.getLastValidTrackPoint(trackId); return contentProviderUtils.getLastValidTrackPoint(trackId);
} }
private boolean currentSegmentHasTrackPoint() {
return lastTrackPoint != null;
}
/** /**
* Updates the recording states. * Updates the recording states.
* This will inform subscribed {@link OnSharedPreferenceChangeListener}.
* *
* @param trackId the recording track id * @param trackId the recording track id
* @param paused true if the recording is paused * @param paused true if the recording is paused
@@ -586,7 +585,7 @@ public class TrackRecordingService extends Service {
TrackPoint lastValidTrackPoint = getLastValidTrackPointInCurrentSegment(track.getId()); TrackPoint lastValidTrackPoint = getLastValidTrackPointInCurrentSegment(track.getId());
long idleTime = 0L; long idleTime = 0L;
if (TrackPointUtils.after(trackPoint, lastValidTrackPoint)) { if (TrackPointUtils.after(trackPoint, lastValidTrackPoint)) {
idleTime = trackPoint.getTime() - lastValidTrackPoint.getLocation().getTime(); idleTime = trackPoint.getTime() - lastValidTrackPoint.getTime();
} }
locationListenerPolicy.updateIdleTime(idleTime); locationListenerPolicy.updateIdleTime(idleTime);
@@ -594,27 +593,29 @@ public class TrackRecordingService extends Service {
registerLocationListener(); registerLocationListener();
} }
//Storing trackPoint
// Always insert the first segment location // Always insert the first segment location
if (!currentSegmentHasLocation) { if (!currentSegmentHasTrackPoint()) {
insertTrackPoint(track, trackPoint, null); insertTrackPoint(track, trackPoint);
currentSegmentHasLocation = true;
lastTrackPoint = trackPoint; lastTrackPoint = trackPoint;
return; return;
} }
if (!LocationUtils.isValidLocation(lastValidTrackPoint.getLocation())) { if (!LocationUtils.isValidLocation(lastValidTrackPoint.getLocation())) {
// For some reason the previous first trackPoint was not stored, but currentSegmentHasLocation set true.
// Should not happen. The current segment should have a location. Just insert the current location. // Should not happen. The current segment should have a location. Just insert the current location.
insertTrackPoint(track, trackPoint, null); insertTrackPoint(track, trackPoint);
lastTrackPoint = trackPoint; lastTrackPoint = trackPoint;
return; return;
} }
double distanceToLastTrackLocation = trackPoint.distanceTo(lastValidTrackPoint); double distanceToLastTrackLocation = trackPoint.distanceTo(lastValidTrackPoint);
if (distanceToLastTrackLocation > maxRecordingDistance) { if (distanceToLastTrackLocation > maxRecordingDistance) {
insertTrackPoint(track, lastTrackPoint, lastValidTrackPoint); insertTrackPointIfNewer(track, lastTrackPoint);
insertTrackPoint(track, TrackPoint.createPause(), null); insertTrackPoint(track, TrackPoint.createPause());
insertTrackPoint(track, trackPoint, null); insertTrackPoint(track, trackPoint);
isIdle = false; isIdle = false;
lastTrackPoint = trackPoint; lastTrackPoint = trackPoint;
@@ -622,8 +623,8 @@ public class TrackRecordingService extends Service {
} }
if (trackPoint.getSensorDataSet() != null || distanceToLastTrackLocation >= recordingDistanceInterval) { if (trackPoint.getSensorDataSet() != null || distanceToLastTrackLocation >= recordingDistanceInterval) {
insertTrackPoint(track, lastTrackPoint, lastValidTrackPoint); insertTrackPointIfNewer(track, lastTrackPoint);
insertTrackPoint(track, trackPoint, null); insertTrackPoint(track, trackPoint);
isIdle = false; isIdle = false;
lastTrackPoint = trackPoint; lastTrackPoint = trackPoint;
@@ -631,8 +632,8 @@ public class TrackRecordingService extends Service {
} }
if (!isIdle && !TrackPointUtils.isMoving(trackPoint)) { if (!isIdle && !TrackPointUtils.isMoving(trackPoint)) {
insertTrackPoint(track, lastTrackPoint, lastValidTrackPoint); insertTrackPointIfNewer(track, lastTrackPoint);
insertTrackPoint(track, trackPoint, null); insertTrackPoint(track, trackPoint);
isIdle = true; isIdle = true;
lastTrackPoint = trackPoint; lastTrackPoint = trackPoint;
@@ -640,8 +641,8 @@ public class TrackRecordingService extends Service {
} }
if (isIdle && TrackPointUtils.isMoving(trackPoint)) { if (isIdle && TrackPointUtils.isMoving(trackPoint)) {
insertTrackPoint(track, lastTrackPoint, lastValidTrackPoint); insertTrackPointIfNewer(track, lastTrackPoint);
insertTrackPoint(track, trackPoint, null); insertTrackPoint(track, trackPoint);
isIdle = false; isIdle = false;
lastTrackPoint = trackPoint; lastTrackPoint = trackPoint;
@@ -653,23 +654,33 @@ public class TrackRecordingService extends Service {
} }
/** /**
* Inserts a trackPoint. * Inserts a trackPoint if this trackPoint is different than lastValidTrackPoint.
* *
* @param track the track * @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(@NonNull Track track, @NonNull TrackPoint trackPoint, TrackPoint lastValidTrackPoint) { private void insertTrackPointIfNewer(@NonNull Track track, @NonNull TrackPoint trackPoint) {
TrackPoint lastValidTrackPoint = getLastValidTrackPointInCurrentSegment(track.getId());
if (TrackPointUtils.equalTime(trackPoint, lastValidTrackPoint)) { if (TrackPointUtils.equalTime(trackPoint, lastValidTrackPoint)) {
// Do not insert if inserted already // Do not insert if inserted already
Log.w(TAG, "Ignore insertTrackPoint. trackPoint time same as last valid track point time."); Log.w(TAG, "Ignore insertTrackPoint. trackPoint time same as last valid track point time.");
return; return;
} }
insertTrackPoint(track, trackPoint);
}
/**
* Inserts a trackPoint.
*
* @param track the track
* @param trackPoint the trackPoint
*/
private void insertTrackPoint(@NonNull Track track, @NonNull TrackPoint trackPoint) {
try { try {
contentProviderUtils.insertTrackPoint(trackPoint, track.getId()); contentProviderUtils.insertTrackPoint(trackPoint, track.getId());
trackStatisticsUpdater.addTrackPoint(trackPoint, recordingDistanceInterval); trackStatisticsUpdater.addTrackPoint(trackPoint, recordingDistanceInterval);
updateRecordingTrack(track); updateTrackTotalTime(track);
} catch (SQLiteException e) { } catch (SQLiteException e) {
/* /*
* Insert failed, most likely because of SqlLite error code 5 (SQLite_BUSY). * Insert failed, most likely because of SqlLite error code 5 (SQLite_BUSY).
@@ -680,12 +691,13 @@ public class TrackRecordingService extends Service {
voiceExecutor.update(); voiceExecutor.update();
} }
/** /**
* Updates the recording track time. * Updates the recording track time.
* *
* @param track the track * @param track the track
*/ */
private void updateRecordingTrack(Track track) { private void updateTrackTotalTime(Track track) {
trackStatisticsUpdater.updateTime(System.currentTimeMillis()); trackStatisticsUpdater.updateTime(System.currentTimeMillis());
track.setTrackStatistics(trackStatisticsUpdater.getTrackStatistics()); track.setTrackStatistics(trackStatisticsUpdater.getTrackStatistics());
contentProviderUtils.updateTrack(track); contentProviderUtils.updateTrack(track);