forked from upstream-mirrors/OpenTracks
Re-calculate the calorie while user change the activity type of track. Show standard "value_unknown" (-) when the activity type is not supported.
This commit is contained in:
@@ -19,7 +19,6 @@ package com.google.android.apps.mytracks;
|
|||||||
import com.google.android.apps.mytracks.content.MyTracksProviderUtils;
|
import com.google.android.apps.mytracks.content.MyTracksProviderUtils;
|
||||||
import com.google.android.apps.mytracks.content.Track;
|
import com.google.android.apps.mytracks.content.Track;
|
||||||
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;
|
||||||
|
|
||||||
@@ -37,8 +36,7 @@ public class AggregatedStatsActivity extends AbstractMyTracksActivity {
|
|||||||
@Override
|
@Override
|
||||||
protected void onCreate(Bundle savedInstanceState) {
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
StatsUtils.setTripStatisticsValues(this, getTripStatistics(),
|
StatsUtils.setTripStatisticsValues(this, getTripStatistics());
|
||||||
PreferencesUtils.RECORDING_TRACK_ID_DEFAULT);
|
|
||||||
StatsUtils.setLocationValues(this, null, false);
|
StatsUtils.setLocationValues(this, null, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ import com.google.android.apps.mytracks.content.Track;
|
|||||||
import com.google.android.apps.mytracks.fragments.ChooseActivityTypeDialogFragment;
|
import com.google.android.apps.mytracks.fragments.ChooseActivityTypeDialogFragment;
|
||||||
import com.google.android.apps.mytracks.fragments.ChooseActivityTypeDialogFragment.ChooseActivityTypeCaller;
|
import com.google.android.apps.mytracks.fragments.ChooseActivityTypeDialogFragment.ChooseActivityTypeCaller;
|
||||||
import com.google.android.apps.mytracks.util.ApiAdapterFactory;
|
import com.google.android.apps.mytracks.util.ApiAdapterFactory;
|
||||||
|
import com.google.android.apps.mytracks.util.CalorieUtils;
|
||||||
import com.google.android.apps.mytracks.util.TrackIconUtils;
|
import com.google.android.apps.mytracks.util.TrackIconUtils;
|
||||||
import com.google.android.apps.mytracks.util.TrackNameUtils;
|
import com.google.android.apps.mytracks.util.TrackNameUtils;
|
||||||
import com.google.android.maps.mytracks.R;
|
import com.google.android.maps.mytracks.R;
|
||||||
@@ -180,6 +181,10 @@ public class TrackEditActivity extends AbstractMyTracksActivity
|
|||||||
public void onClick(View v) {
|
public void onClick(View v) {
|
||||||
track.setName(name.getText().toString());
|
track.setName(name.getText().toString());
|
||||||
String category = activityType.getText().toString();
|
String category = activityType.getText().toString();
|
||||||
|
if(!category.equals(track.getCategory())) {
|
||||||
|
double calorie = CalorieUtils.calculateTrackCalorie(getApplicationContext(), track, category);
|
||||||
|
track.getTripStatistics().setCalorie(calorie);
|
||||||
|
}
|
||||||
track.setCategory(category);
|
track.setCategory(category);
|
||||||
track.setIcon(TrackIconUtils.getIconValue(TrackEditActivity.this, category));
|
track.setIcon(TrackIconUtils.getIconValue(TrackEditActivity.this, category));
|
||||||
track.setDescription(description.getText().toString());
|
track.setDescription(description.getText().toString());
|
||||||
|
|||||||
@@ -192,8 +192,7 @@ public class MarkerDetailFragment extends Fragment {
|
|||||||
TextView name = (TextView) getView().findViewById(R.id.marker_detail_statistics_name);
|
TextView name = (TextView) getView().findViewById(R.id.marker_detail_statistics_name);
|
||||||
name.setText(getString(R.string.generic_name_line, waypoint.getName()));
|
name.setText(getString(R.string.generic_name_line, waypoint.getName()));
|
||||||
|
|
||||||
StatsUtils.setTripStatisticsValues(getActivity(), waypoint.getTripStatistics(),
|
StatsUtils.setTripStatisticsValues(getActivity(), waypoint.getTripStatistics());
|
||||||
waypoint.getTrackId());
|
|
||||||
StatsUtils.setLocationValues(getActivity(), waypoint.getLocation(), false);
|
StatsUtils.setLocationValues(getActivity(), waypoint.getLocation(), false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -259,11 +259,7 @@ public class StatsFragment extends Fragment implements TrackDataListener {
|
|||||||
* Updates the UI.
|
* Updates the UI.
|
||||||
*/
|
*/
|
||||||
private void updateUi(FragmentActivity activity) {
|
private void updateUi(FragmentActivity activity) {
|
||||||
StatsUtils.setTripStatisticsValues(
|
StatsUtils.setTripStatisticsValues(activity, lastTripStatistics);
|
||||||
activity,
|
|
||||||
lastTripStatistics,
|
|
||||||
trackDataHub == null ? PreferencesUtils.RECORDING_TRACK_ID_DEFAULT : trackDataHub
|
|
||||||
.getSelectedTrackId());
|
|
||||||
StatsUtils.setLocationValues(activity, lastLocation, isSelectedTrackRecording());
|
StatsUtils.setLocationValues(activity, lastLocation, isSelectedTrackRecording());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,6 +16,7 @@
|
|||||||
package com.google.android.apps.mytracks.util;
|
package com.google.android.apps.mytracks.util;
|
||||||
|
|
||||||
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.Track;
|
import com.google.android.apps.mytracks.content.Track;
|
||||||
import com.google.android.apps.mytracks.stats.TripStatistics;
|
import com.google.android.apps.mytracks.stats.TripStatistics;
|
||||||
import com.google.android.maps.mytracks.R;
|
import com.google.android.maps.mytracks.R;
|
||||||
@@ -224,9 +225,9 @@ public class CalorieUtils {
|
|||||||
return ActivityType.CYCLING == activityType ? calculateCalorieCycling(start, stop, grade,
|
return ActivityType.CYCLING == activityType ? calculateCalorieCycling(start, stop, grade,
|
||||||
weight) : calculateCalorieFoot(start, stop, grade, weight);
|
weight) : calculateCalorieFoot(start, stop, grade, weight);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the activity type for calculating calorie by the category of track.
|
* Gets the activity type for calculating calorie by the id of track.
|
||||||
*
|
*
|
||||||
* @param context current context
|
* @param context current context
|
||||||
* @param trackId the id of track
|
* @param trackId the id of track
|
||||||
@@ -250,4 +251,56 @@ public class CalorieUtils {
|
|||||||
|
|
||||||
return activityType;
|
return activityType;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the activity type for calculating calorie by the category of track.
|
||||||
|
*
|
||||||
|
* @param context current context
|
||||||
|
* @param category the category of track
|
||||||
|
* @return activityType the activity type of track.
|
||||||
|
*/
|
||||||
|
private static ActivityType getActivityType(Context context, String category) {
|
||||||
|
ActivityType activityType = ActivityType.INVALID;
|
||||||
|
if (category.equals(context.getString(R.string.activity_type_walking))
|
||||||
|
|| category.equals(context.getString(R.string.activity_type_running))) {
|
||||||
|
activityType = ActivityType.FOOT;
|
||||||
|
} else if (category.equals(context.getString(R.string.activity_type_cycling))
|
||||||
|
|| category.equals(context.getString(R.string.activity_type_biking))) {
|
||||||
|
activityType = ActivityType.CYCLING;
|
||||||
|
}
|
||||||
|
|
||||||
|
return activityType;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Calculates the calorie of track.
|
||||||
|
*
|
||||||
|
* @param context the context
|
||||||
|
* @param track the track to calculate
|
||||||
|
* @param category the category of track
|
||||||
|
*/
|
||||||
|
public static double calculateTrackCalorie(Context context, Track track, String category) {
|
||||||
|
ActivityType activityType = getActivityType(context, category);
|
||||||
|
if (activityType == ActivityType.INVALID) {
|
||||||
|
return TripStatistics.INVALID_CALORIE;
|
||||||
|
}
|
||||||
|
|
||||||
|
double calorie = 0;
|
||||||
|
MyTracksProviderUtils providerUtils = MyTracksProviderUtils.Factory.get(context);
|
||||||
|
long trackId = track.getId();
|
||||||
|
LocationIterator points = providerUtils.getTrackPointLocationIterator(trackId, -1, false,
|
||||||
|
MyTracksProviderUtils.DEFAULT_LOCATION_FACTORY);
|
||||||
|
// TODO How get grade
|
||||||
|
double grade = 0;
|
||||||
|
if (points.hasNext()) {
|
||||||
|
Location start = points.next();
|
||||||
|
while (points.hasNext()) {
|
||||||
|
Location stop = points.next();
|
||||||
|
calorie += getCalorie(start, stop, grade, PreferencesUtils.getInt(context,
|
||||||
|
R.string.stats_weight_key, PreferencesUtils.STATS_WEIGHT_DEFAULT), activityType);
|
||||||
|
start = stop;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return calorie;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -17,7 +17,6 @@
|
|||||||
package com.google.android.apps.mytracks.util;
|
package com.google.android.apps.mytracks.util;
|
||||||
|
|
||||||
import com.google.android.apps.mytracks.stats.TripStatistics;
|
import com.google.android.apps.mytracks.stats.TripStatistics;
|
||||||
import com.google.android.apps.mytracks.util.CalorieUtils.ActivityType;
|
|
||||||
import com.google.android.maps.mytracks.R;
|
import com.google.android.maps.mytracks.R;
|
||||||
|
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
@@ -111,8 +110,7 @@ public class StatsUtils {
|
|||||||
* @param tripStatistics the trip statistics
|
* @param tripStatistics the trip statistics
|
||||||
* @param trackId the id of track
|
* @param trackId the id of track
|
||||||
*/
|
*/
|
||||||
public static void setTripStatisticsValues(Activity activity, TripStatistics tripStatistics,
|
public static void setTripStatisticsValues(Activity activity, TripStatistics tripStatistics) {
|
||||||
long trackId) {
|
|
||||||
boolean metricUnits = PreferencesUtils.isMetricUnits(activity);
|
boolean metricUnits = PreferencesUtils.isMetricUnits(activity);
|
||||||
boolean reportSpeed = PreferencesUtils.isReportSpeed(activity);
|
boolean reportSpeed = PreferencesUtils.isReportSpeed(activity);
|
||||||
|
|
||||||
@@ -190,7 +188,7 @@ public class StatsUtils {
|
|||||||
if (tripStatistics != null) {
|
if (tripStatistics != null) {
|
||||||
calories = tripStatistics.getCalorie();
|
calories = tripStatistics.getCalorie();
|
||||||
}
|
}
|
||||||
setCalorie(activity, R.id.stats_calorie, calories, trackId);
|
setCalorie(activity, R.id.stats_calorie, calories);
|
||||||
} else {
|
} else {
|
||||||
calorieHorizontalLine.setVisibility(View.GONE);
|
calorieHorizontalLine.setVisibility(View.GONE);
|
||||||
calorieContainer.setVisibility(View.GONE);
|
calorieContainer.setVisibility(View.GONE);
|
||||||
@@ -345,15 +343,13 @@ public class StatsUtils {
|
|||||||
* @param calorie the value of calorie
|
* @param calorie the value of calorie
|
||||||
* @param trackId the id of track
|
* @param trackId the id of track
|
||||||
*/
|
*/
|
||||||
private static void setCalorie(Activity activity, int itemId, double calorie, long trackId) {
|
private static void setCalorie(Activity activity, int itemId, double calorie) {
|
||||||
int labelId = R.string.stats_calorie;
|
String calorieString = String.format(Locale.getDefault(), CALORIES_FORMAT, calorie);
|
||||||
// Current activity type is not supported.
|
// Current activity type is not supported.
|
||||||
if (trackId != PreferencesUtils.RECORDING_TRACK_ID_DEFAULT
|
if (calorie == TripStatistics.INVALID_CALORIE) {
|
||||||
&& CalorieUtils.getActivityType(activity, trackId) == ActivityType.INVALID) {
|
calorieString = activity.getString(R.string.value_unknown);
|
||||||
labelId = R.string.stats_calorie_invalid_type;
|
|
||||||
}
|
}
|
||||||
setItem(activity, itemId, labelId,
|
setItem(activity, itemId, R.string.stats_calorie, calorieString,
|
||||||
String.format(Locale.getDefault(), CALORIES_FORMAT, calorie),
|
|
||||||
activity.getString(R.string.unit_calorie));
|
activity.getString(R.string.unit_calorie));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -586,6 +586,8 @@ public class TripStatistics implements Parcelable {
|
|||||||
public void addCalorie(double calorieAdded) {
|
public void addCalorie(double calorieAdded) {
|
||||||
if (calorieAdded != INVALID_CALORIE) {
|
if (calorieAdded != INVALID_CALORIE) {
|
||||||
this.calorie += calorieAdded;
|
this.calorie += calorieAdded;
|
||||||
|
} else {
|
||||||
|
this.calorie = INVALID_CALORIE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user