mirror of
https://codeberg.org/OpenTracksApp/OpenTracks.git
synced 2026-10-11 21:43:05 +02:00
Update the ui thread in StatsFragment to support pause/resume
for the total time.
This commit is contained in:
@@ -82,9 +82,11 @@ public class ImportAsyncTask extends AsyncTask<Void, Integer, Boolean> {
|
|||||||
|
|
||||||
myTracksProviderUtils = MyTracksProviderUtils.Factory.get(importActivity);
|
myTracksProviderUtils = MyTracksProviderUtils.Factory.get(importActivity);
|
||||||
|
|
||||||
// Get the wake lock if not recording
|
// Get the wake lock if not recording or paused
|
||||||
if (PreferencesUtils.getLong(importActivity, R.string.recording_track_id_key)
|
if (PreferencesUtils.getLong(importActivity, R.string.recording_track_id_key)
|
||||||
== PreferencesUtils.RECORDING_TRACK_ID_DEFAULT) {
|
== PreferencesUtils.RECORDING_TRACK_ID_DEFAULT || PreferencesUtils.getBoolean(
|
||||||
|
importActivity, R.string.recording_track_paused_key,
|
||||||
|
PreferencesUtils.RECORDING_TRACK_PAUSED_DEFAULT)) {
|
||||||
wakeLock = SystemUtils.acquireWakeLock(importActivity, wakeLock);
|
wakeLock = SystemUtils.acquireWakeLock(importActivity, wakeLock);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -70,6 +70,8 @@ public class TrackDataHub implements DataSourceListener {
|
|||||||
|
|
||||||
// Preference values
|
// Preference values
|
||||||
private long selectedTrackId;
|
private long selectedTrackId;
|
||||||
|
private long recordingTrackId;
|
||||||
|
private boolean recordingTrackPaused;
|
||||||
private boolean metricUnits;
|
private boolean metricUnits;
|
||||||
private boolean reportSpeed;
|
private boolean reportSpeed;
|
||||||
private int minRequiredAccuracy;
|
private int minRequiredAccuracy;
|
||||||
@@ -132,17 +134,11 @@ public class TrackDataHub implements DataSourceListener {
|
|||||||
dataSource = newDataSource();
|
dataSource = newDataSource();
|
||||||
dataSourceManager = new DataSourceManager(dataSource, this);
|
dataSourceManager = new DataSourceManager(dataSource, this);
|
||||||
|
|
||||||
|
notifyPreferenceChanged(null);
|
||||||
runInHanderThread(new Runnable() {
|
runInHanderThread(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
dataSourceManager.updateListeners(trackDataManager.getRegisteredTrackDataTypes());
|
dataSourceManager.updateListeners(trackDataManager.getRegisteredTrackDataTypes());
|
||||||
selectedTrackId = PreferencesUtils.getLong(context, R.string.selected_track_id_key);
|
|
||||||
metricUnits = PreferencesUtils.getBoolean(
|
|
||||||
context, R.string.metric_units_key, PreferencesUtils.METRIC_UNITS_DEFAULT);
|
|
||||||
reportSpeed = PreferencesUtils.getBoolean(
|
|
||||||
context, R.string.report_speed_key, PreferencesUtils.REPORT_SPEED_DEFAULT);
|
|
||||||
minRequiredAccuracy = PreferencesUtils.getInt(context, R.string.min_required_accuracy_key,
|
|
||||||
PreferencesUtils.MIN_REQUIRED_ACCURACY_DEFAULT);
|
|
||||||
loadDataForAll();
|
loadDataForAll();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -251,9 +247,15 @@ public class TrackDataHub implements DataSourceListener {
|
|||||||
* Returns true if the selected track is recording.
|
* Returns true if the selected track is recording.
|
||||||
*/
|
*/
|
||||||
public boolean isSelectedTrackRecording() {
|
public boolean isSelectedTrackRecording() {
|
||||||
long recordingTrackId = PreferencesUtils.getLong(context, R.string.recording_track_id_key);
|
return selectedTrackId == recordingTrackId
|
||||||
return recordingTrackId != PreferencesUtils.RECORDING_TRACK_ID_DEFAULT
|
&& recordingTrackId != PreferencesUtils.RECORDING_TRACK_ID_DEFAULT;
|
||||||
&& recordingTrackId == selectedTrackId;
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns true if the selected track is paused.
|
||||||
|
*/
|
||||||
|
public boolean isSelectedTrackPaused() {
|
||||||
|
return selectedTrackId == recordingTrackId && recordingTrackPaused;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -293,37 +295,57 @@ public class TrackDataHub implements DataSourceListener {
|
|||||||
runInHanderThread(new Runnable() {
|
runInHanderThread(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
if (PreferencesUtils.getKey(context, R.string.min_required_accuracy_key).equals(key)) {
|
if (key == null
|
||||||
minRequiredAccuracy = PreferencesUtils.getInt(context, R.string.min_required_accuracy_key,
|
|| key.equals(PreferencesUtils.getKey(context, R.string.selected_track_id_key))) {
|
||||||
PreferencesUtils.MIN_REQUIRED_ACCURACY_DEFAULT);
|
long trackId = PreferencesUtils.getLong(context, R.string.selected_track_id_key);
|
||||||
} else if (PreferencesUtils.getKey(context, R.string.metric_units_key).equals(key)) {
|
boolean hasChanged = trackId != selectedTrackId;
|
||||||
|
selectedTrackId = trackId;
|
||||||
|
if (key != null) {
|
||||||
|
if (hasChanged) {
|
||||||
|
loadDataForAll();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (key == null
|
||||||
|
|| key.equals(PreferencesUtils.getKey(context, R.string.recording_track_id_key))) {
|
||||||
|
recordingTrackId = PreferencesUtils.getLong(context, R.string.recording_track_id_key);
|
||||||
|
}
|
||||||
|
if (key == null
|
||||||
|
|| key.equals(PreferencesUtils.getKey(context, R.string.recording_track_paused_key))) {
|
||||||
|
recordingTrackPaused = PreferencesUtils.getBoolean(
|
||||||
|
context, R.string.recording_track_paused_key,
|
||||||
|
PreferencesUtils.RECORDING_TRACK_PAUSED_DEFAULT);
|
||||||
|
}
|
||||||
|
if (key == null
|
||||||
|
|| key.equals(PreferencesUtils.getKey(context, R.string.metric_units_key))) {
|
||||||
metricUnits = PreferencesUtils.getBoolean(
|
metricUnits = PreferencesUtils.getBoolean(
|
||||||
context, R.string.metric_units_key, PreferencesUtils.METRIC_UNITS_DEFAULT);
|
context, R.string.metric_units_key, PreferencesUtils.METRIC_UNITS_DEFAULT);
|
||||||
Set<TrackDataListener> trackDataListeners = trackDataManager.getListeners(
|
if (key != null) {
|
||||||
TrackDataType.PREFERENCE);
|
for (TrackDataListener trackDataListener :
|
||||||
for (TrackDataListener trackDataListener : trackDataListeners) {
|
trackDataManager.getListeners(TrackDataType.PREFERENCE)) {
|
||||||
if (trackDataListener.onMetricUnitsChanged(metricUnits)) {
|
if (trackDataListener.onMetricUnitsChanged(metricUnits)) {
|
||||||
loadDataForListener(trackDataListener);
|
loadDataForListener(trackDataListener);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (PreferencesUtils.getKey(context, R.string.report_speed_key).equals(key)) {
|
}
|
||||||
|
if (key == null
|
||||||
|
|| key.equals(PreferencesUtils.getKey(context, R.string.report_speed_key))) {
|
||||||
reportSpeed = PreferencesUtils.getBoolean(
|
reportSpeed = PreferencesUtils.getBoolean(
|
||||||
context, R.string.report_speed_key, PreferencesUtils.REPORT_SPEED_DEFAULT);
|
context, R.string.report_speed_key, PreferencesUtils.REPORT_SPEED_DEFAULT);
|
||||||
Set<TrackDataListener> trackDataListeners = trackDataManager.getListeners(
|
if (key != null) {
|
||||||
TrackDataType.PREFERENCE);
|
for (TrackDataListener trackDataListener :
|
||||||
for (TrackDataListener trackDataListener : trackDataListeners) {
|
trackDataManager.getListeners(TrackDataType.PREFERENCE)) {
|
||||||
if (trackDataListener.onReportSpeedChanged(reportSpeed)) {
|
if (trackDataListener.onReportSpeedChanged(reportSpeed)) {
|
||||||
loadDataForListener(trackDataListener);
|
loadDataForListener(trackDataListener);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (PreferencesUtils.getKey(context, R.string.selected_track_id_key).equals(key)) {
|
}
|
||||||
long trackId = PreferencesUtils.getLong(context, R.string.selected_track_id_key);
|
if (key == null
|
||||||
if (trackId == selectedTrackId) {
|
|| key.equals(PreferencesUtils.getKey(context, R.string.min_required_accuracy_key))) {
|
||||||
Log.i(TAG, "Not reloading track " + trackId);
|
minRequiredAccuracy = PreferencesUtils.getInt(context, R.string.min_required_accuracy_key,
|
||||||
return;
|
PreferencesUtils.MIN_REQUIRED_ACCURACY_DEFAULT);
|
||||||
}
|
|
||||||
selectedTrackId = trackId;
|
|
||||||
loadDataForAll();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -487,7 +509,7 @@ public class TrackDataHub implements DataSourceListener {
|
|||||||
}
|
}
|
||||||
Track track = myTracksProviderUtils.getTrack(selectedTrackId);
|
Track track = myTracksProviderUtils.getTrack(selectedTrackId);
|
||||||
for (TrackDataListener trackDataListener : trackDataListeners) {
|
for (TrackDataListener trackDataListener : trackDataListeners) {
|
||||||
trackDataListener.onSelectedTrackChanged(track, isSelectedTrackRecording());
|
trackDataListener.onSelectedTrackChanged(track);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -64,9 +64,8 @@ public interface TrackDataListener {
|
|||||||
* calls to clear the current data).
|
* calls to clear the current data).
|
||||||
*
|
*
|
||||||
* @param track the selected track or null if no track is selected
|
* @param track the selected track or null if no track is selected
|
||||||
* @param isRecording true if the selected track is recording
|
|
||||||
*/
|
*/
|
||||||
public void onSelectedTrackChanged(Track track, boolean isRecording);
|
public void onSelectedTrackChanged(Track track);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Called when the track or its statistics has been updated.
|
* Called when the track or its statistics has been updated.
|
||||||
|
|||||||
@@ -179,7 +179,7 @@ public class ChartFragment extends Fragment implements TrackDataListener {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onSelectedTrackChanged(Track track, boolean isRecording) {
|
public void onSelectedTrackChanged(Track track) {
|
||||||
// We don't care.
|
// We don't care.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -334,7 +334,7 @@ public class MapFragment extends Fragment
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onSelectedTrackChanged(final Track track, final boolean isRecording) {
|
public void onSelectedTrackChanged(final Track track) {
|
||||||
getActivity().runOnUiThread(new Runnable() {
|
getActivity().runOnUiThread(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
@@ -350,7 +350,7 @@ public class MapFragment extends Fragment
|
|||||||
currentSelectedTrackId = track.getId();
|
currentSelectedTrackId = track.getId();
|
||||||
updateMap(track);
|
updateMap(track);
|
||||||
}
|
}
|
||||||
mapOverlay.setShowEndMarker(!isRecording);
|
mapOverlay.setShowEndMarker(!isSelectedTrackRecording());
|
||||||
}
|
}
|
||||||
mapView.invalidate();
|
mapView.invalidate();
|
||||||
}
|
}
|
||||||
@@ -452,6 +452,14 @@ public class MapFragment extends Fragment
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns true if the selected track is recording. Needs to be synchronized
|
||||||
|
* because trackDataHub can be accessed by multiple threads.
|
||||||
|
*/
|
||||||
|
private synchronized boolean isSelectedTrackRecording() {
|
||||||
|
return trackDataHub != null && trackDataHub.isSelectedTrackRecording();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Updates the map by either zooming to the requested marker or showing the track.
|
* Updates the map by either zooming to the requested marker or showing the track.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -23,7 +23,6 @@ import com.google.android.apps.mytracks.content.TrackDataListener;
|
|||||||
import com.google.android.apps.mytracks.content.TrackDataType;
|
import com.google.android.apps.mytracks.content.TrackDataType;
|
||||||
import com.google.android.apps.mytracks.content.Waypoint;
|
import com.google.android.apps.mytracks.content.Waypoint;
|
||||||
import com.google.android.apps.mytracks.stats.TripStatistics;
|
import com.google.android.apps.mytracks.stats.TripStatistics;
|
||||||
import com.google.android.apps.mytracks.util.PreferencesUtils;
|
|
||||||
import com.google.android.apps.mytracks.util.StatsUtils;
|
import com.google.android.apps.mytracks.util.StatsUtils;
|
||||||
import com.google.android.maps.mytracks.R;
|
import com.google.android.maps.mytracks.R;
|
||||||
|
|
||||||
@@ -52,17 +51,15 @@ public class StatsFragment extends Fragment implements TrackDataListener {
|
|||||||
private TrackDataHub trackDataHub;
|
private TrackDataHub trackDataHub;
|
||||||
private UiUpdateThread uiUpdateThread;
|
private UiUpdateThread uiUpdateThread;
|
||||||
|
|
||||||
// The start time of the current track.
|
|
||||||
private long startTime = -1L;
|
|
||||||
|
|
||||||
private Location lastLocation = null;
|
private Location lastLocation = null;
|
||||||
private TripStatistics lastTripStatistics = null;
|
private TripStatistics lastTripStatistics = null;
|
||||||
|
|
||||||
// A runnable to update the total time field.
|
// A runnable to update the total time field.
|
||||||
private final Runnable updateTotalTime = new Runnable() {
|
private final Runnable updateTotalTime = new Runnable() {
|
||||||
public void run() {
|
public void run() {
|
||||||
if (isSelectedTrackRecording()) {
|
if (isSelectedTrackRecording() && !isSelectedTrackPaused() && lastTripStatistics != null) {
|
||||||
StatsUtils.setTotalTimeValue(getActivity(), System.currentTimeMillis() - startTime);
|
StatsUtils.setTotalTimeValue(getActivity(), System.currentTimeMillis()
|
||||||
|
- lastTripStatistics.getStopTime() + lastTripStatistics.getTotalTime());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -74,8 +71,7 @@ public class StatsFragment extends Fragment implements TrackDataListener {
|
|||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
Log.d(TAG, "UI update thread started");
|
Log.d(TAG, "UI update thread started");
|
||||||
while (PreferencesUtils.getLong(getActivity(), R.string.recording_track_id_key)
|
while (true) {
|
||||||
!= PreferencesUtils.RECORDING_TRACK_ID_DEFAULT) {
|
|
||||||
getActivity().runOnUiThread(updateTotalTime);
|
getActivity().runOnUiThread(updateTotalTime);
|
||||||
try {
|
try {
|
||||||
Thread.sleep(1000L);
|
Thread.sleep(1000L);
|
||||||
@@ -133,7 +129,7 @@ public class StatsFragment extends Fragment implements TrackDataListener {
|
|||||||
public void onLocationChanged(final Location location) {
|
public void onLocationChanged(final Location location) {
|
||||||
if (isResumed() && isSelectedTrackRecording()) {
|
if (isResumed() && isSelectedTrackRecording()) {
|
||||||
getActivity().runOnUiThread(new Runnable() {
|
getActivity().runOnUiThread(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
lastLocation = location;
|
lastLocation = location;
|
||||||
StatsUtils.setLocationValues(getActivity(), lastLocation, true);
|
StatsUtils.setLocationValues(getActivity(), lastLocation, true);
|
||||||
@@ -148,8 +144,9 @@ public class StatsFragment extends Fragment implements TrackDataListener {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onSelectedTrackChanged(Track track, boolean isRecording) {
|
public void onSelectedTrackChanged(Track track) {
|
||||||
if (isResumed()) {
|
if (isResumed()) {
|
||||||
|
boolean isRecording = isSelectedTrackRecording();
|
||||||
if (uiUpdateThread == null && isRecording) {
|
if (uiUpdateThread == null && isRecording) {
|
||||||
uiUpdateThread = new UiUpdateThread();
|
uiUpdateThread = new UiUpdateThread();
|
||||||
uiUpdateThread.start();
|
uiUpdateThread.start();
|
||||||
@@ -164,7 +161,7 @@ public class StatsFragment extends Fragment implements TrackDataListener {
|
|||||||
public void onTrackUpdated(final Track track) {
|
public void onTrackUpdated(final Track track) {
|
||||||
if (isResumed()) {
|
if (isResumed()) {
|
||||||
getActivity().runOnUiThread(new Runnable() {
|
getActivity().runOnUiThread(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
if (track == null || track.getTripStatistics() == null) {
|
if (track == null || track.getTripStatistics() == null) {
|
||||||
lastLocation = null;
|
lastLocation = null;
|
||||||
@@ -174,7 +171,6 @@ public class StatsFragment extends Fragment implements TrackDataListener {
|
|||||||
}
|
}
|
||||||
lastTripStatistics = track.getTripStatistics();
|
lastTripStatistics = track.getTripStatistics();
|
||||||
|
|
||||||
startTime = track.getTripStatistics().getStartTime();
|
|
||||||
if (!isSelectedTrackRecording()) {
|
if (!isSelectedTrackRecording()) {
|
||||||
lastLocation = null;
|
lastLocation = null;
|
||||||
}
|
}
|
||||||
@@ -228,7 +224,7 @@ public class StatsFragment extends Fragment implements TrackDataListener {
|
|||||||
public boolean onMetricUnitsChanged(final boolean metric) {
|
public boolean onMetricUnitsChanged(final boolean metric) {
|
||||||
if (isResumed()) {
|
if (isResumed()) {
|
||||||
getActivity().runOnUiThread(new Runnable() {
|
getActivity().runOnUiThread(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
updateUi();
|
updateUi();
|
||||||
}
|
}
|
||||||
@@ -280,6 +276,14 @@ public class StatsFragment extends Fragment implements TrackDataListener {
|
|||||||
return trackDataHub != null && trackDataHub.isSelectedTrackRecording();
|
return trackDataHub != null && trackDataHub.isSelectedTrackRecording();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns true if the selected track is paused. Needs to be synchronized
|
||||||
|
* because trackDataHub can be accessed by multiple threads.
|
||||||
|
*/
|
||||||
|
private synchronized boolean isSelectedTrackPaused() {
|
||||||
|
return trackDataHub != null && trackDataHub.isSelectedTrackPaused();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Updates the UI.
|
* Updates the UI.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -81,9 +81,10 @@ public class SaveAsyncTask extends AsyncTask<Void, Integer, Boolean> {
|
|||||||
|
|
||||||
myTracksProviderUtils = MyTracksProviderUtils.Factory.get(saveActivity);
|
myTracksProviderUtils = MyTracksProviderUtils.Factory.get(saveActivity);
|
||||||
|
|
||||||
// Get the wake lock if not recording
|
// Get the wake lock if not recording or paused
|
||||||
if (PreferencesUtils.getLong(saveActivity, R.string.recording_track_id_key)
|
if (PreferencesUtils.getLong(saveActivity, R.string.recording_track_id_key)
|
||||||
== PreferencesUtils.RECORDING_TRACK_ID_DEFAULT) {
|
== PreferencesUtils.RECORDING_TRACK_ID_DEFAULT || PreferencesUtils.getBoolean(saveActivity,
|
||||||
|
R.string.recording_track_paused_key, PreferencesUtils.RECORDING_TRACK_PAUSED_DEFAULT)) {
|
||||||
wakeLock = SystemUtils.acquireWakeLock(saveActivity, wakeLock);
|
wakeLock = SystemUtils.acquireWakeLock(saveActivity, wakeLock);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -570,8 +570,8 @@ public class TrackRecordingService extends Service {
|
|||||||
PreferencesUtils.setInt(this, R.string.auto_resume_track_current_retry_key, 0);
|
PreferencesUtils.setInt(this, R.string.auto_resume_track_current_retry_key, 0);
|
||||||
|
|
||||||
// Update database
|
// Update database
|
||||||
track.setId(recordingTrackId);
|
track.setId(trackId);
|
||||||
track.setName(TrackNameUtils.getTrackName(this, recordingTrackId, now, null));
|
track.setName(TrackNameUtils.getTrackName(this, trackId, now, null));
|
||||||
track.setCategory(PreferencesUtils.getString(
|
track.setCategory(PreferencesUtils.getString(
|
||||||
this, R.string.default_activity_key, PreferencesUtils.DEFAULT_ACTIVITY_DEFAULT));
|
this, R.string.default_activity_key, PreferencesUtils.DEFAULT_ACTIVITY_DEFAULT));
|
||||||
track.setTripStatistics(trackTripStatisticsBuilder.getTripStatistics());
|
track.setTripStatistics(trackTripStatisticsBuilder.getTripStatistics());
|
||||||
@@ -579,7 +579,7 @@ public class TrackRecordingService extends Service {
|
|||||||
insertWaypoint(WaypointCreationRequest.DEFAULT_START_TRACK);
|
insertWaypoint(WaypointCreationRequest.DEFAULT_START_TRACK);
|
||||||
|
|
||||||
startRecording(true);
|
startRecording(true);
|
||||||
return recordingTrackId;
|
return trackId;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -644,11 +644,14 @@ public class TrackRecordingService extends Service {
|
|||||||
PreferencesUtils.setBoolean(this, R.string.recording_track_paused_key, false);
|
PreferencesUtils.setBoolean(this, R.string.recording_track_paused_key, false);
|
||||||
|
|
||||||
// Update database
|
// Update database
|
||||||
Location resume = new Location(LocationManager.GPS_PROVIDER);
|
Track track = myTracksProviderUtils.getTrack(recordingTrackId);
|
||||||
resume.setLongitude(0);
|
if (track != null) {
|
||||||
resume.setLatitude(RESUME_LATITUDE);
|
Location resume = new Location(LocationManager.GPS_PROVIDER);
|
||||||
resume.setTime(System.currentTimeMillis());
|
resume.setLongitude(0);
|
||||||
insertLocation(resume, null, null);
|
resume.setLatitude(RESUME_LATITUDE);
|
||||||
|
resume.setTime(System.currentTimeMillis());
|
||||||
|
insertLocation(track, resume, null);
|
||||||
|
}
|
||||||
|
|
||||||
startRecording(false);
|
startRecording(false);
|
||||||
}
|
}
|
||||||
@@ -696,13 +699,10 @@ public class TrackRecordingService extends Service {
|
|||||||
updateRecordingState(PreferencesUtils.RECORDING_TRACK_ID_DEFAULT, true);
|
updateRecordingState(PreferencesUtils.RECORDING_TRACK_ID_DEFAULT, true);
|
||||||
|
|
||||||
// Update database
|
// Update database
|
||||||
insertLocation(lastLocation, getSensorDataSet(),
|
Track track = myTracksProviderUtils.getTrack(trackId);
|
||||||
myTracksProviderUtils.getLastTrackLocation(recordingTrackId));
|
|
||||||
|
|
||||||
Track track = myTracksProviderUtils.getTrack(recordingTrackId);
|
|
||||||
if (track != null) {
|
if (track != null) {
|
||||||
updateRecordingTrack(
|
insertLocation(track, lastLocation, myTracksProviderUtils.getLastTrackLocation(trackId));
|
||||||
track, myTracksProviderUtils.getLastTrackLocationId(recordingTrackId), false);
|
updateRecordingTrack(track, myTracksProviderUtils.getLastTrackLocationId(trackId), false);
|
||||||
}
|
}
|
||||||
|
|
||||||
endRecording(true, trackId);
|
endRecording(true, trackId);
|
||||||
@@ -723,14 +723,17 @@ public class TrackRecordingService extends Service {
|
|||||||
PreferencesUtils.setBoolean(this, R.string.recording_track_paused_key, true);
|
PreferencesUtils.setBoolean(this, R.string.recording_track_paused_key, true);
|
||||||
|
|
||||||
// Update database
|
// Update database
|
||||||
insertLocation(lastLocation, getSensorDataSet(),
|
Track track = myTracksProviderUtils.getTrack(recordingTrackId);
|
||||||
myTracksProviderUtils.getLastTrackLocation(recordingTrackId));
|
if (track != null) {
|
||||||
|
insertLocation(
|
||||||
|
track, lastLocation, myTracksProviderUtils.getLastTrackLocation(track.getId()));
|
||||||
|
|
||||||
Location pause = new Location(LocationManager.GPS_PROVIDER);
|
Location pause = new Location(LocationManager.GPS_PROVIDER);
|
||||||
pause.setLongitude(0);
|
pause.setLongitude(0);
|
||||||
pause.setLatitude(PAUSE_LATITUDE);
|
pause.setLatitude(PAUSE_LATITUDE);
|
||||||
pause.setTime(System.currentTimeMillis());
|
pause.setTime(System.currentTimeMillis());
|
||||||
insertLocation(pause, null, null);
|
insertLocation(track, pause, null);
|
||||||
|
}
|
||||||
|
|
||||||
endRecording(false, recordingTrackId);
|
endRecording(false, recordingTrackId);
|
||||||
}
|
}
|
||||||
@@ -739,7 +742,7 @@ public class TrackRecordingService extends Service {
|
|||||||
* Common code for ending a track or pausing a track.
|
* Common code for ending a track or pausing a track.
|
||||||
*
|
*
|
||||||
* @param trackStopped true if track is stopped, false if track is paused
|
* @param trackStopped true if track is stopped, false if track is paused
|
||||||
* @param trackId
|
* @param trackId the track id
|
||||||
*/
|
*/
|
||||||
private void endRecording(boolean trackStopped, long trackId) {
|
private void endRecording(boolean trackStopped, long trackId) {
|
||||||
|
|
||||||
@@ -773,7 +776,7 @@ public class TrackRecordingService extends Service {
|
|||||||
*/
|
*/
|
||||||
private void updateRecordingState(long trackId, boolean paused) {
|
private void updateRecordingState(long trackId, boolean paused) {
|
||||||
recordingTrackId = trackId;
|
recordingTrackId = trackId;
|
||||||
PreferencesUtils.setLong(this, R.string.recording_track_id_key, recordingTrackId);
|
PreferencesUtils.setLong(this, R.string.recording_track_id_key, trackId);
|
||||||
recordingTrackPaused = paused;
|
recordingTrackPaused = paused;
|
||||||
PreferencesUtils.setBoolean(this, R.string.recording_track_paused_key, recordingTrackPaused);
|
PreferencesUtils.setBoolean(this, R.string.recording_track_paused_key, recordingTrackPaused);
|
||||||
}
|
}
|
||||||
@@ -790,6 +793,12 @@ public class TrackRecordingService extends Service {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Track track = myTracksProviderUtils.getTrack(recordingTrackId);
|
||||||
|
if (track == null) {
|
||||||
|
Log.w(TAG, "Ignore onLocationChangedAsync. No track.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (!LocationUtils.isValidLocation(location)) {
|
if (!LocationUtils.isValidLocation(location)) {
|
||||||
Log.w(TAG, "Ignore onLocationChangedAsync. location is invalid.");
|
Log.w(TAG, "Ignore onLocationChangedAsync. location is invalid.");
|
||||||
return;
|
return;
|
||||||
@@ -800,20 +809,23 @@ public class TrackRecordingService extends Service {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Location lastTrackLocation = myTracksProviderUtils.getLastTrackLocation(recordingTrackId);
|
Location lastTrackLocation = myTracksProviderUtils.getLastTrackLocation(track.getId());
|
||||||
SensorDataSet sensorDataSet = getSensorDataSet();
|
|
||||||
|
|
||||||
long idleTime = currentSegmentHasLocation && LocationUtils.isValidLocation(lastTrackLocation) ?
|
long idleTime = currentSegmentHasLocation && LocationUtils.isValidLocation(lastTrackLocation) ?
|
||||||
location.getTime() - lastTrackLocation.getTime()
|
location.getTime() - lastTrackLocation.getTime()
|
||||||
: 0;
|
: 0L;
|
||||||
locationListenerPolicy.updateIdleTime(idleTime);
|
locationListenerPolicy.updateIdleTime(idleTime);
|
||||||
if (currentRecordingInterval != locationListenerPolicy.getDesiredPollingInterval()) {
|
if (currentRecordingInterval != locationListenerPolicy.getDesiredPollingInterval()) {
|
||||||
registerLocationListener();
|
registerLocationListener();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SensorDataSet sensorDataSet = getSensorDataSet();
|
||||||
|
if (sensorDataSet != null) {
|
||||||
|
location = new MyTracksLocation(location, sensorDataSet);
|
||||||
|
}
|
||||||
|
|
||||||
// Always insert the first segment location
|
// Always insert the first segment location
|
||||||
if (!currentSegmentHasLocation) {
|
if (!currentSegmentHasLocation) {
|
||||||
insertLocation(location, sensorDataSet, lastTrackLocation);
|
insertLocation(track, location, lastTrackLocation);
|
||||||
currentSegmentHasLocation = true;
|
currentSegmentHasLocation = true;
|
||||||
lastLocation = location;
|
lastLocation = location;
|
||||||
return;
|
return;
|
||||||
@@ -824,7 +836,7 @@ public class TrackRecordingService extends Service {
|
|||||||
* Should not happen. The current segment should have a location. Just
|
* Should not happen. The current segment should have a location. Just
|
||||||
* insert the current location.
|
* insert the current location.
|
||||||
*/
|
*/
|
||||||
insertLocation(location, sensorDataSet, lastTrackLocation);
|
insertLocation(track, location, lastTrackLocation);
|
||||||
lastLocation = location;
|
lastLocation = location;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -833,21 +845,21 @@ public class TrackRecordingService extends Service {
|
|||||||
if (distanceToLastTrackLocation < minRecordingDistance && sensorDataSet == null) {
|
if (distanceToLastTrackLocation < minRecordingDistance && sensorDataSet == null) {
|
||||||
// skip
|
// skip
|
||||||
} else if (distanceToLastTrackLocation > maxRecordingDistance) {
|
} else if (distanceToLastTrackLocation > maxRecordingDistance) {
|
||||||
insertLocation(lastLocation, sensorDataSet, lastTrackLocation);
|
insertLocation(track, lastLocation, lastTrackLocation);
|
||||||
Location pause = new Location(LocationManager.GPS_PROVIDER);
|
Location pause = new Location(LocationManager.GPS_PROVIDER);
|
||||||
pause.setLongitude(0);
|
pause.setLongitude(0);
|
||||||
pause.setLatitude(PAUSE_LATITUDE);
|
pause.setLatitude(PAUSE_LATITUDE);
|
||||||
pause.setTime(lastLocation.getTime());
|
pause.setTime(lastLocation.getTime());
|
||||||
insertLocation(pause, null, null);
|
insertLocation(track, pause, null);
|
||||||
|
|
||||||
insertLocation(location, sensorDataSet, lastTrackLocation);
|
insertLocation(track, location, lastTrackLocation);
|
||||||
} else {
|
} else {
|
||||||
/*
|
/*
|
||||||
* (distanceToLastTrackLocation >= minRecordingDistance ||
|
* (distanceToLastTrackLocation >= minRecordingDistance ||
|
||||||
* hasSensorData) && distanceToLastTrackLocation <= maxRecordingDistance
|
* hasSensorData) && distanceToLastTrackLocation <= maxRecordingDistance
|
||||||
*/
|
*/
|
||||||
insertLocation(lastLocation, sensorDataSet, lastTrackLocation);
|
insertLocation(track, lastLocation, lastTrackLocation);
|
||||||
insertLocation(location, sensorDataSet, lastTrackLocation);
|
insertLocation(track, location, lastTrackLocation);
|
||||||
}
|
}
|
||||||
lastLocation = location;
|
lastLocation = location;
|
||||||
} catch (Error e) {
|
} catch (Error e) {
|
||||||
@@ -859,12 +871,7 @@ public class TrackRecordingService extends Service {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void insertLocation(
|
private void insertLocation(Track track, Location location, Location lastRecordedLocation) {
|
||||||
Location location, SensorDataSet sensorDataSet, Location lastRecordedLocation) {
|
|
||||||
Track track = myTracksProviderUtils.getTrack(recordingTrackId);
|
|
||||||
if (track == null) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (location == null) {
|
if (location == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -873,10 +880,7 @@ public class TrackRecordingService extends Service {
|
|||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
if (sensorDataSet != null) {
|
Uri uri = myTracksProviderUtils.insertTrackPoint(location, track.getId());
|
||||||
location = new MyTracksLocation(location, sensorDataSet);
|
|
||||||
}
|
|
||||||
Uri uri = myTracksProviderUtils.insertTrackPoint(location, recordingTrackId);
|
|
||||||
long trackPointId = Long.parseLong(uri.getLastPathSegment());
|
long trackPointId = Long.parseLong(uri.getLastPathSegment());
|
||||||
trackTripStatisticsBuilder.addLocation(location, minRecordingDistance);
|
trackTripStatisticsBuilder.addLocation(location, minRecordingDistance);
|
||||||
markerTripStatisticsBuilder.addLocation(location, minRecordingDistance);
|
markerTripStatisticsBuilder.addLocation(location, minRecordingDistance);
|
||||||
|
|||||||
+2
-1
@@ -159,7 +159,8 @@ public class PeriodicTaskExecutor {
|
|||||||
* Calculates the next distance for the distance periodic task.
|
* Calculates the next distance for the distance periodic task.
|
||||||
*/
|
*/
|
||||||
private void calculateNextTaskDistance() {
|
private void calculateNextTaskDistance() {
|
||||||
if (!trackRecordingService.isRecording() || trackRecordingService.isPaused() || periodicTask == null) {
|
if (!trackRecordingService.isRecording() || trackRecordingService.isPaused()
|
||||||
|
|| periodicTask == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -798,7 +798,7 @@ public class TrackDataHubTest extends AndroidTestCase {
|
|||||||
expect(myTracksProviderUtils.getTrack(capture(new Capture<Long>()))).andReturn(track);
|
expect(myTracksProviderUtils.getTrack(capture(new Capture<Long>()))).andReturn(track);
|
||||||
// Make the track id is unique.
|
// Make the track id is unique.
|
||||||
PreferencesUtils.setLong(context, R.string.recording_track_id_key, System.currentTimeMillis());
|
PreferencesUtils.setLong(context, R.string.recording_track_id_key, System.currentTimeMillis());
|
||||||
trackDataListener1.onSelectedTrackChanged(track, false);
|
trackDataListener1.onSelectedTrackChanged(track);
|
||||||
replay();
|
replay();
|
||||||
trackDataHub.start();
|
trackDataHub.start();
|
||||||
trackDataHub.registerTrackDataListener(trackDataListener1, EnumSet.of(TrackDataType.SELECTED_TRACK));
|
trackDataHub.registerTrackDataListener(trackDataListener1, EnumSet.of(TrackDataType.SELECTED_TRACK));
|
||||||
|
|||||||
Reference in New Issue
Block a user