Merging aggregated statistics change

This commit is contained in:
Rodrigo Damazio
2010-09-29 18:46:45 -03:00
11 changed files with 169 additions and 8 deletions
@@ -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
+4 -1
View File
@@ -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"/>
+6 -1
View File
@@ -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>
+1
View File
@@ -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;