diff --git a/MyTracks/.settings/org.eclipse.jdt.core.prefs b/MyTracks/.settings/org.eclipse.jdt.core.prefs index dec15e80b..65082d868 100644 --- a/MyTracks/.settings/org.eclipse.jdt.core.prefs +++ b/MyTracks/.settings/org.eclipse.jdt.core.prefs @@ -1,4 +1,4 @@ -#Thu Aug 12 18:54:52 BRT 2010 +#Wed Sep 29 18:44:16 BRT 2010 eclipse.preferences.version=1 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 diff --git a/MyTracks/AndroidManifest.xml b/MyTracks/AndroidManifest.xml index b4f5aeca7..71e892c9d 100755 --- a/MyTracks/AndroidManifest.xml +++ b/MyTracks/AndroidManifest.xml @@ -56,8 +56,11 @@ + + + android:label="@string/statistics" /> diff --git a/MyTracks/res/menu/main.xml b/MyTracks/res/menu/main.xml index 23053e2d5..9acffc9b3 100644 --- a/MyTracks/res/menu/main.xml +++ b/MyTracks/res/menu/main.xml @@ -20,10 +20,15 @@ android:icon="@android:drawable/ic_menu_preferences" android:orderInCategory="1001" android:title="@string/settings"/> + + diff --git a/MyTracks/res/values/strings.xml b/MyTracks/res/values/strings.xml index a4c5c6a8a..cb5ba7b48 100644 --- a/MyTracks/res/values/strings.xml +++ b/MyTracks/res/values/strings.xml @@ -32,6 +32,7 @@ limitations under the License. Please select the track to view Current track Last segment + Aggregated Statistics No location manager was found on this device! diff --git a/MyTracks/src/com/google/android/apps/mymaps/MyMapsConstants.java b/MyTracks/src/com/google/android/apps/mymaps/MyMapsConstants.java index 8fa70a9c2..d88a2ff5a 100644 --- a/MyTracks/src/com/google/android/apps/mymaps/MyMapsConstants.java +++ b/MyTracks/src/com/google/android/apps/mymaps/MyMapsConstants.java @@ -25,5 +25,8 @@ public class MyMapsConstants { "http://maps.google.com/maps/ms"; public static final String MAPSHOP_SERVICE = MapsClient.SERVICE; + /** + * Private constructor to prevent instantiation. + */ private MyMapsConstants() { } } diff --git a/MyTracks/src/com/google/android/apps/mytracks/AggregatedStatsActivity.java b/MyTracks/src/com/google/android/apps/mytracks/AggregatedStatsActivity.java new file mode 100644 index 000000000..c0f95242a --- /dev/null +++ b/MyTracks/src/com/google/android/apps/mytracks/AggregatedStatsActivity.java @@ -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 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 retrieveTracks() { + return tracksProvider.getAllTracks(); + } + + private void updateView(TripStatistics aggStats) { + if (aggStats != null) { + utils.setAllStats(aggStats); + } + } +} diff --git a/MyTracks/src/com/google/android/apps/mytracks/MenuManager.java b/MyTracks/src/com/google/android/apps/mytracks/MenuManager.java index e09011b86..784f835d1 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/MenuManager.java +++ b/MyTracks/src/com/google/android/apps/mytracks/MenuManager.java @@ -78,6 +78,11 @@ class MenuManager { activity.startActivity(startIntent); 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: { Intent startIntent = new Intent(activity, WelcomeActivity.class); activity.startActivity(startIntent); diff --git a/MyTracks/src/com/google/android/apps/mytracks/MyTracksWaypointDetails.java b/MyTracks/src/com/google/android/apps/mytracks/MyTracksWaypointDetails.java index 82604320b..d159fb236 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/MyTracksWaypointDetails.java +++ b/MyTracks/src/com/google/android/apps/mytracks/MyTracksWaypointDetails.java @@ -135,7 +135,6 @@ public class MyTracksWaypointDetails extends Activity iconId = R.drawable.ylw_pushpin; TripStatistics waypointStats = waypoint.getStatistics(); utils.setAllStats(waypointStats); - utils.setTime(R.id.total_time_register, waypointStats.getTotalTime()); utils.setAltitude( R.id.elevation_register, waypoint.getLocation().getAltitude()); break; diff --git a/MyTracks/src/com/google/android/apps/mytracks/StatsUtilities.java b/MyTracks/src/com/google/android/apps/mytracks/StatsUtilities.java index b0c3c8b14..c37ecab65 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/StatsUtilities.java +++ b/MyTracks/src/com/google/android/apps/mytracks/StatsUtilities.java @@ -20,13 +20,13 @@ import com.google.android.apps.mytracks.util.StringUtils; import com.google.android.apps.mytracks.util.UnitConversions; import com.google.android.maps.mytracks.R; +import java.text.DecimalFormat; +import java.text.NumberFormat; + import android.app.Activity; import android.util.Log; import android.widget.TextView; -import java.text.DecimalFormat; -import java.text.NumberFormat; - /** * Various utility functions for views that display statistics information. * @@ -218,7 +218,7 @@ public class StatsUtilities { 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()); setDistance(R.id.total_distance_register, stats.getTotalDistance() / 1000); 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()); setGrade(R.id.min_grade_register, stats.getMinGrade()); 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) { diff --git a/MyTracks/src/com/google/android/apps/mytracks/content/MyTracksProviderUtils.java b/MyTracks/src/com/google/android/apps/mytracks/content/MyTracksProviderUtils.java index 0065b0781..f8ba71f6a 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/content/MyTracksProviderUtils.java +++ b/MyTracks/src/com/google/android/apps/mytracks/content/MyTracksProviderUtils.java @@ -21,6 +21,8 @@ import android.database.Cursor; import android.location.Location; import android.net.Uri; +import java.util.List; + /** * Utility to access data from the mytracks content provider. * @@ -184,6 +186,15 @@ public interface MyTracksProviderUtils { * @return a Track object, or null if not found */ 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 getAllTracks(); /** * Loads the track points for a given track. diff --git a/MyTracks/src/com/google/android/apps/mytracks/content/MyTracksProviderUtilsImpl.java b/MyTracks/src/com/google/android/apps/mytracks/content/MyTracksProviderUtilsImpl.java index 5b06ffc4c..28dd11dd6 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/content/MyTracksProviderUtilsImpl.java +++ b/MyTracks/src/com/google/android/apps/mytracks/content/MyTracksProviderUtilsImpl.java @@ -24,6 +24,9 @@ import android.location.Location; import android.net.Uri; import android.util.Log; +import java.util.ArrayList; +import java.util.List; + /** * Helper class providing easy access to locations and tracks in the * MyTracksProvider. All static members. @@ -797,6 +800,21 @@ public class MyTracksProviderUtilsImpl implements MyTracksProviderUtils { String select = TracksColumns._ID + "=" + id; return findTrackBy(select); } + + @Override + public List getAllTracks() { + Cursor cursor = getTracksCursor(null); + if (cursor == null || !cursor.moveToFirst()) { + return new ArrayList(); + } + + List tracks = new ArrayList(cursor.getCount()); + do { + tracks.add(createTrack(cursor)); + } while(cursor.moveToNext()); + + return tracks; + } @Override public long getTrackPoints(Track track, int maxPoints) {