diff --git a/MyTracks/AndroidManifest.xml b/MyTracks/AndroidManifest.xml index 535949c9a..31a04657e 100755 --- a/MyTracks/AndroidManifest.xml +++ b/MyTracks/AndroidManifest.xml @@ -19,22 +19,18 @@ limitations under the License. android:versionCode="39" android:versionName="1.1.16" package="com.google.android.maps.mytracks" > - - - - @@ -46,18 +42,14 @@ limitations under the License. - - - - - - - - - - - + - + + android:name="com.google.android.apps.mytracks.ImportActivity" > - - - @@ -186,7 +167,6 @@ limitations under the License. - @@ -196,37 +176,25 @@ limitations under the License. android:name="com.google.android.apps.mytracks.SensorStateActivity" /> - - - - + android:name="com.google.android.apps.mytracks.SettingsActivity" /> - + - - - - + + + - - - - - - - + - + @@ -247,7 +215,7 @@ limitations under the License. android:label="@string/my_tracks_recording_service" android:name="com.google.android.apps.mytracks.services.TrackRecordingService" android:permission="com.google.android.apps.mytracks.WRITE_TRACK_DATA" /> - + @@ -259,12 +227,11 @@ limitations under the License. - - + - - \ No newline at end of file diff --git a/MyTracks/res/drawable-hdpi/ic_menu_chartsettings.png b/MyTracks/res/drawable-hdpi/ic_menu_chartsettings.png deleted file mode 100644 index 2364bd956..000000000 Binary files a/MyTracks/res/drawable-hdpi/ic_menu_chartsettings.png and /dev/null differ diff --git a/MyTracks/res/drawable-hdpi/ic_menu_sensorstatus.png b/MyTracks/res/drawable-hdpi/ic_menu_sensorstatus.png deleted file mode 100644 index b13f28cd2..000000000 Binary files a/MyTracks/res/drawable-hdpi/ic_menu_sensorstatus.png and /dev/null differ diff --git a/MyTracks/res/drawable-hdpi/ic_menu_statistics.png b/MyTracks/res/drawable-hdpi/ic_menu_statistics.png deleted file mode 100644 index ce3d6285a..000000000 Binary files a/MyTracks/res/drawable-hdpi/ic_menu_statistics.png and /dev/null differ diff --git a/MyTracks/res/drawable-hdpi/ic_menu_waypoints.png b/MyTracks/res/drawable-hdpi/ic_menu_waypoints.png deleted file mode 100644 index c2c792f11..000000000 Binary files a/MyTracks/res/drawable-hdpi/ic_menu_waypoints.png and /dev/null differ diff --git a/MyTracks/res/drawable-hdpi/menu_aggregated_statistics.png b/MyTracks/res/drawable-hdpi/menu_aggregated_statistics.png new file mode 100644 index 000000000..2bc6f5aca Binary files /dev/null and b/MyTracks/res/drawable-hdpi/menu_aggregated_statistics.png differ diff --git a/MyTracks/res/drawable-hdpi/menu_chart_settings.png b/MyTracks/res/drawable-hdpi/menu_chart_settings.png new file mode 100644 index 000000000..0f650ee25 Binary files /dev/null and b/MyTracks/res/drawable-hdpi/menu_chart_settings.png differ diff --git a/MyTracks/res/drawable-hdpi/menu_delete_all.png b/MyTracks/res/drawable-hdpi/menu_delete_all.png new file mode 100644 index 000000000..094eea589 Binary files /dev/null and b/MyTracks/res/drawable-hdpi/menu_delete_all.png differ diff --git a/MyTracks/res/drawable-hdpi/menu_export_all.png b/MyTracks/res/drawable-hdpi/menu_export_all.png new file mode 100644 index 000000000..52601b036 Binary files /dev/null and b/MyTracks/res/drawable-hdpi/menu_export_all.png differ diff --git a/MyTracks/res/drawable-hdpi/menu_import_all.png b/MyTracks/res/drawable-hdpi/menu_import_all.png new file mode 100644 index 000000000..1dd8bc75d Binary files /dev/null and b/MyTracks/res/drawable-hdpi/menu_import_all.png differ diff --git a/MyTracks/res/drawable-hdpi/menu_markers.png b/MyTracks/res/drawable-hdpi/menu_markers.png new file mode 100644 index 000000000..e45ea1fd9 Binary files /dev/null and b/MyTracks/res/drawable-hdpi/menu_markers.png differ diff --git a/MyTracks/res/drawable-hdpi/menu_my_location.png b/MyTracks/res/drawable-hdpi/menu_my_location.png new file mode 100644 index 000000000..d7fae7e98 Binary files /dev/null and b/MyTracks/res/drawable-hdpi/menu_my_location.png differ diff --git a/MyTracks/res/drawable-hdpi/menu_satellite_mode.png b/MyTracks/res/drawable-hdpi/menu_satellite_mode.png new file mode 100644 index 000000000..e5907072f Binary files /dev/null and b/MyTracks/res/drawable-hdpi/menu_satellite_mode.png differ diff --git a/MyTracks/res/drawable-hdpi/menu_save.png b/MyTracks/res/drawable-hdpi/menu_save.png new file mode 100644 index 000000000..306d55a9c Binary files /dev/null and b/MyTracks/res/drawable-hdpi/menu_save.png differ diff --git a/MyTracks/res/drawable-hdpi/menu_send_google.png b/MyTracks/res/drawable-hdpi/menu_send_google.png new file mode 100644 index 000000000..a1d27cec9 Binary files /dev/null and b/MyTracks/res/drawable-hdpi/menu_send_google.png differ diff --git a/MyTracks/res/drawable-hdpi/menu_sensor_state.png b/MyTracks/res/drawable-hdpi/menu_sensor_state.png new file mode 100644 index 000000000..97231b91f Binary files /dev/null and b/MyTracks/res/drawable-hdpi/menu_sensor_state.png differ diff --git a/MyTracks/res/drawable-hdpi/tab_chart.png b/MyTracks/res/drawable-hdpi/tab_chart.png new file mode 100644 index 000000000..0f650ee25 Binary files /dev/null and b/MyTracks/res/drawable-hdpi/tab_chart.png differ diff --git a/MyTracks/res/drawable-hdpi/tab_map.png b/MyTracks/res/drawable-hdpi/tab_map.png new file mode 100644 index 000000000..e5907072f Binary files /dev/null and b/MyTracks/res/drawable-hdpi/tab_map.png differ diff --git a/MyTracks/res/drawable-hdpi/tab_stats.png b/MyTracks/res/drawable-hdpi/tab_stats.png new file mode 100644 index 000000000..6b58c2dab Binary files /dev/null and b/MyTracks/res/drawable-hdpi/tab_stats.png differ diff --git a/MyTracks/res/drawable-ldpi/failure.png b/MyTracks/res/drawable-ldpi/failure.png deleted file mode 100644 index 3722b0794..000000000 Binary files a/MyTracks/res/drawable-ldpi/failure.png and /dev/null differ diff --git a/MyTracks/res/drawable-ldpi/ic_menu_chartsettings.png b/MyTracks/res/drawable-ldpi/ic_menu_chartsettings.png deleted file mode 100644 index e2692561d..000000000 Binary files a/MyTracks/res/drawable-ldpi/ic_menu_chartsettings.png and /dev/null differ diff --git a/MyTracks/res/drawable-ldpi/ic_menu_sensorstatus.png b/MyTracks/res/drawable-ldpi/ic_menu_sensorstatus.png deleted file mode 100644 index 4a25d569f..000000000 Binary files a/MyTracks/res/drawable-ldpi/ic_menu_sensorstatus.png and /dev/null differ diff --git a/MyTracks/res/drawable-ldpi/ic_menu_statistics.png b/MyTracks/res/drawable-ldpi/ic_menu_statistics.png deleted file mode 100644 index ec2e4e721..000000000 Binary files a/MyTracks/res/drawable-ldpi/ic_menu_statistics.png and /dev/null differ diff --git a/MyTracks/res/drawable-ldpi/ic_menu_waypoints.png b/MyTracks/res/drawable-ldpi/ic_menu_waypoints.png deleted file mode 100644 index e8dda7e2a..000000000 Binary files a/MyTracks/res/drawable-ldpi/ic_menu_waypoints.png and /dev/null differ diff --git a/MyTracks/res/drawable-ldpi/success.png b/MyTracks/res/drawable-ldpi/success.png deleted file mode 100644 index 1d44ba697..000000000 Binary files a/MyTracks/res/drawable-ldpi/success.png and /dev/null differ diff --git a/MyTracks/res/drawable-mdpi/ic_menu_chartsettings.png b/MyTracks/res/drawable-mdpi/ic_menu_chartsettings.png deleted file mode 100644 index 38327b492..000000000 Binary files a/MyTracks/res/drawable-mdpi/ic_menu_chartsettings.png and /dev/null differ diff --git a/MyTracks/res/drawable-mdpi/ic_menu_sensorstatus.png b/MyTracks/res/drawable-mdpi/ic_menu_sensorstatus.png deleted file mode 100644 index ca4ea1899..000000000 Binary files a/MyTracks/res/drawable-mdpi/ic_menu_sensorstatus.png and /dev/null differ diff --git a/MyTracks/res/drawable-mdpi/ic_menu_statistics.png b/MyTracks/res/drawable-mdpi/ic_menu_statistics.png deleted file mode 100644 index 859be5c8a..000000000 Binary files a/MyTracks/res/drawable-mdpi/ic_menu_statistics.png and /dev/null differ diff --git a/MyTracks/res/drawable-mdpi/ic_menu_waypoints.png b/MyTracks/res/drawable-mdpi/ic_menu_waypoints.png deleted file mode 100644 index 3b9284e8c..000000000 Binary files a/MyTracks/res/drawable-mdpi/ic_menu_waypoints.png and /dev/null differ diff --git a/MyTracks/res/drawable-mdpi/menu_aggregated_statistics.png b/MyTracks/res/drawable-mdpi/menu_aggregated_statistics.png new file mode 100644 index 000000000..e275e0283 Binary files /dev/null and b/MyTracks/res/drawable-mdpi/menu_aggregated_statistics.png differ diff --git a/MyTracks/res/drawable-mdpi/menu_chart_settings.png b/MyTracks/res/drawable-mdpi/menu_chart_settings.png new file mode 100644 index 000000000..d6235554b Binary files /dev/null and b/MyTracks/res/drawable-mdpi/menu_chart_settings.png differ diff --git a/MyTracks/res/drawable-mdpi/menu_delete_all.png b/MyTracks/res/drawable-mdpi/menu_delete_all.png new file mode 100644 index 000000000..3336760d5 Binary files /dev/null and b/MyTracks/res/drawable-mdpi/menu_delete_all.png differ diff --git a/MyTracks/res/drawable-mdpi/menu_elevation.png b/MyTracks/res/drawable-mdpi/menu_elevation.png deleted file mode 100644 index 59190b782..000000000 Binary files a/MyTracks/res/drawable-mdpi/menu_elevation.png and /dev/null differ diff --git a/MyTracks/res/drawable-mdpi/menu_export_all.png b/MyTracks/res/drawable-mdpi/menu_export_all.png new file mode 100644 index 000000000..6fdcd5fc4 Binary files /dev/null and b/MyTracks/res/drawable-mdpi/menu_export_all.png differ diff --git a/MyTracks/res/drawable-mdpi/menu_import_all.png b/MyTracks/res/drawable-mdpi/menu_import_all.png new file mode 100644 index 000000000..aac1c3851 Binary files /dev/null and b/MyTracks/res/drawable-mdpi/menu_import_all.png differ diff --git a/MyTracks/res/drawable-mdpi/menu_markers.png b/MyTracks/res/drawable-mdpi/menu_markers.png new file mode 100644 index 000000000..9c748b0b5 Binary files /dev/null and b/MyTracks/res/drawable-mdpi/menu_markers.png differ diff --git a/MyTracks/res/drawable-mdpi/menu_my_location.png b/MyTracks/res/drawable-mdpi/menu_my_location.png new file mode 100644 index 000000000..9d1f4403a Binary files /dev/null and b/MyTracks/res/drawable-mdpi/menu_my_location.png differ diff --git a/MyTracks/res/drawable-mdpi/menu_satellite_mode.png b/MyTracks/res/drawable-mdpi/menu_satellite_mode.png new file mode 100644 index 000000000..21de20114 Binary files /dev/null and b/MyTracks/res/drawable-mdpi/menu_satellite_mode.png differ diff --git a/MyTracks/res/drawable-mdpi/menu_save.png b/MyTracks/res/drawable-mdpi/menu_save.png new file mode 100644 index 000000000..ad0769553 Binary files /dev/null and b/MyTracks/res/drawable-mdpi/menu_save.png differ diff --git a/MyTracks/res/drawable-mdpi/menu_send_google.png b/MyTracks/res/drawable-mdpi/menu_send_google.png new file mode 100644 index 000000000..0e06c2212 Binary files /dev/null and b/MyTracks/res/drawable-mdpi/menu_send_google.png differ diff --git a/MyTracks/res/drawable-mdpi/menu_sensor_state.png b/MyTracks/res/drawable-mdpi/menu_sensor_state.png new file mode 100644 index 000000000..539bad7d7 Binary files /dev/null and b/MyTracks/res/drawable-mdpi/menu_sensor_state.png differ diff --git a/MyTracks/res/drawable-mdpi/tab_chart.png b/MyTracks/res/drawable-mdpi/tab_chart.png new file mode 100644 index 000000000..d6235554b Binary files /dev/null and b/MyTracks/res/drawable-mdpi/tab_chart.png differ diff --git a/MyTracks/res/drawable-mdpi/tab_map.png b/MyTracks/res/drawable-mdpi/tab_map.png new file mode 100644 index 000000000..21de20114 Binary files /dev/null and b/MyTracks/res/drawable-mdpi/tab_map.png differ diff --git a/MyTracks/res/drawable-mdpi/tab_stats.png b/MyTracks/res/drawable-mdpi/tab_stats.png new file mode 100644 index 000000000..5b87a5fbf Binary files /dev/null and b/MyTracks/res/drawable-mdpi/tab_stats.png differ diff --git a/MyTracks/res/drawable-xhdpi/menu_aggregated_statistics.png b/MyTracks/res/drawable-xhdpi/menu_aggregated_statistics.png new file mode 100644 index 000000000..05f9ab06d Binary files /dev/null and b/MyTracks/res/drawable-xhdpi/menu_aggregated_statistics.png differ diff --git a/MyTracks/res/drawable-xhdpi/menu_chart_settings.png b/MyTracks/res/drawable-xhdpi/menu_chart_settings.png new file mode 100644 index 000000000..3f93e4f65 Binary files /dev/null and b/MyTracks/res/drawable-xhdpi/menu_chart_settings.png differ diff --git a/MyTracks/res/drawable-xhdpi/menu_delete_all.png b/MyTracks/res/drawable-xhdpi/menu_delete_all.png new file mode 100644 index 000000000..f391760ef Binary files /dev/null and b/MyTracks/res/drawable-xhdpi/menu_delete_all.png differ diff --git a/MyTracks/res/drawable-xhdpi/menu_export_all.png b/MyTracks/res/drawable-xhdpi/menu_export_all.png new file mode 100644 index 000000000..791240fd2 Binary files /dev/null and b/MyTracks/res/drawable-xhdpi/menu_export_all.png differ diff --git a/MyTracks/res/drawable-xhdpi/menu_import_all.png b/MyTracks/res/drawable-xhdpi/menu_import_all.png new file mode 100644 index 000000000..741774bef Binary files /dev/null and b/MyTracks/res/drawable-xhdpi/menu_import_all.png differ diff --git a/MyTracks/res/drawable-xhdpi/menu_markers.png b/MyTracks/res/drawable-xhdpi/menu_markers.png new file mode 100644 index 000000000..95708234a Binary files /dev/null and b/MyTracks/res/drawable-xhdpi/menu_markers.png differ diff --git a/MyTracks/res/drawable-xhdpi/menu_my_location.png b/MyTracks/res/drawable-xhdpi/menu_my_location.png new file mode 100644 index 000000000..52ca8ab7f Binary files /dev/null and b/MyTracks/res/drawable-xhdpi/menu_my_location.png differ diff --git a/MyTracks/res/drawable-xhdpi/menu_satellite_mode.png b/MyTracks/res/drawable-xhdpi/menu_satellite_mode.png new file mode 100644 index 000000000..f5ce90a33 Binary files /dev/null and b/MyTracks/res/drawable-xhdpi/menu_satellite_mode.png differ diff --git a/MyTracks/res/drawable-xhdpi/menu_save.png b/MyTracks/res/drawable-xhdpi/menu_save.png new file mode 100644 index 000000000..272060253 Binary files /dev/null and b/MyTracks/res/drawable-xhdpi/menu_save.png differ diff --git a/MyTracks/res/drawable-xhdpi/menu_send_google.png b/MyTracks/res/drawable-xhdpi/menu_send_google.png new file mode 100644 index 000000000..37d98e5dd Binary files /dev/null and b/MyTracks/res/drawable-xhdpi/menu_send_google.png differ diff --git a/MyTracks/res/drawable-xhdpi/menu_sensor_state.png b/MyTracks/res/drawable-xhdpi/menu_sensor_state.png new file mode 100644 index 000000000..2caf74c95 Binary files /dev/null and b/MyTracks/res/drawable-xhdpi/menu_sensor_state.png differ diff --git a/MyTracks/res/drawable-xhdpi/tab_chart.png b/MyTracks/res/drawable-xhdpi/tab_chart.png new file mode 100644 index 000000000..3f93e4f65 Binary files /dev/null and b/MyTracks/res/drawable-xhdpi/tab_chart.png differ diff --git a/MyTracks/res/drawable-xhdpi/tab_map.png b/MyTracks/res/drawable-xhdpi/tab_map.png new file mode 100644 index 000000000..f5ce90a33 Binary files /dev/null and b/MyTracks/res/drawable-xhdpi/tab_map.png differ diff --git a/MyTracks/res/drawable-xhdpi/tab_stats.png b/MyTracks/res/drawable-xhdpi/tab_stats.png new file mode 100644 index 000000000..4b4355c4d Binary files /dev/null and b/MyTracks/res/drawable-xhdpi/tab_stats.png differ diff --git a/MyTracks/res/layout/about.xml b/MyTracks/res/layout/about.xml index 4e73b7c0e..b087fe596 100644 --- a/MyTracks/res/layout/about.xml +++ b/MyTracks/res/layout/about.xml @@ -15,64 +15,35 @@ See the License for the specific language governing permissions and limitations under the License. --> - + style="@style/ScrollView" > - - + android:text="@string/about_copyright_notice" + style="@style/TextMedium.WithIcon" /> - + android:text="@string/about_version" + style="@style/TextLarge" /> - + style="@style/AboutValue" /> - + android:text="@string/about_support" + style="@style/TextLarge" /> - + android:text="@string/my_tracks_support_url" + style="@style/AboutValue" /> - + android:text="@string/about_privacy" + style="@style/TextLarge" /> + android:text="@string/my_tracks_privacy_url" + style="@style/AboutValue" /> - \ No newline at end of file diff --git a/MyTracks/res/drawable/list_bar.xml b/MyTracks/res/layout/aggregated_stats.xml similarity index 59% rename from MyTracks/res/drawable/list_bar.xml rename to MyTracks/res/layout/aggregated_stats.xml index 82add4723..7c8f01024 100644 --- a/MyTracks/res/drawable/list_bar.xml +++ b/MyTracks/res/layout/aggregated_stats.xml @@ -1,6 +1,6 @@ - - - + + + + + \ No newline at end of file diff --git a/MyTracks/res/layout/chart.xml b/MyTracks/res/layout/chart.xml new file mode 100644 index 000000000..b5d169658 --- /dev/null +++ b/MyTracks/res/layout/chart.xml @@ -0,0 +1,35 @@ + + + + + + + \ No newline at end of file diff --git a/MyTracks/res/layout/chart_settings.xml b/MyTracks/res/layout/chart_settings.xml index e50ae4225..0df6d4eec 100644 --- a/MyTracks/res/layout/chart_settings.xml +++ b/MyTracks/res/layout/chart_settings.xml @@ -15,87 +15,52 @@ See the License for the specific language governing permissions and limitations under the License. --> - + style="@style/ScrollView" > - - + android:text="@string/chart_settings_x_axis" + style="@style/TextLarge.WithIcon" /> - - + android:text="@string/chart_settings_by_distance" + style="@style/TextMedium" /> + android:text="@string/chart_settings_by_time" + style="@style/TextMedium" /> - - + android:text="@string/chart_settings_y_axis" + style="@style/TextLarge.WithIcon" /> - + android:text="@string/stats_elevation" + style="@style/TextMedium" /> - + android:text="@string/stats_speed" + style="@style/TextMedium" /> - + android:text="@string/sensor_state_power" + style="@style/TextMedium" /> - + android:text="@string/sensor_state_cadence" + style="@style/TextMedium" /> + android:text="@string/sensor_state_heart_rate" + style="@style/TextMedium" /> - \ No newline at end of file diff --git a/MyTracks/res/layout/choose_map.xml b/MyTracks/res/layout/choose_map.xml index 13f453177..4f5d00f94 100644 --- a/MyTracks/res/layout/choose_map.xml +++ b/MyTracks/res/layout/choose_map.xml @@ -14,32 +14,15 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. --> - - + android:layout_width="fill_parent" > + android:layout_width="fill_parent" /> - + style="@style/ListEmptyTextView" > + + diff --git a/MyTracks/res/layout/choose_map_item.xml b/MyTracks/res/layout/choose_map_item.xml index eb27429a1..20da468ef 100644 --- a/MyTracks/res/layout/choose_map_item.xml +++ b/MyTracks/res/layout/choose_map_item.xml @@ -15,33 +15,23 @@ See the License for the specific language governing permissions and limitations under the License. --> + android:padding="8dp" > + android:id="@+id/choose_map_item_title" + android:singleLine="true" + style="@style/TextLarge" /> + android:id="@+id/choose_map_item_description" + android:singleLine="false" + android:textColor="@android:color/secondary_text_dark" + style="@style/TextSmall" /> - + android:id="@+id/choose_map_item_search_status" + android:singleLine="true" + style="@style/TextSmall" /> + \ No newline at end of file diff --git a/MyTracks/res/layout/help.xml b/MyTracks/res/layout/help.xml index dda328b77..cece4ce98 100644 --- a/MyTracks/res/layout/help.xml +++ b/MyTracks/res/layout/help.xml @@ -18,11 +18,8 @@ limitations under the License. android:layout_height="fill_parent" android:layout_width="fill_parent" android:orientation="vertical" > - - + + diff --git a/MyTracks/res/layout/list_item.xml b/MyTracks/res/layout/list_item.xml index 33a9afd73..fbe066805 100644 --- a/MyTracks/res/layout/list_item.xml +++ b/MyTracks/res/layout/list_item.xml @@ -27,10 +27,13 @@ limitations under the License. android:orientation="horizontal" > + android:singleLine="true" + style="@style/TextLarge.WithIcon" /> + android:layout_marginLeft="8dp" + android:singleLine="true" + style="@style/TextSmall" /> + style="@style/ListItemStats" /> + style="@style/ListItemStats" /> + style="@style/ListItemStats" /> + android:singleLine="false" + android:textColor="@android:color/secondary_text_dark" + style="@style/TextSmall" /> \ No newline at end of file diff --git a/MyTracks/res/layout/map.xml b/MyTracks/res/layout/map.xml new file mode 100644 index 000000000..0e73bf05f --- /dev/null +++ b/MyTracks/res/layout/map.xml @@ -0,0 +1,40 @@ + + + + + + + \ No newline at end of file diff --git a/MyTracks/res/layout/marker_detail.xml b/MyTracks/res/layout/marker_detail.xml index 80b481a03..5117a3e77 100644 --- a/MyTracks/res/layout/marker_detail.xml +++ b/MyTracks/res/layout/marker_detail.xml @@ -15,8 +15,7 @@ See the License for the specific language governing permissions and limitations under the License. --> + style="@style/ScrollView" > + style="@style/TextLarge" /> + style="@style/TextLarge" /> + style="@style/TextLarge" /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/MyTracks/res/layout/marker_edit.xml b/MyTracks/res/layout/marker_edit.xml index 9d3ee22d3..6ad93af0c 100644 --- a/MyTracks/res/layout/marker_edit.xml +++ b/MyTracks/res/layout/marker_edit.xml @@ -18,10 +18,7 @@ limitations under the License. android:layout_height="fill_parent" android:layout_width="fill_parent" android:orientation="vertical" > - + + style="@style/TextMedium" /> + style="@style/TextMedium" /> + style="@style/TextMedium" /> + style="@style/TextMedium" /> + style="@style/TextMedium" /> + style="@style/TextMedium" /> - - \ No newline at end of file + \ No newline at end of file diff --git a/MyTracks/res/layout/mytracks_charts.xml b/MyTracks/res/layout/mytracks_charts.xml deleted file mode 100644 index e015f7676..000000000 --- a/MyTracks/res/layout/mytracks_charts.xml +++ /dev/null @@ -1,57 +0,0 @@ - - - - - - - - - - - - diff --git a/MyTracks/res/layout/mytracks_layout.xml b/MyTracks/res/layout/mytracks_layout.xml deleted file mode 100644 index 20fec4b55..000000000 --- a/MyTracks/res/layout/mytracks_layout.xml +++ /dev/null @@ -1,62 +0,0 @@ - - - - - - - - - - - - diff --git a/MyTracks/res/layout/search_list.xml b/MyTracks/res/layout/search_list.xml index 45a3090af..21995c42c 100644 --- a/MyTracks/res/layout/search_list.xml +++ b/MyTracks/res/layout/search_list.xml @@ -14,7 +14,7 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. --> - - \ No newline at end of file + \ No newline at end of file diff --git a/MyTracks/res/layout/sensor_state.xml b/MyTracks/res/layout/sensor_state.xml index 6a387c299..7a4088436 100644 --- a/MyTracks/res/layout/sensor_state.xml +++ b/MyTracks/res/layout/sensor_state.xml @@ -14,67 +14,53 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. --> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/MyTracks/res/layout/stats.xml b/MyTracks/res/layout/stats.xml index d80189ce4..ae613cb62 100644 --- a/MyTracks/res/layout/stats.xml +++ b/MyTracks/res/layout/stats.xml @@ -14,349 +14,44 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. --> - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + android:padding="8dp" + android:shrinkColumns="0,2" + android:stretchColumns="0,2" > + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/MyTracks/res/layout/stats_core.xml b/MyTracks/res/layout/stats_core.xml new file mode 100644 index 000000000..6ad0977c2 --- /dev/null +++ b/MyTracks/res/layout/stats_core.xml @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/MyTracks/res/layout/track_edit.xml b/MyTracks/res/layout/track_edit.xml index 80877293a..8c3364d48 100644 --- a/MyTracks/res/layout/track_edit.xml +++ b/MyTracks/res/layout/track_edit.xml @@ -18,10 +18,7 @@ limitations under the License. android:layout_height="fill_parent" android:layout_width="fill_parent" android:orientation="vertical" > - + + style="@style/TextMedium" /> + style="@style/TextMedium" /> + style="@style/TextMedium" /> - + android:orientation="vertical" > @@ -40,4 +40,4 @@ limitations under the License. android:src="@drawable/menu_record_track" style="@android:style/Widget.DeviceDefault.ImageButton" /> - \ No newline at end of file + \ No newline at end of file diff --git a/MyTracks/res/layout/track_widget.xml b/MyTracks/res/layout/track_widget.xml index 958417227..55ca5bed2 100644 --- a/MyTracks/res/layout/track_widget.xml +++ b/MyTracks/res/layout/track_widget.xml @@ -14,77 +14,71 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. --> - - - + - + android:layout_width="wrap_content" + android:paddingLeft="10dp" + android:paddingRight="10dp" + android:src="@drawable/appwidget_button_disabled" /> + - - - - - - - - - - - - - - + android:layout_height="wrap_content" + android:layout_width="fill_parent" + android:orientation="horizontal" > + + + + + + + + + + + + \ No newline at end of file diff --git a/MyTracks/res/layout/upload_result.xml b/MyTracks/res/layout/upload_result.xml index 65f20a9a5..8a95f2916 100644 --- a/MyTracks/res/layout/upload_result.xml +++ b/MyTracks/res/layout/upload_result.xml @@ -15,13 +15,12 @@ See the License for the specific language governing permissions and limitations under the License. --> + style="@style/ScrollView" > + android:orientation="vertical" + android:padding="8dp" > + style="@style/TextMedium" /> + style="@style/TextSmall" /> @@ -66,20 +62,17 @@ limitations under the License. android:layout_width="wrap_content" android:src="@drawable/success" /> + style="@style/TextMedium" /> + style="@style/TextSmall" /> @@ -96,36 +89,29 @@ limitations under the License. android:layout_width="wrap_content" android:src="@drawable/success" /> + style="@style/TextMedium" /> + style="@style/TextSmall" /> + style="@style/TextSmall" /> + style="@style/TextMedium" /> \ No newline at end of file diff --git a/MyTracks/res/layout/upload_service_chooser.xml b/MyTracks/res/layout/upload_service_chooser.xml index c4cc68a35..caabaf7bf 100644 --- a/MyTracks/res/layout/upload_service_chooser.xml +++ b/MyTracks/res/layout/upload_service_chooser.xml @@ -15,27 +15,21 @@ See the License for the specific language governing permissions and limitations under the License. --> + style="@style/ScrollView" > + android:src="@drawable/maps_icon" + style="@style/UploadServiceChooserImageView" /> + style="@style/UploadServiceChooserCheckBox" /> + style="@style/TextMedium" /> + style="@style/TextMedium" /> + android:src="@drawable/googledocs_icon" + style="@style/UploadServiceChooserImageView" /> + style="@style/UploadServiceChooserCheckBox" /> + android:src="@drawable/googledocs_icon" + style="@style/UploadServiceChooserImageView" /> + style="@style/UploadServiceChooserCheckBox" /> \ No newline at end of file diff --git a/MyTracks/res/layout/welcome.xml b/MyTracks/res/layout/welcome.xml index 6c0cbd992..f780f0faf 100644 --- a/MyTracks/res/layout/welcome.xml +++ b/MyTracks/res/layout/welcome.xml @@ -15,7 +15,6 @@ See the License for the specific language governing permissions and limitations under the License. --> - + style="@style/ScrollView" > + \ No newline at end of file diff --git a/MyTracks/res/menu/list_context_menu.xml b/MyTracks/res/menu/list_context_menu.xml index 0ddf00d29..68aaa23c4 100644 --- a/MyTracks/res/menu/list_context_menu.xml +++ b/MyTracks/res/menu/list_context_menu.xml @@ -18,16 +18,16 @@ limitations under the License. \ No newline at end of file diff --git a/MyTracks/res/menu/marker_detail.xml b/MyTracks/res/menu/marker_detail.xml index 3bbb168cb..f032ce666 100644 --- a/MyTracks/res/menu/marker_detail.xml +++ b/MyTracks/res/menu/marker_detail.xml @@ -18,12 +18,12 @@ limitations under the License. @@ -74,19 +77,19 @@ limitations under the License. android:id="@+id/track_detail_delete" android:title="@string/menu_delete"/> @@ -45,9 +47,11 @@ limitations under the License. + + + + + + + + + diff --git a/MyTracks/res/values/colors.xml b/MyTracks/res/values/colors.xml index 9f396f181..1dc1bdf0c 100644 --- a/MyTracks/res/values/colors.xml +++ b/MyTracks/res/values/colors.xml @@ -17,13 +17,13 @@ limitations under the License. #FF000000 #FF0000FF - #FF00FF00 #FFAAAAAA #FFFF0000 - #FFF0F0F0 - #FF0F0F0F #FFFFFFFF + + #FFFF8800 + #FF339933 diff --git a/MyTracks/res/values/strings.xml b/MyTracks/res/values/strings.xml index 4c79bbc58..a22310692 100644 --- a/MyTracks/res/values/strings.xml +++ b/MyTracks/res/values/strings.xml @@ -494,7 +494,7 @@ limitations under the License. Accuracy (m) + translation_description="Label for location altitude in meters."> Altitude (m) - Please tap here to go to \'Location & security\' settings & check - \'Use GPS satellites\'. Press the back button to return. + Tap here to go to \'Location services\' settings & check \'GPS satellites\'. Press the back + button to return. @@ -929,11 +929,6 @@ limitations under the License. 'Maps' list page informing the user that he doesn't have any maps."> You don\'t have any maps. - - Pick a map: - @@ -946,8 +941,8 @@ limitations under the License. - Your Google Maps + page asking the user to pick a map."> + Pick a Map + + Average moving pace - + Average moving speed - + Average pace - + Average speed - + Elevation - + Elevation gain - + Fastest pace - + Latitude - + Longitude - + Max elevation - + Max grade - + Max speed - + Min elevation - + Min grade - + Moving time - + Pace - + Speed - + Total distance - + Total time @@ -2417,7 +2412,14 @@ limitations under the License. recommended value."> Smallest (recommended) - + + %1$s \u00B0 + + - - - - - + + + + - - - - + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/MyTracks/src/com/google/android/apps/mytracks/AbstractMyTracksActivity.java b/MyTracks/src/com/google/android/apps/mytracks/AbstractMyTracksActivity.java new file mode 100644 index 000000000..c409e06c7 --- /dev/null +++ b/MyTracks/src/com/google/android/apps/mytracks/AbstractMyTracksActivity.java @@ -0,0 +1,55 @@ +/* + * Copyright 2012 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ + +package com.google.android.apps.mytracks; + +import com.google.android.apps.mytracks.util.ApiAdapterFactory; + +import android.os.Bundle; +import android.speech.tts.TextToSpeech; +import android.support.v4.app.FragmentActivity; +import android.view.MenuItem; + +/** + * An abstract class for all My Tracks activities. + * + * @author Jimmy Shih + */ +public class AbstractMyTracksActivity extends FragmentActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setVolumeControlStream(TextToSpeech.Engine.DEFAULT_STREAM); + ApiAdapterFactory.getApiAdapter().configureActionBarHomeAsUp(this); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + if (item.getItemId() != android.R.id.home) { + return super.onOptionsItemSelected(item); + } + onHomeSelected(); + return true; + } + + /** + * Callback when the home menu item is selected. + */ + protected void onHomeSelected() { + finish(); + } +} diff --git a/MyTracks/src/com/google/android/apps/mytracks/AggregatedStatsActivity.java b/MyTracks/src/com/google/android/apps/mytracks/AggregatedStatsActivity.java index 8f329b967..f2e6710de 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/AggregatedStatsActivity.java +++ b/MyTracks/src/com/google/android/apps/mytracks/AggregatedStatsActivity.java @@ -1,129 +1,68 @@ +/* + * Copyright 2012 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ + 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.apps.mytracks.util.ApiAdapterFactory; -import com.google.android.apps.mytracks.util.IntentUtils; +import com.google.android.apps.mytracks.util.StatsUtils; import com.google.android.maps.mytracks.R; -import android.app.Activity; import android.content.Context; -import android.content.Intent; import android.content.SharedPreferences; -import android.content.SharedPreferences.OnSharedPreferenceChangeListener; import android.os.Bundle; -import android.util.DisplayMetrics; -import android.util.Log; -import android.view.MenuItem; -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. + * An activity to view aggregated stats from all recorded tracks. * * @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); - } - - @Override - public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, - String key) { - Log.d(Constants.TAG, "StatsActivity: onSharedPreferences changed " - + key); - if (key != null) { - if (key.equals(getString(R.string.metric_units_key))) { - metricUnits = sharedPreferences.getBoolean( - getString(R.string.metric_units_key), true); - utils.setMetricUnits(metricUnits); - utils.updateUnits(); - loadAggregatedStats(); - } - } - } +public class AggregatedStatsActivity extends AbstractMyTracksActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - - this.tracksProvider = MyTracksProviderUtils.Factory.get(this); - - ApiAdapterFactory.getApiAdapter().configureActionBarHomeAsUp(this); - - setContentView(R.layout.stats); - - ScrollView sv = ((ScrollView) findViewById(R.id.scrolly)); - sv.setScrollBarStyle(ScrollView.SCROLLBARS_OUTSIDE_INSET); + setContentView(R.layout.aggregated_stats); SharedPreferences preferences = getSharedPreferences( Constants.SETTINGS_NAME, Context.MODE_PRIVATE); - 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.stat_speed, R.string.stat_pace); - utils.setSpeedLabels(); + boolean metricUnits = preferences.getBoolean(getString(R.string.metric_units_key), true); + boolean reportSpeed = preferences.getBoolean(getString(R.string.report_speed_key), true); - DisplayMetrics metrics = new DisplayMetrics(); - getWindowManager().getDefaultDisplay().getMetrics(metrics); - if (metrics.heightPixels > 600) { - ((TextView) findViewById(R.id.speed_register)).setTextSize(80.0f); - } - loadAggregatedStats(); - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - if (item.getItemId() != android.R.id.home) { - return false; - } - Intent intent = IntentUtils.newIntent(this, TrackListActivity.class); - startActivity(intent); - return true; + StatsUtils.setSpeedLabels(this, reportSpeed, false); + StatsUtils.setTripStatisticsValues(this, getTripStatistics(), metricUnits, reportSpeed); + StatsUtils.setLocationElevationValue(this, Double.NaN, metricUnits); } /** - * 1. Reads tracks from the db - * 2. Merges the trip stats from the tracks - * 3. Updates the view + * Gets the aggregated trip statistics for all the recorded tracks or null if + * there is no track. */ - private void loadAggregatedStats() { - List tracks = retrieveTracks(); - TripStatistics rollingStats = null; + private TripStatistics getTripStatistics() { + List tracks = MyTracksProviderUtils.Factory.get(this).getAllTracks(); + TripStatistics tripStatistics = null; if (!tracks.isEmpty()) { - rollingStats = new TripStatistics(tracks.iterator().next() - .getStatistics()); + tripStatistics = new TripStatistics(tracks.iterator().next().getStatistics()); for (int i = 1; i < tracks.size(); i++) { - rollingStats.merge(tracks.get(i).getStatistics()); + tripStatistics.merge(tracks.get(i).getStatistics()); } } - updateView(rollingStats); - } - - private List retrieveTracks() { - return tracksProvider.getAllTracks(); - } - - private void updateView(TripStatistics aggStats) { - if (aggStats != null) { - utils.setAllStats(aggStats); - } + return tripStatistics; } } diff --git a/MyTracks/src/com/google/android/apps/mytracks/ChartView.java b/MyTracks/src/com/google/android/apps/mytracks/ChartView.java index 1fe435965..e55e3a5f6 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/ChartView.java +++ b/MyTracks/src/com/google/android/apps/mytracks/ChartView.java @@ -215,7 +215,7 @@ public class ChartView extends View { R.color.elevation_border, new ZoomSettings(MAX_INTERVALS, new int[] {5, 10, 25, 50, 100, 250, 500, 1000, 2500, 5000}), - R.string.stat_elevation); + R.string.stats_elevation); series[SPEED_SERIES] = new ChartValueSeries(context, @@ -223,7 +223,7 @@ public class ChartView extends View { R.color.speed_border, new ZoomSettings(MAX_INTERVALS, 0, Integer.MIN_VALUE, new int[] {1, 5, 10, 20, 50}), - R.string.stat_speed); + R.string.stats_speed); series[POWER_SERIES] = new ChartValueSeries(context, R.color.power_fill, @@ -270,8 +270,8 @@ public class ChartView extends View { public void setReportSpeed(boolean reportSpeed, Context c) { series[SPEED_SERIES].setTitle(c.getString(reportSpeed - ? R.string.stat_speed - : R.string.stat_pace)); + ? R.string.stats_speed + : R.string.stats_pace)); } private void addDataPointInternal(double[] theData) { diff --git a/MyTracks/src/com/google/android/apps/mytracks/Constants.java b/MyTracks/src/com/google/android/apps/mytracks/Constants.java index 92842278e..7b2da7c39 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/Constants.java +++ b/MyTracks/src/com/google/android/apps/mytracks/Constants.java @@ -33,14 +33,6 @@ public abstract class Constants { */ public static final String SDCARD_TOP_DIR = "MyTracks"; - /* - * Main screen tab tags: - */ - - public static final String MAP_TAB_TAG = "map"; - public static final String STATS_TAB_TAG = "stats"; - public static final String CHART_TAB_TAG = "chart"; - /** * The number of distance readings to smooth to get a stable signal. */ diff --git a/MyTracks/src/com/google/android/apps/mytracks/HelpActivity.java b/MyTracks/src/com/google/android/apps/mytracks/HelpActivity.java index 979af433a..877f6f693 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/HelpActivity.java +++ b/MyTracks/src/com/google/android/apps/mytracks/HelpActivity.java @@ -17,15 +17,9 @@ package com.google.android.apps.mytracks; import com.google.android.apps.mytracks.fragments.AboutDialogFragment; -import com.google.android.apps.mytracks.util.ApiAdapterFactory; -import com.google.android.apps.mytracks.util.IntentUtils; import com.google.android.maps.mytracks.R; -import android.content.Intent; import android.os.Bundle; -import android.speech.tts.TextToSpeech; -import android.support.v4.app.FragmentActivity; -import android.view.MenuItem; import android.view.View; import android.view.View.OnClickListener; @@ -34,13 +28,11 @@ import android.view.View.OnClickListener; * * @author Sandor Dornbush */ -public class HelpActivity extends FragmentActivity { +public class HelpActivity extends AbstractMyTracksActivity { @Override - public void onCreate(Bundle savedInstanceState) { + protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - setVolumeControlStream(TextToSpeech.Engine.DEFAULT_STREAM); - ApiAdapterFactory.getApiAdapter().configureActionBarHomeAsUp(this); setContentView(R.layout.help); findViewById(R.id.help_ok).setOnClickListener(new OnClickListener() { @@ -55,14 +47,4 @@ public class HelpActivity extends FragmentActivity { } }); } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - if (item.getItemId() != android.R.id.home) { - return false; - } - Intent intent = IntentUtils.newIntent(this, TrackListActivity.class); - startActivity(intent); - return true; - } } diff --git a/MyTracks/src/com/google/android/apps/mytracks/MarkerDetailActivity.java b/MyTracks/src/com/google/android/apps/mytracks/MarkerDetailActivity.java index ec1dffbd3..88ded474b 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/MarkerDetailActivity.java +++ b/MyTracks/src/com/google/android/apps/mytracks/MarkerDetailActivity.java @@ -19,8 +19,6 @@ package com.google.android.apps.mytracks; import com.google.android.apps.mytracks.content.MyTracksProviderUtils; import com.google.android.apps.mytracks.content.Waypoint; import com.google.android.apps.mytracks.fragments.DeleteOneMarkerDialogFragment; -import com.google.android.apps.mytracks.stats.TripStatistics; -import com.google.android.apps.mytracks.util.ApiAdapterFactory; import com.google.android.apps.mytracks.util.IntentUtils; import com.google.android.apps.mytracks.util.StatsUtils; import com.google.android.maps.mytracks.R; @@ -29,8 +27,6 @@ import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.os.Bundle; -import android.speech.tts.TextToSpeech; -import android.support.v4.app.FragmentActivity; import android.util.Log; import android.view.Menu; import android.view.MenuItem; @@ -42,7 +38,7 @@ import android.widget.TextView; * * @author Leif Hendrik Wilden */ -public class MarkerDetailActivity extends FragmentActivity { +public class MarkerDetailActivity extends AbstractMyTracksActivity { public static final String EXTRA_MARKER_ID = "marker_id"; private static final String TAG = MarkerDetailActivity.class.getSimpleName(); @@ -53,8 +49,6 @@ public class MarkerDetailActivity extends FragmentActivity { @Override protected void onCreate(Bundle bundle) { super.onCreate(bundle); - setVolumeControlStream(TextToSpeech.Engine.DEFAULT_STREAM); - ApiAdapterFactory.getApiAdapter().configureActionBarHomeAsUp(this); setContentView(R.layout.marker_detail); markerId = getIntent().getLongExtra(EXTRA_MARKER_ID, -1L); @@ -94,44 +88,9 @@ public class MarkerDetailActivity extends FragmentActivity { boolean metricUnits = preferences.getBoolean(getString(R.string.metric_units_key), true); boolean reportSpeed = preferences.getBoolean(getString(R.string.report_speed_key), true); - StatsUtils.setSpeedLabel(this, R.id.marker_detail_max_speed_label, R.string.stat_max_speed, - R.string.stat_fastest_pace, reportSpeed); - StatsUtils.setSpeedLabel(this, R.id.marker_detail_average_speed_label, - R.string.stat_average_speed, R.string.stat_average_pace, reportSpeed); - StatsUtils.setSpeedLabel(this, R.id.marker_detail_average_moving_speed_label, - R.string.stat_average_moving_speed, R.string.stat_average_moving_pace, reportSpeed); - - TripStatistics tripStatistics = waypoint.getStatistics(); - - StatsUtils.setDistanceValue(this, R.id.marker_detail_total_distance_value, - tripStatistics.getTotalDistance(), metricUnits); - StatsUtils.setSpeedValue(this, R.id.marker_detail_max_speed_value, - tripStatistics.getMaxSpeed(), reportSpeed, metricUnits); - - StatsUtils.setTimeValue( - this, R.id.marker_detail_total_time_value, tripStatistics.getTotalTime()); - StatsUtils.setSpeedValue(this, R.id.marker_detail_average_speed_value, - tripStatistics.getAverageSpeed(), reportSpeed, metricUnits); - - StatsUtils.setTimeValue( - this, R.id.marker_detail_moving_time_value, tripStatistics.getMovingTime()); - StatsUtils.setSpeedValue(this, R.id.marker_detail_average_moving_speed_value, - tripStatistics.getAverageMovingSpeed(), reportSpeed, metricUnits); - - StatsUtils.setAltitudeValue(this, R.id.marker_detail_elevation_value, - waypoint.getLocation().getAltitude(), metricUnits); - StatsUtils.setAltitudeValue(this, R.id.marker_detail_elevation_gain_value, - tripStatistics.getTotalElevationGain(), metricUnits); - - StatsUtils.setAltitudeValue(this, R.id.marker_detail_min_elevation_value, - tripStatistics.getMinElevation(), metricUnits); - StatsUtils.setAltitudeValue(this, R.id.marker_detail_max_elevation_value, - tripStatistics.getMaxElevation(), metricUnits); - - StatsUtils.setGradeValue( - this, R.id.marker_detail_min_grade_value, tripStatistics.getMinGrade()); - StatsUtils.setGradeValue( - this, R.id.marker_detail_max_grade_value, tripStatistics.getMaxGrade()); + StatsUtils.setSpeedLabels(this, reportSpeed, false); + StatsUtils.setTripStatisticsValues(this, waypoint.getStatistics(), metricUnits, reportSpeed); + StatsUtils.setLocationElevationValue(this, waypoint.getLocation().getAltitude(), metricUnits); } } @@ -141,15 +100,17 @@ public class MarkerDetailActivity extends FragmentActivity { return true; } + @Override + protected void onHomeSelected() { + Intent intent = IntentUtils.newIntent(this, MarkerListActivity.class) + .putExtra(MarkerListActivity.EXTRA_TRACK_ID, waypoint.getTrackId()); + startActivity(intent); + } + @Override public boolean onOptionsItemSelected(MenuItem item) { Intent intent; switch (item.getItemId()) { - case android.R.id.home: - intent = IntentUtils.newIntent(this, MarkerListActivity.class) - .putExtra(MarkerListActivity.EXTRA_TRACK_ID, waypoint.getTrackId()); - startActivity(intent); - return true; case R.id.marker_detail_show_on_map: intent = IntentUtils.newIntent(this, TrackDetailActivity.class) .putExtra(TrackDetailActivity.EXTRA_MARKER_ID, markerId); diff --git a/MyTracks/src/com/google/android/apps/mytracks/MarkerEditActivity.java b/MyTracks/src/com/google/android/apps/mytracks/MarkerEditActivity.java index 5982824ce..bae7c6966 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/MarkerEditActivity.java +++ b/MyTracks/src/com/google/android/apps/mytracks/MarkerEditActivity.java @@ -22,16 +22,12 @@ import com.google.android.apps.mytracks.content.WaypointCreationRequest; import com.google.android.apps.mytracks.content.WaypointCreationRequest.WaypointType; import com.google.android.apps.mytracks.services.ITrackRecordingService; import com.google.android.apps.mytracks.services.TrackRecordingServiceConnection; -import com.google.android.apps.mytracks.util.ApiAdapterFactory; import com.google.android.apps.mytracks.util.TrackRecordingServiceConnectionUtils; import com.google.android.maps.mytracks.R; -import android.app.Activity; import android.os.Bundle; import android.os.RemoteException; -import android.speech.tts.TextToSpeech; import android.util.Log; -import android.view.MenuItem; import android.view.View; import android.view.View.OnClickListener; import android.view.inputmethod.EditorInfo; @@ -47,7 +43,7 @@ import android.widget.Toast; * * @author Jimmy Shih */ -public class MarkerEditActivity extends Activity { +public class MarkerEditActivity extends AbstractMyTracksActivity { private static final String TAG = MarkerEditActivity.class.getSimpleName(); @@ -69,8 +65,6 @@ public class MarkerEditActivity extends Activity { @Override protected void onCreate(Bundle bundle) { super.onCreate(bundle); - setVolumeControlStream(TextToSpeech.Engine.DEFAULT_STREAM); - ApiAdapterFactory.getApiAdapter().configureActionBarHomeAsUp(this); setContentView(R.layout.marker_edit); markerId = getIntent().getLongExtra(EXTRA_MARKER_ID, -1L); @@ -85,6 +79,8 @@ public class MarkerEditActivity extends Activity { boolean statistics = checkedId == R.id.marker_edit_type_statistics; name.setText( statistics ? R.string.marker_edit_type_statistics : R.string.marker_edit_type_waypoint); + // Call selectAll so that all EditText have selectAllOnFocus style. + name.selectAll(); updateUiByMarkerType(statistics); } }); @@ -172,15 +168,6 @@ public class MarkerEditActivity extends Activity { trackRecordingServiceConnection.unbind(); } - @Override - public boolean onOptionsItemSelected(MenuItem item) { - if (item.getItemId() != android.R.id.home) { - return false; - } - finish(); - return true; - } - /** * Adds a marker. */ diff --git a/MyTracks/src/com/google/android/apps/mytracks/MarkerListActivity.java b/MyTracks/src/com/google/android/apps/mytracks/MarkerListActivity.java index c56605259..e590ed8ca 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/MarkerListActivity.java +++ b/MyTracks/src/com/google/android/apps/mytracks/MarkerListActivity.java @@ -33,8 +33,6 @@ import android.content.SharedPreferences; import android.content.SharedPreferences.OnSharedPreferenceChangeListener; import android.database.Cursor; import android.os.Bundle; -import android.speech.tts.TextToSpeech; -import android.support.v4.app.FragmentActivity; import android.support.v4.app.LoaderManager.LoaderCallbacks; import android.support.v4.content.CursorLoader; import android.support.v4.content.Loader; @@ -56,7 +54,7 @@ import android.widget.ListView; * * @author Leif Hendrik Wilden */ -public class MarkerListActivity extends FragmentActivity { +public class MarkerListActivity extends AbstractMyTracksActivity { public static final String EXTRA_TRACK_ID = "track_id"; @@ -111,9 +109,7 @@ public class MarkerListActivity extends FragmentActivity { return; } - setVolumeControlStream(TextToSpeech.Engine.DEFAULT_STREAM); setDefaultKeyMode(DEFAULT_KEYS_SEARCH_LOCAL); - ApiAdapterFactory.getApiAdapter().configureActionBarHomeAsUp(this); setContentView(R.layout.marker_list); SharedPreferences sharedPreferences = getSharedPreferences( @@ -198,9 +194,6 @@ public class MarkerListActivity extends FragmentActivity { @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { - case android.R.id.home: - finish(); - return true; case R.id.marker_list_insert_marker: Intent intent = IntentUtils.newIntent(this, MarkerEditActivity.class); startActivity(intent); diff --git a/MyTracks/src/com/google/android/apps/mytracks/SearchListActivity.java b/MyTracks/src/com/google/android/apps/mytracks/SearchListActivity.java index c4c9ec972..bd6b06c2f 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/SearchListActivity.java +++ b/MyTracks/src/com/google/android/apps/mytracks/SearchListActivity.java @@ -42,8 +42,6 @@ import android.location.Location; import android.location.LocationManager; import android.os.Bundle; import android.provider.SearchRecentSuggestions; -import android.speech.tts.TextToSpeech; -import android.support.v4.app.FragmentActivity; import android.util.Log; import android.view.ContextMenu; import android.view.ContextMenu.ContextMenuInfo; @@ -69,7 +67,7 @@ import java.util.SortedSet; * * @author Rodrigo Damazio */ -public class SearchListActivity extends FragmentActivity { +public class SearchListActivity extends AbstractMyTracksActivity { private static final String TAG = SearchListActivity.class.getSimpleName(); @@ -119,9 +117,7 @@ public class SearchListActivity extends FragmentActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - setVolumeControlStream(TextToSpeech.Engine.DEFAULT_STREAM); setDefaultKeyMode(DEFAULT_KEYS_SEARCH_LOCAL); - ApiAdapterFactory.getApiAdapter().configureActionBarHomeAsUp(this); setContentView(R.layout.search_list); myTracksProviderUtils = MyTracksProviderUtils.Factory.get(this); @@ -210,9 +206,6 @@ public class SearchListActivity extends FragmentActivity { @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { - case android.R.id.home: - finish(); - return true; case R.id.search_list_search: return ApiAdapterFactory.getApiAdapter().handleSearchMenuSelection(this); default: diff --git a/MyTracks/src/com/google/android/apps/mytracks/SensorStateActivity.java b/MyTracks/src/com/google/android/apps/mytracks/SensorStateActivity.java index f19cbaef8..fc79e07d5 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/SensorStateActivity.java +++ b/MyTracks/src/com/google/android/apps/mytracks/SensorStateActivity.java @@ -27,7 +27,6 @@ import com.google.android.apps.mytracks.util.StringUtils; import com.google.android.maps.mytracks.R; import com.google.protobuf.InvalidProtocolBufferException; -import android.app.Activity; import android.os.Bundle; import android.os.RemoteException; import android.util.Log; @@ -41,12 +40,10 @@ import java.util.TimerTask; * * @author Sandor Dornbush */ -public class SensorStateActivity extends Activity { +public class SensorStateActivity extends AbstractMyTracksActivity { private static final long REFRESH_PERIOD_MS = 250; - private final StatsUtilities utils; - /** * This timer periodically invokes the refresh timer task. */ @@ -91,11 +88,6 @@ public class SensorStateActivity extends Activity { */ private boolean isVisible = false; - public SensorStateActivity() { - utils = new StatsUtilities(this); - Log.w(TAG, "SensorStateActivity()"); - } - @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -239,18 +231,18 @@ public class SensorStateActivity extends Activity { } private void updateSensorData(Sensor.SensorDataSet sds) { - if (sds == null) { - utils.setUnknown(R.id.sensor_state_last_sensor_time); - utils.setUnknown(R.id.sensor_state_power); - utils.setUnknown(R.id.sensor_state_cadence); - utils.setUnknown(R.id.sensor_state_battery); - } else { - ((TextView) findViewById(R.id.sensor_state_last_sensor_time)).setText(getLastSensorTime(sds)); - ((TextView) findViewById(R.id.sensor_state_power)).setText(getPower(sds)); - ((TextView) findViewById(R.id.sensor_state_cadence)).setText(getCadence(sds)); - ((TextView) findViewById(R.id.sensor_state_heart_rate)).setText(getHeartRate(sds)); - ((TextView) findViewById(R.id.sensor_state_battery)).setText(getBattery(sds)); - } + String lastSensorTime = sds == null ? getString(R.string.value_unknown) + : getLastSensorTime(sds); + String power = sds == null ? getString(R.string.value_unknown) : getPower(sds); + String cadence = sds == null ? getString(R.string.value_unknown) : getCadence(sds); + String heartRate = sds == null ? getString(R.string.value_unknown) : getHeartRate(sds); + String battery = sds == null ? getString(R.string.value_unknown) : getBattery(sds); + + ((TextView) findViewById(R.id.sensor_state_last_sensor_time)).setText(lastSensorTime); + ((TextView) findViewById(R.id.sensor_state_power)).setText(power); + ((TextView) findViewById(R.id.sensor_state_cadence)).setText(cadence); + ((TextView) findViewById(R.id.sensor_state_heart_rate)).setText(heartRate); + ((TextView) findViewById(R.id.sensor_state_battery)).setText(battery); } /** @@ -325,8 +317,7 @@ public class SensorStateActivity extends Activity { String value; if (sds.hasBatteryLevel() && sds.getBatteryLevel().hasValue() && sds.getBatteryLevel().getState() == Sensor.SensorState.SENDING) { - String format = getString(R.string.value_integer_percent); - value = String.format(format, sds.getBatteryLevel().getValue()); + value = getString(R.string.value_integer_percent, sds.getBatteryLevel().getValue()); } else { value = SensorUtils.getStateAsString( sds.hasBatteryLevel() ? sds.getBatteryLevel().getState() : Sensor.SensorState.NONE, this); diff --git a/MyTracks/src/com/google/android/apps/mytracks/StatsUtilities.java b/MyTracks/src/com/google/android/apps/mytracks/StatsUtilities.java deleted file mode 100644 index d851ffff0..000000000 --- a/MyTracks/src/com/google/android/apps/mytracks/StatsUtilities.java +++ /dev/null @@ -1,270 +0,0 @@ -/* - * Copyright 2009 Google Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package com.google.android.apps.mytracks; - -import com.google.android.apps.mytracks.stats.TripStatistics; -import com.google.android.apps.mytracks.util.StatsUtils; -import com.google.android.apps.mytracks.util.StringUtils; -import com.google.android.apps.mytracks.util.UnitConversions; -import com.google.android.maps.mytracks.R; - -import android.app.Activity; -import android.util.Log; -import android.widget.TextView; - -import java.text.NumberFormat; - -/** - * Various utility functions for views that display statistics information. - * - * @deprecated use {@link StatsUtils}. - * - * @author Sandor Dornbush - */ -public class StatsUtilities { - - private final Activity activity; - private static final NumberFormat LAT_LONG_FORMAT = NumberFormat.getNumberInstance(); - private static final NumberFormat ALTITUDE_FORMAT = NumberFormat.getIntegerInstance(); - private static final NumberFormat SPEED_FORMAT = NumberFormat.getNumberInstance(); - private static final NumberFormat GRADE_FORMAT = NumberFormat.getPercentInstance(); - - static { - LAT_LONG_FORMAT.setMaximumFractionDigits(5); - LAT_LONG_FORMAT.setMinimumFractionDigits(5); - SPEED_FORMAT.setMaximumFractionDigits(2); - SPEED_FORMAT.setMinimumFractionDigits(2); - GRADE_FORMAT.setMaximumFractionDigits(1); - GRADE_FORMAT.setMinimumFractionDigits(1); - } - - /** - * True if distances should be displayed in metric units (from shared - * preferences). - */ - private boolean metricUnits = true; - - /** - * True - report speed - * False - report pace - */ - private boolean reportSpeed = true; - - public StatsUtilities(Activity a) { - this.activity = a; - } - - public boolean isMetricUnits() { - return metricUnits; - } - - public void setMetricUnits(boolean metricUnits) { - this.metricUnits = metricUnits; - } - - public boolean isReportSpeed() { - return reportSpeed; - } - - public void setReportSpeed(boolean reportSpeed) { - this.reportSpeed = reportSpeed; - } - - public void setUnknown(int id) { - ((TextView) activity.findViewById(id)).setText(R.string.value_unknown); - } - - public void setText(int id, double d, NumberFormat format) { - if (!Double.isNaN(d) && !Double.isInfinite(d)) { - setText(id, format.format(d)); - } else { - setUnknown(id); - } - } - - public void setText(int id, String s) { - int lengthLimit = 8; - String displayString = s.length() > lengthLimit - ? s.substring(0, lengthLimit - 3) + "..." - : s; - ((TextView) activity.findViewById(id)).setText(displayString); - } - - public void setLatLong(int id, double d) { - TextView msgTextView = (TextView) activity.findViewById(id); - msgTextView.setText(LAT_LONG_FORMAT.format(d)); - } - - public void setAltitude(int id, double d) { - setText(id, (metricUnits ? d : (d * UnitConversions.M_TO_FT)), - ALTITUDE_FORMAT); - } - - public void setDistance(int id, double d) { - setText(id, (metricUnits ? d : (d * UnitConversions.KM_TO_MI)), - SPEED_FORMAT); - } - - public void setSpeed(int id, double d) { - if (d == 0) { - setUnknown(id); - return; - } - double speed = metricUnits ? d : d * UnitConversions.KM_TO_MI; - if (reportSpeed) { - setText(id, speed, SPEED_FORMAT); - } else { - // Format as milliseconds per unit - long pace = (long) (3600000.0 / speed); - setTime(id, pace); - } - } - - public void setAltitudeUnits(int unitLabelId) { - TextView unitTextView = (TextView) activity.findViewById(unitLabelId); - unitTextView.setText(metricUnits ? R.string.unit_meter : R.string.unit_feet); - } - - public void setDistanceUnits(int unitLabelId) { - TextView unitTextView = (TextView) activity.findViewById(unitLabelId); - unitTextView.setText(metricUnits ? R.string.unit_kilometer : R.string.unit_mile); - } - - public void setSpeedUnits(int unitLabelId, int unitLabelBottomId) { - TextView unitTextView = (TextView) activity.findViewById(unitLabelId); - unitTextView.setText(reportSpeed - ? (metricUnits ? R.string.unit_kilometer : R.string.unit_mile) - : R.string.unit_minute); - - unitTextView = (TextView) activity.findViewById(unitLabelBottomId); - unitTextView.setText(reportSpeed - ? R.string.unit_hour - : (metricUnits ? R.string.unit_kilometer : R.string.unit_mile)); - } - - public void setTime(int id, long l) { - setText(id, StringUtils.formatElapsedTime(l)); - } - - public void setGrade(int id, double d) { - setText(id, d, GRADE_FORMAT); - } - - /** - * Updates the unit fields. - */ - public void updateUnits() { - setSpeedUnits(R.id.speed_unit_label_top, R.id.speed_unit_label_bottom); - updateWaypointUnits(); - } - - /** - * Updates the units fields used by waypoints. - */ - public void updateWaypointUnits() { - setSpeedUnits(R.id.average_moving_speed_unit_label_top, - R.id.average_moving_speed_unit_label_bottom); - setSpeedUnits(R.id.average_speed_unit_label_top, - R.id.average_speed_unit_label_bottom); - setDistanceUnits(R.id.total_distance_unit_label); - setSpeedUnits(R.id.max_speed_unit_label_top, - R.id.max_speed_unit_label_bottom); - setAltitudeUnits(R.id.elevation_unit_label); - setAltitudeUnits(R.id.elevation_gain_unit_label); - setAltitudeUnits(R.id.min_elevation_unit_label); - setAltitudeUnits(R.id.max_elevation_unit_label); - } - - /** - * Sets all fields to "-" (unknown). - */ - public void setAllToUnknown() { - // "Instant" values: - setUnknown(R.id.elevation_register); - setUnknown(R.id.latitude_register); - setUnknown(R.id.longitude_register); - setUnknown(R.id.speed_register); - // Values from provider: - setUnknown(R.id.total_time_register); - setUnknown(R.id.moving_time_register); - setUnknown(R.id.total_distance_register); - setUnknown(R.id.average_speed_register); - setUnknown(R.id.average_moving_speed_register); - setUnknown(R.id.max_speed_register); - setUnknown(R.id.min_elevation_register); - setUnknown(R.id.max_elevation_register); - setUnknown(R.id.elevation_gain_register); - setUnknown(R.id.min_grade_register); - setUnknown(R.id.max_grade_register); - } - - public void setAllStats(long movingTime, double totalDistance, - double averageSpeed, double averageMovingSpeed, double maxSpeed, - double minElevation, double maxElevation, double elevationGain, - double minGrade, double maxGrade) { - setTime(R.id.moving_time_register, movingTime); - setDistance(R.id.total_distance_register, totalDistance * UnitConversions.M_TO_KM); - setSpeed(R.id.average_speed_register, averageSpeed * UnitConversions.MS_TO_KMH); - setSpeed(R.id.average_moving_speed_register, averageMovingSpeed * UnitConversions.MS_TO_KMH); - setSpeed(R.id.max_speed_register, maxSpeed * UnitConversions.MS_TO_KMH); - setAltitude(R.id.min_elevation_register, minElevation); - setAltitude(R.id.max_elevation_register, maxElevation); - setAltitude(R.id.elevation_gain_register, elevationGain); - setGrade(R.id.min_grade_register, minGrade); - setGrade(R.id.max_grade_register, maxGrade); - } - - public void setAllStats(TripStatistics stats) { - setTime(R.id.moving_time_register, stats.getMovingTime()); - setDistance(R.id.total_distance_register, stats.getTotalDistance() * UnitConversions.M_TO_KM); - setSpeed(R.id.average_speed_register, stats.getAverageSpeed() * UnitConversions.MS_TO_KMH); - setSpeed(R.id.average_moving_speed_register, - stats.getAverageMovingSpeed() * UnitConversions.MS_TO_KMH); - setSpeed(R.id.max_speed_register, stats.getMaxSpeed() * UnitConversions.MS_TO_KMH); - setAltitude(R.id.min_elevation_register, stats.getMinElevation()); - setAltitude(R.id.max_elevation_register, stats.getMaxElevation()); - 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) { - Log.w(Constants.TAG, "Setting view " + id + - " to " + reportSpeed + - " speed: " + speedString + - " pace: " + paceString); - TextView tv = ((TextView) activity.findViewById(id)); - if (tv != null) { - tv.setText(reportSpeed ? speedString : paceString); - } else { - Log.w(Constants.TAG, "Could not find id: " + id); - } - } - - public void setSpeedLabels() { - setSpeedLabel(R.id.average_speed_label, - R.string.stat_average_speed, - R.string.stat_average_pace); - setSpeedLabel(R.id.average_moving_speed_label, - R.string.stat_average_moving_speed, - R.string.stat_average_moving_pace); - setSpeedLabel(R.id.max_speed_label, - R.string.stat_max_speed, - R.string.stat_fastest_pace); - } -} diff --git a/MyTracks/src/com/google/android/apps/mytracks/TrackDetailActivity.java b/MyTracks/src/com/google/android/apps/mytracks/TrackDetailActivity.java index c44e12fe2..4fdd09ea2 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/TrackDetailActivity.java +++ b/MyTracks/src/com/google/android/apps/mytracks/TrackDetailActivity.java @@ -16,10 +16,6 @@ package com.google.android.apps.mytracks; -import static com.google.android.apps.mytracks.Constants.CHART_TAB_TAG; -import static com.google.android.apps.mytracks.Constants.MAP_TAB_TAG; -import static com.google.android.apps.mytracks.Constants.STATS_TAB_TAG; - import com.google.android.apps.mytracks.content.MyTracksProviderUtils; import com.google.android.apps.mytracks.content.TrackDataHub; import com.google.android.apps.mytracks.content.Waypoint; @@ -52,8 +48,6 @@ import android.content.pm.ResolveInfo; import android.os.Bundle; import android.os.Parcelable; import android.os.RemoteException; -import android.speech.tts.TextToSpeech; -import android.support.v4.app.FragmentActivity; import android.util.Log; import android.view.Menu; import android.view.MenuItem; @@ -71,7 +65,7 @@ import java.util.List; * @author Leif Hendrik Wilden * @author Rodrigo Damazio */ -public class TrackDetailActivity extends FragmentActivity { +public class TrackDetailActivity extends AbstractMyTracksActivity { public static final String EXTRA_TRACK_ID = "track_id"; public static final String EXTRA_MARKER_ID = "marker_id"; @@ -134,9 +128,7 @@ public class TrackDetailActivity extends FragmentActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - setVolumeControlStream(TextToSpeech.Engine.DEFAULT_STREAM); ApiAdapterFactory.getApiAdapter().hideTitle(this); - ApiAdapterFactory.getApiAdapter().configureActionBarHomeAsUp(this); setContentView(R.layout.track_detail); sharedPreferences = getSharedPreferences(Constants.SETTINGS_NAME, Context.MODE_PRIVATE); @@ -144,21 +136,20 @@ public class TrackDetailActivity extends FragmentActivity { trackDataHub = ((MyTracksApplication) getApplication()).getTrackDataHub(); trackRecordingServiceConnection = new TrackRecordingServiceConnection(this, null); - mapViewContainer = getLayoutInflater().inflate(R.layout.mytracks_layout, null); + mapViewContainer = getLayoutInflater().inflate(R.layout.map, null); tabHost = (TabHost) findViewById(android.R.id.tabhost); tabHost.setup(); tabManager = new TabManager(this, tabHost, R.id.realtabcontent); - TabSpec mapTabSpec = tabHost.newTabSpec(MAP_TAB_TAG).setIndicator( - getString(R.string.track_detail_map_tab), - getResources().getDrawable(android.R.drawable.ic_menu_mapmode)); + TabSpec mapTabSpec = tabHost.newTabSpec(MapFragment.MAP_FRAGMENT_TAG).setIndicator( + getString(R.string.track_detail_map_tab), getResources().getDrawable(R.drawable.tab_map)); tabManager.addTab(mapTabSpec, MapFragment.class, null); - TabSpec chartTabSpec = tabHost.newTabSpec(CHART_TAB_TAG).setIndicator( + TabSpec chartTabSpec = tabHost.newTabSpec(ChartFragment.CHART_FRAGMENT_TAG).setIndicator( getString(R.string.track_detail_chart_tab), - getResources().getDrawable(R.drawable.menu_elevation)); + getResources().getDrawable(R.drawable.tab_chart)); tabManager.addTab(chartTabSpec, ChartFragment.class, null); - TabSpec statsTabSpec = tabHost.newTabSpec(STATS_TAB_TAG).setIndicator( + TabSpec statsTabSpec = tabHost.newTabSpec(StatsFragment.STATS_FRAGMENT_TAG).setIndicator( getString(R.string.track_detail_stats_tab), - getResources().getDrawable(R.drawable.ic_menu_statistics)); + getResources().getDrawable(R.drawable.tab_stats)); tabManager.addTab(statsTabSpec, StatsFragment.class, null); if (savedInstanceState != null) { tabHost.setCurrentTabByTag(savedInstanceState.getString(CURRENT_TAG_KEY)); @@ -242,28 +233,33 @@ public class TrackDetailActivity extends FragmentActivity { @Override public boolean onPrepareOptionsMenu(Menu menu) { String currentTabTag = tabHost.getCurrentTabTag(); - menu.findItem(R.id.track_detail_chart_settings).setVisible(CHART_TAB_TAG.equals(currentTabTag)); - menu.findItem(R.id.track_detail_my_location).setVisible(MAP_TAB_TAG.equals(currentTabTag)); + menu.findItem(R.id.track_detail_chart_settings).setVisible( + ChartFragment.CHART_FRAGMENT_TAG.equals(currentTabTag)); + menu.findItem(R.id.track_detail_my_location) + .setVisible(MapFragment.MAP_FRAGMENT_TAG.equals(currentTabTag)); // Set map or satellite mode MapFragment mapFragment = (MapFragment) getSupportFragmentManager() - .findFragmentByTag(MAP_TAB_TAG); + .findFragmentByTag(MapFragment.MAP_FRAGMENT_TAG); boolean isSatelliteMode = mapFragment != null ? mapFragment.isSatelliteView() : false; - menu.findItem(R.id.track_detail_satellite_mode).setVisible(MAP_TAB_TAG.equals(currentTabTag)) + menu.findItem(R.id.track_detail_satellite_mode) + .setVisible(MapFragment.MAP_FRAGMENT_TAG.equals(currentTabTag)) .setTitle(isSatelliteMode ? R.string.menu_map_mode : R.string.menu_satellite_mode); return super.onPrepareOptionsMenu(menu); } + @Override + protected void onHomeSelected() { + Intent intent = IntentUtils.newIntent(this, TrackListActivity.class); + startActivity(intent); + } + @Override public boolean onOptionsItemSelected(MenuItem item) { MapFragment mapFragment; Intent intent; switch (item.getItemId()) { - case android.R.id.home: - intent = IntentUtils.newIntent(this, TrackListActivity.class); - startActivity(intent); - return true; case R.id.track_detail_stop_recording: updateMenuItems(false); TrackRecordingServiceConnectionUtils.stop(this, trackRecordingServiceConnection); @@ -339,13 +335,15 @@ public class TrackDetailActivity extends FragmentActivity { getSupportFragmentManager(), DeleteOneTrackDialogFragment.DELETE_ONE_TRACK_DIALOG_TAG); return true; case R.id.track_detail_my_location: - mapFragment = (MapFragment) getSupportFragmentManager().findFragmentByTag(MAP_TAB_TAG); + mapFragment = (MapFragment) getSupportFragmentManager() + .findFragmentByTag(MapFragment.MAP_FRAGMENT_TAG); if (mapFragment != null) { mapFragment.showMyLocation(); } return true; case R.id.track_detail_satellite_mode: - mapFragment = (MapFragment) getSupportFragmentManager().findFragmentByTag(MAP_TAB_TAG); + mapFragment = (MapFragment) getSupportFragmentManager() + .findFragmentByTag(MapFragment.MAP_FRAGMENT_TAG); if (mapFragment != null) { mapFragment.setSatelliteView(!mapFragment.isSatelliteView()); } @@ -367,7 +365,7 @@ public class TrackDetailActivity extends FragmentActivity { startActivity(intent); return true; default: - return false; + return super.onOptionsItemSelected(item); } } @@ -433,9 +431,9 @@ public class TrackDetailActivity extends FragmentActivity { if (markerId != -1L) { MapFragment mapFragmet = (MapFragment) getSupportFragmentManager() - .findFragmentByTag(MAP_TAB_TAG); + .findFragmentByTag(MapFragment.MAP_FRAGMENT_TAG); if (mapFragmet != null) { - tabHost.setCurrentTabByTag(MAP_TAB_TAG); + tabHost.setCurrentTabByTag(MapFragment.MAP_FRAGMENT_TAG); mapFragmet.showMarker(trackId, markerId); } else { Log.e(TAG, "MapFragment is null"); diff --git a/MyTracks/src/com/google/android/apps/mytracks/TrackEditActivity.java b/MyTracks/src/com/google/android/apps/mytracks/TrackEditActivity.java index 23858d7c2..843152b09 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/TrackEditActivity.java +++ b/MyTracks/src/com/google/android/apps/mytracks/TrackEditActivity.java @@ -18,16 +18,11 @@ 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.util.ApiAdapterFactory; import com.google.android.maps.mytracks.R; -import android.app.Activity; import android.os.Bundle; -import android.speech.tts.TextToSpeech; import android.util.Log; -import android.view.MenuItem; import android.view.View; -import android.view.View.OnClickListener; import android.widget.ArrayAdapter; import android.widget.AutoCompleteTextView; import android.widget.Button; @@ -39,7 +34,7 @@ import android.widget.EditText; * * @author Leif Hendrik Wilden */ -public class TrackEditActivity extends Activity implements OnClickListener { +public class TrackEditActivity extends AbstractMyTracksActivity { public static final String EXTRA_TRACK_ID = "track_id"; public static final String EXTRA_NEW_TRACK = "new_track"; @@ -57,8 +52,6 @@ public class TrackEditActivity extends Activity implements OnClickListener { @Override protected void onCreate(Bundle bundle) { super.onCreate(bundle); - setVolumeControlStream(TextToSpeech.Engine.DEFAULT_STREAM); - ApiAdapterFactory.getApiAdapter().configureActionBarHomeAsUp(this); setContentView(R.layout.track_edit); trackId = getIntent().getLongExtra(EXTRA_TRACK_ID, -1L); @@ -89,7 +82,16 @@ public class TrackEditActivity extends Activity implements OnClickListener { description.setText(track.getDescription()); Button save = (Button) findViewById(R.id.track_edit_save); - save.setOnClickListener(this); + save.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + track.setName(name.getText().toString()); + track.setCategory(activityType.getText().toString()); + track.setDescription(description.getText().toString()); + myTracksProviderUtils.updateTrack(track); + finish(); + } + }); Button cancel = (Button) findViewById(R.id.track_edit_cancel); if (getIntent().getBooleanExtra(EXTRA_NEW_TRACK, false)) { @@ -97,28 +99,13 @@ public class TrackEditActivity extends Activity implements OnClickListener { cancel.setVisibility(View.GONE); } else { setTitle(R.string.menu_edit); - cancel.setOnClickListener(this); + cancel.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + finish(); + } + }); cancel.setVisibility(View.VISIBLE); } } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - if (item.getItemId() != android.R.id.home) { - return false; - } - finish(); - return true; - } - - @Override - public void onClick(View view) { - if (view.getId() == R.id.track_edit_save) { - track.setName(name.getText().toString()); - track.setCategory(activityType.getText().toString()); - track.setDescription(description.getText().toString()); - myTracksProviderUtils.updateTrack(track); - } - finish(); - } } diff --git a/MyTracks/src/com/google/android/apps/mytracks/fragments/ChartFragment.java b/MyTracks/src/com/google/android/apps/mytracks/fragments/ChartFragment.java index e0e8bf9a8..eef8ae371 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/fragments/ChartFragment.java +++ b/MyTracks/src/com/google/android/apps/mytracks/fragments/ChartFragment.java @@ -42,7 +42,6 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.ViewGroup.LayoutParams; -import android.widget.LinearLayout; import android.widget.ZoomControls; import java.util.ArrayList; @@ -56,6 +55,8 @@ import java.util.EnumSet; */ public class ChartFragment extends Fragment implements TrackDataListener { + public static final String CHART_FRAGMENT_TAG = "chartFragment"; + // Android reports 128 when the speed is invalid private static final int INVALID_SPEED = 128; private final DoubleBuffer elevationBuffer = new DoubleBuffer( @@ -77,7 +78,6 @@ public class ChartFragment extends Fragment implements TrackDataListener { // UI elements private ChartView chartView; - private LinearLayout busyPane; private ZoomControls zoomControls; /** @@ -91,7 +91,6 @@ public class ChartFragment extends Fragment implements TrackDataListener { return; } - busyPane.setVisibility(View.GONE); zoomControls.setIsZoomInEnabled(chartView.canZoomIn()); zoomControls.setIsZoomOutEnabled(chartView.canZoomOut()); chartView.setShowPointer(isRecording()); @@ -113,9 +112,8 @@ public class ChartFragment extends Fragment implements TrackDataListener { @Override public View onCreateView( LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - View view = inflater.inflate(R.layout.mytracks_charts, container, false); - busyPane = (LinearLayout) view.findViewById(R.id.elevation_busypane); - zoomControls = (ZoomControls) view.findViewById(R.id.elevation_zoom); + View view = inflater.inflate(R.layout.chart, container, false); + zoomControls = (ZoomControls) view.findViewById(R.id.chart_zoom_controls); zoomControls.setOnZoomInClickListener(new View.OnClickListener() { @Override public void onClick(View v) { @@ -134,7 +132,7 @@ public class ChartFragment extends Fragment implements TrackDataListener { @Override public void onStart() { super.onStart(); - ViewGroup layout = (ViewGroup) getActivity().findViewById(R.id.elevation_chart); + ViewGroup layout = (ViewGroup) getActivity().findViewById(R.id.chart_view_layout); LayoutParams layoutParams = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); layout.addView(chartView, layoutParams); @@ -156,7 +154,7 @@ public class ChartFragment extends Fragment implements TrackDataListener { @Override public void onStop() { super.onStop(); - ViewGroup layout = (ViewGroup) getActivity().findViewById(R.id.elevation_chart); + ViewGroup layout = (ViewGroup) getActivity().findViewById(R.id.chart_view_layout); layout.removeView(chartView); } @@ -229,12 +227,7 @@ public class ChartFragment extends Fragment implements TrackDataListener { @Override public void onSelectedTrackChanged(Track track, boolean isRecording) { - getActivity().runOnUiThread(new Runnable() { - @Override - public void run() { - busyPane.setVisibility(View.VISIBLE); - } - }); + // We don't care. } @Override diff --git a/MyTracks/src/com/google/android/apps/mytracks/fragments/ChartSettingsDialogFragment.java b/MyTracks/src/com/google/android/apps/mytracks/fragments/ChartSettingsDialogFragment.java index 15eda36fe..14937a13e 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/fragments/ChartSettingsDialogFragment.java +++ b/MyTracks/src/com/google/android/apps/mytracks/fragments/ChartSettingsDialogFragment.java @@ -16,8 +16,6 @@ package com.google.android.apps.mytracks.fragments; -import static com.google.android.apps.mytracks.Constants.CHART_TAB_TAG; - import com.google.android.apps.mytracks.ChartView; import com.google.android.maps.mytracks.R; @@ -42,7 +40,7 @@ public class ChartSettingsDialogFragment extends DialogFragment { @Override public Dialog onCreateDialog(Bundle savedInstanceState) { final ChartFragment chartFragment = (ChartFragment) getActivity() - .getSupportFragmentManager().findFragmentByTag(CHART_TAB_TAG); + .getSupportFragmentManager().findFragmentByTag(ChartFragment.CHART_FRAGMENT_TAG); View view = getActivity().getLayoutInflater().inflate(R.layout.chart_settings, null); final RadioGroup radioGroup = (RadioGroup) view.findViewById(R.id.chart_settings_x); radioGroup.check(chartFragment.getMode() == ChartView.Mode.BY_DISTANCE @@ -63,7 +61,7 @@ public class ChartSettingsDialogFragment extends DialogFragment { checkBoxes[i].setChecked(chartFragment.isChartValueSeriesEnabled(i)); } checkBoxes[ChartView.SPEED_SERIES].setText(chartFragment.isReportSpeed() - ? R.string.stat_speed : R.string.stat_pace); + ? R.string.stats_speed : R.string.stats_pace); return new AlertDialog.Builder(getActivity()) .setCancelable(true) diff --git a/MyTracks/src/com/google/android/apps/mytracks/fragments/MapFragment.java b/MyTracks/src/com/google/android/apps/mytracks/fragments/MapFragment.java index f1e6d1b01..ef43990fa 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/fragments/MapFragment.java +++ b/MyTracks/src/com/google/android/apps/mytracks/fragments/MapFragment.java @@ -43,8 +43,6 @@ import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; -import android.widget.LinearLayout; -import android.widget.RelativeLayout; import android.widget.TextView; import android.widget.Toast; @@ -59,6 +57,8 @@ import java.util.EnumSet; public class MapFragment extends Fragment implements View.OnTouchListener, View.OnClickListener, TrackDataListener { + public static final String MAP_FRAGMENT_TAG = "mapFragment"; + private static final String KEY_CURRENT_LOCATION = "currentLocation"; private static final String KEY_KEEP_MY_LOCATION_VISIBLE = "keepMyLocationVisible"; @@ -85,11 +85,8 @@ public class MapFragment extends Fragment // UI elements private View mapViewContainer; private MapOverlay mapOverlay; - private RelativeLayout screen; private MapView mapView; - private LinearLayout messagePane; - private TextView messageText; - private LinearLayout busyPane; + private TextView messageTextView; @Override public View onCreateView( @@ -98,15 +95,12 @@ public class MapFragment extends Fragment mapOverlay = new MapOverlay(getActivity()); - screen = (RelativeLayout) mapViewContainer.findViewById(R.id.screen); - mapView = (MapView) mapViewContainer.findViewById(R.id.map); + mapView = (MapView) mapViewContainer.findViewById(R.id.map_view); mapView.requestFocus(); mapView.setOnTouchListener(this); mapView.setBuiltInZoomControls(true); mapView.getOverlays().add(mapOverlay); - messagePane = (LinearLayout) mapViewContainer.findViewById(R.id.messagepane); - messageText = (TextView) mapViewContainer.findViewById(R.id.messagetext); - busyPane = (LinearLayout) mapViewContainer.findViewById(R.id.busypane); + messageTextView = (TextView) mapViewContainer.findViewById(R.id.map_message); return mapViewContainer; } @@ -238,7 +232,7 @@ public class MapFragment extends Fragment @Override public void onClick(View v) { - if (v == messagePane) { + if (v == messageTextView) { Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); startActivity(intent); } @@ -270,21 +264,20 @@ public class MapFragment extends Fragment @Override public void run() { if (messageId != -1) { - messageText.setText(messageId); - messagePane.setVisibility(View.VISIBLE); + messageTextView.setText(messageId); + messageTextView.setVisibility(View.VISIBLE); if (isGpsDisabled) { Toast.makeText(getActivity(), R.string.gps_not_found, Toast.LENGTH_LONG).show(); // Click to show the location source settings - messagePane.setOnClickListener(MapFragment.this); + messageTextView.setOnClickListener(MapFragment.this); } else { - messagePane.setOnClickListener(null); + messageTextView.setOnClickListener(null); } } else { - messagePane.setVisibility(View.GONE); + messageTextView.setVisibility(View.GONE); } - screen.requestLayout(); } }); } @@ -310,9 +303,7 @@ public class MapFragment extends Fragment boolean hasTrack = track != null; mapOverlay.setTrackDrawingEnabled(hasTrack); - if (hasTrack) { - busyPane.setVisibility(View.VISIBLE); - + if (hasTrack) { synchronized (this) { /* * Synchronize to prevent race condition in changing markerTrackId @@ -322,7 +313,6 @@ public class MapFragment extends Fragment updateMap(track); } mapOverlay.setShowEndMarker(!isRecording); - busyPane.setVisibility(View.GONE); } mapView.invalidate(); } diff --git a/MyTracks/src/com/google/android/apps/mytracks/fragments/StatsFragment.java b/MyTracks/src/com/google/android/apps/mytracks/fragments/StatsFragment.java index 9282a57f2..4d618af47 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/fragments/StatsFragment.java +++ b/MyTracks/src/com/google/android/apps/mytracks/fragments/StatsFragment.java @@ -16,17 +16,20 @@ package com.google.android.apps.mytracks.fragments; +import com.google.android.apps.mytracks.Constants; import com.google.android.apps.mytracks.MyTracksApplication; -import com.google.android.apps.mytracks.StatsUtilities; import com.google.android.apps.mytracks.content.Track; import com.google.android.apps.mytracks.content.TrackDataHub; import com.google.android.apps.mytracks.content.TrackDataHub.ListenerDataType; import com.google.android.apps.mytracks.content.TrackDataListener; import com.google.android.apps.mytracks.content.Waypoint; +import com.google.android.apps.mytracks.stats.TripStatistics; import com.google.android.apps.mytracks.util.PreferencesUtils; -import com.google.android.apps.mytracks.util.UnitConversions; +import com.google.android.apps.mytracks.util.StatsUtils; import com.google.android.maps.mytracks.R; +import android.content.Context; +import android.content.SharedPreferences; import android.location.Location; import android.os.Bundle; import android.support.v4.app.Fragment; @@ -34,7 +37,6 @@ import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import android.widget.ScrollView; import java.util.EnumSet; @@ -46,20 +48,26 @@ import java.util.EnumSet; */ public class StatsFragment extends Fragment implements TrackDataListener { + public static final String STATS_FRAGMENT_TAG = "statsFragment"; + private static final String TAG = StatsFragment.class.getSimpleName(); - private StatsUtilities statsUtilities; private TrackDataHub trackDataHub; private UiUpdateThread uiUpdateThread; // The start time of the current track. private long startTime = -1L; + private boolean metricUnits = true; + private boolean reportSpeed = true; + private Location lastLocation = null; + private TripStatistics lastTripStatistics = null; + // A runnable to update the total time field. private final Runnable updateTotalTime = new Runnable() { public void run() { if (isRecording()) { - statsUtilities.setTime(R.id.total_time_register, System.currentTimeMillis() - startTime); + StatsUtils.setTotalTimeValue(getActivity(), System.currentTimeMillis() - startTime); } } }; @@ -68,7 +76,6 @@ public class StatsFragment extends Fragment implements TrackDataListener { * A thread that updates the total time field every second. */ private class UiUpdateThread extends Thread { - @Override public void run() { Log.d(TAG, "UI update thread started"); @@ -85,12 +92,6 @@ public class StatsFragment extends Fragment implements TrackDataListener { } } - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - statsUtilities = new StatsUtilities(getActivity()); - } - @Override public View onCreateView( LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { @@ -100,10 +101,11 @@ public class StatsFragment extends Fragment implements TrackDataListener { @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); - ScrollView scrollView = (ScrollView) getActivity().findViewById(R.id.scrolly); - scrollView.setScrollBarStyle(ScrollView.SCROLLBARS_OUTSIDE_INSET); - updateLabels(); - setLocationUnknown(); + SharedPreferences preferences = getActivity().getSharedPreferences( + Constants.SETTINGS_NAME, Context.MODE_PRIVATE); + metricUnits = preferences.getBoolean(getString(R.string.metric_units_key), true); + reportSpeed = preferences.getBoolean(getString(R.string.report_speed_key), true); + updateUi(); } @Override @@ -128,7 +130,8 @@ public class StatsFragment extends Fragment implements TrackDataListener { getActivity().runOnUiThread(new Runnable() { @Override public void run() { - setLocationUnknown(); + lastLocation = null; + StatsUtils.setLocationValues(getActivity(), lastLocation, metricUnits, reportSpeed); } }); } @@ -140,11 +143,8 @@ public class StatsFragment extends Fragment implements TrackDataListener { getActivity().runOnUiThread(new Runnable() { @Override public void run() { - if (location != null) { - setLocation(location); - } else { - setLocationUnknown(); - } + lastLocation = location; + StatsUtils.setLocationValues(getActivity(), lastLocation, metricUnits, reportSpeed); } }); } @@ -172,16 +172,18 @@ public class StatsFragment extends Fragment implements TrackDataListener { @Override public void run() { if (track == null || track.getStatistics() == null) { - statsUtilities.setAllToUnknown(); + lastLocation = null; + lastTripStatistics = null; + updateUi(); return; } - + lastTripStatistics = track.getStatistics(); + startTime = track.getStatistics().getStartTime(); if (!isRecording()) { - statsUtilities.setTime(R.id.total_time_register, track.getStatistics().getTotalTime()); - setLocationUnknown(); + lastLocation = null; } - statsUtilities.setAllStats(track.getStatistics()); + updateUi(); } }); } @@ -227,30 +229,24 @@ public class StatsFragment extends Fragment implements TrackDataListener { } @Override - public boolean onUnitsChanged(boolean metric) { - if (statsUtilities.isMetricUnits() == metric) { - return false; - } - statsUtilities.setMetricUnits(metric); + public boolean onUnitsChanged(final boolean metric) { getActivity().runOnUiThread(new Runnable() { @Override public void run() { - updateLabels(); + metricUnits = metric; + updateUi(); } }); return true; } @Override - public boolean onReportSpeedChanged(boolean speed) { - if (statsUtilities.isReportSpeed() == speed) { - return false; - } - statsUtilities.setReportSpeed(speed); + public boolean onReportSpeedChanged(final boolean speed) { getActivity().runOnUiThread(new Runnable() { @Override public void run() { - updateLabels(); + reportSpeed = speed; + updateUi(); } }); return true; @@ -285,35 +281,10 @@ public class StatsFragment extends Fragment implements TrackDataListener { private synchronized boolean isRecording() { return trackDataHub != null && trackDataHub.isRecordingSelected(); } - - /** - * Updates the labels. - */ - private void updateLabels() { - statsUtilities.updateUnits(); - statsUtilities.setSpeedLabel(R.id.speed_label, R.string.stat_speed, R.string.stat_pace); - statsUtilities.setSpeedLabels(); - } - - /** - * Sets the current location. - * - * @param location the current location - */ - private void setLocation(Location location) { - statsUtilities.setAltitude(R.id.elevation_register, location.getAltitude()); - statsUtilities.setLatLong(R.id.latitude_register, location.getLatitude()); - statsUtilities.setLatLong(R.id.longitude_register, location.getLongitude()); - statsUtilities.setSpeed(R.id.speed_register, location.getSpeed() * UnitConversions.MS_TO_KMH); - } - - /** - * Sets the current location to unknown. - */ - private void setLocationUnknown() { - statsUtilities.setUnknown(R.id.elevation_register); - statsUtilities.setUnknown(R.id.latitude_register); - statsUtilities.setUnknown(R.id.longitude_register); - statsUtilities.setUnknown(R.id.speed_register); + + private void updateUi() { + StatsUtils.setSpeedLabels(getActivity(), reportSpeed, true); + StatsUtils.setTripStatisticsValues(getActivity(), lastTripStatistics, metricUnits, reportSpeed); + StatsUtils.setLocationValues(getActivity(), lastLocation, metricUnits, reportSpeed); } } diff --git a/MyTracks/src/com/google/android/apps/mytracks/io/maps/ChooseMapActivity.java b/MyTracks/src/com/google/android/apps/mytracks/io/maps/ChooseMapActivity.java index 9b5d5a23b..815830e81 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/io/maps/ChooseMapActivity.java +++ b/MyTracks/src/com/google/android/apps/mytracks/io/maps/ChooseMapActivity.java @@ -68,11 +68,11 @@ public class ChooseMapActivity extends Activity { } MapsMapMetadata mapData = getItem(position).getMapData(); - TextView title = (TextView) convertView.findViewById(R.id.choose_map_list_item_title); + TextView title = (TextView) convertView.findViewById(R.id.choose_map_item_title); title.setText(mapData.getTitle()); TextView description = (TextView) convertView.findViewById( - R.id.choose_map_list_item_description); + R.id.choose_map_item_description); String descriptionText = mapData.getDescription(); if (descriptionText == null || descriptionText.equals("")) { description.setVisibility(View.GONE); @@ -82,7 +82,7 @@ public class ChooseMapActivity extends Activity { } TextView searchStatus = (TextView) convertView.findViewById( - R.id.choose_map_list_item_search_status); + R.id.choose_map_item_search_status); searchStatus.setTextColor(mapData.getSearchable() ? Color.RED : Color.GREEN); searchStatus.setText(mapData.getSearchable() ? R.string.maps_list_public_label : R.string.maps_list_unlisted_label); diff --git a/MyTracks/src/com/google/android/apps/mytracks/services/TrackRecordingService.java b/MyTracks/src/com/google/android/apps/mytracks/services/TrackRecordingService.java index 6e130c8ea..ab4471f29 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/services/TrackRecordingService.java +++ b/MyTracks/src/com/google/android/apps/mytracks/services/TrackRecordingService.java @@ -941,7 +941,7 @@ public class TrackRecordingService extends Service { buildMarker(wpt, request); break; case STATISTICS: - buildStatisticsMarker(wpt); + buildStatisticsMarker(wpt, request); break; } wpt.setTrackId(recordingTrackId); @@ -987,9 +987,10 @@ public class TrackRecordingService extends Service { * Build a statistics marker. * A statistics marker holds the stats for the* last segment up to this marker. * - * @param waypoint The waypoint which will be populated with stats data. + * @param waypoint The waypoint which will be populated with stats data + * @param request The waypoint creation request */ - private void buildStatisticsMarker(Waypoint waypoint) { + private void buildStatisticsMarker(Waypoint waypoint, WaypointCreationRequest request) { DescriptionGenerator descriptionGenerator = new DescriptionGeneratorImpl(this); // Set stop and total time in the stats data @@ -1002,7 +1003,8 @@ public class TrackRecordingService extends Service { // Set the rest of the waypoint data waypoint.setType(Waypoint.TYPE_STATISTICS); - waypoint.setName(getString(R.string.marker_edit_type_statistics)); + waypoint.setName(request.getName() != null ? request.getName() + : getString(R.string.marker_edit_type_statistics)); waypoint.setStatistics(waypointStatsBuilder.getStatistics()); waypoint.setDescription(descriptionGenerator.generateWaypointDescription(waypoint)); waypoint.setIcon(getString(R.string.marker_statistics_icon_url)); diff --git a/MyTracks/src/com/google/android/apps/mytracks/util/ChartURLGenerator.java b/MyTracks/src/com/google/android/apps/mytracks/util/ChartURLGenerator.java index 7e7e893f9..87ecfc091 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/util/ChartURLGenerator.java +++ b/MyTracks/src/com/google/android/apps/mytracks/util/ChartURLGenerator.java @@ -58,7 +58,7 @@ public class ChartURLGenerator { } return getChartUrl(distances, elevations, track, - context.getString(R.string.stat_elevation), metricUnits); + context.getString(R.string.stats_elevation), metricUnits); } /** diff --git a/MyTracks/src/com/google/android/apps/mytracks/util/StatsUtils.java b/MyTracks/src/com/google/android/apps/mytracks/util/StatsUtils.java index 1a31c4583..7dcda1883 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/util/StatsUtils.java +++ b/MyTracks/src/com/google/android/apps/mytracks/util/StatsUtils.java @@ -16,9 +16,11 @@ package com.google.android.apps.mytracks.util; +import com.google.android.apps.mytracks.stats.TripStatistics; import com.google.android.maps.mytracks.R; import android.app.Activity; +import android.location.Location; import android.widget.TextView; /** @@ -30,6 +32,114 @@ public class StatsUtils { private StatsUtils() {} + /** + * Sets the speed labels. + * + * @param activity the activity + * @param reportSpeed true to report speed + * @param includeLocationSpeed true to include the current location speed + */ + public static void setSpeedLabels( + Activity activity, boolean reportSpeed, boolean includeLocationSpeed) { + StatsUtils.setSpeedLabel(activity, R.id.stats_max_speed_label, R.string.stats_max_speed, + R.string.stats_fastest_pace, reportSpeed); + StatsUtils.setSpeedLabel(activity, R.id.stats_average_speed_label, R.string.stats_average_speed, + R.string.stats_average_pace, reportSpeed); + StatsUtils.setSpeedLabel(activity, R.id.stats_average_moving_speed_label, + R.string.stats_average_moving_speed, R.string.stats_average_moving_pace, reportSpeed); + if (includeLocationSpeed) { + StatsUtils.setSpeedLabel( + activity, R.id.stats_speed_label, R.string.stats_speed, R.string.stats_pace, reportSpeed); + } + } + + /** + * Sets the trip statistics values. + * + * @param activity the activity + * @param tripStatistics the trip statistics + * @param metricUnits true to display in metric units + * @param reportSpeed true to report speed + */ + public static void setTripStatisticsValues( + Activity activity, TripStatistics tripStatistics, boolean metricUnits, boolean reportSpeed) { + double totalDistance = tripStatistics == null ? Double.NaN : tripStatistics.getTotalDistance(); + double maxSpeed = tripStatistics == null ? Double.NaN : tripStatistics.getMaxSpeed(); + long totalTime = tripStatistics == null ? -1L : tripStatistics.getTotalTime(); + double averageSpeed = tripStatistics == null ? Double.NaN : tripStatistics.getAverageSpeed(); + long movingTime = tripStatistics == null ? -1L : tripStatistics.getMovingTime(); + double averageMovingSpeed = tripStatistics == null ? Double.NaN + : tripStatistics.getAverageMovingSpeed(); + double elevationGain = tripStatistics == null ? Double.NaN + : tripStatistics.getTotalElevationGain(); + double minElevation = tripStatistics == null ? Double.NaN : tripStatistics.getMinElevation(); + double maxElevation = tripStatistics == null ? Double.NaN : tripStatistics.getMaxElevation(); + double minGrade = tripStatistics == null ? Double.NaN : tripStatistics.getMinGrade(); + double maxGrade = tripStatistics == null ? Double.NaN : tripStatistics.getMaxGrade(); + + StatsUtils.setDistanceValue( + activity, R.id.stats_total_distance_value, totalDistance, metricUnits); + StatsUtils.setSpeedValue( + activity, R.id.stats_max_speed_value, maxSpeed, metricUnits, reportSpeed); + StatsUtils.setTimeValue(activity, R.id.stats_total_time_value, totalTime); + StatsUtils.setSpeedValue( + activity, R.id.stats_average_speed_value, averageSpeed, metricUnits, reportSpeed); + StatsUtils.setTimeValue(activity, R.id.stats_moving_time_value, movingTime); + StatsUtils.setSpeedValue(activity, R.id.stats_average_moving_speed_value, averageMovingSpeed, + metricUnits, reportSpeed); + StatsUtils.setAltitudeValue( + activity, R.id.stats_elevation_gain_value, elevationGain, metricUnits); + StatsUtils.setAltitudeValue( + activity, R.id.stats_min_elevation_value, minElevation, metricUnits); + StatsUtils.setAltitudeValue( + activity, R.id.stats_max_elevation_value, maxElevation, metricUnits); + StatsUtils.setGradeValue(activity, R.id.stats_min_grade_value, minGrade); + StatsUtils.setGradeValue(activity, R.id.stats_max_grade_value, maxGrade); + } + + /** + * Sets the location values. + * + * @param activity the activity + * @param location the location + * @param metricUnits true to display in metric units + * @param reportSpeed true to report speed + */ + public static void setLocationValues( + Activity activity, Location location, boolean metricUnits, boolean reportSpeed) { + double speed = location == null ? Double.NaN : location.getSpeed(); + double altitude = location == null ? Double.NaN : location.getAltitude(); + double latitude = location == null ? Double.NaN : location.getLatitude(); + double longitude = location == null ? Double.NaN : location.getLongitude(); + + StatsUtils.setSpeedValue(activity, R.id.stats_speed_value, speed, metricUnits, reportSpeed); + StatsUtils.setAltitudeValue(activity, R.id.stats_elevation_value, altitude, metricUnits); + StatsUtils.setCoordinateValue(activity, R.id.stats_latitude_value, latitude); + StatsUtils.setCoordinateValue(activity, R.id.stats_longitude_value, longitude); + } + + /** + * Sets the location elevation value. + * + * @param activity the activity + * @param elevation the elevation in meters + * @param metricUnits true to display in metric units + */ + public static void setLocationElevationValue( + Activity activity, double elevation, boolean metricUnits) { + StatsUtils.setAltitudeValue(activity, R.id.stats_elevation_value, elevation, metricUnits); + } + + /** + * Sets the total time value. + * + * @param activity the activity + * @param totalTime the total time + */ + public static void setTotalTimeValue(Activity activity, long totalTime) { + StatsUtils.setTimeValue(activity, R.id.stats_total_time_value, totalTime); + } + /** * Sets a speed label. * @@ -39,7 +149,7 @@ public class StatsUtils { * @param paceId the pace string id * @param reportSpeed true to report speed */ - public static void setSpeedLabel( + private static void setSpeedLabel( Activity activity, int id, int speedId, int paceId, boolean reportSpeed) { TextView textView = (TextView) activity.findViewById(id); textView.setText(reportSpeed ? speedId : paceId); @@ -51,30 +161,34 @@ public class StatsUtils { * @param activity the activity * @param id the speed value resource id * @param speed the speed in meters per second - * @param reportSpeed true to report speed * @param metricUnits true to display in metric units + * @param reportSpeed true to report speed */ - public static void setSpeedValue( - Activity activity, int id, double speed, boolean reportSpeed, boolean metricUnits) { + private static void setSpeedValue( + Activity activity, int id, double speed, boolean metricUnits, boolean reportSpeed) { TextView textView = (TextView) activity.findViewById(id); - speed *= UnitConversions.MS_TO_KMH; String value; - if (metricUnits) { - if (reportSpeed) { - value = activity.getString(R.string.value_float_kilometer_hour, speed); - } else { - // convert from hours to minutes - double pace = speed == 0 ? 0.0 : 60.0 / speed; - value = activity.getString(R.string.value_float_minute_kilometer, pace); - } + if (Double.isNaN(speed) || Double.isInfinite(speed)) { + value = activity.getString(R.string.value_unknown); } else { - speed *= UnitConversions.KM_TO_MI; - if (reportSpeed) { - value = activity.getString(R.string.value_float_mile_hour, speed); + speed *= UnitConversions.MS_TO_KMH; + if (metricUnits) { + if (reportSpeed) { + value = activity.getString(R.string.value_float_kilometer_hour, speed); + } else { + // convert from hours to minutes + double pace = speed == 0 ? 0.0 : 60.0 / speed; + value = activity.getString(R.string.value_float_minute_kilometer, pace); + } } else { - // convert from hours to minutes - double pace = speed == 0 ? 0.0 : 60.0 / speed; - value = activity.getString(R.string.value_float_minute_mile, pace); + speed *= UnitConversions.KM_TO_MI; + if (reportSpeed) { + value = activity.getString(R.string.value_float_mile_hour, speed); + } else { + // convert from hours to minutes + double pace = speed == 0 ? 0.0 : 60.0 / speed; + value = activity.getString(R.string.value_float_minute_mile, pace); + } } } textView.setText(value); @@ -88,16 +202,20 @@ public class StatsUtils { * @param distance the distance in meters * @param metricUnits true to display in metric units */ - public static void setDistanceValue( + private static void setDistanceValue( Activity activity, int id, double distance, boolean metricUnits) { TextView textView = (TextView) activity.findViewById(id); - distance *= UnitConversions.M_TO_KM; String value; - if (metricUnits) { - value = activity.getString(R.string.value_float_kilometer, distance); + if (Double.isNaN(distance) || Double.isInfinite(distance)) { + value = activity.getString(R.string.value_unknown); } else { - distance *= UnitConversions.KM_TO_MI; - value = activity.getString(R.string.value_float_mile, distance); + distance *= UnitConversions.M_TO_KM; + if (metricUnits) { + value = activity.getString(R.string.value_float_kilometer, distance); + } else { + distance *= UnitConversions.KM_TO_MI; + value = activity.getString(R.string.value_float_mile, distance); + } } textView.setText(value); } @@ -109,9 +227,11 @@ public class StatsUtils { * @param id the time value resource id * @param time the time */ - public static void setTimeValue(Activity activity, int id, long time) { + private static void setTimeValue(Activity activity, int id, long time) { TextView textView = (TextView) activity.findViewById(id); - textView.setText(StringUtils.formatElapsedTime(time)); + String value = time == -1L ? activity.getString(R.string.value_unknown) + : StringUtils.formatElapsedTime(time); + textView.setText(value); } /** @@ -122,7 +242,7 @@ public class StatsUtils { * @param altitude the altitude in meters * @param metricUnits true to display in metric units */ - public static void setAltitudeValue( + private static void setAltitudeValue( Activity activity, int id, double altitude, boolean metricUnits) { TextView textView = (TextView) activity.findViewById(id); String value; @@ -146,7 +266,7 @@ public class StatsUtils { * @param id the grade value resource id * @param grade the grade in fraction between 0 and 1 */ - public static void setGradeValue(Activity activity, int id, double grade) { + private static void setGradeValue(Activity activity, int id, double grade) { TextView textView = (TextView) activity.findViewById(id); String value; if (Double.isNaN(grade) || Double.isInfinite(grade)) { @@ -156,4 +276,23 @@ public class StatsUtils { } textView.setText(value); } + + /** + * Sets a coordinate value. + * + * @param activity the activity + * @param id the coordinate value resource id + * @param coordinate the coordinate in degrees + */ + private static void setCoordinateValue(Activity activity, int id, double coordinate) { + TextView textView = (TextView) activity.findViewById(id); + String value; + if (Double.isNaN(coordinate) || Double.isInfinite(coordinate)) { + value = activity.getString(R.string.value_unknown); + } else { + value = activity.getString( + R.string.value_coordinate_degree, Location.convert(coordinate, Location.FORMAT_DEGREES)); + } + textView.setText(value); + } } diff --git a/MyTracksTest/src/com/google/android/apps/mytracks/ChartValueSeriesTest.java b/MyTracksTest/src/com/google/android/apps/mytracks/ChartValueSeriesTest.java index 0f412549d..cbc5b3c71 100644 --- a/MyTracksTest/src/com/google/android/apps/mytracks/ChartValueSeriesTest.java +++ b/MyTracksTest/src/com/google/android/apps/mytracks/ChartValueSeriesTest.java @@ -33,7 +33,7 @@ public class ChartValueSeriesTest extends AndroidTestCase { R.color.elevation_fill, R.color.elevation_border, new ZoomSettings(5, new int[] {100}), - R.string.stat_elevation); + R.string.stats_elevation); } public void testInitialConditions() { @@ -43,7 +43,7 @@ public class ChartValueSeriesTest extends AndroidTestCase { assertEquals(0, series.getMax()); assertEquals(0.0, series.getSpread()); assertEquals(Style.STROKE, series.getPaint().getStyle()); - assertEquals(getContext().getString(R.string.stat_elevation), + assertEquals(getContext().getString(R.string.stats_elevation), series.getTitle()); assertTrue(series.isEnabled()); }