forked from upstream-mirrors/OpenTracks
Merging aggregated statistics change
This commit is contained in:
@@ -1,4 +1,4 @@
|
|||||||
#Thu Aug 12 18:54:52 BRT 2010
|
#Wed Sep 29 18:44:16 BRT 2010
|
||||||
eclipse.preferences.version=1
|
eclipse.preferences.version=1
|
||||||
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
|
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
|
||||||
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
|
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
|
||||||
|
|||||||
@@ -56,8 +56,11 @@
|
|||||||
<activity android:name="com.google.android.apps.mytracks.MyTracksSettings"
|
<activity android:name="com.google.android.apps.mytracks.MyTracksSettings"
|
||||||
android:label="@string/mytracks_settings" />
|
android:label="@string/mytracks_settings" />
|
||||||
|
|
||||||
|
<activity android:name="com.google.android.apps.mytracks.AggregatedStatsActivity"
|
||||||
|
android:label="@string/aggregated_stats" />
|
||||||
|
|
||||||
<activity android:name="com.google.android.apps.mytracks.StatsActivity"
|
<activity android:name="com.google.android.apps.mytracks.StatsActivity"
|
||||||
android:label="@string/statistics"/>
|
android:label="@string/statistics" />
|
||||||
|
|
||||||
<activity android:name="com.google.android.apps.mytracks.ChartActivity"
|
<activity android:name="com.google.android.apps.mytracks.ChartActivity"
|
||||||
android:label="@string/elevation_label"/>
|
android:label="@string/elevation_label"/>
|
||||||
|
|||||||
@@ -21,9 +21,14 @@
|
|||||||
android:orderInCategory="1001"
|
android:orderInCategory="1001"
|
||||||
android:title="@string/settings"/>
|
android:title="@string/settings"/>
|
||||||
|
|
||||||
<item android:id="@+id/menu_help"
|
<item android:id="@+id/menu_aggregated_stats"
|
||||||
android:icon="@android:drawable/ic_menu_info_details"
|
android:icon="@android:drawable/ic_menu_info_details"
|
||||||
android:orderInCategory="1002"
|
android:orderInCategory="1002"
|
||||||
|
android:title="@string/aggregated_stats"/>
|
||||||
|
|
||||||
|
<item android:id="@+id/menu_help"
|
||||||
|
android:icon="@android:drawable/ic_menu_info_details"
|
||||||
|
android:orderInCategory="1003"
|
||||||
android:title="@string/help"/>
|
android:title="@string/help"/>
|
||||||
|
|
||||||
</menu>
|
</menu>
|
||||||
|
|||||||
@@ -32,6 +32,7 @@ limitations under the License.
|
|||||||
<string name="choose_track_message">Please select the track to view</string>
|
<string name="choose_track_message">Please select the track to view</string>
|
||||||
<string name="current_track">Current track</string>
|
<string name="current_track">Current track</string>
|
||||||
<string name="current_segment">Last segment</string>
|
<string name="current_segment">Last segment</string>
|
||||||
|
<string name="aggregated_stats">Aggregated Statistics</string>
|
||||||
|
|
||||||
<!-- Error messages -->
|
<!-- Error messages -->
|
||||||
<string name="error_no_location_manager">No location manager was found on this device!</string>
|
<string name="error_no_location_manager">No location manager was found on this device!</string>
|
||||||
|
|||||||
@@ -25,5 +25,8 @@ public class MyMapsConstants {
|
|||||||
"http://maps.google.com/maps/ms";
|
"http://maps.google.com/maps/ms";
|
||||||
public static final String MAPSHOP_SERVICE = MapsClient.SERVICE;
|
public static final String MAPSHOP_SERVICE = MapsClient.SERVICE;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Private constructor to prevent instantiation.
|
||||||
|
*/
|
||||||
private MyMapsConstants() { }
|
private MyMapsConstants() { }
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,114 @@
|
|||||||
|
package com.google.android.apps.mytracks;
|
||||||
|
|
||||||
|
import com.google.android.apps.mytracks.content.MyTracksProviderUtils;
|
||||||
|
import com.google.android.apps.mytracks.content.Track;
|
||||||
|
import com.google.android.apps.mytracks.stats.TripStatistics;
|
||||||
|
import com.google.android.maps.mytracks.R;
|
||||||
|
|
||||||
|
import android.app.Activity;
|
||||||
|
import android.content.SharedPreferences;
|
||||||
|
import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.util.DisplayMetrics;
|
||||||
|
import android.util.Log;
|
||||||
|
import android.view.Window;
|
||||||
|
import android.widget.ScrollView;
|
||||||
|
import android.widget.TextView;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Activity for viewing the combined statistics for all the recorded tracks.
|
||||||
|
*
|
||||||
|
* Other features to add - menu items to change setings.
|
||||||
|
*
|
||||||
|
* @author Fergus Nelson
|
||||||
|
*/
|
||||||
|
public class AggregatedStatsActivity extends Activity implements
|
||||||
|
OnSharedPreferenceChangeListener {
|
||||||
|
|
||||||
|
private final StatsUtilities utils;
|
||||||
|
|
||||||
|
private MyTracksProviderUtils tracksProvider;
|
||||||
|
|
||||||
|
private boolean metricUnits = true;
|
||||||
|
|
||||||
|
public AggregatedStatsActivity() {
|
||||||
|
this.utils = new StatsUtilities(this);
|
||||||
|
this.tracksProvider = MyTracksProviderUtils.Factory.get(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,
|
||||||
|
String key) {
|
||||||
|
Log.d(MyTracksConstants.TAG, "StatsActivity: onSharedPreferences changed "
|
||||||
|
+ key);
|
||||||
|
if (key != null) {
|
||||||
|
if (key.equals(R.string.metric_units_key)) {
|
||||||
|
metricUnits = sharedPreferences.getBoolean(
|
||||||
|
getString(R.string.metric_units_key), true);
|
||||||
|
utils.setMetricUnits(metricUnits);
|
||||||
|
utils.updateUnits();
|
||||||
|
loadAggregatedStats();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
|
||||||
|
// We don't need a window title bar:
|
||||||
|
requestWindowFeature(Window.FEATURE_NO_TITLE);
|
||||||
|
setContentView(R.layout.stats);
|
||||||
|
|
||||||
|
ScrollView sv = ((ScrollView) findViewById(R.id.scrolly));
|
||||||
|
sv.setScrollBarStyle(ScrollView.SCROLLBARS_OUTSIDE_INSET);
|
||||||
|
|
||||||
|
SharedPreferences preferences = getSharedPreferences(
|
||||||
|
MyTracksSettings.SETTINGS_NAME, 0);
|
||||||
|
if (preferences != null) {
|
||||||
|
metricUnits = preferences.getBoolean(getString(R.string.metric_units_key), true);
|
||||||
|
preferences.registerOnSharedPreferenceChangeListener(this);
|
||||||
|
}
|
||||||
|
utils.setMetricUnits(metricUnits);
|
||||||
|
utils.updateUnits();
|
||||||
|
utils.setSpeedLabel(R.id.speed_label, R.string.speed, R.string.pace_label);
|
||||||
|
utils.setSpeedLabels();
|
||||||
|
|
||||||
|
DisplayMetrics metrics = new DisplayMetrics();
|
||||||
|
getWindowManager().getDefaultDisplay().getMetrics(metrics);
|
||||||
|
if (metrics.heightPixels > 600) {
|
||||||
|
((TextView) findViewById(R.id.speed_register)).setTextSize(80.0f);
|
||||||
|
}
|
||||||
|
loadAggregatedStats();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 1. Reads tracks from the db
|
||||||
|
* 2. Merges the trip stats from the tracks
|
||||||
|
* 3. Updates the view
|
||||||
|
*/
|
||||||
|
private void loadAggregatedStats() {
|
||||||
|
List<Track> tracks = retrieveTracks();
|
||||||
|
TripStatistics rollingStats = null;
|
||||||
|
if (!tracks.isEmpty()) {
|
||||||
|
rollingStats = new TripStatistics(tracks.iterator().next()
|
||||||
|
.getStatistics());
|
||||||
|
for (int i = 1; i < tracks.size(); i++) {
|
||||||
|
rollingStats.merge(tracks.get(i).getStatistics());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
updateView(rollingStats);
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<Track> retrieveTracks() {
|
||||||
|
return tracksProvider.getAllTracks();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void updateView(TripStatistics aggStats) {
|
||||||
|
if (aggStats != null) {
|
||||||
|
utils.setAllStats(aggStats);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -78,6 +78,11 @@ class MenuManager {
|
|||||||
activity.startActivity(startIntent);
|
activity.startActivity(startIntent);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
case R.id.menu_aggregated_stats: {
|
||||||
|
Intent startIntent = new Intent(activity, AggregatedStatsActivity.class);
|
||||||
|
activity.startActivity(startIntent);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
case R.id.menu_help: {
|
case R.id.menu_help: {
|
||||||
Intent startIntent = new Intent(activity, WelcomeActivity.class);
|
Intent startIntent = new Intent(activity, WelcomeActivity.class);
|
||||||
activity.startActivity(startIntent);
|
activity.startActivity(startIntent);
|
||||||
|
|||||||
@@ -135,7 +135,6 @@ public class MyTracksWaypointDetails extends Activity
|
|||||||
iconId = R.drawable.ylw_pushpin;
|
iconId = R.drawable.ylw_pushpin;
|
||||||
TripStatistics waypointStats = waypoint.getStatistics();
|
TripStatistics waypointStats = waypoint.getStatistics();
|
||||||
utils.setAllStats(waypointStats);
|
utils.setAllStats(waypointStats);
|
||||||
utils.setTime(R.id.total_time_register, waypointStats.getTotalTime());
|
|
||||||
utils.setAltitude(
|
utils.setAltitude(
|
||||||
R.id.elevation_register, waypoint.getLocation().getAltitude());
|
R.id.elevation_register, waypoint.getLocation().getAltitude());
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -20,13 +20,13 @@ import com.google.android.apps.mytracks.util.StringUtils;
|
|||||||
import com.google.android.apps.mytracks.util.UnitConversions;
|
import com.google.android.apps.mytracks.util.UnitConversions;
|
||||||
import com.google.android.maps.mytracks.R;
|
import com.google.android.maps.mytracks.R;
|
||||||
|
|
||||||
|
import java.text.DecimalFormat;
|
||||||
|
import java.text.NumberFormat;
|
||||||
|
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
|
|
||||||
import java.text.DecimalFormat;
|
|
||||||
import java.text.NumberFormat;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Various utility functions for views that display statistics information.
|
* Various utility functions for views that display statistics information.
|
||||||
*
|
*
|
||||||
@@ -218,7 +218,7 @@ public class StatsUtilities {
|
|||||||
setGrade(R.id.max_grade_register, maxGrade);
|
setGrade(R.id.max_grade_register, maxGrade);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setAllStats(TripStatistics stats) {
|
public void setAllStats(TripStatistics stats) {
|
||||||
setTime(R.id.moving_time_register, stats.getMovingTime());
|
setTime(R.id.moving_time_register, stats.getMovingTime());
|
||||||
setDistance(R.id.total_distance_register, stats.getTotalDistance() / 1000);
|
setDistance(R.id.total_distance_register, stats.getTotalDistance() / 1000);
|
||||||
setSpeed(R.id.average_speed_register, stats.getAverageSpeed() * 3.6);
|
setSpeed(R.id.average_speed_register, stats.getAverageSpeed() * 3.6);
|
||||||
@@ -230,6 +230,8 @@ public class StatsUtilities {
|
|||||||
setAltitude(R.id.elevation_gain_register, stats.getTotalElevationGain());
|
setAltitude(R.id.elevation_gain_register, stats.getTotalElevationGain());
|
||||||
setGrade(R.id.min_grade_register, stats.getMinGrade());
|
setGrade(R.id.min_grade_register, stats.getMinGrade());
|
||||||
setGrade(R.id.max_grade_register, stats.getMaxGrade());
|
setGrade(R.id.max_grade_register, stats.getMaxGrade());
|
||||||
|
setTime(R.id.total_time_register, stats.getTotalTime());
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setSpeedLabel(int id, int speedString, int paceString) {
|
public void setSpeedLabel(int id, int speedString, int paceString) {
|
||||||
|
|||||||
@@ -21,6 +21,8 @@ import android.database.Cursor;
|
|||||||
import android.location.Location;
|
import android.location.Location;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Utility to access data from the mytracks content provider.
|
* Utility to access data from the mytracks content provider.
|
||||||
*
|
*
|
||||||
@@ -185,6 +187,15 @@ public interface MyTracksProviderUtils {
|
|||||||
*/
|
*/
|
||||||
Track getTrack(long id);
|
Track getTrack(long id);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieves all tracks without track points. If no tracks exist an empty
|
||||||
|
* list will be returned. Use {@link #getTrackPoints(Track, int)} to load
|
||||||
|
* the track points.
|
||||||
|
*
|
||||||
|
* @return a list of all the recorded tracks
|
||||||
|
*/
|
||||||
|
List<Track> getAllTracks();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Loads the track points for a given track.
|
* Loads the track points for a given track.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -24,6 +24,9 @@ import android.location.Location;
|
|||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Helper class providing easy access to locations and tracks in the
|
* Helper class providing easy access to locations and tracks in the
|
||||||
* MyTracksProvider. All static members.
|
* MyTracksProvider. All static members.
|
||||||
@@ -798,6 +801,21 @@ public class MyTracksProviderUtilsImpl implements MyTracksProviderUtils {
|
|||||||
return findTrackBy(select);
|
return findTrackBy(select);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<Track> getAllTracks() {
|
||||||
|
Cursor cursor = getTracksCursor(null);
|
||||||
|
if (cursor == null || !cursor.moveToFirst()) {
|
||||||
|
return new ArrayList<Track>();
|
||||||
|
}
|
||||||
|
|
||||||
|
List<Track> tracks = new ArrayList<Track>(cursor.getCount());
|
||||||
|
do {
|
||||||
|
tracks.add(createTrack(cursor));
|
||||||
|
} while(cursor.moveToNext());
|
||||||
|
|
||||||
|
return tracks;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public long getTrackPoints(Track track, int maxPoints) {
|
public long getTrackPoints(Track track, int maxPoints) {
|
||||||
long lastId = -1;
|
long lastId = -1;
|
||||||
|
|||||||
Reference in New Issue
Block a user