From 66ba54ffa06fc9f7fc2bc0361d195082b6643e1a Mon Sep 17 00:00:00 2001 From: Jimmy Shih Date: Tue, 1 May 2012 18:05:53 -0700 Subject: [PATCH] merge heads --- MyTracks/AndroidManifest.xml | 63 +-- .../drawable-hdpi/ic_menu_chartsettings.png | Bin 3115 -> 0 bytes .../drawable-hdpi/ic_menu_sensorstatus.png | Bin 2941 -> 0 bytes .../res/drawable-hdpi/ic_menu_statistics.png | Bin 1574 -> 0 bytes .../res/drawable-hdpi/ic_menu_waypoints.png | Bin 3491 -> 0 bytes .../menu_aggregated_statistics.png | Bin 0 -> 1509 bytes .../res/drawable-hdpi/menu_chart_settings.png | Bin 0 -> 1426 bytes .../res/drawable-hdpi/menu_delete_all.png | Bin 0 -> 1285 bytes .../res/drawable-hdpi/menu_export_all.png | Bin 0 -> 1810 bytes .../res/drawable-hdpi/menu_import_all.png | Bin 0 -> 1854 bytes MyTracks/res/drawable-hdpi/menu_markers.png | Bin 0 -> 1386 bytes .../res/drawable-hdpi/menu_my_location.png | Bin 0 -> 1784 bytes .../res/drawable-hdpi/menu_satellite_mode.png | Bin 0 -> 2077 bytes MyTracks/res/drawable-hdpi/menu_save.png | Bin 0 -> 1429 bytes .../res/drawable-hdpi/menu_send_google.png | Bin 0 -> 1405 bytes .../res/drawable-hdpi/menu_sensor_state.png | Bin 0 -> 1150 bytes MyTracks/res/drawable-hdpi/tab_chart.png | Bin 0 -> 1426 bytes MyTracks/res/drawable-hdpi/tab_map.png | Bin 0 -> 2077 bytes MyTracks/res/drawable-hdpi/tab_stats.png | Bin 0 -> 1262 bytes MyTracks/res/drawable-ldpi/failure.png | Bin 1259 -> 0 bytes .../drawable-ldpi/ic_menu_chartsettings.png | Bin 1528 -> 0 bytes .../drawable-ldpi/ic_menu_sensorstatus.png | Bin 1479 -> 0 bytes .../res/drawable-ldpi/ic_menu_statistics.png | Bin 1153 -> 0 bytes .../res/drawable-ldpi/ic_menu_waypoints.png | Bin 1524 -> 0 bytes MyTracks/res/drawable-ldpi/success.png | Bin 1216 -> 0 bytes .../drawable-mdpi/ic_menu_chartsettings.png | Bin 1886 -> 0 bytes .../drawable-mdpi/ic_menu_sensorstatus.png | Bin 1889 -> 0 bytes .../res/drawable-mdpi/ic_menu_statistics.png | Bin 1178 -> 0 bytes .../res/drawable-mdpi/ic_menu_waypoints.png | Bin 2009 -> 0 bytes .../menu_aggregated_statistics.png | Bin 0 -> 1362 bytes .../res/drawable-mdpi/menu_chart_settings.png | Bin 0 -> 1240 bytes .../res/drawable-mdpi/menu_delete_all.png | Bin 0 -> 1138 bytes MyTracks/res/drawable-mdpi/menu_elevation.png | Bin 913 -> 0 bytes .../res/drawable-mdpi/menu_export_all.png | Bin 0 -> 1479 bytes .../res/drawable-mdpi/menu_import_all.png | Bin 0 -> 1537 bytes MyTracks/res/drawable-mdpi/menu_markers.png | Bin 0 -> 1253 bytes .../res/drawable-mdpi/menu_my_location.png | Bin 0 -> 1409 bytes .../res/drawable-mdpi/menu_satellite_mode.png | Bin 0 -> 1648 bytes MyTracks/res/drawable-mdpi/menu_save.png | Bin 0 -> 1392 bytes .../res/drawable-mdpi/menu_send_google.png | Bin 0 -> 1259 bytes .../res/drawable-mdpi/menu_sensor_state.png | Bin 0 -> 1213 bytes MyTracks/res/drawable-mdpi/tab_chart.png | Bin 0 -> 1240 bytes MyTracks/res/drawable-mdpi/tab_map.png | Bin 0 -> 1648 bytes MyTracks/res/drawable-mdpi/tab_stats.png | Bin 0 -> 1155 bytes .../menu_aggregated_statistics.png | Bin 0 -> 1589 bytes .../drawable-xhdpi/menu_chart_settings.png | Bin 0 -> 1544 bytes .../res/drawable-xhdpi/menu_delete_all.png | Bin 0 -> 1348 bytes .../res/drawable-xhdpi/menu_export_all.png | Bin 0 -> 2065 bytes .../res/drawable-xhdpi/menu_import_all.png | Bin 0 -> 2250 bytes MyTracks/res/drawable-xhdpi/menu_markers.png | Bin 0 -> 1446 bytes .../res/drawable-xhdpi/menu_my_location.png | Bin 0 -> 2204 bytes .../drawable-xhdpi/menu_satellite_mode.png | Bin 0 -> 2510 bytes MyTracks/res/drawable-xhdpi/menu_save.png | Bin 0 -> 1610 bytes .../res/drawable-xhdpi/menu_send_google.png | Bin 0 -> 1593 bytes .../res/drawable-xhdpi/menu_sensor_state.png | Bin 0 -> 1360 bytes MyTracks/res/drawable-xhdpi/tab_chart.png | Bin 0 -> 1544 bytes MyTracks/res/drawable-xhdpi/tab_map.png | Bin 0 -> 2510 bytes MyTracks/res/drawable-xhdpi/tab_stats.png | Bin 0 -> 1317 bytes MyTracks/res/layout/about.xml | 57 +-- .../aggregated_stats.xml} | 16 +- MyTracks/res/layout/chart.xml | 35 ++ MyTracks/res/layout/chart_settings.xml | 73 +--- MyTracks/res/layout/choose_map.xml | 29 +- MyTracks/res/layout/choose_map_item.xml | 38 +- MyTracks/res/layout/help.xml | 7 +- MyTracks/res/layout/list_item.xml | 17 +- MyTracks/res/layout/map.xml | 40 ++ MyTracks/res/layout/marker_detail.xml | 125 +----- MyTracks/res/layout/marker_edit.xml | 17 +- MyTracks/res/layout/marker_list.xml | 4 +- MyTracks/res/layout/mytracks_charts.xml | 57 --- MyTracks/res/layout/mytracks_layout.xml | 62 --- MyTracks/res/layout/search_list.xml | 4 +- MyTracks/res/layout/sensor_state.xml | 114 +++--- MyTracks/res/layout/stats.xml | 383 ++---------------- MyTracks/res/layout/stats_core.xml | 132 ++++++ MyTracks/res/layout/track_edit.xml | 11 +- MyTracks/res/layout/track_list.xml | 6 +- MyTracks/res/layout/track_widget.xml | 126 +++--- MyTracks/res/layout/upload_result.xml | 42 +- .../res/layout/upload_service_chooser.xml | 46 +-- MyTracks/res/layout/welcome.xml | 5 +- MyTracks/res/menu/list_context_menu.xml | 6 +- MyTracks/res/menu/marker_detail.xml | 4 +- MyTracks/res/menu/marker_list.xml | 2 +- MyTracks/res/menu/track_detail.xml | 21 +- MyTracks/res/menu/track_list.xml | 8 +- MyTracks/res/values-v14/styles.xml | 33 ++ MyTracks/res/values/colors.xml | 6 +- MyTracks/res/values/strings.xml | 102 ++--- MyTracks/res/values/styles.xml | 268 +++++------- .../mytracks/AbstractMyTracksActivity.java | 55 +++ .../mytracks/AggregatedStatsActivity.java | 127 ++---- .../android/apps/mytracks/ChartView.java | 8 +- .../android/apps/mytracks/Constants.java | 8 - .../android/apps/mytracks/HelpActivity.java | 22 +- .../apps/mytracks/MarkerDetailActivity.java | 61 +-- .../apps/mytracks/MarkerEditActivity.java | 19 +- .../apps/mytracks/MarkerListActivity.java | 9 +- .../apps/mytracks/SearchListActivity.java | 9 +- .../apps/mytracks/SensorStateActivity.java | 37 +- .../android/apps/mytracks/StatsUtilities.java | 270 ------------ .../apps/mytracks/TrackDetailActivity.java | 58 ++- .../apps/mytracks/TrackEditActivity.java | 47 +-- .../mytracks/fragments/ChartFragment.java | 21 +- .../ChartSettingsDialogFragment.java | 6 +- .../apps/mytracks/fragments/MapFragment.java | 34 +- .../mytracks/fragments/StatsFragment.java | 109 ++--- .../mytracks/io/maps/ChooseMapActivity.java | 6 +- .../services/TrackRecordingService.java | 10 +- .../apps/mytracks/util/ChartURLGenerator.java | 2 +- .../apps/mytracks/util/StatsUtils.java | 197 +++++++-- .../apps/mytracks/ChartValueSeriesTest.java | 4 +- 113 files changed, 1122 insertions(+), 1956 deletions(-) delete mode 100644 MyTracks/res/drawable-hdpi/ic_menu_chartsettings.png delete mode 100644 MyTracks/res/drawable-hdpi/ic_menu_sensorstatus.png delete mode 100644 MyTracks/res/drawable-hdpi/ic_menu_statistics.png delete mode 100644 MyTracks/res/drawable-hdpi/ic_menu_waypoints.png create mode 100644 MyTracks/res/drawable-hdpi/menu_aggregated_statistics.png create mode 100644 MyTracks/res/drawable-hdpi/menu_chart_settings.png create mode 100644 MyTracks/res/drawable-hdpi/menu_delete_all.png create mode 100644 MyTracks/res/drawable-hdpi/menu_export_all.png create mode 100644 MyTracks/res/drawable-hdpi/menu_import_all.png create mode 100644 MyTracks/res/drawable-hdpi/menu_markers.png create mode 100644 MyTracks/res/drawable-hdpi/menu_my_location.png create mode 100644 MyTracks/res/drawable-hdpi/menu_satellite_mode.png create mode 100644 MyTracks/res/drawable-hdpi/menu_save.png create mode 100644 MyTracks/res/drawable-hdpi/menu_send_google.png create mode 100644 MyTracks/res/drawable-hdpi/menu_sensor_state.png create mode 100644 MyTracks/res/drawable-hdpi/tab_chart.png create mode 100644 MyTracks/res/drawable-hdpi/tab_map.png create mode 100644 MyTracks/res/drawable-hdpi/tab_stats.png delete mode 100644 MyTracks/res/drawable-ldpi/failure.png delete mode 100644 MyTracks/res/drawable-ldpi/ic_menu_chartsettings.png delete mode 100644 MyTracks/res/drawable-ldpi/ic_menu_sensorstatus.png delete mode 100644 MyTracks/res/drawable-ldpi/ic_menu_statistics.png delete mode 100644 MyTracks/res/drawable-ldpi/ic_menu_waypoints.png delete mode 100644 MyTracks/res/drawable-ldpi/success.png delete mode 100644 MyTracks/res/drawable-mdpi/ic_menu_chartsettings.png delete mode 100644 MyTracks/res/drawable-mdpi/ic_menu_sensorstatus.png delete mode 100644 MyTracks/res/drawable-mdpi/ic_menu_statistics.png delete mode 100644 MyTracks/res/drawable-mdpi/ic_menu_waypoints.png create mode 100644 MyTracks/res/drawable-mdpi/menu_aggregated_statistics.png create mode 100644 MyTracks/res/drawable-mdpi/menu_chart_settings.png create mode 100644 MyTracks/res/drawable-mdpi/menu_delete_all.png delete mode 100644 MyTracks/res/drawable-mdpi/menu_elevation.png create mode 100644 MyTracks/res/drawable-mdpi/menu_export_all.png create mode 100644 MyTracks/res/drawable-mdpi/menu_import_all.png create mode 100644 MyTracks/res/drawable-mdpi/menu_markers.png create mode 100644 MyTracks/res/drawable-mdpi/menu_my_location.png create mode 100644 MyTracks/res/drawable-mdpi/menu_satellite_mode.png create mode 100644 MyTracks/res/drawable-mdpi/menu_save.png create mode 100644 MyTracks/res/drawable-mdpi/menu_send_google.png create mode 100644 MyTracks/res/drawable-mdpi/menu_sensor_state.png create mode 100644 MyTracks/res/drawable-mdpi/tab_chart.png create mode 100644 MyTracks/res/drawable-mdpi/tab_map.png create mode 100644 MyTracks/res/drawable-mdpi/tab_stats.png create mode 100644 MyTracks/res/drawable-xhdpi/menu_aggregated_statistics.png create mode 100644 MyTracks/res/drawable-xhdpi/menu_chart_settings.png create mode 100644 MyTracks/res/drawable-xhdpi/menu_delete_all.png create mode 100644 MyTracks/res/drawable-xhdpi/menu_export_all.png create mode 100644 MyTracks/res/drawable-xhdpi/menu_import_all.png create mode 100644 MyTracks/res/drawable-xhdpi/menu_markers.png create mode 100644 MyTracks/res/drawable-xhdpi/menu_my_location.png create mode 100644 MyTracks/res/drawable-xhdpi/menu_satellite_mode.png create mode 100644 MyTracks/res/drawable-xhdpi/menu_save.png create mode 100644 MyTracks/res/drawable-xhdpi/menu_send_google.png create mode 100644 MyTracks/res/drawable-xhdpi/menu_sensor_state.png create mode 100644 MyTracks/res/drawable-xhdpi/tab_chart.png create mode 100644 MyTracks/res/drawable-xhdpi/tab_map.png create mode 100644 MyTracks/res/drawable-xhdpi/tab_stats.png rename MyTracks/res/{drawable/list_bar.xml => layout/aggregated_stats.xml} (59%) create mode 100644 MyTracks/res/layout/chart.xml create mode 100644 MyTracks/res/layout/map.xml delete mode 100644 MyTracks/res/layout/mytracks_charts.xml delete mode 100644 MyTracks/res/layout/mytracks_layout.xml create mode 100644 MyTracks/res/layout/stats_core.xml create mode 100644 MyTracks/res/values-v14/styles.xml create mode 100644 MyTracks/src/com/google/android/apps/mytracks/AbstractMyTracksActivity.java delete mode 100644 MyTracks/src/com/google/android/apps/mytracks/StatsUtilities.java 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 2364bd9564b5eaa78496e3cdd719d008451aa7a2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3115 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 FV1m?>#B~4w 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 b13f28cd29efdcc651d924f44692a4efb245d0d4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2941 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 Y0Mi!xBDUzsLI3~&07*qoM6N<$f`_>4^8f$< 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 c2c792f1130cbd4dc256c38ede81901b1be992ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3491 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 RhzkG!002ovPDHLkV1ngApJo66 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 0000000000000000000000000000000000000000..2bc6f5aca57bb2e6f18e205129133f0c8bbb1829 GIT binary patch literal 1509 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTC$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%qp275hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|8hm3bwJ6}oxF$}kgLQj3#|G7CyF^YauyCMG83 zmzLNn0bL65LT&-v*t}wBFaZNhzap_f-%!s00+w{G(#^lGX)r!Ca!LVhK8n2h6aX)u7;K-hL)}-PR@>Q zriSJwPKGeOF8Rr&xv6<2Fuf@Vy+%0of)Yb+0nlcb)S}F?)D*X({9FaFr>!z^y2Zc^ zr+HAlDY)HYfK#tN&@uX;s6~oum=G}ifSB-v3*^9)erg^ty%zx!_Oxz=GzJEya8DP< zkcwMxX8L zMn?w$0hTQ(N6l)F3svyS>73V^XU`B_$vHuzzcDdjqlGwgr0}kTuJZ&Zc+Y7T4%lk( zndwWw3FmoCPfm;LynZXThkdor;+SlQH+qL>R^NBEIdx~9g^=dFI+oiH^zUoWXF4YN zNZY+sNi&S?x5$INyd-I6=uuae%I+-ti{ ztiP~*x!ra}DK_tbx!b~S`?*{*7~ju$y-t2ks>ffJ%aYf+uP}w&3Uli}^}b3eGiq7U z!_Fk9#-qplF1`75sk5%xZdq*5kw;TjN=i2EU3+;`PA$9q0jtZ-mR_d04@#%5SbBEx z;nVeO#Wl6hq8q%pO4)up&pF@ti>XIyPk+ybZ2s6aPdQ$&RnD@?|16{sr`PDafxU{i zKmOBK@ee0o7+iYHe!!^P`kXaW(M{#Dxo%~CKD!?s4LxMLYjeqlMX9$=gv?_PcH^F= z|Bvh10hWj*&$oW`iT08xSpHzb#5F&98e(3kR;1QkJIyU(aiZZ z`|1DQEM9L60=@dfde==!YkvDt*J0j_vYUx9%Udj--#D5Q_VE51a14VYTK)EB24)7o WN0aaEba3Yc6}+CVelF{r5}E)u%rz(g literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..0f650ee25d87d15a658f8d2ae2ca6b05cfe1d9e0 GIT binary patch literal 1426 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTC$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%qp275hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|8hm3bwJ6}oxF$}kgLQj3#|G7CyF^YauyCMG83 zmzLNn0bL65LT&-v*t}wBFaZNhzap_f-%!s00+w{G(#^lGsViy$i>9e(!jvf$-vFf(ACh=#L&{!#L3yw z&D7A`#K{n**Cju>G&eP`1g19yq1O*d1*==YdW~?pMIY!GeNfaQMKw$an0`P^c)|s8;7LC<518JIfC)Rw!CjAm zfr-V_#WAGf)|;8O-iHH3+Jtjg3;l6$bvYU;!otdKU!cR`$LGiO=z*FZ*CT~pRy#U6 zN-xBIn9mXWm+{r3N8#CPmwmMT(BAsbQPXWTk+|?*$kGQY(LW*bu89}HdxGOTd%g90Kgs2Q(!Z-=}_iWA?i(H0=??p1-@(d31_T&tc?W#WKYr=9gsY z@Pv_j4vxftm7`?6_#-P#kCN})MTqB@7W#AddxIkCc8bko%5o=4bbd^Vo5 zXp7M44}U(q4i?!iFUuiine!^uB^IApD2?zGHs5&Tp=D6l0 z=d?}m(9Q`i%g;LhUEi+yQ*U#e6u>y`WBC!=1e0eKce#`lUPlE= vCr&%v{%PeU`CVHXbRD=aFg4xiXJBSH5SKPh)N#oxP$}u@>gTe~DWM4fjC}@i literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..094eea589246b46e26d3cf02285f26c1abb33700 GIT binary patch literal 1285 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 S+PXgDUn)c#CORQV&i@Df@x@jE literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..1dd8bc75d025f2b940ec3a068f19634fb7fe1f00 GIT binary patch literal 1854 zcmaJ?X;c$e6b_&eN!bKBvgsH-wxT36F(D=31`}wZ5Jbfd z+>J_&DBwcTDAj6v&|*bfaKnv)M^oayAy7e6gia8&KT7AEnfKm(_xtXB_kQn8No-7n zi?gpY4u^B$M{?t_5wyK{N9?=U{@rS9@IiS(GyzFRwPH1l<4BP-7~m_!%iwreEX`T| z8_dGt9Hz+l}i{>;=B-mrDI|Q3K$gwIz^UJ!_={fL%d9EZZngKz>o_n zXA?gpB^1O0VTc+AXe2O50tQ1sFqH&RK?apE3!s1yNQNk6kRAkqOd6dDLcs7t#GCAX;_;4(2#U^H;sESD@YqeUEb~Xu7FC#+?27?Sz$P`Kt<`JaHQKDj9kWw>sgn%k;w$6snK3O3iSYu!50wVig%8fwm)!I0^*+@2XII^wyy9 z@TYwLlUS3Oqk_rtum;IiOR&bJPql?oF~iib7)8{H2$D5Y#n=o4MKl?R3J6P}ksv@I zmdKPg%Md~!VDgn3RIHT1d@h@aagby(DHEjgxLg{IPMZ&b5X6HRREWW&&JW{+(;zx^ zJ~V>mB9d$ctVBn!(ofhqqhf7hP^hrTTv#nz0ZYTxhyoZoG*dQuF0@hkhOyGoa|s?5 zOU9BR+gkgtR*#r4{n(}-g^MjdN*`8YdRJq@e&r=f!tTp4K9`fIYkRSCZiW|U;>AwG zgG)^j*Jis-m{$DN9@&Jse!R$|YZ|HEfgYc6OgD*ZCh7riPS6Xk*O=X{hZOE{?s3s+ z9pf^oZb(lnd(dI9P`s0^?N#!`PWg9DJ=TGqw~u!7w>Lffb#TvSQ-Lsa7U1npc)Q!) zRlnEFa-XqP`o#2i+V(^-{3Cz`jOivn+H#sQ_2<`D%j9h;0L&^DDoIMTG_Q< zMDTfdY8QTvy|U0X);`K;o?20olYi(OWxD0m@%Q5g?~hrXIYs0gt*`68JdH>o71cW{ z-k73qU)0^IoqQKrM9?{2DcE7W4s`gsoW|#Jc27^LqV{kN1d*FlD7}7DUb*8{`P1U= z7so;^@L@|NZFy*Y%O&3V?p&@%MS|0VbBBL%Y!Ava~B^)3{b#t=_X{W}Hj%5zs-tYG6x0`^w2X z?Gv|}yviO|1vr%(i<^iSE6puNg>llX6RGU8mBQfjo3z68LciAi$>r;qzJivr4KI$Z zi#o7nRdA8SOlU$J`<`^p)BC*U@4Lk6TZ*rK{v_$!0kbaP2e084euh<^K z_HI9Vg~)fHh6T-@@Fe{f^R}yD9FYenrX$bnKe-OI6w6sni|b}t-mUCzsH*lDa8;kT zx~zA9*%Zk P+aHb3i{aMJ7wP{2(RSgO literal 0 HcmV?d00001 diff --git a/MyTracks/res/drawable-hdpi/menu_markers.png b/MyTracks/res/drawable-hdpi/menu_markers.png new file mode 100644 index 0000000000000000000000000000000000000000..e45ea1fd95e1358024f67772968143164462c87c GIT binary patch literal 1386 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTC$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%qp275hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|8hm3bwJ6}oxF$}kgLQj3#|G7CyF^YauyCMG83 zmzLNn0bL65LT&-v*t}wBFaZNhzap_f-%!s00+w{G(#^lGsVi)(#YA^#MRZ*$-vFf(ACh=#L&{!#L3yw z&D7A`#K{n**Cju>G&eP`1g19yq1O$kUQlAlEdbi=l3J8mmYU*Ll%J~r_Ow+dZnrq& zG!Lpb1-DyVaO%|uIz}H9wMbD769T3m5EGtofgE_!Pt60S_ab1zu6S6tl7WHoj;D)b zNX4x;GxvKPaS%ARxx89VJxP&6Eb4~Fin&Y8%J#Li7H#ddYv@nVOj`WNxMS}RK6Ng! zuxbAslP7iGKOl1=G4Wd(+o89I)_a$IzkSAhre{p#G|##2$}4|%FfD4(Sn%v{_>MA3 z9Y*#oMeh^dRbQAawt;ik9*=lKC65C$+Zc9jOIA6M-6G%{qrt6Fuc-H6eZ|y!dscO} zo8K1``yi`yh`p)T0YddvTarCi6fsMI2}Ba zIoEei-2ZtVb?ppa%XVqxeG!;&4Qwk$7adUDtz z^=~%miGogBUPcyZylLdu7Phuq8Q%JDN#IrHsb+~^z(G}b6Mw<&;$U$7x5hc literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..d7fae7e988bbaa7f6d6f51e27738e00f7818b1fa GIT binary patch literal 1784 zcmaJ?Yfuwc6b?j!Xrd^Hh$uV3qKHX$dBqKcM-oufPzWg~Y9%BK1la7dS;#}BfLaHn zRTKe>wkirLD$Y2HE%5;kYDE~pS3yS+5Mg`)RVrhVZcwy8N_S@W-h1YJ-}%nt&gMph zFJnz{nnI(|SYgX0GHM0Q?_>t`jjd68b3?brQ0ZND>$DcsiYqtMlSwL?RD@VVDPc@;p5`lm|y^(2xo}N27HeXOJLT zC85SiHKqZ~jEZ@-zI1l22=9I=ArPBX*MbXdRT2h95 z(fgmoTDbv7crrwbr4vf3aS5*GP`E%$APN#AJZ!aHtQ&_ZC6p zSP7;~M-dG+ZNe+_)%k}Lq_BEtL1>0Z4+Wno{ z4@U1eL`J&QTgOfce(rK`){0HQxsXE^vz_>P>yv$RUWT{q-MN=*FP9vxjOCxs&)IoR zv?Sz(%>7 zR)5W+8XIS87@u>?fLax8DeC|y8`G>lQj3)12up z!Hi7=0sbOBw6%Xg2r$mKj$XZ@+B`2t#W2yu9l7!i(e#Y$+i`xZeU^LTM8p9`Gb7d@ zu&LjW?a^U?SxaqZ#?6_P$qen~me(&nWl>X`>GX!Rjvj-i0L(Mlpude<5QCYO@WY43 z7kdunFF=x?$KTJIWIdmrR_e(dnpbvGa-7*qE8BnZlI2SgAQD-%zm2@N2ubNHtFab! zIP}u0YvCQfb=A|e=f!<>d9wwtmi}tiIcAP4VAUC`*j`@0e%-4X&8o=9Q)O|^M{4Kp z?y0taaBSpohdZL{>pim3?z;Xb|IRe`;`zI}her=oG`qwPt}Q{0g_k;sjmz7hYEkap zg9q}ad!#=P3f$Z1u&V$m%^WId0Fi3#lIyHLZp_WtedB0pdKO^?=~Mx`xQ}7h0-YN@xoW*XoejJ{|VG$kL9kxU+AN zx8I|xcPH(V`HLBjt&ej5l%G&IvcpXl>*<#3wmDmqUb={tKb|gnc43Vlm!v-|8x&o! zz!{RljQDHiwNo0eD%;uL=HacUwW(Vwv4$-7`qz(g9-EH+-5OxK!bB_esq3hj|xe%#kn|HMPQy{6O_i+#18y9^iY!ZsiO`J1iTDTb!1!)a9>Pu3i5z8Zb; z4cDo2Ahuxo+Nna$6dhb^`^3$$vb&;w+fA?Xg7^EQP4-o{S@{cCzwLSU!KFWP;7qCA y({c+pr7@6S<#$#-QgJCc=x){t3xqQ|$&t3>*3c2#xpyMX|Dv#vaLH*=T+Tl*{jMtj literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..e5907072f04b90d4119892dd0b37ec3a416e2beb GIT binary patch literal 2077 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 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..a1d27cec9b361d420a038617141b690b67cceb30 GIT binary patch literal 1405 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTC$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%qp275hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|8hm3bwJ6}oxF$}kgLQj3#|G7CyF^YauyCMG83 zmzLNn0bL65LT&-v*t}wBFaZNhzap_f-%!s00+w{G(#^lGsVi))Wpcm$=Slx$-vFf(ACh=#L&{!#L3yw z&D7A`#K{n**Cju>G&eP`1g19yq1O_pUQlAlEdbi=l3J8mmYU*Ll%J~r_Ow+dZnv1> zG!Lpb1-Dzwaq86vIz}H9wMbD769T3m5EGtofgE_!Pt60S_ab1z<}b*a#lXP$-qXb~ zq~g|_8TLBPjxxvNqZfq;*RypVZ0M*LOgiACB*Bx`?W)r2dq#}eOh~x%Xo6sl+r%3x zVnRYXVmv}lE}5&(f1i{;dD%p}+V}UerT2T=Wfr~Neee0Z^8LH3?Jk@2Ch65JKGDt5 z(EvjS>cuoJUh(73VEy`l^-hDgfObiv!3>tiZ}w#AbIv=+d4sV$kL!ob9rjrVxL&Zu zE6n>A%fNC_IfCVQt6Bi}HV5g7^Pj9$1zC+B?3o}|$Wjtf5;xUffa!B)>C**`#t}37 zB?A`k=U?UUNdN!A^PvIkZVsle<1LMMKRBb^n7HBCx#yoYM2V-yXnWetUKO0Ujniz; z2`5Lp=_fu~UVYgg|LRdrexK6qytRy?R>=$QyFKUazUgH!`D{~~d0GOOPw=5L9y51! zWo>S&KDEoQkz=!m*7e;#l|0|x*&8E$-%6}dJ=rM1IH$-@>&*{V3#RI@&AFz`i*5Aw zRF;@|r!HeO;HWy_w9RN3%^gKb1^m+_y%hBf_Pe)8GO}BpbE>_=f6G!UuBC6+Mcu~e*mld($FCj* z-gy3~ZP~3lrsX{h*Yi?7g*mafI3UoRsq&0$3_E9*YklJgx&bN>Jzf1=);T3K0RXvb B?SKFP literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..97231b91f2184172d1afb513467c67e867e3e62a GIT binary patch literal 1150 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTC$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%qp275hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|8hm3bwJ6}oxF$}kgLQj3#|G7CyF^YauyCMG83 zmzLNn0bL65LT&-v*t}wBFaZNhzap_f-%!s00+w{G(#^lGsViq)Wy}<*~P%r$-vFf(ACh=#L&{!#L3yw z&D7A`#K{n**Cju>G&eP`1g19yq1O*d1*==YdW~?pMIY!GeNfaQMKw$an0`P^c)|s8;7LC<518JIfC>ALLk1{Y zeDHK}45_&FW`-@-Ap?oF=(RxyUH5c~UnsVyWMJ=q^zM;o%$%=UT~q_tjzkww6Pfsy5(V}jnUM{+M?d<%s(2QWon6yEN^q`OhL z*`Ggcp1#eF=$9gI|`P>{Q@_GWhX#uG;uuQA?G)-EmfX1$AjLif$? zyWN2+xFoLIU2fufBFO${HCN6Z-rLQ~@}D@JZ}=|oo6AS(`;NIgH%ADilnSn>;huOz z#n977XfhHNvtQ-g+J@YP@qeOJPJmq};IQDzYs~`;!UxaHH#~QEE2u>9boFyt=akR{ E0HKY4umAu6 literal 0 HcmV?d00001 diff --git a/MyTracks/res/drawable-hdpi/tab_chart.png b/MyTracks/res/drawable-hdpi/tab_chart.png new file mode 100644 index 0000000000000000000000000000000000000000..0f650ee25d87d15a658f8d2ae2ca6b05cfe1d9e0 GIT binary patch literal 1426 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTC$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%qp275hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|8hm3bwJ6}oxF$}kgLQj3#|G7CyF^YauyCMG83 zmzLNn0bL65LT&-v*t}wBFaZNhzap_f-%!s00+w{G(#^lGsViy$i>9e(!jvf$-vFf(ACh=#L&{!#L3yw z&D7A`#K{n**Cju>G&eP`1g19yq1O*d1*==YdW~?pMIY!GeNfaQMKw$an0`P^c)|s8;7LC<518JIfC)Rw!CjAm zfr-V_#WAGf)|;8O-iHH3+Jtjg3;l6$bvYU;!otdKU!cR`$LGiO=z*FZ*CT~pRy#U6 zN-xBIn9mXWm+{r3N8#CPmwmMT(BAsbQPXWTk+|?*$kGQY(LW*bu89}HdxGOTd%g90Kgs2Q(!Z-=}_iWA?i(H0=??p1-@(d31_T&tc?W#WKYr=9gsY z@Pv_j4vxftm7`?6_#-P#kCN})MTqB@7W#AddxIkCc8bko%5o=4bbd^Vo5 zXp7M44}U(q4i?!iFUuiine!^uB^IApD2?zGHs5&Tp=D6l0 z=d?}m(9Q`i%g;LhUEi+yQ*U#e6u>y`WBC!=1e0eKce#`lUPlE= vCr&%v{%PeU`CVHXbRD=aFg4xiXJBSH5SKPh)N#oxP$}u@>gTe~DWM4fjC}@i literal 0 HcmV?d00001 diff --git a/MyTracks/res/drawable-hdpi/tab_map.png b/MyTracks/res/drawable-hdpi/tab_map.png new file mode 100644 index 0000000000000000000000000000000000000000..e5907072f04b90d4119892dd0b37ec3a416e2beb GIT binary patch literal 2077 zcmaJ?X;4#V7Y<8NPyvI8sD(`6iya`#g#?mFz(7Evh7Uu^qQhWFZbF*nX1S06N#vb>d14So#eqVRjE0`Nc?*pa z@oDHt5{tl+2ZHgUkYptoo*c^IC5w3!KHA?8<*T6@2&5p)MQNlGnTo2Rq2KXR4SQo4 zk4C*qfyFfR-=d;eVW>bz38F|i0+vVc22kEa96%&ch!hW$CjlVf0Z%-^2MZ9WBp)gP zK)rv^hH6T_fXZeBzprID(a`ZQET`h}YPA}t_QF9*As(PmD0qS=-qRCn$iS+SWH48Q zm8o2o7#N_6rxeLy5hOzy8M$##0!%|2l>Xgxseww63qwi{1WA@|F)SW}Ayqsi zM+JtHZ~%(M<%wj*$U6j!MPpYt&02gMWCRgRO15@VI;Z_d zD4pfl*UhoTcY8i99_+C^Ww%ZHf>P&@n{>vlpLALKM`P^%4c3Dg{lyKUY37tYZMRAB zaNwJ(V^!W|^Hwjo=4It^bLuZTJGH*YX-GFc!M_9=F1;zSKP!GEumEcfzCD!7R?Lw+?wSH-^)SF6Pf= zRvjm%b?Dsm<(h2Q|HefiinOnEu9wztj}5T!YFl@ybc|G>TASWeKIQnL;U7 z$X8xnn}&KaP5M&5E3hQDH$}|7T`wFSS#o9G)kju^iZ;P-zWR(PH|yarmxTxkI&FT) zga6Zm`;jHZMe6-^%%4Ypcy>)^T?;|Kmq+IIcFm>?i1VM`S-6#p*U{oWx-fP$0Z~67 zY?~g6(F=2@d~p@@MT{8ayV)3kOJ@4m;0JBp_#<6$N4k zvibj&wIO?0ws`2jd%GHc=8w71ftF7Oh&$Jzy?On#+m8RM=(TwU2Dq zT`^gAEN|jO?>TuhW2ooEjfvs-FCTw9cx9qxg=KeyIA25eZEp@w>>o)k+Du3Rz{ov< zEO(Y)WF=+c(8u%ZKK;7oWn<8+=VHA+Rb7fWSVK5eqbwu0vTcZu7N_Dc`R3MnnfyVo z`g`z}^oE}&R=L(^2e1zxKi0c1%c`(NyRuFAb!^p>{9iJ?*%*GAFK0YVwH*+fyuk>x7w%Bgwyn=5+pNy~y(+Wf+C`oN@@{;KV<+bM_JVG{Mp|K0 zAKK+$U!Kx_rTeB`zE|6e?y=3$8EseVhtK(%H54l&c`rIK-0yhU1npjUA2tkb{lu>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|8hm3bwJ6}oxF$}kgLQj3#|G7CyF^YauyCMG83 zmzLNn0bL65LT&-v*t}wBFaZNhzap_f-%!s00+w{G(#^lGsVi)!qL>y+|1n6$-vFf(ACh=#L&{!#L3yw z&D7A`#K{n**Cju>G&eP`1g19yq1OVZUQlAlEdbi=l3J8mmYU*Ll%J~r_Ow+dZnv1? zG!Lpb1-DzwaO%|uIz}H9wMbD769T3m5EGtofgE_!Pt60S_ab1zj&#|xg@J)F!PCVt zq~g|_8P-{c9R%7`?I$LC$Qms173A1a@K#CvBqLK^al@8I8HM!1xk?Eh6R#z3=<(Ji zNJjn?_unXx>E5;Wz^wWQ%!Y3k{1wYAzhU5e`M`4yO$SD@{R{ZF^%?pa zu%1sye>(5L)~Tnv%ziMecU8Zlp;^QJ?qJl+Bg-RYsuvz$xTEz+cEXgI0g;TxA6ai$ z9NTihNO}L1TQ>rC2a7!qzru9B8D!$~i$9tRVo!8eojW8GTy4}CagO1-<%B0PVbLqQ zx%VvI6!wTKh9NvqWAfa{$3E-Smv0H%&2&HK*}2dIzx`jZ@^G6J$3HmuOVRfo?;Q>M zOqOE_Ay@UTOq!mNe9JPoY)Q`IiC4n6^}b7;?K35}r2bLVHX)G(46Nst%r(0%H~rwl zdB;oFUOIcCd}-M3u$Lj41{0fCoH#nI_Q>q# literal 0 HcmV?d00001 diff --git a/MyTracks/res/drawable-ldpi/failure.png b/MyTracks/res/drawable-ldpi/failure.png deleted file mode 100644 index 3722b0794b32423dbee6ae5df68f7db22e9c3391..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1259 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 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 ec2e4e721d7e7cba4944ce876d1fd164fef58cfc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1153 zcmV-{1b+L8P)S^i=V>>o=-Le{CV6HYpaALe+9`#MS5ds6 zIVm6mY7}aOe^BE!5YXb{qVoOx{JhTRjPP|BpUV~%zI9<-AfWin%*$KITGIU3{|k`ox{b;K#WprJMz*%L za`k%sR^z3v7skiO-{o?-uh1;}0J^e4KA*f{tt~)gF!m+Z*VjM7glXKF=-=Mnel|8X z_F!si>TqFU!6mE+lQKFN1<>kb@G}`sXdE0I41y@ri9|xPEUVFvbeBpc>+J08E;N5| z@rx?rOv6D0Gn65G4#f~P8ODyDo*pfkOroipfRQbTRTxB5D=RA#CnqNl!4VAavXmgs ze43n`tO)aT3(#e>1dk(L*8qcU02s;V^Y?dlcJi=*PEESHy809VWyRth1Cnh{Clq6l zF)&+Zcz9SxlL`iFwVGzz_HFb~@om=_QcXw!VSIsD)6^FhFr`+hRIbd`Rg?JvYKCM0 zMoo%~QN5|=3*}{W2SE(UV^nd*k0GJAFm4|h$izEZRpb5oLouX^8-6BJF(?C4F(gbH znjuvjp(azAgpTi;hT36B)``j_ej55`Kz^d8%>4^Pp+qgmi6DmjG(^v^jy2S7U~CtV zDl7z5aAi!PP|*7N`iii)1?Sj4=1ihs0(W|P`V(_* zNbbJFX7=gfi`f9&JdQXRgC}#%+bkn=CZP__&dz>=Nxwki^_nO1Ccn|rf>~jmKS!jE zdA!di7X^bF0qQTPCCth3!pO%vGDA4ffn*-@oQZ5U`vzZ%D~!w{jBD%!%);b;G#mB< zdyJY(6zqdLn*-)MUt3#y$-!$XKsC5gc#v?7l*{E2q!%@y3S`1lR53+(5`L%Z7dkzM z0?k+SO2njF1{yoTf9b{WI*P;Zb{AY4jtq!NHwdO(ZxNp6P>*B(|3Pa}ehV-Fq(A%w TIeBjb00000NkvXXu0mjfaAX$_ 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 e8dda7e2abd0b2e27090a965c29827a0d49a5c0d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1524 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 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 38327b49264274a1433d0a522d96ad042cc481dc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1886 zcmV-k2ch_hP)-)pd@oKjVu9>E0s!)0I;#Kkz0t=oCRP$VECjS zFxy>BK3&7+Jb;M|oR7dv0pNMwT*UJcuyB9?B@FA2#rz`s3swP`tZ~)=IC}J`XgJ{* zdn%$WMuz=I=y%@g2q2B5RL_?2$Sdzy837qJ+BrQv{mbs|?hg$HgIXq&^`U*YsZ^?; zwr$&XF+4oH4LUlA!4imZYk&ffF&>gqR#td;iLnD|;V2c#v`A$dMwd zJ`DZIisE= z(~c1L6DLko!~4n|J9dPvSh1oVi#j$pH%IsO_HKUq^l20#A_ce$XV0G95B(u#A%TXQ zJqx1o5EqQlDI+5zhX9~CK0ZDQ&grDNE>Nf1(6c}b*SePhkh8yI%#Ilx9DF-DIXMq!FL+dgF4BW8(&gyrSdVkJgM&jmfHt_e zxcsww_wK)Pa&jUbKYsj$kB^TE_ur3=jV+?jH8MsDO!Qtm6Pt_h)~#FW;^N}0{{H^; z$YCxZAb^9>8~~_>hK5uxU%vE5s&QRiT^w@Vd?W7Rq*5ujX3ZK>Q}u8{DlYdk-k(t> zme9OZ=I7_HzjyCmfw#A}3dRh$xw(Cd>m4B>A*D-~E*)rSXmIQ7?DRoYe2qq<8j)FU zGMQWS>@$j?o3miSf}T;e^ZEf$5Tfz6Fg~obw6xIA&rbb@?_bK z8#nfD*|H@mCMKp9MPJ7l#*PUlhGq4mbXYwxh4^XL0Mdf!DDK?3<56B-p0{%4N+qN` zDk>@k`Q1xYR;^l94zIsoR8(~F`Sa(=$oKoqD8LpmKZ=xOqI0O&P=|?iCjvEEMPw9& z47u)f`SRsFbRjiT=OIY!GZbbgeYj0rT-@g+B_$W2|L*PEx4)^WskxMtl$0A77}!mX zU`GLw(Z%sZar*S>b@lc2n+FC40+4Dhq!FM2)NI(W;p>EiggU0h3X|r6!-o%7<2U8b zojc#TcI{fEPNzEt09}!hk+J^%{(lqVq2453bU^XCfqXK-74eTAJ>pOUean|G&yS9d zzP@qe#x}aVab;j0N+4gnI+=Y)-9Kb6|UNFW1!6#P#&_7|?D%IB?*=uhdz> zlp;Vn5mHD%PIrJ0D$)9~VSFR?h>`J%PN7inTeogazkBy?iMzY|ArPMzW}1EH&!68{ zP*BiJyb7IG7^@~;2CMs$eK(@SVRYyNCtSr4SAjwwK=CV(iXWqk1v@!8jabFRV9RO% zQ105bD-4X;LQ}!SFrzsoQd3hou(5=u1xX19@(cipMJxTJudgp0M%$pZa_C6JA)K?b zv$^fUxGHp`?@>e7(T;nV=SrDc&@*))Oo<1GU{NDAesI)?@JcTwB}D*dn9iL$CoVLM zR3ohY1Ex(yb#-+hBIrU0kLaO({zS`dfakT0fo#D`MlrF)PBdW=QzkZ9@&LQ}2M`_x z@&F>XOC3f9S!igemKr2w9AKm}>D`xA0H(4h7C&RWFatrl7;|%T#jT@+dAny8%=!X; zpWQw21kvO6?Ab%oi^y0ldS>5BOlA>r-!LcNN=!9{<|KeO`qd&4TU%Q@+S|wM5+JFW zwo$OKIhq&%HreD%_N6LHaI4+W-In 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 ca4ea189984be44cd17f7535ac080b1ccde20729..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1889 zcmV-n2cGzeP)M~pOf*s*?z$b6+|JE4plRX zVv6&!!(AXJ$iY4fk}^zip7BJnJybF!7V|qL{*_Qb5U3{p`oF-A@DQAEAi7)5CoB*C^|a2Z|l~r z^_7*CKZDN^|;7b8At#)v5Fb&r4PDn_I zHy8|DR8*Ara9>M;0SV%CIysxoCVnTO0S)oFSa4tbqy%|ldV1QqfB*i%l9G~s78gRW zbwGsAl`B_XCgJ6lmmjp4L~B4eN#MA+IFS&fUg3k`Cqog`aJKr|wQFy&1i*(<2gKlo z1)s(y;)W7TLRpf+a-oA=r0}X$tH_JbvRLFpE@TiO9qCQ9N;rldG9J!NMR4=*q#{%W z+!+}ex}>BePNhzI`f`EJT=z1Eqj;VQzIO`^>ORWb>7YRDN0q z{@Af&r{TVr!YRF0tG!xZUth_DcQNuTV+D=4r}=7oR?P{DAZoR1)t<@hT+ zk0OXs5GVKS+4IravuCfOmx|5K&b9>;1Ehepw6ydEJQG<^hhw=}5IazV1jM68Hj{V) zDIhUgj~qGD2rL$dWztfq#%pV9i&9cj>{69pGz9roz{7B6M=$cp_3PIQ(3okd%X}1z z+7?P2si~x)a5F6~2Wk%dX@p=Kp&{?NY6VwR|71C8jEKps#o5kxlh@qg#!DImqd!lq4|hOu!KYJ-VfEH!v5L9__- z*xQ2s>&^W9{7(F2@l|z~bFCsl$+C0j&Yw`)ONWPtTcE%b1Sc9^9%NC=O$8IsF>Tne zp<>659bF7M4u*gwTX|Io`PjT|+qPd(onJ&z`5cGmBDlrLYq{BmdVWB3*l09XZ{EE5 z1~Zn5rAvX$0gB~hA%9A^aoBH|(q3t6Yx@A@{&n&M4dlUQD1sk@47Cd16%-Vl0xajG zIA*XGSl=Vc7-%30rP+5&nF#?cU{*cx3)bZ1g0OqobpzO(s)5dBb9{h~6N$5Y|EcfL>j0Zf*|~T)MrZ z_C2|}y1ECgv!05XbUQ(CgQspGz^e`(JlHFn3zqExUyvfaI$_lT&}*<-383&EI!Pn5 z{>{~^SAU7B{yobuRw#- zfKNz42!RP9_D=}PZ}Gf5FffowFF=4lWcQ`wW_szy4~gMV{5B?2 z+UJF@;z3)3^73+Tb~%6kypp9p-pB2=0Kwghb9zfli*yI8V{lS4VQuU}>pxT2N_ya5 z0|=CH!-8%=zutv4X>&yH_SuehI~8&c2!d&W zG(kFM28zX^uNM~z1%Wt8B*K$hDsfnsIIrgiKw@!mu>uw9#lpfuetv%bw-tZ@laGKX zATi=BmhoGVzeL)0AS8>tkf)}mcoJw|6-W%1VBnAlNk86`hXHk3Tyhfw(7ImDQCk36DPXIVuAr^~ilNAI( z2Y_)No80~YFcajNig9mvV`D>QN^N&@bF=3bgeZ!-iQmUC0K$8L8W|ciOdj2m02u|z zfMh{llWPhjiIf8Xfj(;`#&_81_~`?8wXE0EyhDs>RbzK|_j9>i-f1?Qd7TkSszM?b z*Vfj4APew}D;Dq_^gU+x!el_J8i$96+i=ZKOiXb3d|s1WE{93@=J@#d+v(})E5x(4 zwZ#Wzz%2`s%LLV`#@N`{C{_$bQFMAEBO~0+%}pH2;yV~MWC1!f?X+x%rMV(F6@kD2 zObiG(@kAn_s~WWABIVG4=+6+5bl9k&!?sCx)vA!4rvn3^F-Q#Yv^toC7h5^BiEnRj ze}N8L0vkzP+2Q%tm`Y}|Ssm!h%S-v<;-Xlu z*MDOD9|!|pss?{|Ba%v`ve=~P&jUKJ>q4%`=jZ1yr>CdueP_UE*vVrAfR-z?!y0wE z-7bEwCAZg_AEXbsVu0$>=ghpwKKrC{z^ukQ+3kA{cx9kpdIM*`t!MknfK}^v<1r^a z7UZ*_yWPe;%(jyrtO;D{ zkv&m0j3hNo-Du}Z6}tNWeK-A5WaR;`~V zKD%ifL=V@`bnNZzrHKpF07*qoM6N<$f}c4cL;wH) 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 3b9284e8c93a082abc6f2caaaf358d4a083b51e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2009 zcmV;~2PXK5P)4o|~OuqkOK z3CObI0A%F(o$fU?H4(M7wI2-)4JDh+W*^>nbad>7_4xSs+>DEht4vKzeT2(nun7rf z!5OhBg#dt&cCV0@HrC`6QaMrUrbF+34ju=uCBlC+O_M` z^z`%weC`EoTxQ5(w+vVXfb?-{Y-~L0<>lqEe*Jpk?CdP`dcCrawr<@zF+DvkMn*8<>?tWJiQKz)Z)QqL%6*v)(|j_aw*>&zc(k>(xvX8gwuKHF42GB1C=Wz7 z2+GOHNw~SWiJ+h$5f&CkU|TCIE3eeo*N4dBcbL!fZ4LnRu)y&#I66WnwfC*pGBeDQ zx3{;5h=|~&;Hy`!7U1l`nwPD2c>!1-h^7&=hy#tz(?L?{RUoukVWDr@v`Lsurj!d8 zF2qRydV6O;8B%cQ_nw}f-Eis*=wc?F2UVc{SLmW$Z*8m%)Q|A>^&OK1Y_WG2A^=lDLc+u6&!2zs?Afyq z&>~;MQ3|L0;NU?3ah{xIfCe$!S#9+Yzb<^fO|uTz6Z>V;rD%HWMmV*!#H1kv=k|! zDonlRZzq`Nv17+R28BKZ|Jm!?;8ZyrjGCF5N#cEUnpw^x6Gqt2;Qra<9nj^W z6myf3HVe{13k9I6O-f`p6lg$IRn^-lR`zWH3Uq+?;Sg)7+qP{}CNZL}6zt&OpaO&k z^w3~VPEG5c1)2}}oPx;C$_U=$ z9H59}u-Iv^_B%K~fZL<FKFN6a_f~zPCYD9w6^k`TP=kDJyWV z5p$wtDZ8-6PGSd8#~qfzO$r4VhmX`TUv+hLWzcDM9#uA58wVIV&`)>o-u05t*3U;S z*aCpU|AvN!AUN(r+R$+xpbe=p2?qm6DQkVC8o{Etjp$0w#l^*EQPf_t8R+bl0i{qq zJUoOdlNnXENpu=L=rPE9uZq6>{EqC>mP*$|dGOy>(gkq0p`F}>(0BaEgR zS?Za4_wKz9>2MBNF|sCDtlH=^Tci)}H3RH+0`2YXJq$W}&R6%_A_Fscun~n@r&X2g zIEbp}?c29=!S8Zp;tsE|mA)p5CNAjUyhR*(Axt5Ti!UNaxsOM zTCA!B#@XY+g9llyt*zY87Gg~WsMd^i4-xg70Cw&1Qqzzc1i^?yuyK=~2r-uk=etqVO>meyv`}Q}2%_%DtjKy$2AsWL zEjq{zw-5HNXF-VrFhwe;#Y^cxV5ABG@qa1m6yt=Zu`V`j*pQKymR2R-Ld@6$z^t5r zc~@6gp8^dsP>cc^NO4^I>O{MFS0^zYCw*{!l$n|N7V1jXLl%1g(1K7haqHHtH^BQm zfQV!!7qtx9p4v2 zAT(w~E9giiINuN&8k&o3V~fUlvptG<&P)^*79QyA>`aH_O?i2F?_wkGjV)vn07T=O zBWl1O)ails0_4|lTz&I4u~g@m0zlckz;Q2Vpu>EhgWg_-Yki1r7wo>Kzw73Bt**RM zKXmAjrL?qEtONk%C2mns(LuD&K=8VK|Ni~oN_{_}S)6WJQzk0RHa){t#dQo>)bVo`MFu00000NkvXXu0mjfk)O+U 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 0000000000000000000000000000000000000000..e275e0283d81ce80109064489226b70ed7ef1271 GIT binary patch literal 1362 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%qp275hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|8hm3bwJ6}oxF$}kgLQj3#|G7CyF^YauyCMG83 zmzLNn0bL65LT&-v*t}wBFaZNhzap_f-%!s00+w{G(#^lGX)r!Ca!LVhNh-Yh6aX)u7;K-hL)}-PR@>Q zriSJwPKGeOF8Rr&xv6<2Fuf@Vy=FM|f)Yb+0nlcb)S}F?)D*X({9FaFr>!z^yTur% zc~HG6xZPrcQ?EYIG5VmWMT%;e5HS6KnDB%PT9>{w`q^IjFHBljX!dnHS8{_djejn(tA78=3)12x1faBc7r7`L|KJ5JBGGq3INALDaO-QfgzIH&_ z)ns4rRhBukHNRSXcbFC#ux#Om>lKZTdwAw8<~VUVVj{=+;%U~KnOaVNe65kG(R;VK zTx!o^>GcP=FK=S!S$Ri#yTne$?PqVFSuinw!^y%*5$y!o8ZDzm$}d*@VX@%ZBE&2D z!Y%UWwgVhTOEQDLO>vCw4DMUn!RXJk=ToGV{A0lzyju_WZe6@&AA8ok1S8E;Up}PA zyA(~on;^Hvop+ak+zG>m5Y;l7Hy_T(9<6EqoXlCl^xSUif%TGeTWs4@7VSt2VpEg$NOKg{< zK^q%Plh|H(K!Oeg51k-`Y25mNgn*(3ZIw2GwC!atlu97=g=u5F6^-Mr>3ASmvd=lc z{_p$0|NNi)W^R0JNB6#N48wM04)S@l0_T083w^Cd;|^N->{QX7&?oJhXhJM5>m>*> zsyGGnP?Tq@%P@>#o*|`Bw2Q(aPSRCUbaKeLY9KU*g`;&tlq%2$B{-#M5#r`I-xENQ zBgAt-ffkG;EGq{aCY)%D7oQ*_A3&|EOY(G1vp2vp6KC%HVI z-mHaA5u$9{21ik~T8*p?le#%YF)Yhcw4d_(eJI0c&1$w-_i5H(n}LUxWGaTO=o)Ys z#gaZ_M+l_!UJI(RMXOnx*Mu&Ns*482khIfMJ5dn+KUGz?vMoCg@9X_fVyiG~Kq?O{ zea4i~;3fy1QU;eap=j%7LD#3-x0oyIwr-Vm10*McBm)FdQZy&Bfe-{Pqgl47Nif4l z2*g1uip-_`d?3iufnb78GfawM0}PuAB$DxTkO>76OdHGV(u@iFS!_*=yjRuXumKTB`+nB?^u{*mAYFSkEWF z?(q)i%j^^H&Bd<_aob|67ms~?Iy;c-Y7Lw{>w4?c=g;+CKc5>OvwmoL(*3b7Jk!UD z5InNDvz3a4cc1!eZ4L8*4?L~4*!u3nV~0GYR}YV_guIsLmJCL=um1FN_BY)7r@I>U z;sfVG+g3H8;iV_Dm1MDcxvTYJY`tIj!2*j@?&@&xzpe%w28{pixJBLF{>oPT2)rxO+bNO<7*(>J5d z!R1r#bd!42%{+dM&i60&Tw#Ysv5#DD-(G57yCV(#=mHM-*NsmnbbIcA@TC-{{W66mQerz literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..3336760d5f3efdfefefd6899317c3a09264430f6 GIT binary patch literal 1138 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 Lu6{1-oD!M<3>8T@ literal 0 HcmV?d00001 diff --git a/MyTracks/res/drawable-mdpi/menu_markers.png b/MyTracks/res/drawable-mdpi/menu_markers.png new file mode 100644 index 0000000000000000000000000000000000000000..9c748b0b5c5cf2347e251b57633871f70eab218a GIT binary patch literal 1253 zcmaJ>U2NM_7`YYmO{F zq!nmc8Ku+KX%c9_v^_vIgn+@=goIQHx>BU_!~pF9UMB4cBqTuaFd(#CcTL9w#gcvR z{rsKt{T=&wF1xR}X?GIL-RQII;_Ln#c}gTj-nq^m*E@d=hy1ET@xjg<{i8b>xPq7g-l5YvUQr0H>qk%`z7u(!-&0u|XJEUOcm#g?PQ1}}^Ej+rFjhKoHO zC2l7*DCA&LHxY~ksenZ7rQzOikPcH!nCXHcil#_9L{dEgnqnh8EJef3i@?!Ld6>;} z{AMhCiV~x?ZLlO+DwTqz?x1dtkTkSW}uUmIIpQt1)oMl1#<066UtzdCK7GkEa>_~t&6!)-PWy9-GIsdNRWntC@Gp_*+2*ao6#&=)FhPQ zq6Fp$DvHdem{77i%!eX<6i?GBnhDcPD%_V$@DaKv+(*~2oGwkONV98L`3|;wTdX4n z)xeQCWGc@gnKyM6ZWPTb+vh@U%eRS@x6g&%7E9t}NN2SF8gzJ)P;{6J?m|fhhhL&n1ceZ8e?vJbO7Y;6g=Ir5J4=knUCsrE|^?O!EGU+)u z^j`h1_850{2%c&vmhkI+7yW=)-aYqS`s7S(<<<5TKJlpcM#tB#%kifV_ygYi>w2$2 z)JZq_v&Sxlb7{V%I>TQ*vVQ@{OT%z2y-I~&SdRb1&4+vFzjBv!Z`(!U@L0;#_{%GA zxcx!TW0luWEO)kf9^478SK8mX=KtdSD!(|4dpGI<4XuFv^uQ-S&d*WKk0+DLav$_P GGxHCI=$M88 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..9d1f4403a931ada4c33f5fab6123e5869c913804 GIT binary patch literal 1409 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%qp275hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|8hm3bwJ6}oxF$}kgLQj3#|G7CyF^YauyCMG83 zmzLNn0bL65LT&-v*t}wBFaZNhzap_f-%!s00+w{G(#^lGsVi;#m&XQ(Amh;$-vFf(ACh=#L&{!#L3yw z&D7A`#K{n**Cju>G&eP`1g19yq1PCvUQlAlEdbi=l3J8mmYU*Ll%J~r_Ow+dR=1d2 z7#ld@HV>*d1*==YdQEV;MIY!GeNfaQMKw$an0`P^c)|s8;7LC<518JIfC>Bek$Ykc z42+*WT^vIyZoQel+n>o%;F#rsQ{DVgCIY%VT)kpWN@80)lDBNxa5O49xx4p&!_>8N zxx%*HkWl`?W!KcXZHB}OfphOCy`Q9eZujGNPq=PAnf~VNxpREGt&O{vXmp)F{p@?? z9X39T(ggM=b0s*eN)qI1sE&$m&fqgi_cyPQsBsO$y@sXGly5loZ%`i^W=D!m+*6CGK@7IHvwg6@mc zSJoD+Te$D0;EKQ^mSYF3GJ@ooA`Onew=Q6l`ZMjIp>j&|^sCndQw|7waBZ@%U^o5X zku~Kg>t2!PX+75rxDU&$_;e_9e~rA$0rB!BC+k|06<-r{1ycWsY{OZ~jAYF#(gZ}r-4r>|^` z>A9nETKbLh*2~7ZF9Rj2P literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..21de2011439aa4d2e5205504523020decc79cc8f GIT binary patch literal 1648 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 IIVCg!0Bv#o8UO$Q literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..0e06c22127f0de4a5f2a757758aa3d2135ba8a73 GIT binary patch literal 1259 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%qp275hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|8hm3bwJ6}oxF$}kgLQj3#|G7CyF^YauyCMG83 zmzLNn0bL65LT&-v*t}wBFaZNhzap_f-%!s00+w{G(#^lGsVi))Y-tz$kfo($-vFf(ACh=#L&{!#L3yw z&D7A`#K{n**Cju>G&eP`1g19yq1OnfUQlAlEdbi=l3J8mmYU*Ll%J~r_Ow+dR=1cK zxdE-lX&zK>3U0R;;MA)Rbc{YIYLTKECIn1BASOKF0y*%cpPC0u??u3bEgkxO8Uq7k ztfz}(NX4x;*X+Fy2Z*#kT=s9ft4xVNiO8HU%pE&!E?v>_VA+D^)!jQf6zYW4*$WHG z3j#JQ4%oPPL5D@hqHD8`d_N%A)$(nbx#{V>A9Q>#{n_#S&gH5^iL^^GH+@c>W-VZh zX}H2%a%@jM*W?$6c-IO13vZ}glf)x8ub{{I$6B@zJnkQ@$^s6D$NreZb|XK%p-^Ta z^Zoky?($}Z%T*`+*3wW9ZHj#IQL51QQuxO9IG)$f8Xn?#@V&yn!soOfPvRk!1D1Y<3v4I( zHkdqSUgzuYxLt0((l6cTd*`&d&z-i^;<&+j=Zq^#4aC duiYCM87A%u5!^fD=V4Isvd$@?2>_jG!nOba literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..539bad7d7def01ac5efa6f50f55d353636f3dbc8 GIT binary patch literal 1213 zcmaJ>TWs4@7ck5x2#|O{Vp}-wnvMs8CHtK7 z>;Jz0`_KQ$i|N!Ef6KEi7>4=zB$q)ea9^JneXVl&Pqeh!@ti%ZkJu&AgxH|07a-tO zaTI2tC{JDd3ie^x{w^h(vva~ZR?<~MbaMztH4qxZ`uZJ1l*XV93UE}>qWEv0e2xP} zj^Y<00wowRSX7c_6AqVCS*biGF*4qN8uU3VB2b|%0!JO!EY^wQJG?B~yI~RsJ1O>9 z6n`WtC!|44Hz9}+R8XRNXwVZT=rF~EnNuJ{(G*FCNUAqTQ*5M{rD(AG;Ha7@kFXgo zv0DqBqIl7^4VENJr4muavWGaTO=o)Yt z#ezOzM{%U|Q46ZEN2^)8*Mu&NbVP%s3CeA$o+t?apQ@^R*_NGwkM;g1v6Y=NAen)d zK4D5|a3h^=DT9rfP_%V3tLx+STTB;qTeph30b;`uf(C*pDViJEK?nlNYnCl)66Cok zjyMQKky$Rn#k*r%I5I>fXgW?aVVa4Dhhl??2;CbVqU%^rmnKxG*>$Y^7#nGbbQ&+)G)2z~1OQ<2=E>>==rMn@PL}EyHwEr4)J%s$@Zug9f4tv&z8uGh| zjGgvsA7Ge=mU=zd+&CE$=H!Q zZ{OQGam#!eJmfF$@A0hpzU`olqYLLTy7NE)`?)rEcKKpud*ACF`SXdnje9(J*tFTq z`#tIO+114d>noMt-=DoXFrIqNH}lG8#}?iLi>=t&Q;V1Lw^qh{aO0)ijcTa1x;~J? z`wnbgDK;HG7Eadgbhg~C1oD*+PtG6zqPpVWuEN@@Ex*n@&0UHSZFASQG;sP-m-kxR zscN7))g#Z}?q0n*+L8UTu=eI#SGbQn3&+3Nd}H}=lhf97_YaaDkU9VW literal 0 HcmV?d00001 diff --git a/MyTracks/res/drawable-mdpi/tab_chart.png b/MyTracks/res/drawable-mdpi/tab_chart.png new file mode 100644 index 0000000000000000000000000000000000000000..d6235554be082aea46e1e06f55c3b7da22a70948 GIT binary patch literal 1240 zcmaJ>TWs4@7VSt2VpEg$NOKg{< zK^q%Plh|H(K!Oeg51k-`Y25mNgn*(3ZIw2GwC!atlu97=g=u5F6^-Mr>3ASmvd=lc z{_p$0|NNi)W^R0JNB6#N48wM04)S@l0_T083w^Cd;|^N->{QX7&?oJhXhJM5>m>*> zsyGGnP?Tq@%P@>#o*|`Bw2Q(aPSRCUbaKeLY9KU*g`;&tlq%2$B{-#M5#r`I-xENQ zBgAt-ffkG;EGq{aCY)%D7oQ*_A3&|EOY(G1vp2vp6KC%HVI z-mHaA5u$9{21ik~T8*p?le#%YF)Yhcw4d_(eJI0c&1$w-_i5H(n}LUxWGaTO=o)Ys z#gaZ_M+l_!UJI(RMXOnx*Mu&Ns*482khIfMJ5dn+KUGz?vMoCg@9X_fVyiG~Kq?O{ zea4i~;3fy1QU;eap=j%7LD#3-x0oyIwr-Vm10*McBm)FdQZy&Bfe-{Pqgl47Nif4l z2*g1uip-_`d?3iufnb78GfawM0}PuAB$DxTkO>76OdHGV(u@iFS!_*=yjRuXumKTB`+nB?^u{*mAYFSkEWF z?(q)i%j^^H&Bd<_aob|67ms~?Iy;c-Y7Lw{>w4?c=g;+CKc5>OvwmoL(*3b7Jk!UD z5InNDvz3a4cc1!eZ4L8*4?L~4*!u3nV~0GYR}YV_guIsLmJCL=um1FN_BY)7r@I>U z;sfVG+g3H8;iV_Dm1MDcxvTYJY`tIj!2*j@?&@&xzpe%w28{pixJBLF{>oPT2)rxO+bNO<7*(>J5d z!R1r#bd!42%{+dM&i60&Tw#Ysv5#DD-(G57yCV(#=mHM-*NsmnbbIcA@TC-{{W66mQerz literal 0 HcmV?d00001 diff --git a/MyTracks/res/drawable-mdpi/tab_map.png b/MyTracks/res/drawable-mdpi/tab_map.png new file mode 100644 index 0000000000000000000000000000000000000000..21de2011439aa4d2e5205504523020decc79cc8f GIT binary patch literal 1648 zcmaJ?Yfuwc6kc&km8uBxQbd;fxnHf$D1(4tth z1QdDssx308v>nk7Llt8?$P5o(7>D{SYN=0b3q_Ps8H#j+fc;UrGrRZRGw1uxckcOS z)*KfTG1p;{0{{SXm652LTS419%bxoh^74kbWg#1$%qGyOY%azSfDETK1gNC2G(t^a zxGC!bu?hfY`jUysY_cj^qNOQ5X3OClDLsbjBnAc;$P zNg@@j(#wf-GBS@L67pgawRss@G0s~Z3a&CrI0A}bG0;e5>I@R2lsC>R;r6yL!~@4u z*bFJ}ji_W*94Mz50u=G#04*GZfI&h&B80_4@k&qtBQS&rAUHSxfhD3~350vnQWFL`o6&NEOZBmp(o5tFfw44`NYj~5n zTANJ~I(8C^zr_Ymi?x}7(sPwjf+2GVT*1&3INr2`oL-A?TD}P^KD`#vv{;A}1KCFV zuTf8iIRDtTQ^w^EQ`RSRoZlJF*w4xfBLKkez7mxs8oT@U-7VP}zxZ5QYHn)ZJkJH* z+tJ(3?(5X2R4JJb@xI|JwiHB~Eb&pFMnz@aEB04rQYp#m;*<4cW%sij??+NPqrb1- zv^n;((wNvQ&pY>Hk2}5(y_~tJ+R)tla-_P)uy87z!qU+*6_%-EMj%o^)-_SpZ z4YxWZLpkQtktJJ*Ie}x#d#+gQI(}<7?N{L%twYD~@*QQ!I}KlE?zX%SJ05M5XVqT3 z*5TyrcD0>%_T4)!qa@yL-=OGR;D|OonZLeGRrt#p_s^r#TVFSRwAnSSeWYxAi1Bsf zE&dX-YwcRLBEHgmx604wg?VYb-A>uwlH>O))7@^i-34Y)8nf}T;nFRlW3Xz|HP3B= zuV$TZ$?PgzT3T`sNKkF)ZEOp36KMvD{F-;UdWDT_9eL^Bus+4*!I2wFl>!*ll^u8L z;+0D3Ug+~LC~%)$W@hD*?1yzlCp8C+e$D0so!ItRS3@o8YiIo~>)AzTYmax3I<4`R z5INL2H26u4#Y=mbjM)4wP1k>)STgtY@eEzu1n0r;#Vym!$-~sz6L^9yt+B`o<}d1aC^7Vy|HCsUQ@q*bpBzN zwbtRFg%)4?uT6*c{8{iJd8zRrhAyeyE9?4Vwx@Cc*yex6Q5Z5X^LA+eiJrpF!2+*k zP6#^O{ejblkn5(wy=;tgQ`_%FCVQ`aJ#`0T>K`kF^61ox{6z_&n(B4YIR`3IUYct9 z6!_sibwB&ed;W2W!`1wzxKaIg}JLJ1<>$y(6_VTWAwm7@j5&rCKe0ac%2zcI@iInz_VD!qpuz}(}h%c_-(^5g9h*D7S!P}YIR3FR^%$#$6zVG|5 zXU0=~dz%_t8wrAFN+x1yyaMN4>%m{UTz-R>%_yEl{l)+)N){x-ijjjLsY!z{4JBoC z_yG(Ogu6q{WKmY!FUW>QNe+f8X(nb9M6j!5O7ajyAO{CkJw(2qnk9j%gvi5wkrB-( z%&UpA1^df=8M!%R!o7Y zVL{-h7_ZE9vY?ZrSdQU2eh2U|EJL$CnhAJWM(_s&h6O7RiM?6MfRK*$toXvG5Sd5F z6ll6wEKHTdIjvLkEtclrst_MB+%l zq@bCrvbw!eCR{MOB$+fzF-}S~peX)7RMS?`HcG><@qSm>&WxInPD9%$STb(hz*fhV zDMT$OA;ZcT#)(=LQ+Wd!cHS^SwBJv$K$K)vcPz^cQ52H8jU-)$$ykWQ8kDLkLVQ=) z&j&gq{s_~H@SU%20qTwDt8{i^rjT*7R|gj#R!1M|c-}2M*c-#%TliAE zO~%5R($n1gPoKK}?sjcE+u)hl@Izs)vb%DoGQF<(qw#)aAO^lm~7p_C#xocr8 zzi>3grypNOW1I_D7+>$5GJ zb|0BJ-@B#l=M9q$)ghDPC~}Ej__ZkC?PxE|-E@2Ixe3>LVsfVI(!nR;8_sVb8Sjhz I6*>OLXV1HQAOHXW literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..05f9ab06d68f23284b45aa9c7808fa28f98222cf GIT binary patch literal 1589 zcmaJD2pV;p&dm*_YPZOo8Ae7ln+@U&YMdf9L8pHp?ur!mhwM%6-j6)b^ZR^M(7}EjtxNa5(jNEm*Xr{gqILj1?+FT07HaD0WX*8 z5FM??ONoq12G6O~=b9_a%`ywTBn3)#$TGp7#xxc5rG+5ghGoXLR5mtB(elZjG%}J6^oEW0gA|_iE;#mMi$IPV=TpT zBbGK2i@Pb{QkJFVB9Yy07upvJDW*h(%49MTA{L3o0uCXtt+%o!hrnu!4Ju%`&CC!q zOHfuQplB+h*0Kti%k)(VBt0r?wT-liYnaGkqD80>36vBB>U94PCCO2=jWy!0^L?YR zEq6VQi;TF9TFaQZ!4<~_LeX+HgPT~2$)%_@!7ds~DVDO8QZ%H_kqS{rXEGDkz{@a0 zr;}@~Hr8Y{<62Asa~eW|uyDYOcfAw@;DXt&G`vu0-8>FTQTV zlr8a7m+qQe_SUlbZ%@(rnmeciccL+6gF%_9O?NrvOEs>kk9XOefxShAB3$2lbj(4i0}fwa+QF-BP*=E zr#<*n^`qMJ?jMeUzh)3FHdFj<(t!4l=KMT>(dQ5Gl&VOtu6`R6?qob9@MaW#xiaLW z-q-oAdduL3t`ChrmI0NThdkr2jELItY^!85{XH3aaLC2>M}oV9< zIycR=jZ1JJ)*h-?C1oCdiOD}W9&KnLYpz|p(mJ#4>?3i=#TMNpo^qc1PXt)kq!k*x zlOlMvJIi@-CzJn4?3%6gz=~6z?by=51HQ_)1qEbbq0KS~a52I`q85UqK!DYUqT%NCkh{i>AG_JS_P9=dZMLN;-1;P>x3{4qq$fM0 zE*wfZ;HZw#Cp`zI3svQr%}1KsuJIrE>h`?g3ob_d?Zf&zKLbyDqkq5MLT+c>d!=^= zZ6}`Hc(H17`nrryew}W#?2Df zF5%8i?s(Tr1(5dcSTh`BEvaj1W$Cj4;;$dpqTdu6!9qujh`ycj;KiXcf q;pY73OVr)tUpXXb7v~D!IS>YxKmK9@@}#&1a7(MvW8bJ&SN#hw>q*T3 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..3f93e4f655e4d92b44374dc32b9245265fff82b8 GIT binary patch literal 1544 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+m{l@EB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxKsVXI%uvD1M9IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD$Tv3bSNU;+l1ennz|zM-B0$V)JVzP|XC=H|jx7ncO3BHWAB;NpiyW)Z+ZoqGVvir744~DzI`cN=+=uFAB-e&w+(vKt_H^esM;Afr4|esh**NZ(?$0 z9!LbN!`Ii!Gq1QLF)umQ)5TT^Xog;9W{Q=Yk+G|zg^Qc1lYyI|p{t>#iJ_&diIcOV zo2j9>iIX8ruSMv>2~2MaT(7GEPQ9SSkXrz>*(J3ovn(~mttdZN0qkk3Ox$j9 z!D${;ZwgMgxVYlfs}FRHJ}7FDq8cUyOg|tdJmCU4@T8xb2Tbopz=ZAIb@M3$15=f! zi(^Q|tv9pIYwIRT9KUaQ{Cqd-%E#{J(n~u$ygFN*f^<@jx^0|(J2o(>eMh&pqIGqu z`pvub52oo%X1K0OQWbEK?YxKbxsKNbyuz?l^F~^K=Z;Bo+V7ZI|cPq%qDr+|O|P zsB-+73oAZ)hF8B)VA0su!FlcA(lp5n9Cgj|j;Rfgto^o~KiHbasD;Zrf=dhME)fz0{+|a~uE|Nv^InS0|f(kx9vE8+3sL)-(z_P;UCPqieBq{~5)&S=-PL|STd*WY_6CFZ zgDYQUd&P4Tn7$Oa1%7F?E%@PA)~a>j+3vU}pZ{wJp9)QDP8F5;yv34l*N@%qa@Hc; z(a%1nvj4eWDfLClzos@yy{9p4>fOpJ>)2UyWcSWdbl-Dq$Io}(iQSu*PyJu_L*c0G zJG(7kO?mkaaA^E|cb=)NuWi42?=Cmn@`V?7*zrW_=!!mH?s$9agGt8|1qBY7cmxM4 zPJVw&u{nK0$_%EAD67YxTLSak9<4ttQox#KBEj)l??8#JpN{XY%`^EK*PB{=u~;2F z(`WIiYX+6_9yKCf|AKE?IeNd0R{I{Mar5_8$q5C%vzL0kcRJ}J5UcQ4wApXoHM5rr myBt)UkrIHC!nTh}2N*8@*vewQ^WPm%+3e}+=d#Wzp$P!)e>pAy literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..f391760ef134adb96dcce85abb2c5ab776f8e6bd GIT binary patch literal 1348 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+m{l@EB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxKsVXI%uvD1M9IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD$Tv3bSNU;+l1ennz|zM-B0$V)JVzP|XC=H|jx7ncO3BHWAB;NpiyW)Z+ZoqGVvir744~DzI`cN=+=uFAB-e&w+(vKt_H^esM;Afr4|esh**NZ(?$0 z9!LbN!`Ii!Gq1QLF)umQ)5TT^Xog;9W{Q=Qn~{aNsiT3ZlYyI|p{t>#iJ_&diIcOV zo2j9>iIX8ruSMv>2~2MaSg)mpp`{ycy`aR9TL84#CABECEH%ZgC_h&L>}jh^ zoNlpn#qAb|-W05E0r|ty4X0jxpkwqwQHvDSFd<<20WskT7s!Dp{nR{QdM^Sd?B#VK zwhRo6+dN$yLn>~)nYG{Vuz|p_xtDr9Y}g(Z&X{o2E!^$jnl&PB*UFqlh1Xx=-J0LX z5}o-&XYSP%L8^~_ob&jpQyVnp;J)8?Rd;R^iVpWMvC(79@%=9ac;6W$w!hgU`x>zZ9zS^V{6gJua|t<&QJLRD>XQY zHM_w1h41cCAG249C%AqIJvT4Xmv|;R_xq-{$)?AX4zIdmePH{E{~GCs>YnsR&D^2! zQ#8Qv3|Gmz^9$0{Rxq85WY3UT^{?ZpUQ3Zw&c}?EAx)M%=G8m1rXH%5G3eamsz2dT z$J6wyOC(=CnvnTKclW{l7HM*ougiW+Xznk1f6wZZ>NnMkLr(=hh-akT<(u!c_4eFLR-Jp&{_dM#I_LIWuj@(P tw;u2dG5>dMv-cEaU=%<_JcWO_3>bt2co&(3gwFt#Yo4xtF6*2UngBR*-eUj& literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..791240fd255052e94c008e8d5393d0b0f6175020 GIT binary patch literal 2065 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 HoD!M<*h&8R literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..52ca8ab7f3a772adb94abdc33910558ec42e2f6a GIT binary patch literal 2204 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 Tv6Z~~M}S&tWvZe^mb>a-%$HcT literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..37d98e5dd24c44f0bd77fe9af316fff2f24121bb GIT binary patch literal 1593 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 literal 0 HcmV?d00001 diff --git a/MyTracks/res/drawable-xhdpi/tab_chart.png b/MyTracks/res/drawable-xhdpi/tab_chart.png new file mode 100644 index 0000000000000000000000000000000000000000..3f93e4f655e4d92b44374dc32b9245265fff82b8 GIT binary patch literal 1544 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+m{l@EB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxKsVXI%uvD1M9IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD$Tv3bSNU;+l1ennz|zM-B0$V)JVzP|XC=H|jx7ncO3BHWAB;NpiyW)Z+ZoqGVvir744~DzI`cN=+=uFAB-e&w+(vKt_H^esM;Afr4|esh**NZ(?$0 z9!LbN!`Ii!Gq1QLF)umQ)5TT^Xog;9W{Q=Yk+G|zg^Qc1lYyI|p{t>#iJ_&diIcOV zo2j9>iIX8ruSMv>2~2MaT(7GEPQ9SSkXrz>*(J3ovn(~mttdZN0qkk3Ox$j9 z!D${;ZwgMgxVYlfs}FRHJ}7FDq8cUyOg|tdJmCU4@T8xb2Tbopz=ZAIb@M3$15=f! zi(^Q|tv9pIYwIRT9KUaQ{Cqd-%E#{J(n~u$ygFN*f^<@jx^0|(J2o(>eMh&pqIGqu z`pvub52oo%X1K0OQWbEK?YxKbxsKNbyuz?l^F~^K=Z;Bo+V7ZI|cPq%qDr+|O|P zsB-+73oAZ)hF8B)VA0su!FlcA(lp5n9Cgj|j;Rfgto^o~KiHbasD;Zrf=dhME)fz0{+|a~uE|Nv^InS0|f(kx9vE8+3sL)-(z_P;UCPqieBq{~5)&S=-PL|STd*WY_6CFZ zgDYQUd&P4Tn7$Oa1%7F?E%@PA)~a>j+3vU}pZ{wJp9)QDP8F5;yv34l*N@%qa@Hc; z(a%1nvj4eWDfLClzos@yy{9p4>fOpJ>)2UyWcSWdbl-Dq$Io}(iQSu*PyJu_L*c0G zJG(7kO?mkaaA^E|cb=)NuWi42?=Cmn@`V?7*zrW_=!!mH?s$9agGt8|1qBY7cmxM4 zPJVw&u{nK0$_%EAD67YxTLSak9<4ttQox#KBEj)l??8#JpN{XY%`^EK*PB{=u~;2F z(`WIiYX+6_9yKCf|AKE?IeNd0R{I{Mar5_8$q5C%vzL0kcRJ}J5UcQ4wApXoHM5rr myBt)UkrIHC!nTh}2N*8@*vewQ^WPm%+3e}+=d#Wzp$P!)e>pAy literal 0 HcmV?d00001 diff --git a/MyTracks/res/drawable-xhdpi/tab_map.png b/MyTracks/res/drawable-xhdpi/tab_map.png new file mode 100644 index 0000000000000000000000000000000000000000..f5ce90a33e6bd7d9f6c34223550bea2bd6d6007e GIT binary patch literal 2510 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 literal 0 HcmV?d00001 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()); }