Merge heads
@@ -180,9 +180,6 @@ limitations under the License.
|
|||||||
<activity
|
<activity
|
||||||
android:label="@string/menu_sensor_state"
|
android:label="@string/menu_sensor_state"
|
||||||
android:name="com.google.android.apps.mytracks.SensorStateActivity" />
|
android:name="com.google.android.apps.mytracks.SensorStateActivity" />
|
||||||
<activity
|
|
||||||
android:label="@string/settings_title"
|
|
||||||
android:name="com.google.android.apps.mytracks.SettingsActivity" />
|
|
||||||
<activity android:name="com.google.android.apps.mytracks.TrackDetailActivity" />
|
<activity android:name="com.google.android.apps.mytracks.TrackDetailActivity" />
|
||||||
<activity
|
<activity
|
||||||
android:name="com.google.android.apps.mytracks.TrackEditActivity" />
|
android:name="com.google.android.apps.mytracks.TrackEditActivity" />
|
||||||
@@ -210,6 +207,14 @@ limitations under the License.
|
|||||||
<activity android:name="com.google.android.apps.mytracks.io.sendtogoogle.AccountChooserActivity" />
|
<activity android:name="com.google.android.apps.mytracks.io.sendtogoogle.AccountChooserActivity" />
|
||||||
<activity android:name="com.google.android.apps.mytracks.io.sendtogoogle.UploadResultActivity" />
|
<activity android:name="com.google.android.apps.mytracks.io.sendtogoogle.UploadResultActivity" />
|
||||||
<activity android:name="com.google.android.apps.mytracks.io.sendtogoogle.UploadServiceChooserActivity" />
|
<activity android:name="com.google.android.apps.mytracks.io.sendtogoogle.UploadServiceChooserActivity" />
|
||||||
|
<activity android:name="com.google.android.apps.mytracks.settings.BackupSettingsActivity" />
|
||||||
|
<activity android:name="com.google.android.apps.mytracks.settings.ChartSettingsActivity" />
|
||||||
|
<activity android:name="com.google.android.apps.mytracks.settings.MapSettingsActivity" />
|
||||||
|
<activity android:name="com.google.android.apps.mytracks.settings.RecordingSettingsActivity" />
|
||||||
|
<activity android:name="com.google.android.apps.mytracks.settings.SensorSettingsActivity" />
|
||||||
|
<activity android:name="com.google.android.apps.mytracks.settings.SettingsActivity" />
|
||||||
|
<activity android:name="com.google.android.apps.mytracks.settings.SharingSettingsActivity" />
|
||||||
|
<activity android:name="com.google.android.apps.mytracks.settings.StatsSettingsActivity" />
|
||||||
<!-- Services -->
|
<!-- Services -->
|
||||||
<service
|
<service
|
||||||
android:exported="false"
|
android:exported="false"
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 286 B |
|
Before Width: | Height: | Size: 275 B |
|
Before Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 1.3 KiB |
@@ -1,66 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<!--
|
|
||||||
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.
|
|
||||||
-->
|
|
||||||
<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:drawableLeft="@drawable/x_axis"
|
|
||||||
android:text="@string/chart_settings_x_axis"
|
|
||||||
style="@style/TextLarge.WithIcon" />
|
|
||||||
<RadioGroup
|
|
||||||
android:id="@+id/chart_settings_x"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_width="wrap_content" >
|
|
||||||
<RadioButton
|
|
||||||
android:id="@+id/chart_settings_by_distance"
|
|
||||||
android:text="@string/chart_settings_by_distance"
|
|
||||||
style="@style/TextMedium" />
|
|
||||||
<RadioButton
|
|
||||||
android:id="@+id/chart_settings_by_time"
|
|
||||||
android:text="@string/chart_settings_by_time"
|
|
||||||
style="@style/TextMedium" />
|
|
||||||
</RadioGroup>
|
|
||||||
<TextView
|
|
||||||
android:drawableLeft="@drawable/y_axis"
|
|
||||||
android:text="@string/chart_settings_y_axis"
|
|
||||||
style="@style/TextLarge.WithIcon" />
|
|
||||||
<CheckBox
|
|
||||||
android:id="@+id/chart_settings_elevation"
|
|
||||||
android:text="@string/stats_elevation"
|
|
||||||
style="@style/TextMedium" />
|
|
||||||
<CheckBox
|
|
||||||
android:id="@+id/chart_settings_speed"
|
|
||||||
android:text="@string/stats_speed"
|
|
||||||
style="@style/TextMedium" />
|
|
||||||
<CheckBox
|
|
||||||
android:id="@+id/chart_settings_power"
|
|
||||||
android:text="@string/sensor_state_power"
|
|
||||||
style="@style/TextMedium" />
|
|
||||||
<CheckBox
|
|
||||||
android:id="@+id/chart_settings_cadence"
|
|
||||||
android:text="@string/sensor_state_cadence"
|
|
||||||
style="@style/TextMedium" />
|
|
||||||
<CheckBox
|
|
||||||
android:id="@+id/chart_settings_heart_rate"
|
|
||||||
android:text="@string/sensor_state_heart_rate"
|
|
||||||
style="@style/TextMedium" />
|
|
||||||
</LinearLayout>
|
|
||||||
</ScrollView>
|
|
||||||
@@ -1,56 +0,0 @@
|
|||||||
<?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" >
|
|
||||||
<LinearLayout
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_width="fill_parent"
|
|
||||||
android:orientation="vertical"
|
|
||||||
android:padding="8dp" >
|
|
||||||
<TextView
|
|
||||||
android:text="@string/stats_settings_time"
|
|
||||||
style="@style/TextLarge" />
|
|
||||||
<RadioGroup
|
|
||||||
android:id="@+id/stats_settings_time"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_width="wrap_content" >
|
|
||||||
<RadioButton
|
|
||||||
android:id="@+id/stats_settings_total_time"
|
|
||||||
android:text="@string/stats_total_time"
|
|
||||||
style="@style/TextMedium" />
|
|
||||||
<RadioButton
|
|
||||||
android:id="@+id/stats_settings_moving_time"
|
|
||||||
android:text="@string/stats_moving_time"
|
|
||||||
style="@style/TextMedium" />
|
|
||||||
</RadioGroup>
|
|
||||||
<TextView
|
|
||||||
android:text="@string/stats_settings_show"
|
|
||||||
style="@style/TextLarge" />
|
|
||||||
<CheckBox
|
|
||||||
android:id="@+id/stats_settings_elevation"
|
|
||||||
android:text="@string/stats_elevation"
|
|
||||||
style="@style/TextMedium" />
|
|
||||||
<CheckBox
|
|
||||||
android:id="@+id/stats_settings_grade"
|
|
||||||
android:text="@string/stats_settings_grade"
|
|
||||||
style="@style/TextMedium" />
|
|
||||||
<CheckBox
|
|
||||||
android:id="@+id/stats_settings_coordinate"
|
|
||||||
android:text="@string/stats_settings_coordinate"
|
|
||||||
style="@style/TextMedium" />
|
|
||||||
</LinearLayout>
|
|
||||||
</ScrollView>
|
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
<?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.
|
||||||
|
-->
|
||||||
|
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
|
||||||
|
<item
|
||||||
|
android:icon="@drawable/menu_satellite_mode"
|
||||||
|
android:id="@+id/map_satellite_mode"
|
||||||
|
android:orderInCategory="6"/>
|
||||||
|
</menu>
|
||||||
@@ -18,21 +18,25 @@ limitations under the License.
|
|||||||
<item
|
<item
|
||||||
android:icon="@drawable/menu_stop_recording"
|
android:icon="@drawable/menu_stop_recording"
|
||||||
android:id="@+id/track_detail_stop_recording"
|
android:id="@+id/track_detail_stop_recording"
|
||||||
|
android:orderInCategory="1"
|
||||||
android:showAsAction="ifRoom"
|
android:showAsAction="ifRoom"
|
||||||
android:title="@string/menu_stop_recording"/>
|
android:title="@string/menu_stop_recording"/>
|
||||||
<item
|
<item
|
||||||
android:icon="@drawable/menu_insert_marker"
|
android:icon="@drawable/menu_insert_marker"
|
||||||
android:id="@+id/track_detail_insert_marker"
|
android:id="@+id/track_detail_insert_marker"
|
||||||
|
android:orderInCategory="2"
|
||||||
android:showAsAction="ifRoom"
|
android:showAsAction="ifRoom"
|
||||||
android:title="@string/menu_insert_marker"/>
|
android:title="@string/menu_insert_marker"/>
|
||||||
<item
|
<item
|
||||||
android:icon="@drawable/menu_play"
|
android:icon="@drawable/menu_play"
|
||||||
android:id="@+id/track_detail_play"
|
android:id="@+id/track_detail_play"
|
||||||
|
android:orderInCategory="3"
|
||||||
android:showAsAction="ifRoom"
|
android:showAsAction="ifRoom"
|
||||||
android:title="@string/menu_play"/>
|
android:title="@string/menu_play"/>
|
||||||
<item
|
<item
|
||||||
android:icon="@drawable/menu_share"
|
android:icon="@drawable/menu_share"
|
||||||
android:id="@+id/track_detail_share"
|
android:id="@+id/track_detail_share"
|
||||||
|
android:orderInCategory="4"
|
||||||
android:showAsAction="ifRoom"
|
android:showAsAction="ifRoom"
|
||||||
android:title="@string/menu_share">
|
android:title="@string/menu_share">
|
||||||
<menu>
|
<menu>
|
||||||
@@ -51,15 +55,19 @@ limitations under the License.
|
|||||||
<item
|
<item
|
||||||
android:icon="@drawable/menu_markers"
|
android:icon="@drawable/menu_markers"
|
||||||
android:id="@+id/track_detail_markers"
|
android:id="@+id/track_detail_markers"
|
||||||
|
android:orderInCategory="5"
|
||||||
android:showAsAction="ifRoom"
|
android:showAsAction="ifRoom"
|
||||||
android:title="@string/menu_markers"/>
|
android:title="@string/menu_markers"/>
|
||||||
|
<!-- android:orderInCategory="6" is in map.xml -->
|
||||||
<item
|
<item
|
||||||
android:icon="@drawable/menu_send_google"
|
android:icon="@drawable/menu_send_google"
|
||||||
android:id="@+id/track_detail_send_google"
|
android:id="@+id/track_detail_send_google"
|
||||||
|
android:orderInCategory="7"
|
||||||
android:title="@string/menu_send_google"/>
|
android:title="@string/menu_send_google"/>
|
||||||
<item
|
<item
|
||||||
android:icon="@drawable/menu_save"
|
android:icon="@drawable/menu_save"
|
||||||
android:id="@+id/track_detail_save"
|
android:id="@+id/track_detail_save"
|
||||||
|
android:orderInCategory="8"
|
||||||
android:title="@string/menu_save">
|
android:title="@string/menu_save">
|
||||||
<menu>
|
<menu>
|
||||||
<item android:id="@+id/track_detail_save_gpx"/>
|
<item android:id="@+id/track_detail_save_gpx"/>
|
||||||
@@ -71,33 +79,26 @@ limitations under the License.
|
|||||||
<item
|
<item
|
||||||
android:icon="@drawable/menu_edit"
|
android:icon="@drawable/menu_edit"
|
||||||
android:id="@+id/track_detail_edit"
|
android:id="@+id/track_detail_edit"
|
||||||
|
android:orderInCategory="9"
|
||||||
android:title="@string/menu_edit"/>
|
android:title="@string/menu_edit"/>
|
||||||
<item
|
<item
|
||||||
android:icon="@drawable/menu_delete"
|
android:icon="@drawable/menu_delete"
|
||||||
android:id="@+id/track_detail_delete"
|
android:id="@+id/track_detail_delete"
|
||||||
|
android:orderInCategory="10"
|
||||||
android:title="@string/menu_delete"/>
|
android:title="@string/menu_delete"/>
|
||||||
<item
|
|
||||||
android:icon="@drawable/menu_satellite_mode"
|
|
||||||
android:id="@+id/track_detail_satellite_mode"
|
|
||||||
android:title="@string/menu_satellite_mode"/>
|
|
||||||
<item
|
<item
|
||||||
android:icon="@drawable/menu_sensor_state"
|
android:icon="@drawable/menu_sensor_state"
|
||||||
android:id="@+id/track_detail_sensor_state"
|
android:id="@+id/track_detail_sensor_state"
|
||||||
|
android:orderInCategory="11"
|
||||||
android:title="@string/menu_sensor_state"/>
|
android:title="@string/menu_sensor_state"/>
|
||||||
<item
|
|
||||||
android:icon="@drawable/menu_chart_settings"
|
|
||||||
android:id="@+id/track_detail_chart_settings"
|
|
||||||
android:title="@string/menu_chart_settings"/>
|
|
||||||
<item
|
|
||||||
android:icon="@drawable/menu_stats_settings"
|
|
||||||
android:id="@+id/track_detail_stats_settings"
|
|
||||||
android:title="@string/menu_stats_settings"/>
|
|
||||||
<item
|
<item
|
||||||
android:icon="@drawable/menu_settings"
|
android:icon="@drawable/menu_settings"
|
||||||
android:id="@+id/track_detail_settings"
|
android:id="@+id/track_detail_settings"
|
||||||
|
android:orderInCategory="12"
|
||||||
android:title="@string/menu_settings"/>
|
android:title="@string/menu_settings"/>
|
||||||
<item
|
<item
|
||||||
android:icon="@drawable/menu_help"
|
android:icon="@drawable/menu_help"
|
||||||
android:id="@+id/track_detail_help"
|
android:id="@+id/track_detail_help"
|
||||||
|
android:orderInCategory="13"
|
||||||
android:title="@string/menu_help"/>
|
android:title="@string/menu_help"/>
|
||||||
</menu>
|
</menu>
|
||||||
@@ -16,7 +16,6 @@ limitations under the License.
|
|||||||
-->
|
-->
|
||||||
<resources>
|
<resources>
|
||||||
<!-- Do not translate any arrays in this file. -->
|
<!-- Do not translate any arrays in this file. -->
|
||||||
|
|
||||||
<string-array name="activity_types">
|
<string-array name="activity_types">
|
||||||
<item>@string/activity_type_airplane</item>
|
<item>@string/activity_type_airplane</item>
|
||||||
<item>@string/activity_type_atv</item>
|
<item>@string/activity_type_atv</item>
|
||||||
@@ -84,35 +83,28 @@ limitations under the License.
|
|||||||
<item>@string/activity_type_water_skiing</item>
|
<item>@string/activity_type_water_skiing</item>
|
||||||
<item>@string/activity_type_wind_surfing</item>
|
<item>@string/activity_type_wind_surfing</item>
|
||||||
</string-array>
|
</string-array>
|
||||||
|
<string-array name="auto_resume_track_timeout_values">
|
||||||
<string-array name="display_track_color_options">
|
|
||||||
<item>@string/settings_display_track_color_single</item>
|
|
||||||
<item>@string/settings_display_track_color_fixed</item>
|
|
||||||
<item>@string/settings_display_track_color_dynamic</item>
|
|
||||||
</string-array>
|
|
||||||
|
|
||||||
<string-array name="display_track_color_values">
|
|
||||||
<item>@string/display_track_color_value_none</item>
|
|
||||||
<item>@string/display_track_color_value_fixed</item>
|
|
||||||
<item>@string/display_track_color_value_dynamic</item>
|
|
||||||
</string-array>
|
|
||||||
|
|
||||||
<string-array name="file_types">
|
|
||||||
<item>GPX</item>
|
|
||||||
<item>KML</item>
|
|
||||||
<item>CSV</item>
|
|
||||||
<item>TCX</item>
|
|
||||||
</string-array>
|
|
||||||
|
|
||||||
<string-array name="recording_auto_resume_timeout_values">
|
|
||||||
<item>0</item>
|
<item>0</item>
|
||||||
<item>5</item>
|
<item>5</item>
|
||||||
<item>10</item>
|
<item>10</item>
|
||||||
<item>15</item>
|
<item>15</item>
|
||||||
<item>-1</item>
|
<item>-1</item>
|
||||||
</string-array>
|
</string-array>
|
||||||
|
<string-array name="file_types">
|
||||||
<string-array name="recording_distance_values">
|
<item>GPX</item>
|
||||||
|
<item>KML</item>
|
||||||
|
<item>CSV</item>
|
||||||
|
<item>TCX</item>
|
||||||
|
</string-array>
|
||||||
|
<string-array name="max_recording_distance_values">
|
||||||
|
<item>50</item>
|
||||||
|
<item>100</item>
|
||||||
|
<item>200</item>
|
||||||
|
<item>500</item>
|
||||||
|
<item>1000</item>
|
||||||
|
<item>5000</item>
|
||||||
|
</string-array>
|
||||||
|
<string-array name="min_recording_distance_values">
|
||||||
<item>1</item>
|
<item>1</item>
|
||||||
<item>2</item>
|
<item>2</item>
|
||||||
<item>3</item>
|
<item>3</item>
|
||||||
@@ -121,20 +113,7 @@ limitations under the License.
|
|||||||
<item>10</item>
|
<item>10</item>
|
||||||
<item>100</item>
|
<item>100</item>
|
||||||
</string-array>
|
</string-array>
|
||||||
|
<string-array name="min_recording_interval_values">
|
||||||
<string-array name="recording_gps_accuracy_values">
|
|
||||||
<item>10</item>
|
|
||||||
<item>20</item>
|
|
||||||
<item>50</item>
|
|
||||||
<item>100</item>
|
|
||||||
<item>200</item>
|
|
||||||
<item>500</item>
|
|
||||||
<item>1000</item>
|
|
||||||
<item>2000</item>
|
|
||||||
<item>5000</item>
|
|
||||||
</string-array>
|
|
||||||
|
|
||||||
<string-array name="recording_interval_values">
|
|
||||||
<item>-2</item>
|
<item>-2</item>
|
||||||
<item>-1</item>
|
<item>-1</item>
|
||||||
<item>0</item>
|
<item>0</item>
|
||||||
@@ -152,66 +131,77 @@ limitations under the License.
|
|||||||
<item>900</item>
|
<item>900</item>
|
||||||
<item>1800</item>
|
<item>1800</item>
|
||||||
</string-array>
|
</string-array>
|
||||||
|
<string-array name="min_required_accuracy_values">
|
||||||
<string-array name="recording_task_frequency_values">
|
|
||||||
<item>0</item>
|
|
||||||
<item>-100</item>
|
|
||||||
<item>-50</item>
|
|
||||||
<item>-25</item>
|
|
||||||
<item>-10</item>
|
|
||||||
<item>-5</item>
|
|
||||||
<item>-1</item>
|
|
||||||
<item>60</item>
|
|
||||||
<item>30</item>
|
|
||||||
<item>15</item>
|
|
||||||
<item>10</item>
|
<item>10</item>
|
||||||
<item>5</item>
|
<item>20</item>
|
||||||
<item>2</item>
|
|
||||||
<item>1</item>
|
|
||||||
</string-array>
|
|
||||||
|
|
||||||
<string-array name="recording_track_distance_values">
|
|
||||||
<item>50</item>
|
<item>50</item>
|
||||||
<item>100</item>
|
<item>100</item>
|
||||||
<item>200</item>
|
<item>200</item>
|
||||||
<item>500</item>
|
<item>500</item>
|
||||||
<item>1000</item>
|
<item>1000</item>
|
||||||
|
<item>2000</item>
|
||||||
<item>5000</item>
|
<item>5000</item>
|
||||||
</string-array>
|
</string-array>
|
||||||
|
<string-array name="periodic_task_values">
|
||||||
<string-array name="sensor_type_ant_values">
|
<item>0</item>
|
||||||
<item>@string/sensor_type_value_ant</item>
|
<item>1</item>
|
||||||
<item>@string/sensor_type_value_srm_ant_bridge</item>
|
<item>2</item>
|
||||||
|
<item>5</item>
|
||||||
|
<item>10</item>
|
||||||
|
<item>15</item>
|
||||||
|
<item>30</item>
|
||||||
|
<item>60</item>
|
||||||
|
<item>-1</item>
|
||||||
|
<item>-5</item>
|
||||||
|
<item>-10</item>
|
||||||
|
<item>-25</item>
|
||||||
|
<item>-50</item>
|
||||||
|
<item>-100</item>
|
||||||
</string-array>
|
</string-array>
|
||||||
|
<string-array name="sensor_type_all_options">
|
||||||
<string-array name="sensor_type_options">
|
|
||||||
<item>@string/settings_sensor_type_none</item>
|
<item>@string/settings_sensor_type_none</item>
|
||||||
<item>@string/settings_sensor_type_ant</item>
|
<item>@string/settings_sensor_type_ant</item>
|
||||||
<item>@string/settings_sensor_type_srm</item>
|
<item>@string/settings_sensor_type_srm</item>
|
||||||
<item>@string/settings_sensor_type_polar</item>
|
<item>@string/settings_sensor_type_polar</item>
|
||||||
<item>@string/settings_sensor_type_zephyr</item>
|
<item>@string/settings_sensor_type_zephyr</item>
|
||||||
</string-array>
|
</string-array>
|
||||||
|
<string-array name="sensor_type_all_values">
|
||||||
<string-array name="sensor_type_values">
|
|
||||||
<item>@string/sensor_type_value_none</item>
|
<item>@string/sensor_type_value_none</item>
|
||||||
<item>@string/sensor_type_value_ant</item>
|
<item>@string/sensor_type_value_ant</item>
|
||||||
<item>@string/sensor_type_value_srm_ant_bridge</item>
|
<item>@string/sensor_type_value_srm_ant_bridge</item>
|
||||||
<item>@string/sensor_type_value_polar</item>
|
<item>@string/sensor_type_value_polar</item>
|
||||||
<item>@string/sensor_type_value_zephyr</item>
|
<item>@string/sensor_type_value_zephyr</item>
|
||||||
</string-array>
|
</string-array>
|
||||||
|
<string-array name="sensor_type_bluetooth_options">
|
||||||
<string-array name="settings_recording_track_name_options">
|
<item>@string/settings_sensor_type_none</item>
|
||||||
|
<item>@string/settings_sensor_type_polar</item>
|
||||||
|
<item>@string/settings_sensor_type_zephyr</item>
|
||||||
|
</string-array>
|
||||||
|
<string-array name="sensor_type_bluetooth_values">
|
||||||
|
<item>@string/sensor_type_value_none</item>
|
||||||
|
<item>@string/sensor_type_value_polar</item>
|
||||||
|
<item>@string/sensor_type_value_zephyr</item>
|
||||||
|
</string-array>
|
||||||
|
<string-array name="track_color_mode_options">
|
||||||
|
<item>@string/settings_map_track_color_mode_single</item>
|
||||||
|
<item>@string/settings_map_track_color_mode_fixed</item>
|
||||||
|
<item>@string/settings_map_track_color_mode_dynamic</item>
|
||||||
|
</string-array>
|
||||||
|
<string-array name="track_color_mode_values">
|
||||||
|
<item>@string/settings_map_track_color_mode_single_value</item>
|
||||||
|
<item>@string/settings_map_track_color_mode_fixed_value</item>
|
||||||
|
<item>@string/settings_map_track_color_mode_dynamic_value</item>
|
||||||
|
</string-array>
|
||||||
|
<string-array name="track_name_options">
|
||||||
<item>@string/settings_recording_track_name_date_local_option</item>
|
<item>@string/settings_recording_track_name_date_local_option</item>
|
||||||
<item>@string/settings_recording_track_name_date_iso_8601_option</item>
|
<item>@string/settings_recording_track_name_date_iso_8601_option</item>
|
||||||
<item>@string/settings_recording_track_name_number_option</item>
|
<item>@string/settings_recording_track_name_number_option</item>
|
||||||
</string-array>
|
</string-array>
|
||||||
|
<string-array name="track_name_values">
|
||||||
<string-array name="settings_recording_track_name_values">
|
|
||||||
<item>@string/settings_recording_track_name_date_local_value</item>
|
<item>@string/settings_recording_track_name_date_local_value</item>
|
||||||
<item>@string/settings_recording_track_name_date_iso_8601_value</item>
|
<item>@string/settings_recording_track_name_date_iso_8601_value</item>
|
||||||
<item>@string/settings_recording_track_name_number_value</item>
|
<item>@string/settings_recording_track_name_number_value</item>
|
||||||
</string-array>
|
</string-array>
|
||||||
|
|
||||||
<string-array name="waypoint_types">
|
<string-array name="waypoint_types">
|
||||||
<item>@string/waypoint_type_atm</item>
|
<item>@string/waypoint_type_atm</item>
|
||||||
<item>@string/waypoint_type_bank</item>
|
<item>@string/waypoint_type_bank</item>
|
||||||
|
|||||||
@@ -16,36 +16,25 @@ limitations under the License.
|
|||||||
-->
|
-->
|
||||||
<resources>
|
<resources>
|
||||||
<!-- DO NOT TRANSLATE ANY STRINGS IN THIS FILE. -->
|
<!-- DO NOT TRANSLATE ANY STRINGS IN THIS FILE. -->
|
||||||
<string name="color_mode_dynamic_percentage_default">25</string>
|
<string name="marker_statistics_icon_url">http://maps.google.com/mapfiles/ms/micons/ylw-pushpin.png</string>
|
||||||
<string name="color_mode_fixed_medium_default">15</string>
|
<string name="marker_waypoint_icon_url">http://maps.google.com/mapfiles/ms/micons/blue-pushpin.png</string>
|
||||||
<string name="color_mode_fixed_slow_default">9</string>
|
<string name="my_tracks_analytics_id">UA-7222692-2</string>
|
||||||
<string name="display_track_color_value_dynamic">DYNAMIC</string>
|
|
||||||
<string name="display_track_color_value_fixed">FIXED</string>
|
|
||||||
<string name="display_track_color_value_none">NONE</string>
|
|
||||||
<string name="marker_statistics_icon_url">
|
|
||||||
http://maps.google.com/mapfiles/ms/micons/ylw-pushpin.png
|
|
||||||
</string>
|
|
||||||
<string name="marker_waypoint_icon_url">
|
|
||||||
http://maps.google.com/mapfiles/ms/micons/blue-pushpin.png
|
|
||||||
</string>
|
|
||||||
<string name="my_tracks_analytics_id">UA-7222692-2</string>
|
|
||||||
<string name="my_tracks_privacy_url">www.google.com/policies/privacy/</string>
|
<string name="my_tracks_privacy_url">www.google.com/policies/privacy/</string>
|
||||||
<string name="my_tracks_recording_service_name">My Tracks Recording Service</string>
|
<string name="my_tracks_recording_service_name">My Tracks Recording Service</string>
|
||||||
<string name="my_tracks_support_url">
|
<string name="my_tracks_support_url">groups.google.com/a/googleproductforums.com/forum/#!categories/maps/mytracks</string>
|
||||||
groups.google.com/a/googleproductforums.com/forum/#!categories/maps/mytracks
|
|
||||||
</string>
|
|
||||||
<string name="my_tracks_web_url">www.google.com/mobile/mytracks</string>
|
<string name="my_tracks_web_url">www.google.com/mobile/mytracks</string>
|
||||||
<string name="permission_notification_value">
|
<string name="permission_notification_value">com.google.android.apps.mytracks.MYTRACKS_NOTIFICATIONS</string>
|
||||||
com.google.android.apps.mytracks.MYTRACKS_NOTIFICATIONS
|
|
||||||
</string>
|
|
||||||
<string name="send_google_docs_url">docs.google.com</string>
|
<string name="send_google_docs_url">docs.google.com</string>
|
||||||
<string name="send_google_fusion_tables_url">google.com/fusiontables</string>
|
<string name="send_google_fusion_tables_url">google.com/fusiontables</string>
|
||||||
<string name="send_google_maps_url">maps.google.com</string>
|
<string name="send_google_maps_url">maps.google.com</string>
|
||||||
<string name="sensor_type_value_ant">ANT</string>
|
<string name="sensor_type_value_ant">ANT</string>
|
||||||
<string name="sensor_type_value_none">NONE</string>
|
<string name="sensor_type_value_none">NONE</string>
|
||||||
<string name="sensor_type_value_polar">POLAR</string>
|
<string name="sensor_type_value_polar">POLAR</string>
|
||||||
<string name="sensor_type_value_srm_ant_bridge">SRM_ANT_BRIDGE</string>
|
<string name="sensor_type_value_srm_ant_bridge">SRM_ANT_BRIDGE</string>
|
||||||
<string name="sensor_type_value_zephyr">ZEPHYR</string>
|
<string name="sensor_type_value_zephyr">ZEPHYR</string>
|
||||||
|
<string name="settings_map_track_color_mode_dynamic_value">DYNAMIC</string>
|
||||||
|
<string name="settings_map_track_color_mode_fixed_value">FIXED</string>
|
||||||
|
<string name="settings_map_track_color_mode_single_value">SINGLE</string>
|
||||||
<string name="settings_recording_track_name_date_iso_8601_value">DATE_ISO_8601</string>
|
<string name="settings_recording_track_name_date_iso_8601_value">DATE_ISO_8601</string>
|
||||||
<string name="settings_recording_track_name_date_local_value">DATE_LOCAL</string>
|
<string name="settings_recording_track_name_date_local_value">DATE_LOCAL</string>
|
||||||
<string name="settings_recording_track_name_number_value">NUMBER</string>
|
<string name="settings_recording_track_name_number_value">NUMBER</string>
|
||||||
@@ -53,4 +42,4 @@ limitations under the License.
|
|||||||
<string name="track_action_save">android.intent.action.SAVE</string>
|
<string name="track_action_save">android.intent.action.SAVE</string>
|
||||||
<string name="track_action_start">com.google.android.apps.mytracks.START_NEW_TRACK</string>
|
<string name="track_action_start">com.google.android.apps.mytracks.START_NEW_TRACK</string>
|
||||||
<string name="value_unknown">-</string>
|
<string name="value_unknown">-</string>
|
||||||
</resources>
|
</resources>
|
||||||
@@ -15,18 +15,22 @@ See the License for the specific language governing permissions and
|
|||||||
limitations under the License.
|
limitations under the License.
|
||||||
-->
|
-->
|
||||||
<resources>
|
<resources>
|
||||||
|
<!-- Keys for persisted preferences. Sorted alphabetically. DO NOT TRANSLATE. -->
|
||||||
<!-- Keys for persisted preferences. Sorted alphabetically. - DO NOT TRANSLATE -->
|
|
||||||
<string name="allow_access_key">allowAccess</string>
|
<string name="allow_access_key">allowAccess</string>
|
||||||
<string name="announcement_frequency_key">announcementFrequency</string>
|
<string name="announcement_frequency_key">announcementFrequency</string>
|
||||||
<string name="ant_cadence_sensor_id_key">antCadenceSensorId</string>
|
<string name="ant_cadence_sensor_id_key">antCadenceSensorId</string>
|
||||||
<string name="ant_cadence_speed_sensor_id_key">antCadenceSpeedSensorId</string>
|
<string name="ant_cadence_speed_sensor_id_key">antCadenceSpeedSensorId</string>
|
||||||
<string name="ant_heart_rate_sensor_id_key">antHeartRateSensorId</string>
|
<string name="ant_heart_rate_sensor_id_key">antHeartRateSensorId</string>
|
||||||
<string name="ant_srm_bridge_sensor_id_key">antSRMBridgeSensorId</string>
|
<string name="ant_srm_bridge_sensor_id_key">antSrmBridgeSensorId</string>
|
||||||
<string name="auto_resume_track_current_retry_key">autoResumeTrackCurrentRetry</string>
|
<string name="auto_resume_track_current_retry_key">autoResumeTrackCurrentRetry</string>
|
||||||
<string name="auto_resume_track_timeout_key">autoResumeTrackTimeout</string>
|
<string name="auto_resume_track_timeout_key">autoResumeTrackTimeout</string>
|
||||||
<string name="bluetooth_pairing_key">bluetoothPairing</string>
|
|
||||||
<string name="bluetooth_sensor_key">bluetoothSensor</string>
|
<string name="bluetooth_sensor_key">bluetoothSensor</string>
|
||||||
|
<string name="chart_by_distance_key">chartByDistance</string>
|
||||||
|
<string name="chart_show_cadence_key">chartShowCadence</string>
|
||||||
|
<string name="chart_show_elevation_key">chartShowElevation</string>
|
||||||
|
<string name="chart_show_heart_rate_key">chartShowHeartRate</string>
|
||||||
|
<string name="chart_show_power_key">chartShowPower</string>
|
||||||
|
<string name="chart_show_speed_key">chartShowSpeed</string>
|
||||||
<string name="default_activity_key">defaultActivity</string>
|
<string name="default_activity_key">defaultActivity</string>
|
||||||
<string name="default_map_public_key">defaultMapPublic</string>
|
<string name="default_map_public_key">defaultMapPublic</string>
|
||||||
<string name="max_recording_distance_key">maxRecordingDistance</string>
|
<string name="max_recording_distance_key">maxRecordingDistance</string>
|
||||||
@@ -51,20 +55,28 @@ limitations under the License.
|
|||||||
<string name="stats_show_coordinate_key">statsShowCoordinate</string>
|
<string name="stats_show_coordinate_key">statsShowCoordinate</string>
|
||||||
<string name="stats_show_elevation_key">statsShowElevation</string>
|
<string name="stats_show_elevation_key">statsShowElevation</string>
|
||||||
<string name="stats_show_grade_key">statsShowGrade</string>
|
<string name="stats_show_grade_key">statsShowGrade</string>
|
||||||
<string name="stats_show_total_time_key">statsShowTotalTime</string>
|
<string name="stats_use_total_time_key">statsUseTotalTime</string>
|
||||||
<string name="track_color_mode_dynamic_speed_variation_key">trackColorModeDynamicVariation</string>
|
<string name="track_color_mode_medium_key">trackColorModeMedium</string>
|
||||||
<string name="track_color_mode_fixed_speed_medium_display_key">trackColorModeFixedMediumDisplay</string>
|
<string name="track_color_mode_percentage_key">trackColorModePercentage</string>
|
||||||
<string name="track_color_mode_fixed_speed_medium_key">trackColorModeFixedMedium</string>
|
<string name="track_color_mode_slow_key">trackColorModeSlow</string>
|
||||||
<string name="track_color_mode_fixed_speed_slow_display_key">trackColorModeFixedSlowDisplay</string>
|
|
||||||
<string name="track_color_mode_fixed_speed_slow_key">trackColorModeFixedSlow</string>
|
|
||||||
<string name="track_color_mode_key">trackColorMode</string>
|
<string name="track_color_mode_key">trackColorMode</string>
|
||||||
<string name="track_name_key">trackName</string>
|
<string name="track_name_key">trackName</string>
|
||||||
|
<!-- Keys for non-persisted preferences. Sorted alphabetically. DO NOT TRANSLATE. -->
|
||||||
<!-- Keys for non-persisted preferences. Sorted alphabetically. - DO NOT TRANSLATE -->
|
<string name="settings_backup_key">settingsBackup</string>
|
||||||
<string name="ant_options_key">antOptions</string>
|
<string name="settings_backup_now_key">settingsBackupNow</string>
|
||||||
<string name="backup_to_sd_key">backupToSd</string>
|
<string name="settings_backup_restore_key">settingsBackupRestore</string>
|
||||||
<string name="reset_key">resetToDefaults</string>
|
<string name="settings_chart_key">settingsChart</string>
|
||||||
<string name="restore_from_sd_key">restoreFromSd</string>
|
<string name="settings_map_key">settingsMap</string>
|
||||||
<string name="sensor_options_key">sensorOptions</string>
|
<string name="settings_map_medium_display_key">settingsMapMediumDisplay</string>
|
||||||
<string name="track_color_mode_fixed_speed_options_key">trackColorModeFixedOptions</string>
|
<string name="settings_map_percentage_display_key">settingsMapPercentageDisplay</string>
|
||||||
|
<string name="settings_map_slow_display_key">settingsMapSlowDisplay</string>
|
||||||
|
<string name="settings_recording_key">settingsRecording</string>
|
||||||
|
<string name="settings_reset_key">settingsReset</string>
|
||||||
|
<string name="settings_sensor_key">settingsSensor</string>
|
||||||
|
<string name="settings_sensor_ant_key">settingsSensorAnt</string>
|
||||||
|
<string name="settings_sensor_bluetooth_key">settingsSensorBluetooth</string>
|
||||||
|
<string name="settings_sensor_bluetooth_pairing_key">settingsSensorBluetoothPairing</string>
|
||||||
|
<string name="settings_sensor_root_key">settingsSensorRoot</string>
|
||||||
|
<string name="settings_sharing_key">settingsSharing</string>
|
||||||
|
<string name="settings_stats_key">settingsStats</string>
|
||||||
</resources>
|
</resources>
|
||||||
@@ -416,30 +416,6 @@ limitations under the License.
|
|||||||
Record and share your GPS tracks with My Tracks.
|
Record and share your GPS tracks with My Tracks.
|
||||||
</string>
|
</string>
|
||||||
|
|
||||||
<!-- Chart Settings -->
|
|
||||||
<string name="chart_settings_by_distance"
|
|
||||||
translation_description="In the 'Chart settings' dialog, under the 'X axis' section, the radio
|
|
||||||
option to show the charts by distance. The other radio option is to show by time. User can
|
|
||||||
only choose one of the options.">
|
|
||||||
By distance
|
|
||||||
</string>
|
|
||||||
<string name="chart_settings_by_time"
|
|
||||||
translation_description="In the 'Chart settings' dialog, under the 'X axis' section, the radio
|
|
||||||
option to show the charts by time. The other radio option is to show by distance. User can
|
|
||||||
only choose one of the options.">
|
|
||||||
By time
|
|
||||||
</string>
|
|
||||||
<string name="chart_settings_x_axis"
|
|
||||||
translation_description="In the 'Chart settings' dialog, the section label for configuring the X
|
|
||||||
axis.">
|
|
||||||
X axis
|
|
||||||
</string>
|
|
||||||
<string name="chart_settings_y_axis"
|
|
||||||
translation_description="In the 'Chart settings' dialog, the section label for configuring the Y
|
|
||||||
axis.">
|
|
||||||
Y axis
|
|
||||||
</string>
|
|
||||||
|
|
||||||
<!-- Description -->
|
<!-- Description -->
|
||||||
<string name="description_activity_type"
|
<string name="description_activity_type"
|
||||||
translation_description="Activity type description.
|
translation_description="Activity type description.
|
||||||
@@ -1034,10 +1010,6 @@ limitations under the License.
|
|||||||
translation_description="In the menu, to go to the aggregated statistics page.">
|
translation_description="In the menu, to go to the aggregated statistics page.">
|
||||||
Aggregated statistics
|
Aggregated statistics
|
||||||
</string>
|
</string>
|
||||||
<string name="menu_chart_settings"
|
|
||||||
translation_description="In the menu, to change the chart settings.">
|
|
||||||
Chart settings
|
|
||||||
</string>
|
|
||||||
<string name="menu_delete_all"
|
<string name="menu_delete_all"
|
||||||
translation_description="In the menu, to delete all the tracks.">
|
translation_description="In the menu, to delete all the tracks.">
|
||||||
Delete all
|
Delete all
|
||||||
@@ -1141,10 +1113,6 @@ limitations under the License.
|
|||||||
translation_description="In the menu, to show a marker on map.">
|
translation_description="In the menu, to show a marker on map.">
|
||||||
Show on map
|
Show on map
|
||||||
</string>
|
</string>
|
||||||
<string name="menu_stats_settings"
|
|
||||||
translation_description="In the menu, to change the stats settings.">
|
|
||||||
Stats settings
|
|
||||||
</string>
|
|
||||||
<string name="menu_stop_recording"
|
<string name="menu_stop_recording"
|
||||||
translation_description="In the menu, to stop recording a track.">
|
translation_description="In the menu, to stop recording a track.">
|
||||||
Stop recording
|
Stop recording
|
||||||
@@ -1213,23 +1181,6 @@ limitations under the License.
|
|||||||
write data to My Tracks and start/stop My Tracks recording
|
write data to My Tracks and start/stop My Tracks recording
|
||||||
</string>
|
</string>
|
||||||
|
|
||||||
<!-- Preferred Units -->
|
|
||||||
<string name="preferred_units_imperial"
|
|
||||||
translation_description="In the dialog asking the user to choose a preferred units, the option
|
|
||||||
to choose the imperial units.">
|
|
||||||
Imperial (mi, ft)
|
|
||||||
</string>
|
|
||||||
<string name="preferred_units_metric"
|
|
||||||
translation_description="In the dialog asking the user to choose a preferred units, the option
|
|
||||||
to choose the metric units.">
|
|
||||||
Metric (km, m)
|
|
||||||
</string>
|
|
||||||
<string name="preferred_units_title"
|
|
||||||
translation_description="The title of the dialog asking the user to choose a preferred units,
|
|
||||||
metric or imperial.">
|
|
||||||
Preferred Units
|
|
||||||
</string>
|
|
||||||
|
|
||||||
<!-- Save All -->
|
<!-- Save All -->
|
||||||
<string name="save_all_error"
|
<string name="save_all_error"
|
||||||
translation_description="When saving all the tracks to the SD card, a toast message indicating
|
translation_description="When saving all the tracks to the SD card, a toast message indicating
|
||||||
@@ -1480,7 +1431,7 @@ limitations under the License.
|
|||||||
Sending
|
Sending
|
||||||
</string>
|
</string>
|
||||||
|
|
||||||
<!-- Settings -->
|
<!-- Settings Backup -->
|
||||||
<string name="settings_backup"
|
<string name="settings_backup"
|
||||||
translation_description="In the 'Settings' page, the option to change the data backup related
|
translation_description="In the 'Settings' page, the option to change the data backup related
|
||||||
settings.
|
settings.
|
||||||
@@ -1541,142 +1492,87 @@ limitations under the License.
|
|||||||
the SD card.">
|
the SD card.">
|
||||||
Restore all tracks and settings from the SD card.
|
Restore all tracks and settings from the SD card.
|
||||||
</string>
|
</string>
|
||||||
<string name="settings_backup_sd_card"
|
|
||||||
translation_description="In the 'Backup' settings, the section header for configuring backup to
|
|
||||||
the SD card.
|
|
||||||
|
|
||||||
Character limit: ~40 (1 line)">
|
<!-- Settings Chart -->
|
||||||
SD card
|
<string name="settings_chart_by_distance"
|
||||||
|
translation_description="In the 'Chart' settings, the option to display the x axis by
|
||||||
|
distance.">
|
||||||
|
By distance
|
||||||
|
</string>
|
||||||
|
<string name="settings_chart_by_time"
|
||||||
|
translation_description="In the 'Chart' settings, the option to display the x axis by time.">
|
||||||
|
By time
|
||||||
|
</string>
|
||||||
|
<string name="settings_chart_x_axis"
|
||||||
|
translation_description="In the 'Chart' setttings, the option to change the x axis display,
|
||||||
|
either by distance or by time.">
|
||||||
|
X axis
|
||||||
</string>
|
</string>
|
||||||
<string name="settings_display"
|
|
||||||
translation_description="In the 'Settings' page, the option to change the display related
|
|
||||||
settings.
|
|
||||||
|
|
||||||
Character limit: ~26 (1 line)">
|
<!-- Settings Map -->
|
||||||
Display
|
<string name="settings_map_medium"
|
||||||
|
translation_description="In the 'Map' settings, under the 'Fixed thresholds' configurations, the
|
||||||
|
option for configuring the top medium speed.">
|
||||||
|
Top medium speed
|
||||||
</string>
|
</string>
|
||||||
<string name="settings_display_metric"
|
<string name="settings_map_percentage"
|
||||||
translation_description="In the 'Display' settings, the checkbox option to use the metric units.
|
translation_description="In the 'Map' settings, under the 'Dynamic thresholds' configurations,
|
||||||
|
the option for configuring the percentage from the average speed for the medium speed range.">
|
||||||
Character limit: ~23 (1 line)">
|
Percentage from average
|
||||||
Use metric
|
|
||||||
</string>
|
</string>
|
||||||
<string name="settings_display_metric_summary_off"
|
<string name="settings_map_percentage_summary"
|
||||||
translation_description="In the 'Display' settings, the summary for the 'Use metric'
|
translation_description="In the 'Map' settings, under the 'Dynamic thresholds' configurations,
|
||||||
checkbox when it is unchecked explaining using the imperial units to display distances.">
|
the summary for the 'Percentage from average' option explaining that it sets the percentage
|
||||||
Use imperial units to display distances.
|
from the average speed for the medium speed range. The 'Dynamic thresholds' track color mode
|
||||||
</string>
|
uses different colors to color a track depending on whether the speed is above, in, or below
|
||||||
<string name="settings_display_metric_summary_on"
|
|
||||||
translation_description="In the 'Display' settings, the summary for the 'Use metric'
|
|
||||||
checkbox when it is checked explaining using the metric units to display distances.">
|
|
||||||
Use metric units to display distances.
|
|
||||||
</string>
|
|
||||||
<string name="settings_display_speed"
|
|
||||||
translation_description="In the 'Display' settings, the checkbox option to display speed (e.g.,
|
|
||||||
5 miles per hour) instead of pace (e.g., 0.2 hours per mile).
|
|
||||||
|
|
||||||
Character limit: ~23 (1 line)">
|
|
||||||
Display speed
|
|
||||||
</string>
|
|
||||||
<string name="settings_display_speed_summary_off"
|
|
||||||
translation_description="In the 'Display' settings, the summary for the 'Display speed' checkbox
|
|
||||||
when it is unchecked explaining that pace (e.g., 0.2 hours per mile) will be used instead of
|
|
||||||
speed (e.g., 5 miles per hour).">
|
|
||||||
Display pace (e.g., hours/mile).
|
|
||||||
</string>
|
|
||||||
<string name="settings_display_speed_summary_on"
|
|
||||||
translation_description="In the 'Display' settings, the summary for the 'Display speed' checkbox
|
|
||||||
when it is checked explaining that speed (e.g., 5 miles per hour) will be used instead of pace
|
|
||||||
(e.g., 0.2 hours per mile).">
|
|
||||||
Display speed (e.g., miles/hour).
|
|
||||||
</string>
|
|
||||||
<string name="settings_display_track_color"
|
|
||||||
translation_description="In the 'Display' settings, the dropdown option to choose a track color
|
|
||||||
mode for how to use different colors to color a track based on slow, medium, and fast speed.
|
|
||||||
|
|
||||||
Character limit: ~23 (1 line)">
|
|
||||||
Color mode
|
|
||||||
</string>
|
|
||||||
<string name="settings_display_track_color_dynamic"
|
|
||||||
translation_description="In the 'Display' settings, for the 'Color mode' dropdown, the
|
|
||||||
option to use different colors to color a track based on dynamically determined speed
|
|
||||||
thresholds. E.g., use one color when the speed is below the slow speed threshold.
|
|
||||||
|
|
||||||
Character limit: ~21 (1 line)">
|
|
||||||
Dynamic thresholds
|
|
||||||
</string>
|
|
||||||
<string name="settings_display_track_color_dynamic_medium"
|
|
||||||
translation_description="In the 'Display' settings, under the 'Dynamic thresholds'
|
|
||||||
configurations, the option for configuring the percentage from the average speed for the
|
|
||||||
medium speed range. The color mode will use different colors to color a track depending
|
|
||||||
on whether the speed is above, in, or below the medium speed range.
|
|
||||||
|
|
||||||
Character limit: ~23 (1 line)">
|
|
||||||
Percentage
|
|
||||||
</string>
|
|
||||||
<string name="settings_display_track_color_dynamic_medium_summary"
|
|
||||||
translation_description="In the 'Display' settings, under the 'Dynamic thresholds'
|
|
||||||
configurations, the summary for the 'Percentage' option explaining that it sets
|
|
||||||
the percentage from the average speed for the medium speed range. The color mode will
|
|
||||||
use different colors to color a track depending on whether the speed is above, in, or below
|
|
||||||
the medium speed range.">
|
the medium speed range.">
|
||||||
Percentage from the average speed for the medium speed range.
|
Percentage from the average speed for the medium speed range.
|
||||||
</string>
|
</string>
|
||||||
<string name="settings_display_track_color_fixed"
|
<string name="settings_map_slow"
|
||||||
translation_description="In the 'Display' settings, for the 'Color mode' dropdown, the
|
translation_description="In the 'Map' settings, under the 'Fixed thresholds' configurations,
|
||||||
option to use different colors to color a track based on fixed speed thresholds. E.g., use
|
the option for configuring the top slow speed.">
|
||||||
one color when the speed is below the slow speed threshold.
|
Top slow speed
|
||||||
|
</string>
|
||||||
Character limit: ~21 (1 line)">
|
<string name="settings_map_track_color_mode"
|
||||||
|
translation_description="In the 'Map' settings, the option to select a track color mode for how
|
||||||
|
to use different colors to color a track based on slow, medium, and fast speed.">
|
||||||
|
Track color mode
|
||||||
|
</string>
|
||||||
|
<string name="settings_map_track_color_mode_dynamic"
|
||||||
|
translation_description="In the 'Map' settings, for the 'Track color mode' dropdown, the
|
||||||
|
option to use different colors to color a track based on dynamically determined speed
|
||||||
|
thresholds.">
|
||||||
|
Dynamic thresholds
|
||||||
|
</string>
|
||||||
|
<string name="settings_map_track_color_mode_fixed"
|
||||||
|
translation_description="In the 'Map' settings, for the 'Track color mode' dropdown, the
|
||||||
|
option to use different colors to color a track based on fixed speed thresholds.">
|
||||||
Fixed thresholds
|
Fixed thresholds
|
||||||
</string>
|
</string>
|
||||||
<string name="settings_display_track_color_fixed_medium"
|
<string name="settings_map_track_color_mode_single"
|
||||||
translation_description="In the 'Display' settings, under the 'Fixed thresholds' configurations,
|
translation_description="In the 'Map' settings, for the 'Track color mode' dropdown, the
|
||||||
the option for configuring the medium speed threshold. Thus any speed lower than the
|
option to use a single color for all speeds.">
|
||||||
threshold but greater than the slow speed threshold will be colored by the medium speed
|
|
||||||
color.
|
|
||||||
|
|
||||||
Character limit: ~23 (1 line)">
|
|
||||||
Medium speed
|
|
||||||
</string>
|
|
||||||
<string name="settings_display_track_color_fixed_medium_summary"
|
|
||||||
translation_description="In the 'Display' settings, under the 'Fixed thresholds' configurations,
|
|
||||||
the summary for the 'Medium speed' option explaining that it sets a cutoff speed
|
|
||||||
for the medium speed color.">
|
|
||||||
Medium speed top value.
|
|
||||||
</string>
|
|
||||||
<string name="settings_display_track_color_fixed_slow"
|
|
||||||
translation_description="In the 'Display' settings, under the 'Fixed thresholds' configurations,
|
|
||||||
the option for configuring the slow speed threshold. Thus any speed lower than the threshold
|
|
||||||
will be colored by the slow speed color.
|
|
||||||
|
|
||||||
Character limit: ~23 (1 line)">
|
|
||||||
Slow speed
|
|
||||||
</string>
|
|
||||||
<string name="settings_display_track_color_fixed_slow_summary"
|
|
||||||
translation_description="In the 'Display' settings, under the 'Fixed thresholds' configurations,
|
|
||||||
the summary for the 'Slow speed' option explaining that it sets a cutoff speed for
|
|
||||||
the slow speed color.">
|
|
||||||
Slow speed top value.
|
|
||||||
</string>
|
|
||||||
<string name="settings_display_track_color_single"
|
|
||||||
translation_description="In the 'Display' settings, for the 'Color mode' dropdown, the
|
|
||||||
option to use a single color for all speeds.
|
|
||||||
|
|
||||||
Character limit: ~21 (1 line)">
|
|
||||||
Single color
|
Single color
|
||||||
</string>
|
</string>
|
||||||
<string name="settings_display_track_color_summary"
|
<string name="settings_map_track_color_mode_summary"
|
||||||
translation_description="In the 'Display' settings, the summary for the 'Color mode'
|
translation_description="In the 'Map' settings, the summary for the 'Track color mode' option
|
||||||
dropdown explaining that it configures how colors are used to color a track based on
|
explaining that it configures how colors are used to color a track based on slow, medium, and
|
||||||
slow, medium, and fast speed.">
|
fast speed.">
|
||||||
The way to color a track based on slow, medium, and fast speed.
|
The way to color a track based on slow, medium, and fast speed.
|
||||||
</string>
|
</string>
|
||||||
|
|
||||||
|
<!-- Settings Others -->
|
||||||
|
<string name="settings_show"
|
||||||
|
translation_description="In settings, the section label to show additional values.">
|
||||||
|
Show
|
||||||
|
</string>
|
||||||
<string name="settings_not_while_recording"
|
<string name="settings_not_while_recording"
|
||||||
translation_description="In settings, the summary for an option that is not available during a
|
translation_description="In settings, the summary for an option that is not available during a
|
||||||
track recording.">
|
track recording.">
|
||||||
Not available while recording a track.
|
Not available while recording a track.
|
||||||
</string>
|
</string>
|
||||||
|
|
||||||
|
<!-- Settings Recording -->
|
||||||
<string name="settings_recording"
|
<string name="settings_recording"
|
||||||
translation_description="In the 'Settings' page, the option to change the track recording
|
translation_description="In the 'Settings' page, the option to change the track recording
|
||||||
related settings.
|
related settings.
|
||||||
@@ -1822,6 +1718,8 @@ limitations under the License.
|
|||||||
announcements.">
|
announcements.">
|
||||||
Time/distance between two voice announcements.
|
Time/distance between two voice announcements.
|
||||||
</string>
|
</string>
|
||||||
|
|
||||||
|
<!-- Settings Reset -->
|
||||||
<string name="settings_reset"
|
<string name="settings_reset"
|
||||||
translation_description="In the 'Settings' page, the option to reset everything to the defaults.
|
translation_description="In the 'Settings' page, the option to reset everything to the defaults.
|
||||||
|
|
||||||
@@ -1845,6 +1743,8 @@ limitations under the License.
|
|||||||
explaining reverting all the settings to the default values.">
|
explaining reverting all the settings to the default values.">
|
||||||
Revert all your settings to the default values.
|
Revert all your settings to the default values.
|
||||||
</string>
|
</string>
|
||||||
|
|
||||||
|
<!-- Settings Sensor -->
|
||||||
<string name="settings_sensor"
|
<string name="settings_sensor"
|
||||||
translation_description="In the 'Settings' page, the option to change the sensor related
|
translation_description="In the 'Settings' page, the option to change the sensor related
|
||||||
settings.
|
settings.
|
||||||
@@ -1968,6 +1868,8 @@ limitations under the License.
|
|||||||
Character limit: ~26 (1 line)">
|
Character limit: ~26 (1 line)">
|
||||||
Unpair SRM ANT+ bridge
|
Unpair SRM ANT+ bridge
|
||||||
</string>
|
</string>
|
||||||
|
|
||||||
|
<!-- Settings Sharing -->
|
||||||
<string name="settings_sharing"
|
<string name="settings_sharing"
|
||||||
translation_description="In the 'Settings' page, the option to change the track sharing related
|
translation_description="In the 'Settings' page, the option to change the track sharing related
|
||||||
settings.
|
settings.
|
||||||
@@ -2040,9 +1942,61 @@ limitations under the License.
|
|||||||
sharing a URL with friends.">
|
sharing a URL with friends.">
|
||||||
Remove any descriptive text when sharing a URL with friends.
|
Remove any descriptive text when sharing a URL with friends.
|
||||||
</string>
|
</string>
|
||||||
<string name="settings_title"
|
|
||||||
translation_description="The title of the 'Settings' page.">
|
<!-- Settings Stats -->
|
||||||
My Tracks settings
|
<string name="settings_stats_coordinate"
|
||||||
|
translation_description="In the 'Stats settings, the option to show latitude and longitude.">
|
||||||
|
Latitude/Longitude
|
||||||
|
</string>
|
||||||
|
<string name="settings_stats_grade"
|
||||||
|
translation_description="In the 'Stats settings, the option to show grade. Grade is the amount
|
||||||
|
of inclination to the horizontal, also known as slope or incline.">
|
||||||
|
Grade
|
||||||
|
</string>
|
||||||
|
<string name="settings_stats_rate_pace_imperial"
|
||||||
|
translation_description="In the 'Stats' settings, the option to display pace, with example in
|
||||||
|
imperial units.">
|
||||||
|
Pace (hr/mi)
|
||||||
|
</string>
|
||||||
|
<string name="settings_stats_rate_pace_metric"
|
||||||
|
translation_description="In the 'Stats' settings, the option to display pace, with example in
|
||||||
|
metric units.">
|
||||||
|
Pace (hr/km)
|
||||||
|
</string>
|
||||||
|
<string name="settings_stats_rate_speed_imperial"
|
||||||
|
translation_description="In the 'Stats' settings, the option to display speed, with example in
|
||||||
|
imperial units.">
|
||||||
|
Speed (mi/hr)
|
||||||
|
</string>
|
||||||
|
<string name="settings_stats_rate_speed_metric"
|
||||||
|
translation_description="In the 'Stats' settings, the option to display speed, with example in
|
||||||
|
metric units.">
|
||||||
|
Speed (km/hr)
|
||||||
|
</string>
|
||||||
|
<string name="settings_stats_rate_title"
|
||||||
|
translation_description="In the 'Stats' settings, the option to change the preferred rate,
|
||||||
|
either speed (mi/hr) or pace (hr/mi).">
|
||||||
|
Preferred rate
|
||||||
|
</string>
|
||||||
|
<string name="settings_stats_time_title"
|
||||||
|
translation_description="In the 'Stats' settings, the option to change the time measurement,
|
||||||
|
either total time or moving time.">
|
||||||
|
Time measurement
|
||||||
|
</string>
|
||||||
|
<string name="settings_stats_units_imperial"
|
||||||
|
translation_description="In the 'Stats' setttings, the option to use imperial units, with
|
||||||
|
examples.">
|
||||||
|
Imperial (mi, ft)
|
||||||
|
</string>
|
||||||
|
<string name="settings_stats_units_metric"
|
||||||
|
translation_description="In the 'Stats' settings, the option to use metric units, with
|
||||||
|
examples.">
|
||||||
|
Metric (km, m)
|
||||||
|
</string>
|
||||||
|
<string name="settings_stats_units_title"
|
||||||
|
translation_description="In the 'Stats' settings page, the option to change the preferred units,
|
||||||
|
either metric (km) or imperial (mi).">
|
||||||
|
Preferred units
|
||||||
</string>
|
</string>
|
||||||
|
|
||||||
<!-- Share Track -->
|
<!-- Share Track -->
|
||||||
@@ -2145,28 +2099,6 @@ limitations under the License.
|
|||||||
Total time
|
Total time
|
||||||
</string>
|
</string>
|
||||||
|
|
||||||
<!-- Stats Settings -->
|
|
||||||
<string name="stats_settings_show"
|
|
||||||
translation_description="In the 'Stats settings' dialog, the section label to show additional
|
|
||||||
stats.">
|
|
||||||
Show
|
|
||||||
</string>
|
|
||||||
<string name="stats_settings_grade"
|
|
||||||
translation_description="In the 'Stats settings' dialog, the option to show grade. Grade is
|
|
||||||
the amount of inclination to the horizontal, also known as slope or incline.">
|
|
||||||
Grade
|
|
||||||
</string>
|
|
||||||
<string name="stats_settings_coordinate"
|
|
||||||
translation_description="In the 'Stats settings' dialog, the option to show latitude and
|
|
||||||
longitude.">
|
|
||||||
Latitude/Longitude
|
|
||||||
</string>
|
|
||||||
<string name="stats_settings_time"
|
|
||||||
translation_description="In the 'Stats settings' dialog, the section label to choose between
|
|
||||||
displaying total time or moving time.">
|
|
||||||
Time
|
|
||||||
</string>
|
|
||||||
|
|
||||||
<!-- Track -->
|
<!-- Track -->
|
||||||
<string name="track_detail_chart_tab"
|
<string name="track_detail_chart_tab"
|
||||||
translation_description="In the track detail page, the title of the tab showing the chart.">
|
translation_description="In the track detail page, the title of the tab showing the chart.">
|
||||||
@@ -2300,7 +2232,7 @@ limitations under the License.
|
|||||||
%1$.2f: a float number. E.g., '2.22'">
|
%1$.2f: a float number. E.g., '2.22'">
|
||||||
%1$.2f km
|
%1$.2f km
|
||||||
</string>
|
</string>
|
||||||
<string name="value_float_kilometer_hour"
|
<string name="value_float_kilometer_hour"
|
||||||
translation_description="Display a float value in kilometers per hour (km/h).
|
translation_description="Display a float value in kilometers per hour (km/h).
|
||||||
|
|
||||||
%1$.2f: a float number. E.g., '2.22'">
|
%1$.2f: a float number. E.g., '2.22'">
|
||||||
@@ -2371,6 +2303,12 @@ limitations under the License.
|
|||||||
%1$d: an integer value. E.g., '2'">
|
%1$d: an integer value. E.g., '2'">
|
||||||
%1$d km
|
%1$d km
|
||||||
</string>
|
</string>
|
||||||
|
<string name="value_integer_kilometer_hour"
|
||||||
|
translation_description="Display an integer value in kilometers per hour (km/h).
|
||||||
|
|
||||||
|
%1$d: an integer value. E.g., '2'">
|
||||||
|
%1$d km/h
|
||||||
|
</string>
|
||||||
<string name="value_integer_meter"
|
<string name="value_integer_meter"
|
||||||
translation_description="In a setting picker, the string format to display an integer value in
|
translation_description="In a setting picker, the string format to display an integer value in
|
||||||
meters (m).
|
meters (m).
|
||||||
@@ -2406,6 +2344,12 @@ limitations under the License.
|
|||||||
%1$d: an integer value. E.g., '2'">
|
%1$d: an integer value. E.g., '2'">
|
||||||
%1$d mi
|
%1$d mi
|
||||||
</string>
|
</string>
|
||||||
|
<string name="value_integer_mile_hour"
|
||||||
|
translation_description="Display an integer value in miles per hour (mi/h).
|
||||||
|
|
||||||
|
%1$d: an integer value. E.g., '2'">
|
||||||
|
%1$d mi/h
|
||||||
|
</string>
|
||||||
<string name="value_integer_minute"
|
<string name="value_integer_minute"
|
||||||
translation_description="In a setting picker, the string format to display an integer value in
|
translation_description="In a setting picker, the string format to display an integer value in
|
||||||
minutes (min).
|
minutes (min).
|
||||||
|
|||||||
@@ -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.
|
||||||
|
-->
|
||||||
|
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:title="@string/settings_backup" >
|
||||||
|
<Preference
|
||||||
|
android:key="@string/settings_backup_now_key"
|
||||||
|
android:persistent="false"
|
||||||
|
android:title="@string/settings_backup_now" />
|
||||||
|
<Preference
|
||||||
|
android:key="@string/settings_backup_restore_key"
|
||||||
|
android:persistent="false"
|
||||||
|
android:title="@string/settings_backup_restore" />
|
||||||
|
</PreferenceScreen>
|
||||||
@@ -0,0 +1,46 @@
|
|||||||
|
<?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.
|
||||||
|
-->
|
||||||
|
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:title="@string/track_detail_chart_tab" >
|
||||||
|
<CheckBoxPreference
|
||||||
|
android:defaultValue="true"
|
||||||
|
android:key="@string/chart_by_distance_key"
|
||||||
|
android:summaryOff="@string/settings_chart_by_time"
|
||||||
|
android:summaryOn="@string/settings_chart_by_distance"
|
||||||
|
android:title="@string/settings_chart_x_axis" />
|
||||||
|
<PreferenceCategory android:title="@string/settings_show" >
|
||||||
|
<CheckBoxPreference
|
||||||
|
android:defaultValue="true"
|
||||||
|
android:key="@string/chart_show_elevation_key"
|
||||||
|
android:title="@string/stats_elevation" />
|
||||||
|
<CheckBoxPreference
|
||||||
|
android:defaultValue="true"
|
||||||
|
android:key="@string/chart_show_speed_key" />
|
||||||
|
<CheckBoxPreference
|
||||||
|
android:defaultValue="true"
|
||||||
|
android:key="@string/chart_show_heart_rate_key"
|
||||||
|
android:title="@string/sensor_state_heart_rate" />
|
||||||
|
<CheckBoxPreference
|
||||||
|
android:defaultValue="true"
|
||||||
|
android:key="@string/chart_show_cadence_key"
|
||||||
|
android:title="@string/sensor_state_cadence" />
|
||||||
|
<CheckBoxPreference
|
||||||
|
android:defaultValue="true"
|
||||||
|
android:key="@string/chart_show_power_key"
|
||||||
|
android:title="@string/sensor_state_power" />
|
||||||
|
</PreferenceCategory>
|
||||||
|
</PreferenceScreen>
|
||||||
@@ -0,0 +1,51 @@
|
|||||||
|
<?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.
|
||||||
|
-->
|
||||||
|
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:title="@string/track_detail_map_tab" >
|
||||||
|
<ListPreference
|
||||||
|
android:defaultValue="@string/settings_map_track_color_mode_single_value"
|
||||||
|
android:entries="@array/track_color_mode_options"
|
||||||
|
android:entryValues="@array/track_color_mode_values"
|
||||||
|
android:key="@string/track_color_mode_key"
|
||||||
|
android:summary="@string/settings_map_track_color_mode_summary"
|
||||||
|
android:title="@string/settings_map_track_color_mode" />
|
||||||
|
<PreferenceCategory android:title="@string/settings_map_track_color_mode_fixed" >
|
||||||
|
<EditTextPreference
|
||||||
|
android:imeOptions="actionDone"
|
||||||
|
android:inputType="number"
|
||||||
|
android:key="@string/settings_map_slow_display_key"
|
||||||
|
android:persistent="false"
|
||||||
|
android:title="@string/settings_map_slow" >
|
||||||
|
</EditTextPreference>
|
||||||
|
<EditTextPreference
|
||||||
|
android:imeOptions="actionDone"
|
||||||
|
android:inputType="number"
|
||||||
|
android:key="@string/settings_map_medium_display_key"
|
||||||
|
android:persistent="false"
|
||||||
|
android:title="@string/settings_map_medium" >
|
||||||
|
</EditTextPreference>
|
||||||
|
</PreferenceCategory>
|
||||||
|
<PreferenceCategory android:title="@string/settings_map_track_color_mode_dynamic" >
|
||||||
|
<EditTextPreference
|
||||||
|
android:imeOptions="actionDone"
|
||||||
|
android:inputType="number"
|
||||||
|
android:key="@string/settings_map_percentage_display_key"
|
||||||
|
android:persistent="false"
|
||||||
|
android:title="@string/settings_map_percentage" >
|
||||||
|
</EditTextPreference>
|
||||||
|
</PreferenceCategory>
|
||||||
|
</PreferenceScreen>
|
||||||
@@ -1,235 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<!--
|
|
||||||
Copyright 2010 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.
|
|
||||||
-->
|
|
||||||
<PreferenceScreen
|
|
||||||
xmlns:android="http://schemas.android.com/apk/res/android">
|
|
||||||
|
|
||||||
<!-- Display settings -->
|
|
||||||
<PreferenceScreen android:title="@string/settings_display">
|
|
||||||
<CheckBoxPreference
|
|
||||||
android:key="@string/metric_units_key"
|
|
||||||
android:title="@string/settings_display_metric"
|
|
||||||
android:summaryOn="@string/settings_display_metric_summary_on"
|
|
||||||
android:summaryOff="@string/settings_display_metric_summary_off"
|
|
||||||
android:defaultValue="true" />
|
|
||||||
|
|
||||||
<CheckBoxPreference
|
|
||||||
android:key="@string/report_speed_key"
|
|
||||||
android:title="@string/settings_display_speed"
|
|
||||||
android:summaryOn="@string/settings_display_speed_summary_on"
|
|
||||||
android:summaryOff="@string/settings_display_speed_summary_off"
|
|
||||||
android:defaultValue="true" />
|
|
||||||
|
|
||||||
<ListPreference android:key="@string/track_color_mode_key"
|
|
||||||
android:title="@string/settings_display_track_color"
|
|
||||||
android:summary="@string/settings_display_track_color_summary"
|
|
||||||
android:entries="@array/display_track_color_options"
|
|
||||||
android:entryValues="@array/display_track_color_values"
|
|
||||||
android:defaultValue="@string/display_track_color_value_none"/>
|
|
||||||
|
|
||||||
<PreferenceCategory android:title="@string/settings_display_track_color_fixed"
|
|
||||||
android:key="@string/track_color_mode_fixed_speed_options_key">
|
|
||||||
<EditTextPreference android:key="@string/track_color_mode_fixed_speed_slow_key"
|
|
||||||
android:title="@string/settings_display_track_color_fixed_slow"
|
|
||||||
android:summary="@string/settings_display_track_color_fixed_slow_summary"
|
|
||||||
android:defaultValue="@string/color_mode_fixed_slow_default"
|
|
||||||
android:inputType="number"
|
|
||||||
android:maxLength="3">
|
|
||||||
</EditTextPreference>
|
|
||||||
|
|
||||||
<EditTextPreference android:key="@string/track_color_mode_fixed_speed_slow_display_key"
|
|
||||||
android:title="@string/settings_display_track_color_fixed_slow"
|
|
||||||
android:summary="@string/settings_display_track_color_fixed_slow_summary"
|
|
||||||
android:defaultValue="@string/color_mode_fixed_slow_default"
|
|
||||||
android:inputType="number"
|
|
||||||
android:maxLength="3">
|
|
||||||
</EditTextPreference>
|
|
||||||
|
|
||||||
<EditTextPreference android:key="@string/track_color_mode_fixed_speed_medium_key"
|
|
||||||
android:title="@string/settings_display_track_color_fixed_medium"
|
|
||||||
android:summary="@string/settings_display_track_color_fixed_medium_summary"
|
|
||||||
android:defaultValue="@string/color_mode_fixed_medium_default"
|
|
||||||
android:inputType="number"
|
|
||||||
android:maxLength="3">
|
|
||||||
</EditTextPreference>
|
|
||||||
|
|
||||||
<EditTextPreference android:key="@string/track_color_mode_fixed_speed_medium_display_key"
|
|
||||||
android:title="@string/settings_display_track_color_fixed_medium"
|
|
||||||
android:summary="@string/settings_display_track_color_fixed_medium_summary"
|
|
||||||
android:defaultValue="@string/color_mode_fixed_medium_default"
|
|
||||||
android:inputType="number"
|
|
||||||
android:maxLength="3">
|
|
||||||
</EditTextPreference>
|
|
||||||
</PreferenceCategory>
|
|
||||||
|
|
||||||
<PreferenceCategory android:title="@string/settings_display_track_color_dynamic">
|
|
||||||
<EditTextPreference android:key="@string/track_color_mode_dynamic_speed_variation_key"
|
|
||||||
android:title="@string/settings_display_track_color_dynamic_medium"
|
|
||||||
android:summary="@string/settings_display_track_color_dynamic_medium_summary"
|
|
||||||
android:defaultValue="@string/color_mode_dynamic_percentage_default"
|
|
||||||
android:inputType="number"
|
|
||||||
android:maxLength="2">
|
|
||||||
</EditTextPreference>
|
|
||||||
</PreferenceCategory>
|
|
||||||
</PreferenceScreen>
|
|
||||||
|
|
||||||
<!-- Recording settings -->
|
|
||||||
<PreferenceScreen android:title="@string/settings_recording">
|
|
||||||
<com.google.android.apps.mytracks.IntegerListPreference
|
|
||||||
android:key="@string/announcement_frequency_key"
|
|
||||||
android:title="@string/settings_recording_voice"
|
|
||||||
android:summary="@string/settings_recording_voice_summary"
|
|
||||||
android:entryValues="@array/recording_task_frequency_values"
|
|
||||||
android:defaultValue="0" />
|
|
||||||
|
|
||||||
<com.google.android.apps.mytracks.IntegerListPreference
|
|
||||||
android:key="@string/split_frequency_key"
|
|
||||||
android:title="@string/settings_recording_marker"
|
|
||||||
android:summary="@string/settings_recording_marker_summary"
|
|
||||||
android:entryValues="@array/recording_task_frequency_values"
|
|
||||||
android:defaultValue="0" />
|
|
||||||
|
|
||||||
<com.google.android.apps.mytracks.IntegerListPreference
|
|
||||||
android:key="@string/min_recording_interval_key"
|
|
||||||
android:title="@string/settings_recording_interval"
|
|
||||||
android:summary="@string/settings_recording_interval_summary"
|
|
||||||
android:entryValues="@array/recording_interval_values"
|
|
||||||
android:defaultValue="0" />
|
|
||||||
|
|
||||||
<com.google.android.apps.mytracks.IntegerListPreference
|
|
||||||
android:key="@string/min_recording_distance_key"
|
|
||||||
android:title="@string/settings_recording_distance"
|
|
||||||
android:summary="@string/settings_recording_distance_summary"
|
|
||||||
android:entryValues="@array/recording_distance_values"
|
|
||||||
android:defaultValue="5" />
|
|
||||||
|
|
||||||
<com.google.android.apps.mytracks.IntegerListPreference
|
|
||||||
android:key="@string/max_recording_distance_key"
|
|
||||||
android:title="@string/settings_recording_track_distance"
|
|
||||||
android:summary="@string/settings_recording_track_distance_summary"
|
|
||||||
android:entryValues="@array/recording_track_distance_values"
|
|
||||||
android:defaultValue="200" />
|
|
||||||
|
|
||||||
<com.google.android.apps.mytracks.IntegerListPreference
|
|
||||||
android:key="@string/min_required_accuracy_key"
|
|
||||||
android:title="@string/settings_recording_gps_accuracy"
|
|
||||||
android:summary="@string/settings_recording_gps_accuracy_summary"
|
|
||||||
android:entryValues="@array/recording_gps_accuracy_values"
|
|
||||||
android:defaultValue="200" />
|
|
||||||
|
|
||||||
<com.google.android.apps.mytracks.IntegerListPreference
|
|
||||||
android:key="@string/auto_resume_track_timeout_key"
|
|
||||||
android:title="@string/settings_recording_auto_resume"
|
|
||||||
android:summary="@string/settings_recording_auto_resume_summary"
|
|
||||||
android:entryValues="@array/recording_auto_resume_timeout_values"
|
|
||||||
android:defaultValue="10" />
|
|
||||||
|
|
||||||
<ListPreference android:key="@string/track_name_key"
|
|
||||||
android:title="@string/settings_recording_track_name"
|
|
||||||
android:summary="@string/settings_recording_track_name_summary"
|
|
||||||
android:entries="@array/settings_recording_track_name_options"
|
|
||||||
android:entryValues="@array/settings_recording_track_name_values"
|
|
||||||
android:defaultValue="@string/settings_recording_track_name_date_local_value"/>
|
|
||||||
|
|
||||||
<com.google.android.apps.mytracks.AutoCompleteTextPreference
|
|
||||||
android:key="@string/default_activity_key"
|
|
||||||
android:title="@string/settings_recording_default_activity"
|
|
||||||
android:summary="@string/settings_recording_default_activity_summary"
|
|
||||||
android:defaultValue="" />
|
|
||||||
|
|
||||||
</PreferenceScreen>
|
|
||||||
|
|
||||||
<!-- Sensors -->
|
|
||||||
<PreferenceScreen android:title="@string/settings_sensor"
|
|
||||||
android:key="@string/sensor_options_key">
|
|
||||||
<ListPreference android:key="@string/sensor_type_key"
|
|
||||||
android:title="@string/settings_sensor_type"
|
|
||||||
android:summary="@string/settings_sensor_type_summary"
|
|
||||||
android:entries="@array/sensor_type_options"
|
|
||||||
android:entryValues="@array/sensor_type_values"
|
|
||||||
android:defaultValue="@string/sensor_type_value_none"/>
|
|
||||||
|
|
||||||
<!-- Bluetooth -->
|
|
||||||
<PreferenceCategory android:title="@string/settings_sensor_bluetooth_options">
|
|
||||||
<ListPreference android:key="@string/bluetooth_sensor_key"
|
|
||||||
android:title="@string/settings_sensor_bluetooth_sensor"
|
|
||||||
android:summary="@string/settings_sensor_bluetooth_sensor_summary"
|
|
||||||
android:defaultValue="" />
|
|
||||||
|
|
||||||
<Preference android:key="@string/bluetooth_pairing_key"
|
|
||||||
android:title="@string/settings_sensor_bluetooth_pairing"
|
|
||||||
android:summary="@string/settings_sensor_bluetooth_pairing_summary"
|
|
||||||
android:persistent="false" />
|
|
||||||
</PreferenceCategory>
|
|
||||||
|
|
||||||
<PreferenceCategory android:title="@string/settings_sensor_ant_options"
|
|
||||||
android:key="@string/ant_options_key">
|
|
||||||
<com.google.android.apps.mytracks.AntPreference
|
|
||||||
android:key="@string/ant_heart_rate_sensor_id_key"
|
|
||||||
android:title="@string/settings_sensor_unpair_ant"/>
|
|
||||||
<com.google.android.apps.mytracks.AntPreference
|
|
||||||
android:key="@string/ant_srm_bridge_sensor_id_key"
|
|
||||||
android:title="@string/settings_sensor_unpair_srm"/>
|
|
||||||
</PreferenceCategory>
|
|
||||||
</PreferenceScreen>
|
|
||||||
|
|
||||||
<!-- Sharing settings -->
|
|
||||||
<PreferenceScreen android:title="@string/settings_sharing">
|
|
||||||
<CheckBoxPreference
|
|
||||||
android:key="@string/default_map_public_key"
|
|
||||||
android:title="@string/settings_sharing_map_public"
|
|
||||||
android:summaryOn="@string/settings_sharing_map_public_summary_on"
|
|
||||||
android:summaryOff="@string/settings_sharing_map_public_summary_off"
|
|
||||||
android:defaultValue="true" />
|
|
||||||
|
|
||||||
<CheckBoxPreference
|
|
||||||
android:key="@string/share_url_only_key"
|
|
||||||
android:title="@string/settings_sharing_url_only"
|
|
||||||
android:summaryOn="@string/settings_sharing_url_only_summary_on"
|
|
||||||
android:summaryOff="@string/settings_sharing_url_only_summary_off"
|
|
||||||
android:defaultValue="false" />
|
|
||||||
|
|
||||||
<CheckBoxPreference
|
|
||||||
android:key="@string/allow_access_key"
|
|
||||||
android:title="@string/settings_sharing_allow_access"
|
|
||||||
android:summaryOn="@string/settings_sharing_allow_access_summary_on"
|
|
||||||
android:summaryOff="@string/settings_sharing_allow_access_summary_off"
|
|
||||||
android:defaultValue="false" />
|
|
||||||
</PreferenceScreen>
|
|
||||||
|
|
||||||
<!-- Backup settings -->
|
|
||||||
<PreferenceScreen android:title="@string/settings_backup">
|
|
||||||
<PreferenceCategory android:title="@string/settings_backup_sd_card">
|
|
||||||
<Preference
|
|
||||||
android:key="@string/backup_to_sd_key"
|
|
||||||
android:title="@string/settings_backup_now"
|
|
||||||
android:summary="@string/settings_backup_now_summary"
|
|
||||||
android:persistent="false" />
|
|
||||||
<Preference
|
|
||||||
android:key="@string/restore_from_sd_key"
|
|
||||||
android:title="@string/settings_backup_restore"
|
|
||||||
android:summary="@string/settings_backup_restore_summary"
|
|
||||||
android:persistent="false" />
|
|
||||||
</PreferenceCategory>
|
|
||||||
</PreferenceScreen>
|
|
||||||
|
|
||||||
<!-- Reset to defaults -->
|
|
||||||
<Preference
|
|
||||||
android:title="@string/settings_reset"
|
|
||||||
android:key="@string/reset_key"
|
|
||||||
android:summary="@string/settings_reset_summary"
|
|
||||||
android:persistent="false" />
|
|
||||||
</PreferenceScreen>
|
|
||||||
@@ -0,0 +1,73 @@
|
|||||||
|
<?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.
|
||||||
|
-->
|
||||||
|
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:title="@string/settings_recording" >
|
||||||
|
<com.google.android.apps.mytracks.IntegerListPreference
|
||||||
|
android:defaultValue="0"
|
||||||
|
android:entryValues="@array/periodic_task_values"
|
||||||
|
android:key="@string/announcement_frequency_key"
|
||||||
|
android:summary="@string/settings_recording_voice_summary"
|
||||||
|
android:title="@string/settings_recording_voice" />
|
||||||
|
<com.google.android.apps.mytracks.IntegerListPreference
|
||||||
|
android:defaultValue="0"
|
||||||
|
android:entryValues="@array/periodic_task_values"
|
||||||
|
android:key="@string/split_frequency_key"
|
||||||
|
android:summary="@string/settings_recording_marker_summary"
|
||||||
|
android:title="@string/settings_recording_marker" />
|
||||||
|
<ListPreference
|
||||||
|
android:defaultValue="@string/settings_recording_track_name_date_local_value"
|
||||||
|
android:entries="@array/track_name_options"
|
||||||
|
android:entryValues="@array/track_name_values"
|
||||||
|
android:key="@string/track_name_key"
|
||||||
|
android:summary="@string/settings_recording_track_name_summary"
|
||||||
|
android:title="@string/settings_recording_track_name" />
|
||||||
|
<com.google.android.apps.mytracks.AutoCompleteTextPreference
|
||||||
|
android:defaultValue=""
|
||||||
|
android:key="@string/default_activity_key"
|
||||||
|
android:summary="@string/settings_recording_default_activity_summary"
|
||||||
|
android:title="@string/settings_recording_default_activity" />
|
||||||
|
<com.google.android.apps.mytracks.IntegerListPreference
|
||||||
|
android:defaultValue="0"
|
||||||
|
android:entryValues="@array/min_recording_interval_values"
|
||||||
|
android:key="@string/min_recording_interval_key"
|
||||||
|
android:summary="@string/settings_recording_interval_summary"
|
||||||
|
android:title="@string/settings_recording_interval" />
|
||||||
|
<com.google.android.apps.mytracks.IntegerListPreference
|
||||||
|
android:defaultValue="5"
|
||||||
|
android:entryValues="@array/min_recording_distance_values"
|
||||||
|
android:key="@string/min_recording_distance_key"
|
||||||
|
android:summary="@string/settings_recording_distance_summary"
|
||||||
|
android:title="@string/settings_recording_distance" />
|
||||||
|
<com.google.android.apps.mytracks.IntegerListPreference
|
||||||
|
android:defaultValue="200"
|
||||||
|
android:entryValues="@array/max_recording_distance_values"
|
||||||
|
android:key="@string/max_recording_distance_key"
|
||||||
|
android:summary="@string/settings_recording_track_distance_summary"
|
||||||
|
android:title="@string/settings_recording_track_distance" />
|
||||||
|
<com.google.android.apps.mytracks.IntegerListPreference
|
||||||
|
android:defaultValue="200"
|
||||||
|
android:entryValues="@array/min_required_accuracy_values"
|
||||||
|
android:key="@string/min_required_accuracy_key"
|
||||||
|
android:summary="@string/settings_recording_gps_accuracy_summary"
|
||||||
|
android:title="@string/settings_recording_gps_accuracy" />
|
||||||
|
<com.google.android.apps.mytracks.IntegerListPreference
|
||||||
|
android:defaultValue="10"
|
||||||
|
android:entryValues="@array/auto_resume_track_timeout_values"
|
||||||
|
android:key="@string/auto_resume_track_timeout_key"
|
||||||
|
android:summary="@string/settings_recording_auto_resume_summary"
|
||||||
|
android:title="@string/settings_recording_auto_resume" />
|
||||||
|
</PreferenceScreen>
|
||||||
@@ -0,0 +1,51 @@
|
|||||||
|
<?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.
|
||||||
|
-->
|
||||||
|
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:key="@string/settings_sensor_root_key"
|
||||||
|
android:title="@string/settings_sensor" >
|
||||||
|
<ListPreference
|
||||||
|
android:defaultValue="@string/sensor_type_value_none"
|
||||||
|
android:key="@string/sensor_type_key"
|
||||||
|
android:summary="@string/settings_sensor_type_summary"
|
||||||
|
android:title="@string/settings_sensor_type" />
|
||||||
|
<PreferenceCategory
|
||||||
|
android:key="@string/settings_sensor_bluetooth_key"
|
||||||
|
android:title="@string/settings_sensor_bluetooth_options" >
|
||||||
|
<Preference
|
||||||
|
android:key="@string/settings_sensor_bluetooth_pairing_key"
|
||||||
|
android:persistent="false"
|
||||||
|
android:summary="@string/settings_sensor_bluetooth_pairing_summary"
|
||||||
|
android:title="@string/settings_sensor_bluetooth_pairing" />
|
||||||
|
<ListPreference
|
||||||
|
android:defaultValue=""
|
||||||
|
android:key="@string/bluetooth_sensor_key"
|
||||||
|
android:summary="@string/settings_sensor_bluetooth_sensor_summary"
|
||||||
|
android:title="@string/settings_sensor_bluetooth_sensor" />
|
||||||
|
</PreferenceCategory>
|
||||||
|
<PreferenceCategory
|
||||||
|
android:key="@string/settings_sensor_ant_key"
|
||||||
|
android:title="@string/settings_sensor_ant_options" >
|
||||||
|
<com.google.android.apps.mytracks.AntPreference
|
||||||
|
android:defaultValue="0"
|
||||||
|
android:key="@string/ant_heart_rate_sensor_id_key"
|
||||||
|
android:title="@string/settings_sensor_unpair_ant" />
|
||||||
|
<com.google.android.apps.mytracks.AntPreference
|
||||||
|
android:defaultValue="0"
|
||||||
|
android:key="@string/ant_srm_bridge_sensor_id_key"
|
||||||
|
android:title="@string/settings_sensor_unpair_srm" />
|
||||||
|
</PreferenceCategory>
|
||||||
|
</PreferenceScreen>
|
||||||
@@ -0,0 +1,51 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!--
|
||||||
|
Copyright 2010 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.
|
||||||
|
-->
|
||||||
|
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:title="@string/menu_settings" >
|
||||||
|
<Preference
|
||||||
|
android:key="@string/settings_map_key"
|
||||||
|
android:persistent="false"
|
||||||
|
android:title="@string/track_detail_map_tab" />
|
||||||
|
<Preference
|
||||||
|
android:key="@string/settings_chart_key"
|
||||||
|
android:persistent="false"
|
||||||
|
android:title="@string/track_detail_chart_tab" />
|
||||||
|
<Preference
|
||||||
|
android:key="@string/settings_stats_key"
|
||||||
|
android:persistent="false"
|
||||||
|
android:title="@string/track_detail_stats_tab" />
|
||||||
|
<Preference
|
||||||
|
android:key="@string/settings_recording_key"
|
||||||
|
android:persistent="false"
|
||||||
|
android:title="@string/settings_recording" />
|
||||||
|
<Preference
|
||||||
|
android:key="@string/settings_sharing_key"
|
||||||
|
android:persistent="false"
|
||||||
|
android:title="@string/settings_sharing" />
|
||||||
|
<Preference
|
||||||
|
android:key="@string/settings_sensor_key"
|
||||||
|
android:persistent="false"
|
||||||
|
android:title="@string/settings_sensor" />
|
||||||
|
<Preference
|
||||||
|
android:key="@string/settings_backup_key"
|
||||||
|
android:persistent="false"
|
||||||
|
android:title="@string/settings_backup" />
|
||||||
|
<Preference
|
||||||
|
android:key="@string/settings_reset_key"
|
||||||
|
android:persistent="false"
|
||||||
|
android:title="@string/settings_reset" />
|
||||||
|
</PreferenceScreen>
|
||||||
@@ -0,0 +1,37 @@
|
|||||||
|
<?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.
|
||||||
|
-->
|
||||||
|
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:title="@string/settings_sharing" >
|
||||||
|
<CheckBoxPreference
|
||||||
|
android:defaultValue="true"
|
||||||
|
android:key="@string/default_map_public_key"
|
||||||
|
android:summaryOff="@string/settings_sharing_map_public_summary_off"
|
||||||
|
android:summaryOn="@string/settings_sharing_map_public_summary_on"
|
||||||
|
android:title="@string/settings_sharing_map_public" />
|
||||||
|
<CheckBoxPreference
|
||||||
|
android:defaultValue="false"
|
||||||
|
android:key="@string/share_url_only_key"
|
||||||
|
android:summaryOff="@string/settings_sharing_url_only_summary_off"
|
||||||
|
android:summaryOn="@string/settings_sharing_url_only_summary_on"
|
||||||
|
android:title="@string/settings_sharing_url_only" />
|
||||||
|
<CheckBoxPreference
|
||||||
|
android:defaultValue="false"
|
||||||
|
android:key="@string/allow_access_key"
|
||||||
|
android:summaryOff="@string/settings_sharing_allow_access_summary_off"
|
||||||
|
android:summaryOn="@string/settings_sharing_allow_access_summary_on"
|
||||||
|
android:title="@string/settings_sharing_allow_access" />
|
||||||
|
</PreferenceScreen>
|
||||||
@@ -0,0 +1,49 @@
|
|||||||
|
<?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.
|
||||||
|
-->
|
||||||
|
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:title="@string/track_detail_stats_tab" >
|
||||||
|
<CheckBoxPreference
|
||||||
|
android:defaultValue="true"
|
||||||
|
android:key="@string/metric_units_key"
|
||||||
|
android:summaryOff="@string/settings_stats_units_imperial"
|
||||||
|
android:summaryOn="@string/settings_stats_units_metric"
|
||||||
|
android:title="@string/settings_stats_units_title" />
|
||||||
|
<CheckBoxPreference
|
||||||
|
android:defaultValue="true"
|
||||||
|
android:key="@string/report_speed_key"
|
||||||
|
android:title="@string/settings_stats_rate_title" />
|
||||||
|
<CheckBoxPreference
|
||||||
|
android:defaultValue="true"
|
||||||
|
android:key="@string/stats_use_total_time_key"
|
||||||
|
android:summaryOff="@string/stats_total_time"
|
||||||
|
android:summaryOn="@string/stats_moving_time"
|
||||||
|
android:title="@string/settings_stats_time_title" />
|
||||||
|
<PreferenceCategory android:title="@string/settings_show" >
|
||||||
|
<CheckBoxPreference
|
||||||
|
android:defaultValue="false"
|
||||||
|
android:key="@string/stats_show_elevation_key"
|
||||||
|
android:title="@string/stats_elevation" />
|
||||||
|
<CheckBoxPreference
|
||||||
|
android:defaultValue="false"
|
||||||
|
android:key="@string/stats_show_grade_key"
|
||||||
|
android:title="@string/settings_stats_grade" />
|
||||||
|
<CheckBoxPreference
|
||||||
|
android:defaultValue="false"
|
||||||
|
android:key="@string/stats_show_coordinate_key"
|
||||||
|
android:title="@string/settings_stats_coordinate" />
|
||||||
|
</PreferenceCategory>
|
||||||
|
</PreferenceScreen>
|
||||||
@@ -34,8 +34,8 @@ public class AbstractMyTracksActivity extends FragmentActivity {
|
|||||||
protected void onCreate(Bundle savedInstanceState) {
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
setVolumeControlStream(TextToSpeech.Engine.DEFAULT_STREAM);
|
setVolumeControlStream(TextToSpeech.Engine.DEFAULT_STREAM);
|
||||||
ApiAdapterFactory.getApiAdapter().configureActionBarHomeAsUp(this);
|
ApiAdapterFactory.getApiAdapter().configureActionBarHomeAsUp(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean onOptionsItemSelected(MenuItem item) {
|
public boolean onOptionsItemSelected(MenuItem item) {
|
||||||
@@ -44,8 +44,8 @@ public class AbstractMyTracksActivity extends FragmentActivity {
|
|||||||
}
|
}
|
||||||
onHomeSelected();
|
onHomeSelected();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Callback when the home menu item is selected.
|
* Callback when the home menu item is selected.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
package com.google.android.apps.mytracks;
|
package com.google.android.apps.mytracks;
|
||||||
|
|
||||||
|
import com.google.android.apps.mytracks.util.PreferencesUtils;
|
||||||
import com.google.android.maps.mytracks.R;
|
import com.google.android.maps.mytracks.R;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
@@ -31,9 +32,9 @@ public class AutoCompleteTextPreference extends EditTextPreference {
|
|||||||
mEditText.setThreshold(0);
|
mEditText.setThreshold(0);
|
||||||
|
|
||||||
// Gets autocomplete values for 'Default Activity' preference
|
// Gets autocomplete values for 'Default Activity' preference
|
||||||
if (getKey().equals(context.getString(R.string.default_activity_key))) {
|
if (PreferencesUtils.getKey(context, R.string.default_activity_key).equals(getKey())) {
|
||||||
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(context,
|
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(
|
||||||
R.array.activity_types, android.R.layout.simple_dropdown_item_1line);
|
context, R.array.activity_types, android.R.layout.simple_dropdown_item_1line);
|
||||||
mEditText.setAdapter(adapter);
|
mEditText.setAdapter(adapter);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -156,12 +156,7 @@ public class ChartView extends View {
|
|||||||
private boolean metricUnits = true;
|
private boolean metricUnits = true;
|
||||||
private boolean showPointer = false;
|
private boolean showPointer = false;
|
||||||
|
|
||||||
/** Display chart versus distance or time */
|
private boolean chartByDistance = true;
|
||||||
public enum Mode {
|
|
||||||
BY_DISTANCE, BY_TIME
|
|
||||||
}
|
|
||||||
|
|
||||||
private Mode mode = Mode.BY_DISTANCE;
|
|
||||||
|
|
||||||
public ChartView(Context context) {
|
public ChartView(Context context) {
|
||||||
super(context);
|
super(context);
|
||||||
@@ -394,22 +389,17 @@ public class ChartView extends View {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return the current display mode (by distance, by time)
|
* Sets chart by distance value. It is expected that after changing this
|
||||||
|
* value, data will be reloaded.
|
||||||
|
*
|
||||||
|
* @param value true for by distance, false for by time.
|
||||||
*/
|
*/
|
||||||
public Mode getMode() {
|
public void setChartByDistance(boolean value) {
|
||||||
return mode;
|
this.chartByDistance = value;
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the display mode (by distance, by time).
|
|
||||||
* It is expected that after the mode change, data will be reloaded.
|
|
||||||
*/
|
|
||||||
public void setMode(Mode mode) {
|
|
||||||
this.mode = mode;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private int getWaypointX(Waypoint waypoint) {
|
private int getWaypointX(Waypoint waypoint) {
|
||||||
if (mode == Mode.BY_DISTANCE) {
|
if (chartByDistance) {
|
||||||
double lenghtInKm = waypoint.getLength() * UnitConversions.M_TO_KM;
|
double lenghtInKm = waypoint.getLength() * UnitConversions.M_TO_KM;
|
||||||
return getX(metricUnits ? lenghtInKm : lenghtInKm * UnitConversions.KM_TO_MI);
|
return getX(metricUnits ? lenghtInKm : lenghtInKm * UnitConversions.KM_TO_MI);
|
||||||
} else {
|
} else {
|
||||||
@@ -813,8 +803,7 @@ public class ChartView extends View {
|
|||||||
if (x < 0) {
|
if (x < 0) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
String s =
|
String s = chartByDistance
|
||||||
(mode == Mode.BY_DISTANCE)
|
|
||||||
? (shortFormat ? X_SHORT_FORMAT.format(x) : X_FORMAT.format(x))
|
? (shortFormat ? X_SHORT_FORMAT.format(x) : X_FORMAT.format(x))
|
||||||
: StringUtils.formatElapsedTime((long) x);
|
: StringUtils.formatElapsedTime((long) x);
|
||||||
c.drawText(s,
|
c.drawText(s,
|
||||||
@@ -841,7 +830,7 @@ public class ChartView extends View {
|
|||||||
final int y = effectiveHeight + topBorder;
|
final int y = effectiveHeight + topBorder;
|
||||||
canvas.drawLine(leftBorder, y, rightEdge, y, borderPaint);
|
canvas.drawLine(leftBorder, y, rightEdge, y, borderPaint);
|
||||||
Context c = getContext();
|
Context c = getContext();
|
||||||
String s = mode == Mode.BY_DISTANCE
|
String s = chartByDistance
|
||||||
? (metricUnits ? c.getString(R.string.unit_kilometer) : c.getString(R.string.unit_mile))
|
? (metricUnits ? c.getString(R.string.unit_kilometer) : c.getString(R.string.unit_mile))
|
||||||
: c.getString(R.string.unit_minute);
|
: c.getString(R.string.unit_minute);
|
||||||
canvas.drawText(s, rightEdge, effectiveHeight + .2f * UNIT_BORDER + topBorder, labelPaint);
|
canvas.drawText(s, rightEdge, effectiveHeight + .2f * UNIT_BORDER + topBorder, labelPaint);
|
||||||
@@ -875,17 +864,6 @@ public class ChartView extends View {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns whether a given time series is enabled for drawing.
|
|
||||||
*
|
|
||||||
* @param index the time series, one of {@link #ELEVATION_SERIES},
|
|
||||||
* {@link #SPEED_SERIES}, {@link #POWER_SERIES}, etc.
|
|
||||||
* @return true if drawn, false otherwise
|
|
||||||
*/
|
|
||||||
public boolean isChartValueSeriesEnabled(int index) {
|
|
||||||
return series[index].isEnabled();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets whether a given time series will be enabled for drawing.
|
* Sets whether a given time series will be enabled for drawing.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -121,23 +121,10 @@ public abstract class Constants {
|
|||||||
* The name of extra intent property to indicate whether we want to resume
|
* The name of extra intent property to indicate whether we want to resume
|
||||||
* a previously recorded track.
|
* a previously recorded track.
|
||||||
*/
|
*/
|
||||||
public static final String RESUME_TRACK_EXTRA_NAME =
|
public static final String
|
||||||
"com.google.android.apps.mytracks.RESUME_TRACK";
|
RESUME_TRACK_EXTRA_NAME = "com.google.android.apps.mytracks.RESUME_TRACK";
|
||||||
|
|
||||||
public static final String MAPSHOP_BASE_URL =
|
public static final String MAPSHOP_BASE_URL = "https://maps.google.com/maps/ms";
|
||||||
"https://maps.google.com/maps/ms";
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Default values - keep in sync with those in preferences.xml.
|
|
||||||
*/
|
|
||||||
|
|
||||||
public static final int DEFAULT_ANNOUNCEMENT_FREQUENCY = -1;
|
|
||||||
public static final int DEFAULT_AUTO_RESUME_TRACK_TIMEOUT = 10; // In min.
|
|
||||||
public static final int DEFAULT_MAX_RECORDING_DISTANCE = 200;
|
|
||||||
public static final int DEFAULT_MIN_RECORDING_DISTANCE = 5;
|
|
||||||
public static final int DEFAULT_MIN_RECORDING_INTERVAL = 0;
|
|
||||||
public static final int DEFAULT_MIN_REQUIRED_ACCURACY = 200;
|
|
||||||
public static final int DEFAULT_SPLIT_FREQUENCY = 0;
|
|
||||||
|
|
||||||
public static final String SETTINGS_NAME = "SettingsActivity";
|
public static final String SETTINGS_NAME = "SettingsActivity";
|
||||||
|
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ import com.google.android.apps.mytracks.io.file.GpxImporter;
|
|||||||
import com.google.android.apps.mytracks.util.FileUtils;
|
import com.google.android.apps.mytracks.util.FileUtils;
|
||||||
import com.google.android.apps.mytracks.util.PreferencesUtils;
|
import com.google.android.apps.mytracks.util.PreferencesUtils;
|
||||||
import com.google.android.apps.mytracks.util.SystemUtils;
|
import com.google.android.apps.mytracks.util.SystemUtils;
|
||||||
|
import com.google.android.maps.mytracks.R;
|
||||||
|
|
||||||
import android.os.AsyncTask;
|
import android.os.AsyncTask;
|
||||||
import android.os.PowerManager.WakeLock;
|
import android.os.PowerManager.WakeLock;
|
||||||
@@ -82,7 +83,8 @@ public class ImportAsyncTask extends AsyncTask<Void, Integer, Boolean> {
|
|||||||
myTracksProviderUtils = MyTracksProviderUtils.Factory.get(importActivity);
|
myTracksProviderUtils = MyTracksProviderUtils.Factory.get(importActivity);
|
||||||
|
|
||||||
// Get the wake lock if not recording
|
// Get the wake lock if not recording
|
||||||
if (PreferencesUtils.getRecordingTrackId(importActivity) == -1L) {
|
if (PreferencesUtils.getLong(importActivity, R.string.recording_track_id_key)
|
||||||
|
== PreferencesUtils.RECORDING_TRACK_ID_DEFAULT) {
|
||||||
wakeLock = SystemUtils.acquireWakeLock(importActivity, wakeLock);
|
wakeLock = SystemUtils.acquireWakeLock(importActivity, wakeLock);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -23,6 +23,7 @@ import com.google.android.apps.mytracks.maps.TrackPathPainterFactory;
|
|||||||
import com.google.android.apps.mytracks.maps.TrackPathUtilities;
|
import com.google.android.apps.mytracks.maps.TrackPathUtilities;
|
||||||
import com.google.android.apps.mytracks.util.IntentUtils;
|
import com.google.android.apps.mytracks.util.IntentUtils;
|
||||||
import com.google.android.apps.mytracks.util.LocationUtils;
|
import com.google.android.apps.mytracks.util.LocationUtils;
|
||||||
|
import com.google.android.apps.mytracks.util.PreferencesUtils;
|
||||||
import com.google.android.apps.mytracks.util.UnitConversions;
|
import com.google.android.apps.mytracks.util.UnitConversions;
|
||||||
import com.google.android.maps.GeoPoint;
|
import com.google.android.maps.GeoPoint;
|
||||||
import com.google.android.maps.MapView;
|
import com.google.android.maps.MapView;
|
||||||
@@ -462,10 +463,8 @@ public class MapOverlay extends Overlay implements OnSharedPreferenceChangeListe
|
|||||||
@Override
|
@Override
|
||||||
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
|
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
|
||||||
Log.d(TAG, "MapOverlay: onSharedPreferences changed " + key);
|
Log.d(TAG, "MapOverlay: onSharedPreferences changed " + key);
|
||||||
if (key != null) {
|
if (PreferencesUtils.getKey(context, R.string.track_color_mode_key).equals(key)) {
|
||||||
if (key.equals(context.getString(R.string.track_color_mode_key))) {
|
trackPathPainter = TrackPathPainterFactory.getTrackPathPainter(context);
|
||||||
trackPathPainter = TrackPathPainterFactory.getTrackPathPainter(context);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -81,16 +81,17 @@ public class MarkerListActivity extends AbstractMyTracksActivity {
|
|||||||
* Note that sharedPreferenceChangeListener cannot be an anonymous inner
|
* Note that sharedPreferenceChangeListener cannot be an anonymous inner
|
||||||
* class. Anonymous inner class will get garbage collected.
|
* class. Anonymous inner class will get garbage collected.
|
||||||
*/
|
*/
|
||||||
private final OnSharedPreferenceChangeListener sharedPreferenceChangeListener =
|
private final OnSharedPreferenceChangeListener
|
||||||
new OnSharedPreferenceChangeListener() {
|
sharedPreferenceChangeListener = new OnSharedPreferenceChangeListener() {
|
||||||
@Override
|
@Override
|
||||||
public void onSharedPreferenceChanged(SharedPreferences preferences, String key) {
|
public void onSharedPreferenceChanged(SharedPreferences preferences, String key) {
|
||||||
// Note that key can be null
|
// Note that key can be null
|
||||||
if (PreferencesUtils.getRecordingTrackIdKey(MarkerListActivity.this).equals(key)) {
|
if (PreferencesUtils.getKey(MarkerListActivity.this, R.string.recording_track_id_key)
|
||||||
updateMenu();
|
.equals(key)) {
|
||||||
}
|
updateMenu();
|
||||||
}
|
}
|
||||||
};
|
}
|
||||||
|
};
|
||||||
|
|
||||||
private long trackId = -1;
|
private long trackId = -1;
|
||||||
private ResourceCursorAdapter resourceCursorAdapter;
|
private ResourceCursorAdapter resourceCursorAdapter;
|
||||||
@@ -113,9 +114,8 @@ public class MarkerListActivity extends AbstractMyTracksActivity {
|
|||||||
setDefaultKeyMode(DEFAULT_KEYS_SEARCH_LOCAL);
|
setDefaultKeyMode(DEFAULT_KEYS_SEARCH_LOCAL);
|
||||||
setContentView(R.layout.marker_list);
|
setContentView(R.layout.marker_list);
|
||||||
|
|
||||||
SharedPreferences sharedPreferences = getSharedPreferences(
|
getSharedPreferences(Constants.SETTINGS_NAME, Context.MODE_PRIVATE)
|
||||||
Constants.SETTINGS_NAME, Context.MODE_PRIVATE);
|
.registerOnSharedPreferenceChangeListener(sharedPreferenceChangeListener);
|
||||||
sharedPreferences.registerOnSharedPreferenceChangeListener(sharedPreferenceChangeListener);
|
|
||||||
|
|
||||||
ListView listView = (ListView) findViewById(R.id.marker_list);
|
ListView listView = (ListView) findViewById(R.id.marker_list);
|
||||||
listView.setEmptyView(findViewById(R.id.marker_list_empty));
|
listView.setEmptyView(findViewById(R.id.marker_list_empty));
|
||||||
@@ -188,7 +188,8 @@ public class MarkerListActivity extends AbstractMyTracksActivity {
|
|||||||
|
|
||||||
private void updateMenu() {
|
private void updateMenu() {
|
||||||
if (insertMarkerMenuItem != null) {
|
if (insertMarkerMenuItem != null) {
|
||||||
insertMarkerMenuItem.setVisible(trackId == PreferencesUtils.getRecordingTrackId(this));
|
insertMarkerMenuItem.setVisible(
|
||||||
|
trackId == PreferencesUtils.getLong(this, R.string.recording_track_id_key));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -66,7 +66,8 @@ public class SaveAllAsyncTask extends AsyncTask<Void, Integer, Boolean> {
|
|||||||
myTracksProviderUtils = MyTracksProviderUtils.Factory.get(saveAllActivity);
|
myTracksProviderUtils = MyTracksProviderUtils.Factory.get(saveAllActivity);
|
||||||
|
|
||||||
// Get the wake lock if not recording
|
// Get the wake lock if not recording
|
||||||
if (PreferencesUtils.getRecordingTrackId(saveAllActivity) == -1L) {
|
if (PreferencesUtils.getLong(saveAllActivity, R.string.recording_track_id_key)
|
||||||
|
== PreferencesUtils.RECORDING_TRACK_ID_DEFAULT) {
|
||||||
wakeLock = SystemUtils.acquireWakeLock(saveAllActivity, wakeLock);
|
wakeLock = SystemUtils.acquireWakeLock(saveAllActivity, wakeLock);
|
||||||
}
|
}
|
||||||
success = false;
|
success = false;
|
||||||
|
|||||||
@@ -83,10 +83,12 @@ public class SearchListActivity extends AbstractMyTracksActivity {
|
|||||||
|
|
||||||
private final OnSharedPreferenceChangeListener
|
private final OnSharedPreferenceChangeListener
|
||||||
sharedPreferenceChangeListener = new OnSharedPreferenceChangeListener() {
|
sharedPreferenceChangeListener = new OnSharedPreferenceChangeListener() {
|
||||||
@Override
|
@Override
|
||||||
public void onSharedPreferenceChanged(SharedPreferences preferences, String key) {
|
public void onSharedPreferenceChanged(SharedPreferences preferences, String key) {
|
||||||
if (PreferencesUtils.getRecordingTrackIdKey(SearchListActivity.this).equals(key)) {
|
if (PreferencesUtils.getKey(SearchListActivity.this, R.string.recording_track_id_key)
|
||||||
recordingTrackId = PreferencesUtils.getRecordingTrackId(SearchListActivity.this);
|
.equals(key)) {
|
||||||
|
recordingTrackId = PreferencesUtils.getLong(
|
||||||
|
SearchListActivity.this, R.string.recording_track_id_key);
|
||||||
arrayAdapter.notifyDataSetChanged();
|
arrayAdapter.notifyDataSetChanged();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -123,10 +125,9 @@ public class SearchListActivity extends AbstractMyTracksActivity {
|
|||||||
searchEngine = new SearchEngine(myTracksProviderUtils);
|
searchEngine = new SearchEngine(myTracksProviderUtils);
|
||||||
searchRecentSuggestions = SearchEngineProvider.newHelper(this);
|
searchRecentSuggestions = SearchEngineProvider.newHelper(this);
|
||||||
locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
|
locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
|
||||||
SharedPreferences sharedPreferences = getSharedPreferences(
|
getSharedPreferences(Constants.SETTINGS_NAME, Context.MODE_PRIVATE)
|
||||||
Constants.SETTINGS_NAME, Context.MODE_PRIVATE);
|
.registerOnSharedPreferenceChangeListener(sharedPreferenceChangeListener);
|
||||||
sharedPreferences.registerOnSharedPreferenceChangeListener(sharedPreferenceChangeListener);
|
recordingTrackId = PreferencesUtils.getLong(this, R.string.recording_track_id_key);
|
||||||
recordingTrackId = PreferencesUtils.getRecordingTrackId(this);
|
|
||||||
|
|
||||||
listView = (ListView) findViewById(R.id.search_list);
|
listView = (ListView) findViewById(R.id.search_list);
|
||||||
listView.setEmptyView(findViewById(R.id.search_list_empty));
|
listView.setEmptyView(findViewById(R.id.search_list_empty));
|
||||||
@@ -185,7 +186,8 @@ public class SearchListActivity extends AbstractMyTracksActivity {
|
|||||||
@Override
|
@Override
|
||||||
protected void onResume() {
|
protected void onResume() {
|
||||||
super.onResume();
|
super.onResume();
|
||||||
metricUnits = PreferencesUtils.isMetricUnits(this);
|
metricUnits = PreferencesUtils.getBoolean(
|
||||||
|
this, R.string.metric_units_key, PreferencesUtils.METRIC_UNITS_DEFAULT);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -1,717 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2008 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 static com.google.android.apps.mytracks.Constants.TAG;
|
|
||||||
|
|
||||||
import com.google.android.apps.mytracks.io.backup.BackupActivity;
|
|
||||||
import com.google.android.apps.mytracks.io.backup.BackupPreferencesListener;
|
|
||||||
import com.google.android.apps.mytracks.io.backup.RestoreChooserActivity;
|
|
||||||
import com.google.android.apps.mytracks.services.sensors.ant.AntUtils;
|
|
||||||
import com.google.android.apps.mytracks.util.ApiAdapterFactory;
|
|
||||||
import com.google.android.apps.mytracks.util.BluetoothDeviceUtils;
|
|
||||||
import com.google.android.apps.mytracks.util.DialogUtils;
|
|
||||||
import com.google.android.apps.mytracks.util.IntentUtils;
|
|
||||||
import com.google.android.apps.mytracks.util.PreferencesUtils;
|
|
||||||
import com.google.android.apps.mytracks.util.UnitConversions;
|
|
||||||
import com.google.android.maps.mytracks.R;
|
|
||||||
|
|
||||||
import android.app.Dialog;
|
|
||||||
import android.bluetooth.BluetoothAdapter;
|
|
||||||
import android.content.DialogInterface;
|
|
||||||
import android.content.Intent;
|
|
||||||
import android.content.SharedPreferences;
|
|
||||||
import android.content.SharedPreferences.Editor;
|
|
||||||
import android.os.Bundle;
|
|
||||||
import android.preference.CheckBoxPreference;
|
|
||||||
import android.preference.EditTextPreference;
|
|
||||||
import android.preference.ListPreference;
|
|
||||||
import android.preference.Preference;
|
|
||||||
import android.preference.Preference.OnPreferenceChangeListener;
|
|
||||||
import android.preference.Preference.OnPreferenceClickListener;
|
|
||||||
import android.preference.PreferenceActivity;
|
|
||||||
import android.preference.PreferenceCategory;
|
|
||||||
import android.preference.PreferenceManager;
|
|
||||||
import android.preference.PreferenceScreen;
|
|
||||||
import android.provider.Settings;
|
|
||||||
import android.speech.tts.TextToSpeech;
|
|
||||||
import android.util.Log;
|
|
||||||
import android.widget.Toast;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.HashSet;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Set;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* An activity that let's the user see and edit the settings.
|
|
||||||
*
|
|
||||||
* @author Leif Hendrik Wilden
|
|
||||||
* @author Rodrigo Damazio
|
|
||||||
*/
|
|
||||||
public class SettingsActivity extends PreferenceActivity {
|
|
||||||
|
|
||||||
private static final int DIALOG_CONFIRM_RESET_ID = 0;
|
|
||||||
private static final int DIALOG_CONFIRM_ACCESS_ID = 1;
|
|
||||||
private static final int DIALOG_CONFIRM_RESTORE_ID = 2;
|
|
||||||
|
|
||||||
// Value when the task frequency is off.
|
|
||||||
private static final String TASK_FREQUENCY_OFF = "0";
|
|
||||||
|
|
||||||
// Value when the recording interval is 'Adapt battery life'.
|
|
||||||
private static final String RECORDING_INTERVAL_ADAPT_BATTERY_LIFE = "-2";
|
|
||||||
|
|
||||||
// Value when the recording interval is 'Adapt accuracy'.
|
|
||||||
private static final String RECORDING_INTERVAL_ADAPT_ACCURACY = "-1";
|
|
||||||
|
|
||||||
// Value for the recommended recording interval.
|
|
||||||
private static final String RECORDING_INTERVAL_RECOMMENDED = "0";
|
|
||||||
|
|
||||||
// Value when the auto resume timeout is never.
|
|
||||||
private static final String AUTO_RESUME_TIMEOUT_NEVER = "0";
|
|
||||||
|
|
||||||
// Value when the auto resume timeout is always.
|
|
||||||
private static final String AUTO_RESUME_TIMEOUT_ALWAYS = "-1";
|
|
||||||
|
|
||||||
// Value for the recommended recording distance.
|
|
||||||
private static final String RECORDING_DISTANCE_RECOMMENDED = "5";
|
|
||||||
|
|
||||||
// Value for the recommended track distance.
|
|
||||||
private static final String TRACK_DISTANCE_RECOMMENDED = "200";
|
|
||||||
|
|
||||||
// Value for the recommended GPS accuracy.
|
|
||||||
private static final String GPS_ACCURACY_RECOMMENDED = "200";
|
|
||||||
|
|
||||||
// Value when the GPS accuracy is for excellent GPS signal.
|
|
||||||
private static final String GPS_ACCURACY_EXCELLENT = "10";
|
|
||||||
|
|
||||||
// Value when the GPS accuracy is for poor GPS signal.
|
|
||||||
private static final String GPS_ACCURACY_POOR = "5000";
|
|
||||||
|
|
||||||
private BackupPreferencesListener backupListener;
|
|
||||||
private SharedPreferences preferences;
|
|
||||||
|
|
||||||
/** Called when the activity is first created. */
|
|
||||||
@Override
|
|
||||||
protected void onCreate(Bundle icicle) {
|
|
||||||
super.onCreate(icicle);
|
|
||||||
|
|
||||||
// The volume we want to control is the Text-To-Speech volume
|
|
||||||
setVolumeControlStream(TextToSpeech.Engine.DEFAULT_STREAM);
|
|
||||||
|
|
||||||
// Tell it where to read/write preferences
|
|
||||||
PreferenceManager preferenceManager = getPreferenceManager();
|
|
||||||
preferenceManager.setSharedPreferencesName(Constants.SETTINGS_NAME);
|
|
||||||
preferenceManager.setSharedPreferencesMode(0);
|
|
||||||
|
|
||||||
// Set up automatic preferences backup
|
|
||||||
backupListener = ApiAdapterFactory.getApiAdapter().getBackupPreferencesListener(this);
|
|
||||||
preferences = preferenceManager.getSharedPreferences();
|
|
||||||
preferences.registerOnSharedPreferenceChangeListener(backupListener);
|
|
||||||
|
|
||||||
// Load the preferences to be displayed
|
|
||||||
addPreferencesFromResource(R.xml.preferences);
|
|
||||||
|
|
||||||
setRecordingIntervalOptions();
|
|
||||||
setAutoResumeTimeoutOptions();
|
|
||||||
|
|
||||||
// Hook up switching of displayed list entries between metric and imperial
|
|
||||||
// units
|
|
||||||
CheckBoxPreference metricUnitsPreference =
|
|
||||||
(CheckBoxPreference) findPreference(PreferencesUtils.getMetricUnitsKey(this));
|
|
||||||
metricUnitsPreference.setOnPreferenceChangeListener(
|
|
||||||
new OnPreferenceChangeListener() {
|
|
||||||
@Override
|
|
||||||
public boolean onPreferenceChange(Preference preference,
|
|
||||||
Object newValue) {
|
|
||||||
boolean isMetric = (Boolean) newValue;
|
|
||||||
updateDisplayOptions(isMetric);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
updateDisplayOptions(metricUnitsPreference.isChecked());
|
|
||||||
|
|
||||||
customizeSensorOptionsPreferences();
|
|
||||||
customizeTrackColorModePreferences();
|
|
||||||
|
|
||||||
// Hook up action for resetting all settings
|
|
||||||
Preference resetPreference = findPreference(getString(R.string.reset_key));
|
|
||||||
resetPreference.setOnPreferenceClickListener(new OnPreferenceClickListener() {
|
|
||||||
@Override
|
|
||||||
public boolean onPreferenceClick(Preference arg0) {
|
|
||||||
showDialog(DIALOG_CONFIRM_RESET_ID);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// Add a confirmation dialog for the 'Allow access' preference.
|
|
||||||
CheckBoxPreference allowAccessPreference = (CheckBoxPreference) findPreference(
|
|
||||||
getString(R.string.allow_access_key));
|
|
||||||
allowAccessPreference.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
|
|
||||||
@Override
|
|
||||||
public boolean onPreferenceChange(Preference preference, Object newValue) {
|
|
||||||
if ((Boolean) newValue) {
|
|
||||||
showDialog(DIALOG_CONFIRM_ACCESS_ID);
|
|
||||||
return false;
|
|
||||||
} else {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Dialog onCreateDialog(int id) {
|
|
||||||
switch (id) {
|
|
||||||
case DIALOG_CONFIRM_RESET_ID:
|
|
||||||
return DialogUtils.createConfirmationDialog(
|
|
||||||
this, R.string.settings_reset_confirm_message, new DialogInterface.OnClickListener() {
|
|
||||||
@Override
|
|
||||||
public void onClick(DialogInterface dialog, int button) {
|
|
||||||
onResetPreferencesConfirmed();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
case DIALOG_CONFIRM_ACCESS_ID:
|
|
||||||
return DialogUtils.createConfirmationDialog(this,
|
|
||||||
R.string.settings_sharing_allow_access_confirm_message,
|
|
||||||
new DialogInterface.OnClickListener() {
|
|
||||||
@Override
|
|
||||||
public void onClick(DialogInterface dialog, int button) {
|
|
||||||
CheckBoxPreference pref = (CheckBoxPreference) findPreference(
|
|
||||||
getString(R.string.allow_access_key));
|
|
||||||
pref.setChecked(true);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
case DIALOG_CONFIRM_RESTORE_ID:
|
|
||||||
return DialogUtils.createConfirmationDialog(this,
|
|
||||||
R.string.settings_backup_restore_confirm_message,
|
|
||||||
new DialogInterface.OnClickListener() {
|
|
||||||
@Override
|
|
||||||
public void onClick(DialogInterface dialog, int which) {
|
|
||||||
Intent intent = IntentUtils.newIntent(
|
|
||||||
SettingsActivity.this, RestoreChooserActivity.class);
|
|
||||||
startActivity(intent);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
default:
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the display options for the 'Time between points' option.
|
|
||||||
*/
|
|
||||||
private void setRecordingIntervalOptions() {
|
|
||||||
String[] values = getResources().getStringArray(R.array.recording_interval_values);
|
|
||||||
String[] options = new String[values.length];
|
|
||||||
for (int i = 0; i < values.length; i++) {
|
|
||||||
if (values[i].equals(RECORDING_INTERVAL_ADAPT_BATTERY_LIFE)) {
|
|
||||||
options[i] = getString(R.string.value_adapt_battery_life);
|
|
||||||
} else if (values[i].equals(RECORDING_INTERVAL_ADAPT_ACCURACY)) {
|
|
||||||
options[i] = getString(R.string.value_adapt_accuracy);
|
|
||||||
} else if (values[i].equals(RECORDING_INTERVAL_RECOMMENDED)) {
|
|
||||||
options[i] = getString(R.string.value_smallest_recommended);
|
|
||||||
} else {
|
|
||||||
int value = Integer.parseInt(values[i]);
|
|
||||||
String format;
|
|
||||||
if (value < 60) {
|
|
||||||
format = getString(R.string.value_integer_second);
|
|
||||||
} else {
|
|
||||||
value = value / 60;
|
|
||||||
format = getString(R.string.value_integer_minute);
|
|
||||||
}
|
|
||||||
options[i] = String.format(format, value);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
ListPreference list = (ListPreference) findPreference(
|
|
||||||
getString(R.string.min_recording_interval_key));
|
|
||||||
list.setEntries(options);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the display options for the 'Auto-resume timeout' option.
|
|
||||||
*/
|
|
||||||
private void setAutoResumeTimeoutOptions() {
|
|
||||||
String[] values = getResources().getStringArray(R.array.recording_auto_resume_timeout_values);
|
|
||||||
String[] options = new String[values.length];
|
|
||||||
for (int i = 0; i < values.length; i++) {
|
|
||||||
if (values[i].equals(AUTO_RESUME_TIMEOUT_NEVER)) {
|
|
||||||
options[i] = getString(R.string.value_never);
|
|
||||||
} else if (values[i].equals(AUTO_RESUME_TIMEOUT_ALWAYS)) {
|
|
||||||
options[i] = getString(R.string.value_always);
|
|
||||||
} else {
|
|
||||||
int value = Integer.parseInt(values[i]);
|
|
||||||
String format = getString(R.string.value_integer_minute);
|
|
||||||
options[i] = String.format(format, value);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
ListPreference list = (ListPreference) findPreference(
|
|
||||||
getString(R.string.auto_resume_track_timeout_key));
|
|
||||||
list.setEntries(options);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void customizeSensorOptionsPreferences() {
|
|
||||||
ListPreference sensorTypePreference =
|
|
||||||
(ListPreference) findPreference(getString(R.string.sensor_type_key));
|
|
||||||
sensorTypePreference.setOnPreferenceChangeListener(
|
|
||||||
new OnPreferenceChangeListener() {
|
|
||||||
@Override
|
|
||||||
public boolean onPreferenceChange(Preference preference,
|
|
||||||
Object newValue) {
|
|
||||||
updateSensorSettings((String) newValue);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
updateSensorSettings(sensorTypePreference.getValue());
|
|
||||||
|
|
||||||
if (!AntUtils.hasAntSupport(this)) {
|
|
||||||
// The sensor options screen has a few ANT-specific options which we
|
|
||||||
// need to remove. First, we need to remove the ANT sensor types.
|
|
||||||
// Second, we need to remove the ANT unpairing options.
|
|
||||||
|
|
||||||
Set<Integer> toRemove = new HashSet<Integer>();
|
|
||||||
|
|
||||||
String[] antValues = getResources().getStringArray(R.array.sensor_type_ant_values);
|
|
||||||
for (String antValue : antValues) {
|
|
||||||
toRemove.add(sensorTypePreference.findIndexOfValue(antValue));
|
|
||||||
}
|
|
||||||
|
|
||||||
CharSequence[] entries = sensorTypePreference.getEntries();
|
|
||||||
CharSequence[] entryValues = sensorTypePreference.getEntryValues();
|
|
||||||
|
|
||||||
CharSequence[] filteredEntries = new CharSequence[entries.length - toRemove.size()];
|
|
||||||
CharSequence[] filteredEntryValues = new CharSequence[filteredEntries.length];
|
|
||||||
for (int i = 0, last = 0; i < entries.length; i++) {
|
|
||||||
if (!toRemove.contains(i)) {
|
|
||||||
filteredEntries[last] = entries[i];
|
|
||||||
filteredEntryValues[last++] = entryValues[i];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
sensorTypePreference.setEntries(filteredEntries);
|
|
||||||
sensorTypePreference.setEntryValues(filteredEntryValues);
|
|
||||||
|
|
||||||
PreferenceScreen sensorOptionsScreen =
|
|
||||||
(PreferenceScreen) findPreference(getString(R.string.sensor_options_key));
|
|
||||||
sensorOptionsScreen.removePreference(findPreference(getString(R.string.ant_options_key)));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void customizeTrackColorModePreferences() {
|
|
||||||
ListPreference trackColorModePreference =
|
|
||||||
(ListPreference) findPreference(getString(R.string.track_color_mode_key));
|
|
||||||
trackColorModePreference.setOnPreferenceChangeListener(
|
|
||||||
new OnPreferenceChangeListener() {
|
|
||||||
@Override
|
|
||||||
public boolean onPreferenceChange(Preference preference,
|
|
||||||
Object newValue) {
|
|
||||||
updateTrackColorModeSettings((String) newValue);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
updateTrackColorModeSettings(trackColorModePreference.getValue());
|
|
||||||
|
|
||||||
setTrackColorModePreferenceListeners();
|
|
||||||
|
|
||||||
PreferenceCategory speedOptionsCategory = (PreferenceCategory) findPreference(
|
|
||||||
getString(R.string.track_color_mode_fixed_speed_options_key));
|
|
||||||
|
|
||||||
speedOptionsCategory.removePreference(
|
|
||||||
findPreference(getString(R.string.track_color_mode_fixed_speed_slow_key)));
|
|
||||||
speedOptionsCategory.removePreference(
|
|
||||||
findPreference(getString(R.string.track_color_mode_fixed_speed_medium_key)));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onResume() {
|
|
||||||
super.onResume();
|
|
||||||
|
|
||||||
configureBluetoothPreferences();
|
|
||||||
Preference backupNowPreference =
|
|
||||||
findPreference(getString(R.string.backup_to_sd_key));
|
|
||||||
Preference restoreNowPreference =
|
|
||||||
findPreference(getString(R.string.restore_from_sd_key));
|
|
||||||
Preference resetPreference = findPreference(getString(R.string.reset_key));
|
|
||||||
|
|
||||||
// If recording, disable backup/restore/reset
|
|
||||||
// (we don't want to get to inconsistent states)
|
|
||||||
boolean recording = PreferencesUtils.getRecordingTrackId(this) != -1;
|
|
||||||
backupNowPreference.setEnabled(!recording);
|
|
||||||
restoreNowPreference.setEnabled(!recording);
|
|
||||||
resetPreference.setEnabled(!recording);
|
|
||||||
backupNowPreference.setSummary(
|
|
||||||
recording ? R.string.settings_not_while_recording
|
|
||||||
: R.string.settings_backup_now_summary);
|
|
||||||
restoreNowPreference.setSummary(
|
|
||||||
recording ? R.string.settings_not_while_recording
|
|
||||||
: R.string.settings_backup_restore_summary);
|
|
||||||
resetPreference.setSummary(
|
|
||||||
recording ? R.string.settings_not_while_recording
|
|
||||||
: R.string.settings_reset_summary);
|
|
||||||
|
|
||||||
// Add actions to the backup preferences
|
|
||||||
backupNowPreference.setOnPreferenceClickListener(new OnPreferenceClickListener() {
|
|
||||||
@Override
|
|
||||||
public boolean onPreferenceClick(Preference preference) {
|
|
||||||
Intent intent = IntentUtils.newIntent(SettingsActivity.this, BackupActivity.class);
|
|
||||||
startActivity(intent);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
restoreNowPreference.setOnPreferenceClickListener(new OnPreferenceClickListener() {
|
|
||||||
@Override
|
|
||||||
public boolean onPreferenceClick(Preference preference) {
|
|
||||||
showDialog(DIALOG_CONFIRM_RESTORE_ID);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onDestroy() {
|
|
||||||
getPreferenceManager().getSharedPreferences()
|
|
||||||
.unregisterOnSharedPreferenceChangeListener(backupListener);
|
|
||||||
|
|
||||||
super.onPause();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void updateSensorSettings(String sensorType) {
|
|
||||||
boolean usesBluetooth =
|
|
||||||
getString(R.string.sensor_type_value_zephyr).equals(sensorType)
|
|
||||||
|| getString(R.string.sensor_type_value_polar).equals(sensorType);
|
|
||||||
findPreference(
|
|
||||||
getString(R.string.bluetooth_sensor_key)).setEnabled(usesBluetooth);
|
|
||||||
findPreference(
|
|
||||||
getString(R.string.bluetooth_pairing_key)).setEnabled(usesBluetooth);
|
|
||||||
|
|
||||||
// Update the ANT+ sensors.
|
|
||||||
// TODO: Only enable on phones that have ANT+.
|
|
||||||
Preference antHrm = findPreference(getString(R.string.ant_heart_rate_sensor_id_key));
|
|
||||||
Preference antSrm = findPreference(getString(R.string.ant_srm_bridge_sensor_id_key));
|
|
||||||
if (antHrm != null && antSrm != null) {
|
|
||||||
antHrm
|
|
||||||
.setEnabled(getString(R.string.sensor_type_value_ant).equals(sensorType));
|
|
||||||
antSrm
|
|
||||||
.setEnabled(getString(R.string.sensor_type_value_srm_ant_bridge).equals(sensorType));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void updateTrackColorModeSettings(String trackColorMode) {
|
|
||||||
boolean usesFixedSpeed =
|
|
||||||
trackColorMode.equals(getString(R.string.display_track_color_value_fixed));
|
|
||||||
boolean usesDynamicSpeed =
|
|
||||||
trackColorMode.equals(getString(R.string.display_track_color_value_dynamic));
|
|
||||||
|
|
||||||
findPreference(getString(R.string.track_color_mode_fixed_speed_slow_display_key))
|
|
||||||
.setEnabled(usesFixedSpeed);
|
|
||||||
findPreference(getString(R.string.track_color_mode_fixed_speed_medium_display_key))
|
|
||||||
.setEnabled(usesFixedSpeed);
|
|
||||||
findPreference(getString(R.string.track_color_mode_dynamic_speed_variation_key))
|
|
||||||
.setEnabled(usesDynamicSpeed);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Updates display options that depends on the preferred distance units, metric or imperial.
|
|
||||||
*
|
|
||||||
* @param isMetric true to use metric units, false to use imperial
|
|
||||||
*/
|
|
||||||
private void updateDisplayOptions(boolean isMetric) {
|
|
||||||
setTaskOptions(isMetric, R.string.announcement_frequency_key);
|
|
||||||
setTaskOptions(isMetric, R.string.split_frequency_key);
|
|
||||||
setRecordingDistanceOptions(isMetric, R.string.min_recording_distance_key);
|
|
||||||
setTrackDistanceOptions(isMetric, R.string.max_recording_distance_key);
|
|
||||||
setGpsAccuracyOptions(isMetric, R.string.min_required_accuracy_key);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the display options for a periodic task.
|
|
||||||
*/
|
|
||||||
private void setTaskOptions(boolean isMetric, int listId) {
|
|
||||||
String[] values = getResources().getStringArray(R.array.recording_task_frequency_values);
|
|
||||||
String[] options = new String[values.length];
|
|
||||||
for (int i = 0; i < values.length; i++) {
|
|
||||||
if (values[i].equals(TASK_FREQUENCY_OFF)) {
|
|
||||||
options[i] = getString(R.string.value_off);
|
|
||||||
} else if (values[i].startsWith("-")) {
|
|
||||||
int value = Integer.parseInt(values[i].substring(1));
|
|
||||||
int stringId = isMetric ? R.string.value_integer_kilometer : R.string.value_integer_mile;
|
|
||||||
String format = getString(stringId);
|
|
||||||
options[i] = String.format(format, value);
|
|
||||||
} else {
|
|
||||||
int value = Integer.parseInt(values[i]);
|
|
||||||
String format = getString(R.string.value_integer_minute);
|
|
||||||
options[i] = String.format(format, value);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ListPreference list = (ListPreference) findPreference(getString(listId));
|
|
||||||
list.setEntries(options);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the display options for 'Distance between points' option.
|
|
||||||
*/
|
|
||||||
private void setRecordingDistanceOptions(boolean isMetric, int listId) {
|
|
||||||
String[] values = getResources().getStringArray(R.array.recording_distance_values);
|
|
||||||
String[] options = new String[values.length];
|
|
||||||
for (int i = 0; i < values.length; i++) {
|
|
||||||
int value = Integer.parseInt(values[i]);
|
|
||||||
if (!isMetric) {
|
|
||||||
value = (int) (value * UnitConversions.M_TO_FT);
|
|
||||||
}
|
|
||||||
String format;
|
|
||||||
if (values[i].equals(RECORDING_DISTANCE_RECOMMENDED)) {
|
|
||||||
int stringId = isMetric ? R.string.value_integer_meter_recommended
|
|
||||||
: R.string.value_integer_feet_recommended;
|
|
||||||
format = getString(stringId);
|
|
||||||
} else {
|
|
||||||
int stringId = isMetric ? R.string.value_integer_meter : R.string.value_integer_feet;
|
|
||||||
format = getString(stringId);
|
|
||||||
}
|
|
||||||
options[i] = String.format(format, value);
|
|
||||||
}
|
|
||||||
|
|
||||||
ListPreference list = (ListPreference) findPreference(getString(listId));
|
|
||||||
list.setEntries(options);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the display options for 'Distance between Tracks'.
|
|
||||||
*/
|
|
||||||
private void setTrackDistanceOptions(boolean isMetric, int listId) {
|
|
||||||
String[] values = getResources().getStringArray(R.array.recording_track_distance_values);
|
|
||||||
String[] options = new String[values.length];
|
|
||||||
for (int i = 0; i < values.length; i++) {
|
|
||||||
int value = Integer.parseInt(values[i]);
|
|
||||||
String format;
|
|
||||||
if (isMetric) {
|
|
||||||
int stringId = values[i].equals(TRACK_DISTANCE_RECOMMENDED)
|
|
||||||
? R.string.value_integer_meter_recommended : R.string.value_integer_meter;
|
|
||||||
format = getString(stringId);
|
|
||||||
options[i] = String.format(format, value);
|
|
||||||
} else {
|
|
||||||
value = (int) (value * UnitConversions.M_TO_FT);
|
|
||||||
if (value < 2000) {
|
|
||||||
int stringId = values[i].equals(TRACK_DISTANCE_RECOMMENDED)
|
|
||||||
? R.string.value_integer_feet_recommended : R.string.value_integer_feet;
|
|
||||||
format = getString(stringId);
|
|
||||||
options[i] = String.format(format, value);
|
|
||||||
} else {
|
|
||||||
double mile = value * UnitConversions.FT_TO_MI;
|
|
||||||
format = getString(R.string.value_float_mile);
|
|
||||||
options[i] = String.format(format, mile);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ListPreference list = (ListPreference) findPreference(getString(listId));
|
|
||||||
list.setEntries(options);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the display options for 'GPS accuracy'.
|
|
||||||
*/
|
|
||||||
private void setGpsAccuracyOptions(boolean isMetric, int listId) {
|
|
||||||
String[] values = getResources().getStringArray(R.array.recording_gps_accuracy_values);
|
|
||||||
String[] options = new String[values.length];
|
|
||||||
for (int i = 0; i < values.length; i++) {
|
|
||||||
int value = Integer.parseInt(values[i]);
|
|
||||||
String format;
|
|
||||||
if (isMetric) {
|
|
||||||
if (values[i].equals(GPS_ACCURACY_RECOMMENDED)) {
|
|
||||||
format = getString(R.string.value_integer_meter_recommended);
|
|
||||||
} else if (values[i].equals(GPS_ACCURACY_EXCELLENT)) {
|
|
||||||
format = getString(R.string.value_integer_meter_excellent_gps);
|
|
||||||
} else if (values[i].equals(GPS_ACCURACY_POOR)) {
|
|
||||||
format = getString(R.string.value_integer_meter_poor_gps);
|
|
||||||
} else {
|
|
||||||
format = getString(R.string.value_integer_meter);
|
|
||||||
}
|
|
||||||
options[i] = String.format(format, value);
|
|
||||||
} else {
|
|
||||||
value = (int) (value * UnitConversions.M_TO_FT);
|
|
||||||
if (value < 2000) {
|
|
||||||
if (values[i].equals(GPS_ACCURACY_RECOMMENDED)) {
|
|
||||||
format = getString(R.string.value_integer_feet_recommended);
|
|
||||||
} else if (values[i].equals(GPS_ACCURACY_EXCELLENT)) {
|
|
||||||
format = getString(R.string.value_integer_feet_excellent_gps);
|
|
||||||
} else {
|
|
||||||
format = getString(R.string.value_integer_feet);
|
|
||||||
}
|
|
||||||
options[i] = String.format(format, value);
|
|
||||||
} else {
|
|
||||||
double mile = value * UnitConversions.FT_TO_MI;
|
|
||||||
if (values[i].equals(GPS_ACCURACY_POOR)) {
|
|
||||||
format = getString(R.string.value_float_mile_poor_gps);
|
|
||||||
} else {
|
|
||||||
format = getString(R.string.value_float_mile);
|
|
||||||
}
|
|
||||||
options[i] = String.format(format, mile);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
ListPreference list = (ListPreference) findPreference(getString(listId));
|
|
||||||
list.setEntries(options);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Configures preference actions related to bluetooth.
|
|
||||||
*/
|
|
||||||
private void configureBluetoothPreferences() {
|
|
||||||
// Populate the list of bluetooth devices
|
|
||||||
populateBluetoothDeviceList();
|
|
||||||
// Make the pair devices preference go to the system preferences
|
|
||||||
findPreference(getString(R.string.bluetooth_pairing_key)).setOnPreferenceClickListener(
|
|
||||||
new OnPreferenceClickListener() {
|
|
||||||
public boolean onPreferenceClick(Preference preference) {
|
|
||||||
Intent settingsIntent = new Intent(Settings.ACTION_BLUETOOTH_SETTINGS);
|
|
||||||
startActivity(settingsIntent);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Populates the list preference with all available bluetooth devices.
|
|
||||||
*/
|
|
||||||
private void populateBluetoothDeviceList() {
|
|
||||||
// Build the list of entries and their values
|
|
||||||
List<String> entries = new ArrayList<String>();
|
|
||||||
List<String> entryValues = new ArrayList<String>();
|
|
||||||
|
|
||||||
// The actual devices
|
|
||||||
BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
|
|
||||||
if (bluetoothAdapter != null) {
|
|
||||||
BluetoothDeviceUtils.populateDeviceLists(bluetoothAdapter, entries, entryValues);
|
|
||||||
}
|
|
||||||
|
|
||||||
CharSequence[] entriesArray = entries.toArray(new CharSequence[entries.size()]);
|
|
||||||
CharSequence[] entryValuesArray = entryValues.toArray(new CharSequence[entryValues.size()]);
|
|
||||||
ListPreference devicesPreference =
|
|
||||||
(ListPreference) findPreference(getString(R.string.bluetooth_sensor_key));
|
|
||||||
devicesPreference.setEntryValues(entryValuesArray);
|
|
||||||
devicesPreference.setEntries(entriesArray);
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Callback for when user confirms resetting all settings. */
|
|
||||||
private void onResetPreferencesConfirmed() {
|
|
||||||
// Change preferences in a separate thread.
|
|
||||||
new Thread() {
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
Log.i(TAG, "Resetting all settings");
|
|
||||||
|
|
||||||
// Actually wipe preferences (and save synchronously).
|
|
||||||
preferences.edit().clear().commit();
|
|
||||||
|
|
||||||
// Give UI feedback in the UI thread.
|
|
||||||
runOnUiThread(new Runnable() {
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
// Give feedback to the user.
|
|
||||||
Toast.makeText(
|
|
||||||
SettingsActivity.this,
|
|
||||||
R.string.settings_reset_done,
|
|
||||||
Toast.LENGTH_SHORT).show();
|
|
||||||
|
|
||||||
// Restart the settings activity so all changes are loaded.
|
|
||||||
Intent intent = getIntent()
|
|
||||||
.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
|
|
||||||
startActivity(intent);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}.start();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set the given edit text preference text.
|
|
||||||
* If the units are not metric convert the value before displaying.
|
|
||||||
*/
|
|
||||||
private void viewTrackColorModeSettings(EditTextPreference preference, int id) {
|
|
||||||
if (PreferencesUtils.isMetricUnits(this)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// Convert miles/h to km/h
|
|
||||||
SharedPreferences prefs = getPreferenceManager().getSharedPreferences();
|
|
||||||
String metricspeed = prefs.getString(getString(id), null);
|
|
||||||
int englishspeed;
|
|
||||||
try {
|
|
||||||
englishspeed = (int) (Double.parseDouble(metricspeed) * UnitConversions.KM_TO_MI);
|
|
||||||
} catch (NumberFormatException e) {
|
|
||||||
englishspeed = 0;
|
|
||||||
}
|
|
||||||
preference.getEditText().setText(String.valueOf(englishspeed));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Saves the given edit text preference value.
|
|
||||||
* If the units are not metric convert the value before saving.
|
|
||||||
*/
|
|
||||||
private void validateTrackColorModeSettings(String newValue, int id) {
|
|
||||||
String metricspeed;
|
|
||||||
if (PreferencesUtils.isMetricUnits(this)) {
|
|
||||||
metricspeed = newValue;
|
|
||||||
} else {
|
|
||||||
// Convert miles/h to km/h
|
|
||||||
try {
|
|
||||||
metricspeed = String.valueOf(
|
|
||||||
(int) (Double.parseDouble(newValue) * UnitConversions.MI_TO_KM));
|
|
||||||
} catch (NumberFormatException e) {
|
|
||||||
metricspeed = "0";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
SharedPreferences prefs = getPreferenceManager().getSharedPreferences();
|
|
||||||
Editor editor = prefs.edit();
|
|
||||||
editor.putString(getString(id), metricspeed);
|
|
||||||
ApiAdapterFactory.getApiAdapter().applyPreferenceChanges(editor);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the TrackColorMode preference listeners.
|
|
||||||
*/
|
|
||||||
private void setTrackColorModePreferenceListeners() {
|
|
||||||
setTrackColorModePreferenceListener(R.string.track_color_mode_fixed_speed_slow_display_key,
|
|
||||||
R.string.track_color_mode_fixed_speed_slow_key);
|
|
||||||
setTrackColorModePreferenceListener(R.string.track_color_mode_fixed_speed_medium_display_key,
|
|
||||||
R.string.track_color_mode_fixed_speed_medium_key);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets a TrackColorMode preference listener.
|
|
||||||
*/
|
|
||||||
private void setTrackColorModePreferenceListener(int displayKey, final int metricKey) {
|
|
||||||
EditTextPreference trackColorModePreference =
|
|
||||||
(EditTextPreference) findPreference(getString(displayKey));
|
|
||||||
trackColorModePreference.setOnPreferenceChangeListener(
|
|
||||||
new OnPreferenceChangeListener() {
|
|
||||||
@Override
|
|
||||||
public boolean onPreferenceChange(Preference preference,
|
|
||||||
Object newValue) {
|
|
||||||
validateTrackColorModeSettings((String) newValue, metricKey);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
trackColorModePreference.setOnPreferenceClickListener(
|
|
||||||
new OnPreferenceClickListener() {
|
|
||||||
@Override
|
|
||||||
public boolean onPreferenceClick(Preference preference) {
|
|
||||||
viewTrackColorModeSettings((EditTextPreference) preference, metricKey);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -21,19 +21,17 @@ import com.google.android.apps.mytracks.content.TrackDataHub;
|
|||||||
import com.google.android.apps.mytracks.content.Waypoint;
|
import com.google.android.apps.mytracks.content.Waypoint;
|
||||||
import com.google.android.apps.mytracks.content.WaypointCreationRequest;
|
import com.google.android.apps.mytracks.content.WaypointCreationRequest;
|
||||||
import com.google.android.apps.mytracks.fragments.ChartFragment;
|
import com.google.android.apps.mytracks.fragments.ChartFragment;
|
||||||
import com.google.android.apps.mytracks.fragments.ChartSettingsDialogFragment;
|
|
||||||
import com.google.android.apps.mytracks.fragments.DeleteOneTrackDialogFragment;
|
import com.google.android.apps.mytracks.fragments.DeleteOneTrackDialogFragment;
|
||||||
import com.google.android.apps.mytracks.fragments.InstallEarthDialogFragment;
|
import com.google.android.apps.mytracks.fragments.InstallEarthDialogFragment;
|
||||||
import com.google.android.apps.mytracks.fragments.MapFragment;
|
import com.google.android.apps.mytracks.fragments.MapFragment;
|
||||||
import com.google.android.apps.mytracks.fragments.MarkerAddDialogFragment;
|
import com.google.android.apps.mytracks.fragments.MarkerAddDialogFragment;
|
||||||
import com.google.android.apps.mytracks.fragments.StatsFragment;
|
import com.google.android.apps.mytracks.fragments.StatsFragment;
|
||||||
import com.google.android.apps.mytracks.fragments.StatsSettingsDialogFragment;
|
|
||||||
import com.google.android.apps.mytracks.fragments.StatsSettingsDialogFragment.OnStatsSettingsChangedListener;
|
|
||||||
import com.google.android.apps.mytracks.io.file.SaveActivity;
|
import com.google.android.apps.mytracks.io.file.SaveActivity;
|
||||||
import com.google.android.apps.mytracks.io.file.TrackWriterFactory.TrackFileFormat;
|
import com.google.android.apps.mytracks.io.file.TrackWriterFactory.TrackFileFormat;
|
||||||
import com.google.android.apps.mytracks.io.sendtogoogle.SendRequest;
|
import com.google.android.apps.mytracks.io.sendtogoogle.SendRequest;
|
||||||
import com.google.android.apps.mytracks.io.sendtogoogle.UploadServiceChooserActivity;
|
import com.google.android.apps.mytracks.io.sendtogoogle.UploadServiceChooserActivity;
|
||||||
import com.google.android.apps.mytracks.services.TrackRecordingServiceConnection;
|
import com.google.android.apps.mytracks.services.TrackRecordingServiceConnection;
|
||||||
|
import com.google.android.apps.mytracks.settings.SettingsActivity;
|
||||||
import com.google.android.apps.mytracks.util.AnalyticsUtils;
|
import com.google.android.apps.mytracks.util.AnalyticsUtils;
|
||||||
import com.google.android.apps.mytracks.util.ApiAdapterFactory;
|
import com.google.android.apps.mytracks.util.ApiAdapterFactory;
|
||||||
import com.google.android.apps.mytracks.util.IntentUtils;
|
import com.google.android.apps.mytracks.util.IntentUtils;
|
||||||
@@ -65,8 +63,7 @@ import java.util.List;
|
|||||||
* @author Leif Hendrik Wilden
|
* @author Leif Hendrik Wilden
|
||||||
* @author Rodrigo Damazio
|
* @author Rodrigo Damazio
|
||||||
*/
|
*/
|
||||||
public class TrackDetailActivity extends AbstractMyTracksActivity
|
public class TrackDetailActivity extends AbstractMyTracksActivity {
|
||||||
implements OnStatsSettingsChangedListener {
|
|
||||||
|
|
||||||
public static final String EXTRA_TRACK_ID = "track_id";
|
public static final String EXTRA_TRACK_ID = "track_id";
|
||||||
public static final String EXTRA_MARKER_ID = "marker_id";
|
public static final String EXTRA_MARKER_ID = "marker_id";
|
||||||
@@ -74,7 +71,6 @@ public class TrackDetailActivity extends AbstractMyTracksActivity
|
|||||||
private static final String TAG = TrackDetailActivity.class.getSimpleName();
|
private static final String TAG = TrackDetailActivity.class.getSimpleName();
|
||||||
private static final String CURRENT_TAG_KEY = "tab";
|
private static final String CURRENT_TAG_KEY = "tab";
|
||||||
|
|
||||||
private SharedPreferences sharedPreferences;
|
|
||||||
private TrackDataHub trackDataHub;
|
private TrackDataHub trackDataHub;
|
||||||
private TrackRecordingServiceConnection trackRecordingServiceConnection;
|
private TrackRecordingServiceConnection trackRecordingServiceConnection;
|
||||||
private TabHost tabHost;
|
private TabHost tabHost;
|
||||||
@@ -96,12 +92,13 @@ public class TrackDetailActivity extends AbstractMyTracksActivity
|
|||||||
* Note that sharedPreferenceChangeListener cannot be an anonymous inner
|
* Note that sharedPreferenceChangeListener cannot be an anonymous inner
|
||||||
* class. Anonymous inner class will get garbage collected.
|
* class. Anonymous inner class will get garbage collected.
|
||||||
*/
|
*/
|
||||||
private final OnSharedPreferenceChangeListener sharedPreferenceChangeListener =
|
private final OnSharedPreferenceChangeListener
|
||||||
new OnSharedPreferenceChangeListener() {
|
sharedPreferenceChangeListener = new OnSharedPreferenceChangeListener() {
|
||||||
@Override
|
@Override
|
||||||
public void onSharedPreferenceChanged(SharedPreferences preferences, String key) {
|
public void onSharedPreferenceChanged(SharedPreferences preferences, String key) {
|
||||||
// Note that key can be null
|
// Note that key can be null
|
||||||
if (PreferencesUtils.getRecordingTrackIdKey(TrackDetailActivity.this).equals(key)) {
|
if (PreferencesUtils.getKey(TrackDetailActivity.this, R.string.recording_track_id_key)
|
||||||
|
.equals(key)) {
|
||||||
updateMenu();
|
updateMenu();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -131,9 +128,9 @@ public class TrackDetailActivity extends AbstractMyTracksActivity
|
|||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
ApiAdapterFactory.getApiAdapter().hideTitle(this);
|
ApiAdapterFactory.getApiAdapter().hideTitle(this);
|
||||||
setContentView(R.layout.track_detail);
|
setContentView(R.layout.track_detail);
|
||||||
|
|
||||||
sharedPreferences = getSharedPreferences(Constants.SETTINGS_NAME, Context.MODE_PRIVATE);
|
getSharedPreferences(Constants.SETTINGS_NAME, Context.MODE_PRIVATE)
|
||||||
sharedPreferences.registerOnSharedPreferenceChangeListener(sharedPreferenceChangeListener);
|
.registerOnSharedPreferenceChangeListener(sharedPreferenceChangeListener);
|
||||||
trackDataHub = ((MyTracksApplication) getApplication()).getTrackDataHub();
|
trackDataHub = ((MyTracksApplication) getApplication()).getTrackDataHub();
|
||||||
trackRecordingServiceConnection = new TrackRecordingServiceConnection(this, null);
|
trackRecordingServiceConnection = new TrackRecordingServiceConnection(this, null);
|
||||||
|
|
||||||
@@ -230,31 +227,6 @@ public class TrackDetailActivity extends AbstractMyTracksActivity
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean onPrepareOptionsMenu(Menu menu) {
|
|
||||||
String currentTabTag = tabHost.getCurrentTabTag();
|
|
||||||
menu.findItem(R.id.track_detail_chart_settings).setVisible(
|
|
||||||
ChartFragment.CHART_FRAGMENT_TAG.equals(currentTabTag));
|
|
||||||
menu.findItem(R.id.track_detail_stats_settings).setVisible(
|
|
||||||
StatsFragment.STATS_FRAGMENT_TAG.equals(currentTabTag));
|
|
||||||
MenuItem satelliteMode = menu.findItem(R.id.track_detail_satellite_mode)
|
|
||||||
.setVisible(MapFragment.MAP_FRAGMENT_TAG.equals(currentTabTag));
|
|
||||||
|
|
||||||
if (satelliteMode.isVisible()) {
|
|
||||||
MapFragment mapFragment = (MapFragment) getSupportFragmentManager()
|
|
||||||
.findFragmentByTag(MapFragment.MAP_FRAGMENT_TAG);
|
|
||||||
/*
|
|
||||||
* The current tag is mapFragment, thus safe to call its methods like
|
|
||||||
* isSatelliteView.
|
|
||||||
*/
|
|
||||||
boolean isSatelliteMode = mapFragment != null ? mapFragment.isSatelliteView() : false;
|
|
||||||
menu.findItem(R.id.track_detail_satellite_mode).setTitle(
|
|
||||||
isSatelliteMode ? R.string.menu_map_mode : R.string.menu_satellite_mode);
|
|
||||||
}
|
|
||||||
|
|
||||||
return super.onPrepareOptionsMenu(menu);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onHomeSelected() {
|
protected void onHomeSelected() {
|
||||||
Intent intent = IntentUtils.newIntent(this, TrackListActivity.class);
|
Intent intent = IntentUtils.newIntent(this, TrackListActivity.class);
|
||||||
@@ -263,7 +235,6 @@ public class TrackDetailActivity extends AbstractMyTracksActivity
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean onOptionsItemSelected(MenuItem item) {
|
public boolean onOptionsItemSelected(MenuItem item) {
|
||||||
MapFragment mapFragment;
|
|
||||||
Intent intent;
|
Intent intent;
|
||||||
switch (item.getItemId()) {
|
switch (item.getItemId()) {
|
||||||
case R.id.track_detail_stop_recording:
|
case R.id.track_detail_stop_recording:
|
||||||
@@ -340,25 +311,10 @@ public class TrackDetailActivity extends AbstractMyTracksActivity
|
|||||||
DeleteOneTrackDialogFragment.newInstance(trackId).show(
|
DeleteOneTrackDialogFragment.newInstance(trackId).show(
|
||||||
getSupportFragmentManager(), DeleteOneTrackDialogFragment.DELETE_ONE_TRACK_DIALOG_TAG);
|
getSupportFragmentManager(), DeleteOneTrackDialogFragment.DELETE_ONE_TRACK_DIALOG_TAG);
|
||||||
return true;
|
return true;
|
||||||
case R.id.track_detail_satellite_mode:
|
|
||||||
mapFragment = (MapFragment) getSupportFragmentManager()
|
|
||||||
.findFragmentByTag(MapFragment.MAP_FRAGMENT_TAG);
|
|
||||||
if (mapFragment != null) {
|
|
||||||
mapFragment.setSatelliteView(!mapFragment.isSatelliteView());
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
case R.id.track_detail_sensor_state:
|
case R.id.track_detail_sensor_state:
|
||||||
intent = IntentUtils.newIntent(this, SensorStateActivity.class);
|
intent = IntentUtils.newIntent(this, SensorStateActivity.class);
|
||||||
startActivity(intent);
|
startActivity(intent);
|
||||||
return true;
|
return true;
|
||||||
case R.id.track_detail_chart_settings:
|
|
||||||
new ChartSettingsDialogFragment().show(
|
|
||||||
getSupportFragmentManager(), ChartSettingsDialogFragment.CHART_SETTINGS_DIALOG_TAG);
|
|
||||||
return true;
|
|
||||||
case R.id.track_detail_stats_settings:
|
|
||||||
new StatsSettingsDialogFragment().show(
|
|
||||||
getSupportFragmentManager(), StatsSettingsDialogFragment.STATS_SETTINGS_DIALOG_TAG);
|
|
||||||
return true;
|
|
||||||
case R.id.track_detail_settings:
|
case R.id.track_detail_settings:
|
||||||
intent = IntentUtils.newIntent(this, SettingsActivity.class);
|
intent = IntentUtils.newIntent(this, SettingsActivity.class);
|
||||||
startActivity(intent);
|
startActivity(intent);
|
||||||
@@ -391,13 +347,6 @@ public class TrackDetailActivity extends AbstractMyTracksActivity
|
|||||||
return mapViewContainer;
|
return mapViewContainer;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onStatsSettingsChanged() {
|
|
||||||
StatsFragment statsFragment = (StatsFragment) getSupportFragmentManager()
|
|
||||||
.findFragmentByTag(StatsFragment.STATS_FRAGMENT_TAG);
|
|
||||||
statsFragment.updateUi();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Handles the data in the intent.
|
* Handles the data in the intent.
|
||||||
*/
|
*/
|
||||||
@@ -438,7 +387,7 @@ public class TrackDetailActivity extends AbstractMyTracksActivity
|
|||||||
* Updates the menu.
|
* Updates the menu.
|
||||||
*/
|
*/
|
||||||
private void updateMenu() {
|
private void updateMenu() {
|
||||||
updateMenuItems(trackId == PreferencesUtils.getRecordingTrackId(this));
|
updateMenuItems(trackId == PreferencesUtils.getLong(this, R.string.recording_track_id_key));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ import com.google.android.apps.mytracks.fragments.WelcomeDialogFragment;
|
|||||||
import com.google.android.apps.mytracks.io.file.TrackWriterFactory.TrackFileFormat;
|
import com.google.android.apps.mytracks.io.file.TrackWriterFactory.TrackFileFormat;
|
||||||
import com.google.android.apps.mytracks.services.ITrackRecordingService;
|
import com.google.android.apps.mytracks.services.ITrackRecordingService;
|
||||||
import com.google.android.apps.mytracks.services.TrackRecordingServiceConnection;
|
import com.google.android.apps.mytracks.services.TrackRecordingServiceConnection;
|
||||||
|
import com.google.android.apps.mytracks.settings.SettingsActivity;
|
||||||
import com.google.android.apps.mytracks.util.ApiAdapterFactory;
|
import com.google.android.apps.mytracks.util.ApiAdapterFactory;
|
||||||
import com.google.android.apps.mytracks.util.EulaUtils;
|
import com.google.android.apps.mytracks.util.EulaUtils;
|
||||||
import com.google.android.apps.mytracks.util.IntentUtils;
|
import com.google.android.apps.mytracks.util.IntentUtils;
|
||||||
@@ -119,12 +120,16 @@ public class TrackListActivity extends FragmentActivity {
|
|||||||
public void onSharedPreferenceChanged(SharedPreferences preferences, String key) {
|
public void onSharedPreferenceChanged(SharedPreferences preferences, String key) {
|
||||||
boolean updateList = false;
|
boolean updateList = false;
|
||||||
// Note that key can be null
|
// Note that key can be null
|
||||||
if (PreferencesUtils.getMetricUnitsKey(TrackListActivity.this).equals(key)) {
|
if (PreferencesUtils.getKey(TrackListActivity.this, R.string.metric_units_key)
|
||||||
metricUnits = PreferencesUtils.isMetricUnits(TrackListActivity.this);
|
.equals(key)) {
|
||||||
|
metricUnits = PreferencesUtils.getBoolean(TrackListActivity.this,
|
||||||
|
R.string.metric_units_key, PreferencesUtils.METRIC_UNITS_DEFAULT);
|
||||||
updateList = true;
|
updateList = true;
|
||||||
}
|
}
|
||||||
if (PreferencesUtils.getRecordingTrackIdKey(TrackListActivity.this).equals(key)) {
|
if (PreferencesUtils.getKey(TrackListActivity.this, R.string.recording_track_id_key)
|
||||||
recordingTrackId = PreferencesUtils.getRecordingTrackId(TrackListActivity.this);
|
.equals(key)) {
|
||||||
|
recordingTrackId = PreferencesUtils.getLong(
|
||||||
|
TrackListActivity.this, R.string.recording_track_id_key);
|
||||||
if (TrackRecordingServiceConnectionUtils.isRecording(
|
if (TrackRecordingServiceConnectionUtils.isRecording(
|
||||||
TrackListActivity.this, trackRecordingServiceConnection)) {
|
TrackListActivity.this, trackRecordingServiceConnection)) {
|
||||||
trackRecordingServiceConnection.startAndBind();
|
trackRecordingServiceConnection.startAndBind();
|
||||||
@@ -173,11 +178,11 @@ public class TrackListActivity extends FragmentActivity {
|
|||||||
trackRecordingServiceConnection = new TrackRecordingServiceConnection(
|
trackRecordingServiceConnection = new TrackRecordingServiceConnection(
|
||||||
this, bindChangedCallback);
|
this, bindChangedCallback);
|
||||||
|
|
||||||
SharedPreferences sharedPreferences = getSharedPreferences(
|
getSharedPreferences(Constants.SETTINGS_NAME, Context.MODE_PRIVATE)
|
||||||
Constants.SETTINGS_NAME, Context.MODE_PRIVATE);
|
.registerOnSharedPreferenceChangeListener(sharedPreferenceChangeListener);
|
||||||
sharedPreferences.registerOnSharedPreferenceChangeListener(sharedPreferenceChangeListener);
|
metricUnits = PreferencesUtils.getBoolean(
|
||||||
metricUnits = PreferencesUtils.isMetricUnits(this);
|
this, R.string.metric_units_key, PreferencesUtils.METRIC_UNITS_DEFAULT);
|
||||||
recordingTrackId = PreferencesUtils.getRecordingTrackId(this);
|
recordingTrackId = PreferencesUtils.getLong(this, R.string.recording_track_id_key);
|
||||||
|
|
||||||
ImageButton recordImageButton = (ImageButton) findViewById(R.id.track_list_record_button);
|
ImageButton recordImageButton = (ImageButton) findViewById(R.id.track_list_record_button);
|
||||||
recordImageButton.setOnClickListener(new View.OnClickListener() {
|
recordImageButton.setOnClickListener(new View.OnClickListener() {
|
||||||
@@ -274,14 +279,16 @@ public class TrackListActivity extends FragmentActivity {
|
|||||||
EulaDialogFragment.newInstance(false)
|
EulaDialogFragment.newInstance(false)
|
||||||
.show(getSupportFragmentManager(), EulaDialogFragment.EULA_DIALOG_TAG);
|
.show(getSupportFragmentManager(), EulaDialogFragment.EULA_DIALOG_TAG);
|
||||||
}
|
}
|
||||||
} else if (PreferencesUtils.isShowWelcomeDialog(this)) {
|
} else if (PreferencesUtils.getBoolean(
|
||||||
|
this, R.string.show_welcome_dialog_key, PreferencesUtils.SHOW_WELCOME_DIALOG_DEFAULT)) {
|
||||||
Fragment fragment = getSupportFragmentManager()
|
Fragment fragment = getSupportFragmentManager()
|
||||||
.findFragmentByTag(WelcomeDialogFragment.WELCOME_DIALOG_TAG);
|
.findFragmentByTag(WelcomeDialogFragment.WELCOME_DIALOG_TAG);
|
||||||
if (fragment == null) {
|
if (fragment == null) {
|
||||||
new WelcomeDialogFragment().show(
|
new WelcomeDialogFragment().show(
|
||||||
getSupportFragmentManager(), WelcomeDialogFragment.WELCOME_DIALOG_TAG);
|
getSupportFragmentManager(), WelcomeDialogFragment.WELCOME_DIALOG_TAG);
|
||||||
}
|
}
|
||||||
} else if (PreferencesUtils.isShowCheckUnitsDialog(this)) {
|
} else if (PreferencesUtils.getBoolean(this, R.string.show_check_units_dialog_key,
|
||||||
|
PreferencesUtils.SHOW_CHECK_UNITS_DIALOG_DEFAULT)) {
|
||||||
Fragment fragment = getSupportFragmentManager()
|
Fragment fragment = getSupportFragmentManager()
|
||||||
.findFragmentByTag(CheckUnitsDialogFragment.CHECK_UNITS_DIALOG_TAG);
|
.findFragmentByTag(CheckUnitsDialogFragment.CHECK_UNITS_DIALOG_TAG);
|
||||||
if (fragment == null) {
|
if (fragment == null) {
|
||||||
|
|||||||
@@ -16,13 +16,13 @@
|
|||||||
package com.google.android.apps.mytracks.content;
|
package com.google.android.apps.mytracks.content;
|
||||||
|
|
||||||
import com.google.android.apps.mytracks.Constants;
|
import com.google.android.apps.mytracks.Constants;
|
||||||
|
import com.google.android.apps.mytracks.util.PreferencesUtils;
|
||||||
import com.google.android.maps.mytracks.R;
|
import com.google.android.maps.mytracks.R;
|
||||||
|
|
||||||
import android.content.ContentProvider;
|
import android.content.ContentProvider;
|
||||||
import android.content.ContentUris;
|
import android.content.ContentUris;
|
||||||
import android.content.ContentValues;
|
import android.content.ContentValues;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.SharedPreferences;
|
|
||||||
import android.content.UriMatcher;
|
import android.content.UriMatcher;
|
||||||
import android.database.Cursor;
|
import android.database.Cursor;
|
||||||
import android.database.SQLException;
|
import android.database.SQLException;
|
||||||
@@ -190,13 +190,11 @@ public class MyTracksProvider extends ContentProvider {
|
|||||||
if (Binder.getCallingPid() == Process.myPid()) {
|
if (Binder.getCallingPid() == Process.myPid()) {
|
||||||
return true;
|
return true;
|
||||||
} else {
|
} else {
|
||||||
Context context = getContext();
|
return PreferencesUtils.getBoolean(
|
||||||
SharedPreferences sharedPreferences = context.getSharedPreferences(
|
getContext(), R.string.allow_access_key, PreferencesUtils.ALLOW_ACCESS_DEFAULT);
|
||||||
Constants.SETTINGS_NAME, Context.MODE_PRIVATE);
|
|
||||||
return sharedPreferences.getBoolean(context.getString(R.string.allow_access_key), false);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean onCreate() {
|
public boolean onCreate() {
|
||||||
if (!canAccess()) {
|
if (!canAccess()) {
|
||||||
|
|||||||
@@ -15,7 +15,6 @@
|
|||||||
*/
|
*/
|
||||||
package com.google.android.apps.mytracks.content;
|
package com.google.android.apps.mytracks.content;
|
||||||
|
|
||||||
import static com.google.android.apps.mytracks.Constants.DEFAULT_MIN_REQUIRED_ACCURACY;
|
|
||||||
import static com.google.android.apps.mytracks.Constants.MAX_DISPLAYED_WAYPOINTS_POINTS;
|
import static com.google.android.apps.mytracks.Constants.MAX_DISPLAYED_WAYPOINTS_POINTS;
|
||||||
import static com.google.android.apps.mytracks.Constants.MAX_LOCATION_AGE_MS;
|
import static com.google.android.apps.mytracks.Constants.MAX_LOCATION_AGE_MS;
|
||||||
import static com.google.android.apps.mytracks.Constants.MAX_NETWORK_AGE_MS;
|
import static com.google.android.apps.mytracks.Constants.MAX_NETWORK_AGE_MS;
|
||||||
@@ -58,9 +57,6 @@ import java.util.Set;
|
|||||||
*/
|
*/
|
||||||
public class TrackDataHub {
|
public class TrackDataHub {
|
||||||
|
|
||||||
// Preference keys
|
|
||||||
private final String MIN_REQUIRED_ACCURACY_KEY;
|
|
||||||
|
|
||||||
// Overridable constants
|
// Overridable constants
|
||||||
private final int targetNumPoints;
|
private final int targetNumPoints;
|
||||||
|
|
||||||
@@ -219,8 +215,6 @@ public class TrackDataHub {
|
|||||||
this.targetNumPoints = targetNumPoints;
|
this.targetNumPoints = targetNumPoints;
|
||||||
this.locationFactory = new DoubleBufferedLocationFactory();
|
this.locationFactory = new DoubleBufferedLocationFactory();
|
||||||
|
|
||||||
MIN_REQUIRED_ACCURACY_KEY = context.getString(R.string.min_required_accuracy_key);
|
|
||||||
|
|
||||||
resetState();
|
resetState();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -294,11 +288,13 @@ public class TrackDataHub {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void loadSharedPreferences() {
|
private void loadSharedPreferences() {
|
||||||
selectedTrackId = PreferencesUtils.getSelectedTrackId(context);
|
selectedTrackId = PreferencesUtils.getLong(context, R.string.selected_track_id_key);
|
||||||
metricUnits = PreferencesUtils.isMetricUnits(context);
|
metricUnits = PreferencesUtils.getBoolean(
|
||||||
reportSpeed = PreferencesUtils.isReportSpeed(context);
|
context, R.string.metric_units_key, PreferencesUtils.METRIC_UNITS_DEFAULT);
|
||||||
minRequiredAccuracy = preferences.getInt(MIN_REQUIRED_ACCURACY_KEY,
|
reportSpeed = PreferencesUtils.getBoolean(
|
||||||
DEFAULT_MIN_REQUIRED_ACCURACY);
|
context, R.string.report_speed_key, PreferencesUtils.REPORT_SPEED_DEFAULT);
|
||||||
|
minRequiredAccuracy = PreferencesUtils.getInt(context, R.string.min_required_accuracy_key,
|
||||||
|
PreferencesUtils.MIN_REQUIRED_ACCURACY_DEFAULT);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Updates known magnetic declination if needed. */
|
/** Updates known magnetic declination if needed. */
|
||||||
@@ -372,8 +368,9 @@ public class TrackDataHub {
|
|||||||
if (!isStarted()) {
|
if (!isStarted()) {
|
||||||
loadSharedPreferences();
|
loadSharedPreferences();
|
||||||
}
|
}
|
||||||
long recordingTrackId = PreferencesUtils.getRecordingTrackId(context);
|
long recordingTrackId = PreferencesUtils.getLong(context, R.string.recording_track_id_key);
|
||||||
return recordingTrackId != -1L && recordingTrackId == selectedTrackId;
|
return recordingTrackId != PreferencesUtils.RECORDING_TRACK_ID_DEFAULT
|
||||||
|
&& recordingTrackId == selectedTrackId;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -391,7 +388,7 @@ public class TrackDataHub {
|
|||||||
|
|
||||||
// Save the selection to memory and flush.
|
// Save the selection to memory and flush.
|
||||||
selectedTrackId = trackId;
|
selectedTrackId = trackId;
|
||||||
PreferencesUtils.setSelectedTrackId(context, selectedTrackId);
|
PreferencesUtils.setLong(context, R.string.selected_track_id_key, selectedTrackId);
|
||||||
|
|
||||||
// Force it to reload data from the beginning.
|
// Force it to reload data from the beginning.
|
||||||
Log.d(TAG, "Loading track");
|
Log.d(TAG, "Loading track");
|
||||||
@@ -605,21 +602,23 @@ public class TrackDataHub {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Called when a preference changes.
|
* Called when a preference changes.
|
||||||
*
|
*
|
||||||
* @param key the key to the preference that changed
|
* @param key the key to the preference that changed
|
||||||
*/
|
*/
|
||||||
private void notifyPreferenceChanged(String key) {
|
private void notifyPreferenceChanged(String key) {
|
||||||
if (MIN_REQUIRED_ACCURACY_KEY.equals(key)) {
|
if (PreferencesUtils.getKey(context, R.string.min_required_accuracy_key).equals(key)) {
|
||||||
minRequiredAccuracy = preferences.getInt(MIN_REQUIRED_ACCURACY_KEY,
|
minRequiredAccuracy = PreferencesUtils.getInt(context, R.string.min_required_accuracy_key,
|
||||||
DEFAULT_MIN_REQUIRED_ACCURACY);
|
PreferencesUtils.MIN_REQUIRED_ACCURACY_DEFAULT);
|
||||||
} else if (PreferencesUtils.getMetricUnitsKey(context).equals(key)) {
|
} else if (PreferencesUtils.getKey(context, R.string.metric_units_key).equals(key)) {
|
||||||
metricUnits = PreferencesUtils.isMetricUnits(context);
|
metricUnits = PreferencesUtils.getBoolean(
|
||||||
|
context, R.string.metric_units_key, PreferencesUtils.METRIC_UNITS_DEFAULT);
|
||||||
notifyUnitsChanged();
|
notifyUnitsChanged();
|
||||||
} else if (PreferencesUtils.getReportSpeedKey(context).equals(key)) {
|
} else if (PreferencesUtils.getKey(context, R.string.report_speed_key).equals(key)) {
|
||||||
reportSpeed = PreferencesUtils.isReportSpeed(context);
|
reportSpeed = PreferencesUtils.getBoolean(
|
||||||
|
context, R.string.report_speed_key, PreferencesUtils.REPORT_SPEED_DEFAULT);
|
||||||
notifySpeedReportingChanged();
|
notifySpeedReportingChanged();
|
||||||
} else if (PreferencesUtils.getSelectedTrackIdKey(context).equals(key)) {
|
} else if (PreferencesUtils.getKey(context, R.string.selected_track_id_key).equals(key)) {
|
||||||
loadTrack(PreferencesUtils.getSelectedTrackId(context));
|
loadTrack(PreferencesUtils.getLong(context, R.string.selected_track_id_key));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -17,7 +17,6 @@
|
|||||||
package com.google.android.apps.mytracks.fragments;
|
package com.google.android.apps.mytracks.fragments;
|
||||||
|
|
||||||
import com.google.android.apps.mytracks.ChartView;
|
import com.google.android.apps.mytracks.ChartView;
|
||||||
import com.google.android.apps.mytracks.ChartView.Mode;
|
|
||||||
import com.google.android.apps.mytracks.Constants;
|
import com.google.android.apps.mytracks.Constants;
|
||||||
import com.google.android.apps.mytracks.MyTracksApplication;
|
import com.google.android.apps.mytracks.MyTracksApplication;
|
||||||
import com.google.android.apps.mytracks.content.MyTracksLocation;
|
import com.google.android.apps.mytracks.content.MyTracksLocation;
|
||||||
@@ -31,6 +30,7 @@ import com.google.android.apps.mytracks.content.Waypoint;
|
|||||||
import com.google.android.apps.mytracks.stats.DoubleBuffer;
|
import com.google.android.apps.mytracks.stats.DoubleBuffer;
|
||||||
import com.google.android.apps.mytracks.stats.TripStatisticsBuilder;
|
import com.google.android.apps.mytracks.stats.TripStatisticsBuilder;
|
||||||
import com.google.android.apps.mytracks.util.LocationUtils;
|
import com.google.android.apps.mytracks.util.LocationUtils;
|
||||||
|
import com.google.android.apps.mytracks.util.PreferencesUtils;
|
||||||
import com.google.android.apps.mytracks.util.UnitConversions;
|
import com.google.android.apps.mytracks.util.UnitConversions;
|
||||||
import com.google.android.maps.mytracks.R;
|
import com.google.android.maps.mytracks.R;
|
||||||
import com.google.common.annotations.VisibleForTesting;
|
import com.google.common.annotations.VisibleForTesting;
|
||||||
@@ -76,6 +76,9 @@ public class ChartFragment extends Fragment implements TrackDataListener {
|
|||||||
private boolean metricUnits = true;
|
private boolean metricUnits = true;
|
||||||
private boolean reportSpeed = true;
|
private boolean reportSpeed = true;
|
||||||
|
|
||||||
|
private boolean chartByDistance = true;
|
||||||
|
private boolean[] chartShow = new boolean[] {true, true, true, true, true};
|
||||||
|
|
||||||
// UI elements
|
// UI elements
|
||||||
private ChartView chartView;
|
private ChartView chartView;
|
||||||
private ZoomControls zoomControls;
|
private ZoomControls zoomControls;
|
||||||
@@ -143,6 +146,7 @@ public class ChartFragment extends Fragment implements TrackDataListener {
|
|||||||
public void onResume() {
|
public void onResume() {
|
||||||
super.onResume();
|
super.onResume();
|
||||||
resumeTrackDataHub();
|
resumeTrackDataHub();
|
||||||
|
checkChartSettings();
|
||||||
getActivity().runOnUiThread(updateChart);
|
getActivity().runOnUiThread(updateChart);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -158,58 +162,6 @@ public class ChartFragment extends Fragment implements TrackDataListener {
|
|||||||
ViewGroup layout = (ViewGroup) getActivity().findViewById(R.id.chart_view_layout);
|
ViewGroup layout = (ViewGroup) getActivity().findViewById(R.id.chart_view_layout);
|
||||||
layout.removeView(chartView);
|
layout.removeView(chartView);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the chart view mode.
|
|
||||||
*
|
|
||||||
* @param mode the chart view mode
|
|
||||||
*/
|
|
||||||
public void setMode(Mode mode) {
|
|
||||||
if (chartView.getMode() != mode) {
|
|
||||||
chartView.setMode(mode);
|
|
||||||
reloadTrackDataHub();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the chart view mode.
|
|
||||||
*/
|
|
||||||
public Mode getMode() {
|
|
||||||
return chartView.getMode();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Enables or disables the chart value series.
|
|
||||||
*
|
|
||||||
* @param index the index of the series
|
|
||||||
* @param enabled true to enable, false to disable
|
|
||||||
*/
|
|
||||||
public void setChartValueSeriesEnabled(int index, boolean enabled) {
|
|
||||||
chartView.setChartValueSeriesEnabled(index, enabled);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns true if the chart value series is enabled.
|
|
||||||
*
|
|
||||||
* @param index the index of the series
|
|
||||||
*/
|
|
||||||
public boolean isChartValueSeriesEnabled(int index) {
|
|
||||||
return chartView.isChartValueSeriesEnabled(index);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns true to report speed instead of pace.
|
|
||||||
*/
|
|
||||||
public boolean isReportSpeed() {
|
|
||||||
return reportSpeed;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Updates the chart.
|
|
||||||
*/
|
|
||||||
public void update() {
|
|
||||||
chartView.postInvalidate();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onProviderStateChange(ProviderState state) {
|
public void onProviderStateChange(ProviderState state) {
|
||||||
@@ -338,6 +290,60 @@ public class ChartFragment extends Fragment implements TrackDataListener {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks the chart settings.
|
||||||
|
*/
|
||||||
|
private void checkChartSettings() {
|
||||||
|
boolean needUpdate = false;
|
||||||
|
if (chartByDistance != PreferencesUtils.getBoolean(getActivity(),
|
||||||
|
R.string.chart_by_distance_key, PreferencesUtils.CHART_BY_DISTANCE_DEFAULT)) {
|
||||||
|
chartByDistance = !chartByDistance;
|
||||||
|
chartView.setChartByDistance(chartByDistance);
|
||||||
|
reloadTrackDataHub();
|
||||||
|
needUpdate = true;
|
||||||
|
}
|
||||||
|
if (setSeriesEnabled(ChartView.ELEVATION_SERIES, PreferencesUtils.getBoolean(getActivity(),
|
||||||
|
R.string.chart_show_elevation_key, PreferencesUtils.CHART_SHOW_ELEVATION_DEFAULT))) {
|
||||||
|
needUpdate = true;
|
||||||
|
}
|
||||||
|
if (setSeriesEnabled(ChartView.SPEED_SERIES, PreferencesUtils.getBoolean(
|
||||||
|
getActivity(), R.string.chart_show_speed_key, PreferencesUtils.CHART_SHOW_SPEED_DEFAULT))) {
|
||||||
|
needUpdate = true;
|
||||||
|
}
|
||||||
|
if (setSeriesEnabled(ChartView.POWER_SERIES, PreferencesUtils.getBoolean(
|
||||||
|
getActivity(), R.string.chart_show_power_key, PreferencesUtils.CHART_SHOW_POWER_DEFAULT))) {
|
||||||
|
needUpdate = true;
|
||||||
|
}
|
||||||
|
if (setSeriesEnabled(ChartView.CADENCE_SERIES, PreferencesUtils.getBoolean(getActivity(),
|
||||||
|
R.string.chart_show_cadence_key, PreferencesUtils.CHART_SHOW_CADENCE_DEFAULT))) {
|
||||||
|
needUpdate = true;
|
||||||
|
}
|
||||||
|
if (setSeriesEnabled(ChartView.HEART_RATE_SERIES, PreferencesUtils.getBoolean(getActivity(),
|
||||||
|
R.string.chart_show_heart_rate_key, PreferencesUtils.CHART_SHOW_HEART_RATE_DEFAULT))) {
|
||||||
|
needUpdate = true;
|
||||||
|
}
|
||||||
|
if (needUpdate) {
|
||||||
|
chartView.postInvalidate();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the series enabled value.
|
||||||
|
*
|
||||||
|
* @param index the series index
|
||||||
|
* @param value the value
|
||||||
|
* @return true if changed
|
||||||
|
*/
|
||||||
|
private boolean setSeriesEnabled(int index, boolean value) {
|
||||||
|
if (chartShow[index] != value) {
|
||||||
|
chartShow[index] = value;
|
||||||
|
chartView.setChartValueSeriesEnabled(index, value);
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Resumes the trackDataHub. Needs to be synchronized because trackDataHub can be
|
* Resumes the trackDataHub. Needs to be synchronized because trackDataHub can be
|
||||||
* accessed by multiple threads.
|
* accessed by multiple threads.
|
||||||
@@ -352,16 +358,16 @@ public class ChartFragment extends Fragment implements TrackDataListener {
|
|||||||
ListenerDataType.SAMPLED_OUT_POINT_UPDATES,
|
ListenerDataType.SAMPLED_OUT_POINT_UPDATES,
|
||||||
ListenerDataType.DISPLAY_PREFERENCES));
|
ListenerDataType.DISPLAY_PREFERENCES));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Pauses the trackDataHub. Needs to be synchronized because trackDataHub can be
|
* Pauses the trackDataHub. Needs to be synchronized because trackDataHub can
|
||||||
* accessed by multiple threads.
|
* be accessed by multiple threads.
|
||||||
*/
|
*/
|
||||||
private synchronized void pauseTrackDataHub() {
|
private synchronized void pauseTrackDataHub() {
|
||||||
trackDataHub.unregisterTrackDataListener(this);
|
trackDataHub.unregisterTrackDataListener(this);
|
||||||
trackDataHub = null;
|
trackDataHub = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns true if recording. Needs to be synchronized because trackDataHub
|
* Returns true if recording. Needs to be synchronized because trackDataHub
|
||||||
* can be accessed by multiple threads.
|
* can be accessed by multiple threads.
|
||||||
@@ -369,7 +375,7 @@ public class ChartFragment extends Fragment implements TrackDataListener {
|
|||||||
private synchronized boolean isRecording() {
|
private synchronized boolean isRecording() {
|
||||||
return trackDataHub != null && trackDataHub.isRecordingSelected();
|
return trackDataHub != null && trackDataHub.isRecordingSelected();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Reloads the trackDataHub. Needs to be synchronized because trackDataHub can be
|
* Reloads the trackDataHub. Needs to be synchronized because trackDataHub can be
|
||||||
* accessed by multiple threads.
|
* accessed by multiple threads.
|
||||||
@@ -420,7 +426,7 @@ public class ChartFragment extends Fragment implements TrackDataListener {
|
|||||||
double heartRate = Double.NaN;
|
double heartRate = Double.NaN;
|
||||||
|
|
||||||
// TODO: Use TripStatisticsBuilder
|
// TODO: Use TripStatisticsBuilder
|
||||||
if (chartView.getMode() == Mode.BY_DISTANCE) {
|
if (chartByDistance) {
|
||||||
if (lastLocation != null) {
|
if (lastLocation != null) {
|
||||||
double distance = lastLocation.distanceTo(location) * UnitConversions.M_TO_KM;
|
double distance = lastLocation.distanceTo(location) * UnitConversions.M_TO_KM;
|
||||||
if (metricUnits) {
|
if (metricUnits) {
|
||||||
@@ -512,4 +518,8 @@ public class ChartFragment extends Fragment implements TrackDataListener {
|
|||||||
void setReportSpeed(boolean value) {
|
void setReportSpeed(boolean value) {
|
||||||
reportSpeed = value;
|
reportSpeed = value;
|
||||||
}
|
}
|
||||||
|
@VisibleForTesting
|
||||||
|
void setChartByDistance(boolean value) {
|
||||||
|
chartByDistance = value;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,84 +0,0 @@
|
|||||||
/*
|
|
||||||
* 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.fragments;
|
|
||||||
|
|
||||||
import com.google.android.apps.mytracks.ChartView;
|
|
||||||
import com.google.android.maps.mytracks.R;
|
|
||||||
|
|
||||||
import android.app.AlertDialog;
|
|
||||||
import android.app.Dialog;
|
|
||||||
import android.content.DialogInterface;
|
|
||||||
import android.os.Bundle;
|
|
||||||
import android.support.v4.app.DialogFragment;
|
|
||||||
import android.view.View;
|
|
||||||
import android.widget.CheckBox;
|
|
||||||
import android.widget.RadioGroup;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A DialogFragment to show chart settings.
|
|
||||||
*
|
|
||||||
* @author Jimmy Shih
|
|
||||||
*/
|
|
||||||
public class ChartSettingsDialogFragment extends DialogFragment {
|
|
||||||
|
|
||||||
public static final String CHART_SETTINGS_DIALOG_TAG = "chartSettingsDialog";
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Dialog onCreateDialog(Bundle savedInstanceState) {
|
|
||||||
final ChartFragment chartFragment = (ChartFragment) getActivity()
|
|
||||||
.getSupportFragmentManager().findFragmentByTag(ChartFragment.CHART_FRAGMENT_TAG);
|
|
||||||
View view = getActivity().getLayoutInflater().inflate(R.layout.chart_settings, null);
|
|
||||||
final RadioGroup radioGroup = (RadioGroup) view.findViewById(R.id.chart_settings_x);
|
|
||||||
radioGroup.check(chartFragment.getMode() == ChartView.Mode.BY_DISTANCE
|
|
||||||
? R.id.chart_settings_by_distance : R.id.chart_settings_by_time);
|
|
||||||
|
|
||||||
final CheckBox[] checkBoxes = new CheckBox[ChartView.NUM_SERIES];
|
|
||||||
checkBoxes[ChartView.ELEVATION_SERIES] = (CheckBox) view.findViewById(
|
|
||||||
R.id.chart_settings_elevation);
|
|
||||||
checkBoxes[ChartView.SPEED_SERIES] = (CheckBox) view.findViewById(R.id.chart_settings_speed);
|
|
||||||
checkBoxes[ChartView.POWER_SERIES] = (CheckBox) view.findViewById(R.id.chart_settings_power);
|
|
||||||
checkBoxes[ChartView.CADENCE_SERIES] = (CheckBox) view.findViewById(
|
|
||||||
R.id.chart_settings_cadence);
|
|
||||||
checkBoxes[ChartView.HEART_RATE_SERIES] = (CheckBox) view.findViewById(
|
|
||||||
R.id.chart_settings_heart_rate);
|
|
||||||
|
|
||||||
// set checkboxes values
|
|
||||||
for (int i = 0; i < ChartView.NUM_SERIES; i++) {
|
|
||||||
checkBoxes[i].setChecked(chartFragment.isChartValueSeriesEnabled(i));
|
|
||||||
}
|
|
||||||
checkBoxes[ChartView.SPEED_SERIES].setText(chartFragment.isReportSpeed()
|
|
||||||
? R.string.stats_speed : R.string.stats_pace);
|
|
||||||
|
|
||||||
return new AlertDialog.Builder(getActivity())
|
|
||||||
.setNegativeButton(R.string.generic_cancel, null)
|
|
||||||
.setPositiveButton(R.string.generic_ok, new DialogInterface.OnClickListener() {
|
|
||||||
@Override
|
|
||||||
public void onClick(DialogInterface dialog, int which) {
|
|
||||||
chartFragment.setMode(
|
|
||||||
radioGroup.getCheckedRadioButtonId() == R.id.chart_settings_by_distance
|
|
||||||
? ChartView.Mode.BY_DISTANCE : ChartView.Mode.BY_TIME);
|
|
||||||
for (int i = 0; i < ChartView.NUM_SERIES; i++) {
|
|
||||||
chartFragment.setChartValueSeriesEnabled(i, checkBoxes[i].isChecked());
|
|
||||||
}
|
|
||||||
chartFragment.update();
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.setTitle(R.string.menu_chart_settings)
|
|
||||||
.setView(view)
|
|
||||||
.create();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -46,9 +46,9 @@ public class CheckUnitsDialogFragment extends DialogFragment {
|
|||||||
public Dialog onCreateDialog(Bundle savedInstanceState) {
|
public Dialog onCreateDialog(Bundle savedInstanceState) {
|
||||||
Locale defaultLocale = Locale.getDefault();
|
Locale defaultLocale = Locale.getDefault();
|
||||||
boolean defaultMetric = !defaultLocale.equals(Locale.US) && !defaultLocale.equals(Locale.UK);
|
boolean defaultMetric = !defaultLocale.equals(Locale.US) && !defaultLocale.equals(Locale.UK);
|
||||||
PreferencesUtils.setMetricUnits(getActivity(), defaultMetric);
|
PreferencesUtils.setBoolean(getActivity(), R.string.metric_units_key, defaultMetric);
|
||||||
final String metric = getString(R.string.preferred_units_metric);
|
final String metric = getString(R.string.settings_stats_units_metric);
|
||||||
final String imperial = getString(R.string.preferred_units_imperial);
|
final String imperial = getString(R.string.settings_stats_units_imperial);
|
||||||
final CharSequence[] items = defaultMetric ? new CharSequence[] { metric, imperial }
|
final CharSequence[] items = defaultMetric ? new CharSequence[] { metric, imperial }
|
||||||
: new CharSequence[] { imperial, metric };
|
: new CharSequence[] { imperial, metric };
|
||||||
return new AlertDialog.Builder(getActivity())
|
return new AlertDialog.Builder(getActivity())
|
||||||
@@ -56,19 +56,20 @@ public class CheckUnitsDialogFragment extends DialogFragment {
|
|||||||
@Override
|
@Override
|
||||||
public void onClick(DialogInterface dialog, int which) {
|
public void onClick(DialogInterface dialog, int which) {
|
||||||
int position = ((AlertDialog) dialog).getListView().getCheckedItemPosition();
|
int position = ((AlertDialog) dialog).getListView().getCheckedItemPosition();
|
||||||
PreferencesUtils.setMetricUnits(getActivity(), items[position].equals(metric));
|
PreferencesUtils.setBoolean(
|
||||||
|
getActivity(), R.string.metric_units_key, items[position].equals(metric));
|
||||||
onDone();
|
onDone();
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.setSingleChoiceItems(items, 0, null)
|
.setSingleChoiceItems(items, 0, null)
|
||||||
.setTitle(R.string.preferred_units_title).create();
|
.setTitle(R.string.settings_stats_units_title).create();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Tasks to perform when done.
|
* Tasks to perform when done.
|
||||||
*/
|
*/
|
||||||
private void onDone() {
|
private void onDone() {
|
||||||
PreferencesUtils.setShowCheckUnitsDialog(getActivity());
|
PreferencesUtils.setBoolean(getActivity(), R.string.show_check_units_dialog_key, false);
|
||||||
TrackListActivity trackListActivity = (TrackListActivity) getActivity();
|
TrackListActivity trackListActivity = (TrackListActivity) getActivity();
|
||||||
trackListActivity.showStartupDialogs();
|
trackListActivity.showStartupDialogs();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -40,6 +40,9 @@ import android.os.Bundle;
|
|||||||
import android.provider.Settings;
|
import android.provider.Settings;
|
||||||
import android.support.v4.app.Fragment;
|
import android.support.v4.app.Fragment;
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
|
import android.view.Menu;
|
||||||
|
import android.view.MenuInflater;
|
||||||
|
import android.view.MenuItem;
|
||||||
import android.view.MotionEvent;
|
import android.view.MotionEvent;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
@@ -90,6 +93,12 @@ public class MapFragment extends Fragment
|
|||||||
private ImageButton myLocationImageButton;
|
private ImageButton myLocationImageButton;
|
||||||
private TextView messageTextView;
|
private TextView messageTextView;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onCreate(Bundle bundle) {
|
||||||
|
super.onCreate(bundle);
|
||||||
|
setHasOptionsMenu(true);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public View onCreateView(
|
public View onCreateView(
|
||||||
LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
|
LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
|
||||||
@@ -156,6 +165,30 @@ public class MapFragment extends Fragment
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onCreateOptionsMenu(Menu menu, MenuInflater menuInflator) {
|
||||||
|
menuInflator.inflate(R.menu.map, menu);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onPrepareOptionsMenu(Menu menu) {
|
||||||
|
int titleId = R.string.menu_satellite_mode;
|
||||||
|
if (mapView != null) {
|
||||||
|
titleId = mapView.isSatellite() ? R.string.menu_map_mode : R.string.menu_satellite_mode;
|
||||||
|
}
|
||||||
|
menu.findItem(R.id.map_satellite_mode).setTitle(titleId);
|
||||||
|
super.onPrepareOptionsMenu(menu);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onOptionsItemSelected(MenuItem menuItem) {
|
||||||
|
if (mapView != null && menuItem.getItemId() == R.id.map_satellite_mode) {
|
||||||
|
mapView.setSatellite(!mapView.isSatellite());
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return super.onOptionsItemSelected(menuItem);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Shows my location.
|
* Shows my location.
|
||||||
*/
|
*/
|
||||||
@@ -209,22 +242,6 @@ public class MapFragment extends Fragment
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns true if in satellite mode.
|
|
||||||
*/
|
|
||||||
public boolean isSatelliteView() {
|
|
||||||
return mapView.isSatellite();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the satellite mode
|
|
||||||
*
|
|
||||||
* @param enabled true for satellite mode, false for map mode
|
|
||||||
*/
|
|
||||||
public void setSatelliteView(boolean enabled) {
|
|
||||||
mapView.setSatellite(enabled);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean onTouch(View view, MotionEvent event) {
|
public boolean onTouch(View view, MotionEvent event) {
|
||||||
if (keepMyLocationVisible && event.getAction() == MotionEvent.ACTION_MOVE) {
|
if (keepMyLocationVisible && event.getAction() == MotionEvent.ACTION_MOVE) {
|
||||||
|
|||||||
@@ -97,8 +97,8 @@ public class MarkerAddDialogFragment extends DialogFragment {
|
|||||||
dismiss();
|
dismiss();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
boolean pickStatisticsMarker = PreferencesUtils.getBoolean(
|
boolean pickStatisticsMarker = PreferencesUtils.getBoolean(getActivity(),
|
||||||
getActivity(), R.string.pick_statistics_marker_key, true);
|
R.string.pick_statistics_marker_key, PreferencesUtils.PICK_STATISTICS_MARKER_DEFAULT);
|
||||||
radioGroup.check(pickStatisticsMarker ? R.id.marker_add_statistics : R.id.marker_add_waypoint);
|
radioGroup.check(pickStatisticsMarker ? R.id.marker_add_statistics : R.id.marker_add_waypoint);
|
||||||
return new AlertDialog.Builder(getActivity())
|
return new AlertDialog.Builder(getActivity())
|
||||||
.setNegativeButton(R.string.generic_cancel, null)
|
.setNegativeButton(R.string.generic_cancel, null)
|
||||||
|
|||||||
@@ -74,7 +74,8 @@ public class StatsFragment extends Fragment implements TrackDataListener {
|
|||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
Log.d(TAG, "UI update thread started");
|
Log.d(TAG, "UI update thread started");
|
||||||
while (PreferencesUtils.getRecordingTrackId(getActivity()) != -1L) {
|
while (PreferencesUtils.getLong(getActivity(), R.string.recording_track_id_key)
|
||||||
|
!= PreferencesUtils.RECORDING_TRACK_ID_DEFAULT) {
|
||||||
getActivity().runOnUiThread(updateTotalTime);
|
getActivity().runOnUiThread(updateTotalTime);
|
||||||
try {
|
try {
|
||||||
Thread.sleep(1000L);
|
Thread.sleep(1000L);
|
||||||
@@ -270,8 +271,11 @@ public class StatsFragment extends Fragment implements TrackDataListener {
|
|||||||
private synchronized boolean isRecording() {
|
private synchronized boolean isRecording() {
|
||||||
return trackDataHub != null && trackDataHub.isRecordingSelected();
|
return trackDataHub != null && trackDataHub.isRecordingSelected();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void updateUi() {
|
/**
|
||||||
|
* Updates the UI.
|
||||||
|
*/
|
||||||
|
private void updateUi() {
|
||||||
StatsUtils.setTripStatisticsValues(getActivity(), lastTripStatistics);
|
StatsUtils.setTripStatisticsValues(getActivity(), lastTripStatistics);
|
||||||
StatsUtils.setLocationValues(getActivity(), lastLocation, true);
|
StatsUtils.setLocationValues(getActivity(), lastLocation, true);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,96 +0,0 @@
|
|||||||
/*
|
|
||||||
* 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.fragments;
|
|
||||||
|
|
||||||
import com.google.android.apps.mytracks.util.PreferencesUtils;
|
|
||||||
import com.google.android.maps.mytracks.R;
|
|
||||||
|
|
||||||
import android.app.Activity;
|
|
||||||
import android.app.AlertDialog;
|
|
||||||
import android.app.Dialog;
|
|
||||||
import android.content.DialogInterface;
|
|
||||||
import android.os.Bundle;
|
|
||||||
import android.support.v4.app.DialogFragment;
|
|
||||||
import android.view.View;
|
|
||||||
import android.widget.CheckBox;
|
|
||||||
import android.widget.RadioGroup;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A DialogFragment to show stats settings.
|
|
||||||
*
|
|
||||||
* @author Jimmy Shih
|
|
||||||
*/
|
|
||||||
public class StatsSettingsDialogFragment extends DialogFragment {
|
|
||||||
|
|
||||||
public static final String STATS_SETTINGS_DIALOG_TAG = "statsSettingsDialog";
|
|
||||||
|
|
||||||
public interface OnStatsSettingsChangedListener {
|
|
||||||
public void onStatsSettingsChanged();
|
|
||||||
}
|
|
||||||
|
|
||||||
private OnStatsSettingsChangedListener listener;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onAttach(Activity activity) {
|
|
||||||
super.onAttach(activity);
|
|
||||||
try {
|
|
||||||
listener = (OnStatsSettingsChangedListener) activity;
|
|
||||||
} catch (ClassCastException e) {
|
|
||||||
throw new ClassCastException(activity.toString()
|
|
||||||
+ " must implement OnArticleSelectedListener");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Dialog onCreateDialog(Bundle savedInstanceState) {
|
|
||||||
View view = getActivity().getLayoutInflater().inflate(R.layout.stats_settings, null);
|
|
||||||
final RadioGroup radioGroup = (RadioGroup) view.findViewById(R.id.stats_settings_time);
|
|
||||||
boolean totalTime = PreferencesUtils.getBoolean(
|
|
||||||
getActivity(), R.string.stats_show_total_time_key, true);
|
|
||||||
radioGroup.check(totalTime ? R.id.stats_settings_total_time : R.id.stats_settings_moving_time);
|
|
||||||
|
|
||||||
final CheckBox elevation = (CheckBox) view.findViewById(R.id.stats_settings_elevation);
|
|
||||||
final CheckBox grade = (CheckBox) view.findViewById(R.id.stats_settings_grade);
|
|
||||||
final CheckBox coordinate = (CheckBox) view.findViewById(R.id.stats_settings_coordinate);
|
|
||||||
|
|
||||||
elevation.setChecked(
|
|
||||||
PreferencesUtils.getBoolean(getActivity(), R.string.stats_show_elevation_key, false));
|
|
||||||
grade.setChecked(
|
|
||||||
PreferencesUtils.getBoolean(getActivity(), R.string.stats_show_grade_key, false));
|
|
||||||
coordinate.setChecked(
|
|
||||||
PreferencesUtils.getBoolean(getActivity(), R.string.stats_show_coordinate_key, false));
|
|
||||||
|
|
||||||
return new AlertDialog.Builder(getActivity()).setNegativeButton(R.string.generic_cancel, null)
|
|
||||||
.setPositiveButton(R.string.generic_ok, new DialogInterface.OnClickListener() {
|
|
||||||
@Override
|
|
||||||
public void onClick(DialogInterface dialog, int which) {
|
|
||||||
PreferencesUtils.setBoolean(getActivity(), R.string.stats_show_total_time_key,
|
|
||||||
radioGroup.getCheckedRadioButtonId() == R.id.stats_settings_total_time);
|
|
||||||
PreferencesUtils.setBoolean(
|
|
||||||
getActivity(), R.string.stats_show_elevation_key, elevation.isChecked());
|
|
||||||
PreferencesUtils.setBoolean(
|
|
||||||
getActivity(), R.string.stats_show_grade_key, grade.isChecked());
|
|
||||||
PreferencesUtils.setBoolean(
|
|
||||||
getActivity(), R.string.stats_show_coordinate_key, coordinate.isChecked());
|
|
||||||
listener.onStatsSettingsChanged();
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.setTitle(R.string.menu_stats_settings)
|
|
||||||
.setView(view)
|
|
||||||
.create();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -55,7 +55,7 @@ public class WelcomeDialogFragment extends DialogFragment {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void onDone() {
|
private void onDone() {
|
||||||
PreferencesUtils.setShowWelcome(getActivity());
|
PreferencesUtils.setBoolean(getActivity(), R.string.show_welcome_dialog_key, false);
|
||||||
TrackListActivity trackListActivity = (TrackListActivity) getActivity();
|
TrackListActivity trackListActivity = (TrackListActivity) getActivity();
|
||||||
trackListActivity.showStartupDialogs();
|
trackListActivity.showStartupDialogs();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -270,7 +270,8 @@ public class SendDocsUtils {
|
|||||||
Track track, String spreadsheetId, String worksheetId, String authToken, Context context)
|
Track track, String spreadsheetId, String worksheetId, String authToken, Context context)
|
||||||
throws IOException {
|
throws IOException {
|
||||||
String worksheetUri = String.format(GET_WORKSHEET_URI, spreadsheetId, worksheetId);
|
String worksheetUri = String.format(GET_WORKSHEET_URI, spreadsheetId, worksheetId);
|
||||||
boolean metricUnits = PreferencesUtils.isMetricUnits(context);
|
boolean metricUnits = PreferencesUtils.getBoolean(
|
||||||
|
context, R.string.metric_units_key, PreferencesUtils.METRIC_UNITS_DEFAULT);
|
||||||
addRow(worksheetUri, getRowContent(track, metricUnits, context), authToken);
|
addRow(worksheetUri, getRowContent(track, metricUnits, context), authToken);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -205,7 +205,8 @@ public class SendFusionTablesAsyncTask extends AbstractSendAsyncTask {
|
|||||||
private boolean uploadAllTrackPoints(Track track) {
|
private boolean uploadAllTrackPoints(Track track) {
|
||||||
Cursor locationsCursor = null;
|
Cursor locationsCursor = null;
|
||||||
try {
|
try {
|
||||||
boolean metricUnits = PreferencesUtils.isMetricUnits(context);
|
boolean metricUnits = PreferencesUtils.getBoolean(
|
||||||
|
context, R.string.metric_units_key, PreferencesUtils.METRIC_UNITS_DEFAULT);
|
||||||
|
|
||||||
locationsCursor = myTracksProviderUtils.getLocationsCursor(trackId, 0, -1, false);
|
locationsCursor = myTracksProviderUtils.getLocationsCursor(trackId, 0, -1, false);
|
||||||
if (locationsCursor == null) {
|
if (locationsCursor == null) {
|
||||||
|
|||||||
@@ -45,7 +45,6 @@ import android.accounts.AccountManager;
|
|||||||
import android.accounts.AuthenticatorException;
|
import android.accounts.AuthenticatorException;
|
||||||
import android.accounts.OperationCanceledException;
|
import android.accounts.OperationCanceledException;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.SharedPreferences;
|
|
||||||
import android.database.Cursor;
|
import android.database.Cursor;
|
||||||
import android.location.Location;
|
import android.location.Location;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
@@ -225,15 +224,13 @@ public class SendMapsAsyncTask extends AbstractSendAsyncTask {
|
|||||||
mapId = chooseMapId;
|
mapId = chooseMapId;
|
||||||
return true;
|
return true;
|
||||||
} else {
|
} else {
|
||||||
SharedPreferences sharedPreferences = context.getSharedPreferences(
|
boolean defaultMapPublic = PreferencesUtils.getBoolean(
|
||||||
Constants.SETTINGS_NAME, Context.MODE_PRIVATE);
|
context, R.string.default_map_public_key, PreferencesUtils.DEFAULT_MAP_PUBLIC_DEFAULT);
|
||||||
boolean mapPublic = sharedPreferences.getBoolean(
|
|
||||||
context.getString(R.string.default_map_public_key), true);
|
|
||||||
try {
|
try {
|
||||||
String description = track.getCategory() + "\n" + track.getDescription() + "\n"
|
String description = track.getCategory() + "\n" + track.getDescription() + "\n"
|
||||||
+ context.getString(R.string.send_google_by_my_tracks, "", "");
|
+ context.getString(R.string.send_google_by_my_tracks, "", "");
|
||||||
mapId = SendMapsUtils.createNewMap(
|
mapId = SendMapsUtils.createNewMap(
|
||||||
track.getName(), description, mapPublic, mapsClient, authToken);
|
track.getName(), description, defaultMapPublic, mapsClient, authToken);
|
||||||
} catch (ParseException e) {
|
} catch (ParseException e) {
|
||||||
Log.d(TAG, "Unable to create a new map", e);
|
Log.d(TAG, "Unable to create a new map", e);
|
||||||
return false;
|
return false;
|
||||||
@@ -258,7 +255,8 @@ public class SendMapsAsyncTask extends AbstractSendAsyncTask {
|
|||||||
boolean uploadAllTrackPoints(Track track) {
|
boolean uploadAllTrackPoints(Track track) {
|
||||||
Cursor locationsCursor = null;
|
Cursor locationsCursor = null;
|
||||||
try {
|
try {
|
||||||
boolean metricUnits = PreferencesUtils.isMetricUnits(context);
|
boolean metricUnits = PreferencesUtils.getBoolean(
|
||||||
|
context, R.string.metric_units_key, PreferencesUtils.METRIC_UNITS_DEFAULT);
|
||||||
|
|
||||||
locationsCursor = myTracksProviderUtils.getLocationsCursor(trackId, 0, -1, false);
|
locationsCursor = myTracksProviderUtils.getLocationsCursor(trackId, 0, -1, false);
|
||||||
if (locationsCursor == null) {
|
if (locationsCursor == null) {
|
||||||
|
|||||||
@@ -24,8 +24,8 @@ import com.google.android.apps.mytracks.io.gdata.docs.SpreadsheetsClient;
|
|||||||
import com.google.android.apps.mytracks.io.gdata.maps.MapsConstants;
|
import com.google.android.apps.mytracks.io.gdata.maps.MapsConstants;
|
||||||
import com.google.android.apps.mytracks.io.maps.ChooseMapActivity;
|
import com.google.android.apps.mytracks.io.maps.ChooseMapActivity;
|
||||||
import com.google.android.apps.mytracks.io.maps.SendMapsActivity;
|
import com.google.android.apps.mytracks.io.maps.SendMapsActivity;
|
||||||
import com.google.android.apps.mytracks.util.ApiAdapterFactory;
|
|
||||||
import com.google.android.apps.mytracks.util.IntentUtils;
|
import com.google.android.apps.mytracks.util.IntentUtils;
|
||||||
|
import com.google.android.apps.mytracks.util.PreferencesUtils;
|
||||||
import com.google.android.maps.mytracks.R;
|
import com.google.android.maps.mytracks.R;
|
||||||
|
|
||||||
import android.accounts.Account;
|
import android.accounts.Account;
|
||||||
@@ -37,11 +37,8 @@ import android.accounts.OperationCanceledException;
|
|||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
import android.app.AlertDialog;
|
import android.app.AlertDialog;
|
||||||
import android.app.Dialog;
|
import android.app.Dialog;
|
||||||
import android.content.Context;
|
|
||||||
import android.content.DialogInterface;
|
import android.content.DialogInterface;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.content.SharedPreferences;
|
|
||||||
import android.content.SharedPreferences.Editor;
|
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
|
||||||
@@ -93,8 +90,8 @@ public class AccountChooserActivity extends Activity {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
SharedPreferences prefs = getSharedPreferences(Constants.SETTINGS_NAME, Context.MODE_PRIVATE);
|
String preferredAccount = PreferencesUtils.getString(this, R.string.preferred_account_key,
|
||||||
String preferredAccount = prefs.getString(getString(R.string.preferred_account_key), "");
|
PreferencesUtils.PREFERRED_ACCOUNT_DEFAULT);
|
||||||
|
|
||||||
selectedAccountIndex = 0;
|
selectedAccountIndex = 0;
|
||||||
for (int i = 0; i < accounts.length; i++) {
|
for (int i = 0; i < accounts.length; i++) {
|
||||||
@@ -166,12 +163,8 @@ public class AccountChooserActivity extends Activity {
|
|||||||
.setPositiveButton(R.string.generic_ok, new DialogInterface.OnClickListener() {
|
.setPositiveButton(R.string.generic_ok, new DialogInterface.OnClickListener() {
|
||||||
public void onClick(DialogInterface dialog, int which) {
|
public void onClick(DialogInterface dialog, int which) {
|
||||||
Account account = accounts[selectedAccountIndex];
|
Account account = accounts[selectedAccountIndex];
|
||||||
SharedPreferences sharedPreferences = getSharedPreferences(
|
PreferencesUtils.setString(
|
||||||
Constants.SETTINGS_NAME, Context.MODE_PRIVATE);
|
AccountChooserActivity.this, R.string.preferred_account_key, account.name);
|
||||||
Editor editor = sharedPreferences.edit();
|
|
||||||
editor.putString(getString(R.string.preferred_account_key), account.name);
|
|
||||||
ApiAdapterFactory.getApiAdapter().applyPreferenceChanges(editor);
|
|
||||||
|
|
||||||
sendRequest.setAccount(account);
|
sendRequest.setAccount(account);
|
||||||
getPermission(MapsConstants.SERVICE_NAME, sendRequest.isSendMaps(), mapsCallback);
|
getPermission(MapsConstants.SERVICE_NAME, sendRequest.isSendMaps(), mapsCallback);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,21 +15,19 @@
|
|||||||
*/
|
*/
|
||||||
package com.google.android.apps.mytracks.io.sendtogoogle;
|
package com.google.android.apps.mytracks.io.sendtogoogle;
|
||||||
|
|
||||||
import com.google.android.apps.mytracks.Constants;
|
|
||||||
import com.google.android.apps.mytracks.content.MyTracksProviderUtils;
|
import com.google.android.apps.mytracks.content.MyTracksProviderUtils;
|
||||||
import com.google.android.apps.mytracks.content.Track;
|
import com.google.android.apps.mytracks.content.Track;
|
||||||
import com.google.android.apps.mytracks.io.fusiontables.SendFusionTablesUtils;
|
import com.google.android.apps.mytracks.io.fusiontables.SendFusionTablesUtils;
|
||||||
import com.google.android.apps.mytracks.io.maps.SendMapsUtils;
|
import com.google.android.apps.mytracks.io.maps.SendMapsUtils;
|
||||||
|
import com.google.android.apps.mytracks.util.PreferencesUtils;
|
||||||
import com.google.android.maps.mytracks.R;
|
import com.google.android.maps.mytracks.R;
|
||||||
import com.google.common.annotations.VisibleForTesting;
|
import com.google.common.annotations.VisibleForTesting;
|
||||||
|
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
import android.app.AlertDialog;
|
import android.app.AlertDialog;
|
||||||
import android.app.Dialog;
|
import android.app.Dialog;
|
||||||
import android.content.Context;
|
|
||||||
import android.content.DialogInterface;
|
import android.content.DialogInterface;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.content.SharedPreferences;
|
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.widget.ImageView;
|
import android.widget.ImageView;
|
||||||
@@ -49,7 +47,7 @@ public class UploadResultActivity extends Activity {
|
|||||||
private SendRequest sendRequest;
|
private SendRequest sendRequest;
|
||||||
private Track track;
|
private Track track;
|
||||||
private String shareUrl;
|
private String shareUrl;
|
||||||
private Dialog dialog;
|
private Dialog resultDialog;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onCreate(Bundle savedInstanceState) {
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
@@ -169,19 +167,18 @@ public class UploadResultActivity extends Activity {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
dialog = builder.create();
|
resultDialog = builder.create();
|
||||||
return dialog;
|
return resultDialog;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Starts an activity to share the url.
|
* Starts an activity to share the url.
|
||||||
*
|
*
|
||||||
* @param url the url
|
* @param url the url
|
||||||
*/
|
*/
|
||||||
private void startShareUrlActivity(String url) {
|
private void startShareUrlActivity(String url) {
|
||||||
SharedPreferences prefs = getSharedPreferences(Constants.SETTINGS_NAME, Context.MODE_PRIVATE);
|
boolean shareUrlOnly = PreferencesUtils.getBoolean(
|
||||||
boolean shareUrlOnly = prefs.getBoolean(getString(R.string.share_url_only_key), false);
|
this, R.string.share_url_only_key, PreferencesUtils.SHARE_URL_ONLY_DEFAULT);
|
||||||
|
|
||||||
Intent intent = new Intent(Intent.ACTION_SEND)
|
Intent intent = new Intent(Intent.ACTION_SEND)
|
||||||
.setType(TEXT_PLAIN_TYPE)
|
.setType(TEXT_PLAIN_TYPE)
|
||||||
.putExtra(Intent.EXTRA_SUBJECT, getString(R.string.share_track_subject))
|
.putExtra(Intent.EXTRA_SUBJECT, getString(R.string.share_track_subject))
|
||||||
@@ -192,6 +189,6 @@ public class UploadResultActivity extends Activity {
|
|||||||
|
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
Dialog getDialog() {
|
Dialog getDialog() {
|
||||||
return dialog;
|
return resultDialog;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,21 +15,17 @@
|
|||||||
*/
|
*/
|
||||||
package com.google.android.apps.mytracks.io.sendtogoogle;
|
package com.google.android.apps.mytracks.io.sendtogoogle;
|
||||||
|
|
||||||
import com.google.android.apps.mytracks.Constants;
|
|
||||||
import com.google.android.apps.mytracks.util.AnalyticsUtils;
|
import com.google.android.apps.mytracks.util.AnalyticsUtils;
|
||||||
import com.google.android.apps.mytracks.util.ApiAdapterFactory;
|
|
||||||
import com.google.android.apps.mytracks.util.IntentUtils;
|
import com.google.android.apps.mytracks.util.IntentUtils;
|
||||||
|
import com.google.android.apps.mytracks.util.PreferencesUtils;
|
||||||
import com.google.android.maps.mytracks.R;
|
import com.google.android.maps.mytracks.R;
|
||||||
import com.google.common.annotations.VisibleForTesting;
|
import com.google.common.annotations.VisibleForTesting;
|
||||||
|
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
import android.app.AlertDialog;
|
import android.app.AlertDialog;
|
||||||
import android.app.Dialog;
|
import android.app.Dialog;
|
||||||
import android.content.Context;
|
|
||||||
import android.content.DialogInterface;
|
import android.content.DialogInterface;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.content.SharedPreferences;
|
|
||||||
import android.content.SharedPreferences.Editor;
|
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.widget.CheckBox;
|
import android.widget.CheckBox;
|
||||||
@@ -153,16 +149,18 @@ public class UploadServiceChooserActivity extends Activity {
|
|||||||
*/
|
*/
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
void initState() {
|
void initState() {
|
||||||
SharedPreferences prefs = getSharedPreferences(Constants.SETTINGS_NAME, Context.MODE_PRIVATE);
|
boolean pickExistingMap = PreferencesUtils.getBoolean(
|
||||||
boolean pickExistingMap = prefs.getBoolean(getString(R.string.pick_existing_map_key), false);
|
this, R.string.pick_existing_map_key, PreferencesUtils.PICK_EXISTING_MAP_DEFAULT);
|
||||||
|
|
||||||
newMapRadioButton.setChecked(!pickExistingMap);
|
newMapRadioButton.setChecked(!pickExistingMap);
|
||||||
existingMapRadioButton.setChecked(pickExistingMap);
|
existingMapRadioButton.setChecked(pickExistingMap);
|
||||||
|
|
||||||
mapsCheckBox.setChecked(prefs.getBoolean(getString(R.string.send_to_maps_key), true));
|
mapsCheckBox.setChecked(PreferencesUtils.getBoolean(
|
||||||
fusionTablesCheckBox.setChecked(
|
this, R.string.send_to_maps_key, PreferencesUtils.SEND_TO_MAPS_DEFAULT));
|
||||||
prefs.getBoolean(getString(R.string.send_to_fusion_tables_key), true));
|
fusionTablesCheckBox.setChecked(PreferencesUtils.getBoolean(
|
||||||
docsCheckBox.setChecked(prefs.getBoolean(getString(R.string.send_to_docs_key), true));
|
this, R.string.send_to_fusion_tables_key, PreferencesUtils.SEND_TO_FUSION_TABLES_DEFAULT));
|
||||||
|
docsCheckBox.setChecked(PreferencesUtils.getBoolean(
|
||||||
|
this, R.string.send_to_docs_key, PreferencesUtils.SEND_TO_DOCS_DEFAULT));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -195,16 +193,13 @@ public class UploadServiceChooserActivity extends Activity {
|
|||||||
*/
|
*/
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
void saveState() {
|
void saveState() {
|
||||||
SharedPreferences prefs = getSharedPreferences(Constants.SETTINGS_NAME, Context.MODE_PRIVATE);
|
PreferencesUtils.setBoolean(
|
||||||
Editor editor = prefs.edit();
|
this, R.string.pick_existing_map_key, existingMapRadioButton.isChecked());
|
||||||
editor.putBoolean(
|
|
||||||
getString(R.string.pick_existing_map_key), existingMapRadioButton.isChecked());
|
|
||||||
if (sendRequest.isShowAll()) {
|
if (sendRequest.isShowAll()) {
|
||||||
editor.putBoolean(getString(R.string.send_to_maps_key), sendMaps());
|
PreferencesUtils.setBoolean(this, R.string.send_to_maps_key, sendMaps());
|
||||||
editor.putBoolean(getString(R.string.send_to_fusion_tables_key), sendFusionTables());
|
PreferencesUtils.setBoolean(this, R.string.send_to_fusion_tables_key, sendFusionTables());
|
||||||
editor.putBoolean(getString(R.string.send_to_docs_key), sendDocs());
|
PreferencesUtils.setBoolean(this, R.string.send_to_docs_key, sendDocs());
|
||||||
}
|
}
|
||||||
ApiAdapterFactory.getApiAdapter().applyPreferenceChanges(editor);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -42,7 +42,6 @@ public class DynamicSpeedTrackPathDescriptor implements TrackPathDescriptor,
|
|||||||
private int slowSpeed;
|
private int slowSpeed;
|
||||||
private int normalSpeed;
|
private int normalSpeed;
|
||||||
private int speedMargin;
|
private int speedMargin;
|
||||||
private final int speedMarginDefault;
|
|
||||||
private double averageMovingSpeed;
|
private double averageMovingSpeed;
|
||||||
private final Context context;
|
private final Context context;
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
@@ -50,29 +49,11 @@ public class DynamicSpeedTrackPathDescriptor implements TrackPathDescriptor,
|
|||||||
|
|
||||||
public DynamicSpeedTrackPathDescriptor(Context context) {
|
public DynamicSpeedTrackPathDescriptor(Context context) {
|
||||||
this.context = context;
|
this.context = context;
|
||||||
speedMarginDefault = Integer.parseInt(context
|
context.getSharedPreferences(Constants.SETTINGS_NAME, Context.MODE_PRIVATE)
|
||||||
.getString(R.string.color_mode_dynamic_percentage_default));
|
.registerOnSharedPreferenceChangeListener(this);
|
||||||
SharedPreferences prefs = context.getSharedPreferences(Constants.SETTINGS_NAME,
|
|
||||||
Context.MODE_PRIVATE);
|
|
||||||
|
|
||||||
if (prefs == null) {
|
speedMargin = PreferencesUtils.getInt(context, R.string.track_color_mode_percentage_key,
|
||||||
speedMargin = speedMarginDefault;
|
PreferencesUtils.TRACK_COLOR_MODE_PERCENTAGE_DEFAULT);
|
||||||
return;
|
|
||||||
}
|
|
||||||
prefs.registerOnSharedPreferenceChangeListener(this);
|
|
||||||
|
|
||||||
speedMargin = getSpeedMargin(prefs);
|
|
||||||
}
|
|
||||||
|
|
||||||
@VisibleForTesting
|
|
||||||
int getSpeedMargin(SharedPreferences sharedPreferences) {
|
|
||||||
try {
|
|
||||||
return Integer.parseInt(sharedPreferences.getString(
|
|
||||||
context.getString(R.string.track_color_mode_dynamic_speed_variation_key),
|
|
||||||
Integer.toString(speedMarginDefault)));
|
|
||||||
} catch (NumberFormatException e) {
|
|
||||||
return speedMarginDefault;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -98,23 +79,16 @@ public class DynamicSpeedTrackPathDescriptor implements TrackPathDescriptor,
|
|||||||
@Override
|
@Override
|
||||||
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
|
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
|
||||||
Log.d(TAG, "DynamicSpeedTrackPathDescriptor: onSharedPreferences changed " + key);
|
Log.d(TAG, "DynamicSpeedTrackPathDescriptor: onSharedPreferences changed " + key);
|
||||||
if (key == null
|
if (PreferencesUtils.getKey(context, R.string.track_color_mode_percentage_key).equals(key)) {
|
||||||
|| !key.equals(context.getString(R.string.track_color_mode_dynamic_speed_variation_key))) { return; }
|
speedMargin = PreferencesUtils.getInt(context, R.string.track_color_mode_percentage_key,
|
||||||
SharedPreferences prefs = context.getSharedPreferences(Constants.SETTINGS_NAME,
|
PreferencesUtils.TRACK_COLOR_MODE_PERCENTAGE_DEFAULT);
|
||||||
Context.MODE_PRIVATE);
|
|
||||||
|
|
||||||
if (prefs == null) {
|
|
||||||
speedMargin = speedMarginDefault;
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
speedMargin = getSpeedMargin(prefs);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean needsRedraw() {
|
public boolean needsRedraw() {
|
||||||
long selectedTrackId = PreferencesUtils.getSelectedTrackId(context);
|
long selectedTrackId = PreferencesUtils.getLong(context, R.string.selected_track_id_key);
|
||||||
if (selectedTrackId == -1L) {
|
if (selectedTrackId == PreferencesUtils.SELECTED_TRACK_ID_DEFAULT) {
|
||||||
// Could not find track.
|
// Could not find track.
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,104 +13,66 @@
|
|||||||
* License for the specific language governing permissions and limitations under
|
* License for the specific language governing permissions and limitations under
|
||||||
* the License.
|
* the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package com.google.android.apps.mytracks.maps;
|
package com.google.android.apps.mytracks.maps;
|
||||||
|
|
||||||
import static com.google.android.apps.mytracks.Constants.TAG;
|
|
||||||
|
|
||||||
import com.google.android.apps.mytracks.Constants;
|
import com.google.android.apps.mytracks.Constants;
|
||||||
|
import com.google.android.apps.mytracks.util.PreferencesUtils;
|
||||||
import com.google.android.maps.mytracks.R;
|
import com.google.android.maps.mytracks.R;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.SharedPreferences;
|
import android.content.SharedPreferences;
|
||||||
import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
|
import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
|
||||||
import android.util.Log;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A fixed speed path descriptor.
|
* A fixed speed path descriptor.
|
||||||
*
|
*
|
||||||
* @author Vangelis S.
|
* @author Vangelis S.
|
||||||
*/
|
*/
|
||||||
public class FixedSpeedTrackPathDescriptor implements TrackPathDescriptor, OnSharedPreferenceChangeListener {
|
public class FixedSpeedTrackPathDescriptor
|
||||||
|
implements TrackPathDescriptor, OnSharedPreferenceChangeListener {
|
||||||
private int slowSpeed;
|
private int slowSpeed;
|
||||||
private int normalSpeed;
|
private int normalSpeed;
|
||||||
private final int slowDefault;
|
|
||||||
private final int normalDefault;
|
|
||||||
private final Context context;
|
private final Context context;
|
||||||
|
|
||||||
public FixedSpeedTrackPathDescriptor(Context context) {
|
public FixedSpeedTrackPathDescriptor(Context context) {
|
||||||
|
|
||||||
this.context = context;
|
this.context = context;
|
||||||
slowDefault = Integer.parseInt(context.getString(R.string.color_mode_fixed_slow_default));
|
|
||||||
normalDefault = Integer.parseInt(context.getString(R.string.color_mode_fixed_medium_default));
|
context.getSharedPreferences(Constants.SETTINGS_NAME, Context.MODE_PRIVATE)
|
||||||
|
.registerOnSharedPreferenceChangeListener(this);
|
||||||
SharedPreferences prefs = context.getSharedPreferences(
|
|
||||||
Constants.SETTINGS_NAME, Context.MODE_PRIVATE);
|
slowSpeed = PreferencesUtils.getInt(context, R.string.track_color_mode_slow_key,
|
||||||
if (prefs == null) {
|
PreferencesUtils.TRACK_COLOR_MODE_SLOW_DEFAULT);
|
||||||
slowSpeed = slowDefault;
|
normalSpeed = PreferencesUtils.getInt(context, R.string.track_color_mode_medium_key,
|
||||||
normalSpeed = normalDefault;
|
PreferencesUtils.TRACK_COLOR_MODE_MEDIUM_DEFAULT);
|
||||||
return;
|
|
||||||
}
|
|
||||||
prefs.registerOnSharedPreferenceChangeListener(this);
|
|
||||||
|
|
||||||
try {
|
|
||||||
slowSpeed = Integer.parseInt(prefs.getString(context.getString(
|
|
||||||
R.string.track_color_mode_fixed_speed_slow_key), Integer.toString(slowDefault)));
|
|
||||||
} catch (NumberFormatException e) {
|
|
||||||
slowSpeed = slowDefault;
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
normalSpeed = Integer.parseInt(prefs.getString(context.getString(
|
|
||||||
R.string.track_color_mode_fixed_speed_medium_key), Integer.toString(normalDefault)));
|
|
||||||
} catch (NumberFormatException e) {
|
|
||||||
normalSpeed = normalDefault;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the slow speed for reference.
|
* Gets the slow speed for reference.
|
||||||
|
*
|
||||||
* @return The speed limit considered as slow.
|
* @return The speed limit considered as slow.
|
||||||
*/
|
*/
|
||||||
public int getSlowSpeed() {
|
public int getSlowSpeed() {
|
||||||
return slowSpeed;
|
return slowSpeed;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the normal speed for reference.
|
* Gets the normal speed for reference.
|
||||||
|
*
|
||||||
* @return The speed limit considered as normal.
|
* @return The speed limit considered as normal.
|
||||||
*/
|
*/
|
||||||
public int getNormalSpeed() {
|
public int getNormalSpeed() {
|
||||||
return normalSpeed;
|
return normalSpeed;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
|
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
|
||||||
Log.d(TAG, "FixedSpeedTrackPathDescriptor: onSharedPreferences changed " + key);
|
if (PreferencesUtils.getKey(context, R.string.track_color_mode_slow_key).equals(key)) {
|
||||||
if (key == null
|
slowSpeed = PreferencesUtils.getInt(context, R.string.track_color_mode_slow_key,
|
||||||
|| (!key.equals(context.getString(R.string.track_color_mode_fixed_speed_slow_key))
|
PreferencesUtils.TRACK_COLOR_MODE_SLOW_DEFAULT);
|
||||||
&& !key.equals(context.getString(R.string.track_color_mode_fixed_speed_medium_key)))) {
|
} else if (PreferencesUtils.getKey(context, R.string.track_color_mode_medium_key).equals(key)) {
|
||||||
return;
|
normalSpeed = PreferencesUtils.getInt(context, R.string.track_color_mode_medium_key,
|
||||||
}
|
PreferencesUtils.TRACK_COLOR_MODE_MEDIUM_DEFAULT);
|
||||||
SharedPreferences prefs = context.getSharedPreferences(
|
|
||||||
Constants.SETTINGS_NAME, Context.MODE_PRIVATE);
|
|
||||||
if (prefs == null) {
|
|
||||||
slowSpeed = slowDefault;
|
|
||||||
normalSpeed = normalDefault;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
slowSpeed = Integer.parseInt(prefs.getString(context.getString(
|
|
||||||
R.string.track_color_mode_fixed_speed_slow_key), Integer.toString(slowDefault)));
|
|
||||||
} catch (NumberFormatException e) {
|
|
||||||
slowSpeed = slowDefault;
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
normalSpeed = Integer.parseInt(prefs.getString(context.getString(
|
|
||||||
R.string.track_color_mode_fixed_speed_medium_key), Integer.toString(normalDefault)));
|
|
||||||
} catch (NumberFormatException e) {
|
|
||||||
normalSpeed = normalDefault;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -17,11 +17,10 @@ package com.google.android.apps.mytracks.maps;
|
|||||||
|
|
||||||
import static com.google.android.apps.mytracks.Constants.TAG;
|
import static com.google.android.apps.mytracks.Constants.TAG;
|
||||||
|
|
||||||
import com.google.android.apps.mytracks.Constants;
|
import com.google.android.apps.mytracks.util.PreferencesUtils;
|
||||||
import com.google.android.maps.mytracks.R;
|
import com.google.android.maps.mytracks.R;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.SharedPreferences;
|
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -40,26 +39,18 @@ public class TrackPathPainterFactory {
|
|||||||
* @return The TrackPathPainter that corresponds to the track color mode setting.
|
* @return The TrackPathPainter that corresponds to the track color mode setting.
|
||||||
*/
|
*/
|
||||||
public static TrackPathPainter getTrackPathPainter(Context context) {
|
public static TrackPathPainter getTrackPathPainter(Context context) {
|
||||||
SharedPreferences prefs = context.getSharedPreferences(
|
String trackColorMode = PreferencesUtils.getString(context, R.string.track_color_mode_key,
|
||||||
Constants.SETTINGS_NAME, Context.MODE_PRIVATE);
|
context.getString(R.string.settings_map_track_color_mode_single_value));
|
||||||
if (prefs == null) {
|
Log.i(TAG, "Creating track path painter of type: " + trackColorMode);
|
||||||
return new SingleColorTrackPathPainter(context);
|
|
||||||
}
|
|
||||||
|
|
||||||
String colorMode = prefs.getString(context.getString(R.string.track_color_mode_key), null);
|
|
||||||
Log.i(TAG, "Creating track path painter of type: " + colorMode);
|
|
||||||
|
|
||||||
if (colorMode == null
|
if (context.getString(R.string.settings_map_track_color_mode_fixed_value)
|
||||||
|| colorMode.equals(context.getString(R.string.display_track_color_value_none))) {
|
.equals(trackColorMode)) {
|
||||||
return new SingleColorTrackPathPainter(context);
|
return new DynamicSpeedTrackPathPainter(context, new FixedSpeedTrackPathDescriptor(context));
|
||||||
} else if (colorMode.equals(context.getString(R.string.display_track_color_value_fixed))) {
|
} else if (context.getString(R.string.settings_map_track_color_mode_dynamic_value)
|
||||||
return new DynamicSpeedTrackPathPainter(context,
|
.equals(trackColorMode)) {
|
||||||
new FixedSpeedTrackPathDescriptor(context));
|
return new DynamicSpeedTrackPathPainter(context, new DynamicSpeedTrackPathDescriptor(
|
||||||
} else if (colorMode.equals(context.getString(R.string.display_track_color_value_dynamic))) {
|
context));
|
||||||
return new DynamicSpeedTrackPathPainter(context,
|
|
||||||
new DynamicSpeedTrackPathDescriptor(context));
|
|
||||||
} else {
|
} else {
|
||||||
Log.w(TAG, "Using default track path painter. Unrecognized painter: " + colorMode);
|
|
||||||
return new SingleColorTrackPathPainter(context);
|
return new SingleColorTrackPathPainter(context);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,6 +16,7 @@
|
|||||||
|
|
||||||
package com.google.android.apps.mytracks.services;
|
package com.google.android.apps.mytracks.services;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A LocationListenerPolicy that will change based on how long the user has been
|
* A LocationListenerPolicy that will change based on how long the user has been
|
||||||
* stationary.
|
* stationary.
|
||||||
@@ -39,7 +40,7 @@ public class AdaptiveLocationListenerPolicy implements LocationListenerPolicy {
|
|||||||
private final long maxInterval;
|
private final long maxInterval;
|
||||||
|
|
||||||
private final int minDistance;
|
private final int minDistance;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The time the user has been at the current location, in milliseconds.
|
* The time the user has been at the current location, in milliseconds.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ import static com.google.android.apps.mytracks.Constants.TAG;
|
|||||||
|
|
||||||
import com.google.android.apps.mytracks.widgets.TrackWidgetProvider;
|
import com.google.android.apps.mytracks.widgets.TrackWidgetProvider;
|
||||||
import com.google.android.maps.mytracks.R;
|
import com.google.android.maps.mytracks.R;
|
||||||
|
import com.google.common.annotations.VisibleForTesting;
|
||||||
|
|
||||||
import android.app.IntentService;
|
import android.app.IntentService;
|
||||||
import android.content.ComponentName;
|
import android.content.ComponentName;
|
||||||
@@ -94,6 +95,18 @@ public class ControlRecordingService extends IntentService implements ServiceCon
|
|||||||
@Override
|
@Override
|
||||||
protected void onHandleIntent(Intent intent) {
|
protected void onHandleIntent(Intent intent) {
|
||||||
waitConnected();
|
waitConnected();
|
||||||
|
onHandleIntent(intent, trackRecordingService);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handles the intent to start or stop a recording.
|
||||||
|
*
|
||||||
|
* @param intent to be handled
|
||||||
|
* @param trackRecordingService the trackRecordingService
|
||||||
|
*/
|
||||||
|
@VisibleForTesting
|
||||||
|
void onHandleIntent(Intent intent, @SuppressWarnings("hiding") ITrackRecordingService trackRecordingService) {
|
||||||
String action = intent.getAction();
|
String action = intent.getAction();
|
||||||
if (action != null) {
|
if (action != null) {
|
||||||
try {
|
try {
|
||||||
|
|||||||
@@ -15,13 +15,12 @@
|
|||||||
*/
|
*/
|
||||||
package com.google.android.apps.mytracks.services;
|
package com.google.android.apps.mytracks.services;
|
||||||
|
|
||||||
import com.google.android.apps.mytracks.Constants;
|
import com.google.android.apps.mytracks.util.PreferencesUtils;
|
||||||
import com.google.android.apps.mytracks.util.StringUtils;
|
import com.google.android.apps.mytracks.util.StringUtils;
|
||||||
import com.google.android.maps.mytracks.R;
|
import com.google.android.maps.mytracks.R;
|
||||||
import com.google.common.annotations.VisibleForTesting;
|
import com.google.common.annotations.VisibleForTesting;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.SharedPreferences;
|
|
||||||
|
|
||||||
import java.text.SimpleDateFormat;
|
import java.text.SimpleDateFormat;
|
||||||
|
|
||||||
@@ -59,7 +58,7 @@ public class DefaultTrackNameFactory {
|
|||||||
} else {
|
} else {
|
||||||
// trackNameSetting equals
|
// trackNameSetting equals
|
||||||
// R.string.settings_recording_track_name_number_value
|
// R.string.settings_recording_track_name_number_value
|
||||||
return String.format(context.getString(R.string.track_name_format), trackId);
|
return context.getString(R.string.track_name_format, trackId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -68,10 +67,7 @@ public class DefaultTrackNameFactory {
|
|||||||
*/
|
*/
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
String getTrackNameSetting() {
|
String getTrackNameSetting() {
|
||||||
SharedPreferences sharedPreferences = context.getSharedPreferences(
|
return PreferencesUtils.getString(context, R.string.track_name_key,
|
||||||
Constants.SETTINGS_NAME, Context.MODE_PRIVATE);
|
|
||||||
return sharedPreferences.getString(
|
|
||||||
context.getString(R.string.track_name_key),
|
|
||||||
context.getString(R.string.settings_recording_track_name_date_local_value));
|
context.getString(R.string.settings_recording_track_name_date_local_value));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,156 +16,120 @@
|
|||||||
package com.google.android.apps.mytracks.services;
|
package com.google.android.apps.mytracks.services;
|
||||||
|
|
||||||
import com.google.android.apps.mytracks.Constants;
|
import com.google.android.apps.mytracks.Constants;
|
||||||
import com.google.android.apps.mytracks.util.ApiAdapterFactory;
|
|
||||||
import com.google.android.apps.mytracks.util.PreferencesUtils;
|
import com.google.android.apps.mytracks.util.PreferencesUtils;
|
||||||
import com.google.android.maps.mytracks.R;
|
import com.google.android.maps.mytracks.R;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.SharedPreferences;
|
import android.content.SharedPreferences;
|
||||||
import android.content.SharedPreferences.Editor;
|
|
||||||
import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
|
import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A class that manages reading the shared preferences for the service.
|
* A class that manages reading the shared preferences for the service.
|
||||||
*
|
*
|
||||||
* @author Sandor Dornbush
|
* @author Sandor Dornbush
|
||||||
*/
|
*/
|
||||||
public class PreferenceManager implements OnSharedPreferenceChangeListener {
|
public class PreferenceManager implements OnSharedPreferenceChangeListener {
|
||||||
private TrackRecordingService service;
|
private TrackRecordingService service;
|
||||||
private SharedPreferences sharedPreferences;
|
private SharedPreferences sharedPreferences;
|
||||||
private final String announcementFrequencyKey;
|
|
||||||
private final String autoResumeTrackCurrentRetryKey;
|
|
||||||
private final String autoResumeTrackTimeoutKey;
|
|
||||||
private final String maxRecordingDistanceKey;
|
|
||||||
private final String minRecordingDistanceKey;
|
|
||||||
private final String minRecordingIntervalKey;
|
|
||||||
private final String minRequiredAccuracyKey;
|
|
||||||
private final String splitFrequencyKey;
|
|
||||||
|
|
||||||
public PreferenceManager(TrackRecordingService service) {
|
public PreferenceManager(TrackRecordingService service) {
|
||||||
this.service = service;
|
this.service = service;
|
||||||
this.sharedPreferences = service.getSharedPreferences(
|
this.sharedPreferences = service.getSharedPreferences(
|
||||||
Constants.SETTINGS_NAME, Context.MODE_PRIVATE);
|
Constants.SETTINGS_NAME, Context.MODE_PRIVATE);
|
||||||
if (sharedPreferences == null) {
|
|
||||||
Log.w(Constants.TAG,
|
|
||||||
"TrackRecordingService: Couldn't get shared preferences.");
|
|
||||||
throw new IllegalStateException("Couldn't get shared preferences");
|
|
||||||
}
|
|
||||||
sharedPreferences.registerOnSharedPreferenceChangeListener(this);
|
sharedPreferences.registerOnSharedPreferenceChangeListener(this);
|
||||||
|
|
||||||
announcementFrequencyKey =
|
|
||||||
service.getString(R.string.announcement_frequency_key);
|
|
||||||
autoResumeTrackCurrentRetryKey =
|
|
||||||
service.getString(R.string.auto_resume_track_current_retry_key);
|
|
||||||
autoResumeTrackTimeoutKey =
|
|
||||||
service.getString(R.string.auto_resume_track_timeout_key);
|
|
||||||
maxRecordingDistanceKey =
|
|
||||||
service.getString(R.string.max_recording_distance_key);
|
|
||||||
minRecordingDistanceKey =
|
|
||||||
service.getString(R.string.min_recording_distance_key);
|
|
||||||
minRecordingIntervalKey =
|
|
||||||
service.getString(R.string.min_recording_interval_key);
|
|
||||||
minRequiredAccuracyKey =
|
|
||||||
service.getString(R.string.min_required_accuracy_key);
|
|
||||||
splitFrequencyKey =
|
|
||||||
service.getString(R.string.split_frequency_key);
|
|
||||||
|
|
||||||
// Refresh all properties.
|
// Refresh all properties.
|
||||||
onSharedPreferenceChanged(sharedPreferences, null);
|
onSharedPreferenceChanged(sharedPreferences, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Notifies that preferences have changed.
|
* Notifies that preferences have changed. Call this with key == null to
|
||||||
* Call this with key == null to update all preferences in one call.
|
* update all preferences in one call.
|
||||||
*
|
*
|
||||||
* @param key the key that changed (may be null to update all preferences)
|
* @param key the key that changed (may be null to update all preferences)
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void onSharedPreferenceChanged(SharedPreferences preferences,
|
public void onSharedPreferenceChanged(SharedPreferences preferences, String key) {
|
||||||
String key) {
|
|
||||||
if (service == null) {
|
if (service == null) {
|
||||||
Log.w(Constants.TAG,
|
Log.w(Constants.TAG, "onSharedPreferenceChanged: a preference change (key = " + key
|
||||||
"onSharedPreferenceChanged: a preference change (key = " + key
|
|
||||||
+ ") after a call to shutdown()");
|
+ ") after a call to shutdown()");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (key == null || key.equals(minRecordingDistanceKey)) {
|
if (key == null
|
||||||
int minRecordingDistance = sharedPreferences.getInt(
|
|| PreferencesUtils.getKey(service, R.string.recording_track_id_key).equals(key)) {
|
||||||
minRecordingDistanceKey,
|
long recordingTrackId = PreferencesUtils.getLong(service, R.string.recording_track_id_key);
|
||||||
Constants.DEFAULT_MIN_RECORDING_DISTANCE);
|
/*
|
||||||
service.setMinRecordingDistance(minRecordingDistance);
|
* Only set the id if it is valid. Setting it to -1L should only happen
|
||||||
Log.d(Constants.TAG,
|
* in TrackRecordingService.endCurrentTrack()
|
||||||
"TrackRecordingService: minRecordingDistance = "
|
*/
|
||||||
+ minRecordingDistance);
|
if (recordingTrackId != PreferencesUtils.RECORDING_TRACK_ID_DEFAULT) {
|
||||||
|
service.setRecordingTrackId(recordingTrackId);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (key == null || key.equals(maxRecordingDistanceKey)) {
|
if (key == null || PreferencesUtils.getKey(service, R.string.metric_units_key).equals(key)) {
|
||||||
service.setMaxRecordingDistance(sharedPreferences.getInt(
|
service.setMetricUnits(PreferencesUtils.getBoolean(
|
||||||
maxRecordingDistanceKey,
|
service, R.string.metric_units_key, PreferencesUtils.METRIC_UNITS_DEFAULT));
|
||||||
Constants.DEFAULT_MAX_RECORDING_DISTANCE));
|
|
||||||
}
|
}
|
||||||
if (key == null || key.equals(minRecordingIntervalKey)) {
|
if (key == null
|
||||||
int minRecordingInterval = sharedPreferences.getInt(
|
|| PreferencesUtils.getKey(service, R.string.announcement_frequency_key).equals(key)) {
|
||||||
minRecordingIntervalKey,
|
service.setAnnouncementFrequency(PreferencesUtils.getInt(
|
||||||
Constants.DEFAULT_MIN_RECORDING_INTERVAL);
|
service, R.string.announcement_frequency_key,
|
||||||
|
PreferencesUtils.ANNOUNCEMENT_FREQUENCY_DEFAULT));
|
||||||
|
}
|
||||||
|
if (key == null || PreferencesUtils.getKey(service, R.string.split_frequency_key).equals(key)) {
|
||||||
|
service.setSplitFrequency(PreferencesUtils.getInt(
|
||||||
|
service, R.string.split_frequency_key, PreferencesUtils.SPLIT_FREQUENCY_DEFAULT));
|
||||||
|
}
|
||||||
|
if (key == null
|
||||||
|
|| PreferencesUtils.getKey(service, R.string.min_recording_interval_key).equals(key)) {
|
||||||
|
int minRecordingInterval = PreferencesUtils.getInt(service,
|
||||||
|
R.string.min_recording_interval_key, PreferencesUtils.MIN_RECORDING_INTERVAL_DEFAULT);
|
||||||
switch (minRecordingInterval) {
|
switch (minRecordingInterval) {
|
||||||
case -2:
|
case PreferencesUtils.MIN_RECORDING_INTERVAL_ADAPT_BATTERY_LIFE:
|
||||||
// Battery Miser
|
/*
|
||||||
// min: 30 seconds
|
* Choose battery life over moving time accuracy. min: 30 seconds,
|
||||||
// max: 5 minutes
|
* max: 5 minutes, inDist: 5 meters.
|
||||||
// minDist: 5 meters Choose battery life over moving time accuracy.
|
*/
|
||||||
service.setLocationListenerPolicy(
|
service.setLocationListenerPolicy(new AdaptiveLocationListenerPolicy(30000, 300000, 5));
|
||||||
new AdaptiveLocationListenerPolicy(30000, 300000, 5));
|
|
||||||
break;
|
break;
|
||||||
case -1:
|
case PreferencesUtils.MIN_RECORDING_INTERVAL_ADAPT_ACCURACY:
|
||||||
// High Accuracy
|
/*
|
||||||
// min: 1 second
|
* Get all the updates. min: 1 second, max: 30 seconds, minDist: 0
|
||||||
// max: 30 seconds
|
* meter.
|
||||||
// minDist: 0 meters get all updates to properly measure moving time.
|
*/
|
||||||
service.setLocationListenerPolicy(
|
service.setLocationListenerPolicy(new AdaptiveLocationListenerPolicy(1000, 30000, 0));
|
||||||
new AdaptiveLocationListenerPolicy(1000, 30000, 0));
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
service.setLocationListenerPolicy(
|
service.setLocationListenerPolicy(
|
||||||
new AbsoluteLocationListenerPolicy(minRecordingInterval * 1000));
|
new AbsoluteLocationListenerPolicy(minRecordingInterval * 1000));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (key == null || key.equals(minRequiredAccuracyKey)) {
|
if (key == null
|
||||||
service.setMinRequiredAccuracy(sharedPreferences.getInt(
|
|| PreferencesUtils.getKey(service, R.string.min_recording_distance_key).equals(key)) {
|
||||||
minRequiredAccuracyKey,
|
service.setMinRecordingDistance(PreferencesUtils.getInt(
|
||||||
Constants.DEFAULT_MIN_REQUIRED_ACCURACY));
|
service, R.string.min_recording_distance_key,
|
||||||
|
PreferencesUtils.MIN_RECORDING_DISTANCE_DEFAULT));
|
||||||
}
|
}
|
||||||
if (key == null || key.equals(announcementFrequencyKey)) {
|
if (key == null
|
||||||
service.setAnnouncementFrequency(
|
|| PreferencesUtils.getKey(service, R.string.max_recording_distance_key).equals(key)) {
|
||||||
sharedPreferences.getInt(announcementFrequencyKey, -1));
|
service.setMaxRecordingDistance(PreferencesUtils.getInt(
|
||||||
|
service, R.string.max_recording_distance_key,
|
||||||
|
PreferencesUtils.MAX_RECORDING_DISTANCE_DEFAULT));
|
||||||
}
|
}
|
||||||
if (key == null || key.equals(autoResumeTrackTimeoutKey)) {
|
|
||||||
service.setAutoResumeTrackTimeout(sharedPreferences.getInt(
|
|
||||||
autoResumeTrackTimeoutKey,
|
|
||||||
Constants.DEFAULT_AUTO_RESUME_TRACK_TIMEOUT));
|
|
||||||
}
|
|
||||||
if (key == null || key.equals(PreferencesUtils.getRecordingTrackIdKey(service))) {
|
|
||||||
long recordingTrackId = PreferencesUtils.getRecordingTrackId(service);
|
|
||||||
// Only read the id if it is valid.
|
|
||||||
// Setting it to -1 should only happen in
|
|
||||||
// TrackRecordingService.endCurrentTrack()
|
|
||||||
if (recordingTrackId != -1L) {
|
|
||||||
service.setRecordingTrackId(recordingTrackId);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (key == null || key.equals(splitFrequencyKey)) {
|
|
||||||
service.setSplitFrequency(
|
|
||||||
sharedPreferences.getInt(splitFrequencyKey, 0));
|
|
||||||
}
|
|
||||||
if (key == null || key.equals(PreferencesUtils.getMetricUnitsKey(service))) {
|
|
||||||
service.setMetricUnits(PreferencesUtils.isMetricUnits(service));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setAutoResumeTrackCurrentRetry(int retryAttempts) {
|
if (key == null
|
||||||
Editor editor = sharedPreferences.edit();
|
|| PreferencesUtils.getKey(service, R.string.min_required_accuracy_key).equals(key)) {
|
||||||
editor.putInt(autoResumeTrackCurrentRetryKey, retryAttempts);
|
service.setMinRequiredAccuracy(PreferencesUtils.getInt(
|
||||||
ApiAdapterFactory.getApiAdapter().applyPreferenceChanges(editor);
|
service, R.string.min_required_accuracy_key,
|
||||||
|
PreferencesUtils.MIN_REQUIRED_ACCURACY_DEFAULT));
|
||||||
|
}
|
||||||
|
if (key == null
|
||||||
|
|| PreferencesUtils.getKey(service, R.string.auto_resume_track_timeout_key).equals(key)) {
|
||||||
|
service.setAutoResumeTrackTimeout(PreferencesUtils.getInt(
|
||||||
|
service, R.string.auto_resume_track_timeout_key,
|
||||||
|
PreferencesUtils.AUTO_RESUME_TRACK_TIMEOUT_DEFAULT));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void shutdown() {
|
public void shutdown() {
|
||||||
|
|||||||
@@ -50,7 +50,6 @@ import android.app.Service;
|
|||||||
import android.content.ContentValues;
|
import android.content.ContentValues;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.content.SharedPreferences;
|
|
||||||
import android.database.Cursor;
|
import android.database.Cursor;
|
||||||
import android.database.sqlite.SQLiteException;
|
import android.database.sqlite.SQLiteException;
|
||||||
import android.location.Location;
|
import android.location.Location;
|
||||||
@@ -84,14 +83,10 @@ public class TrackRecordingService extends Service {
|
|||||||
private LocationManager locationManager;
|
private LocationManager locationManager;
|
||||||
private WakeLock wakeLock;
|
private WakeLock wakeLock;
|
||||||
|
|
||||||
private int minRecordingDistance =
|
private int minRecordingDistance = PreferencesUtils.MIN_RECORDING_DISTANCE_DEFAULT;
|
||||||
Constants.DEFAULT_MIN_RECORDING_DISTANCE;
|
private int maxRecordingDistance = PreferencesUtils.MAX_RECORDING_DISTANCE_DEFAULT;
|
||||||
private int maxRecordingDistance =
|
private int minRequiredAccuracy = PreferencesUtils.MIN_REQUIRED_ACCURACY_DEFAULT;
|
||||||
Constants.DEFAULT_MAX_RECORDING_DISTANCE;
|
private int autoResumeTrackTimeout = PreferencesUtils.AUTO_RESUME_TRACK_TIMEOUT_DEFAULT;
|
||||||
private int minRequiredAccuracy =
|
|
||||||
Constants.DEFAULT_MIN_REQUIRED_ACCURACY;
|
|
||||||
private int autoResumeTrackTimeout =
|
|
||||||
Constants.DEFAULT_AUTO_RESUME_TRACK_TIMEOUT;
|
|
||||||
|
|
||||||
private long recordingTrackId = -1;
|
private long recordingTrackId = -1;
|
||||||
|
|
||||||
@@ -123,7 +118,7 @@ public class TrackRecordingService extends Service {
|
|||||||
|
|
||||||
private SensorManager sensorManager;
|
private SensorManager sensorManager;
|
||||||
|
|
||||||
private PreferenceManager prefManager;
|
private PreferenceManager prefereceManager;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The interval in milliseconds that we have requested to be notified of gps
|
* The interval in milliseconds that we have requested to be notified of gps
|
||||||
@@ -248,7 +243,7 @@ public class TrackRecordingService extends Service {
|
|||||||
setUpTaskExecutors();
|
setUpTaskExecutors();
|
||||||
executorService = Executors.newSingleThreadExecutor();
|
executorService = Executors.newSingleThreadExecutor();
|
||||||
|
|
||||||
prefManager = new PreferenceManager(this);
|
prefereceManager = new PreferenceManager(this);
|
||||||
|
|
||||||
registerLocationListener();
|
registerLocationListener();
|
||||||
|
|
||||||
@@ -271,7 +266,7 @@ public class TrackRecordingService extends Service {
|
|||||||
+ "Resetting an orphaned recording track = " + recordingTrackId);
|
+ "Resetting an orphaned recording track = " + recordingTrackId);
|
||||||
}
|
}
|
||||||
recordingTrackId = -1L;
|
recordingTrackId = -1L;
|
||||||
PreferencesUtils.setRecordingTrackId(this, recordingTrackId);
|
PreferencesUtils.setLong(this, R.string.recording_track_id_key, recordingTrackId);
|
||||||
}
|
}
|
||||||
showNotification();
|
showNotification();
|
||||||
}
|
}
|
||||||
@@ -328,7 +323,7 @@ public class TrackRecordingService extends Service {
|
|||||||
+ recordingTrack + ") doesn't exist or is too old");
|
+ recordingTrack + ") doesn't exist or is too old");
|
||||||
isRecording = false;
|
isRecording = false;
|
||||||
recordingTrackId = -1L;
|
recordingTrackId = -1L;
|
||||||
PreferencesUtils.setRecordingTrackId(this, recordingTrackId);
|
PreferencesUtils.setLong(this, R.string.recording_track_id_key, recordingTrackId);
|
||||||
stopSelfResult(startId);
|
stopSelfResult(startId);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -354,8 +349,7 @@ public class TrackRecordingService extends Service {
|
|||||||
|
|
||||||
isRecording = false;
|
isRecording = false;
|
||||||
showNotification();
|
showNotification();
|
||||||
prefManager.shutdown();
|
prefereceManager.shutdown();
|
||||||
prefManager = null;
|
|
||||||
checkLocationListener.cancel();
|
checkLocationListener.cancel();
|
||||||
checkLocationListener = null;
|
checkLocationListener = null;
|
||||||
timer.cancel();
|
timer.cancel();
|
||||||
@@ -383,7 +377,7 @@ public class TrackRecordingService extends Service {
|
|||||||
|
|
||||||
private void setAutoResumeTrackRetries(int retryAttempts) {
|
private void setAutoResumeTrackRetries(int retryAttempts) {
|
||||||
Log.d(TAG, "Updating auto-resume retry attempts to: " + retryAttempts);
|
Log.d(TAG, "Updating auto-resume retry attempts to: " + retryAttempts);
|
||||||
prefManager.setAutoResumeTrackCurrentRetry(retryAttempts);
|
PreferencesUtils.setInt(this, R.string.auto_resume_track_current_retry_key, retryAttempts);
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean shouldResumeTrack(Track track) {
|
private boolean shouldResumeTrack(Track track) {
|
||||||
@@ -391,10 +385,8 @@ public class TrackRecordingService extends Service {
|
|||||||
+ autoResumeTrackTimeout);
|
+ autoResumeTrackTimeout);
|
||||||
|
|
||||||
// Check if we haven't exceeded the maximum number of retry attempts.
|
// Check if we haven't exceeded the maximum number of retry attempts.
|
||||||
SharedPreferences sharedPreferences = getSharedPreferences(
|
int retries = PreferencesUtils.getInt(this, R.string.auto_resume_track_current_retry_key,
|
||||||
Constants.SETTINGS_NAME, Context.MODE_PRIVATE);
|
PreferencesUtils.AUTO_RESUME_TRACK_CURRENT_RETRY_DEFAULT);
|
||||||
int retries = sharedPreferences.getInt(
|
|
||||||
getString(R.string.auto_resume_track_current_retry_key), 0);
|
|
||||||
Log.d(TAG,
|
Log.d(TAG,
|
||||||
"shouldResumeTrack: Attempting to auto-resume the track ("
|
"shouldResumeTrack: Attempting to auto-resume the track ("
|
||||||
+ (retries + 1) + "/" + MAX_AUTO_RESUME_TRACK_RETRY_ATTEMPTS + ")");
|
+ (retries + 1) + "/" + MAX_AUTO_RESUME_TRACK_RETRY_ATTEMPTS + ")");
|
||||||
@@ -409,12 +401,12 @@ public class TrackRecordingService extends Service {
|
|||||||
setAutoResumeTrackRetries(retries + 1);
|
setAutoResumeTrackRetries(retries + 1);
|
||||||
|
|
||||||
// Check for special cases.
|
// Check for special cases.
|
||||||
if (autoResumeTrackTimeout == 0) {
|
if (autoResumeTrackTimeout == PreferencesUtils.AUTO_RESUME_TRACK_TIMEOUT_NEVER) {
|
||||||
// Never resume.
|
// Never resume.
|
||||||
Log.d(TAG,
|
Log.d(TAG,
|
||||||
"shouldResumeTrack: Auto-resume disabled (never resume)");
|
"shouldResumeTrack: Auto-resume disabled (never resume)");
|
||||||
return false;
|
return false;
|
||||||
} else if (autoResumeTrackTimeout == -1) {
|
} else if (autoResumeTrackTimeout == PreferencesUtils.AUTO_RESUME_TRACK_TIMEOUT_ALWAYS) {
|
||||||
// Always resume.
|
// Always resume.
|
||||||
Log.d(TAG,
|
Log.d(TAG,
|
||||||
"shouldResumeTrack: Auto-resume forced (always resume)");
|
"shouldResumeTrack: Auto-resume forced (always resume)");
|
||||||
@@ -565,12 +557,6 @@ public class TrackRecordingService extends Service {
|
|||||||
"Location listener now unregistered w/ TrackRecordingService.");
|
"Location listener now unregistered w/ TrackRecordingService.");
|
||||||
}
|
}
|
||||||
|
|
||||||
private String getDefaultActivityType(Context context) {
|
|
||||||
SharedPreferences prefs = context.getSharedPreferences(
|
|
||||||
Constants.SETTINGS_NAME, Context.MODE_PRIVATE);
|
|
||||||
return prefs.getString(context.getString(R.string.default_activity_key), "");
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Recording lifecycle.
|
* Recording lifecycle.
|
||||||
*/
|
*/
|
||||||
@@ -593,7 +579,8 @@ public class TrackRecordingService extends Service {
|
|||||||
track.setId(recordingTrackId);
|
track.setId(recordingTrackId);
|
||||||
track.setName(new DefaultTrackNameFactory(this).getDefaultTrackName(
|
track.setName(new DefaultTrackNameFactory(this).getDefaultTrackName(
|
||||||
recordingTrackId, startTime));
|
recordingTrackId, startTime));
|
||||||
track.setCategory(getDefaultActivityType(this));
|
track.setCategory(PreferencesUtils.getString(
|
||||||
|
this, R.string.default_activity_key, PreferencesUtils.DEFAULT_ACTIVITY_DEFAULT));
|
||||||
isRecording = true;
|
isRecording = true;
|
||||||
isMoving = true;
|
isMoving = true;
|
||||||
|
|
||||||
@@ -611,7 +598,7 @@ public class TrackRecordingService extends Service {
|
|||||||
// Reset the number of auto-resume retries.
|
// Reset the number of auto-resume retries.
|
||||||
setAutoResumeTrackRetries(0);
|
setAutoResumeTrackRetries(0);
|
||||||
// Persist the current recording track.
|
// Persist the current recording track.
|
||||||
PreferencesUtils.setRecordingTrackId(this, recordingTrackId);
|
PreferencesUtils.setLong(this, R.string.recording_track_id_key, recordingTrackId);
|
||||||
|
|
||||||
// Notify the world that we're now recording.
|
// Notify the world that we're now recording.
|
||||||
sendTrackBroadcast(
|
sendTrackBroadcast(
|
||||||
@@ -1054,7 +1041,7 @@ public class TrackRecordingService extends Service {
|
|||||||
showNotification();
|
showNotification();
|
||||||
long recordedTrackId = recordingTrackId;
|
long recordedTrackId = recordingTrackId;
|
||||||
recordingTrackId = -1L;
|
recordingTrackId = -1L;
|
||||||
PreferencesUtils.setRecordingTrackId(this, recordingTrackId);
|
PreferencesUtils.setLong(this, R.string.recording_track_id_key, recordingTrackId);
|
||||||
|
|
||||||
if (sensorManager != null) {
|
if (sensorManager != null) {
|
||||||
SensorManagerFactory.getInstance().releaseSensorManager(sensorManager);
|
SensorManagerFactory.getInstance().releaseSensorManager(sensorManager);
|
||||||
@@ -1075,10 +1062,8 @@ public class TrackRecordingService extends Service {
|
|||||||
.setAction(getString(actionResId))
|
.setAction(getString(actionResId))
|
||||||
.putExtra(getString(R.string.track_id_broadcast_extra), trackId);
|
.putExtra(getString(R.string.track_id_broadcast_extra), trackId);
|
||||||
sendBroadcast(broadcastIntent, getString(R.string.permission_notification_value));
|
sendBroadcast(broadcastIntent, getString(R.string.permission_notification_value));
|
||||||
|
if (PreferencesUtils.getBoolean(
|
||||||
SharedPreferences sharedPreferences = getSharedPreferences(
|
this, R.string.allow_access_key, PreferencesUtils.ALLOW_ACCESS_DEFAULT)) {
|
||||||
Constants.SETTINGS_NAME, Context.MODE_PRIVATE);
|
|
||||||
if (sharedPreferences.getBoolean(getString(R.string.allow_access_key), false)) {
|
|
||||||
sendBroadcast(broadcastIntent, getString(R.string.broadcast_notifications_permission));
|
sendBroadcast(broadcastIntent, getString(R.string.broadcast_notifications_permission));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1224,20 +1209,17 @@ public class TrackRecordingService extends Service {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns true if the RPC caller is from the same application or if the
|
* Returns true if the RPC caller is from the same application or if the
|
||||||
* "Allow access" setting indicates that another app can invoke this service's
|
* "Allow access" setting indicates that another app can invoke this
|
||||||
* RPCs.
|
* service's RPCs.
|
||||||
*/
|
*/
|
||||||
private boolean canAccess() {
|
private boolean canAccess() {
|
||||||
|
|
||||||
// As a precondition for access, must check if the service is available.
|
// As a precondition for access, must check if the service is available.
|
||||||
checkService();
|
checkService();
|
||||||
|
|
||||||
if (Process.myPid() == Binder.getCallingPid()) {
|
if (Process.myPid() == Binder.getCallingPid()) {
|
||||||
return true;
|
return true;
|
||||||
} else {
|
} else {
|
||||||
SharedPreferences sharedPreferences = service.getSharedPreferences(
|
return PreferencesUtils.getBoolean(
|
||||||
Constants.SETTINGS_NAME, Context.MODE_PRIVATE);
|
service, R.string.allow_access_key, PreferencesUtils.ALLOW_ACCESS_DEFAULT);
|
||||||
return sharedPreferences.getBoolean(service.getString(R.string.allow_access_key), false);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -19,12 +19,12 @@ import static com.google.android.apps.mytracks.Constants.TAG;
|
|||||||
|
|
||||||
import com.google.android.apps.mytracks.Constants;
|
import com.google.android.apps.mytracks.Constants;
|
||||||
import com.google.android.apps.mytracks.content.Sensor;
|
import com.google.android.apps.mytracks.content.Sensor;
|
||||||
|
import com.google.android.apps.mytracks.util.PreferencesUtils;
|
||||||
import com.google.android.maps.mytracks.R;
|
import com.google.android.maps.mytracks.R;
|
||||||
|
|
||||||
import android.bluetooth.BluetoothAdapter;
|
import android.bluetooth.BluetoothAdapter;
|
||||||
import android.bluetooth.BluetoothDevice;
|
import android.bluetooth.BluetoothDevice;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.SharedPreferences;
|
|
||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
import android.os.Looper;
|
import android.os.Looper;
|
||||||
import android.os.Message;
|
import android.os.Message;
|
||||||
@@ -127,16 +127,20 @@ public class BluetoothSensorManager extends SensorManager {
|
|||||||
Log.w(Constants.TAG, "Disabled manager onStartTrack");
|
Log.w(Constants.TAG, "Disabled manager onStartTrack");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
SharedPreferences prefs = context.getSharedPreferences(
|
String address = PreferencesUtils.getString(
|
||||||
Constants.SETTINGS_NAME, Context.MODE_PRIVATE);
|
context, R.string.bluetooth_sensor_key, PreferencesUtils.BLUETOOTH_SENSOR_DEFAULT);
|
||||||
String address =
|
if (PreferencesUtils.BLUETOOTH_SENSOR_DEFAULT.equals(address)) {
|
||||||
prefs.getString(context.getString(R.string.bluetooth_sensor_key), "");
|
|
||||||
if (address == null || address.equals("")) {
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Log.w(Constants.TAG, "Connecting to bluetooth sensor: " + address);
|
Log.w(Constants.TAG, "Connecting to bluetooth sensor: " + address);
|
||||||
// Get the BluetoothDevice object
|
// Get the BluetoothDevice object
|
||||||
BluetoothDevice device = bluetoothAdapter.getRemoteDevice(address);
|
BluetoothDevice device;
|
||||||
|
try {
|
||||||
|
device = bluetoothAdapter.getRemoteDevice(address);
|
||||||
|
} catch (IllegalArgumentException e) {
|
||||||
|
Log.d(Constants.TAG, "Invalid address " + address, e);
|
||||||
|
return;
|
||||||
|
}
|
||||||
// Attempt to connect to the device
|
// Attempt to connect to the device
|
||||||
connectionManager.connect(device);
|
connectionManager.connect(device);
|
||||||
|
|
||||||
|
|||||||
@@ -18,10 +18,10 @@ package com.google.android.apps.mytracks.services.sensors;
|
|||||||
import com.google.android.apps.mytracks.Constants;
|
import com.google.android.apps.mytracks.Constants;
|
||||||
import com.google.android.apps.mytracks.services.sensors.ant.AntDirectSensorManager;
|
import com.google.android.apps.mytracks.services.sensors.ant.AntDirectSensorManager;
|
||||||
import com.google.android.apps.mytracks.services.sensors.ant.AntSrmBridgeSensorManager;
|
import com.google.android.apps.mytracks.services.sensors.ant.AntSrmBridgeSensorManager;
|
||||||
|
import com.google.android.apps.mytracks.util.PreferencesUtils;
|
||||||
import com.google.android.maps.mytracks.R;
|
import com.google.android.maps.mytracks.R;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.SharedPreferences;
|
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -53,41 +53,36 @@ public class SensorManagerFactory {
|
|||||||
* @return The sensor manager that corresponds to the sensor type setting.
|
* @return The sensor manager that corresponds to the sensor type setting.
|
||||||
*/
|
*/
|
||||||
public SensorManager getSensorManager(Context context) {
|
public SensorManager getSensorManager(Context context) {
|
||||||
SharedPreferences prefs = context.getSharedPreferences(
|
|
||||||
Constants.SETTINGS_NAME, Context.MODE_PRIVATE);
|
|
||||||
if (prefs == null) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
context = context.getApplicationContext();
|
context = context.getApplicationContext();
|
||||||
|
String sensorTypeValueNone = context.getString(R.string.sensor_type_value_none);
|
||||||
|
String sensorType = PreferencesUtils.getString(
|
||||||
|
context, R.string.sensor_type_key, sensorTypeValueNone);
|
||||||
|
Log.i(Constants.TAG, "Creating sensor of type: " + sensorType);
|
||||||
|
|
||||||
String sensor = prefs.getString(context.getString(R.string.sensor_type_key), null);
|
if (sensorTypeValueNone.equals(sensorType)) {
|
||||||
Log.i(Constants.TAG, "Creating sensor of type: " + sensor);
|
|
||||||
|
|
||||||
if (sensor == null) {
|
|
||||||
reset();
|
reset();
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
if (sensor.equals(activeSensorType)) {
|
if (sensorType.equals(activeSensorType)) {
|
||||||
Log.i(Constants.TAG, "Returning existing sensor manager.");
|
Log.i(Constants.TAG, "Returning existing sensor manager.");
|
||||||
refCount++;
|
refCount++;
|
||||||
return activeSensorManager;
|
return activeSensorManager;
|
||||||
}
|
}
|
||||||
reset();
|
reset();
|
||||||
|
|
||||||
if (sensor.equals(context.getString(R.string.sensor_type_value_ant))) {
|
if (sensorType.equals(context.getString(R.string.sensor_type_value_ant))) {
|
||||||
activeSensorManager = new AntDirectSensorManager(context);
|
activeSensorManager = new AntDirectSensorManager(context);
|
||||||
} else if (sensor.equals(context.getString(R.string.sensor_type_value_srm_ant_bridge))) {
|
} else if (sensorType.equals(context.getString(R.string.sensor_type_value_srm_ant_bridge))) {
|
||||||
activeSensorManager = new AntSrmBridgeSensorManager(context);
|
activeSensorManager = new AntSrmBridgeSensorManager(context);
|
||||||
} else if (sensor.equals(context.getString(R.string.sensor_type_value_zephyr))) {
|
} else if (sensorType.equals(context.getString(R.string.sensor_type_value_zephyr))) {
|
||||||
activeSensorManager = new ZephyrSensorManager(context);
|
activeSensorManager = new ZephyrSensorManager(context);
|
||||||
} else if (sensor.equals(context.getString(R.string.sensor_type_value_polar))) {
|
} else if (sensorType.equals(context.getString(R.string.sensor_type_value_polar))) {
|
||||||
activeSensorManager = new PolarSensorManager(context);
|
activeSensorManager = new PolarSensorManager(context);
|
||||||
} else {
|
} else {
|
||||||
Log.w(Constants.TAG, "Unable to find sensor type: " + sensor);
|
Log.w(Constants.TAG, "Unable to find sensor type: " + sensorType);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
activeSensorType = sensor;
|
activeSensorType = sensorType;
|
||||||
refCount = 1;
|
refCount = 1;
|
||||||
activeSensorManager.onStartTrack();
|
activeSensorManager.onStartTrack();
|
||||||
return activeSensorManager;
|
return activeSensorManager;
|
||||||
|
|||||||
@@ -20,13 +20,11 @@ import static com.google.android.apps.mytracks.Constants.TAG;
|
|||||||
import com.dsi.ant.AntDefine;
|
import com.dsi.ant.AntDefine;
|
||||||
import com.dsi.ant.AntMesg;
|
import com.dsi.ant.AntMesg;
|
||||||
import com.dsi.ant.exception.AntInterfaceException;
|
import com.dsi.ant.exception.AntInterfaceException;
|
||||||
import com.google.android.apps.mytracks.Constants;
|
|
||||||
import com.google.android.apps.mytracks.content.Sensor;
|
import com.google.android.apps.mytracks.content.Sensor;
|
||||||
import com.google.android.apps.mytracks.util.ApiAdapterFactory;
|
import com.google.android.apps.mytracks.util.PreferencesUtils;
|
||||||
import com.google.android.maps.mytracks.R;
|
import com.google.android.maps.mytracks.R;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.SharedPreferences;
|
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -107,11 +105,7 @@ public class AntDirectSensorManager extends AntSensorManager
|
|||||||
}
|
}
|
||||||
Log.i(TAG, "Found ANT device id: " + deviceNumber + " on channel: " + channel);
|
Log.i(TAG, "Found ANT device id: " + deviceNumber + " on channel: " + channel);
|
||||||
|
|
||||||
SharedPreferences prefs = context.getSharedPreferences(
|
PreferencesUtils.setInt(context, sensorIdKeys[channel], deviceNumber);
|
||||||
Constants.SETTINGS_NAME, Context.MODE_PRIVATE);
|
|
||||||
SharedPreferences.Editor editor = prefs.edit();
|
|
||||||
editor.putInt(context.getString(sensorIdKeys[channel]), deviceNumber);
|
|
||||||
ApiAdapterFactory.getApiAdapter().applyPreferenceChanges(editor);
|
|
||||||
return deviceNumber;
|
return deviceNumber;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -171,12 +165,8 @@ public class AntDirectSensorManager extends AntSensorManager
|
|||||||
protected void setupAntSensorChannels() {
|
protected void setupAntSensorChannels() {
|
||||||
short devIds[] = new short[sensorIdKeys.length];
|
short devIds[] = new short[sensorIdKeys.length];
|
||||||
|
|
||||||
SharedPreferences prefs = context.getSharedPreferences(
|
for (int i = 0; i < sensorIdKeys.length; ++i) {
|
||||||
Constants.SETTINGS_NAME, Context.MODE_PRIVATE);
|
devIds[i] = (short) PreferencesUtils.getInt(context, sensorIdKeys[i], WILDCARD);
|
||||||
if (prefs != null) {
|
|
||||||
for (int i = 0; i < sensorIdKeys.length; ++i) {
|
|
||||||
devIds[i] = (short) prefs.getInt(context.getString(sensorIdKeys[i]), WILDCARD);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
sensors = new AntSensorBase[] {
|
sensors = new AntSensorBase[] {
|
||||||
|
|||||||
@@ -20,14 +20,12 @@ import static com.google.android.apps.mytracks.Constants.TAG;
|
|||||||
import com.dsi.ant.AntDefine;
|
import com.dsi.ant.AntDefine;
|
||||||
import com.dsi.ant.AntMesg;
|
import com.dsi.ant.AntMesg;
|
||||||
import com.dsi.ant.exception.AntInterfaceException;
|
import com.dsi.ant.exception.AntInterfaceException;
|
||||||
import com.google.android.apps.mytracks.Constants;
|
|
||||||
import com.google.android.apps.mytracks.content.Sensor;
|
import com.google.android.apps.mytracks.content.Sensor;
|
||||||
import com.google.android.apps.mytracks.util.ApiAdapterFactory;
|
import com.google.android.apps.mytracks.util.PreferencesUtils;
|
||||||
import com.google.android.maps.mytracks.BuildConfig;
|
import com.google.android.maps.mytracks.BuildConfig;
|
||||||
import com.google.android.maps.mytracks.R;
|
import com.google.android.maps.mytracks.R;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.SharedPreferences;
|
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -68,13 +66,8 @@ public class AntSrmBridgeSensorManager extends AntSensorManager {
|
|||||||
deviceNumber = WILDCARD;
|
deviceNumber = WILDCARD;
|
||||||
|
|
||||||
// First read the the device id that we will be pairing with.
|
// First read the the device id that we will be pairing with.
|
||||||
SharedPreferences prefs = context.getSharedPreferences(
|
deviceNumber = (short) PreferencesUtils.getInt(
|
||||||
Constants.SETTINGS_NAME, Context.MODE_PRIVATE);
|
context, R.string.ant_srm_bridge_sensor_id_key, WILDCARD);
|
||||||
if (prefs != null) {
|
|
||||||
deviceNumber =
|
|
||||||
(short) prefs.getInt(context.getString(
|
|
||||||
R.string.ant_srm_bridge_sensor_id_key), 0);
|
|
||||||
}
|
|
||||||
Log.i(TAG, "Will pair with device: " + deviceNumber);
|
Log.i(TAG, "Will pair with device: " + deviceNumber);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -194,12 +187,7 @@ public class AntSrmBridgeSensorManager extends AntSensorManager {
|
|||||||
AntChannelIdMessage message = new AntChannelIdMessage(rawMessage);
|
AntChannelIdMessage message = new AntChannelIdMessage(rawMessage);
|
||||||
deviceNumber = message.getDeviceNumber();
|
deviceNumber = message.getDeviceNumber();
|
||||||
Log.d(TAG, "Found device id: " + deviceNumber);
|
Log.d(TAG, "Found device id: " + deviceNumber);
|
||||||
|
PreferencesUtils.setInt(context, R.string.ant_srm_bridge_sensor_id_key, deviceNumber);
|
||||||
SharedPreferences prefs = context.getSharedPreferences(
|
|
||||||
Constants.SETTINGS_NAME, Context.MODE_PRIVATE);
|
|
||||||
SharedPreferences.Editor editor = prefs.edit();
|
|
||||||
editor.putInt(context.getString(R.string.ant_srm_bridge_sensor_id_key), deviceNumber);
|
|
||||||
ApiAdapterFactory.getApiAdapter().applyPreferenceChanges(editor);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void handleMessageResponse(byte[] rawMessage) {
|
private void handleMessageResponse(byte[] rawMessage) {
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ package com.google.android.apps.mytracks.services.tasks;
|
|||||||
import static com.google.android.apps.mytracks.Constants.TAG;
|
import static com.google.android.apps.mytracks.Constants.TAG;
|
||||||
|
|
||||||
import com.google.android.apps.mytracks.services.TrackRecordingService;
|
import com.google.android.apps.mytracks.services.TrackRecordingService;
|
||||||
|
import com.google.android.apps.mytracks.util.PreferencesUtils;
|
||||||
import com.google.android.apps.mytracks.util.UnitConversions;
|
import com.google.android.apps.mytracks.util.UnitConversions;
|
||||||
|
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
@@ -34,7 +35,7 @@ public class PeriodicTaskExecutor {
|
|||||||
* A value greater than zero is a frequency in time.
|
* A value greater than zero is a frequency in time.
|
||||||
* A value less than zero is considered a frequency in distance.
|
* A value less than zero is considered a frequency in distance.
|
||||||
*/
|
*/
|
||||||
private int taskFrequency = 0;
|
private int taskFrequency = PreferencesUtils.PERIODIC_TASK_OFF;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The next distance when the task should execute.
|
* The next distance when the task should execute.
|
||||||
@@ -74,7 +75,7 @@ public class PeriodicTaskExecutor {
|
|||||||
timerExecutor = null;
|
timerExecutor = null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (taskFrequency == 0) {
|
if (taskFrequency == PreferencesUtils.PERIODIC_TASK_OFF) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -150,9 +150,11 @@ public class StatusAnnouncerTask implements PeriodicTask {
|
|||||||
*/
|
*/
|
||||||
// @VisibleForTesting
|
// @VisibleForTesting
|
||||||
protected String getAnnouncement(TripStatistics stats) {
|
protected String getAnnouncement(TripStatistics stats) {
|
||||||
boolean metricUnits = PreferencesUtils.isMetricUnits(context);
|
boolean metricUnits = PreferencesUtils.getBoolean(
|
||||||
boolean reportSpeed = PreferencesUtils.isReportSpeed(context);
|
context, R.string.metric_units_key, PreferencesUtils.METRIC_UNITS_DEFAULT);
|
||||||
double d = stats.getTotalDistance() * UnitConversions.M_TO_KM;
|
boolean reportSpeed = PreferencesUtils.getBoolean(
|
||||||
|
context, R.string.report_speed_key, PreferencesUtils.REPORT_SPEED_DEFAULT);
|
||||||
|
double d = stats.getTotalDistance() * UnitConversions.M_TO_KM;
|
||||||
double s = stats.getAverageMovingSpeed() * UnitConversions.MS_TO_KMH;
|
double s = stats.getAverageMovingSpeed() * UnitConversions.MS_TO_KMH;
|
||||||
|
|
||||||
if (d == 0) {
|
if (d == 0) {
|
||||||
|
|||||||
@@ -0,0 +1,74 @@
|
|||||||
|
/*
|
||||||
|
* 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.settings;
|
||||||
|
|
||||||
|
import com.google.android.apps.mytracks.Constants;
|
||||||
|
import com.google.android.apps.mytracks.io.backup.BackupPreferencesListener;
|
||||||
|
import com.google.android.apps.mytracks.util.ApiAdapterFactory;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.preference.PreferenceActivity;
|
||||||
|
import android.preference.PreferenceManager;
|
||||||
|
import android.speech.tts.TextToSpeech;
|
||||||
|
import android.view.MenuItem;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An abstract activity for all the settings activities.
|
||||||
|
*
|
||||||
|
* @author Jimmy Shih
|
||||||
|
*/
|
||||||
|
public class AbstractSettingsActivity extends PreferenceActivity {
|
||||||
|
|
||||||
|
private BackupPreferencesListener backupPreferencesListener;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onCreate(Bundle bundle) {
|
||||||
|
super.onCreate(bundle);
|
||||||
|
setVolumeControlStream(TextToSpeech.Engine.DEFAULT_STREAM);
|
||||||
|
ApiAdapterFactory.getApiAdapter().configureActionBarHomeAsUp(this);
|
||||||
|
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
|
PreferenceManager preferenceManager = getPreferenceManager();
|
||||||
|
preferenceManager.setSharedPreferencesName(Constants.SETTINGS_NAME);
|
||||||
|
preferenceManager.setSharedPreferencesMode(Context.MODE_PRIVATE);
|
||||||
|
|
||||||
|
// Set up automatic preferences backup
|
||||||
|
backupPreferencesListener = ApiAdapterFactory.getApiAdapter()
|
||||||
|
.getBackupPreferencesListener(this);
|
||||||
|
preferenceManager.getSharedPreferences()
|
||||||
|
.registerOnSharedPreferenceChangeListener(backupPreferencesListener);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onOptionsItemSelected(MenuItem item) {
|
||||||
|
if (item.getItemId() != android.R.id.home) {
|
||||||
|
return super.onOptionsItemSelected(item);
|
||||||
|
}
|
||||||
|
finish();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onDestroy() {
|
||||||
|
super.onDestroy();
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
|
PreferenceManager preferenceManager = getPreferenceManager();
|
||||||
|
preferenceManager.getSharedPreferences()
|
||||||
|
.unregisterOnSharedPreferenceChangeListener(backupPreferencesListener);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,127 @@
|
|||||||
|
/*
|
||||||
|
* 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.settings;
|
||||||
|
|
||||||
|
import com.google.android.apps.mytracks.Constants;
|
||||||
|
import com.google.android.apps.mytracks.io.backup.BackupActivity;
|
||||||
|
import com.google.android.apps.mytracks.io.backup.RestoreChooserActivity;
|
||||||
|
import com.google.android.apps.mytracks.util.DialogUtils;
|
||||||
|
import com.google.android.apps.mytracks.util.IntentUtils;
|
||||||
|
import com.google.android.apps.mytracks.util.PreferencesUtils;
|
||||||
|
import com.google.android.maps.mytracks.R;
|
||||||
|
|
||||||
|
import android.app.Dialog;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.DialogInterface;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.content.SharedPreferences;
|
||||||
|
import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.preference.Preference;
|
||||||
|
import android.preference.Preference.OnPreferenceClickListener;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An activity for accessing the backup settings.
|
||||||
|
*
|
||||||
|
* @author Jimmy Shih
|
||||||
|
*/
|
||||||
|
public class BackupSettingsActivity extends AbstractSettingsActivity {
|
||||||
|
|
||||||
|
private static final int DIALOG_CONFIRM_RESTORE_ID = 0;
|
||||||
|
|
||||||
|
Preference backupPreference;
|
||||||
|
Preference restorePreference;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Note that sharedPreferenceChangeListenr cannot be an anonymous inner class.
|
||||||
|
* Anonymous inner class will get garbage collected.
|
||||||
|
*/
|
||||||
|
private final OnSharedPreferenceChangeListener
|
||||||
|
sharedPreferenceChangeListener = new OnSharedPreferenceChangeListener() {
|
||||||
|
@Override
|
||||||
|
public void onSharedPreferenceChanged(SharedPreferences preferences, String key) {
|
||||||
|
// Note that key can be null
|
||||||
|
if (PreferencesUtils.getKey(BackupSettingsActivity.this, R.string.recording_track_id_key)
|
||||||
|
.equals(key)) {
|
||||||
|
updateUi();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
|
@Override
|
||||||
|
protected void onCreate(Bundle bundle) {
|
||||||
|
super.onCreate(bundle);
|
||||||
|
getSharedPreferences(Constants.SETTINGS_NAME, Context.MODE_PRIVATE)
|
||||||
|
.registerOnSharedPreferenceChangeListener(sharedPreferenceChangeListener);
|
||||||
|
|
||||||
|
addPreferencesFromResource(R.xml.backup_settings);
|
||||||
|
backupPreference = findPreference(getString(R.string.settings_backup_now_key));
|
||||||
|
backupPreference.setOnPreferenceClickListener(new OnPreferenceClickListener() {
|
||||||
|
@Override
|
||||||
|
public boolean onPreferenceClick(Preference preference) {
|
||||||
|
Intent intent = IntentUtils.newIntent(BackupSettingsActivity.this, BackupActivity.class);
|
||||||
|
startActivity(intent);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
restorePreference = findPreference(getString(R.string.settings_backup_restore_key));
|
||||||
|
restorePreference.setOnPreferenceClickListener(new OnPreferenceClickListener() {
|
||||||
|
@Override
|
||||||
|
public boolean onPreferenceClick(Preference preference) {
|
||||||
|
showDialog(DIALOG_CONFIRM_RESTORE_ID);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Dialog onCreateDialog(int id) {
|
||||||
|
if (id != DIALOG_CONFIRM_RESTORE_ID) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return DialogUtils.createConfirmationDialog(this,
|
||||||
|
R.string.settings_backup_restore_confirm_message, new DialogInterface.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(DialogInterface dialog, int which) {
|
||||||
|
Intent intent = IntentUtils.newIntent(
|
||||||
|
BackupSettingsActivity.this, RestoreChooserActivity.class);
|
||||||
|
startActivity(intent);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onResume() {
|
||||||
|
super.onResume();
|
||||||
|
updateUi();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Updates the UI based on the recording state.
|
||||||
|
*/
|
||||||
|
private void updateUi() {
|
||||||
|
boolean isRecording = PreferencesUtils.getLong(this, R.string.recording_track_id_key)
|
||||||
|
!= PreferencesUtils.RECORDING_TRACK_ID_DEFAULT;
|
||||||
|
backupPreference.setEnabled(!isRecording);
|
||||||
|
restorePreference.setEnabled(!isRecording);
|
||||||
|
backupPreference.setSummary(isRecording ? R.string.settings_not_while_recording
|
||||||
|
: R.string.settings_backup_now_summary);
|
||||||
|
restorePreference.setSummary(isRecording ? R.string.settings_not_while_recording
|
||||||
|
: R.string.settings_backup_restore_summary);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,54 @@
|
|||||||
|
/*
|
||||||
|
* 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.settings;
|
||||||
|
|
||||||
|
import com.google.android.apps.mytracks.util.PreferencesUtils;
|
||||||
|
import com.google.android.maps.mytracks.R;
|
||||||
|
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.preference.CheckBoxPreference;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An activity for accessing chart settings.
|
||||||
|
*
|
||||||
|
* @author Jimmy Shih
|
||||||
|
*/
|
||||||
|
public class ChartSettingsActivity extends AbstractSettingsActivity {
|
||||||
|
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
|
@Override
|
||||||
|
protected void onCreate(Bundle bundle) {
|
||||||
|
super.onCreate(bundle);
|
||||||
|
addPreferencesFromResource(R.xml.chart_settings);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onResume() {
|
||||||
|
super.onResume();
|
||||||
|
updateUi();
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
|
private void updateUi() {
|
||||||
|
CheckBoxPreference speedCheckBoxPreference = (CheckBoxPreference) findPreference(
|
||||||
|
getString(R.string.chart_show_speed_key));
|
||||||
|
boolean reportSpeed = PreferencesUtils.getBoolean(
|
||||||
|
this, R.string.report_speed_key, PreferencesUtils.REPORT_SPEED_DEFAULT);
|
||||||
|
speedCheckBoxPreference.setTitle(reportSpeed ? R.string.stats_speed
|
||||||
|
: R.string.stats_pace);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,273 @@
|
|||||||
|
/*
|
||||||
|
* 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.settings;
|
||||||
|
|
||||||
|
import com.google.android.apps.mytracks.util.PreferencesUtils;
|
||||||
|
import com.google.android.apps.mytracks.util.UnitConversions;
|
||||||
|
import com.google.android.maps.mytracks.R;
|
||||||
|
|
||||||
|
import android.app.Dialog;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.preference.EditTextPreference;
|
||||||
|
import android.preference.ListPreference;
|
||||||
|
import android.preference.Preference;
|
||||||
|
import android.preference.Preference.OnPreferenceChangeListener;
|
||||||
|
import android.preference.Preference.OnPreferenceClickListener;
|
||||||
|
import android.util.Log;
|
||||||
|
import android.view.KeyEvent;
|
||||||
|
import android.view.inputmethod.EditorInfo;
|
||||||
|
import android.widget.TextView;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An activity for accessing map settings.
|
||||||
|
*
|
||||||
|
* @author Jimmy Shih
|
||||||
|
*/
|
||||||
|
public class MapSettingsActivity extends AbstractSettingsActivity {
|
||||||
|
|
||||||
|
private static final String TAG = MapSettingsActivity.class.getSimpleName();
|
||||||
|
|
||||||
|
private EditTextPreference slowEditTextPreference;
|
||||||
|
private EditTextPreference mediumEditTextPreference;
|
||||||
|
private EditTextPreference percentageEditTextPreference;
|
||||||
|
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
|
@Override
|
||||||
|
protected void onCreate(Bundle bundle) {
|
||||||
|
super.onCreate(bundle);
|
||||||
|
addPreferencesFromResource(R.xml.map_settings);
|
||||||
|
|
||||||
|
ListPreference trackColorModeListPreference = (ListPreference) findPreference(
|
||||||
|
getString(R.string.track_color_mode_key));
|
||||||
|
trackColorModeListPreference.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
|
||||||
|
@Override
|
||||||
|
public boolean onPreferenceChange(Preference preference, Object newValue) {
|
||||||
|
updateUiByTrackColorMode((String) newValue);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
slowEditTextPreference = (EditTextPreference) findPreference(
|
||||||
|
getString(R.string.settings_map_slow_display_key));
|
||||||
|
configureSpeedEditTextPreference(R.string.track_color_mode_slow_key);
|
||||||
|
|
||||||
|
mediumEditTextPreference = (EditTextPreference) findPreference(
|
||||||
|
getString(R.string.settings_map_medium_display_key));
|
||||||
|
configureSpeedEditTextPreference(R.string.track_color_mode_medium_key);
|
||||||
|
|
||||||
|
percentageEditTextPreference = (EditTextPreference) findPreference(
|
||||||
|
getString(R.string.settings_map_percentage_display_key));
|
||||||
|
configurePercentageEditTextPreference();
|
||||||
|
updatePercentageSummary();
|
||||||
|
|
||||||
|
configureImeActionDone(slowEditTextPreference);
|
||||||
|
configureImeActionDone(mediumEditTextPreference);
|
||||||
|
configureImeActionDone(percentageEditTextPreference);
|
||||||
|
|
||||||
|
updateUiByTrackColorMode(trackColorModeListPreference.getValue());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Configures the speed edit text preference.
|
||||||
|
*
|
||||||
|
* @param keyId the key id
|
||||||
|
*/
|
||||||
|
private void configureSpeedEditTextPreference(final int keyId) {
|
||||||
|
final EditTextPreference editTextPreference = keyId == R.string.track_color_mode_slow_key ? slowEditTextPreference
|
||||||
|
: mediumEditTextPreference;
|
||||||
|
editTextPreference.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
|
||||||
|
@Override
|
||||||
|
public boolean onPreferenceChange(Preference preference, Object newValue) {
|
||||||
|
storeSpeedValue(keyId, (String) newValue);
|
||||||
|
updateSpeedSummary(keyId);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
editTextPreference.setOnPreferenceClickListener(new OnPreferenceClickListener() {
|
||||||
|
@Override
|
||||||
|
public boolean onPreferenceClick(Preference preference) {
|
||||||
|
int value = getSpeedDisplayValue(keyId);
|
||||||
|
((EditTextPreference) preference).getEditText().setText(String.valueOf(value));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Configures the percentage edit text preference.
|
||||||
|
*/
|
||||||
|
private void configurePercentageEditTextPreference() {
|
||||||
|
percentageEditTextPreference.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
|
||||||
|
@Override
|
||||||
|
public boolean onPreferenceChange(Preference preference, Object newValue) {
|
||||||
|
String displayValue = (String) newValue;
|
||||||
|
int value;
|
||||||
|
try {
|
||||||
|
value = Integer.parseInt(displayValue);
|
||||||
|
} catch (NumberFormatException e) {
|
||||||
|
Log.e(TAG, "invalid value " + displayValue);
|
||||||
|
value = PreferencesUtils.TRACK_COLOR_MODE_PERCENTAGE_DEFAULT;
|
||||||
|
}
|
||||||
|
if (value < 0) {
|
||||||
|
value = PreferencesUtils.TRACK_COLOR_MODE_PERCENTAGE_DEFAULT;
|
||||||
|
}
|
||||||
|
PreferencesUtils.setInt(
|
||||||
|
MapSettingsActivity.this, R.string.track_color_mode_percentage_key, value);
|
||||||
|
updatePercentageSummary();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
percentageEditTextPreference.setOnPreferenceClickListener(new OnPreferenceClickListener() {
|
||||||
|
@Override
|
||||||
|
public boolean onPreferenceClick(Preference preference) {
|
||||||
|
int value = PreferencesUtils.getInt(
|
||||||
|
MapSettingsActivity.this, R.string.track_color_mode_percentage_key,
|
||||||
|
PreferencesUtils.TRACK_COLOR_MODE_PERCENTAGE_DEFAULT);
|
||||||
|
((EditTextPreference) preference).getEditText().setText(String.valueOf(value));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Configures the IME action done.
|
||||||
|
*
|
||||||
|
* @param editTextPreference the edit text preference
|
||||||
|
*/
|
||||||
|
private void configureImeActionDone(final EditTextPreference editTextPreference) {
|
||||||
|
editTextPreference.getEditText()
|
||||||
|
.setOnEditorActionListener(new TextView.OnEditorActionListener() {
|
||||||
|
@Override
|
||||||
|
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
|
||||||
|
if (actionId == EditorInfo.IME_ACTION_DONE) {
|
||||||
|
Dialog dialog = editTextPreference.getDialog();
|
||||||
|
editTextPreference.onClick(dialog, Dialog.BUTTON_POSITIVE);
|
||||||
|
dialog.dismiss();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onResume() {
|
||||||
|
super.onResume();
|
||||||
|
updateSpeedSummary(R.string.track_color_mode_slow_key);
|
||||||
|
updateSpeedSummary(R.string.track_color_mode_medium_key);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Updates the UI by the track color mode.
|
||||||
|
*
|
||||||
|
* @param trackColorMode the track color mode
|
||||||
|
*/
|
||||||
|
private void updateUiByTrackColorMode(String trackColorMode) {
|
||||||
|
boolean isFixedValue = trackColorMode.equals(
|
||||||
|
getString(R.string.settings_map_track_color_mode_fixed_value));
|
||||||
|
boolean isDynamicValue = trackColorMode.equals(
|
||||||
|
getString(R.string.settings_map_track_color_mode_dynamic_value));
|
||||||
|
slowEditTextPreference.setEnabled(isFixedValue);
|
||||||
|
mediumEditTextPreference.setEnabled(isFixedValue);
|
||||||
|
percentageEditTextPreference.setEnabled(isDynamicValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Stores the speed value, always in metric units.
|
||||||
|
*
|
||||||
|
* @param keyId the key id
|
||||||
|
* @param displayValue the display value
|
||||||
|
*/
|
||||||
|
private void storeSpeedValue(int keyId, String displayValue) {
|
||||||
|
int maxValue;
|
||||||
|
int minValue;
|
||||||
|
int defaultValue;
|
||||||
|
if (keyId == R.string.track_color_mode_slow_key) {
|
||||||
|
minValue = 0;
|
||||||
|
maxValue = PreferencesUtils.getInt(this, R.string.track_color_mode_medium_key,
|
||||||
|
PreferencesUtils.TRACK_COLOR_MODE_MEDIUM_DEFAULT);
|
||||||
|
defaultValue = PreferencesUtils.TRACK_COLOR_MODE_SLOW_DEFAULT;
|
||||||
|
} else {
|
||||||
|
minValue = PreferencesUtils.getInt(
|
||||||
|
this, R.string.track_color_mode_slow_key, PreferencesUtils.TRACK_COLOR_MODE_SLOW_DEFAULT);
|
||||||
|
maxValue = Integer.MAX_VALUE;
|
||||||
|
defaultValue = PreferencesUtils.TRACK_COLOR_MODE_MEDIUM_DEFAULT;
|
||||||
|
}
|
||||||
|
int value;
|
||||||
|
try {
|
||||||
|
value = Integer.parseInt(displayValue);
|
||||||
|
if (!PreferencesUtils.getBoolean(
|
||||||
|
this, R.string.metric_units_key, PreferencesUtils.METRIC_UNITS_DEFAULT)) {
|
||||||
|
value = (int) (value * UnitConversions.MI_TO_KM);
|
||||||
|
}
|
||||||
|
} catch (NumberFormatException e) {
|
||||||
|
Log.e(TAG, "invalid value " + displayValue);
|
||||||
|
value = defaultValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (value > maxValue) {
|
||||||
|
value = maxValue;
|
||||||
|
}
|
||||||
|
if (value < minValue) {
|
||||||
|
value = minValue;
|
||||||
|
}
|
||||||
|
PreferencesUtils.setInt(this, keyId, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the speed display value, in metric or imperial depending on the preferred
|
||||||
|
* units.
|
||||||
|
*
|
||||||
|
* @param keyId the key id
|
||||||
|
*/
|
||||||
|
private int getSpeedDisplayValue(int keyId) {
|
||||||
|
int defaultValue = keyId == R.string.track_color_mode_slow_key ? PreferencesUtils.TRACK_COLOR_MODE_SLOW_DEFAULT
|
||||||
|
: PreferencesUtils.TRACK_COLOR_MODE_MEDIUM_DEFAULT;
|
||||||
|
int value = PreferencesUtils.getInt(this, keyId, defaultValue);
|
||||||
|
if (!PreferencesUtils.getBoolean(
|
||||||
|
this, R.string.metric_units_key, PreferencesUtils.METRIC_UNITS_DEFAULT)) {
|
||||||
|
value = (int) (value * UnitConversions.KM_TO_MI);
|
||||||
|
}
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Updates the speed summary.
|
||||||
|
*
|
||||||
|
* @param keyId the key id
|
||||||
|
*/
|
||||||
|
private void updateSpeedSummary(int keyId) {
|
||||||
|
EditTextPreference editTextPreference = keyId == R.string.track_color_mode_slow_key ? slowEditTextPreference
|
||||||
|
: mediumEditTextPreference;
|
||||||
|
boolean metric = PreferencesUtils.getBoolean(
|
||||||
|
this, R.string.metric_units_key, PreferencesUtils.METRIC_UNITS_DEFAULT);
|
||||||
|
int displayValue = getSpeedDisplayValue(keyId);
|
||||||
|
editTextPreference.setSummary(getString(metric ? R.string.value_integer_kilometer_hour
|
||||||
|
: R.string.value_integer_mile_hour, displayValue));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Updates the percentage summary.
|
||||||
|
*/
|
||||||
|
private void updatePercentageSummary() {
|
||||||
|
int value = PreferencesUtils.getInt(
|
||||||
|
MapSettingsActivity.this, R.string.track_color_mode_percentage_key,
|
||||||
|
PreferencesUtils.TRACK_COLOR_MODE_PERCENTAGE_DEFAULT);
|
||||||
|
percentageEditTextPreference.setSummary(getString(R.string.settings_map_percentage_summary) + "\n"
|
||||||
|
+ getString(R.string.value_integer_percent, value));
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,243 @@
|
|||||||
|
/*
|
||||||
|
* 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.settings;
|
||||||
|
|
||||||
|
import com.google.android.apps.mytracks.util.PreferencesUtils;
|
||||||
|
import com.google.android.apps.mytracks.util.UnitConversions;
|
||||||
|
import com.google.android.maps.mytracks.R;
|
||||||
|
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.preference.ListPreference;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An activity for accessing recording settings.
|
||||||
|
*
|
||||||
|
* @author Jimmy Shih
|
||||||
|
*/
|
||||||
|
public class RecordingSettingsActivity extends AbstractSettingsActivity {
|
||||||
|
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
|
@Override
|
||||||
|
protected void onCreate(Bundle bundle) {
|
||||||
|
super.onCreate(bundle);
|
||||||
|
addPreferencesFromResource(R.xml.recording_settings);
|
||||||
|
|
||||||
|
boolean metricUnits = PreferencesUtils.getBoolean(
|
||||||
|
this, R.string.metric_units_key, PreferencesUtils.METRIC_UNITS_DEFAULT);
|
||||||
|
|
||||||
|
ListPreference announcementFrequencyListPreference = (ListPreference) findPreference(
|
||||||
|
getString(R.string.announcement_frequency_key));
|
||||||
|
announcementFrequencyListPreference.setEntries(getPeriodicTaskDisplayOptions(metricUnits));
|
||||||
|
|
||||||
|
ListPreference splitFrequencyListPreference = (ListPreference) findPreference(
|
||||||
|
getString(R.string.split_frequency_key));
|
||||||
|
splitFrequencyListPreference.setEntries(getPeriodicTaskDisplayOptions(metricUnits));
|
||||||
|
|
||||||
|
ListPreference minRecordingIntervalListPreference = (ListPreference) findPreference(
|
||||||
|
getString(R.string.min_recording_interval_key));
|
||||||
|
minRecordingIntervalListPreference.setEntries(getMinRecordingIntervalDisplayOptions());
|
||||||
|
|
||||||
|
ListPreference minRecordingDistanceListPreference = (ListPreference) findPreference(
|
||||||
|
getString(R.string.min_recording_distance_key));
|
||||||
|
minRecordingDistanceListPreference.setEntries(
|
||||||
|
getMinRecordingDistanceDisplayOptions(metricUnits));
|
||||||
|
|
||||||
|
ListPreference maxRecordingDistanceListPreference = (ListPreference) findPreference(
|
||||||
|
getString(R.string.max_recording_distance_key));
|
||||||
|
maxRecordingDistanceListPreference.setEntries(
|
||||||
|
getMaxRecordingDistanceDisplayOptions(metricUnits));
|
||||||
|
|
||||||
|
ListPreference minRequiredAccuracyListPreference = (ListPreference) findPreference(
|
||||||
|
getString(R.string.min_required_accuracy_key));
|
||||||
|
minRequiredAccuracyListPreference.setEntries(getMinRequiredAccuracyDisplayOptions(metricUnits));
|
||||||
|
|
||||||
|
ListPreference autoResumeTrackTimeoutListPreference = (ListPreference) findPreference(
|
||||||
|
getString(R.string.auto_resume_track_timeout_key));
|
||||||
|
autoResumeTrackTimeoutListPreference.setEntries(getAutoResumeTrackTimeoutDisplayOptions());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the periodic task display options.
|
||||||
|
*
|
||||||
|
* @param metricUnits true to display metric units
|
||||||
|
*/
|
||||||
|
private String[] getPeriodicTaskDisplayOptions(boolean metricUnits) {
|
||||||
|
String[] values = getResources().getStringArray(R.array.periodic_task_values);
|
||||||
|
String[] options = new String[values.length];
|
||||||
|
for (int i = 0; i < values.length; i++) {
|
||||||
|
int value = Integer.parseInt(values[i]);
|
||||||
|
if (value == PreferencesUtils.PERIODIC_TASK_OFF) {
|
||||||
|
options[i] = getString(R.string.value_off);
|
||||||
|
} else if (value < 0) {
|
||||||
|
options[i] = getString(metricUnits ? R.string.value_integer_kilometer
|
||||||
|
: R.string.value_integer_mile, Math.abs(value));
|
||||||
|
} else {
|
||||||
|
options[i] = getString(R.string.value_integer_minute, value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return options;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the min recording interval display options.
|
||||||
|
*/
|
||||||
|
private String[] getMinRecordingIntervalDisplayOptions() {
|
||||||
|
String[] values = getResources().getStringArray(R.array.min_recording_interval_values);
|
||||||
|
String[] options = new String[values.length];
|
||||||
|
for (int i = 0; i < values.length; i++) {
|
||||||
|
int value = Integer.parseInt(values[i]);
|
||||||
|
switch (value) {
|
||||||
|
case PreferencesUtils.MIN_RECORDING_INTERVAL_ADAPT_BATTERY_LIFE:
|
||||||
|
options[i] = getString(R.string.value_adapt_battery_life);
|
||||||
|
break;
|
||||||
|
case PreferencesUtils.MIN_RECORDING_INTERVAL_ADAPT_ACCURACY:
|
||||||
|
options[i] = getString(R.string.value_adapt_accuracy);
|
||||||
|
break;
|
||||||
|
case PreferencesUtils.MIN_RECORDING_INTERVAL_DEFAULT:
|
||||||
|
options[i] = getString(R.string.value_smallest_recommended);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
options[i] = value < 60 ? getString(R.string.value_integer_second, value)
|
||||||
|
: getString(R.string.value_integer_minute, value / 60);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return options;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the min recording distance display options.
|
||||||
|
*
|
||||||
|
* @param metricUnits true to display metric units
|
||||||
|
*/
|
||||||
|
private String[] getMinRecordingDistanceDisplayOptions(boolean metricUnits) {
|
||||||
|
String[] values = getResources().getStringArray(R.array.min_recording_distance_values);
|
||||||
|
String[] options = new String[values.length];
|
||||||
|
for (int i = 0; i < values.length; i++) {
|
||||||
|
int value = Integer.parseInt(values[i]);
|
||||||
|
if (metricUnits) {
|
||||||
|
options[i] = getString(value == PreferencesUtils.MIN_RECORDING_DISTANCE_DEFAULT
|
||||||
|
? R.string.value_integer_meter_recommended
|
||||||
|
: R.string.value_integer_meter, value);
|
||||||
|
} else {
|
||||||
|
int feet = (int) (value * UnitConversions.M_TO_FT);
|
||||||
|
options[i] = getString(value == PreferencesUtils.MIN_RECORDING_DISTANCE_DEFAULT
|
||||||
|
? R.string.value_integer_feet_recommended
|
||||||
|
: R.string.value_integer_feet, feet);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return options;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the max recording distance display options.
|
||||||
|
*
|
||||||
|
* @param metricUnits true to display metric units
|
||||||
|
*/
|
||||||
|
private String[] getMaxRecordingDistanceDisplayOptions(boolean metricUnits) {
|
||||||
|
String[] values = getResources().getStringArray(R.array.max_recording_distance_values);
|
||||||
|
String[] options = new String[values.length];
|
||||||
|
for (int i = 0; i < values.length; i++) {
|
||||||
|
int value = Integer.parseInt(values[i]);
|
||||||
|
if (metricUnits) {
|
||||||
|
options[i] = getString(value == PreferencesUtils.MAX_RECORDING_DISTANCE_DEFAULT
|
||||||
|
? R.string.value_integer_meter_recommended
|
||||||
|
: R.string.value_integer_meter, value);
|
||||||
|
} else {
|
||||||
|
int feet = (int) (value * UnitConversions.M_TO_FT);
|
||||||
|
if (feet < 2000) {
|
||||||
|
options[i] = getString(value == PreferencesUtils.MAX_RECORDING_DISTANCE_DEFAULT
|
||||||
|
? R.string.value_integer_feet_recommended
|
||||||
|
: R.string.value_integer_feet, feet);
|
||||||
|
} else {
|
||||||
|
double mile = feet * UnitConversions.FT_TO_MI;
|
||||||
|
options[i] = getString(R.string.value_float_mile, mile);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return options;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the min required accuracy display options.
|
||||||
|
*
|
||||||
|
* @param metricUnits true to display metric units
|
||||||
|
*/
|
||||||
|
private String[] getMinRequiredAccuracyDisplayOptions(boolean metricUnits) {
|
||||||
|
String[] values = getResources().getStringArray(R.array.min_required_accuracy_values);
|
||||||
|
String[] options = new String[values.length];
|
||||||
|
for (int i = 0; i < values.length; i++) {
|
||||||
|
int value = Integer.parseInt(values[i]);
|
||||||
|
if (metricUnits) {
|
||||||
|
switch (value) {
|
||||||
|
case PreferencesUtils.MIN_REQUIRED_ACCURACY_DEFAULT:
|
||||||
|
options[i] = getString(R.string.value_integer_meter_recommended, value);
|
||||||
|
break;
|
||||||
|
case PreferencesUtils.MIN_REQUIRED_ACCURACY_EXCELLENT:
|
||||||
|
options[i] = getString(R.string.value_integer_meter_excellent_gps, value);
|
||||||
|
break;
|
||||||
|
case PreferencesUtils.MIN_REQUIRED_ACCURACY_POOR:
|
||||||
|
options[i] = getString(R.string.value_integer_meter_poor_gps, value);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
options[i] = getString(R.string.value_integer_meter, value);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
int feet = (int) (value * UnitConversions.M_TO_FT);
|
||||||
|
if (feet < 2000) {
|
||||||
|
switch (value) {
|
||||||
|
case PreferencesUtils.MIN_REQUIRED_ACCURACY_DEFAULT:
|
||||||
|
options[i] = getString(R.string.value_integer_feet_recommended, feet);
|
||||||
|
break;
|
||||||
|
case PreferencesUtils.MIN_REQUIRED_ACCURACY_EXCELLENT:
|
||||||
|
options[i] = getString(R.string.value_integer_feet_excellent_gps, feet);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
options[i] = getString(R.string.value_integer_feet, feet);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
double mile = feet * UnitConversions.FT_TO_MI;
|
||||||
|
options[i] = getString(value == PreferencesUtils.MIN_REQUIRED_ACCURACY_POOR
|
||||||
|
? R.string.value_float_mile_poor_gps
|
||||||
|
: R.string.value_float_mile, mile);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return options;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the auto resume track timeout display options.
|
||||||
|
*/
|
||||||
|
private String[] getAutoResumeTrackTimeoutDisplayOptions() {
|
||||||
|
String[] values = getResources().getStringArray(R.array.auto_resume_track_timeout_values);
|
||||||
|
String[] options = new String[values.length];
|
||||||
|
for (int i = 0; i < values.length; i++) {
|
||||||
|
int value = Integer.parseInt(values[i]);
|
||||||
|
switch (value) {
|
||||||
|
case PreferencesUtils.AUTO_RESUME_TRACK_TIMEOUT_NEVER:
|
||||||
|
options[i] = getString(R.string.value_never);
|
||||||
|
break;
|
||||||
|
case PreferencesUtils.AUTO_RESUME_TRACK_TIMEOUT_ALWAYS:
|
||||||
|
options[i] = getString(R.string.value_always);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
options[i] = getString(R.string.value_integer_minute, value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return options;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,141 @@
|
|||||||
|
/*
|
||||||
|
* 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.settings;
|
||||||
|
|
||||||
|
import com.google.android.apps.mytracks.services.sensors.ant.AntUtils;
|
||||||
|
import com.google.android.apps.mytracks.util.BluetoothDeviceUtils;
|
||||||
|
import com.google.android.maps.mytracks.R;
|
||||||
|
|
||||||
|
import android.bluetooth.BluetoothAdapter;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.preference.ListPreference;
|
||||||
|
import android.preference.Preference;
|
||||||
|
import android.preference.Preference.OnPreferenceChangeListener;
|
||||||
|
import android.preference.Preference.OnPreferenceClickListener;
|
||||||
|
import android.preference.PreferenceScreen;
|
||||||
|
import android.provider.Settings;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An activity for accessing sensor settings.
|
||||||
|
*
|
||||||
|
* @author Jimmy Shih
|
||||||
|
*/
|
||||||
|
public class SensorSettingsActivity extends AbstractSettingsActivity {
|
||||||
|
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
|
@Override
|
||||||
|
protected void onCreate(Bundle bundle) {
|
||||||
|
super.onCreate(bundle);
|
||||||
|
addPreferencesFromResource(R.xml.sensor_settings);
|
||||||
|
|
||||||
|
ListPreference sensorTypeListPreference = (ListPreference) findPreference(
|
||||||
|
getString(R.string.sensor_type_key));
|
||||||
|
List<String> sensorTypeEntries = Arrays.asList(getResources().getStringArray(
|
||||||
|
AntUtils.hasAntSupport(this) ? R.array.sensor_type_all_options
|
||||||
|
: R.array.sensor_type_bluetooth_options));
|
||||||
|
List<String> sensorTypeEntryValues = Arrays.asList(getResources().getStringArray(
|
||||||
|
AntUtils.hasAntSupport(this) ? R.array.sensor_type_all_values
|
||||||
|
: R.array.sensor_type_bluetooth_values));
|
||||||
|
sensorTypeListPreference.setEntries(sensorTypeEntries.toArray(
|
||||||
|
new CharSequence[sensorTypeEntries.size()]));
|
||||||
|
sensorTypeListPreference.setEntryValues(
|
||||||
|
sensorTypeEntryValues.toArray(new CharSequence[sensorTypeEntryValues.size()]));
|
||||||
|
sensorTypeListPreference.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
|
||||||
|
@Override
|
||||||
|
public boolean onPreferenceChange(Preference preference, Object newValue) {
|
||||||
|
updateUiBySensorType((String) newValue);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
updateUiBySensorType(sensorTypeListPreference.getValue());
|
||||||
|
|
||||||
|
findPreference(getString(R.string.settings_sensor_bluetooth_pairing_key))
|
||||||
|
.setOnPreferenceClickListener(new OnPreferenceClickListener() {
|
||||||
|
public boolean onPreferenceClick(Preference preference) {
|
||||||
|
Intent settingsIntent = new Intent(Settings.ACTION_BLUETOOTH_SETTINGS);
|
||||||
|
startActivity(settingsIntent);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!AntUtils.hasAntSupport(this)) {
|
||||||
|
PreferenceScreen rootPreferenceScreen = (PreferenceScreen) findPreference(
|
||||||
|
getString(R.string.settings_sensor_root_key));
|
||||||
|
rootPreferenceScreen.removePreference(
|
||||||
|
findPreference(getString(R.string.settings_sensor_ant_key)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Updates the UI based on the sensor type.
|
||||||
|
*
|
||||||
|
* @param sensorType the sensor type
|
||||||
|
*/
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
|
private void updateUiBySensorType(String sensorType) {
|
||||||
|
boolean isBluetooth = getString(R.string.sensor_type_value_polar).equals(sensorType)
|
||||||
|
|| getString(R.string.sensor_type_value_zephyr).equals(sensorType);
|
||||||
|
findPreference(getString(R.string.settings_sensor_bluetooth_key)).setEnabled(isBluetooth);
|
||||||
|
|
||||||
|
Preference antHeartRateSensorId = findPreference(
|
||||||
|
getString(R.string.ant_heart_rate_sensor_id_key));
|
||||||
|
if (antHeartRateSensorId != null) {
|
||||||
|
antHeartRateSensorId.setEnabled(getString(R.string.sensor_type_value_ant).equals(sensorType));
|
||||||
|
}
|
||||||
|
|
||||||
|
Preference antSrmBridgetSensorId = findPreference(
|
||||||
|
getString(R.string.ant_srm_bridge_sensor_id_key));
|
||||||
|
if (antSrmBridgetSensorId != null) {
|
||||||
|
antSrmBridgetSensorId.setEnabled(
|
||||||
|
getString(R.string.sensor_type_value_srm_ant_bridge).equals(sensorType));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onResume() {
|
||||||
|
super.onResume();
|
||||||
|
updateBluetoothSensorListPreference();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Updates the bluetooth sensor list preference.
|
||||||
|
*/
|
||||||
|
private void updateBluetoothSensorListPreference() {
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
|
ListPreference bluetoothSensorListPreference = (ListPreference) findPreference(
|
||||||
|
getString(R.string.bluetooth_sensor_key));
|
||||||
|
List<String> entries = new ArrayList<String>();
|
||||||
|
List<String> entryValues = new ArrayList<String>();
|
||||||
|
BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
|
||||||
|
|
||||||
|
if (bluetoothAdapter != null) {
|
||||||
|
BluetoothDeviceUtils.populateDeviceLists(bluetoothAdapter, entries, entryValues);
|
||||||
|
}
|
||||||
|
bluetoothSensorListPreference.setEntries(entries.toArray(new CharSequence[entries.size()]));
|
||||||
|
bluetoothSensorListPreference.setEntryValues(entryValues.toArray(
|
||||||
|
new CharSequence[entryValues.size()]));
|
||||||
|
if (entries.size() == 1) {
|
||||||
|
bluetoothSensorListPreference.setValueIndex(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,189 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2008 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.settings;
|
||||||
|
|
||||||
|
import com.google.android.apps.mytracks.Constants;
|
||||||
|
import com.google.android.apps.mytracks.util.DialogUtils;
|
||||||
|
import com.google.android.apps.mytracks.util.IntentUtils;
|
||||||
|
import com.google.android.apps.mytracks.util.PreferencesUtils;
|
||||||
|
import com.google.android.maps.mytracks.R;
|
||||||
|
|
||||||
|
import android.app.Dialog;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.DialogInterface;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.content.SharedPreferences;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.preference.Preference;
|
||||||
|
import android.preference.Preference.OnPreferenceClickListener;
|
||||||
|
import android.util.Log;
|
||||||
|
import android.widget.Toast;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An activity for accessing settings.
|
||||||
|
*
|
||||||
|
* @author Leif Hendrik Wilden
|
||||||
|
* @author Rodrigo Damazio
|
||||||
|
*/
|
||||||
|
public class SettingsActivity extends AbstractSettingsActivity {
|
||||||
|
|
||||||
|
private static final String TAG = SettingsActivity.class.getSimpleName();
|
||||||
|
private static final int DIALOG_CONFIRM_RESET_ID = 0;
|
||||||
|
|
||||||
|
private Preference resetPreference;
|
||||||
|
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
|
@Override
|
||||||
|
protected void onCreate(Bundle bundle) {
|
||||||
|
super.onCreate(bundle);
|
||||||
|
addPreferencesFromResource(R.xml.settings);
|
||||||
|
|
||||||
|
Preference mapPreference = findPreference(getString(R.string.settings_map_key));
|
||||||
|
mapPreference.setOnPreferenceClickListener(new OnPreferenceClickListener() {
|
||||||
|
@Override
|
||||||
|
public boolean onPreferenceClick(Preference preference) {
|
||||||
|
Intent intent = IntentUtils.newIntent(SettingsActivity.this, MapSettingsActivity.class);
|
||||||
|
startActivity(intent);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
Preference chartPreference = findPreference(getString(R.string.settings_chart_key));
|
||||||
|
chartPreference.setOnPreferenceClickListener(new OnPreferenceClickListener() {
|
||||||
|
@Override
|
||||||
|
public boolean onPreferenceClick(Preference preference) {
|
||||||
|
Intent intent = IntentUtils.newIntent(SettingsActivity.this, ChartSettingsActivity.class);
|
||||||
|
startActivity(intent);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
Preference statsPreference = findPreference(getString(R.string.settings_stats_key));
|
||||||
|
statsPreference.setOnPreferenceClickListener(new OnPreferenceClickListener() {
|
||||||
|
@Override
|
||||||
|
public boolean onPreferenceClick(Preference preference) {
|
||||||
|
Intent intent = IntentUtils.newIntent(SettingsActivity.this, StatsSettingsActivity.class);
|
||||||
|
startActivity(intent);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
Preference recordingPreference = findPreference(getString(R.string.settings_recording_key));
|
||||||
|
recordingPreference.setOnPreferenceClickListener(new OnPreferenceClickListener() {
|
||||||
|
@Override
|
||||||
|
public boolean onPreferenceClick(Preference preference) {
|
||||||
|
Intent intent = IntentUtils.newIntent(
|
||||||
|
SettingsActivity.this, RecordingSettingsActivity.class);
|
||||||
|
startActivity(intent);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
Preference sharingPreference = findPreference(getString(R.string.settings_sharing_key));
|
||||||
|
sharingPreference.setOnPreferenceClickListener(new OnPreferenceClickListener() {
|
||||||
|
@Override
|
||||||
|
public boolean onPreferenceClick(Preference preference) {
|
||||||
|
Intent intent = IntentUtils.newIntent(SettingsActivity.this, SharingSettingsActivity.class);
|
||||||
|
startActivity(intent);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
Preference sensorPreference = findPreference(getString(R.string.settings_sensor_key));
|
||||||
|
sensorPreference.setOnPreferenceClickListener(new OnPreferenceClickListener() {
|
||||||
|
@Override
|
||||||
|
public boolean onPreferenceClick(Preference preference) {
|
||||||
|
Intent intent = IntentUtils.newIntent(SettingsActivity.this, SensorSettingsActivity.class);
|
||||||
|
startActivity(intent);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
Preference backupPreference = findPreference(getString(R.string.settings_backup_key));
|
||||||
|
backupPreference.setOnPreferenceClickListener(new OnPreferenceClickListener() {
|
||||||
|
@Override
|
||||||
|
public boolean onPreferenceClick(Preference preference) {
|
||||||
|
Intent intent = IntentUtils.newIntent(SettingsActivity.this, BackupSettingsActivity.class);
|
||||||
|
startActivity(intent);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
resetPreference = findPreference(getString(R.string.settings_reset_key));
|
||||||
|
resetPreference.setOnPreferenceClickListener(new OnPreferenceClickListener() {
|
||||||
|
@Override
|
||||||
|
public boolean onPreferenceClick(Preference arg0) {
|
||||||
|
showDialog(DIALOG_CONFIRM_RESET_ID);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onResume() {
|
||||||
|
super.onResume();
|
||||||
|
boolean isRecording = PreferencesUtils.getLong(this, R.string.recording_track_id_key)
|
||||||
|
!= PreferencesUtils.RECORDING_TRACK_ID_DEFAULT;
|
||||||
|
resetPreference.setEnabled(!isRecording);
|
||||||
|
resetPreference.setSummary(isRecording ? R.string.settings_not_while_recording
|
||||||
|
: R.string.settings_reset_summary);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Dialog onCreateDialog(int id) {
|
||||||
|
if (id != DIALOG_CONFIRM_RESET_ID) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return DialogUtils.createConfirmationDialog(
|
||||||
|
this, R.string.settings_reset_confirm_message, new DialogInterface.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(DialogInterface dialog, int button) {
|
||||||
|
onResetPreferencesConfirmed();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Callback when the user confirms resetting all settings.
|
||||||
|
*/
|
||||||
|
private void onResetPreferencesConfirmed() {
|
||||||
|
// Change preferences in a separate thread
|
||||||
|
new Thread() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
Log.i(TAG, "Resetting all settings");
|
||||||
|
SharedPreferences sharedPreferences = getSharedPreferences(
|
||||||
|
Constants.SETTINGS_NAME, Context.MODE_PRIVATE);
|
||||||
|
// Actually wipe preferences and save synchronously
|
||||||
|
sharedPreferences.edit().clear().commit();
|
||||||
|
|
||||||
|
// Give UI feedback in the UI thread
|
||||||
|
runOnUiThread(new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
Toast.makeText(SettingsActivity.this, R.string.settings_reset_done, Toast.LENGTH_SHORT)
|
||||||
|
.show();
|
||||||
|
// Restart the settings activity so all changes are loaded
|
||||||
|
Intent intent = getIntent()
|
||||||
|
.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||||
|
startActivity(intent);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}.start();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,75 @@
|
|||||||
|
/*
|
||||||
|
* 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.settings;
|
||||||
|
|
||||||
|
import com.google.android.apps.mytracks.util.DialogUtils;
|
||||||
|
import com.google.android.maps.mytracks.R;
|
||||||
|
|
||||||
|
import android.app.Dialog;
|
||||||
|
import android.content.DialogInterface;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.preference.CheckBoxPreference;
|
||||||
|
import android.preference.Preference;
|
||||||
|
import android.preference.Preference.OnPreferenceChangeListener;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An activity for accessing the sharing settings.
|
||||||
|
*
|
||||||
|
* @author Jimmy Shih
|
||||||
|
*/
|
||||||
|
public class SharingSettingsActivity extends AbstractSettingsActivity {
|
||||||
|
|
||||||
|
private static final int DIALOG_CONFIRM_ALLOW_ACCESS_ID = 0;
|
||||||
|
|
||||||
|
private CheckBoxPreference allowAccessCheckBoxPreference;
|
||||||
|
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
|
@Override
|
||||||
|
protected void onCreate(Bundle bundle) {
|
||||||
|
super.onCreate(bundle);
|
||||||
|
addPreferencesFromResource(R.xml.sharing_settings);
|
||||||
|
|
||||||
|
allowAccessCheckBoxPreference = (CheckBoxPreference) findPreference(
|
||||||
|
getString(R.string.allow_access_key));
|
||||||
|
allowAccessCheckBoxPreference.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
|
||||||
|
@Override
|
||||||
|
public boolean onPreferenceChange(Preference preference, Object newValue) {
|
||||||
|
if ((Boolean) newValue) {
|
||||||
|
showDialog(DIALOG_CONFIRM_ALLOW_ACCESS_ID);
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Dialog onCreateDialog(int id) {
|
||||||
|
if (id != DIALOG_CONFIRM_ALLOW_ACCESS_ID) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return DialogUtils.createConfirmationDialog(this,
|
||||||
|
R.string.settings_sharing_allow_access_confirm_message,
|
||||||
|
new DialogInterface.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(DialogInterface dialog, int button) {
|
||||||
|
allowAccessCheckBoxPreference.setChecked(true);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,81 @@
|
|||||||
|
/*
|
||||||
|
* 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.settings;
|
||||||
|
|
||||||
|
import com.google.android.apps.mytracks.Constants;
|
||||||
|
import com.google.android.apps.mytracks.util.PreferencesUtils;
|
||||||
|
import com.google.android.maps.mytracks.R;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.SharedPreferences;
|
||||||
|
import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.preference.CheckBoxPreference;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An activity for accessing stats settings.
|
||||||
|
*
|
||||||
|
* @author Jimmy Shih
|
||||||
|
*/
|
||||||
|
public class StatsSettingsActivity extends AbstractSettingsActivity {
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Note that sharedPreferenceChangeListenr cannot be an anonymous inner class.
|
||||||
|
* Anonymous inner class will get garbage collected.
|
||||||
|
*/
|
||||||
|
private final OnSharedPreferenceChangeListener
|
||||||
|
sharedPreferenceChangeListener = new OnSharedPreferenceChangeListener() {
|
||||||
|
@Override
|
||||||
|
public void onSharedPreferenceChanged(SharedPreferences preferences, String key) {
|
||||||
|
// Note that key can be null
|
||||||
|
if (PreferencesUtils.getKey(StatsSettingsActivity.this, R.string.metric_units_key)
|
||||||
|
.equals(key)) {
|
||||||
|
updateUi();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
|
@Override
|
||||||
|
protected void onCreate(Bundle bundle) {
|
||||||
|
super.onCreate(bundle);
|
||||||
|
addPreferencesFromResource(R.xml.stats_settings);
|
||||||
|
|
||||||
|
getSharedPreferences(Constants.SETTINGS_NAME, Context.MODE_PRIVATE)
|
||||||
|
.registerOnSharedPreferenceChangeListener(sharedPreferenceChangeListener);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onResume() {
|
||||||
|
super.onResume();
|
||||||
|
updateUi();
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
|
private void updateUi() {
|
||||||
|
CheckBoxPreference reportSpeedCheckBoxPreference = (CheckBoxPreference) findPreference(
|
||||||
|
getString(R.string.report_speed_key));
|
||||||
|
boolean metric = PreferencesUtils.getBoolean(
|
||||||
|
this, R.string.metric_units_key, PreferencesUtils.METRIC_UNITS_DEFAULT);
|
||||||
|
reportSpeedCheckBoxPreference.setSummaryOn(
|
||||||
|
metric ? getString(R.string.settings_stats_rate_speed_metric)
|
||||||
|
: getString(R.string.settings_stats_rate_speed_imperial));
|
||||||
|
reportSpeedCheckBoxPreference.setSummaryOff(
|
||||||
|
metric ? getString(R.string.settings_stats_rate_pace_metric)
|
||||||
|
: getString(R.string.settings_stats_rate_pace_imperial));
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -19,6 +19,7 @@ package com.google.android.apps.mytracks.stats;
|
|||||||
import static com.google.android.apps.mytracks.Constants.TAG;
|
import static com.google.android.apps.mytracks.Constants.TAG;
|
||||||
|
|
||||||
import com.google.android.apps.mytracks.Constants;
|
import com.google.android.apps.mytracks.Constants;
|
||||||
|
import com.google.android.apps.mytracks.util.PreferencesUtils;
|
||||||
|
|
||||||
import android.location.Location;
|
import android.location.Location;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
@@ -91,8 +92,7 @@ public class TripStatisticsBuilder {
|
|||||||
*/
|
*/
|
||||||
private long totalLocations = 0;
|
private long totalLocations = 0;
|
||||||
|
|
||||||
private int minRecordingDistance =
|
private int minRecordingDistance = PreferencesUtils.MIN_RECORDING_DISTANCE_DEFAULT;
|
||||||
Constants.DEFAULT_MIN_RECORDING_DISTANCE;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a new trip starting at the given time.
|
* Creates a new trip starting at the given time.
|
||||||
|
|||||||
@@ -37,7 +37,7 @@ import java.util.List;
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* API level 11 specific implementation of the {@link ApiAdapter}.
|
* API level 11 specific implementation of the {@link ApiAdapter}.
|
||||||
*
|
*
|
||||||
* @author Jimmy Shih
|
* @author Jimmy Shih
|
||||||
*/
|
*/
|
||||||
@TargetApi(11)
|
@TargetApi(11)
|
||||||
@@ -54,12 +54,11 @@ public class Api11Adapter extends Api10Adapter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void configureListViewContextualMenu(final Activity activity, ListView listView, final int menuId,
|
public void configureListViewContextualMenu(final Activity activity, ListView listView,
|
||||||
final int actionModeTitleId,
|
final int menuId, final int actionModeTitleId,
|
||||||
final ContextualActionModeCallback contextualActionModeCallback) {
|
final ContextualActionModeCallback contextualActionModeCallback) {
|
||||||
listView.setOnItemLongClickListener(new OnItemLongClickListener() {
|
listView.setOnItemLongClickListener(new OnItemLongClickListener() {
|
||||||
ActionMode actionMode;
|
ActionMode actionMode;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean onItemLongClick(
|
public boolean onItemLongClick(
|
||||||
AdapterView<?> parent, View view, final int position, final long id) {
|
AdapterView<?> parent, View view, final int position, final long id) {
|
||||||
@@ -72,18 +71,15 @@ public class Api11Adapter extends Api10Adapter {
|
|||||||
mode.getMenuInflater().inflate(menuId, menu);
|
mode.getMenuInflater().inflate(menuId, menu);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
|
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
|
||||||
// Return false to indicate no change.
|
// Return false to indicate no change.
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onDestroyActionMode(ActionMode mode) {
|
public void onDestroyActionMode(ActionMode mode) {
|
||||||
actionMode = null;
|
actionMode = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
|
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
|
||||||
mode.finish();
|
mode.finish();
|
||||||
@@ -99,37 +95,13 @@ public class Api11Adapter extends Api10Adapter {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void configureSearchWidget(Activity activity, final MenuItem menuItem) {
|
public void configureSearchWidget(Activity activity, final MenuItem menuItem) {
|
||||||
SearchManager searchManager = (SearchManager) activity.getSystemService(Context.SEARCH_SERVICE);
|
SearchManager searchManager = (SearchManager) activity.getSystemService(Context.SEARCH_SERVICE);
|
||||||
SearchView searchView = (SearchView) menuItem.getActionView();
|
SearchView searchView = (SearchView) menuItem.getActionView();
|
||||||
searchView.setSearchableInfo(searchManager.getSearchableInfo(activity.getComponentName()));
|
searchView.setSearchableInfo(searchManager.getSearchableInfo(activity.getComponentName()));
|
||||||
searchView.setQueryRefinementEnabled(true);
|
searchView.setQueryRefinementEnabled(true);
|
||||||
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
|
|
||||||
@Override
|
|
||||||
public boolean onQueryTextSubmit(String query) {
|
|
||||||
menuItem.collapseActionView();
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean onQueryTextChange(String newText) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
searchView.setOnSuggestionListener(new SearchView.OnSuggestionListener() {
|
|
||||||
@Override
|
|
||||||
public boolean onSuggestionSelect(int position) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean onSuggestionClick(int position) {
|
|
||||||
menuItem.collapseActionView();
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -20,10 +20,11 @@ import android.annotation.TargetApi;
|
|||||||
import android.app.ActionBar;
|
import android.app.ActionBar;
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
import android.view.MenuItem;
|
import android.view.MenuItem;
|
||||||
|
import android.widget.SearchView;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* API level 14 specific implementation of the {@link ApiAdapter}.
|
* API level 14 specific implementation of the {@link ApiAdapter}.
|
||||||
*
|
*
|
||||||
* @author Jimmy Shih
|
* @author Jimmy Shih
|
||||||
*/
|
*/
|
||||||
@TargetApi(14)
|
@TargetApi(14)
|
||||||
@@ -35,7 +36,35 @@ public class Api14Adapter extends Api11Adapter {
|
|||||||
actionBar.setHomeButtonEnabled(true);
|
actionBar.setHomeButtonEnabled(true);
|
||||||
actionBar.setDisplayHomeAsUpEnabled(true);
|
actionBar.setDisplayHomeAsUpEnabled(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void configureSearchWidget(Activity activity, final MenuItem menuItem) {
|
||||||
|
super.configureSearchWidget(activity, menuItem);
|
||||||
|
SearchView searchView = (SearchView) menuItem.getActionView();
|
||||||
|
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
|
||||||
|
@Override
|
||||||
|
public boolean onQueryTextSubmit(String query) {
|
||||||
|
menuItem.collapseActionView();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public boolean onQueryTextChange(String newText) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
searchView.setOnSuggestionListener(new SearchView.OnSuggestionListener() {
|
||||||
|
@Override
|
||||||
|
public boolean onSuggestionSelect(int position) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public boolean onSuggestionClick(int position) {
|
||||||
|
menuItem.collapseActionView();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean handleSearchKey(MenuItem menuItem) {
|
public boolean handleSearchKey(MenuItem menuItem) {
|
||||||
menuItem.expandActionView();
|
menuItem.expandActionView();
|
||||||
|
|||||||
@@ -24,17 +24,17 @@ import java.util.Set;
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Utilities for dealing with bluetooth devices.
|
* Utilities for dealing with bluetooth devices.
|
||||||
*
|
*
|
||||||
* @author Rodrigo Damazio
|
* @author Rodrigo Damazio
|
||||||
*/
|
*/
|
||||||
public class BluetoothDeviceUtils {
|
public class BluetoothDeviceUtils {
|
||||||
|
|
||||||
private BluetoothDeviceUtils() {}
|
private BluetoothDeviceUtils() {}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Populates the device names and the device addresses with all the suitable
|
* Populates the device names and the device addresses with all the suitable
|
||||||
* bluetooth devices.
|
* bluetooth devices.
|
||||||
*
|
*
|
||||||
* @param bluetoothAdapter the bluetooth adapter
|
* @param bluetoothAdapter the bluetooth adapter
|
||||||
* @param deviceNames list of device names
|
* @param deviceNames list of device names
|
||||||
* @param deviceAddresses list of device addresses
|
* @param deviceAddresses list of device addresses
|
||||||
|
|||||||
@@ -47,7 +47,8 @@ public class ChartURLGenerator {
|
|||||||
*/
|
*/
|
||||||
public static String getChartUrl(
|
public static String getChartUrl(
|
||||||
Vector<Double> distances, Vector<Double> elevations, Track track, Context context) {
|
Vector<Double> distances, Vector<Double> elevations, Track track, Context context) {
|
||||||
boolean metricUnits = PreferencesUtils.isMetricUnits(context);
|
boolean metricUnits = PreferencesUtils.getBoolean(
|
||||||
|
context, R.string.metric_units_key, PreferencesUtils.METRIC_UNITS_DEFAULT);
|
||||||
return getChartUrl(
|
return getChartUrl(
|
||||||
distances, elevations, track, context.getString(R.string.stats_elevation), metricUnits);
|
distances, elevations, track, context.getString(R.string.stats_elevation), metricUnits);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,7 +17,6 @@
|
|||||||
package com.google.android.apps.mytracks.util;
|
package com.google.android.apps.mytracks.util;
|
||||||
|
|
||||||
import com.google.android.apps.mytracks.Constants;
|
import com.google.android.apps.mytracks.Constants;
|
||||||
import com.google.android.maps.mytracks.R;
|
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.SharedPreferences;
|
import android.content.SharedPreferences;
|
||||||
@@ -30,163 +29,74 @@ import android.content.SharedPreferences.Editor;
|
|||||||
*/
|
*/
|
||||||
public class PreferencesUtils {
|
public class PreferencesUtils {
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Preferences values. The defaults need to match the defaults in the xml
|
||||||
|
* files.
|
||||||
|
*/
|
||||||
|
public static final boolean ALLOW_ACCESS_DEFAULT = false;
|
||||||
|
public static final int ANNOUNCEMENT_FREQUENCY_DEFAULT = 0;
|
||||||
|
public static final int AUTO_RESUME_TRACK_CURRENT_RETRY_DEFAULT = 0;
|
||||||
|
|
||||||
|
public static final int AUTO_RESUME_TRACK_TIMEOUT_ALWAYS = -1;
|
||||||
|
public static final int AUTO_RESUME_TRACK_TIMEOUT_DEFAULT = 10;
|
||||||
|
public static final int AUTO_RESUME_TRACK_TIMEOUT_NEVER = 0;
|
||||||
|
|
||||||
|
public static final String BLUETOOTH_SENSOR_DEFAULT = "";
|
||||||
|
|
||||||
|
public static final boolean CHART_BY_DISTANCE_DEFAULT = true;
|
||||||
|
public static final boolean CHART_SHOW_CADENCE_DEFAULT = true;
|
||||||
|
public static final boolean CHART_SHOW_ELEVATION_DEFAULT = true;
|
||||||
|
public static final boolean CHART_SHOW_HEART_RATE_DEFAULT = true;
|
||||||
|
public static final boolean CHART_SHOW_POWER_DEFAULT = true;
|
||||||
|
public static final boolean CHART_SHOW_SPEED_DEFAULT = true;
|
||||||
|
|
||||||
|
public static final String DEFAULT_ACTIVITY_DEFAULT = "";
|
||||||
|
public static final boolean DEFAULT_MAP_PUBLIC_DEFAULT = true;
|
||||||
|
public static final int MAX_RECORDING_DISTANCE_DEFAULT = 200;
|
||||||
|
public static final boolean METRIC_UNITS_DEFAULT = true;
|
||||||
|
public static final int MIN_RECORDING_DISTANCE_DEFAULT = 5;
|
||||||
|
|
||||||
|
public static final int MIN_RECORDING_INTERVAL_ADAPT_ACCURACY = -1;
|
||||||
|
public static final int MIN_RECORDING_INTERVAL_ADAPT_BATTERY_LIFE = -2;
|
||||||
|
public static final int MIN_RECORDING_INTERVAL_DEFAULT = 0;
|
||||||
|
|
||||||
|
public static final int MIN_REQUIRED_ACCURACY_DEFAULT = 200;
|
||||||
|
public static final int MIN_REQUIRED_ACCURACY_EXCELLENT = 10;
|
||||||
|
public static final int MIN_REQUIRED_ACCURACY_POOR = 5000;
|
||||||
|
|
||||||
|
public static final int PERIODIC_TASK_OFF = 0;
|
||||||
|
public static final boolean PICK_EXISTING_MAP_DEFAULT = false;
|
||||||
|
public static final boolean PICK_STATISTICS_MARKER_DEFAULT = true;
|
||||||
|
public static final String PREFERRED_ACCOUNT_DEFAULT = "";
|
||||||
|
public static final long RECORDING_TRACK_ID_DEFAULT = -1L;
|
||||||
|
public static final boolean REPORT_SPEED_DEFAULT = true;
|
||||||
|
public static final long SELECTED_TRACK_ID_DEFAULT = -1L;
|
||||||
|
public static final boolean SEND_TO_DOCS_DEFAULT = true;
|
||||||
|
public static final boolean SEND_TO_FUSION_TABLES_DEFAULT = true;
|
||||||
|
public static final boolean SEND_TO_MAPS_DEFAULT = true;
|
||||||
|
public static final boolean SHARE_URL_ONLY_DEFAULT = false;
|
||||||
|
public static final boolean SHOW_CHECK_UNITS_DIALOG_DEFAULT = true;
|
||||||
|
public static final boolean SHOW_WELCOME_DIALOG_DEFAULT = true;
|
||||||
|
public static final int SPLIT_FREQUENCY_DEFAULT = 0;
|
||||||
|
|
||||||
|
public static final boolean STATS_SHOW_COORDINATE_DEFAULT = false;
|
||||||
|
public static final boolean STATS_SHOW_ELEVATION_DEFAULT = false;
|
||||||
|
public static final boolean STATS_SHOW_GRADE_DEFAULT = false;
|
||||||
|
public static final boolean STATS_USE_TOTAL_TIME_DEFAULT = true;
|
||||||
|
|
||||||
|
public static final int TRACK_COLOR_MODE_MEDIUM_DEFAULT = 15;
|
||||||
|
public static final int TRACK_COLOR_MODE_PERCENTAGE_DEFAULT = 25;
|
||||||
|
public static final int TRACK_COLOR_MODE_SLOW_DEFAULT = 9;
|
||||||
|
|
||||||
private PreferencesUtils() {}
|
private PreferencesUtils() {}
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the metric units key.
|
|
||||||
*
|
|
||||||
* @param context the context
|
|
||||||
*/
|
|
||||||
public static String getMetricUnitsKey(Context context) {
|
|
||||||
return getKey(context, R.string.metric_units_key);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the metric units value.
|
|
||||||
*
|
|
||||||
* @param context the context
|
|
||||||
*/
|
|
||||||
public static boolean isMetricUnits(Context context) {
|
|
||||||
return getBoolean(context, R.string.metric_units_key, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the metric units value.
|
|
||||||
*
|
|
||||||
* @param context the context
|
|
||||||
* @param value the value
|
|
||||||
*/
|
|
||||||
public static void setMetricUnits(Context context, boolean value) {
|
|
||||||
setBoolean(context, R.string.metric_units_key, value);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the recording track id key.
|
|
||||||
*
|
|
||||||
* @param context the context
|
|
||||||
*/
|
|
||||||
public static String getRecordingTrackIdKey(Context context) {
|
|
||||||
return getKey(context, R.string.recording_track_id_key);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the recording track id.
|
|
||||||
*
|
|
||||||
* @param context the context
|
|
||||||
*/
|
|
||||||
public static long getRecordingTrackId(Context context) {
|
|
||||||
return getLong(context, R.string.recording_track_id_key);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the recording track id.
|
|
||||||
*
|
|
||||||
* @param context the context
|
|
||||||
* @param trackId the track id
|
|
||||||
*/
|
|
||||||
public static void setRecordingTrackId(Context context, long trackId) {
|
|
||||||
setLong(context, R.string.recording_track_id_key, trackId);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the report speed key.
|
|
||||||
*
|
|
||||||
* @param context the context
|
|
||||||
*/
|
|
||||||
public static String getReportSpeedKey(Context context) {
|
|
||||||
return getKey(context, R.string.report_speed_key);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the report speed value.
|
|
||||||
*
|
|
||||||
* @param context the context
|
|
||||||
*/
|
|
||||||
public static boolean isReportSpeed(Context context) {
|
|
||||||
return getBoolean(context, R.string.report_speed_key, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the report speed value.
|
|
||||||
*
|
|
||||||
* @param context the context
|
|
||||||
* @param value the value
|
|
||||||
*/
|
|
||||||
public static void setReportSpeed(Context context, boolean value) {
|
|
||||||
setBoolean(context, R.string.report_speed_key, value);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the selected track id key.
|
|
||||||
*
|
|
||||||
* @param context the context
|
|
||||||
*/
|
|
||||||
public static String getSelectedTrackIdKey(Context context) {
|
|
||||||
return getKey(context, R.string.selected_track_id_key);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the selected track id.
|
|
||||||
*
|
|
||||||
* @param context the context
|
|
||||||
*/
|
|
||||||
public static long getSelectedTrackId(Context context) {
|
|
||||||
return getLong(context, R.string.selected_track_id_key);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the selected track id.
|
|
||||||
*
|
|
||||||
* @param context the context
|
|
||||||
* @param trackId the track id
|
|
||||||
*/
|
|
||||||
public static void setSelectedTrackId(Context context, long trackId) {
|
|
||||||
setLong(context, R.string.selected_track_id_key, trackId);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the show check units dialog value.
|
|
||||||
*
|
|
||||||
* @param context the context
|
|
||||||
*/
|
|
||||||
public static boolean isShowCheckUnitsDialog(Context context) {
|
|
||||||
return getBoolean(context, R.string.show_check_units_dialog_key, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the show check units dialog value to false.
|
|
||||||
*
|
|
||||||
* @param context the context
|
|
||||||
*/
|
|
||||||
public static void setShowCheckUnitsDialog(Context context) {
|
|
||||||
setBoolean(context, R.string.show_check_units_dialog_key, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the show welcomes dialog value.
|
|
||||||
*
|
|
||||||
* @param context the context
|
|
||||||
*/
|
|
||||||
public static boolean isShowWelcomeDialog(Context context) {
|
|
||||||
return getBoolean(context, R.string.show_welcome_dialog_key, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the show welcome dialog value to false.
|
|
||||||
*
|
|
||||||
* @param context the context
|
|
||||||
*/
|
|
||||||
public static void setShowWelcome(Context context) {
|
|
||||||
setBoolean(context, R.string.show_welcome_dialog_key, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets a preference key
|
* Gets a preference key
|
||||||
*
|
*
|
||||||
* @param context the context
|
* @param context the context
|
||||||
* @param keyId the key id
|
* @param keyId the key id
|
||||||
*/
|
*/
|
||||||
private static String getKey(Context context, int keyId) {
|
public static String getKey(Context context, int keyId) {
|
||||||
return context.getString(keyId);
|
return context.getString(keyId);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -202,7 +112,7 @@ public class PreferencesUtils {
|
|||||||
Constants.SETTINGS_NAME, Context.MODE_PRIVATE);
|
Constants.SETTINGS_NAME, Context.MODE_PRIVATE);
|
||||||
return sharedPreferences.getBoolean(getKey(context, keyId), defaultValue);
|
return sharedPreferences.getBoolean(getKey(context, keyId), defaultValue);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets a boolean preference value.
|
* Sets a boolean preference value.
|
||||||
*
|
*
|
||||||
@@ -217,14 +127,42 @@ public class PreferencesUtils {
|
|||||||
editor.putBoolean(getKey(context, keyId), value);
|
editor.putBoolean(getKey(context, keyId), value);
|
||||||
ApiAdapterFactory.getApiAdapter().applyPreferenceChanges(editor);
|
ApiAdapterFactory.getApiAdapter().applyPreferenceChanges(editor);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets an integer preference value.
|
||||||
|
*
|
||||||
|
* @param context the context
|
||||||
|
* @param keyId the key id
|
||||||
|
* @param defaultValue the default value
|
||||||
|
*/
|
||||||
|
public static int getInt(Context context, int keyId, int defaultValue) {
|
||||||
|
SharedPreferences sharedPreferences = context.getSharedPreferences(
|
||||||
|
Constants.SETTINGS_NAME, Context.MODE_PRIVATE);
|
||||||
|
return sharedPreferences.getInt(getKey(context, keyId), defaultValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets an integer preference value.
|
||||||
|
*
|
||||||
|
* @param context the context
|
||||||
|
* @param keyId the key id
|
||||||
|
* @param value the value
|
||||||
|
*/
|
||||||
|
public static void setInt(Context context, int keyId, int value) {
|
||||||
|
SharedPreferences sharedPreferences = context.getSharedPreferences(
|
||||||
|
Constants.SETTINGS_NAME, Context.MODE_PRIVATE);
|
||||||
|
Editor editor = sharedPreferences.edit();
|
||||||
|
editor.putInt(getKey(context, keyId), value);
|
||||||
|
ApiAdapterFactory.getApiAdapter().applyPreferenceChanges(editor);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets a long preference value.
|
* Gets a long preference value.
|
||||||
*
|
*
|
||||||
* @param context the context
|
* @param context the context
|
||||||
* @param keyId the key id
|
* @param keyId the key id
|
||||||
*/
|
*/
|
||||||
private static long getLong(Context context, int keyId) {
|
public static long getLong(Context context, int keyId) {
|
||||||
SharedPreferences sharedPreferences = context.getSharedPreferences(
|
SharedPreferences sharedPreferences = context.getSharedPreferences(
|
||||||
Constants.SETTINGS_NAME, Context.MODE_PRIVATE);
|
Constants.SETTINGS_NAME, Context.MODE_PRIVATE);
|
||||||
return sharedPreferences.getLong(getKey(context, keyId), -1L);
|
return sharedPreferences.getLong(getKey(context, keyId), -1L);
|
||||||
@@ -237,11 +175,39 @@ public class PreferencesUtils {
|
|||||||
* @param keyId the key id
|
* @param keyId the key id
|
||||||
* @param value the value
|
* @param value the value
|
||||||
*/
|
*/
|
||||||
private static void setLong(Context context, int keyId, long value) {
|
public static void setLong(Context context, int keyId, long value) {
|
||||||
SharedPreferences sharedPreferences = context.getSharedPreferences(
|
SharedPreferences sharedPreferences = context.getSharedPreferences(
|
||||||
Constants.SETTINGS_NAME, Context.MODE_PRIVATE);
|
Constants.SETTINGS_NAME, Context.MODE_PRIVATE);
|
||||||
Editor editor = sharedPreferences.edit();
|
Editor editor = sharedPreferences.edit();
|
||||||
editor.putLong(getKey(context, keyId), value);
|
editor.putLong(getKey(context, keyId), value);
|
||||||
ApiAdapterFactory.getApiAdapter().applyPreferenceChanges(editor);
|
ApiAdapterFactory.getApiAdapter().applyPreferenceChanges(editor);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets a string preference value.
|
||||||
|
*
|
||||||
|
* @param context the context
|
||||||
|
* @param keyId the key id
|
||||||
|
* @param defaultValue default value
|
||||||
|
*/
|
||||||
|
public static String getString(Context context, int keyId, String defaultValue) {
|
||||||
|
SharedPreferences sharedPreferences = context.getSharedPreferences(
|
||||||
|
Constants.SETTINGS_NAME, Context.MODE_PRIVATE);
|
||||||
|
return sharedPreferences.getString(getKey(context, keyId), defaultValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets a string preference value.
|
||||||
|
*
|
||||||
|
* @param context the context
|
||||||
|
* @param keyId the key id
|
||||||
|
* @param value the value
|
||||||
|
*/
|
||||||
|
public static void setString(Context context, int keyId, String value) {
|
||||||
|
SharedPreferences sharedPreferences = context.getSharedPreferences(
|
||||||
|
Constants.SETTINGS_NAME, Context.MODE_PRIVATE);
|
||||||
|
Editor editor = sharedPreferences.edit();
|
||||||
|
editor.putString(getKey(context, keyId), value);
|
||||||
|
ApiAdapterFactory.getApiAdapter().applyPreferenceChanges(editor);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -42,12 +42,14 @@ public class StatsUtils {
|
|||||||
* elevation field
|
* elevation field
|
||||||
*/
|
*/
|
||||||
public static void setLocationValues(Activity activity, Location location, boolean showAll) {
|
public static void setLocationValues(Activity activity, Location location, boolean showAll) {
|
||||||
boolean metricUnits = PreferencesUtils.getBoolean(activity, R.string.metric_units_key, true);
|
boolean metricUnits = PreferencesUtils.getBoolean(
|
||||||
boolean reportSpeed = PreferencesUtils.getBoolean(activity, R.string.report_speed_key, true);
|
activity, R.string.metric_units_key, PreferencesUtils.METRIC_UNITS_DEFAULT);
|
||||||
|
boolean reportSpeed = PreferencesUtils.getBoolean(
|
||||||
|
activity, R.string.report_speed_key, PreferencesUtils.REPORT_SPEED_DEFAULT);
|
||||||
|
|
||||||
// Set elevation
|
// Set elevation
|
||||||
boolean showElevation = PreferencesUtils.getBoolean(
|
boolean showElevation = PreferencesUtils.getBoolean(
|
||||||
activity, R.string.stats_show_elevation_key, false);
|
activity, R.string.stats_show_elevation_key, PreferencesUtils.STATS_SHOW_ELEVATION_DEFAULT);
|
||||||
if (showElevation) {
|
if (showElevation) {
|
||||||
double altitude = location == null ? Double.NaN : location.getAltitude();
|
double altitude = location == null ? Double.NaN : location.getAltitude();
|
||||||
setElevationValue(activity, R.id.stats_elevation_value, altitude, metricUnits);
|
setElevationValue(activity, R.id.stats_elevation_value, altitude, metricUnits);
|
||||||
@@ -64,8 +66,8 @@ public class StatsUtils {
|
|||||||
setSpeedValue(activity, R.id.stats_speed_value, speed, metricUnits, reportSpeed);
|
setSpeedValue(activity, R.id.stats_speed_value, speed, metricUnits, reportSpeed);
|
||||||
|
|
||||||
// Set coordinate
|
// Set coordinate
|
||||||
boolean showCoordinate = PreferencesUtils.getBoolean(
|
boolean showCoordinate = PreferencesUtils.getBoolean(activity,
|
||||||
activity, R.string.stats_show_coordinate_key, false);
|
R.string.stats_show_coordinate_key, PreferencesUtils.STATS_SHOW_COORDINATE_DEFAULT);
|
||||||
View coordinateLabelTableRow = activity.findViewById(R.id.stats_coordinate_label_table_row);
|
View coordinateLabelTableRow = activity.findViewById(R.id.stats_coordinate_label_table_row);
|
||||||
View coordinateValueTableRow = activity.findViewById(R.id.stats_coordinate_value_table_row);
|
View coordinateValueTableRow = activity.findViewById(R.id.stats_coordinate_value_table_row);
|
||||||
coordinateLabelTableRow.setVisibility(showCoordinate ? View.VISIBLE : View.GONE);
|
coordinateLabelTableRow.setVisibility(showCoordinate ? View.VISIBLE : View.GONE);
|
||||||
@@ -95,10 +97,12 @@ public class StatsUtils {
|
|||||||
* @param tripStatistics the trip statistics
|
* @param tripStatistics the trip statistics
|
||||||
*/
|
*/
|
||||||
public static void setTripStatisticsValues(Activity activity, TripStatistics tripStatistics) {
|
public static void setTripStatisticsValues(Activity activity, TripStatistics tripStatistics) {
|
||||||
boolean metricUnits = PreferencesUtils.getBoolean(activity, R.string.metric_units_key, true);
|
boolean metricUnits = PreferencesUtils.getBoolean(
|
||||||
boolean reportSpeed = PreferencesUtils.getBoolean(activity, R.string.report_speed_key, true);
|
activity, R.string.metric_units_key, PreferencesUtils.METRIC_UNITS_DEFAULT);
|
||||||
boolean showTotalTime = PreferencesUtils.getBoolean(
|
boolean reportSpeed = PreferencesUtils.getBoolean(
|
||||||
activity, R.string.stats_show_total_time_key, true);
|
activity, R.string.report_speed_key, PreferencesUtils.REPORT_SPEED_DEFAULT);
|
||||||
|
boolean useTotalTime = PreferencesUtils.getBoolean(
|
||||||
|
activity, R.string.stats_use_total_time_key, PreferencesUtils.STATS_USE_TOTAL_TIME_DEFAULT);
|
||||||
|
|
||||||
// Set total distance
|
// Set total distance
|
||||||
double totalDistance = tripStatistics == null ? Double.NaN : tripStatistics.getTotalDistance();
|
double totalDistance = tripStatistics == null ? Double.NaN : tripStatistics.getTotalDistance();
|
||||||
@@ -106,17 +110,17 @@ public class StatsUtils {
|
|||||||
|
|
||||||
// Set total time/moving time
|
// Set total time/moving time
|
||||||
setTimeLabel(activity, R.id.stats_total_time_label, R.string.stats_total_time,
|
setTimeLabel(activity, R.id.stats_total_time_label, R.string.stats_total_time,
|
||||||
R.string.stats_moving_time, showTotalTime);
|
R.string.stats_moving_time, useTotalTime);
|
||||||
long totalTime;
|
long totalTime;
|
||||||
if (tripStatistics == null) {
|
if (tripStatistics == null) {
|
||||||
totalTime = -1L;
|
totalTime = -1L;
|
||||||
} else {
|
} else {
|
||||||
totalTime = showTotalTime ? tripStatistics.getTotalTime() : tripStatistics.getMovingTime();
|
totalTime = useTotalTime ? tripStatistics.getTotalTime() : tripStatistics.getMovingTime();
|
||||||
}
|
}
|
||||||
setTimeValue(activity, R.id.stats_total_time_value, totalTime);
|
setTimeValue(activity, R.id.stats_total_time_value, totalTime);
|
||||||
|
|
||||||
// Set average speed/moving average speed
|
// Set average speed/moving average speed
|
||||||
if (showTotalTime) {
|
if (useTotalTime) {
|
||||||
setSpeedLabel(activity, R.id.stats_average_speed_label, R.string.stats_average_speed,
|
setSpeedLabel(activity, R.id.stats_average_speed_label, R.string.stats_average_speed,
|
||||||
R.string.stats_average_pace, reportSpeed);
|
R.string.stats_average_pace, reportSpeed);
|
||||||
} else {
|
} else {
|
||||||
@@ -127,7 +131,7 @@ public class StatsUtils {
|
|||||||
if (tripStatistics == null) {
|
if (tripStatistics == null) {
|
||||||
averageSpeed = Double.NaN;
|
averageSpeed = Double.NaN;
|
||||||
} else {
|
} else {
|
||||||
averageSpeed = showTotalTime ? tripStatistics.getAverageSpeed()
|
averageSpeed = useTotalTime ? tripStatistics.getAverageSpeed()
|
||||||
: tripStatistics.getAverageMovingSpeed();
|
: tripStatistics.getAverageMovingSpeed();
|
||||||
}
|
}
|
||||||
setSpeedValue(activity, R.id.stats_average_speed_value, averageSpeed, metricUnits, reportSpeed);
|
setSpeedValue(activity, R.id.stats_average_speed_value, averageSpeed, metricUnits, reportSpeed);
|
||||||
@@ -140,7 +144,7 @@ public class StatsUtils {
|
|||||||
|
|
||||||
// Set elevation
|
// Set elevation
|
||||||
boolean showElevation = PreferencesUtils.getBoolean(
|
boolean showElevation = PreferencesUtils.getBoolean(
|
||||||
activity, R.string.stats_show_elevation_key, false);
|
activity, R.string.stats_show_elevation_key, PreferencesUtils.STATS_SHOW_ELEVATION_DEFAULT);
|
||||||
View elevationLabelTableRow1 = activity.findViewById(R.id.stats_elevation_label_table_row1);
|
View elevationLabelTableRow1 = activity.findViewById(R.id.stats_elevation_label_table_row1);
|
||||||
View elevationValueTableRow1 = activity.findViewById(R.id.stats_elevation_value_table_row1);
|
View elevationValueTableRow1 = activity.findViewById(R.id.stats_elevation_value_table_row1);
|
||||||
View elevationLabelTableRow2 = activity.findViewById(R.id.stats_elevation_label_table_row2);
|
View elevationLabelTableRow2 = activity.findViewById(R.id.stats_elevation_label_table_row2);
|
||||||
@@ -160,7 +164,8 @@ public class StatsUtils {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Set grade
|
// Set grade
|
||||||
boolean showGrade = PreferencesUtils.getBoolean(activity, R.string.stats_show_grade_key, false);
|
boolean showGrade = PreferencesUtils.getBoolean(
|
||||||
|
activity, R.string.stats_show_grade_key, PreferencesUtils.STATS_SHOW_GRADE_DEFAULT);
|
||||||
View gradeLabelTableRow = activity.findViewById(R.id.stats_grade_label_table_row);
|
View gradeLabelTableRow = activity.findViewById(R.id.stats_grade_label_table_row);
|
||||||
View gradeValueTableRow = activity.findViewById(R.id.stats_grade_value_table_row);
|
View gradeValueTableRow = activity.findViewById(R.id.stats_grade_value_table_row);
|
||||||
gradeLabelTableRow.setVisibility(showGrade ? View.VISIBLE : View.GONE);
|
gradeLabelTableRow.setVisibility(showGrade ? View.VISIBLE : View.GONE);
|
||||||
|
|||||||
@@ -86,7 +86,8 @@ public class TrackRecordingServiceConnectionUtils {
|
|||||||
Log.e(TAG, "Failed to check if service is recording", e);
|
Log.e(TAG, "Failed to check if service is recording", e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return PreferencesUtils.getRecordingTrackId(context) != -1L;
|
return PreferencesUtils.getLong(context, R.string.recording_track_id_key)
|
||||||
|
!= PreferencesUtils.RECORDING_TRACK_ID_DEFAULT;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -106,9 +107,9 @@ public class TrackRecordingServiceConnectionUtils {
|
|||||||
* Need to remember the recordingTrackId before calling endCurrentTrack.
|
* Need to remember the recordingTrackId before calling endCurrentTrack.
|
||||||
* endCurrentTrack sets the value to -1L.
|
* endCurrentTrack sets the value to -1L.
|
||||||
*/
|
*/
|
||||||
long recordingTrackId = PreferencesUtils.getRecordingTrackId(context);
|
long recordingTrackId = PreferencesUtils.getLong(context, R.string.recording_track_id_key);
|
||||||
trackRecordingService.endCurrentTrack();
|
trackRecordingService.endCurrentTrack();
|
||||||
if (recordingTrackId != -1L) {
|
if (recordingTrackId != PreferencesUtils.RECORDING_TRACK_ID_DEFAULT) {
|
||||||
Intent intent = IntentUtils.newIntent(context, TrackEditActivity.class)
|
Intent intent = IntentUtils.newIntent(context, TrackEditActivity.class)
|
||||||
.putExtra(TrackEditActivity.EXTRA_TRACK_ID, recordingTrackId)
|
.putExtra(TrackEditActivity.EXTRA_TRACK_ID, recordingTrackId)
|
||||||
.putExtra(TrackEditActivity.EXTRA_NEW_TRACK, true);
|
.putExtra(TrackEditActivity.EXTRA_NEW_TRACK, true);
|
||||||
@@ -118,7 +119,8 @@ public class TrackRecordingServiceConnectionUtils {
|
|||||||
Log.e(TAG, "Unable to stop recording.", e);
|
Log.e(TAG, "Unable to stop recording.", e);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
PreferencesUtils.setRecordingTrackId(context, -1L);
|
PreferencesUtils.setLong(
|
||||||
|
context, R.string.recording_track_id_key, PreferencesUtils.RECORDING_TRACK_ID_DEFAULT);
|
||||||
}
|
}
|
||||||
trackRecordingServiceConnection.stop();
|
trackRecordingServiceConnection.stop();
|
||||||
}
|
}
|
||||||
@@ -134,7 +136,8 @@ public class TrackRecordingServiceConnectionUtils {
|
|||||||
Context context, TrackRecordingServiceConnection trackRecordingServiceConnection) {
|
Context context, TrackRecordingServiceConnection trackRecordingServiceConnection) {
|
||||||
trackRecordingServiceConnection.bindIfRunning();
|
trackRecordingServiceConnection.bindIfRunning();
|
||||||
if (!isRecordingServiceRunning(context)) {
|
if (!isRecordingServiceRunning(context)) {
|
||||||
PreferencesUtils.setRecordingTrackId(context, -1L);
|
PreferencesUtils.setLong(
|
||||||
|
context, R.string.recording_track_id_key, PreferencesUtils.RECORDING_TRACK_ID_DEFAULT);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -81,7 +81,7 @@ public class TrackWidgetProvider
|
|||||||
public TrackWidgetProvider() {
|
public TrackWidgetProvider() {
|
||||||
super();
|
super();
|
||||||
contentHandler = new Handler();
|
contentHandler = new Handler();
|
||||||
selectedTrackId = -1;
|
selectedTrackId = PreferencesUtils.SELECTED_TRACK_ID_DEFAULT;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void initialize(Context aContext) {
|
private void initialize(Context aContext) {
|
||||||
@@ -134,7 +134,7 @@ public class TrackWidgetProvider
|
|||||||
|
|
||||||
private void updateTrack(String action) {
|
private void updateTrack(String action) {
|
||||||
Track track = null;
|
Track track = null;
|
||||||
if (selectedTrackId != -1) {
|
if (selectedTrackId != PreferencesUtils.SELECTED_TRACK_ID_DEFAULT) {
|
||||||
Log.d(TAG, "TrackWidgetProvider.updateTrack: Retrieving specified track.");
|
Log.d(TAG, "TrackWidgetProvider.updateTrack: Retrieving specified track.");
|
||||||
track = providerUtils.getTrack(selectedTrackId);
|
track = providerUtils.getTrack(selectedTrackId);
|
||||||
} else {
|
} else {
|
||||||
@@ -230,16 +230,17 @@ public class TrackWidgetProvider
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
|
public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
|
||||||
if (key == null || key.equals(PreferencesUtils.getMetricUnitsKey(context))) {
|
if (key == null || PreferencesUtils.getKey(context, R.string.metric_units_key).equals(key)) {
|
||||||
metricUnits = PreferencesUtils.isMetricUnits(context);
|
metricUnits = PreferencesUtils.getBoolean(
|
||||||
|
context, R.string.metric_units_key, PreferencesUtils.METRIC_UNITS_DEFAULT);
|
||||||
}
|
}
|
||||||
|
if (key == null || PreferencesUtils.getKey(context, R.string.report_speed_key).equals(key)) {
|
||||||
if (key == null || key.equals(PreferencesUtils.getReportSpeedKey(context))) {
|
reportSpeed = PreferencesUtils.getBoolean(
|
||||||
reportSpeed = PreferencesUtils.isReportSpeed(context);
|
context, R.string.report_speed_key, PreferencesUtils.REPORT_SPEED_DEFAULT);
|
||||||
}
|
}
|
||||||
|
if (key == null
|
||||||
if (key == null || key.equals(PreferencesUtils.getSelectedTrackIdKey(context))) {
|
|| PreferencesUtils.getKey(context, R.string.selected_track_id_key).equals(key)) {
|
||||||
selectedTrackId = PreferencesUtils.getSelectedTrackId(context);
|
selectedTrackId = PreferencesUtils.getLong(context, R.string.selected_track_id_key);
|
||||||
Log.d(TAG, "TrackWidgetProvider setting selecting track from preference: " + selectedTrackId);
|
Log.d(TAG, "TrackWidgetProvider setting selecting track from preference: " + selectedTrackId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -30,6 +30,7 @@ import com.google.android.apps.mytracks.content.TrackDataHub.ListenerDataType;
|
|||||||
import com.google.android.apps.mytracks.content.TrackDataListener.ProviderState;
|
import com.google.android.apps.mytracks.content.TrackDataListener.ProviderState;
|
||||||
import com.google.android.apps.mytracks.services.TrackRecordingServiceTest.MockContext;
|
import com.google.android.apps.mytracks.services.TrackRecordingServiceTest.MockContext;
|
||||||
import com.google.android.apps.mytracks.util.PreferencesUtils;
|
import com.google.android.apps.mytracks.util.PreferencesUtils;
|
||||||
|
import com.google.android.maps.mytracks.R;
|
||||||
import com.google.android.testing.mocking.AndroidMock;
|
import com.google.android.testing.mocking.AndroidMock;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
@@ -70,7 +71,7 @@ public class TrackDataHubTest extends AndroidTestCase {
|
|||||||
private TrackDataHub hub;
|
private TrackDataHub hub;
|
||||||
private TrackDataListeners listeners;
|
private TrackDataListeners listeners;
|
||||||
private DataSourcesWrapper dataSources;
|
private DataSourcesWrapper dataSources;
|
||||||
private SharedPreferences prefs;
|
private SharedPreferences sharedPreferences;
|
||||||
private TrackDataListener listener1;
|
private TrackDataListener listener1;
|
||||||
private TrackDataListener listener2;
|
private TrackDataListener listener2;
|
||||||
private Capture<OnSharedPreferenceChangeListener> preferenceListenerCapture =
|
private Capture<OnSharedPreferenceChangeListener> preferenceListenerCapture =
|
||||||
@@ -87,12 +88,12 @@ public class TrackDataHubTest extends AndroidTestCase {
|
|||||||
getContext(), getContext(), "test.");
|
getContext(), getContext(), "test.");
|
||||||
context = new MockContext(mockContentResolver, targetContext);
|
context = new MockContext(mockContentResolver, targetContext);
|
||||||
|
|
||||||
prefs = context.getSharedPreferences(Constants.SETTINGS_NAME, Context.MODE_PRIVATE);
|
sharedPreferences = context.getSharedPreferences(Constants.SETTINGS_NAME, Context.MODE_PRIVATE);
|
||||||
providerUtils = AndroidMock.createMock("providerUtils", MyTracksProviderUtils.class);
|
providerUtils = AndroidMock.createMock("providerUtils", MyTracksProviderUtils.class);
|
||||||
dataSources = AndroidMock.createNiceMock("dataSources", DataSourcesWrapper.class);
|
dataSources = AndroidMock.createNiceMock("dataSources", DataSourcesWrapper.class);
|
||||||
|
|
||||||
listeners = new TrackDataListeners();
|
listeners = new TrackDataListeners();
|
||||||
hub = new TrackDataHub(context, listeners, prefs, providerUtils, TARGET_POINTS) {
|
hub = new TrackDataHub(context, listeners, sharedPreferences, providerUtils, TARGET_POINTS) {
|
||||||
@Override
|
@Override
|
||||||
protected DataSourcesWrapper newDataSources() {
|
protected DataSourcesWrapper newDataSources() {
|
||||||
return dataSources;
|
return dataSources;
|
||||||
@@ -112,8 +113,8 @@ public class TrackDataHubTest extends AndroidTestCase {
|
|||||||
|
|
||||||
listener1 = AndroidMock.createStrictMock("listener1", TrackDataListener.class);
|
listener1 = AndroidMock.createStrictMock("listener1", TrackDataListener.class);
|
||||||
listener2 = AndroidMock.createStrictMock("listener2", TrackDataListener.class);
|
listener2 = AndroidMock.createStrictMock("listener2", TrackDataListener.class);
|
||||||
PreferencesUtils.setRecordingTrackId(context, TRACK_ID);
|
PreferencesUtils.setLong(context, R.string.recording_track_id_key, TRACK_ID);
|
||||||
PreferencesUtils.setSelectedTrackId(context, TRACK_ID);
|
PreferencesUtils.setLong(context, R.string.selected_track_id_key, TRACK_ID);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -797,13 +798,8 @@ public class TrackDataHubTest extends AndroidTestCase {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void testDisplayPreferencesListen() throws Exception {
|
public void testDisplayPreferencesListen() throws Exception {
|
||||||
String metricUnitsKey = PreferencesUtils.getMetricUnitsKey(context);
|
PreferencesUtils.setBoolean(context, R.string.report_speed_key, true);
|
||||||
String reportSpeedKey = PreferencesUtils.getReportSpeedKey(context);
|
PreferencesUtils.setBoolean(context, R.string.metric_units_key, true);
|
||||||
|
|
||||||
prefs.edit()
|
|
||||||
.putBoolean(metricUnitsKey, true)
|
|
||||||
.putBoolean(reportSpeedKey, true)
|
|
||||||
.apply();
|
|
||||||
|
|
||||||
Capture<OnSharedPreferenceChangeListener> listenerCapture =
|
Capture<OnSharedPreferenceChangeListener> listenerCapture =
|
||||||
new Capture<OnSharedPreferenceChangeListener>();
|
new Capture<OnSharedPreferenceChangeListener>();
|
||||||
@@ -827,11 +823,10 @@ public class TrackDataHubTest extends AndroidTestCase {
|
|||||||
|
|
||||||
replay();
|
replay();
|
||||||
|
|
||||||
prefs.edit()
|
PreferencesUtils.setBoolean(context, R.string.report_speed_key, false);
|
||||||
.putBoolean(reportSpeedKey, false)
|
|
||||||
.apply();
|
|
||||||
OnSharedPreferenceChangeListener listener = listenerCapture.getValue();
|
OnSharedPreferenceChangeListener listener = listenerCapture.getValue();
|
||||||
listener.onSharedPreferenceChanged(prefs, reportSpeedKey);
|
listener.onSharedPreferenceChanged(
|
||||||
|
sharedPreferences, PreferencesUtils.getKey(context, R.string.report_speed_key));
|
||||||
|
|
||||||
AndroidMock.verify(dataSources, providerUtils, listener1, listener2);
|
AndroidMock.verify(dataSources, providerUtils, listener1, listener2);
|
||||||
AndroidMock.reset(dataSources, providerUtils, listener1, listener2);
|
AndroidMock.reset(dataSources, providerUtils, listener1, listener2);
|
||||||
@@ -841,10 +836,9 @@ public class TrackDataHubTest extends AndroidTestCase {
|
|||||||
|
|
||||||
replay();
|
replay();
|
||||||
|
|
||||||
prefs.edit()
|
PreferencesUtils.setBoolean(context, R.string.metric_units_key, false);
|
||||||
.putBoolean(metricUnitsKey, false)
|
listener.onSharedPreferenceChanged(
|
||||||
.apply();
|
sharedPreferences, PreferencesUtils.getKey(context, R.string.metric_units_key));
|
||||||
listener.onSharedPreferenceChanged(prefs, metricUnitsKey);
|
|
||||||
|
|
||||||
verifyAndReset();
|
verifyAndReset();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -120,7 +120,7 @@ public class ChartFragmentTest extends AndroidTestCase {
|
|||||||
*/
|
*/
|
||||||
public void testFillDataPoint_distanceMetric() {
|
public void testFillDataPoint_distanceMetric() {
|
||||||
// By distance.
|
// By distance.
|
||||||
chartFragment.getChartView().setMode(ChartView.Mode.BY_DISTANCE);
|
chartFragment.setChartByDistance(true);
|
||||||
// Resets last location and writes first location.
|
// Resets last location and writes first location.
|
||||||
MyTracksLocation myTracksLocation1 = TrackStubUtils.createMyTracksLocation();
|
MyTracksLocation myTracksLocation1 = TrackStubUtils.createMyTracksLocation();
|
||||||
double[] point = fillDataPointTestHelper(myTracksLocation1);
|
double[] point = fillDataPointTestHelper(myTracksLocation1);
|
||||||
@@ -160,6 +160,8 @@ public class ChartFragmentTest extends AndroidTestCase {
|
|||||||
* {@link ChartFragment#fillDataPoint(Location, double[])}.
|
* {@link ChartFragment#fillDataPoint(Location, double[])}.
|
||||||
*/
|
*/
|
||||||
public void testFillDataPoint_distanceImperial() {
|
public void testFillDataPoint_distanceImperial() {
|
||||||
|
// By distance.
|
||||||
|
chartFragment.setChartByDistance(true);
|
||||||
// Setups to use imperial.
|
// Setups to use imperial.
|
||||||
chartFragment.setMetricUnits(false);
|
chartFragment.setMetricUnits(false);
|
||||||
|
|
||||||
@@ -204,7 +206,7 @@ public class ChartFragmentTest extends AndroidTestCase {
|
|||||||
*/
|
*/
|
||||||
public void testFillDataPoint_time() {
|
public void testFillDataPoint_time() {
|
||||||
// By time
|
// By time
|
||||||
chartFragment.getChartView().setMode(ChartView.Mode.BY_TIME);
|
chartFragment.setChartByDistance(false);
|
||||||
MyTracksLocation myTracksLocation1 = TrackStubUtils.createMyTracksLocation();
|
MyTracksLocation myTracksLocation1 = TrackStubUtils.createMyTracksLocation();
|
||||||
double[] point = fillDataPointTestHelper(myTracksLocation1);
|
double[] point = fillDataPointTestHelper(myTracksLocation1);
|
||||||
assertEquals(0.0, point[0]);
|
assertEquals(0.0, point[0]);
|
||||||
|
|||||||
@@ -15,14 +15,11 @@
|
|||||||
*/
|
*/
|
||||||
package com.google.android.apps.mytracks.io.sendtogoogle;
|
package com.google.android.apps.mytracks.io.sendtogoogle;
|
||||||
|
|
||||||
import com.google.android.apps.mytracks.Constants;
|
import com.google.android.apps.mytracks.util.PreferencesUtils;
|
||||||
import com.google.android.maps.mytracks.R;
|
import com.google.android.maps.mytracks.R;
|
||||||
|
|
||||||
import android.app.Instrumentation;
|
import android.app.Instrumentation;
|
||||||
import android.content.Context;
|
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.content.SharedPreferences;
|
|
||||||
import android.content.SharedPreferences.Editor;
|
|
||||||
import android.test.ActivityInstrumentationTestCase2;
|
import android.test.ActivityInstrumentationTestCase2;
|
||||||
import android.widget.CheckBox;
|
import android.widget.CheckBox;
|
||||||
import android.widget.RadioButton;
|
import android.widget.RadioButton;
|
||||||
@@ -123,14 +120,10 @@ public class UploadServiceChooserActivityTest extends
|
|||||||
public void testOnCreateDialog_initStateUnchecked() {
|
public void testOnCreateDialog_initStateUnchecked() {
|
||||||
initialActivity(true, true, true);
|
initialActivity(true, true, true);
|
||||||
// Initial all values to false in SharedPreferences.
|
// Initial all values to false in SharedPreferences.
|
||||||
SharedPreferences prefs = uploadServiceChooserActivity.getSharedPreferences(
|
PreferencesUtils.setBoolean(uploadServiceChooserActivity, R.string.send_to_maps_key, false);
|
||||||
Constants.SETTINGS_NAME, Context.MODE_PRIVATE);
|
PreferencesUtils.setBoolean(
|
||||||
Editor editor = prefs.edit();
|
uploadServiceChooserActivity, R.string.send_to_fusion_tables_key, false);
|
||||||
editor.putBoolean(uploadServiceChooserActivity.getString(R.string.send_to_maps_key), false);
|
PreferencesUtils.setBoolean(uploadServiceChooserActivity, R.string.send_to_docs_key, false);
|
||||||
editor.putBoolean(uploadServiceChooserActivity.getString(R.string.send_to_fusion_tables_key),
|
|
||||||
false);
|
|
||||||
editor.putBoolean(uploadServiceChooserActivity.getString(R.string.send_to_docs_key), false);
|
|
||||||
editor.commit();
|
|
||||||
uploadServiceChooserActivity.runOnUiThread(new Runnable() {
|
uploadServiceChooserActivity.runOnUiThread(new Runnable() {
|
||||||
public void run() {
|
public void run() {
|
||||||
uploadServiceChooserActivity.initState();
|
uploadServiceChooserActivity.initState();
|
||||||
@@ -150,15 +143,11 @@ public class UploadServiceChooserActivityTest extends
|
|||||||
public void testOnCreateDialog_initStateChecked() {
|
public void testOnCreateDialog_initStateChecked() {
|
||||||
initialActivity(true, true, true);
|
initialActivity(true, true, true);
|
||||||
// Initial all values to true in SharedPreferences.
|
// Initial all values to true in SharedPreferences.
|
||||||
SharedPreferences prefs = uploadServiceChooserActivity.getSharedPreferences(
|
PreferencesUtils.setBoolean(uploadServiceChooserActivity, R.string.pick_existing_map_key, true);
|
||||||
Constants.SETTINGS_NAME, Context.MODE_PRIVATE);
|
PreferencesUtils.setBoolean(uploadServiceChooserActivity, R.string.send_to_maps_key, true);
|
||||||
Editor editor = prefs.edit();
|
PreferencesUtils.setBoolean(
|
||||||
editor.putBoolean(uploadServiceChooserActivity.getString(R.string.send_to_maps_key), true);
|
uploadServiceChooserActivity, R.string.send_to_fusion_tables_key, true);
|
||||||
editor.putBoolean(uploadServiceChooserActivity.getString(R.string.pick_existing_map_key), true);
|
PreferencesUtils.setBoolean(uploadServiceChooserActivity, R.string.send_to_docs_key, true);
|
||||||
editor.putBoolean(uploadServiceChooserActivity.getString(R.string.send_to_fusion_tables_key),
|
|
||||||
true);
|
|
||||||
editor.putBoolean(uploadServiceChooserActivity.getString(R.string.send_to_docs_key), true);
|
|
||||||
editor.commit();
|
|
||||||
uploadServiceChooserActivity.runOnUiThread(new Runnable() {
|
uploadServiceChooserActivity.runOnUiThread(new Runnable() {
|
||||||
public void run() {
|
public void run() {
|
||||||
uploadServiceChooserActivity.initState();
|
uploadServiceChooserActivity.initState();
|
||||||
@@ -181,14 +170,10 @@ public class UploadServiceChooserActivityTest extends
|
|||||||
public void testOnCreateDialog_saveState() {
|
public void testOnCreateDialog_saveState() {
|
||||||
initialActivity(true, true, true);
|
initialActivity(true, true, true);
|
||||||
// Initial all values to true in SharedPreferences.
|
// Initial all values to true in SharedPreferences.
|
||||||
SharedPreferences prefs = uploadServiceChooserActivity.getSharedPreferences(
|
PreferencesUtils.setBoolean(uploadServiceChooserActivity, R.string.send_to_maps_key, true);
|
||||||
Constants.SETTINGS_NAME, Context.MODE_PRIVATE);
|
PreferencesUtils.setBoolean(
|
||||||
Editor editor = prefs.edit();
|
uploadServiceChooserActivity, R.string.send_to_fusion_tables_key, true);
|
||||||
editor.putBoolean(uploadServiceChooserActivity.getString(R.string.send_to_maps_key), true);
|
PreferencesUtils.setBoolean(uploadServiceChooserActivity, R.string.send_to_docs_key, true);
|
||||||
editor.putBoolean(uploadServiceChooserActivity.getString(R.string.send_to_fusion_tables_key),
|
|
||||||
true);
|
|
||||||
editor.putBoolean(uploadServiceChooserActivity.getString(R.string.send_to_docs_key), true);
|
|
||||||
editor.commit();
|
|
||||||
uploadServiceChooserActivity.runOnUiThread(new Runnable() {
|
uploadServiceChooserActivity.runOnUiThread(new Runnable() {
|
||||||
public void run() {
|
public void run() {
|
||||||
uploadServiceChooserActivity.initState();
|
uploadServiceChooserActivity.initState();
|
||||||
@@ -197,12 +182,13 @@ public class UploadServiceChooserActivityTest extends
|
|||||||
instrumentation.waitForIdleSync();
|
instrumentation.waitForIdleSync();
|
||||||
uploadServiceChooserActivity.saveState();
|
uploadServiceChooserActivity.saveState();
|
||||||
// All values in SharedPreferences must be changed.
|
// All values in SharedPreferences must be changed.
|
||||||
assertTrue(prefs.getBoolean(uploadServiceChooserActivity.getString(R.string.send_to_maps_key),
|
assertTrue(PreferencesUtils.getBoolean(uploadServiceChooserActivity, R.string.send_to_maps_key,
|
||||||
false));
|
PreferencesUtils.SEND_TO_MAPS_DEFAULT));
|
||||||
assertTrue(prefs.getBoolean(uploadServiceChooserActivity.getString(R.string.send_to_maps_key),
|
assertTrue(PreferencesUtils.getBoolean(
|
||||||
false));
|
uploadServiceChooserActivity, R.string.send_to_fusion_tables_key,
|
||||||
assertTrue(prefs.getBoolean(uploadServiceChooserActivity.getString(R.string.send_to_maps_key),
|
PreferencesUtils.SEND_TO_FUSION_TABLES_DEFAULT));
|
||||||
false));
|
assertTrue(PreferencesUtils.getBoolean(uploadServiceChooserActivity, R.string.send_to_docs_key,
|
||||||
|
PreferencesUtils.SEND_TO_DOCS_DEFAULT));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -213,14 +199,10 @@ public class UploadServiceChooserActivityTest extends
|
|||||||
public void testOnCreateDialog_startNextActivity() {
|
public void testOnCreateDialog_startNextActivity() {
|
||||||
initialActivity(true, true, true);
|
initialActivity(true, true, true);
|
||||||
// Initial all values to true or false in SharedPreferences.
|
// Initial all values to true or false in SharedPreferences.
|
||||||
SharedPreferences prefs = uploadServiceChooserActivity.getSharedPreferences(
|
PreferencesUtils.setBoolean(uploadServiceChooserActivity, R.string.send_to_maps_key, true);
|
||||||
Constants.SETTINGS_NAME, Context.MODE_PRIVATE);
|
PreferencesUtils.setBoolean(uploadServiceChooserActivity, R.string.send_to_docs_key, true);
|
||||||
Editor editor = prefs.edit();
|
PreferencesUtils.setBoolean(
|
||||||
editor.putBoolean(uploadServiceChooserActivity.getString(R.string.send_to_maps_key), true);
|
uploadServiceChooserActivity, R.string.send_to_fusion_tables_key, false);
|
||||||
editor.putBoolean(uploadServiceChooserActivity.getString(R.string.send_to_docs_key), true);
|
|
||||||
editor.putBoolean(uploadServiceChooserActivity.getString(R.string.send_to_fusion_tables_key),
|
|
||||||
false);
|
|
||||||
editor.commit();
|
|
||||||
uploadServiceChooserActivity.runOnUiThread(new Runnable() {
|
uploadServiceChooserActivity.runOnUiThread(new Runnable() {
|
||||||
public void run() {
|
public void run() {
|
||||||
uploadServiceChooserActivity.initState();
|
uploadServiceChooserActivity.initState();
|
||||||
|
|||||||
@@ -13,6 +13,7 @@
|
|||||||
* License for the specific language governing permissions and limitations under
|
* License for the specific language governing permissions and limitations under
|
||||||
* the License.
|
* the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package com.google.android.apps.mytracks.maps;
|
package com.google.android.apps.mytracks.maps;
|
||||||
|
|
||||||
import com.google.android.apps.mytracks.Constants;
|
import com.google.android.apps.mytracks.Constants;
|
||||||
@@ -21,26 +22,23 @@ import com.google.android.maps.mytracks.R;
|
|||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.SharedPreferences;
|
import android.content.SharedPreferences;
|
||||||
import android.content.SharedPreferences.Editor;
|
|
||||||
import android.test.AndroidTestCase;
|
import android.test.AndroidTestCase;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Tests for the {@link DynamicSpeedTrackPathDescriptor}.
|
* Tests for the {@link DynamicSpeedTrackPathDescriptor}.
|
||||||
*
|
*
|
||||||
* @author Youtao Liu
|
* @author Youtao Liu
|
||||||
*/
|
*/
|
||||||
public class DynamicSpeedTrackPathDescriptorTest extends AndroidTestCase {
|
public class DynamicSpeedTrackPathDescriptorTest extends AndroidTestCase {
|
||||||
|
|
||||||
private Context context;
|
private Context context;
|
||||||
private SharedPreferences sharedPreferences;
|
private SharedPreferences sharedPreferences;
|
||||||
private Editor sharedPreferencesEditor;
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void setUp() throws Exception {
|
protected void setUp() throws Exception {
|
||||||
super.setUp();
|
super.setUp();
|
||||||
context = getContext();
|
context = getContext();
|
||||||
sharedPreferences = context.getSharedPreferences(Constants.SETTINGS_NAME, Context.MODE_PRIVATE);
|
sharedPreferences = context.getSharedPreferences(Constants.SETTINGS_NAME, Context.MODE_PRIVATE);
|
||||||
sharedPreferencesEditor = sharedPreferences.edit();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -48,96 +46,77 @@ public class DynamicSpeedTrackPathDescriptorTest extends AndroidTestCase {
|
|||||||
* with zero, normal and illegal value.
|
* with zero, normal and illegal value.
|
||||||
*/
|
*/
|
||||||
public void testGetSpeedMargin() {
|
public void testGetSpeedMargin() {
|
||||||
String[] actuals = { "0", "50", "99", "" };
|
|
||||||
// The default value of speedMargin is 25.
|
// The default value of speedMargin is 25.
|
||||||
int[] expectations = { 0, 50, 99, 25 };
|
int[] expectations = { 0, 50, 99, 25 };
|
||||||
// Test
|
// Test
|
||||||
for (int i = 0; i < expectations.length; i++) {
|
for (int i = 0; i < expectations.length; i++) {
|
||||||
sharedPreferencesEditor.putString(
|
PreferencesUtils.setInt(context, R.string.track_color_mode_percentage_key, expectations[i]);
|
||||||
context.getString(R.string.track_color_mode_dynamic_speed_variation_key), actuals[i]);
|
|
||||||
sharedPreferencesEditor.commit();
|
|
||||||
DynamicSpeedTrackPathDescriptor dynamicSpeedTrackPathDescriptor = new DynamicSpeedTrackPathDescriptor(
|
DynamicSpeedTrackPathDescriptor dynamicSpeedTrackPathDescriptor = new DynamicSpeedTrackPathDescriptor(
|
||||||
context);
|
context);
|
||||||
assertEquals(expectations[i],
|
assertEquals(expectations[i], dynamicSpeedTrackPathDescriptor.getSpeedMargin());
|
||||||
dynamicSpeedTrackPathDescriptor.getSpeedMargin(sharedPreferences));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Tests {@link
|
* Tests {@link DynamicSpeedTrackPathDescriptor#onSharedPreferenceChanged(SharedPreferences,
|
||||||
* DynamicSpeedTrackPathDescriptor#onSharedPreferenceChanged(SharedPreferences,
|
|
||||||
* String)} when the key is null.
|
* String)} when the key is null.
|
||||||
*/
|
*/
|
||||||
public void testOnSharedPreferenceChanged_nullKey() {
|
public void testOnSharedPreferenceChanged_nullKey() {
|
||||||
DynamicSpeedTrackPathDescriptor dynamicSpeedTrackPathDescriptor = new DynamicSpeedTrackPathDescriptor(
|
DynamicSpeedTrackPathDescriptor dynamicSpeedTrackPathDescriptor = new DynamicSpeedTrackPathDescriptor(
|
||||||
context);
|
context);
|
||||||
int speedMargin = dynamicSpeedTrackPathDescriptor.getSpeedMargin(sharedPreferences);
|
int speedMargin = dynamicSpeedTrackPathDescriptor.getSpeedMargin();
|
||||||
// Change value in shared preferences.
|
// Change value in shared preferences.
|
||||||
sharedPreferencesEditor.putString(
|
PreferencesUtils.setInt(context, R.string.track_color_mode_percentage_key, speedMargin + 2);
|
||||||
context.getString(R.string.track_color_mode_dynamic_speed_variation_key),
|
|
||||||
Integer.toString(speedMargin + 2));
|
|
||||||
sharedPreferencesEditor.commit();
|
|
||||||
|
|
||||||
dynamicSpeedTrackPathDescriptor.onSharedPreferenceChanged(sharedPreferences, null);
|
dynamicSpeedTrackPathDescriptor.onSharedPreferenceChanged(sharedPreferences, null);
|
||||||
assertEquals(speedMargin, dynamicSpeedTrackPathDescriptor.getSpeedMargin());
|
assertEquals(speedMargin, dynamicSpeedTrackPathDescriptor.getSpeedMargin());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Tests {@link
|
* Tests {@link DynamicSpeedTrackPathDescriptor#onSharedPreferenceChanged(SharedPreferences,
|
||||||
* DynamicSpeedTrackPathDescriptor#onSharedPreferenceChanged(SharedPreferences,
|
|
||||||
* String)} when the key is not null, and not trackColorModeDynamicVariation.
|
* String)} when the key is not null, and not trackColorModeDynamicVariation.
|
||||||
*/
|
*/
|
||||||
public void testOnSharedPreferenceChanged_otherKey() {
|
public void testOnSharedPreferenceChanged_otherKey() {
|
||||||
DynamicSpeedTrackPathDescriptor dynamicSpeedTrackPathDescriptor = new DynamicSpeedTrackPathDescriptor(
|
DynamicSpeedTrackPathDescriptor dynamicSpeedTrackPathDescriptor = new DynamicSpeedTrackPathDescriptor(
|
||||||
context);
|
context);
|
||||||
int speedMargin = dynamicSpeedTrackPathDescriptor.getSpeedMargin(sharedPreferences);
|
int speedMargin = dynamicSpeedTrackPathDescriptor.getSpeedMargin();
|
||||||
// Change value in shared preferences.
|
// Change value in shared preferences.
|
||||||
sharedPreferencesEditor.putString(
|
PreferencesUtils.setInt(context, R.string.track_color_mode_percentage_key, speedMargin + 2);
|
||||||
context.getString(R.string.track_color_mode_dynamic_speed_variation_key),
|
|
||||||
Integer.toString(speedMargin + 2));
|
|
||||||
sharedPreferencesEditor.commit();
|
|
||||||
|
|
||||||
dynamicSpeedTrackPathDescriptor.onSharedPreferenceChanged(sharedPreferences, "anyKey");
|
dynamicSpeedTrackPathDescriptor.onSharedPreferenceChanged(sharedPreferences, "anyKey");
|
||||||
assertEquals(speedMargin, dynamicSpeedTrackPathDescriptor.getSpeedMargin());
|
assertEquals(speedMargin, dynamicSpeedTrackPathDescriptor.getSpeedMargin());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Tests {@link
|
* Tests {@link DynamicSpeedTrackPathDescriptor#onSharedPreferenceChanged(SharedPreferences,
|
||||||
* DynamicSpeedTrackPathDescriptor#onSharedPreferenceChanged(SharedPreferences,
|
|
||||||
* String)} when the key is trackColorModeDynamicVariation.
|
* String)} when the key is trackColorModeDynamicVariation.
|
||||||
*/
|
*/
|
||||||
public void testOnSharedPreferenceChanged_trackColorModeDynamicVariationKey() {
|
public void testOnSharedPreferenceChanged_trackColorModeDynamicVariationKey() {
|
||||||
DynamicSpeedTrackPathDescriptor dynamicSpeedTrackPathDescriptor = new DynamicSpeedTrackPathDescriptor(
|
DynamicSpeedTrackPathDescriptor dynamicSpeedTrackPathDescriptor = new DynamicSpeedTrackPathDescriptor(
|
||||||
context);
|
context);
|
||||||
int speedMargin = dynamicSpeedTrackPathDescriptor.getSpeedMargin(sharedPreferences);
|
int speedMargin = dynamicSpeedTrackPathDescriptor.getSpeedMargin();
|
||||||
// Change value in shared preferences.
|
// Change value in shared preferences.
|
||||||
sharedPreferencesEditor.putString(
|
PreferencesUtils.setInt(context, R.string.track_color_mode_percentage_key, speedMargin + 2);
|
||||||
"trackColorModeDynamicVariation",
|
|
||||||
Integer.toString(speedMargin + 2));
|
|
||||||
sharedPreferencesEditor.commit();
|
|
||||||
|
|
||||||
dynamicSpeedTrackPathDescriptor.onSharedPreferenceChanged(sharedPreferences,
|
dynamicSpeedTrackPathDescriptor.onSharedPreferenceChanged(sharedPreferences,
|
||||||
"trackColorModeDynamicVariation");
|
PreferencesUtils.getKey(context, R.string.track_color_mode_percentage_key));
|
||||||
assertEquals(speedMargin + 2, dynamicSpeedTrackPathDescriptor.getSpeedMargin());
|
assertEquals(speedMargin + 2, dynamicSpeedTrackPathDescriptor.getSpeedMargin());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Tests {@link
|
* Tests {@link DynamicSpeedTrackPathDescriptor#onSharedPreferenceChanged(SharedPreferences,
|
||||||
* DynamicSpeedTrackPathDescriptor#onSharedPreferenceChanged(SharedPreferences,
|
* String)} when the values of speedMargin is the default value.
|
||||||
* String)} when the values of speedMargin is "".
|
|
||||||
*/
|
*/
|
||||||
public void testOnSharedPreferenceChanged_emptyValue() {
|
public void testOnSharedPreferenceChanged_defaultValue() {
|
||||||
DynamicSpeedTrackPathDescriptor dynamicSpeedTrackPathDescriptor = new DynamicSpeedTrackPathDescriptor(
|
DynamicSpeedTrackPathDescriptor dynamicSpeedTrackPathDescriptor = new DynamicSpeedTrackPathDescriptor(
|
||||||
context);
|
context);
|
||||||
// Change value in shared preferences
|
// Change value in shared preferences
|
||||||
sharedPreferencesEditor.putString(
|
PreferencesUtils.setInt(context, R.string.track_color_mode_percentage_key,
|
||||||
context.getString(R.string.track_color_mode_dynamic_speed_variation_key), "");
|
PreferencesUtils.TRACK_COLOR_MODE_PERCENTAGE_DEFAULT);
|
||||||
sharedPreferencesEditor.commit();
|
|
||||||
|
|
||||||
dynamicSpeedTrackPathDescriptor.onSharedPreferenceChanged(sharedPreferences,
|
dynamicSpeedTrackPathDescriptor.onSharedPreferenceChanged(sharedPreferences,
|
||||||
context.getString(R.string.track_color_mode_dynamic_speed_variation_key));
|
PreferencesUtils.getKey(context, R.string.track_color_mode_percentage_key));
|
||||||
// The default value of speedMargin is 25.
|
// The default value of speedMargin is 25.
|
||||||
assertEquals(25, dynamicSpeedTrackPathDescriptor.getSpeedMargin());
|
assertEquals(PreferencesUtils.TRACK_COLOR_MODE_PERCENTAGE_DEFAULT,
|
||||||
|
dynamicSpeedTrackPathDescriptor.getSpeedMargin());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -145,7 +124,8 @@ public class DynamicSpeedTrackPathDescriptorTest extends AndroidTestCase {
|
|||||||
* id.
|
* id.
|
||||||
*/
|
*/
|
||||||
public void testNeedsRedraw_WrongTrackId() {
|
public void testNeedsRedraw_WrongTrackId() {
|
||||||
PreferencesUtils.setSelectedTrackId(context, -1L);
|
PreferencesUtils.setLong(
|
||||||
|
context, R.string.selected_track_id_key, PreferencesUtils.SELECTED_TRACK_ID_DEFAULT);
|
||||||
DynamicSpeedTrackPathDescriptor dynamicSpeedTrackPathDescriptor = new DynamicSpeedTrackPathDescriptor(
|
DynamicSpeedTrackPathDescriptor dynamicSpeedTrackPathDescriptor = new DynamicSpeedTrackPathDescriptor(
|
||||||
context);
|
context);
|
||||||
assertEquals(false, dynamicSpeedTrackPathDescriptor.needsRedraw());
|
assertEquals(false, dynamicSpeedTrackPathDescriptor.needsRedraw());
|
||||||
@@ -160,9 +140,9 @@ public class DynamicSpeedTrackPathDescriptorTest extends AndroidTestCase {
|
|||||||
context);
|
context);
|
||||||
double[] averageMovingSpeeds = { 0, 30, 30, 30 };
|
double[] averageMovingSpeeds = { 0, 30, 30, 30 };
|
||||||
double[] newAverageMovingSpeed = { 20, 30,
|
double[] newAverageMovingSpeed = { 20, 30,
|
||||||
// Difference is less than CRITICAL_DIFFERENCE_PERCENTAGE
|
// Difference is less than CRITICAL_DIFFERENCE_PERCENTAGE
|
||||||
30 * (1 + (DynamicSpeedTrackPathDescriptor.CRITICAL_DIFFERENCE_PERCENTAGE / 100) / 2),
|
30 * (1 + (DynamicSpeedTrackPathDescriptor.CRITICAL_DIFFERENCE_PERCENTAGE / 100) / 2),
|
||||||
// Difference is more than CRITICAL_DIFFERENCE_PERCENTAGE
|
// Difference is more than CRITICAL_DIFFERENCE_PERCENTAGE
|
||||||
30 * (1 + (DynamicSpeedTrackPathDescriptor.CRITICAL_DIFFERENCE_PERCENTAGE / 100.00) * 2) };
|
30 * (1 + (DynamicSpeedTrackPathDescriptor.CRITICAL_DIFFERENCE_PERCENTAGE / 100.00) * 2) };
|
||||||
boolean[] expectedValues = { true, false, false, true };
|
boolean[] expectedValues = { true, false, false, true };
|
||||||
double[] expectedAverageMovingSpeed = { 20, 30, 30,
|
double[] expectedAverageMovingSpeed = { 20, 30, 30,
|
||||||
@@ -172,8 +152,8 @@ public class DynamicSpeedTrackPathDescriptorTest extends AndroidTestCase {
|
|||||||
dynamicSpeedTrackPathDescriptor.setAverageMovingSpeed(averageMovingSpeeds[i]);
|
dynamicSpeedTrackPathDescriptor.setAverageMovingSpeed(averageMovingSpeeds[i]);
|
||||||
assertEquals(expectedValues[i], dynamicSpeedTrackPathDescriptor.isDifferenceSignificant(
|
assertEquals(expectedValues[i], dynamicSpeedTrackPathDescriptor.isDifferenceSignificant(
|
||||||
averageMovingSpeeds[i], newAverageMovingSpeed[i]));
|
averageMovingSpeeds[i], newAverageMovingSpeed[i]));
|
||||||
assertEquals(expectedAverageMovingSpeed[i],
|
assertEquals(
|
||||||
dynamicSpeedTrackPathDescriptor.getAverageMovingSpeed());
|
expectedAverageMovingSpeed[i], dynamicSpeedTrackPathDescriptor.getAverageMovingSpeed());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -16,52 +16,42 @@
|
|||||||
package com.google.android.apps.mytracks.maps;
|
package com.google.android.apps.mytracks.maps;
|
||||||
|
|
||||||
import com.google.android.apps.mytracks.Constants;
|
import com.google.android.apps.mytracks.Constants;
|
||||||
|
import com.google.android.apps.mytracks.util.PreferencesUtils;
|
||||||
import com.google.android.maps.mytracks.R;
|
import com.google.android.maps.mytracks.R;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.SharedPreferences;
|
import android.content.SharedPreferences;
|
||||||
import android.content.SharedPreferences.Editor;
|
|
||||||
import android.test.AndroidTestCase;
|
import android.test.AndroidTestCase;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Tests for the {@link DynamicSpeedTrackPathDescriptor}.
|
* Tests for the {@link DynamicSpeedTrackPathDescriptor}.
|
||||||
*
|
*
|
||||||
* @author Youtao Liu
|
* @author Youtao Liu
|
||||||
*/
|
*/
|
||||||
public class FixedSpeedTrackPathDescriptorTest extends AndroidTestCase {
|
public class FixedSpeedTrackPathDescriptorTest extends AndroidTestCase {
|
||||||
|
|
||||||
private Context context;
|
private Context context;
|
||||||
private SharedPreferences sharedPreferences;
|
private SharedPreferences sharedPreferences;
|
||||||
private Editor sharedPreferencesEditor;
|
|
||||||
private int slowDefault;
|
|
||||||
private int normalDefault;
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void setUp() throws Exception {
|
protected void setUp() throws Exception {
|
||||||
super.setUp();
|
super.setUp();
|
||||||
context = getContext();
|
context = getContext();
|
||||||
sharedPreferences = context.getSharedPreferences(Constants.SETTINGS_NAME, Context.MODE_PRIVATE);
|
sharedPreferences = context.getSharedPreferences(Constants.SETTINGS_NAME, Context.MODE_PRIVATE);
|
||||||
sharedPreferencesEditor = sharedPreferences.edit();
|
|
||||||
// Get the default value
|
|
||||||
slowDefault = 9;
|
|
||||||
normalDefault = 15;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Tests the initialization of slowSpeed and normalSpeed in {@link
|
* Tests the initialization of slowSpeed and normalSpeed in {@link DynamicSpeedTrackPathDescriptor#DynamicSpeedTrackPathDescriptor(Context)}
|
||||||
* DynamicSpeedTrackPathDescriptor#DynamicSpeedTrackPathDescriptor(Context)}.
|
* .
|
||||||
*/
|
*/
|
||||||
public void testConstructor() {
|
public void testConstructor() {
|
||||||
String[] slowSpeedsInShPre = { "0", "1", "99", "" };
|
int[] slowSpeedExpectations = { 0, 1, 99, PreferencesUtils.TRACK_COLOR_MODE_SLOW_DEFAULT };
|
||||||
int[] slowSpeedExpectations = { 0, 1, 99, slowDefault };
|
int[] normalSpeedExpectations = { 0, 1, 99, PreferencesUtils.TRACK_COLOR_MODE_MEDIUM_DEFAULT };
|
||||||
String[] normalSpeedsInShPre = { "0", "1", "99", "" };
|
for (int i = 0; i < slowSpeedExpectations.length; i++) {
|
||||||
int[] normalSpeedExpectations = { 0, 1, 99, normalDefault };
|
PreferencesUtils.setInt(
|
||||||
for (int i = 0; i < slowSpeedsInShPre.length; i++) {
|
context, R.string.track_color_mode_slow_key, slowSpeedExpectations[i]);
|
||||||
sharedPreferencesEditor.putString(
|
PreferencesUtils.setInt(
|
||||||
context.getString(R.string.track_color_mode_fixed_speed_slow_key), slowSpeedsInShPre[i]);
|
context, R.string.track_color_mode_medium_key, normalSpeedExpectations[i]);
|
||||||
sharedPreferencesEditor.putString(
|
|
||||||
context.getString(R.string.track_color_mode_fixed_speed_medium_key),
|
|
||||||
normalSpeedsInShPre[i]);
|
|
||||||
sharedPreferencesEditor.commit();
|
|
||||||
FixedSpeedTrackPathDescriptor fixedSpeedTrackPathDescriptor = new FixedSpeedTrackPathDescriptor(
|
FixedSpeedTrackPathDescriptor fixedSpeedTrackPathDescriptor = new FixedSpeedTrackPathDescriptor(
|
||||||
context);
|
context);
|
||||||
assertEquals(slowSpeedExpectations[i], fixedSpeedTrackPathDescriptor.getSlowSpeed());
|
assertEquals(slowSpeedExpectations[i], fixedSpeedTrackPathDescriptor.getSlowSpeed());
|
||||||
@@ -70,8 +60,7 @@ public class FixedSpeedTrackPathDescriptorTest extends AndroidTestCase {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Tests {@link
|
* Tests {@link DynamicSpeedTrackPathDescriptor#onSharedPreferenceChanged(SharedPreferences,
|
||||||
* DynamicSpeedTrackPathDescriptor#onSharedPreferenceChanged(SharedPreferences,
|
|
||||||
* String)} when the key is null.
|
* String)} when the key is null.
|
||||||
*/
|
*/
|
||||||
public void testOnSharedPreferenceChanged_null_key() {
|
public void testOnSharedPreferenceChanged_null_key() {
|
||||||
@@ -80,22 +69,15 @@ public class FixedSpeedTrackPathDescriptorTest extends AndroidTestCase {
|
|||||||
int slowSpeed = fixedSpeedTrackPathDescriptor.getSlowSpeed();
|
int slowSpeed = fixedSpeedTrackPathDescriptor.getSlowSpeed();
|
||||||
int normalSpeed = fixedSpeedTrackPathDescriptor.getNormalSpeed();
|
int normalSpeed = fixedSpeedTrackPathDescriptor.getNormalSpeed();
|
||||||
// Change value in shared preferences
|
// Change value in shared preferences
|
||||||
sharedPreferencesEditor.putString(
|
PreferencesUtils.setInt(context, R.string.track_color_mode_slow_key, slowSpeed + 2);
|
||||||
context.getString(R.string.track_color_mode_fixed_speed_slow_key),
|
PreferencesUtils.setInt(context, R.string.track_color_mode_medium_key, normalSpeed + 2);
|
||||||
Integer.toString(slowSpeed + 2));
|
|
||||||
sharedPreferencesEditor.putString(
|
|
||||||
context.getString(R.string.track_color_mode_fixed_speed_medium_key),
|
|
||||||
Integer.toString(normalSpeed + 2));
|
|
||||||
sharedPreferencesEditor.commit();
|
|
||||||
|
|
||||||
fixedSpeedTrackPathDescriptor.onSharedPreferenceChanged(sharedPreferences, null);
|
fixedSpeedTrackPathDescriptor.onSharedPreferenceChanged(sharedPreferences, null);
|
||||||
assertEquals(slowSpeed, fixedSpeedTrackPathDescriptor.getSlowSpeed());
|
assertEquals(slowSpeed, fixedSpeedTrackPathDescriptor.getSlowSpeed());
|
||||||
assertEquals(normalSpeed, fixedSpeedTrackPathDescriptor.getNormalSpeed());
|
assertEquals(normalSpeed, fixedSpeedTrackPathDescriptor.getNormalSpeed());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Tests {@link
|
* Tests {@link DynamicSpeedTrackPathDescriptor#onSharedPreferenceChanged(SharedPreferences,
|
||||||
* DynamicSpeedTrackPathDescriptor#onSharedPreferenceChanged(SharedPreferences,
|
|
||||||
* String)} when the key is not null, and not slowSpeed and not normalSpeed.
|
* String)} when the key is not null, and not slowSpeed and not normalSpeed.
|
||||||
*/
|
*/
|
||||||
public void testOnSharedPreferenceChanged_other_key() {
|
public void testOnSharedPreferenceChanged_other_key() {
|
||||||
@@ -104,84 +86,59 @@ public class FixedSpeedTrackPathDescriptorTest extends AndroidTestCase {
|
|||||||
int slowSpeed = fixedSpeedTrackPathDescriptor.getSlowSpeed();
|
int slowSpeed = fixedSpeedTrackPathDescriptor.getSlowSpeed();
|
||||||
int normalSpeed = fixedSpeedTrackPathDescriptor.getNormalSpeed();
|
int normalSpeed = fixedSpeedTrackPathDescriptor.getNormalSpeed();
|
||||||
// Change value in shared preferences
|
// Change value in shared preferences
|
||||||
sharedPreferencesEditor.putString(
|
PreferencesUtils.setInt(context, R.string.track_color_mode_slow_key, slowSpeed + 2);
|
||||||
context.getString(R.string.track_color_mode_fixed_speed_slow_key),
|
PreferencesUtils.setInt(context, R.string.track_color_mode_medium_key, normalSpeed + 2);
|
||||||
Integer.toString(slowSpeed + 2));
|
|
||||||
sharedPreferencesEditor.putString(
|
|
||||||
context.getString(R.string.track_color_mode_fixed_speed_medium_key),
|
|
||||||
Integer.toString(normalSpeed + 2));
|
|
||||||
sharedPreferencesEditor.commit();
|
|
||||||
fixedSpeedTrackPathDescriptor.onSharedPreferenceChanged(sharedPreferences, "anyKey");
|
fixedSpeedTrackPathDescriptor.onSharedPreferenceChanged(sharedPreferences, "anyKey");
|
||||||
assertEquals(slowSpeed, fixedSpeedTrackPathDescriptor.getSlowSpeed());
|
assertEquals(slowSpeed, fixedSpeedTrackPathDescriptor.getSlowSpeed());
|
||||||
assertEquals(normalSpeed, fixedSpeedTrackPathDescriptor.getNormalSpeed());
|
assertEquals(normalSpeed, fixedSpeedTrackPathDescriptor.getNormalSpeed());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Tests {@link
|
* Tests {@link DynamicSpeedTrackPathDescriptor#onSharedPreferenceChanged(SharedPreferences,
|
||||||
* DynamicSpeedTrackPathDescriptor#onSharedPreferenceChanged(SharedPreferences,
|
|
||||||
* String)} when the key is slowSpeed.
|
* String)} when the key is slowSpeed.
|
||||||
*/
|
*/
|
||||||
public void testOnSharedPreferenceChanged_slowSpeedKey() {
|
public void testOnSharedPreferenceChanged_slowSpeedKey() {
|
||||||
FixedSpeedTrackPathDescriptor fixedSpeedTrackPathDescriptor = new FixedSpeedTrackPathDescriptor(
|
FixedSpeedTrackPathDescriptor fixedSpeedTrackPathDescriptor = new FixedSpeedTrackPathDescriptor(
|
||||||
context);
|
context);
|
||||||
int slowSpeed = fixedSpeedTrackPathDescriptor.getSlowSpeed();
|
int slowSpeed = fixedSpeedTrackPathDescriptor.getSlowSpeed();
|
||||||
int normalSpeed = fixedSpeedTrackPathDescriptor.getNormalSpeed();
|
|
||||||
// Change value in shared preferences
|
// Change value in shared preferences
|
||||||
sharedPreferencesEditor.putString(
|
PreferencesUtils.setInt(context, R.string.track_color_mode_slow_key, slowSpeed + 2);
|
||||||
context.getString(R.string.track_color_mode_fixed_speed_slow_key),
|
fixedSpeedTrackPathDescriptor.onSharedPreferenceChanged(
|
||||||
Integer.toString(slowSpeed + 2));
|
sharedPreferences, context.getString(R.string.track_color_mode_slow_key));
|
||||||
sharedPreferencesEditor.putString(
|
|
||||||
context.getString(R.string.track_color_mode_fixed_speed_medium_key),
|
|
||||||
Integer.toString(normalSpeed + 2));
|
|
||||||
sharedPreferencesEditor.commit();
|
|
||||||
fixedSpeedTrackPathDescriptor.onSharedPreferenceChanged(sharedPreferences,
|
|
||||||
context.getString(R.string.track_color_mode_fixed_speed_slow_key));
|
|
||||||
assertEquals(slowSpeed + 2, fixedSpeedTrackPathDescriptor.getSlowSpeed());
|
assertEquals(slowSpeed + 2, fixedSpeedTrackPathDescriptor.getSlowSpeed());
|
||||||
assertEquals(normalSpeed + 2, fixedSpeedTrackPathDescriptor.getNormalSpeed());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Tests {@link
|
* Tests {@link DynamicSpeedTrackPathDescriptor#onSharedPreferenceChanged(SharedPreferences,
|
||||||
* DynamicSpeedTrackPathDescriptor#onSharedPreferenceChanged(SharedPreferences,
|
|
||||||
* String)} when the key is normalSpeed.
|
* String)} when the key is normalSpeed.
|
||||||
*/
|
*/
|
||||||
public void testOnSharedPreferenceChanged_normalSpeedKey() {
|
public void testOnSharedPreferenceChanged_normalSpeedKey() {
|
||||||
FixedSpeedTrackPathDescriptor fixedSpeedTrackPathDescriptor = new FixedSpeedTrackPathDescriptor(
|
FixedSpeedTrackPathDescriptor fixedSpeedTrackPathDescriptor = new FixedSpeedTrackPathDescriptor(
|
||||||
context);
|
context);
|
||||||
int slowSpeed = fixedSpeedTrackPathDescriptor.getSlowSpeed();
|
|
||||||
int normalSpeed = fixedSpeedTrackPathDescriptor.getNormalSpeed();
|
int normalSpeed = fixedSpeedTrackPathDescriptor.getNormalSpeed();
|
||||||
sharedPreferencesEditor.putString(
|
PreferencesUtils.setInt(context, R.string.track_color_mode_medium_key, normalSpeed + 4);
|
||||||
context.getString(R.string.track_color_mode_fixed_speed_slow_key),
|
fixedSpeedTrackPathDescriptor.onSharedPreferenceChanged(
|
||||||
Integer.toString(slowSpeed + 4));
|
sharedPreferences, context.getString(R.string.track_color_mode_medium_key));
|
||||||
sharedPreferencesEditor.putString(
|
|
||||||
context.getString(R.string.track_color_mode_fixed_speed_medium_key),
|
|
||||||
Integer.toString(normalSpeed + 4));
|
|
||||||
sharedPreferencesEditor.commit();
|
|
||||||
|
|
||||||
fixedSpeedTrackPathDescriptor.onSharedPreferenceChanged(sharedPreferences,
|
|
||||||
context.getString(R.string.track_color_mode_fixed_speed_medium_key));
|
|
||||||
assertEquals(slowSpeed + 4, fixedSpeedTrackPathDescriptor.getSlowSpeed());
|
|
||||||
assertEquals(normalSpeed + 4, fixedSpeedTrackPathDescriptor.getNormalSpeed());
|
assertEquals(normalSpeed + 4, fixedSpeedTrackPathDescriptor.getNormalSpeed());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Tests {@link
|
* Tests {@link DynamicSpeedTrackPathDescriptor#onSharedPreferenceChanged(SharedPreferences,
|
||||||
* DynamicSpeedTrackPathDescriptor#onSharedPreferenceChanged(SharedPreferences,
|
|
||||||
* String)} when the values of slowSpeed and normalSpeed in SharedPreference
|
* String)} when the values of slowSpeed and normalSpeed in SharedPreference
|
||||||
* is "". In such situation, the default value should get returned.
|
* are the default values.
|
||||||
*/
|
*/
|
||||||
public void testOnSharedPreferenceChanged_emptyValue() {
|
public void testOnSharedPreferenceChanged_defaultValue() {
|
||||||
FixedSpeedTrackPathDescriptor fixedSpeedTrackPathDescriptor = new FixedSpeedTrackPathDescriptor(
|
FixedSpeedTrackPathDescriptor fixedSpeedTrackPathDescriptor = new FixedSpeedTrackPathDescriptor(
|
||||||
context);
|
context);
|
||||||
sharedPreferencesEditor.putString(
|
PreferencesUtils.setInt(context, R.string.track_color_mode_slow_key,
|
||||||
context.getString(R.string.track_color_mode_fixed_speed_slow_key), "");
|
PreferencesUtils.TRACK_COLOR_MODE_SLOW_DEFAULT);
|
||||||
sharedPreferencesEditor.putString(
|
PreferencesUtils.setInt(context, R.string.track_color_mode_medium_key,
|
||||||
context.getString(R.string.track_color_mode_fixed_speed_medium_key), "");
|
PreferencesUtils.TRACK_COLOR_MODE_MEDIUM_DEFAULT);
|
||||||
sharedPreferencesEditor.commit();
|
fixedSpeedTrackPathDescriptor.onSharedPreferenceChanged(
|
||||||
|
sharedPreferences, context.getString(R.string.track_color_mode_medium_key));
|
||||||
fixedSpeedTrackPathDescriptor.onSharedPreferenceChanged(sharedPreferences,
|
assertEquals(PreferencesUtils.TRACK_COLOR_MODE_SLOW_DEFAULT,
|
||||||
context.getString(R.string.track_color_mode_fixed_speed_medium_key));
|
fixedSpeedTrackPathDescriptor.getSlowSpeed());
|
||||||
assertEquals(slowDefault, fixedSpeedTrackPathDescriptor.getSlowSpeed());
|
assertEquals(PreferencesUtils.TRACK_COLOR_MODE_MEDIUM_DEFAULT,
|
||||||
assertEquals(normalDefault, fixedSpeedTrackPathDescriptor.getNormalSpeed());
|
fixedSpeedTrackPathDescriptor.getNormalSpeed());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -15,11 +15,10 @@
|
|||||||
*/
|
*/
|
||||||
package com.google.android.apps.mytracks.maps;
|
package com.google.android.apps.mytracks.maps;
|
||||||
|
|
||||||
import com.google.android.apps.mytracks.Constants;
|
import com.google.android.apps.mytracks.util.PreferencesUtils;
|
||||||
import com.google.android.maps.mytracks.R;
|
import com.google.android.maps.mytracks.R;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.SharedPreferences;
|
|
||||||
import android.location.Location;
|
import android.location.Location;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -41,25 +40,20 @@ public class TrackPathPainterFactoryTest extends TrackPathPainterTestCase {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Context context = getContext();
|
Context context = getContext();
|
||||||
SharedPreferences prefs = context.getSharedPreferences(
|
|
||||||
Constants.SETTINGS_NAME, Context.MODE_PRIVATE);
|
|
||||||
if (prefs == null) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
testTrackPathPainterFactorySpecific(context, prefs, R.string.display_track_color_value_none,
|
testTrackPathPainterFactorySpecific(context,
|
||||||
SingleColorTrackPathPainter.class);
|
R.string.settings_map_track_color_mode_single_value, SingleColorTrackPathPainter.class);
|
||||||
testTrackPathPainterFactorySpecific(context, prefs, R.string.display_track_color_value_fixed,
|
testTrackPathPainterFactorySpecific(context, R.string.settings_map_track_color_mode_fixed_value,
|
||||||
DynamicSpeedTrackPathPainter.class);
|
|
||||||
testTrackPathPainterFactorySpecific(context, prefs, R.string.display_track_color_value_dynamic,
|
|
||||||
DynamicSpeedTrackPathPainter.class);
|
DynamicSpeedTrackPathPainter.class);
|
||||||
|
testTrackPathPainterFactorySpecific(context,
|
||||||
|
R.string.settings_map_track_color_mode_dynamic_value, DynamicSpeedTrackPathPainter.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
private <T> void testTrackPathPainterFactorySpecific(Context context, SharedPreferences prefs,
|
private <T> void testTrackPathPainterFactorySpecific(
|
||||||
int track_color_mode, Class <?> c) {
|
Context context, int track_color_mode, Class<?> c) {
|
||||||
prefs.edit().putString(context.getString(R.string.track_color_mode_key),
|
PreferencesUtils.setString(
|
||||||
context.getString(track_color_mode)).apply();
|
context, R.string.track_color_mode_key, context.getString(track_color_mode));
|
||||||
|
|
||||||
int startLocationIdx = 0;
|
int startLocationIdx = 0;
|
||||||
Boolean alwaysVisible = true;
|
Boolean alwaysVisible = true;
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,76 @@
|
|||||||
|
/*
|
||||||
|
* 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.services;
|
||||||
|
|
||||||
|
import junit.framework.TestCase;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests the {@link AdaptiveLocationListenerPolicy}.
|
||||||
|
*
|
||||||
|
* @author youtaol
|
||||||
|
*/
|
||||||
|
public class AdaptiveLocationListenerPolicyTest extends TestCase {
|
||||||
|
|
||||||
|
private AdaptiveLocationListenerPolicy adocationListenerPolicy;
|
||||||
|
private static final long MIN = 1000;
|
||||||
|
private static final long MAX = 3000;
|
||||||
|
private static final int MIN_DISTANCE = 10;
|
||||||
|
private static final long NEW_IDLE_TIME_BIG = 10000;
|
||||||
|
private static final long NEW_IDLE_TIME_NORMAL = 5000;
|
||||||
|
private static final long NEW_IDLE_TIME_SMALL = 2000;
|
||||||
|
private static final long NEW_IDLE_TIME_LESS_THAN_MIN = 500;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void setUp() throws Exception {
|
||||||
|
super.setUp();
|
||||||
|
adocationListenerPolicy = new AdaptiveLocationListenerPolicy(MIN, MAX, MIN_DISTANCE);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests the
|
||||||
|
* {@link AdaptiveLocationListenerPolicy#getDesiredPollingInterval()} in four
|
||||||
|
* situations.
|
||||||
|
* <ul>
|
||||||
|
* <li>The newIdleTime is bigger than max interval.</li>
|
||||||
|
* <li>The newIdleTime is between min and max interval.</li>
|
||||||
|
* <li>The newIdleTime is smaller than max interval.</li>
|
||||||
|
* <li>The newIdleTime is smaller than the smallest interval unit.</li>
|
||||||
|
* </ul>
|
||||||
|
*/
|
||||||
|
public void testGetDesiredPollingInterval() {
|
||||||
|
adocationListenerPolicy.updateIdleTime(NEW_IDLE_TIME_BIG);
|
||||||
|
assertEquals(MAX, adocationListenerPolicy.getDesiredPollingInterval());
|
||||||
|
|
||||||
|
adocationListenerPolicy.updateIdleTime(NEW_IDLE_TIME_NORMAL);
|
||||||
|
// First get the half of NEW_IDLE_TIME_NORMAL, and then round it to the
|
||||||
|
// nearest second.
|
||||||
|
assertEquals((NEW_IDLE_TIME_NORMAL / 2 / 1000) * 1000,
|
||||||
|
adocationListenerPolicy.getDesiredPollingInterval());
|
||||||
|
|
||||||
|
adocationListenerPolicy.updateIdleTime(NEW_IDLE_TIME_SMALL);
|
||||||
|
assertEquals(MIN, adocationListenerPolicy.getDesiredPollingInterval());
|
||||||
|
|
||||||
|
adocationListenerPolicy.updateIdleTime(NEW_IDLE_TIME_LESS_THAN_MIN);
|
||||||
|
assertEquals(MIN, adocationListenerPolicy.getDesiredPollingInterval());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests the method {@link AdaptiveLocationListenerPolicy#getMinDistance()}.
|
||||||
|
*/
|
||||||
|
public void testGetMinDistance() {
|
||||||
|
assertEquals(MIN_DISTANCE, adocationListenerPolicy.getMinDistance());
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,105 @@
|
|||||||
|
/*
|
||||||
|
* 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.services;
|
||||||
|
|
||||||
|
import com.google.android.maps.mytracks.R;
|
||||||
|
import com.google.android.testing.mocking.UsesMocks;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.os.RemoteException;
|
||||||
|
import android.test.ServiceTestCase;
|
||||||
|
|
||||||
|
import org.easymock.EasyMock;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests {@link ControlRecordingService}.
|
||||||
|
*
|
||||||
|
* @author Youtao Liu
|
||||||
|
*/
|
||||||
|
public class ControlRecordingServiceTest extends ServiceTestCase<ControlRecordingService> {
|
||||||
|
|
||||||
|
private Context context;
|
||||||
|
private ControlRecordingService controlRecordingService;
|
||||||
|
|
||||||
|
public ControlRecordingServiceTest() {
|
||||||
|
super(ControlRecordingService.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void setUp() throws Exception {
|
||||||
|
super.setUp();
|
||||||
|
context = getContext();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests the start of {@link ControlRecordingService} and tests the method
|
||||||
|
* {@link ControlRecordingService#onHandleIntent(Intent, ITrackRecordingService)}
|
||||||
|
* to start a track recording.
|
||||||
|
*/
|
||||||
|
@UsesMocks(ITrackRecordingService.class)
|
||||||
|
public void testStartRecording() {
|
||||||
|
assertNull(controlRecordingService);
|
||||||
|
Intent intent = startControlRecordingService(context.getString(R.string.track_action_start));
|
||||||
|
assertNotNull(controlRecordingService);
|
||||||
|
|
||||||
|
ITrackRecordingService iTrackRecordingServiceMock = EasyMock
|
||||||
|
.createStrictMock(ITrackRecordingService.class);
|
||||||
|
try {
|
||||||
|
EasyMock.expect(iTrackRecordingServiceMock.startNewTrack()).andReturn(1L);
|
||||||
|
EasyMock.replay(iTrackRecordingServiceMock);
|
||||||
|
controlRecordingService.onHandleIntent(intent, iTrackRecordingServiceMock);
|
||||||
|
EasyMock.verify(iTrackRecordingServiceMock);
|
||||||
|
} catch (RemoteException e) {
|
||||||
|
fail();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests the method
|
||||||
|
* {@link ControlRecordingService#onHandleIntent(Intent, ITrackRecordingService)}
|
||||||
|
* to stop a track recording.
|
||||||
|
*/
|
||||||
|
@UsesMocks(ITrackRecordingService.class)
|
||||||
|
public void testStopRecording() {
|
||||||
|
Intent intent = startControlRecordingService(context.getString(R.string.track_action_end));
|
||||||
|
|
||||||
|
ITrackRecordingService iTrackRecordingServiceMock = EasyMock
|
||||||
|
.createStrictMock(ITrackRecordingService.class);
|
||||||
|
try {
|
||||||
|
iTrackRecordingServiceMock.endCurrentTrack();
|
||||||
|
EasyMock.replay(iTrackRecordingServiceMock);
|
||||||
|
controlRecordingService.onHandleIntent(intent, iTrackRecordingServiceMock);
|
||||||
|
EasyMock.verify(iTrackRecordingServiceMock);
|
||||||
|
} catch (RemoteException e) {
|
||||||
|
fail();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Starts a ControlRecordingService with a specified action.
|
||||||
|
*
|
||||||
|
* @param action the action string in the start intent
|
||||||
|
*/
|
||||||
|
private Intent startControlRecordingService(String action) {
|
||||||
|
Intent intent = new Intent(context, ControlRecordingService.class);
|
||||||
|
intent.setAction(action);
|
||||||
|
startService(intent);
|
||||||
|
controlRecordingService = getService();
|
||||||
|
return intent;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -34,7 +34,6 @@ import android.content.ContextWrapper;
|
|||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.content.IntentFilter;
|
import android.content.IntentFilter;
|
||||||
import android.content.SharedPreferences;
|
import android.content.SharedPreferences;
|
||||||
import android.content.SharedPreferences.Editor;
|
|
||||||
import android.database.Cursor;
|
import android.database.Cursor;
|
||||||
import android.location.Location;
|
import android.location.Location;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
@@ -66,7 +65,6 @@ public class TrackRecordingServiceTest extends ServiceTestCase<TestRecordingServ
|
|||||||
|
|
||||||
private Context context;
|
private Context context;
|
||||||
private MyTracksProviderUtils providerUtils;
|
private MyTracksProviderUtils providerUtils;
|
||||||
private SharedPreferences sharedPreferences;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* In order to support starting and binding to the service in the same
|
* In order to support starting and binding to the service in the same
|
||||||
@@ -160,14 +158,16 @@ public class TrackRecordingServiceTest extends ServiceTestCase<TestRecordingServ
|
|||||||
|
|
||||||
providerUtils = MyTracksProviderUtils.Factory.get(context);
|
providerUtils = MyTracksProviderUtils.Factory.get(context);
|
||||||
|
|
||||||
sharedPreferences = context.getSharedPreferences(Constants.SETTINGS_NAME, Context.MODE_PRIVATE);
|
SharedPreferences sharedPreferences = context.getSharedPreferences(
|
||||||
|
Constants.SETTINGS_NAME, Context.MODE_PRIVATE);
|
||||||
// Let's use default values.
|
// Let's use default values.
|
||||||
sharedPreferences.edit().clear().apply();
|
sharedPreferences.edit().clear().apply();
|
||||||
|
|
||||||
// Disable auto resume by default.
|
// Disable auto resume by default.
|
||||||
updateAutoResumePrefs(0, -1);
|
updateAutoResumePrefs(PreferencesUtils.AUTO_RESUME_TRACK_CURRENT_RETRY_DEFAULT, 0);
|
||||||
// No recording track.
|
// No recording track.
|
||||||
PreferencesUtils.setRecordingTrackId(context, -1L);
|
PreferencesUtils.setLong(
|
||||||
|
context, R.string.recording_track_id_key, PreferencesUtils.RECORDING_TRACK_ID_DEFAULT);
|
||||||
}
|
}
|
||||||
|
|
||||||
@SmallTest
|
@SmallTest
|
||||||
@@ -188,7 +188,8 @@ public class TrackRecordingServiceTest extends ServiceTestCase<TestRecordingServ
|
|||||||
createDummyTrack(123L, System.currentTimeMillis(), true);
|
createDummyTrack(123L, System.currentTimeMillis(), true);
|
||||||
|
|
||||||
// Clear the number of attempts and set the timeout to 10 min.
|
// Clear the number of attempts and set the timeout to 10 min.
|
||||||
updateAutoResumePrefs(0, 10);
|
updateAutoResumePrefs(PreferencesUtils.AUTO_RESUME_TRACK_CURRENT_RETRY_DEFAULT,
|
||||||
|
PreferencesUtils.AUTO_RESUME_TRACK_TIMEOUT_DEFAULT);
|
||||||
|
|
||||||
// Start the service in "resume" mode (simulates the on-reboot action).
|
// Start the service in "resume" mode (simulates the on-reboot action).
|
||||||
Intent startIntent = createStartIntent();
|
Intent startIntent = createStartIntent();
|
||||||
@@ -210,7 +211,8 @@ public class TrackRecordingServiceTest extends ServiceTestCase<TestRecordingServ
|
|||||||
// TODO: If fixed, remove "disabled" prefix from the test name.
|
// TODO: If fixed, remove "disabled" prefix from the test name.
|
||||||
@MediumTest
|
@MediumTest
|
||||||
public void disabledTestResumeAfterReboot_simulateReboot() throws Exception {
|
public void disabledTestResumeAfterReboot_simulateReboot() throws Exception {
|
||||||
updateAutoResumePrefs(0, 10);
|
updateAutoResumePrefs(PreferencesUtils.AUTO_RESUME_TRACK_CURRENT_RETRY_DEFAULT,
|
||||||
|
PreferencesUtils.AUTO_RESUME_TRACK_TIMEOUT_DEFAULT);
|
||||||
ITrackRecordingService service = bindAndGetService(createStartIntent());
|
ITrackRecordingService service = bindAndGetService(createStartIntent());
|
||||||
assertFalse(service.isRecording());
|
assertFalse(service.isRecording());
|
||||||
|
|
||||||
@@ -219,7 +221,7 @@ public class TrackRecordingServiceTest extends ServiceTestCase<TestRecordingServ
|
|||||||
assertTrue(service.isRecording());
|
assertTrue(service.isRecording());
|
||||||
assertEquals(id, service.getRecordingTrackId());
|
assertEquals(id, service.getRecordingTrackId());
|
||||||
shutdownService();
|
shutdownService();
|
||||||
assertEquals(id, PreferencesUtils.getRecordingTrackId(context));
|
assertEquals(id, PreferencesUtils.getLong(context, R.string.recording_track_id_key));
|
||||||
|
|
||||||
// Start the service in "resume" mode (simulates the on-reboot action).
|
// Start the service in "resume" mode (simulates the on-reboot action).
|
||||||
Intent startIntent = createStartIntent();
|
Intent startIntent = createStartIntent();
|
||||||
@@ -236,7 +238,8 @@ public class TrackRecordingServiceTest extends ServiceTestCase<TestRecordingServ
|
|||||||
createDummyTrack(123L, System.currentTimeMillis(), false);
|
createDummyTrack(123L, System.currentTimeMillis(), false);
|
||||||
|
|
||||||
// Clear the number of attempts and set the timeout to 10 min.
|
// Clear the number of attempts and set the timeout to 10 min.
|
||||||
updateAutoResumePrefs(0, 10);
|
updateAutoResumePrefs(PreferencesUtils.AUTO_RESUME_TRACK_CURRENT_RETRY_DEFAULT,
|
||||||
|
PreferencesUtils.AUTO_RESUME_TRACK_TIMEOUT_DEFAULT);
|
||||||
|
|
||||||
// Start the service in "resume" mode (simulates the on-reboot action).
|
// Start the service in "resume" mode (simulates the on-reboot action).
|
||||||
Intent startIntent = createStartIntent();
|
Intent startIntent = createStartIntent();
|
||||||
@@ -256,7 +259,8 @@ public class TrackRecordingServiceTest extends ServiceTestCase<TestRecordingServ
|
|||||||
createDummyTrack(123L, System.currentTimeMillis() - 20 * 60 * 1000, true);
|
createDummyTrack(123L, System.currentTimeMillis() - 20 * 60 * 1000, true);
|
||||||
|
|
||||||
// Clear the number of attempts and set the timeout to 10 min.
|
// Clear the number of attempts and set the timeout to 10 min.
|
||||||
updateAutoResumePrefs(0, 10);
|
updateAutoResumePrefs(PreferencesUtils.AUTO_RESUME_TRACK_CURRENT_RETRY_DEFAULT,
|
||||||
|
PreferencesUtils.AUTO_RESUME_TRACK_TIMEOUT_DEFAULT);
|
||||||
|
|
||||||
// Start the service in "resume" mode (simulates the on-reboot action).
|
// Start the service in "resume" mode (simulates the on-reboot action).
|
||||||
Intent startIntent = createStartIntent();
|
Intent startIntent = createStartIntent();
|
||||||
@@ -276,8 +280,8 @@ public class TrackRecordingServiceTest extends ServiceTestCase<TestRecordingServ
|
|||||||
createDummyTrack(123L, System.currentTimeMillis(), true);
|
createDummyTrack(123L, System.currentTimeMillis(), true);
|
||||||
|
|
||||||
// Set the number of attempts to max.
|
// Set the number of attempts to max.
|
||||||
updateAutoResumePrefs(
|
updateAutoResumePrefs(TrackRecordingService.MAX_AUTO_RESUME_TRACK_RETRY_ATTEMPTS,
|
||||||
TrackRecordingService.MAX_AUTO_RESUME_TRACK_RETRY_ATTEMPTS, 10);
|
PreferencesUtils.AUTO_RESUME_TRACK_TIMEOUT_DEFAULT);
|
||||||
|
|
||||||
// Start the service in "resume" mode (simulates the on-reboot action).
|
// Start the service in "resume" mode (simulates the on-reboot action).
|
||||||
Intent startIntent = createStartIntent();
|
Intent startIntent = createStartIntent();
|
||||||
@@ -315,7 +319,7 @@ public class TrackRecordingServiceTest extends ServiceTestCase<TestRecordingServ
|
|||||||
@MediumTest
|
@MediumTest
|
||||||
public void testRecording_orphanedRecordingTrack() throws Exception {
|
public void testRecording_orphanedRecordingTrack() throws Exception {
|
||||||
// Just set recording track to a bogus value.
|
// Just set recording track to a bogus value.
|
||||||
PreferencesUtils.setRecordingTrackId(context, 256L);
|
PreferencesUtils.setLong(context, R.string.recording_track_id_key, 256L);
|
||||||
|
|
||||||
// Make sure that the service will not start recording and will clear
|
// Make sure that the service will not start recording and will clear
|
||||||
// the bogus track.
|
// the bogus track.
|
||||||
@@ -387,9 +391,10 @@ public class TrackRecordingServiceTest extends ServiceTestCase<TestRecordingServ
|
|||||||
Track track = providerUtils.getTrack(id);
|
Track track = providerUtils.getTrack(id);
|
||||||
assertNotNull(track);
|
assertNotNull(track);
|
||||||
assertEquals(id, track.getId());
|
assertEquals(id, track.getId());
|
||||||
assertEquals(sharedPreferences.getString(context.getString(R.string.default_activity_key), ""),
|
assertEquals(PreferencesUtils.getString(
|
||||||
|
context, R.string.default_activity_key, PreferencesUtils.DEFAULT_ACTIVITY_DEFAULT),
|
||||||
track.getCategory());
|
track.getCategory());
|
||||||
assertEquals(id, PreferencesUtils.getRecordingTrackId(context));
|
assertEquals(id, PreferencesUtils.getLong(context, R.string.recording_track_id_key));
|
||||||
assertEquals(id, service.getRecordingTrackId());
|
assertEquals(id, service.getRecordingTrackId());
|
||||||
|
|
||||||
// Verify that the start broadcast was received.
|
// Verify that the start broadcast was received.
|
||||||
@@ -415,7 +420,7 @@ public class TrackRecordingServiceTest extends ServiceTestCase<TestRecordingServ
|
|||||||
long newTrack = service.startNewTrack();
|
long newTrack = service.startNewTrack();
|
||||||
assertEquals(-1L, newTrack);
|
assertEquals(-1L, newTrack);
|
||||||
|
|
||||||
assertEquals(123L, PreferencesUtils.getRecordingTrackId(context));
|
assertEquals(123L, PreferencesUtils.getLong(context, R.string.recording_track_id_key));
|
||||||
assertEquals(123L, service.getRecordingTrackId());
|
assertEquals(123L, service.getRecordingTrackId());
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -434,8 +439,9 @@ public class TrackRecordingServiceTest extends ServiceTestCase<TestRecordingServ
|
|||||||
// End the current track.
|
// End the current track.
|
||||||
service.endCurrentTrack();
|
service.endCurrentTrack();
|
||||||
assertFalse(service.isRecording());
|
assertFalse(service.isRecording());
|
||||||
assertEquals(-1L, PreferencesUtils.getRecordingTrackId(context));
|
assertEquals(PreferencesUtils.RECORDING_TRACK_ID_DEFAULT,
|
||||||
assertEquals(-1L, service.getRecordingTrackId());
|
PreferencesUtils.getLong(context, R.string.recording_track_id_key));
|
||||||
|
assertEquals(PreferencesUtils.RECORDING_TRACK_ID_DEFAULT, service.getRecordingTrackId());
|
||||||
|
|
||||||
// Verify that the stop broadcast was received.
|
// Verify that the stop broadcast was received.
|
||||||
assertTrue(stopReceiver.waitUntilReceived(1));
|
assertTrue(stopReceiver.waitUntilReceived(1));
|
||||||
@@ -457,8 +463,9 @@ public class TrackRecordingServiceTest extends ServiceTestCase<TestRecordingServ
|
|||||||
// Ending the current track when there is no recording should not result in any error.
|
// Ending the current track when there is no recording should not result in any error.
|
||||||
service.endCurrentTrack();
|
service.endCurrentTrack();
|
||||||
|
|
||||||
assertEquals(-1L, PreferencesUtils.getRecordingTrackId(context));
|
assertEquals(PreferencesUtils.RECORDING_TRACK_ID_DEFAULT,
|
||||||
assertEquals(-1L, service.getRecordingTrackId());
|
PreferencesUtils.getLong(context, R.string.recording_track_id_key));
|
||||||
|
assertEquals(PreferencesUtils.RECORDING_TRACK_ID_DEFAULT, service.getRecordingTrackId());
|
||||||
}
|
}
|
||||||
|
|
||||||
@MediumTest
|
@MediumTest
|
||||||
@@ -537,95 +544,120 @@ public class TrackRecordingServiceTest extends ServiceTestCase<TestRecordingServ
|
|||||||
}
|
}
|
||||||
|
|
||||||
@MediumTest
|
@MediumTest
|
||||||
public void testWithProperties_noAnnouncementFreq() throws Exception {
|
public void testWithProperties_announcementFrequencyDefault() throws Exception {
|
||||||
functionalTest(R.string.announcement_frequency_key, (Object) null);
|
PreferencesUtils.setInt(context, R.string.announcement_frequency_key,
|
||||||
|
PreferencesUtils.ANNOUNCEMENT_FREQUENCY_DEFAULT);
|
||||||
|
fullRecordingSession();
|
||||||
}
|
}
|
||||||
|
|
||||||
@MediumTest
|
@MediumTest
|
||||||
public void testWithProperties_defaultAnnouncementFreq() throws Exception {
|
public void testWithProperties_announcementFrequencyByDistance() throws Exception {
|
||||||
functionalTest(R.string.announcement_frequency_key, 1);
|
PreferencesUtils.setInt(context, R.string.announcement_frequency_key, -1);
|
||||||
|
fullRecordingSession();
|
||||||
}
|
}
|
||||||
|
|
||||||
@MediumTest
|
@MediumTest
|
||||||
public void testWithProperties_noMaxRecordingDist() throws Exception {
|
public void testWithProperties_announcementFrequencyByTime() throws Exception {
|
||||||
functionalTest(R.string.max_recording_distance_key, (Object) null);
|
PreferencesUtils.setInt(context, R.string.announcement_frequency_key, 1);
|
||||||
|
fullRecordingSession();
|
||||||
|
}
|
||||||
|
|
||||||
|
@MediumTest
|
||||||
|
public void testWithProperties_maxRecordingDistanceDefault() throws Exception {
|
||||||
|
PreferencesUtils.setInt(context, R.string.max_recording_distance_key,
|
||||||
|
PreferencesUtils.MAX_RECORDING_DISTANCE_DEFAULT);
|
||||||
|
fullRecordingSession();
|
||||||
}
|
}
|
||||||
|
|
||||||
@MediumTest
|
@MediumTest
|
||||||
public void testWithProperties_defaultMaxRecordingDist() throws Exception {
|
public void testWithProperties_maxRecordingDistance() throws Exception {
|
||||||
functionalTest(R.string.max_recording_distance_key, 5);
|
PreferencesUtils.setInt(context, R.string.max_recording_distance_key, 50);
|
||||||
|
fullRecordingSession();
|
||||||
}
|
}
|
||||||
|
|
||||||
@MediumTest
|
@MediumTest
|
||||||
public void testWithProperties_noMinRecordingDist() throws Exception {
|
public void testWithProperties_minRecordingDistanceDefault() throws Exception {
|
||||||
functionalTest(R.string.min_recording_distance_key, (Object) null);
|
PreferencesUtils.setInt(context, R.string.min_recording_distance_key,
|
||||||
|
PreferencesUtils.MIN_RECORDING_DISTANCE_DEFAULT);
|
||||||
|
fullRecordingSession();
|
||||||
}
|
}
|
||||||
|
|
||||||
@MediumTest
|
@MediumTest
|
||||||
public void testWithProperties_defaultMinRecordingDist() throws Exception {
|
public void testWithProperties_minRecordingDistance() throws Exception {
|
||||||
functionalTest(R.string.min_recording_distance_key, 2);
|
PreferencesUtils.setInt(context, R.string.min_recording_distance_key, 2);
|
||||||
|
fullRecordingSession();
|
||||||
}
|
}
|
||||||
|
|
||||||
@MediumTest
|
@MediumTest
|
||||||
public void testWithProperties_noSplitFreq() throws Exception {
|
public void testWithProperties_splitFrequencyDefault() throws Exception {
|
||||||
functionalTest(R.string.split_frequency_key, (Object) null);
|
PreferencesUtils.setInt(context, R.string.split_frequency_key,
|
||||||
|
PreferencesUtils.SPLIT_FREQUENCY_DEFAULT);
|
||||||
|
fullRecordingSession();
|
||||||
}
|
}
|
||||||
|
|
||||||
@MediumTest
|
@MediumTest
|
||||||
public void testWithProperties_defaultSplitFreqByDist() throws Exception {
|
public void testWithProperties_splitFrequencyByDistance() throws Exception {
|
||||||
functionalTest(R.string.split_frequency_key, 5);
|
PreferencesUtils.setInt(context, R.string.split_frequency_key, -1);
|
||||||
|
fullRecordingSession();
|
||||||
}
|
}
|
||||||
|
|
||||||
@MediumTest
|
@MediumTest
|
||||||
public void testWithProperties_defaultSplitFreqByTime() throws Exception {
|
public void testWithProperties_splitFrequencyByTime() throws Exception {
|
||||||
functionalTest(R.string.split_frequency_key, -2);
|
PreferencesUtils.setInt(context, R.string.split_frequency_key, 1);
|
||||||
|
fullRecordingSession();
|
||||||
}
|
}
|
||||||
|
|
||||||
@MediumTest
|
@MediumTest
|
||||||
public void testWithProperties_noMetricUnits() throws Exception {
|
public void testWithProperties_metricUnitsDefault() throws Exception {
|
||||||
functionalTest(R.string.metric_units_key, (Object) null);
|
PreferencesUtils.setBoolean(
|
||||||
}
|
context, R.string.metric_units_key, PreferencesUtils.METRIC_UNITS_DEFAULT);
|
||||||
|
fullRecordingSession();
|
||||||
@MediumTest
|
|
||||||
public void testWithProperties_metricUnitsEnabled() throws Exception {
|
|
||||||
functionalTest(R.string.metric_units_key, true);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@MediumTest
|
@MediumTest
|
||||||
public void testWithProperties_metricUnitsDisabled() throws Exception {
|
public void testWithProperties_metricUnitsDisabled() throws Exception {
|
||||||
functionalTest(R.string.metric_units_key, false);
|
PreferencesUtils.setBoolean(context, R.string.metric_units_key, false);
|
||||||
|
fullRecordingSession();
|
||||||
}
|
}
|
||||||
|
|
||||||
@MediumTest
|
@MediumTest
|
||||||
public void testWithProperties_noMinRecordingInterval() throws Exception {
|
public void testWithProperties_minRecordingIntervalDefault() throws Exception {
|
||||||
functionalTest(R.string.min_recording_interval_key, (Object) null);
|
PreferencesUtils.setInt(context, R.string.min_recording_interval_key,
|
||||||
|
PreferencesUtils.MIN_RECORDING_INTERVAL_DEFAULT);
|
||||||
|
fullRecordingSession();
|
||||||
}
|
}
|
||||||
|
|
||||||
@MediumTest
|
@MediumTest
|
||||||
public void testWithProperties_defaultMinRecordingInterval()
|
public void testWithProperties_minRecordingInterval() throws Exception {
|
||||||
throws Exception {
|
PreferencesUtils.setInt(context, R.string.min_recording_interval_key, 2);
|
||||||
functionalTest(R.string.min_recording_interval_key, 3);
|
fullRecordingSession();
|
||||||
}
|
}
|
||||||
|
|
||||||
@MediumTest
|
@MediumTest
|
||||||
public void testWithProperties_noMinRequiredAccuracy() throws Exception {
|
public void testWithProperties_minRequiredAccuracyDefault() throws Exception {
|
||||||
functionalTest(R.string.min_required_accuracy_key, (Object) null);
|
PreferencesUtils.setInt(context, R.string.min_required_accuracy_key,
|
||||||
|
PreferencesUtils.MIN_REQUIRED_ACCURACY_DEFAULT);
|
||||||
|
fullRecordingSession();
|
||||||
}
|
}
|
||||||
|
|
||||||
@MediumTest
|
@MediumTest
|
||||||
public void testWithProperties_defaultMinRequiredAccuracy() throws Exception {
|
public void testWithProperties_minRequiredAccuracy() throws Exception {
|
||||||
functionalTest(R.string.min_required_accuracy_key, 500);
|
PreferencesUtils.setInt(context, R.string.min_required_accuracy_key, 500);
|
||||||
|
fullRecordingSession();
|
||||||
}
|
}
|
||||||
|
|
||||||
@MediumTest
|
@MediumTest
|
||||||
public void testWithProperties_noSensorType() throws Exception {
|
public void testWithProperties_sensorTypeDefault() throws Exception {
|
||||||
functionalTest(R.string.sensor_type_key, (Object) null);
|
PreferencesUtils.setString(
|
||||||
|
context, R.string.sensor_type_key, context.getString(R.string.sensor_type_value_none));
|
||||||
|
fullRecordingSession();
|
||||||
}
|
}
|
||||||
|
|
||||||
@MediumTest
|
@MediumTest
|
||||||
public void testWithProperties_zephyrSensorType() throws Exception {
|
public void testWithProperties_sensorTypeZephyr() throws Exception {
|
||||||
functionalTest(R.string.sensor_type_key,
|
PreferencesUtils.setString(
|
||||||
context.getString(R.string.sensor_type_value_zephyr));
|
context, R.string.sensor_type_key, context.getString(R.string.sensor_type_value_zephyr));
|
||||||
|
fullRecordingSession();
|
||||||
}
|
}
|
||||||
|
|
||||||
private ITrackRecordingService bindAndGetService(Intent intent) {
|
private ITrackRecordingService bindAndGetService(Intent intent) {
|
||||||
@@ -647,12 +679,8 @@ public class TrackRecordingServiceTest extends ServiceTestCase<TestRecordingServ
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void updateAutoResumePrefs(int attempts, int timeoutMins) {
|
private void updateAutoResumePrefs(int attempts, int timeoutMins) {
|
||||||
Editor editor = sharedPreferences.edit();
|
PreferencesUtils.setInt(context, R.string.auto_resume_track_current_retry_key, attempts);
|
||||||
editor.putInt(context.getString(
|
PreferencesUtils.setInt(context, R.string.auto_resume_track_timeout_key, timeoutMins);
|
||||||
R.string.auto_resume_track_current_retry_key), attempts);
|
|
||||||
editor.putInt(context.getString(
|
|
||||||
R.string.auto_resume_track_timeout_key), timeoutMins);
|
|
||||||
editor.apply();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private Intent createStartIntent() {
|
private Intent createStartIntent() {
|
||||||
@@ -665,34 +693,8 @@ public class TrackRecordingServiceTest extends ServiceTestCase<TestRecordingServ
|
|||||||
assertTrue(track.getId() >= 0);
|
assertTrue(track.getId() >= 0);
|
||||||
providerUtils.insertTrack(track);
|
providerUtils.insertTrack(track);
|
||||||
assertEquals(track.getId(), providerUtils.getTrack(track.getId()).getId());
|
assertEquals(track.getId(), providerUtils.getTrack(track.getId()).getId());
|
||||||
PreferencesUtils.setRecordingTrackId(context, isRecording ? track.getId() : -1L);
|
PreferencesUtils.setLong(context, R.string.recording_track_id_key, isRecording ? track.getId()
|
||||||
}
|
: PreferencesUtils.RECORDING_TRACK_ID_DEFAULT);
|
||||||
|
|
||||||
// TODO: We support multiple values for readability, however this test's
|
|
||||||
// base class doesn't properly shutdown the service, so it's not possible
|
|
||||||
// to pass more than 1 value at a time.
|
|
||||||
private void functionalTest(int resourceId, Object ...values)
|
|
||||||
throws Exception {
|
|
||||||
final String key = context.getString(resourceId);
|
|
||||||
for (Object value : values) {
|
|
||||||
// Remove all properties and set the property for the given key.
|
|
||||||
Editor editor = sharedPreferences.edit();
|
|
||||||
editor.clear();
|
|
||||||
if (value instanceof String) {
|
|
||||||
editor.putString(key, (String) value);
|
|
||||||
} else if (value instanceof Long) {
|
|
||||||
editor.putLong(key, (Long) value);
|
|
||||||
} else if (value instanceof Integer) {
|
|
||||||
editor.putInt(key, (Integer) value);
|
|
||||||
} else if (value instanceof Boolean) {
|
|
||||||
editor.putBoolean(key, (Boolean) value);
|
|
||||||
} else if (value == null) {
|
|
||||||
// Do nothing, as clear above has already removed this property.
|
|
||||||
}
|
|
||||||
editor.apply();
|
|
||||||
|
|
||||||
fullRecordingSession();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void fullRecordingSession() throws Exception {
|
private void fullRecordingSession() throws Exception {
|
||||||
@@ -706,7 +708,7 @@ public class TrackRecordingServiceTest extends ServiceTestCase<TestRecordingServ
|
|||||||
Track track = providerUtils.getTrack(id);
|
Track track = providerUtils.getTrack(id);
|
||||||
assertNotNull(track);
|
assertNotNull(track);
|
||||||
assertEquals(id, track.getId());
|
assertEquals(id, track.getId());
|
||||||
assertEquals(id, PreferencesUtils.getRecordingTrackId(context));
|
assertEquals(id, PreferencesUtils.getLong(context, R.string.recording_track_id_key));
|
||||||
assertEquals(id, service.getRecordingTrackId());
|
assertEquals(id, service.getRecordingTrackId());
|
||||||
|
|
||||||
// Insert a few points, markers and statistics.
|
// Insert a few points, markers and statistics.
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package com.google.android.apps.mytracks.services.sensors;
|
package com.google.android.apps.mytracks.services.sensors;
|
||||||
|
|
||||||
import com.google.android.apps.mytracks.Constants;
|
import com.google.android.apps.mytracks.Constants;
|
||||||
|
import com.google.android.apps.mytracks.util.PreferencesUtils;
|
||||||
import com.google.android.maps.mytracks.R;
|
import com.google.android.maps.mytracks.R;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
@@ -10,13 +11,11 @@ import android.test.suitebuilder.annotation.SmallTest;
|
|||||||
|
|
||||||
public class SensorManagerFactoryTest extends AndroidTestCase {
|
public class SensorManagerFactoryTest extends AndroidTestCase {
|
||||||
|
|
||||||
private SharedPreferences sharedPreferences;
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void setUp() throws Exception {
|
protected void setUp() throws Exception {
|
||||||
super.setUp();
|
super.setUp();
|
||||||
|
|
||||||
sharedPreferences = getContext().getSharedPreferences(
|
SharedPreferences sharedPreferences = getContext().getSharedPreferences(
|
||||||
Constants.SETTINGS_NAME, Context.MODE_PRIVATE);
|
Constants.SETTINGS_NAME, Context.MODE_PRIVATE);
|
||||||
// Let's use default values.
|
// Let's use default values.
|
||||||
sharedPreferences.edit().clear().apply();
|
sharedPreferences.edit().clear().apply();
|
||||||
@@ -38,10 +37,7 @@ public class SensorManagerFactoryTest extends AndroidTestCase {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void assertClassForName(Class<?> c, int i) {
|
private void assertClassForName(Class<?> c, int i) {
|
||||||
sharedPreferences.edit()
|
PreferencesUtils.setString(getContext(), R.string.sensor_type_key, getContext().getString(i));
|
||||||
.putString(getContext().getString(R.string.sensor_type_key),
|
|
||||||
getContext().getString(i))
|
|
||||||
.apply();
|
|
||||||
SensorManager sm = SensorManagerFactory.getInstance().getSensorManager(getContext());
|
SensorManager sm = SensorManagerFactory.getInstance().getSensorManager(getContext());
|
||||||
assertNotNull(sm);
|
assertNotNull(sm);
|
||||||
assertTrue(c.isInstance(sm));
|
assertTrue(c.isInstance(sm));
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ package com.google.android.apps.mytracks.services.sensors.ant;
|
|||||||
import com.dsi.ant.AntMesg;
|
import com.dsi.ant.AntMesg;
|
||||||
import com.google.android.apps.mytracks.Constants;
|
import com.google.android.apps.mytracks.Constants;
|
||||||
import com.google.android.apps.mytracks.content.Sensor;
|
import com.google.android.apps.mytracks.content.Sensor;
|
||||||
|
import com.google.android.apps.mytracks.util.PreferencesUtils;
|
||||||
import com.google.android.maps.mytracks.R;
|
import com.google.android.maps.mytracks.R;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
@@ -27,7 +28,6 @@ import android.test.suitebuilder.annotation.SmallTest;
|
|||||||
|
|
||||||
public class AntDirectSensorManagerTest extends AndroidTestCase {
|
public class AntDirectSensorManagerTest extends AndroidTestCase {
|
||||||
|
|
||||||
private SharedPreferences sharedPreferences;
|
|
||||||
private AntSensorBase heartRateSensor;
|
private AntSensorBase heartRateSensor;
|
||||||
private static final byte HEART_RATE_CHANNEL = 0;
|
private static final byte HEART_RATE_CHANNEL = 0;
|
||||||
|
|
||||||
@@ -47,7 +47,7 @@ public class AntDirectSensorManagerTest extends AndroidTestCase {
|
|||||||
private AntDirectSensorManager manager;
|
private AntDirectSensorManager manager;
|
||||||
|
|
||||||
public void setUp() {
|
public void setUp() {
|
||||||
sharedPreferences = getContext().getSharedPreferences(
|
SharedPreferences sharedPreferences = getContext().getSharedPreferences(
|
||||||
Constants.SETTINGS_NAME, Context.MODE_PRIVATE);
|
Constants.SETTINGS_NAME, Context.MODE_PRIVATE);
|
||||||
// Let's use default values.
|
// Let's use default values.
|
||||||
sharedPreferences.edit().clear().apply();
|
sharedPreferences.edit().clear().apply();
|
||||||
@@ -87,9 +87,8 @@ public class AntDirectSensorManagerTest extends AndroidTestCase {
|
|||||||
manager.handleMessage(AntMesg.MESG_CHANNEL_ID_ID, buff);
|
manager.handleMessage(AntMesg.MESG_CHANNEL_ID_ID, buff);
|
||||||
|
|
||||||
assertEquals(43, heartRateSensor.getDeviceNumber());
|
assertEquals(43, heartRateSensor.getDeviceNumber());
|
||||||
assertEquals(43,
|
assertEquals(43, PreferencesUtils.getInt(
|
||||||
sharedPreferences.getInt(
|
getContext(), R.string.ant_heart_rate_sensor_id_key, AntSensorManager.WILDCARD));
|
||||||
getContext().getString(R.string.ant_heart_rate_sensor_id_key), -1));
|
|
||||||
assertNull(manager.getSensorDataSet());
|
assertNull(manager.getSensorDataSet());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||