Update stats marker calorie in TrackRecordingService

This commit is contained in:
Jimmy Shih
2013-11-18 14:36:53 -08:00
parent 2f8eda0810
commit 0b27765c30
4 changed files with 42 additions and 41 deletions
@@ -30,12 +30,6 @@ public class Constants {
*/ */
public static final String ACCOUNT_TYPE = "com.google"; public static final String ACCOUNT_TYPE = "com.google";
/**
* Maximum number of track points that will be loaded at one time. With
* recording frequency of 2 seconds, 20000 corresponds to 11.1 hours.
*/
public static final int MAX_LOADED_TRACK_POINTS = 20000;
/** /**
* Maximum number of waypoints that will be loaded at one time. * Maximum number of waypoints that will be loaded at one time.
*/ */
@@ -134,16 +134,16 @@ public class FileTrackExporter implements TrackExporter {
boolean wroteSegment = false; boolean wroteSegment = false;
boolean isLastLocationValid = false; boolean isLastLocationValid = false;
TrackWriterLocationFactory locationFactory = new TrackWriterLocationFactory(); TrackWriterLocationFactory locationFactory = new TrackWriterLocationFactory();
LocationIterator iterator = myTracksProviderUtils.getTrackPointLocationIterator( LocationIterator locationIterator = myTracksProviderUtils.getTrackPointLocationIterator(
track.getId(), -1L, false, locationFactory); track.getId(), -1L, false, locationFactory);
try { try {
int locationNumber = 0; int locationNumber = 0;
while (iterator.hasNext()) { while (locationIterator.hasNext()) {
if (Thread.interrupted()) { if (Thread.interrupted()) {
throw new InterruptedException(); throw new InterruptedException();
} }
Location location = iterator.next(); Location location = locationIterator.next();
setLocationTime(location, offset); setLocationTime(location, offset);
locationNumber++; locationNumber++;
@@ -195,7 +195,7 @@ public class FileTrackExporter implements TrackExporter {
trackWriter.writeEndTrack(track, null); trackWriter.writeEndTrack(track, null);
} }
} finally { } finally {
iterator.close(); locationIterator.close();
} }
} }
@@ -23,6 +23,7 @@ import com.google.android.apps.mytracks.content.DescriptionGeneratorImpl;
import com.google.android.apps.mytracks.content.MyTracksLocation; import com.google.android.apps.mytracks.content.MyTracksLocation;
import com.google.android.apps.mytracks.content.MyTracksProvider; import com.google.android.apps.mytracks.content.MyTracksProvider;
import com.google.android.apps.mytracks.content.MyTracksProviderUtils; import com.google.android.apps.mytracks.content.MyTracksProviderUtils;
import com.google.android.apps.mytracks.content.MyTracksProviderUtils.LocationIterator;
import com.google.android.apps.mytracks.content.Sensor; import com.google.android.apps.mytracks.content.Sensor;
import com.google.android.apps.mytracks.content.Sensor.SensorDataSet; import com.google.android.apps.mytracks.content.Sensor.SensorDataSet;
import com.google.android.apps.mytracks.content.Track; import com.google.android.apps.mytracks.content.Track;
@@ -60,7 +61,6 @@ import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.content.SharedPreferences.OnSharedPreferenceChangeListener; import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
import android.database.Cursor;
import android.database.sqlite.SQLiteException; import android.database.sqlite.SQLiteException;
import android.location.Location; import android.location.Location;
import android.location.LocationManager; import android.location.LocationManager;
@@ -132,6 +132,7 @@ public class TrackRecordingService extends Service {
private int recordingGpsAccuracy; private int recordingGpsAccuracy;
private int autoResumeTrackTimeout; private int autoResumeTrackTimeout;
private long currentRecordingInterval; private long currentRecordingInterval;
private double weight;
// The following variables are set when recording: // The following variables are set when recording:
private TripStatisticsUpdater trackTripStatisticsUpdater; private TripStatisticsUpdater trackTripStatisticsUpdater;
@@ -230,6 +231,10 @@ public class TrackRecordingService extends Service {
R.string.auto_resume_track_timeout_key, R.string.auto_resume_track_timeout_key,
PreferencesUtils.AUTO_RESUME_TRACK_TIMEOUT_DEFAULT); PreferencesUtils.AUTO_RESUME_TRACK_TIMEOUT_DEFAULT);
} }
if (key == null || key.equals(PreferencesUtils.getKey(context, R.string.weight_key))) {
weight = PreferencesUtils.getFloat(
context, R.string.weight_key, PreferencesUtils.WEIGHT_DEFAULT);
}
} }
}; };
@@ -656,31 +661,26 @@ public class TrackRecordingService extends Service {
} }
markerTripStatisticsUpdater = new TripStatisticsUpdater(markerStartTime); markerTripStatisticsUpdater = new TripStatisticsUpdater(markerStartTime);
Cursor cursor = null; ActivityType activityType = CalorieUtils.getActivityType(context, track.getCategory());
LocationIterator locationIterator = null;
try { try {
// TODO: how to handle very long track. locationIterator = myTracksProviderUtils.getTrackPointLocationIterator(
cursor = myTracksProviderUtils.getTrackPointCursor( track.getId(), -1L, false, MyTracksProviderUtils.DEFAULT_LOCATION_FACTORY);
recordingTrackId, -1L, Constants.MAX_LOADED_TRACK_POINTS, true); while (locationIterator.hasNext()) {
if (cursor == null) { Location location = locationIterator.next();
Log.e(TAG, "Cursor is null."); trackTripStatisticsUpdater.addLocation(
} else { location, recordingDistanceInterval, true, activityType, weight);
if (cursor.moveToLast()) { if (location.getTime() > markerStartTime) {
do { markerTripStatisticsUpdater.addLocation(
Location location = myTracksProviderUtils.createTrackPoint(cursor); location, recordingDistanceInterval, true, activityType, weight);
trackTripStatisticsUpdater.addLocation(location, recordingDistanceInterval, false,
ActivityType.INVALID, PreferencesUtils.WEIGHT_DEFAULT);
if (location.getTime() > markerStartTime) {
markerTripStatisticsUpdater.addLocation(location, recordingDistanceInterval, false,
ActivityType.INVALID, PreferencesUtils.WEIGHT_DEFAULT);
}
} while (cursor.moveToPrevious());
} }
} }
} catch (RuntimeException e) { } catch (RuntimeException e) {
Log.e(TAG, "RuntimeException", e); Log.e(TAG, "RuntimeException", e);
} finally { } finally {
if (cursor != null) { if (locationIterator != null) {
cursor.close(); locationIterator.close();
} }
} }
startRecording(true); startRecording(true);
@@ -1011,11 +1011,11 @@ public class TrackRecordingService extends Service {
try { try {
Uri uri = myTracksProviderUtils.insertTrackPoint(location, track.getId()); Uri uri = myTracksProviderUtils.insertTrackPoint(location, track.getId());
long trackPointId = Long.parseLong(uri.getLastPathSegment()); long trackPointId = Long.parseLong(uri.getLastPathSegment());
trackTripStatisticsUpdater.addLocation(location, recordingDistanceInterval, true, ActivityType activityType = CalorieUtils.getActivityType(context, track.getCategory());
CalorieUtils.getActivityType(context, track.getCategory()), PreferencesUtils.getFloat(context, trackTripStatisticsUpdater.addLocation(
R.string.weight_key, PreferencesUtils.WEIGHT_DEFAULT)); location, recordingDistanceInterval, true, activityType, weight);
markerTripStatisticsUpdater.addLocation(location, recordingDistanceInterval, false, markerTripStatisticsUpdater.addLocation(
ActivityType.INVALID, PreferencesUtils.WEIGHT_DEFAULT); location, recordingDistanceInterval, true, activityType, weight);
updateRecordingTrack(track, trackPointId, LocationUtils.isValidLocation(location)); updateRecordingTrack(track, trackPointId, LocationUtils.isValidLocation(location));
} catch (SQLiteException e) { } catch (SQLiteException e) {
/* /*
@@ -96,8 +96,6 @@ public class CalorieUtils {
} }
MyTracksProviderUtils myTracksProviderUtils = MyTracksProviderUtils.Factory.get(context); MyTracksProviderUtils myTracksProviderUtils = MyTracksProviderUtils.Factory.get(context);
LocationIterator iterator = myTracksProviderUtils.getTrackPointLocationIterator(
track.getId(), startTrackPointId, false, MyTracksProviderUtils.DEFAULT_LOCATION_FACTORY);
TripStatisticsUpdater tripStatisticsUpdater = new TripStatisticsUpdater( TripStatisticsUpdater tripStatisticsUpdater = new TripStatisticsUpdater(
track.getTripStatistics().getStartTime()); track.getTripStatistics().getStartTime());
int recordingDistanceInterval = PreferencesUtils.getInt(context, int recordingDistanceInterval = PreferencesUtils.getInt(context,
@@ -105,10 +103,19 @@ public class CalorieUtils {
PreferencesUtils.RECORDING_DISTANCE_INTERVAL_DEFAULT); PreferencesUtils.RECORDING_DISTANCE_INTERVAL_DEFAULT);
double weight = PreferencesUtils.getFloat( double weight = PreferencesUtils.getFloat(
context, R.string.weight_key, PreferencesUtils.WEIGHT_DEFAULT); context, R.string.weight_key, PreferencesUtils.WEIGHT_DEFAULT);
LocationIterator locationIterator = null;
while (iterator.hasNext()) { try {
tripStatisticsUpdater.addLocation( locationIterator = myTracksProviderUtils.getTrackPointLocationIterator(
iterator.next(), recordingDistanceInterval, true, activityType, weight); track.getId(), startTrackPointId, false, MyTracksProviderUtils.DEFAULT_LOCATION_FACTORY);
while (locationIterator.hasNext()) {
tripStatisticsUpdater.addLocation(
locationIterator.next(), recordingDistanceInterval, true, activityType, weight);
}
} finally {
if (locationIterator != null) {
locationIterator.close();
}
} }
return tripStatisticsUpdater.getTripStatistics().getCalorie(); return tripStatisticsUpdater.getTripStatistics().getCalorie();
} }