From cf32c81035527ecf10f00466bf8d084bc8a6b44c Mon Sep 17 00:00:00 2001 From: Dennis Guse Date: Fri, 28 Jan 2022 18:58:42 +0100 Subject: [PATCH] Cleanup: extract RecordingData and RecordingStatus from TrackRecordingService. --- ...TrackRecordingServiceTestStateMachine.java | 16 +- .../viewmodels/StatisticDataBuilderTest.java | 4 +- .../opentracks/ControllerFragment.java | 10 +- .../opentracks/TrackListActivity.java | 9 +- .../opentracks/TrackRecordedActivity.java | 5 +- .../opentracks/TrackRecordingActivity.java | 5 +- .../opentracks/data/TrackDataHub.java | 5 +- .../StatisticsRecordingFragment.java | 5 +- .../opentracks/services/RecordingData.java | 79 +++++++ .../opentracks/services/RecordingStatus.java | 73 +++++++ .../services/TrackRecordingService.java | 195 ++---------------- .../settings/MainSettingsFragment.java | 5 +- .../ui/markers/MarkerListActivity.java | 5 +- .../viewmodels/StatisticDataBuilder.java | 8 +- .../viewmodels/StatisticsDataModel.java | 4 +- 15 files changed, 217 insertions(+), 211 deletions(-) create mode 100644 src/main/java/de/dennisguse/opentracks/services/RecordingData.java create mode 100644 src/main/java/de/dennisguse/opentracks/services/RecordingStatus.java diff --git a/src/androidTest/java/de/dennisguse/opentracks/services/TrackRecordingServiceTestStateMachine.java b/src/androidTest/java/de/dennisguse/opentracks/services/TrackRecordingServiceTestStateMachine.java index 0280d7cd9..3cef292e6 100644 --- a/src/androidTest/java/de/dennisguse/opentracks/services/TrackRecordingServiceTestStateMachine.java +++ b/src/androidTest/java/de/dennisguse/opentracks/services/TrackRecordingServiceTestStateMachine.java @@ -123,7 +123,7 @@ public class TrackRecordingServiceTestStateMachine { assertEquals(GpsStatusValue.GPS_NONE, service.getGpsStatusObservable().getValue()); // when - service.tryStartGps(); + service.tryStartSensors(); Thread.sleep(1000); // then @@ -132,7 +132,7 @@ public class TrackRecordingServiceTestStateMachine { assertEquals(GpsStatusValue.GPS_ENABLED, service.getGpsStatusObservable().getValue()); // when - service.stopGps(true); + service.stopSensors(true); Thread.sleep(1000); // then @@ -153,7 +153,7 @@ public class TrackRecordingServiceTestStateMachine { // then assertTrue(service.isRecording()); - assertEquals(new TrackRecordingService.RecordingStatus(trackId, false), service.getRecordingStatusObservable().getValue()); + assertEquals(new RecordingStatus(trackId, false), service.getRecordingStatusObservable().getValue()); assertNotEquals(TrackRecordingService.NOT_RECORDING, service.getRecordingDataObservable().getValue()); assertEquals(GpsStatusValue.GPS_ENABLED, service.getGpsStatusObservable().getValue()); @@ -165,7 +165,7 @@ public class TrackRecordingServiceTestStateMachine { // then assertTrue(service.isRecording()); assertTrue(service.isPaused()); - assertEquals(new TrackRecordingService.RecordingStatus(trackId, true), service.getRecordingStatusObservable().getValue()); + assertEquals(new RecordingStatus(trackId, true), service.getRecordingStatusObservable().getValue()); assertNotEquals(TrackRecordingService.NOT_RECORDING, service.getRecordingDataObservable().getValue()); assertEquals(GpsStatusValue.GPS_NONE, service.getGpsStatusObservable().getValue()); //TODO The GPS is kept in pause, right? Might be a bug. @@ -177,7 +177,7 @@ public class TrackRecordingServiceTestStateMachine { // then assertTrue(service.isRecording()); assertFalse(service.isPaused()); - assertEquals(new TrackRecordingService.RecordingStatus(trackId, false), service.getRecordingStatusObservable().getValue()); + assertEquals(new RecordingStatus(trackId, false), service.getRecordingStatusObservable().getValue()); assertNotEquals(TrackRecordingService.NOT_RECORDING, service.getRecordingDataObservable().getValue()); assertEquals(GpsStatusValue.GPS_ENABLED, service.getGpsStatusObservable().getValue()); @@ -201,7 +201,7 @@ public class TrackRecordingServiceTestStateMachine { // then assertTrue(service.isRecording()); assertFalse(service.isPaused()); - assertEquals(new TrackRecordingService.RecordingStatus(trackId, false), service.getRecordingStatusObservable().getValue()); + assertEquals(new RecordingStatus(trackId, false), service.getRecordingStatusObservable().getValue()); Thread.sleep(1000); //TODO Figure out why we need to wait here until the update is happening assertNotEquals(TrackRecordingService.NOT_RECORDING, service.getRecordingDataObservable().getValue()); assertEquals(GpsStatusValue.GPS_ENABLED, service.getGpsStatusObservable().getValue()); @@ -252,13 +252,13 @@ public class TrackRecordingServiceTestStateMachine { assertEquals(GpsStatusValue.GPS_ENABLED, service.getGpsStatusObservable().getValue()); // when - service.stopGps(false); //TODO Should be ignored as service is recording + service.stopSensors(false); //TODO Should be ignored as service is recording Thread.sleep(1000); // then assertTrue(service.isRecording()); assertFalse(service.isPaused()); - assertEquals(new TrackRecordingService.RecordingStatus(trackId, false), service.getRecordingStatusObservable().getValue()); + assertEquals(new RecordingStatus(trackId, false), service.getRecordingStatusObservable().getValue()); Thread.sleep(1000); //TODO Figure out why we need to wait here until the update is happening assertNotEquals(TrackRecordingService.NOT_RECORDING, service.getRecordingDataObservable().getValue()); assertEquals(GpsStatusValue.GPS_ENABLED, service.getGpsStatusObservable().getValue()); diff --git a/src/androidTest/java/de/dennisguse/opentracks/viewmodels/StatisticDataBuilderTest.java b/src/androidTest/java/de/dennisguse/opentracks/viewmodels/StatisticDataBuilderTest.java index 4e824a2c1..7206c227e 100644 --- a/src/androidTest/java/de/dennisguse/opentracks/viewmodels/StatisticDataBuilderTest.java +++ b/src/androidTest/java/de/dennisguse/opentracks/viewmodels/StatisticDataBuilderTest.java @@ -22,7 +22,7 @@ import de.dennisguse.opentracks.data.models.Distance; import de.dennisguse.opentracks.data.models.HeartRate; import de.dennisguse.opentracks.data.models.Power; import de.dennisguse.opentracks.data.models.Track; -import de.dennisguse.opentracks.services.TrackRecordingService; +import de.dennisguse.opentracks.services.RecordingData; import de.dennisguse.opentracks.stats.SensorStatistics; import de.dennisguse.opentracks.stats.TrackStatistics; import de.dennisguse.opentracks.ui.customRecordingLayout.Layout; @@ -39,7 +39,7 @@ public class StatisticDataBuilderTest extends TestCase { private TrackStatistics trackStatisticsMock; @Mock - private TrackRecordingService.RecordingData recordingDataMock; + private RecordingData recordingDataMock; @Mock private SensorStatistics sensorStatisticsMock; diff --git a/src/main/java/de/dennisguse/opentracks/ControllerFragment.java b/src/main/java/de/dennisguse/opentracks/ControllerFragment.java index f1e58c093..681494110 100644 --- a/src/main/java/de/dennisguse/opentracks/ControllerFragment.java +++ b/src/main/java/de/dennisguse/opentracks/ControllerFragment.java @@ -33,6 +33,8 @@ import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; import de.dennisguse.opentracks.databinding.ControllerFragmentBinding; +import de.dennisguse.opentracks.services.RecordingData; +import de.dennisguse.opentracks.services.RecordingStatus; import de.dennisguse.opentracks.services.TrackRecordingService; import de.dennisguse.opentracks.services.TrackRecordingServiceConnection; import de.dennisguse.opentracks.ui.util.ActivityUtils; @@ -57,8 +59,8 @@ public class ControllerFragment extends Fragment implements View.OnTouchListener private TransitionDrawable transition; private TrackRecordingServiceConnection trackRecordingServiceConnection; - private TrackRecordingService.RecordingStatus recordingStatus; - private TrackRecordingService.RecordingData recordingData; + private RecordingStatus recordingStatus; + private RecordingData recordingData; private final TrackRecordingServiceConnection.Callback bindChangedCallback = service -> { service.getRecordingStatusObservable() @@ -237,7 +239,7 @@ public class ControllerFragment extends Fragment implements View.OnTouchListener void recordStop(); } - private void onRecordingStatusChanged(TrackRecordingService.RecordingStatus status) { + private void onRecordingStatusChanged(RecordingStatus status) { recordingStatus = status; viewBinding.controllerRecord.setImageResource(recordingStatus.isRecordingAndNotPaused() ? R.drawable.ic_button_pause : R.drawable.button_record); @@ -254,7 +256,7 @@ public class ControllerFragment extends Fragment implements View.OnTouchListener viewBinding.controllerTotalTime.setVisibility(recordingStatus.isRecording() ? View.VISIBLE : View.INVISIBLE); } - private void onTotalTimeChanged(TrackRecordingService.RecordingData recordingData) { + private void onTotalTimeChanged(RecordingData recordingData) { this.recordingData = recordingData; viewBinding.controllerTotalTime.setText(StringUtils.formatElapsedTimeWithHour(this.recordingData.getTrackStatistics().getTotalTime())); diff --git a/src/main/java/de/dennisguse/opentracks/TrackListActivity.java b/src/main/java/de/dennisguse/opentracks/TrackListActivity.java index d6376792d..706eb1133 100644 --- a/src/main/java/de/dennisguse/opentracks/TrackListActivity.java +++ b/src/main/java/de/dennisguse/opentracks/TrackListActivity.java @@ -58,6 +58,7 @@ import de.dennisguse.opentracks.data.models.Distance; import de.dennisguse.opentracks.data.models.Track; import de.dennisguse.opentracks.data.tables.TracksColumns; import de.dennisguse.opentracks.databinding.TrackListBinding; +import de.dennisguse.opentracks.services.RecordingStatus; import de.dennisguse.opentracks.services.TrackRecordingService; import de.dennisguse.opentracks.services.TrackRecordingServiceConnection; import de.dennisguse.opentracks.services.handlers.GpsStatusValue; @@ -95,7 +96,7 @@ public class TrackListActivity extends AbstractTrackDeleteActivity implements Co private boolean metricUnits = true; private GpsStatusValue gpsStatusValue = TrackRecordingService.STATUS_GPS_DEFAULT; - private TrackRecordingService.RecordingStatus recordingStatus = TrackRecordingService.STATUS_DEFAULT; + private RecordingStatus recordingStatus = TrackRecordingService.STATUS_DEFAULT; // Callback when an item is selected in the contextual action mode private final ActivityUtils.ContextualActionModeCallback contextualActionModeCallback = new ActivityUtils.ContextualActionModeCallback() { @@ -144,7 +145,7 @@ public class TrackListActivity extends AbstractTrackDeleteActivity implements Co } //TODO Not cool to do this in a callback that might be called more than once! - service.tryStartGps(); + service.tryStartSensors(); }; @Override @@ -300,7 +301,7 @@ public class TrackListActivity extends AbstractTrackDeleteActivity implements Co } else { TrackRecordingService trackRecordingService = trackRecordingServiceConnection.getServiceIfBound(); if (trackRecordingService != null) { - trackRecordingService.stopGpsAndShutdown(); //TODO Handle this in TrackRecordingServiceConnection + trackRecordingService.stopSensorsAndShutdown(); //TODO Handle this in TrackRecordingServiceConnection } trackRecordingServiceConnection.unbindAndStop(this); } @@ -569,7 +570,7 @@ public class TrackListActivity extends AbstractTrackDeleteActivity implements Co updateGpsMenuItem(true, recordingStatus.isRecording()); } - private void onRecordingStatusChanged(TrackRecordingService.RecordingStatus status) { + private void onRecordingStatusChanged(RecordingStatus status) { recordingStatus = status; } } diff --git a/src/main/java/de/dennisguse/opentracks/TrackRecordedActivity.java b/src/main/java/de/dennisguse/opentracks/TrackRecordedActivity.java index f13dc2c2c..a4c0050a7 100644 --- a/src/main/java/de/dennisguse/opentracks/TrackRecordedActivity.java +++ b/src/main/java/de/dennisguse/opentracks/TrackRecordedActivity.java @@ -39,6 +39,7 @@ import de.dennisguse.opentracks.data.TrackDataHub; import de.dennisguse.opentracks.data.models.Track; import de.dennisguse.opentracks.databinding.TrackRecordedBinding; import de.dennisguse.opentracks.fragments.StatisticsRecordedFragment; +import de.dennisguse.opentracks.services.RecordingStatus; import de.dennisguse.opentracks.services.TrackDeleteService; import de.dennisguse.opentracks.services.TrackRecordingService; import de.dennisguse.opentracks.services.TrackRecordingServiceConnection; @@ -74,7 +75,7 @@ public class TrackRecordedActivity extends AbstractTrackDeleteActivity implement private TrackRecordedBinding viewBinding; private Track.Id trackId; - private TrackRecordingService.RecordingStatus recordingStatus = TrackRecordingService.STATUS_DEFAULT; + private RecordingStatus recordingStatus = TrackRecordingService.STATUS_DEFAULT; private TrackRecordingServiceConnection trackRecordingServiceConnection; @@ -299,7 +300,7 @@ public class TrackRecordedActivity extends AbstractTrackDeleteActivity implement startPostponedEnterTransition(); } - private void onRecordingStatusChanged(TrackRecordingService.RecordingStatus status) { + private void onRecordingStatusChanged(RecordingStatus status) { recordingStatus = status; } } \ No newline at end of file diff --git a/src/main/java/de/dennisguse/opentracks/TrackRecordingActivity.java b/src/main/java/de/dennisguse/opentracks/TrackRecordingActivity.java index 207bf52c4..a205abf99 100644 --- a/src/main/java/de/dennisguse/opentracks/TrackRecordingActivity.java +++ b/src/main/java/de/dennisguse/opentracks/TrackRecordingActivity.java @@ -29,6 +29,7 @@ import de.dennisguse.opentracks.data.models.Track; import de.dennisguse.opentracks.databinding.TrackRecordingBinding; import de.dennisguse.opentracks.fragments.ChooseActivityTypeDialogFragment; import de.dennisguse.opentracks.fragments.StatisticsRecordingFragment; +import de.dennisguse.opentracks.services.RecordingStatus; import de.dennisguse.opentracks.services.TrackRecordingService; import de.dennisguse.opentracks.services.TrackRecordingServiceConnection; import de.dennisguse.opentracks.settings.PreferencesUtils; @@ -68,7 +69,7 @@ public class TrackRecordingActivity extends AbstractActivity implements ChooseAc @Deprecated private Track.Id trackId; - private TrackRecordingService.RecordingStatus recordingStatus = TrackRecordingService.STATUS_DEFAULT; + private RecordingStatus recordingStatus = TrackRecordingService.STATUS_DEFAULT; private final TrackRecordingServiceConnection.Callback bindChangedCallback = new TrackRecordingServiceConnection.Callback() { @Override @@ -391,7 +392,7 @@ public class TrackRecordingActivity extends AbstractActivity implements ChooseAc } } - private void onRecordingStatusChanged(TrackRecordingService.RecordingStatus status) { + private void onRecordingStatusChanged(RecordingStatus status) { recordingStatus = status; trackDataHub.setRecordingStatus(recordingStatus); diff --git a/src/main/java/de/dennisguse/opentracks/data/TrackDataHub.java b/src/main/java/de/dennisguse/opentracks/data/TrackDataHub.java index b199fab66..8354bdbb3 100644 --- a/src/main/java/de/dennisguse/opentracks/data/TrackDataHub.java +++ b/src/main/java/de/dennisguse/opentracks/data/TrackDataHub.java @@ -40,6 +40,7 @@ import de.dennisguse.opentracks.data.models.TrackPoint; import de.dennisguse.opentracks.data.tables.MarkerColumns; import de.dennisguse.opentracks.data.tables.TrackPointsColumns; import de.dennisguse.opentracks.data.tables.TracksColumns; +import de.dennisguse.opentracks.services.RecordingStatus; import de.dennisguse.opentracks.services.TrackRecordingService; import de.dennisguse.opentracks.services.handlers.EGM2008CorrectionManager; import de.dennisguse.opentracks.stats.TrackStatistics; @@ -83,7 +84,7 @@ public class TrackDataHub { private Track.Id selectedTrackId; - private TrackRecordingService.RecordingStatus recordingStatus = TrackRecordingService.STATUS_DEFAULT; + private RecordingStatus recordingStatus = TrackRecordingService.STATUS_DEFAULT; // Track points sampling state private int numLoadedPoints; @@ -407,7 +408,7 @@ public class TrackDataHub { return handlerThread != null; } - public void setRecordingStatus(TrackRecordingService.RecordingStatus recordingStatus) { + public void setRecordingStatus(RecordingStatus recordingStatus) { this.recordingStatus = recordingStatus; } diff --git a/src/main/java/de/dennisguse/opentracks/fragments/StatisticsRecordingFragment.java b/src/main/java/de/dennisguse/opentracks/fragments/StatisticsRecordingFragment.java index 43a65cb45..55c1514cc 100644 --- a/src/main/java/de/dennisguse/opentracks/fragments/StatisticsRecordingFragment.java +++ b/src/main/java/de/dennisguse/opentracks/fragments/StatisticsRecordingFragment.java @@ -22,6 +22,7 @@ import de.dennisguse.opentracks.adapters.StatisticsAdapter; import de.dennisguse.opentracks.data.models.Track; import de.dennisguse.opentracks.data.models.TrackPoint; import de.dennisguse.opentracks.databinding.StatisticsRecordingBinding; +import de.dennisguse.opentracks.services.RecordingData; import de.dennisguse.opentracks.services.TrackRecordingService; import de.dennisguse.opentracks.services.TrackRecordingServiceConnection; import de.dennisguse.opentracks.settings.PreferencesUtils; @@ -44,7 +45,7 @@ public class StatisticsRecordingFragment extends Fragment { } private TrackRecordingServiceConnection trackRecordingServiceConnection; - private TrackRecordingService.RecordingData recordingData = TrackRecordingService.NOT_RECORDING; + private RecordingData recordingData = TrackRecordingService.NOT_RECORDING; private TrackPoint latestTrackPoint; private Layout layout; @@ -158,7 +159,7 @@ public class StatisticsRecordingFragment extends Fragment { } } - private void onRecordingDataChanged(TrackRecordingService.RecordingData recordingData) { + private void onRecordingDataChanged(RecordingData recordingData) { String oldCategory = this.recordingData.getTrackCategory(); String newCategory = recordingData.getTrackCategory(); this.recordingData = recordingData; diff --git a/src/main/java/de/dennisguse/opentracks/services/RecordingData.java b/src/main/java/de/dennisguse/opentracks/services/RecordingData.java new file mode 100644 index 000000000..60a69bc45 --- /dev/null +++ b/src/main/java/de/dennisguse/opentracks/services/RecordingData.java @@ -0,0 +1,79 @@ +package de.dennisguse.opentracks.services; + +import androidx.annotation.NonNull; + +import java.util.Objects; + +import de.dennisguse.opentracks.data.models.Track; +import de.dennisguse.opentracks.data.models.TrackPoint; +import de.dennisguse.opentracks.sensors.sensorData.SensorDataSet; +import de.dennisguse.opentracks.stats.TrackStatistics; + +public class RecordingData { + + private final Track track; + + private final TrackPoint latestTrackPoint; + + private final SensorDataSet sensorDataSet; + + /** + * {@link Track} and {@link TrackPoint} must be immutable (i.e., their content does not change). + */ + public RecordingData(Track track, TrackPoint lastTrackPoint, SensorDataSet sensorDataSet) { + this.track = track; + this.latestTrackPoint = lastTrackPoint; + this.sensorDataSet = sensorDataSet; + } + + public Track getTrack() { + return track; + } + + public String getTrackCategory() { + if (track == null) { + return ""; + } + return track.getCategory(); + } + + @NonNull + public TrackStatistics getTrackStatistics() { + if (track == null) { + return new TrackStatistics(); + } + + return track.getTrackStatistics(); + } + + public TrackPoint getLatestTrackPoint() { + return latestTrackPoint; + } + + public SensorDataSet getSensorDataSet() { + return sensorDataSet; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + RecordingData that = (RecordingData) o; + return Objects.equals(track, that.track) && Objects.equals(latestTrackPoint, that.latestTrackPoint) && Objects.equals(sensorDataSet, that.sensorDataSet); + } + + @Override + public int hashCode() { + return Objects.hash(track, latestTrackPoint, sensorDataSet); + } + + @NonNull + @Override + public String toString() { + return "RecordingData{" + + "track=" + track + + ", latestTrackPoint=" + latestTrackPoint + + ", sensorDataSet=" + sensorDataSet + + '}'; + } +} diff --git a/src/main/java/de/dennisguse/opentracks/services/RecordingStatus.java b/src/main/java/de/dennisguse/opentracks/services/RecordingStatus.java new file mode 100644 index 000000000..6597bc1f3 --- /dev/null +++ b/src/main/java/de/dennisguse/opentracks/services/RecordingStatus.java @@ -0,0 +1,73 @@ +package de.dennisguse.opentracks.services; + +import androidx.annotation.NonNull; +import androidx.annotation.VisibleForTesting; + +import java.util.Objects; + +import de.dennisguse.opentracks.data.models.Track; + +public class RecordingStatus { + private final Track.Id trackId; + private final boolean paused; + + @VisibleForTesting + RecordingStatus(Track.Id trackId, boolean paused) { + this.trackId = trackId; + this.paused = paused; + } + + public Track.Id getTrackId() { + return trackId; + } + + public boolean isRecording() { + return trackId != null; + } + + public boolean isPaused() { + return paused; + } + + public boolean isRecordingAndNotPaused() { + return isRecording() && !isPaused(); + } + + static RecordingStatus notRecording() { + return new RecordingStatus(null, false); + } + + static RecordingStatus record(@NonNull Track.Id trackId) { + return new RecordingStatus(trackId, false); + } + + RecordingStatus pause() { + return new RecordingStatus(getTrackId(), true); + } + + public RecordingStatus stop() { + return TrackRecordingService.STATUS_DEFAULT; + } + + @NonNull + @Override + public String toString() { + return "RecordingStatus{" + + "trackId=" + trackId + + ", paused=" + paused + + '}'; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + RecordingStatus that = (RecordingStatus) o; + return paused == that.paused && Objects.equals(trackId, that.trackId); + } + + @Override + public int hashCode() { + return Objects.hash(trackId, paused); + } +} diff --git a/src/main/java/de/dennisguse/opentracks/services/TrackRecordingService.java b/src/main/java/de/dennisguse/opentracks/services/TrackRecordingService.java index 49ee59f5e..e2a33f4f4 100644 --- a/src/main/java/de/dennisguse/opentracks/services/TrackRecordingService.java +++ b/src/main/java/de/dennisguse/opentracks/services/TrackRecordingService.java @@ -24,14 +24,12 @@ import android.os.PowerManager.WakeLock; import android.util.Log; import android.util.Pair; -import androidx.annotation.NonNull; import androidx.annotation.VisibleForTesting; import androidx.lifecycle.LiveData; import androidx.lifecycle.MutableLiveData; import java.time.Duration; import java.time.ZoneOffset; -import java.util.Objects; import de.dennisguse.opentracks.R; import de.dennisguse.opentracks.data.CustomContentProvider; @@ -46,7 +44,6 @@ import de.dennisguse.opentracks.services.handlers.EGM2008CorrectionManager; import de.dennisguse.opentracks.services.handlers.GpsStatusValue; import de.dennisguse.opentracks.services.handlers.TrackPointCreator; import de.dennisguse.opentracks.settings.SettingsActivity; -import de.dennisguse.opentracks.stats.TrackStatistics; import de.dennisguse.opentracks.util.ExportUtils; import de.dennisguse.opentracks.util.SystemUtils; @@ -66,9 +63,20 @@ public class TrackRecordingService extends Service implements TrackPointCreator. public static final RecordingData NOT_RECORDING = new RecordingData(null, null, null); public static final GpsStatusValue STATUS_GPS_DEFAULT = GpsStatusValue.GPS_NONE; + public class Binder extends android.os.Binder { + + private Binder() { + super(); + } + + public TrackRecordingService getService() { + return TrackRecordingService.this; + } + } + private final Binder binder = new Binder(); - // The following variables are setFrequency in onCreate: + // The following variables are set in onCreate: private VoiceAnnouncementManager voiceAnnouncementManager; private TrackRecordingServiceNotificationManager notificationManager; @@ -180,11 +188,6 @@ public class TrackRecordingService extends Service implements TrackPointCreator. return trackRecordingManager.insertMarker(name, category, description, photoUrl); } - /** - * Starts a new track. - * - * @return the track id - */ public Track.Id startNewTrack() { if (isRecording()) { Log.w(TAG, "Ignore startNewTrack. Already recording."); @@ -201,12 +204,6 @@ public class TrackRecordingService extends Service implements TrackPointCreator. return trackId; } - /** - * Resumes the track identified by trackId. - * It results in a pause/continue. - * - * @param trackId the id of the track to be resumed. - */ public void resumeTrack(Track.Id trackId) { trackPointCreator.reset(); trackRecordingManager.resumeExistingTrack(trackId, trackPointCreator.createSegmentStartManual()); @@ -234,18 +231,18 @@ public class TrackRecordingService extends Service implements TrackPointCreator. // Update instance variables handler.postDelayed(updateRecordingData, RECORDING_DATA_UPDATE_INTERVAL.toMillis()); - startGps(); + startSensors(); voiceAnnouncementManager.restore(trackRecordingManager.getTrackStatistics()); } - public void tryStartGps() { + public void tryStartSensors() { if (isRecording()) return; - startGps(); + startSensors(); } - private void startGps() { + private void startSensors() { wakeLock = SystemUtils.acquireWakeLock(this, wakeLock); trackPointCreator.start(this); showNotification(true); @@ -303,25 +300,19 @@ public class TrackRecordingService extends Service implements TrackPointCreator. recordingDataObservable.postValue(NOT_RECORDING); } - // Shutdown periodic tasks voiceAnnouncementManager.shutdown(); // Update instance variables trackPointCreator.stop(); - stopGps(trackStopped); + stopSensors(trackStopped); } - public void stopGpsAndShutdown() { - stopGps(true); + public void stopSensorsAndShutdown() { + stopSensors(true); } - /** - * Stops gps. - * - * @param shutdown true to shutdown self - */ - void stopGps(boolean shutdown) { + void stopSensors(boolean shutdown) { if (!isRecording()) return; trackPointCreator.stop(); @@ -441,150 +432,4 @@ public class TrackRecordingService extends Service implements TrackPointCreator. startActivity(intent); } } - - - public class Binder extends android.os.Binder { - - private Binder() { - super(); - } - - public TrackRecordingService getService() { - return TrackRecordingService.this; - } - } - - public static class RecordingStatus { - private final Track.Id trackId; - private final boolean paused; - - @VisibleForTesting - RecordingStatus(Track.Id trackId, boolean paused) { - this.trackId = trackId; - this.paused = paused; - } - - public Track.Id getTrackId() { - return trackId; - } - - public boolean isRecording() { - return trackId != null; - } - - public boolean isPaused() { - return paused; - } - - public boolean isRecordingAndNotPaused() { - return isRecording() && !isPaused(); - } - - private static RecordingStatus notRecording() { - return new RecordingStatus(null, false); - } - - private static RecordingStatus record(@NonNull Track.Id trackId) { - return new RecordingStatus(trackId, false); - } - - private RecordingStatus pause() { - return new RecordingStatus(getTrackId(), true); - } - - public RecordingStatus stop() { - return STATUS_DEFAULT; - } - - @NonNull - @Override - public String toString() { - return "RecordingStatus{" + - "trackId=" + trackId + - ", paused=" + paused + - '}'; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - RecordingStatus that = (RecordingStatus) o; - return paused == that.paused && Objects.equals(trackId, that.trackId); - } - - @Override - public int hashCode() { - return Objects.hash(trackId, paused); - } - } - - public static class RecordingData { - - private final Track track; - - private final TrackPoint latestTrackPoint; - - private final SensorDataSet sensorDataSet; - - /** - * {@link Track} and {@link TrackPoint} must be immutable (i.e., their content does not change). - */ - public RecordingData(Track track, TrackPoint lastTrackPoint, SensorDataSet sensorDataSet) { - this.track = track; - this.latestTrackPoint = lastTrackPoint; - this.sensorDataSet = sensorDataSet; - } - - public Track getTrack() { - return track; - } - - public String getTrackCategory() { - if (track == null) { - return ""; - } - return track.getCategory(); - } - - @NonNull - public TrackStatistics getTrackStatistics() { - if (track == null) { - return new TrackStatistics(); - } - - return track.getTrackStatistics(); - } - - public TrackPoint getLatestTrackPoint() { - return latestTrackPoint; - } - - public SensorDataSet getSensorDataSet() { - return sensorDataSet; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - RecordingData that = (RecordingData) o; - return Objects.equals(track, that.track) && Objects.equals(latestTrackPoint, that.latestTrackPoint) && Objects.equals(sensorDataSet, that.sensorDataSet); - } - - @Override - public int hashCode() { - return Objects.hash(track, latestTrackPoint, sensorDataSet); - } - - @NonNull - @Override - public String toString() { - return "RecordingData{" + - "track=" + track + - ", latestTrackPoint=" + latestTrackPoint + - ", sensorDataSet=" + sensorDataSet + - '}'; - } - } } \ No newline at end of file diff --git a/src/main/java/de/dennisguse/opentracks/settings/MainSettingsFragment.java b/src/main/java/de/dennisguse/opentracks/settings/MainSettingsFragment.java index 9387b43f0..8227fdb59 100644 --- a/src/main/java/de/dennisguse/opentracks/settings/MainSettingsFragment.java +++ b/src/main/java/de/dennisguse/opentracks/settings/MainSettingsFragment.java @@ -7,6 +7,7 @@ import androidx.preference.Preference; import androidx.preference.PreferenceFragmentCompat; import de.dennisguse.opentracks.R; +import de.dennisguse.opentracks.services.RecordingStatus; import de.dennisguse.opentracks.services.TrackRecordingService; import de.dennisguse.opentracks.services.TrackRecordingServiceConnection; @@ -14,7 +15,7 @@ public class MainSettingsFragment extends PreferenceFragmentCompat { private static final String TAG = MainSettingsFragment.class.getSimpleName(); - private TrackRecordingService.RecordingStatus recordingStatus = TrackRecordingService.STATUS_DEFAULT; + private RecordingStatus recordingStatus = TrackRecordingService.STATUS_DEFAULT; private TrackRecordingServiceConnection trackRecordingServiceConnection; private final TrackRecordingServiceConnection.Callback bindServiceCallback = service -> service.getRecordingStatusObservable() @@ -98,7 +99,7 @@ public class MainSettingsFragment extends PreferenceFragmentCompat { super.onDisplayPreferenceDialog(preference); } - private void onRecordingStatusChanged(TrackRecordingService.RecordingStatus status) { + private void onRecordingStatusChanged(RecordingStatus status) { this.recordingStatus = status; if (isAdded()) { updatePrefsDependOnRecording(); diff --git a/src/main/java/de/dennisguse/opentracks/ui/markers/MarkerListActivity.java b/src/main/java/de/dennisguse/opentracks/ui/markers/MarkerListActivity.java index 671c0d95e..9858f8ad9 100644 --- a/src/main/java/de/dennisguse/opentracks/ui/markers/MarkerListActivity.java +++ b/src/main/java/de/dennisguse/opentracks/ui/markers/MarkerListActivity.java @@ -38,6 +38,7 @@ import de.dennisguse.opentracks.data.models.Marker; import de.dennisguse.opentracks.data.models.Track; import de.dennisguse.opentracks.data.tables.MarkerColumns; import de.dennisguse.opentracks.databinding.MarkerListBinding; +import de.dennisguse.opentracks.services.RecordingStatus; import de.dennisguse.opentracks.services.TrackRecordingService; import de.dennisguse.opentracks.services.TrackRecordingServiceConnection; import de.dennisguse.opentracks.share.ShareUtils; @@ -59,7 +60,7 @@ public class MarkerListActivity extends AbstractActivity implements DeleteMarker private ContentProviderUtils contentProviderUtils; - private TrackRecordingService.RecordingStatus recordingStatus = TrackRecordingService.STATUS_DEFAULT; + private RecordingStatus recordingStatus = TrackRecordingService.STATUS_DEFAULT; private Track track; private MarkerResourceCursorAdapter resourceCursorAdapter; @@ -284,7 +285,7 @@ public class MarkerListActivity extends AbstractActivity implements DeleteMarker // Do nothing } - private void onRecordingStatusChanged(TrackRecordingService.RecordingStatus status) { + private void onRecordingStatusChanged(RecordingStatus status) { recordingStatus = status; } diff --git a/src/main/java/de/dennisguse/opentracks/viewmodels/StatisticDataBuilder.java b/src/main/java/de/dennisguse/opentracks/viewmodels/StatisticDataBuilder.java index a619c4205..200f90b60 100644 --- a/src/main/java/de/dennisguse/opentracks/viewmodels/StatisticDataBuilder.java +++ b/src/main/java/de/dennisguse/opentracks/viewmodels/StatisticDataBuilder.java @@ -15,7 +15,7 @@ import de.dennisguse.opentracks.data.models.Cadence; import de.dennisguse.opentracks.data.models.Speed; import de.dennisguse.opentracks.data.models.TrackPoint; import de.dennisguse.opentracks.sensors.sensorData.SensorDataSet; -import de.dennisguse.opentracks.services.TrackRecordingService; +import de.dennisguse.opentracks.services.RecordingData; import de.dennisguse.opentracks.stats.SensorStatistics; import de.dennisguse.opentracks.stats.TrackStatistics; import de.dennisguse.opentracks.ui.customRecordingLayout.DataField; @@ -24,7 +24,7 @@ import de.dennisguse.opentracks.util.StringUtils; public class StatisticDataBuilder { - public static List fromRecordingData(@NonNull Context context, @NonNull TrackRecordingService.RecordingData recordingData, @NonNull Layout layout, boolean metricUnits) { + public static List fromRecordingData(@NonNull Context context, @NonNull RecordingData recordingData, @NonNull Layout layout, boolean metricUnits) { List statisticDataList = layout.getFields().stream() .filter(DataField::isVisible) .map(field -> build(context, recordingData, field.getKey(), field.isPrimary(), metricUnits)) @@ -34,7 +34,7 @@ public class StatisticDataBuilder { return statisticDataList; } - private static StatisticData build(@NonNull Context context, @NonNull TrackRecordingService.RecordingData recordingData, @NonNull String fieldKey, boolean isPrimary, boolean metricUnits) { + private static StatisticData build(@NonNull Context context, @NonNull RecordingData recordingData, @NonNull String fieldKey, boolean isPrimary, boolean metricUnits) { final TrackPoint latestTrackPoint = recordingData.getLatestTrackPoint(); final SensorDataSet sensorDataSet = recordingData.getSensorDataSet(); final TrackStatistics trackStatistics = recordingData.getTrackStatistics(); @@ -153,7 +153,7 @@ public class StatisticDataBuilder { /** * Builds a list of StatisticData with sensors configured but not in statisticDataList. */ - private static List getSensorStatsDataIfNeeded(Context context, TrackRecordingService.RecordingData recordingData, List statisticDataList, boolean metricUnits) { + private static List getSensorStatsDataIfNeeded(Context context, RecordingData recordingData, List statisticDataList, boolean metricUnits) { List sensorDataList = new ArrayList<>(); SensorDataSet sensorDataSet = recordingData.getSensorDataSet(); if (sensorDataSet == null) { diff --git a/src/main/java/de/dennisguse/opentracks/viewmodels/StatisticsDataModel.java b/src/main/java/de/dennisguse/opentracks/viewmodels/StatisticsDataModel.java index 4b6bb9df5..f58b8fd72 100644 --- a/src/main/java/de/dennisguse/opentracks/viewmodels/StatisticsDataModel.java +++ b/src/main/java/de/dennisguse/opentracks/viewmodels/StatisticsDataModel.java @@ -8,7 +8,7 @@ import androidx.lifecycle.MutableLiveData; import java.util.List; -import de.dennisguse.opentracks.services.TrackRecordingService; +import de.dennisguse.opentracks.services.RecordingData; import de.dennisguse.opentracks.ui.customRecordingLayout.Layout; public class StatisticsDataModel extends AndroidViewModel { @@ -26,7 +26,7 @@ public class StatisticsDataModel extends AndroidViewModel { return statsData; } - public void update(TrackRecordingService.RecordingData recordingData, Layout layout, boolean metricUnit) { + public void update(RecordingData recordingData, Layout layout, boolean metricUnit) { new Thread(() -> { List statisticDataList = StatisticDataBuilder.fromRecordingData(getApplication(), recordingData, layout, metricUnit); statsData.postValue(statisticDataList);