forked from upstream-mirrors/OpenTracks
merge heads
This commit is contained in:
@@ -0,0 +1,27 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--
|
||||
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.
|
||||
-->
|
||||
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
style="@style/ScrollView">
|
||||
<TableLayout
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_width="fill_parent"
|
||||
android:padding="8dp"
|
||||
android:shrinkColumns="0,2"
|
||||
android:stretchColumns="0,2" >
|
||||
<include layout="@layout/stats_core" />
|
||||
</TableLayout>
|
||||
</ScrollView>
|
||||
@@ -39,14 +39,14 @@ limitations under the License.
|
||||
<TextView
|
||||
android:id="@+id/list_item_total_time"
|
||||
android:layout_marginRight="8dp"
|
||||
style="@style/ListItemStat" />
|
||||
style="@style/ListItemStats" />
|
||||
<TextView
|
||||
android:id="@+id/list_item_total_distance"
|
||||
android:layout_marginRight="8dp"
|
||||
style="@style/ListItemStat" />
|
||||
style="@style/ListItemStats" />
|
||||
<TextView
|
||||
android:id="@+id/list_item_start_time"
|
||||
style="@style/ListItemStat" />
|
||||
style="@style/ListItemStats" />
|
||||
</LinearLayout>
|
||||
<TextView
|
||||
android:id="@+id/list_item_description"
|
||||
|
||||
@@ -15,8 +15,7 @@ See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
-->
|
||||
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_height="fill_parent"
|
||||
android:layout_width="fill_parent" >
|
||||
style="@style/ScrollView">
|
||||
<LinearLayout
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_width="fill_parent"
|
||||
@@ -43,120 +42,7 @@ limitations under the License.
|
||||
android:layout_width="fill_parent"
|
||||
android:shrinkColumns="0,2"
|
||||
android:stretchColumns="0,2" >
|
||||
<!-- Total distance and max speed (fastest pace) -->
|
||||
<TableRow>
|
||||
<TextView
|
||||
android:text="@string/stat_total_distance"
|
||||
style="@style/MarkerDetailStatisticsLabel" />
|
||||
<TextView
|
||||
android:id="@+id/marker_detail_max_speed_label"
|
||||
android:layout_column="2"
|
||||
style="@style/MarkerDetailStatisticsLabel" />
|
||||
</TableRow>
|
||||
<TableRow>
|
||||
<TextView
|
||||
android:id="@+id/marker_detail_total_distance_value"
|
||||
style="@style/MarkerDetailStatisticsValue" />
|
||||
<TextView style="@style/MarkerDetailStatisticsSpacer" />
|
||||
<TextView
|
||||
android:id="@+id/marker_detail_max_speed_value"
|
||||
style="@style/MarkerDetailStatisticsValue" />
|
||||
</TableRow>
|
||||
<!-- Total time and average speed (average pace) -->
|
||||
<TableRow>
|
||||
<TextView
|
||||
android:text="@string/stat_total_time"
|
||||
style="@style/MarkerDetailStatisticsLabel" />
|
||||
<TextView
|
||||
android:id="@+id/marker_detail_average_speed_label"
|
||||
android:layout_column="2"
|
||||
style="@style/MarkerDetailStatisticsLabel" />
|
||||
</TableRow>
|
||||
<TableRow>
|
||||
<TextView
|
||||
android:id="@+id/marker_detail_total_time_value"
|
||||
style="@style/MarkerDetailStatisticsValue" />
|
||||
<TextView style="@style/MarkerDetailStatisticsSpacer" />
|
||||
<TextView
|
||||
android:id="@+id/marker_detail_average_speed_value"
|
||||
style="@style/MarkerDetailStatisticsValue" />
|
||||
</TableRow>
|
||||
<!-- Moving time and average moving speed (average moving pace) -->
|
||||
<TableRow>
|
||||
<TextView
|
||||
android:text="@string/stat_moving_time"
|
||||
style="@style/MarkerDetailStatisticsLabel" />
|
||||
<TextView
|
||||
android:id="@+id/marker_detail_average_moving_speed_label"
|
||||
android:layout_column="2"
|
||||
style="@style/MarkerDetailStatisticsLabel" />
|
||||
</TableRow>
|
||||
<TableRow>
|
||||
<TextView
|
||||
android:id="@+id/marker_detail_moving_time_value"
|
||||
style="@style/MarkerDetailStatisticsValue" />
|
||||
<TextView style="@style/MarkerDetailStatisticsSpacer" />
|
||||
<TextView
|
||||
android:id="@+id/marker_detail_average_moving_speed_value"
|
||||
style="@style/MarkerDetailStatisticsValue" />
|
||||
</TableRow>
|
||||
<!-- Elevation and elevation gain -->
|
||||
<TableRow>
|
||||
<TextView
|
||||
android:text="@string/stat_elevation"
|
||||
style="@style/MarkerDetailStatisticsLabel" />
|
||||
<TextView
|
||||
android:layout_column="2"
|
||||
android:text="@string/stat_elevation_gain"
|
||||
style="@style/MarkerDetailStatisticsLabel" />
|
||||
</TableRow>
|
||||
<TableRow>
|
||||
<TextView
|
||||
android:id="@+id/marker_detail_elevation_value"
|
||||
style="@style/MarkerDetailStatisticsValue" />
|
||||
<TextView style="@style/MarkerDetailStatisticsSpacer" />
|
||||
<TextView
|
||||
android:id="@+id/marker_detail_elevation_gain_value"
|
||||
style="@style/MarkerDetailStatisticsValue" />
|
||||
</TableRow>
|
||||
<!-- Min and max elevation -->
|
||||
<TableRow>
|
||||
<TextView
|
||||
android:text="@string/stat_min_elevation"
|
||||
style="@style/MarkerDetailStatisticsLabel" />
|
||||
<TextView
|
||||
android:layout_column="2"
|
||||
android:text="@string/stat_max_elevation"
|
||||
style="@style/MarkerDetailStatisticsLabel" />
|
||||
</TableRow>
|
||||
<TableRow>
|
||||
<TextView
|
||||
android:id="@+id/marker_detail_min_elevation_value"
|
||||
style="@style/MarkerDetailStatisticsValue" />
|
||||
<TextView style="@style/MarkerDetailStatisticsSpacer" />
|
||||
<TextView
|
||||
android:id="@+id/marker_detail_max_elevation_value"
|
||||
style="@style/MarkerDetailStatisticsValue" />
|
||||
</TableRow>
|
||||
<!-- Min and max grade -->
|
||||
<TableRow>
|
||||
<TextView
|
||||
android:text="@string/stat_min_grade"
|
||||
style="@style/MarkerDetailStatisticsLabel" />
|
||||
<TextView
|
||||
android:layout_column="2"
|
||||
android:text="@string/stat_max_grade"
|
||||
style="@style/MarkerDetailStatisticsLabel" />
|
||||
</TableRow>
|
||||
<TableRow>
|
||||
<TextView
|
||||
android:id="@+id/marker_detail_min_grade_value"
|
||||
style="@style/MarkerDetailStatisticsValue" />
|
||||
<TextView style="@style/MarkerDetailStatisticsSpacer" />
|
||||
<TextView
|
||||
android:id="@+id/marker_detail_max_grade_value"
|
||||
style="@style/MarkerDetailStatisticsValue" />
|
||||
</TableRow>
|
||||
<include layout="@layout/stats_core" />
|
||||
</TableLayout>
|
||||
</LinearLayout>
|
||||
</ScrollView>
|
||||
@@ -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.
|
||||
-->
|
||||
<LinearLayout
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_height="fill_parent"
|
||||
android:layout_width="fill_parent"
|
||||
android:orientation="vertical">
|
||||
<ScrollView
|
||||
android:layout_height="0dp"
|
||||
android:layout_weight="1"
|
||||
android:layout_width="fill_parent">
|
||||
<LinearLayout
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_width="fill_parent"
|
||||
android:orientation="vertical">
|
||||
|
||||
<!-- Sensor state -->
|
||||
<TextView
|
||||
android:text="@string/menu_sensor_state"
|
||||
style="@style/SensorStateLabel"/>
|
||||
<TextView
|
||||
android:id="@+id/sensor_state"
|
||||
style="@style/SensorStateValue"/>
|
||||
|
||||
<!-- Last sensor time -->
|
||||
<TextView
|
||||
android:text="@string/sensor_state_last_sensor_time"
|
||||
style="@style/SensorStateLabel"/>
|
||||
<TextView
|
||||
android:id="@+id/sensor_state_last_sensor_time"
|
||||
style="@style/SensorStateValue"/>
|
||||
|
||||
<!-- Power -->
|
||||
<TextView
|
||||
android:text="@string/sensor_state_power"
|
||||
style="@style/SensorStateLabel"/>
|
||||
<TextView
|
||||
android:id="@+id/sensor_state_power"
|
||||
style="@style/SensorStateValue"/>
|
||||
|
||||
<!-- Cadence -->
|
||||
<TextView
|
||||
android:text="@string/sensor_state_cadence"
|
||||
style="@style/SensorStateLabel"/>
|
||||
<TextView
|
||||
android:id="@+id/sensor_state_cadence"
|
||||
style="@style/SensorStateValue"/>
|
||||
|
||||
<!-- Heart rate -->
|
||||
<TextView
|
||||
android:text="@string/sensor_state_heart_rate"
|
||||
style="@style/SensorStateLabel"/>
|
||||
<TextView
|
||||
android:id="@+id/sensor_state_heart_rate"
|
||||
style="@style/SensorStateValue"/>
|
||||
|
||||
<!-- Battery level -->
|
||||
<TextView
|
||||
android:text="@string/sensor_state_battery"
|
||||
style="@style/SensorStateLabel"/>
|
||||
<TextView
|
||||
android:id="@+id/sensor_state_battery"
|
||||
style="@style/SensorStateValue"/>
|
||||
</LinearLayout>
|
||||
</ScrollView>
|
||||
</LinearLayout>
|
||||
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
style="@style/ScrollView" >
|
||||
<LinearLayout
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_width="fill_parent"
|
||||
android:orientation="vertical"
|
||||
android:padding="8dp" >
|
||||
<TextView
|
||||
android:text="@string/menu_sensor_state"
|
||||
style="@style/SensorStateLabel" />
|
||||
<TextView
|
||||
android:id="@+id/sensor_state"
|
||||
style="@style/SensorStateValue" />
|
||||
<!-- Last sensor time -->
|
||||
<TextView
|
||||
android:text="@string/sensor_state_last_sensor_time"
|
||||
style="@style/SensorStateLabel" />
|
||||
<TextView
|
||||
android:id="@+id/sensor_state_last_sensor_time"
|
||||
style="@style/SensorStateValue" />
|
||||
<!-- Power -->
|
||||
<TextView
|
||||
android:text="@string/sensor_state_power"
|
||||
style="@style/SensorStateLabel" />
|
||||
<TextView
|
||||
android:id="@+id/sensor_state_power"
|
||||
style="@style/SensorStateValue" />
|
||||
<!-- Cadence -->
|
||||
<TextView
|
||||
android:text="@string/sensor_state_cadence"
|
||||
style="@style/SensorStateLabel" />
|
||||
<TextView
|
||||
android:id="@+id/sensor_state_cadence"
|
||||
style="@style/SensorStateValue" />
|
||||
<!-- Heart rate -->
|
||||
<TextView
|
||||
android:text="@string/sensor_state_heart_rate"
|
||||
style="@style/SensorStateLabel" />
|
||||
<TextView
|
||||
android:id="@+id/sensor_state_heart_rate"
|
||||
style="@style/SensorStateValue" />
|
||||
<!-- Battery level -->
|
||||
<TextView
|
||||
android:text="@string/sensor_state_battery"
|
||||
style="@style/SensorStateLabel" />
|
||||
<TextView
|
||||
android:id="@+id/sensor_state_battery"
|
||||
style="@style/SensorStateValue" />
|
||||
</LinearLayout>
|
||||
</ScrollView>
|
||||
+39
-344
@@ -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.
|
||||
-->
|
||||
<RelativeLayout
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:id="@+id/stats_root"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="horizontal"
|
||||
android:layout_width="fill_parent">
|
||||
|
||||
<ScrollView
|
||||
android:id="@+id/scrolly"
|
||||
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
style="@style/ScrollView" >
|
||||
<TableLayout
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_width="fill_parent">
|
||||
|
||||
<TableLayout
|
||||
android:id="@+id/stats_table"
|
||||
android:layout_height="wrap_content"
|
||||
android:stretchColumns="1,4"
|
||||
android:layout_width="fill_parent">
|
||||
|
||||
<!-- Layout the speed large on it's own line. -->
|
||||
<TableRow>
|
||||
<TextView
|
||||
android:id="@+id/speed_label"
|
||||
android:layout_span="5"
|
||||
android:text="@string/stat_speed" />
|
||||
</TableRow>
|
||||
<TableRow
|
||||
android:background="@color/stat_label_background">
|
||||
<TextView
|
||||
style="@style/StatsRegister.Big"
|
||||
android:id="@+id/speed_register"
|
||||
android:layout_column="1"
|
||||
android:layout_span="4"/>
|
||||
<LinearLayout
|
||||
android:gravity="bottom"
|
||||
android:layout_column="5"
|
||||
android:layout_width="wrap_content"
|
||||
android:lines="1"
|
||||
android:orientation="vertical">
|
||||
<TextView
|
||||
android:layout_height="fill_parent"
|
||||
android:layout_width="fill_parent" />
|
||||
<TextView
|
||||
android:id="@+id/speed_unit_label_top"
|
||||
style="@style/StatsUnit" />
|
||||
<TextView
|
||||
style="@style/StatsDivider" />
|
||||
<TextView
|
||||
android:id="@+id/speed_unit_label_bottom"
|
||||
style="@style/StatsUnit" />
|
||||
</LinearLayout>
|
||||
</TableRow>
|
||||
|
||||
<!-- Total distance and max speed -->
|
||||
<TableRow
|
||||
android:padding="1dp">
|
||||
<TextView
|
||||
android:id="@+id/total_distance_label"
|
||||
android:layout_column="1"
|
||||
android:layout_span="3"
|
||||
android:text="@string/stat_total_distance" />
|
||||
<TextView
|
||||
android:id="@+id/max_speed_label"
|
||||
android:layout_column="4"
|
||||
android:layout_span="2"
|
||||
android:text="@string/stat_max_speed" />
|
||||
</TableRow>
|
||||
<TableRow
|
||||
android:background="@color/stat_label_background">
|
||||
<TextView
|
||||
style="@style/StatsRegister"
|
||||
android:id="@+id/total_distance_register"
|
||||
android:layout_column="1" />
|
||||
<TextView
|
||||
android:id="@+id/total_distance_unit_label"
|
||||
android:layout_column="2"
|
||||
style="@style/StatsUnitSolo" />
|
||||
<!-- TODO 4/08/2009
|
||||
The following is a bad hack to get a spacer the same size as the
|
||||
text. Ideally this should just be a View, however I don't know how to
|
||||
set the view height properly. fill_parent on this element causes as
|
||||
NullPointerException. This same filler is repeated on each line.-->
|
||||
<TextView
|
||||
style="@style/StatsSpacer"
|
||||
android:layout_column="3"/>
|
||||
<TextView
|
||||
android:id="@+id/max_speed_register"
|
||||
style="@style/StatsRegister"
|
||||
android:layout_column="4" />
|
||||
<LinearLayout
|
||||
android:gravity="bottom"
|
||||
android:layout_column="5"
|
||||
android:layout_width="wrap_content"
|
||||
android:lines="1"
|
||||
android:orientation="vertical">
|
||||
<TextView
|
||||
android:id="@+id/max_speed_unit_label_top"
|
||||
style="@style/StatsUnit" />
|
||||
<TextView
|
||||
style="@style/StatsDivider" />
|
||||
<TextView
|
||||
android:id="@+id/max_speed_unit_label_bottom"
|
||||
style="@style/StatsUnit" />
|
||||
</LinearLayout>
|
||||
</TableRow>
|
||||
|
||||
<!-- Total time and average speed -->
|
||||
<TableRow>
|
||||
<TextView
|
||||
android:id="@+id/track_time_label"
|
||||
android:layout_column="1"
|
||||
android:layout_span="3"
|
||||
android:text="@string/stat_total_time" />
|
||||
<TextView
|
||||
android:id="@+id/average_speed_label"
|
||||
android:layout_column="4"
|
||||
android:layout_span="2"
|
||||
android:text="@string/stat_average_speed" />
|
||||
</TableRow>
|
||||
<TableRow
|
||||
android:background="@color/stat_label_background">
|
||||
<TextView
|
||||
android:id="@+id/total_time_register"
|
||||
android:layout_column="1"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_span="2"
|
||||
android:layout_width="fill_parent"
|
||||
style="@style/StatsRegister" />
|
||||
<TextView
|
||||
style="@style/StatsSpacer"
|
||||
android:layout_column="3"/>
|
||||
<TextView
|
||||
android:id="@+id/average_speed_register"
|
||||
android:layout_column="4"
|
||||
style="@style/StatsRegister" />
|
||||
<LinearLayout
|
||||
android:gravity="bottom"
|
||||
android:layout_column="5"
|
||||
android:layout_width="wrap_content"
|
||||
android:lines="1"
|
||||
android:orientation="vertical">
|
||||
<TextView
|
||||
android:id="@+id/average_speed_unit_label_top"
|
||||
style="@style/StatsUnit" />
|
||||
<TextView
|
||||
style="@style/StatsDivider" />
|
||||
<TextView
|
||||
android:id="@+id/average_speed_unit_label_bottom"
|
||||
style="@style/StatsUnit" />
|
||||
</LinearLayout>
|
||||
</TableRow>
|
||||
|
||||
<!-- Moving time and average moving speed -->
|
||||
<TableRow>
|
||||
<TextView
|
||||
android:id="@+id/moving_time_label"
|
||||
android:layout_column="1"
|
||||
android:layout_span="3"
|
||||
android:text="@string/stat_moving_time" />
|
||||
<TextView
|
||||
android:id="@+id/average_moving_speed_label"
|
||||
android:layout_column="4"
|
||||
android:layout_span="2"
|
||||
android:text="@string/stat_average_moving_speed" />
|
||||
</TableRow>
|
||||
<TableRow
|
||||
android:background="@color/stat_label_background">
|
||||
<TextView
|
||||
android:id="@+id/moving_time_register"
|
||||
android:layout_column="1"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_span="2"
|
||||
android:layout_width="fill_parent"
|
||||
style="@style/StatsRegister" />
|
||||
<TextView
|
||||
style="@style/StatsSpacer"
|
||||
android:layout_column="3"/>
|
||||
<TextView
|
||||
android:id="@+id/average_moving_speed_register"
|
||||
style="@style/StatsRegister" />
|
||||
<LinearLayout
|
||||
android:gravity="bottom"
|
||||
android:layout_column="5"
|
||||
android:layout_width="wrap_content"
|
||||
android:lines="1"
|
||||
android:orientation="vertical">
|
||||
<TextView
|
||||
android:id="@+id/average_moving_speed_unit_label_top"
|
||||
style="@style/StatsUnit" />
|
||||
<TextView
|
||||
style="@style/StatsDivider" />
|
||||
<TextView
|
||||
android:id="@+id/average_moving_speed_unit_label_bottom"
|
||||
style="@style/StatsUnit" />
|
||||
</LinearLayout>
|
||||
</TableRow>
|
||||
|
||||
<!-- Elevation and elevation gain -->
|
||||
<TableRow>
|
||||
<TextView
|
||||
android:id="@+id/elevation_label"
|
||||
android:layout_column="1"
|
||||
android:layout_span="3"
|
||||
android:text="@string/stat_elevation" />
|
||||
<TextView
|
||||
android:id="@+id/elevation_gain_label"
|
||||
android:layout_column="4"
|
||||
android:layout_span="2"
|
||||
android:text="@string/stat_elevation_gain" />
|
||||
</TableRow>
|
||||
<TableRow
|
||||
android:background="@color/stat_label_background">
|
||||
<TextView
|
||||
android:id="@+id/elevation_register"
|
||||
android:layout_column="1"
|
||||
style="@style/StatsRegister" />
|
||||
<TextView
|
||||
android:id="@+id/elevation_unit_label"
|
||||
android:layout_column="2"
|
||||
style="@style/StatsUnitSolo" />
|
||||
<TextView
|
||||
style="@style/StatsSpacer"
|
||||
android:layout_column="3"/>
|
||||
<TextView
|
||||
android:id="@+id/elevation_gain_register"
|
||||
android:layout_column="4"
|
||||
style="@style/StatsRegister" />
|
||||
<TextView
|
||||
android:id="@+id/elevation_gain_unit_label"
|
||||
android:layout_column="5"
|
||||
style="@style/StatsUnitSolo" />
|
||||
</TableRow>
|
||||
|
||||
<!-- Min and max elevation -->
|
||||
<TableRow>
|
||||
<TextView
|
||||
android:id="@+id/min_elevation_label"
|
||||
android:layout_column="1"
|
||||
android:layout_span="3"
|
||||
android:text="@string/stat_min_elevation" />
|
||||
<TextView
|
||||
android:id="@+id/max_elevation_label"
|
||||
android:layout_column="4"
|
||||
android:layout_span="3"
|
||||
android:text="@string/stat_max_elevation" />
|
||||
</TableRow>
|
||||
<TableRow
|
||||
android:background="@color/stat_label_background">
|
||||
<TextView
|
||||
android:id="@+id/min_elevation_register"
|
||||
android:layout_column="1"
|
||||
style="@style/StatsRegister" />
|
||||
<TextView
|
||||
android:id="@+id/min_elevation_unit_label"
|
||||
android:layout_column="2"
|
||||
style="@style/StatsUnitSolo" />
|
||||
<TextView
|
||||
style="@style/StatsSpacer"
|
||||
android:layout_column="3"/>
|
||||
<TextView
|
||||
android:id="@+id/max_elevation_register"
|
||||
android:layout_column="4"
|
||||
style="@style/StatsRegister" />
|
||||
<TextView
|
||||
android:id="@+id/max_elevation_unit_label"
|
||||
android:layout_column="5"
|
||||
style="@style/StatsUnitSolo" />
|
||||
</TableRow>
|
||||
|
||||
<!-- Min and max grade -->
|
||||
<TableRow>
|
||||
<TextView
|
||||
android:id="@+id/min_grade_label"
|
||||
android:layout_column="1"
|
||||
android:layout_span="3"
|
||||
android:text="@string/stat_min_grade" />
|
||||
<TextView
|
||||
android:id="@+id/max_grade_label"
|
||||
android:layout_column="4"
|
||||
android:layout_span="2"
|
||||
android:text="@string/stat_max_grade" />
|
||||
</TableRow>
|
||||
<TableRow
|
||||
android:background="@color/stat_label_background">
|
||||
<TextView
|
||||
android:id="@+id/min_grade_register"
|
||||
android:layout_column="1"
|
||||
android:layout_span="2"
|
||||
style="@style/StatsRegister" />
|
||||
<TextView
|
||||
style="@style/StatsSpacer"
|
||||
android:layout_column="3"/>
|
||||
<TextView
|
||||
android:id="@+id/max_grade_register"
|
||||
android:layout_column="4"
|
||||
android:layout_span="2"
|
||||
style="@style/StatsRegister" />
|
||||
</TableRow>
|
||||
|
||||
<!-- Latitude and Longitude -->
|
||||
<TableRow>
|
||||
<TextView
|
||||
android:layout_column="1"
|
||||
android:layout_span="3"
|
||||
android:text="@string/stat_latitude" />
|
||||
<TextView
|
||||
android:layout_column="4"
|
||||
android:layout_span="2"
|
||||
android:text="@string/stat_longitude" />
|
||||
</TableRow>
|
||||
<TableRow
|
||||
android:background="@color/stat_label_background">
|
||||
<TextView
|
||||
android:id="@+id/latitude_register"
|
||||
android:layout_column="1"
|
||||
android:layout_span="2"
|
||||
style="@style/StatsRegister.Small" />
|
||||
<TextView
|
||||
style="@style/StatsSpacer"
|
||||
android:layout_column="3"
|
||||
android:textSize="25sp" />
|
||||
<TextView
|
||||
android:id="@+id/longitude_register"
|
||||
android:layout_column="4"
|
||||
android:layout_span="2"
|
||||
style="@style/StatsRegister.Small" />
|
||||
</TableRow>
|
||||
|
||||
</TableLayout>
|
||||
</ScrollView>
|
||||
<LinearLayout android:id="@+id/stats_busypane"
|
||||
android:orientation="vertical"
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="fill_parent"
|
||||
android:padding="3dp"
|
||||
android:visibility="gone">
|
||||
<ProgressBar
|
||||
android:layout_weight="1"
|
||||
android:layout_height="0dp"
|
||||
android:layout_width="wrap_content"
|
||||
android:maxWidth="80dp"
|
||||
android:maxHeight="80dp"
|
||||
android:minWidth="80dp"
|
||||
android:minHeight="80dp"
|
||||
android:layout_gravity="center"/>
|
||||
</LinearLayout>
|
||||
</RelativeLayout>
|
||||
android:padding="8dp"
|
||||
android:shrinkColumns="0,2"
|
||||
android:stretchColumns="0,2" >
|
||||
<!-- Speed on one line -->
|
||||
<TableRow>
|
||||
<TextView
|
||||
android:id="@+id/stats_speed_label"
|
||||
style="@style/StatsLabel" />
|
||||
</TableRow>
|
||||
<TableRow>
|
||||
<TextView
|
||||
android:id="@+id/stats_speed_value"
|
||||
style="@style/StatsValue" />
|
||||
</TableRow>
|
||||
<include layout="@layout/stats_core" />
|
||||
<!-- Latitude and longitude -->
|
||||
<TableRow>
|
||||
<TextView
|
||||
android:text="@string/stats_latitude"
|
||||
style="@style/StatsLabel" />
|
||||
<TextView
|
||||
android:layout_column="2"
|
||||
android:text="@string/stats_longitude"
|
||||
style="@style/StatsLabel" />
|
||||
</TableRow>
|
||||
<TableRow>
|
||||
<TextView
|
||||
android:id="@+id/stats_latitude_value"
|
||||
style="@style/StatsValue" />
|
||||
<TextView style="@style/StatsSpacer" />
|
||||
<TextView
|
||||
android:id="@+id/stats_longitude_value"
|
||||
style="@style/StatsValue" />
|
||||
</TableRow>
|
||||
</TableLayout>
|
||||
</ScrollView>
|
||||
@@ -0,0 +1,132 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--
|
||||
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.
|
||||
-->
|
||||
<merge xmlns:android="http://schemas.android.com/apk/res/android" >
|
||||
<!-- Total distance and max speed (fastest pace) -->
|
||||
<TableRow>
|
||||
<TextView
|
||||
android:text="@string/stats_total_distance"
|
||||
style="@style/StatsLabel" />
|
||||
<TextView
|
||||
android:id="@+id/stats_max_speed_label"
|
||||
android:layout_column="2"
|
||||
style="@style/StatsLabel" />
|
||||
</TableRow>
|
||||
<TableRow>
|
||||
<TextView
|
||||
android:id="@+id/stats_total_distance_value"
|
||||
style="@style/StatsValue" />
|
||||
<TextView style="@style/StatsSpacer" />
|
||||
<TextView
|
||||
android:id="@+id/stats_max_speed_value"
|
||||
style="@style/StatsValue" />
|
||||
</TableRow>
|
||||
<!-- Total time and average speed (average pace) -->
|
||||
<TableRow>
|
||||
<TextView
|
||||
android:text="@string/stats_total_time"
|
||||
style="@style/StatsLabel" />
|
||||
<TextView
|
||||
android:id="@+id/stats_average_speed_label"
|
||||
android:layout_column="2"
|
||||
style="@style/StatsLabel" />
|
||||
</TableRow>
|
||||
<TableRow>
|
||||
<TextView
|
||||
android:id="@+id/stats_total_time_value"
|
||||
style="@style/StatsValue" />
|
||||
<TextView style="@style/StatsSpacer" />
|
||||
<TextView
|
||||
android:id="@+id/stats_average_speed_value"
|
||||
style="@style/StatsValue" />
|
||||
</TableRow>
|
||||
<!-- Moving time and average moving speed (average moving pace) -->
|
||||
<TableRow>
|
||||
<TextView
|
||||
android:text="@string/stats_moving_time"
|
||||
style="@style/StatsLabel" />
|
||||
<TextView
|
||||
android:id="@+id/stats_average_moving_speed_label"
|
||||
android:layout_column="2"
|
||||
style="@style/StatsLabel" />
|
||||
</TableRow>
|
||||
<TableRow>
|
||||
<TextView
|
||||
android:id="@+id/stats_moving_time_value"
|
||||
style="@style/StatsValue" />
|
||||
<TextView style="@style/StatsSpacer" />
|
||||
<TextView
|
||||
android:id="@+id/stats_average_moving_speed_value"
|
||||
style="@style/StatsValue" />
|
||||
</TableRow>
|
||||
<!-- Elevation and elevation gain -->
|
||||
<TableRow>
|
||||
<TextView
|
||||
android:text="@string/stats_elevation"
|
||||
style="@style/StatsLabel" />
|
||||
<TextView
|
||||
android:layout_column="2"
|
||||
android:text="@string/stats_elevation_gain"
|
||||
style="@style/StatsLabel" />
|
||||
</TableRow>
|
||||
<TableRow>
|
||||
<TextView
|
||||
android:id="@+id/stats_elevation_value"
|
||||
style="@style/StatsValue" />
|
||||
<TextView style="@style/StatsSpacer" />
|
||||
<TextView
|
||||
android:id="@+id/stats_elevation_gain_value"
|
||||
style="@style/StatsValue" />
|
||||
</TableRow>
|
||||
<!-- Min and max elevation -->
|
||||
<TableRow>
|
||||
<TextView
|
||||
android:text="@string/stats_min_elevation"
|
||||
style="@style/StatsLabel" />
|
||||
<TextView
|
||||
android:layout_column="2"
|
||||
android:text="@string/stats_max_elevation"
|
||||
style="@style/StatsLabel" />
|
||||
</TableRow>
|
||||
<TableRow>
|
||||
<TextView
|
||||
android:id="@+id/stats_min_elevation_value"
|
||||
style="@style/StatsValue" />
|
||||
<TextView style="@style/StatsSpacer" />
|
||||
<TextView
|
||||
android:id="@+id/stats_max_elevation_value"
|
||||
style="@style/StatsValue" />
|
||||
</TableRow>
|
||||
<!-- Min and max grade -->
|
||||
<TableRow>
|
||||
<TextView
|
||||
android:text="@string/stats_min_grade"
|
||||
style="@style/StatsLabel" />
|
||||
<TextView
|
||||
android:layout_column="2"
|
||||
android:text="@string/stats_max_grade"
|
||||
style="@style/StatsLabel" />
|
||||
</TableRow>
|
||||
<TableRow>
|
||||
<TextView
|
||||
android:id="@+id/stats_min_grade_value"
|
||||
style="@style/StatsValue" />
|
||||
<TextView style="@style/StatsSpacer" />
|
||||
<TextView
|
||||
android:id="@+id/stats_max_grade_value"
|
||||
style="@style/StatsValue" />
|
||||
</TableRow>
|
||||
</merge>
|
||||
@@ -52,7 +52,7 @@ limitations under the License.
|
||||
android:id="@+id/appwidget_distance_text" />
|
||||
<TextView
|
||||
style="@style/WidgetTextView"
|
||||
android:text="@string/stat_total_distance" />
|
||||
android:text="@string/stats_total_distance" />
|
||||
</LinearLayout>
|
||||
<LinearLayout
|
||||
android:layout_width="fill_parent"
|
||||
@@ -68,7 +68,7 @@ limitations under the License.
|
||||
android:id="@+id/appwidget_time_text" />
|
||||
<TextView
|
||||
style="@style/WidgetTextView"
|
||||
android:text="@string/stat_moving_time" />
|
||||
android:text="@string/stats_moving_time" />
|
||||
</LinearLayout>
|
||||
<LinearLayout
|
||||
android:layout_width="fill_parent"
|
||||
@@ -83,7 +83,7 @@ limitations under the License.
|
||||
android:id="@+id/appwidget_speed_text" />
|
||||
<TextView
|
||||
style="@style/WidgetTextView"
|
||||
android:text="@string/stat_speed" />
|
||||
android:text="@string/stats_speed" />
|
||||
</LinearLayout>
|
||||
</LinearLayout>
|
||||
</LinearLayout>
|
||||
|
||||
@@ -17,11 +17,8 @@ limitations under the License.
|
||||
<resources>
|
||||
<color name="black">#FF000000</color>
|
||||
<color name="blue">#FF0000FF</color>
|
||||
<color name="green">#FF00FF00</color>
|
||||
<color name="gray">#FFAAAAAA</color>
|
||||
<color name="red">#FFFF0000</color>
|
||||
<color name="stat_label_background">#FFF0F0F0</color>
|
||||
<color name="stat_label_text">#FF0F0F0F</color>
|
||||
<color name="white">#FFFFFFFF</color>
|
||||
|
||||
<!-- Chart colors by series. -->
|
||||
|
||||
@@ -494,7 +494,7 @@ limitations under the License.
|
||||
Accuracy (m)
|
||||
</string>
|
||||
<string name="description_location_altitude"
|
||||
translation_description="Label for location altitude in degrees.">
|
||||
translation_description="Label for location altitude in meters.">
|
||||
Altitude (m)
|
||||
</string>
|
||||
<string name="description_location_bearing"
|
||||
@@ -2067,81 +2067,81 @@ limitations under the License.
|
||||
I think you might be interested in this track:\n\n%1$s
|
||||
</string>
|
||||
|
||||
<!-- Stat Page -->
|
||||
<string name="stat_average_moving_pace"
|
||||
translation_description="In the 'Statistics' page, the average moving pace.">
|
||||
<!-- Stats Page -->
|
||||
<string name="stats_average_moving_pace"
|
||||
translation_description="In the 'Stats' page, the average moving pace.">
|
||||
Average moving pace
|
||||
</string>
|
||||
<string name="stat_average_moving_speed"
|
||||
translation_description="In the 'Statistics' page, the average moving speed.">
|
||||
<string name="stats_average_moving_speed"
|
||||
translation_description="In the 'Stats' page, the average moving speed.">
|
||||
Average moving speed
|
||||
</string>
|
||||
<string name="stat_average_pace"
|
||||
translation_description="In the 'Statistics' page, the average pace.">
|
||||
<string name="stats_average_pace"
|
||||
translation_description="In the 'Stats' page, the average pace.">
|
||||
Average pace
|
||||
</string>
|
||||
<string name="stat_average_speed"
|
||||
translation_description="In the 'Statistics' page, the average speed.">
|
||||
<string name="stats_average_speed"
|
||||
translation_description="In the 'Stats' page, the average speed.">
|
||||
Average speed
|
||||
</string>
|
||||
<string name="stat_elevation"
|
||||
translation_description="In the 'Statistics' page, the elevation.">
|
||||
<string name="stats_elevation"
|
||||
translation_description="In the 'Stats' page, the elevation.">
|
||||
Elevation
|
||||
</string>
|
||||
<string name="stat_elevation_gain"
|
||||
translation_description="In the 'Statistics' page, the elevation gain.">
|
||||
<string name="stats_elevation_gain"
|
||||
translation_description="In the 'Stats' page, the elevation gain.">
|
||||
Elevation gain
|
||||
</string>
|
||||
<string name="stat_fastest_pace"
|
||||
translation_description="In the 'Statistics' page, the fastest pace.">
|
||||
<string name="stats_fastest_pace"
|
||||
translation_description="In the 'Stats' page, the fastest pace.">
|
||||
Fastest pace
|
||||
</string>
|
||||
<string name="stat_latitude"
|
||||
translation_description="In the 'Statistics' page, the latitude.">
|
||||
<string name="stats_latitude"
|
||||
translation_description="In the 'Stats' page, the latitude.">
|
||||
Latitude
|
||||
</string>
|
||||
<string name="stat_longitude"
|
||||
translation_description="In the 'Statistics' page, the longitude.">
|
||||
<string name="stats_longitude"
|
||||
translation_description="In the 'Stats' page, the longitude.">
|
||||
Longitude
|
||||
</string>
|
||||
<string name="stat_max_elevation"
|
||||
translation_description="In the 'Statistics' page, the maximum elevation.">
|
||||
<string name="stats_max_elevation"
|
||||
translation_description="In the 'Stats' page, the maximum elevation.">
|
||||
Max elevation
|
||||
</string>
|
||||
<string name="stat_max_grade"
|
||||
translation_description="In the 'Statistics' page, the maximum grade.">
|
||||
<string name="stats_max_grade"
|
||||
translation_description="In the 'Stats' page, the maximum grade.">
|
||||
Max grade
|
||||
</string>
|
||||
<string name="stat_max_speed"
|
||||
translation_description="In the 'Statistics' page, the maximum speed.">
|
||||
<string name="stats_max_speed"
|
||||
translation_description="In the 'Stats' page, the maximum speed.">
|
||||
Max speed
|
||||
</string>
|
||||
<string name="stat_min_elevation"
|
||||
translation_description="In the 'Statistics' page, the minimum elevation.">
|
||||
<string name="stats_min_elevation"
|
||||
translation_description="In the 'Stats' page, the minimum elevation.">
|
||||
Min elevation
|
||||
</string>
|
||||
<string name="stat_min_grade"
|
||||
translation_description="In the 'Statistics' page, the minimum grade.">
|
||||
<string name="stats_min_grade"
|
||||
translation_description="In the 'Stats' page, the minimum grade.">
|
||||
Min grade
|
||||
</string>
|
||||
<string name="stat_moving_time"
|
||||
translation_description="In the 'Statistics' page, the moving time.">
|
||||
<string name="stats_moving_time"
|
||||
translation_description="In the 'Stats' page, the moving time.">
|
||||
Moving time
|
||||
</string>
|
||||
<string name="stat_pace"
|
||||
translation_description="In the 'Statistics' page, the pace like hours per mile.">
|
||||
<string name="stats_pace"
|
||||
translation_description="In the 'Stats' page, the pace like hours per mile.">
|
||||
Pace
|
||||
</string>
|
||||
<string name="stat_speed"
|
||||
translation_description="In the 'Statistics' page, the speed like miles per hour.">
|
||||
<string name="stats_speed"
|
||||
translation_description="In the 'Stats' page, the speed like miles per hour.">
|
||||
Speed
|
||||
</string>
|
||||
<string name="stat_total_distance"
|
||||
translation_description="In the 'Statistics' page, the total distance.">
|
||||
<string name="stats_total_distance"
|
||||
translation_description="In the 'Stats' page, the total distance.">
|
||||
Total distance
|
||||
</string>
|
||||
<string name="stat_total_time"
|
||||
translation_description="In the 'Statistics' page, the total time.">
|
||||
<string name="stats_total_time"
|
||||
translation_description="In the 'Stats' page, the total time.">
|
||||
Total time
|
||||
</string>
|
||||
|
||||
@@ -2417,7 +2417,14 @@ limitations under the License.
|
||||
recommended value.">
|
||||
Smallest (recommended)
|
||||
</string>
|
||||
|
||||
<string name="value_coordinate_degree"
|
||||
translation_description="To display a latitude or longitude coordinate in degree. E.g.,
|
||||
2.2 \u00B0. \u00B0 is the unicode value for the degree symbol.
|
||||
|
||||
%1$s: a string value of the coordinate. E.g., '2.2'">
|
||||
%1$s \u00B0
|
||||
</string>
|
||||
|
||||
<!-- Voice -->
|
||||
<string name="voice_hours_few"
|
||||
translation_description="For voice announcement, to say 'few' hours.
|
||||
|
||||
+61
-123
@@ -15,20 +15,18 @@ See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
-->
|
||||
<resources>
|
||||
<style name="ThemeSelector" parent="android:Theme" />
|
||||
|
||||
<!-- The style for the bottom button -->
|
||||
<style name="BottomButton" parent="@android:style/Widget.DeviceDefault.Button.Borderless">
|
||||
<item name="android:layout_height">wrap_content</item>
|
||||
<item name="android:layout_weight">1</item>
|
||||
<item name="android:layout_width">0dp</item>
|
||||
</style>
|
||||
<!-- The style for the bottom button bar -->
|
||||
<style name="BottomButtonBar" parent="@android:style/DeviceDefault.ButtonBar">
|
||||
<item name="android:layout_height">wrap_content</item>
|
||||
<item name="android:layout_width">fill_parent</item>
|
||||
<item name="android:orientation">horizontal</item>
|
||||
</style>
|
||||
<!-- The style for the bottom button -->
|
||||
<style name="BottomButton" parent="@android:style/Widget.DeviceDefault.Button.Borderless">
|
||||
<item name="android:layout_height">wrap_content</item>
|
||||
<item name="android:layout_weight">1</item>
|
||||
<item name="android:layout_width">0dp</item>
|
||||
</style>
|
||||
<!-- The style for the edit category -->
|
||||
<style name="EditCategory" parent="@android:style/TextAppearance.DeviceDefault.Medium">
|
||||
<item name="android:layout_height">wrap_content</item>
|
||||
@@ -38,12 +36,12 @@ limitations under the License.
|
||||
</style>
|
||||
<!-- The style for the edit description -->
|
||||
<style name="EditDescription" parent="@android:style/TextAppearance.DeviceDefault.Medium">
|
||||
<item name="android:inputType">textAutoCorrect|textCapSentences</item>
|
||||
<item name="android:layout_height">wrap_content</item>
|
||||
<item name="android:layout_width">fill_parent</item>
|
||||
<item name="android:maxLines">50</item>
|
||||
<item name="android:selectAllOnFocus">true</item>
|
||||
<item name="android:singleLine">false</item>
|
||||
<item name="android:maxLines">50</item>
|
||||
<item name="android:inputType">textAutoCorrect|textCapSentences</item>
|
||||
</style>
|
||||
<!-- The style for the edit label -->
|
||||
<style name="EditLabel" parent="@android:style/TextAppearance.DeviceDefault.Medium">
|
||||
@@ -52,13 +50,13 @@ limitations under the License.
|
||||
</style>
|
||||
<!-- The style for the edit name -->
|
||||
<style name="EditName" parent="@android:style/TextAppearance.DeviceDefault.Medium">
|
||||
<item name="android:drawablePadding">8dp</item>
|
||||
<item name="android:gravity">center_vertical</item>
|
||||
<item name="android:inputType">textAutoCorrect|textCapWords</item>
|
||||
<item name="android:layout_height">wrap_content</item>
|
||||
<item name="android:layout_width">fill_parent</item>
|
||||
<item name="android:selectAllOnFocus">true</item>
|
||||
<item name="android:singleLine">true</item>
|
||||
<item name="android:inputType">textAutoCorrect|textCapWords</item>
|
||||
<item name="android:drawablePadding">8dp</item>
|
||||
<item name="android:gravity">center_vertical</item>
|
||||
</style>
|
||||
<!-- The style for the list empty text view -->
|
||||
<style name="ListEmptyTextView" parent="@android:style/TextAppearance.DeviceDefault.Large">
|
||||
@@ -68,138 +66,80 @@ limitations under the License.
|
||||
<item name="android:layout_width">wrap_content</item>
|
||||
<item name="android:padding">8dp</item>
|
||||
</style>
|
||||
<!-- The style for the list item category -->
|
||||
<!-- The style for the list item category -->
|
||||
<style name="ListItemCategory" parent="@android:style/TextAppearance.DeviceDefault.Small">
|
||||
<item name="android:layout_height">wrap_content</item>
|
||||
<item name="android:layout_marginLeft">8dp</item>
|
||||
<item name="android:layout_width">wrap_content</item>
|
||||
<item name="android:singleLine">true</item>
|
||||
<item name="android:layout_marginLeft">8dp</item>
|
||||
</style>
|
||||
<!-- The style for the list item description -->
|
||||
<style name="ListItemDescription" parent="@android:style/TextAppearance.DeviceDefault.Small">
|
||||
<item name="android:layout_height">wrap_content</item>
|
||||
<item name="android:layout_width">fill_parent</item>
|
||||
<item name="android:singleLine">false</item>
|
||||
<item name="android:singleLine">false</item>
|
||||
<item name="android:textColor">@android:color/secondary_text_dark</item>
|
||||
</style>
|
||||
<!-- The style for the list item name -->
|
||||
<style name="ListItemName" parent="@android:style/TextAppearance.DeviceDefault.Large">
|
||||
<item name="android:layout_height">wrap_content</item>
|
||||
<item name="android:layout_width">wrap_content</item>
|
||||
<item name="android:singleLine">true</item>
|
||||
<item name="android:gravity">center_vertical</item>
|
||||
<item name="android:paddingLeft">9dp</item>
|
||||
<item name="android:layout_height">wrap_content</item>
|
||||
<item name="android:layout_width">wrap_content</item>
|
||||
<item name="android:drawablePadding">8dp</item>
|
||||
<item name="android:singleLine">true</item>
|
||||
</style>
|
||||
<!-- style for the list item stat -->
|
||||
<style name="ListItemStat" parent="@android:style/TextAppearance.DeviceDefault.Small">
|
||||
<!-- style for the list item stats -->
|
||||
<style name="ListItemStats" parent="@android:style/TextAppearance.DeviceDefault.Small">
|
||||
<item name="android:layout_height">wrap_content</item>
|
||||
<item name="android:layout_width">wrap_content</item>
|
||||
<item name="android:singleLine">true</item>
|
||||
<item name="android:textColor">@color/green</item>
|
||||
<item name="android:textColor">@android:color/secondary_text_dark</item>
|
||||
</style>
|
||||
<!-- The style for the marker detail label -->
|
||||
<style name="MarkerDetailLabel" parent="@android:style/TextAppearance.DeviceDefault.Large">
|
||||
<item name="android:layout_height">wrap_content</item>
|
||||
<item name="android:layout_width">wrap_content</item>
|
||||
</style>
|
||||
<!-- The style for the marker detail statistics label -->
|
||||
<style name="MarkerDetailStatisticsLabel" parent="@android:style/TextAppearance.DeviceDefault.Medium">
|
||||
<!-- The style for the sensor state label -->
|
||||
<style name="SensorStateLabel" parent="@android:style/TextAppearance.DeviceDefault.Medium">
|
||||
<item name="android:layout_height">wrap_content</item>
|
||||
<item name="android:layout_width">0dp</item>
|
||||
<item name="android:layout_weight">1</item>
|
||||
</style>
|
||||
<!-- The style for the marker detail statistics spacer -->
|
||||
<style name="MarkerDetailStatisticsSpacer">
|
||||
<item name="android:layout_height">fill_parent</item>
|
||||
<item name="android:layout_width">8dp</item>
|
||||
</style>
|
||||
<!-- The style for the marker detail statistics value -->
|
||||
<style name="MarkerDetailStatisticsValue" parent="@android:style/TextAppearance.DeviceDefault.Large">
|
||||
<item name="android:gravity">right</item>
|
||||
<item name="android:textColor">@color/stat_label_text</item>
|
||||
<item name="android:layout_height">wrap_content</item>
|
||||
<item name="android:layout_width">0dp</item>
|
||||
<item name="android:layout_weight">1</item>
|
||||
<item name="android:background">@android:color/background_light</item>
|
||||
</style>
|
||||
|
||||
<style name="SensorStateLabel">
|
||||
<item name="android:layout_height">wrap_content</item>
|
||||
<item name="android:layout_width">fill_parent</item>
|
||||
<item name="android:paddingLeft">4dp</item>
|
||||
<item name="android:paddingRight">4dp</item>
|
||||
</style>
|
||||
|
||||
<style name="SensorStateValue">
|
||||
<item name="android:background">@color/stat_label_background</item>
|
||||
<item name="android:gravity">right</item>
|
||||
<item name="android:layout_height">wrap_content</item>
|
||||
<item name="android:layout_width">fill_parent</item>
|
||||
<item name="android:paddingLeft">4dp</item>
|
||||
<item name="android:paddingRight">4dp</item>
|
||||
<item name="android:textColor">@color/stat_label_text</item>
|
||||
<item name="android:textSize">40sp</item>
|
||||
</style>
|
||||
|
||||
<!-- The style for a view which divides the numerator and denominator of the units on the statistics activity. -->
|
||||
<style name="StatsDivider" parent="@android:Widget.TextView">
|
||||
<item name="android:background">@color/black</item>
|
||||
<item name="android:layout_height">3dp</item>
|
||||
<item name="android:layout_width">fill_parent</item>
|
||||
</style>
|
||||
|
||||
<!-- The style for a text view for displaying a value on the statistics activity. -->
|
||||
<style name="StatsRegister" parent="@android:Widget.TextView">
|
||||
<item name="android:gravity">right</item>
|
||||
<item name="android:layout_marginBottom">-9dp</item>
|
||||
<item name="android:layout_marginTop">-9dp</item>
|
||||
<item name="android:text">@string/value_unknown</item>
|
||||
<item name="android:textColor">@color/stat_label_text</item>
|
||||
<item name="android:textSize">40sp</item>
|
||||
</style>
|
||||
|
||||
<!-- The style for a text view for displaying a large value on the statistics activity. -->
|
||||
<style name="StatsRegister.Big">
|
||||
<item name="android:layout_marginBottom">-13dp</item>
|
||||
<item name="android:layout_marginTop">-13dp</item>
|
||||
<item name="android:textSize">50sp</item>
|
||||
</style>
|
||||
|
||||
<!-- The style for a text view for displaying a small value on the statistics activity. -->
|
||||
<style name="StatsRegister.Small">
|
||||
<item name="android:layout_height">wrap_content</item>
|
||||
<item name="android:layout_marginBottom">-5dp</item>
|
||||
<item name="android:layout_marginTop">-5dp</item>
|
||||
<item name="android:layout_width">fill_parent</item>
|
||||
<item name="android:textSize">25sp</item>
|
||||
</style>
|
||||
|
||||
<!-- The style for a view which divides two columns in the statistics activity. -->
|
||||
<style name="StatsSpacer" parent="@android:Widget.TextView">
|
||||
<item name="android:background">@color/black</item>
|
||||
<item name="android:layout_marginBottom">-9dp</item>
|
||||
<item name="android:layout_marginTop">-9dp</item>
|
||||
<item name="android:layout_width">5dp</item>
|
||||
<item name="android:textSize">40sp</item>
|
||||
</style>
|
||||
|
||||
<!-- The style for the unit on the statistics activity. -->
|
||||
<style name="StatsUnit" parent="@android:Widget.TextView">
|
||||
<item name="android:gravity">bottom</item>
|
||||
<item name="android:layout_height">wrap_content</item>
|
||||
<item name="android:layout_marginBottom">-2dp</item>
|
||||
<item name="android:layout_marginTop">-2dp</item>
|
||||
<item name="android:layout_width">wrap_content</item>
|
||||
<item name="android:textColor">@color/stat_label_text</item>
|
||||
</style>
|
||||
|
||||
<!-- The style for the unit on the statistics activity where there is only one string. -->
|
||||
<style name="StatsUnitSolo" parent="@android:Widget.TextView">
|
||||
<!-- The style for the sensor state value -->
|
||||
<style name="SensorStateValue" parent="@android:style/TextAppearance.DeviceDefault.Large">
|
||||
<item name="android:background">@android:color/background_light</item>
|
||||
<item name="android:gravity">right</item>
|
||||
<item name="android:layout_marginBottom">-9dp</item>
|
||||
<item name="android:layout_marginTop">-9dp</item>
|
||||
<item name="android:textColor">@color/stat_label_text</item>
|
||||
<item name="android:layout_height">wrap_content</item>
|
||||
<item name="android:layout_width">fill_parent</item>
|
||||
<item name="android:textColor">@android:color/primary_text_light</item>
|
||||
</style>
|
||||
|
||||
<!-- The style for the scroll view -->
|
||||
<style name="ScrollView">
|
||||
<item name="android:layout_height">fill_parent</item>
|
||||
<item name="android:layout_width">fill_parent</item>
|
||||
<item name="android:scrollbarStyle">outsideInset</item>
|
||||
</style>
|
||||
<!-- The style for the stats label -->
|
||||
<style name="StatsLabel" parent="@android:style/TextAppearance.DeviceDefault.Medium">
|
||||
<item name="android:layout_height">wrap_content</item>
|
||||
<item name="android:layout_weight">1</item>
|
||||
<item name="android:layout_width">0dp</item>
|
||||
</style>
|
||||
<!-- The style for the stats spacer -->
|
||||
<style name="StatsSpacer">
|
||||
<item name="android:layout_height">fill_parent</item>
|
||||
<item name="android:layout_width">8dp</item>
|
||||
</style>
|
||||
<!-- The style for the stats value -->
|
||||
<style name="StatsValue" parent="@android:style/TextAppearance.DeviceDefault.Large">
|
||||
<item name="android:background">@android:color/background_light</item>
|
||||
<item name="android:gravity">right</item>
|
||||
<item name="android:layout_height">wrap_content</item>
|
||||
<item name="android:layout_weight">1</item>
|
||||
<item name="android:layout_width">0dp</item>
|
||||
<item name="android:textColor">@android:color/primary_text_light</item>
|
||||
</style>
|
||||
<style name="ThemeSelector" parent="android:Theme" />
|
||||
<!-- The style for the welcome page answer -->
|
||||
<style name="WelcomeAnswerTextView" parent="@android:style/TextAppearance.DeviceDefault.Small">
|
||||
<item name="android:layout_height">wrap_content</item>
|
||||
@@ -210,20 +150,18 @@ limitations under the License.
|
||||
<style name="WelcomeQuestionTextView" parent="@android:style/TextAppearance.DeviceDefault.Medium">
|
||||
<item name="android:layout_height">wrap_content</item>
|
||||
<item name="android:layout_width">wrap_content</item>
|
||||
<item name="android:textStyle">bold</item>
|
||||
<item name="android:paddingTop">8dp</item>
|
||||
<item name="android:textStyle">bold</item>
|
||||
</style>
|
||||
|
||||
<!-- Widget TextView -->
|
||||
<!-- The style for the widget label -->
|
||||
<style name="WidgetTextView">
|
||||
<item name="android:layout_height">wrap_content</item>
|
||||
<item name="android:layout_width">wrap_content</item>
|
||||
<item name="android:textColor">@color/appwidget_text</item>
|
||||
<item name="android:textSize">14sp</item>
|
||||
</style>
|
||||
|
||||
<!-- Widget TextView value -->
|
||||
<!-- The style for the widget value -->
|
||||
<style name="WidgetTextView.Value">
|
||||
<item name="android:width">160px</item>
|
||||
</style>
|
||||
</resources>
|
||||
</resources>
|
||||
@@ -1,3 +1,19 @@
|
||||
/*
|
||||
* 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;
|
||||
@@ -5,88 +21,41 @@ 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.speech.tts.TextToSpeech;
|
||||
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 Activity {
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
|
||||
this.tracksProvider = MyTracksProviderUtils.Factory.get(this);
|
||||
|
||||
setVolumeControlStream(TextToSpeech.Engine.DEFAULT_STREAM);
|
||||
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();
|
||||
StatsUtils.setSpeedLabels(this, reportSpeed, false);
|
||||
StatsUtils.setTripStatisticsValues(this, getTripStatistics(), metricUnits, reportSpeed);
|
||||
StatsUtils.setLocationElevationValue(this, Double.NaN, metricUnits);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -100,30 +69,18 @@ public class AggregatedStatsActivity extends Activity implements
|
||||
}
|
||||
|
||||
/**
|
||||
* 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<Track> tracks = retrieveTracks();
|
||||
TripStatistics rollingStats = null;
|
||||
private TripStatistics getTripStatistics() {
|
||||
List<Track> 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<Track> retrieveTracks() {
|
||||
return tracksProvider.getAllTracks();
|
||||
}
|
||||
|
||||
private void updateView(TripStatistics aggStats) {
|
||||
if (aggStats != null) {
|
||||
utils.setAllStats(aggStats);
|
||||
}
|
||||
return tripStatistics;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -19,7 +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;
|
||||
@@ -94,44 +93,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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -45,8 +45,6 @@ public class SensorStateActivity extends Activity {
|
||||
|
||||
private static final long REFRESH_PERIOD_MS = 250;
|
||||
|
||||
private final StatsUtilities utils;
|
||||
|
||||
/**
|
||||
* This timer periodically invokes the refresh timer task.
|
||||
*/
|
||||
@@ -91,11 +89,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 +232,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 +318,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);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
+1
-1
@@ -63,7 +63,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)
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -48,18 +50,22 @@ public class StatsFragment extends Fragment implements TrackDataListener {
|
||||
|
||||
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 +74,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 +90,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 +99,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 +128,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 +141,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 +170,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 +227,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 +279,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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user