Cleanup list preferences.

This commit is contained in:
Dennis Guse
2019-08-05 23:31:10 +02:00
parent cf90462772
commit 2a145b4791
8 changed files with 71 additions and 156 deletions
@@ -61,46 +61,4 @@ public class AbstractSettingsActivity extends PreferenceActivity {
finish(); finish();
return true; return true;
} }
/**
* Configures a list preference.
*
* @param listPreference the list preference
* @param options the options array
* @param values the values array
* @param value the value
* @param listener optional listener
*/
protected void configureListPreference(ListPreference listPreference, final String[] options, final String[] values, String value,
final OnPreferenceChangeListener listener) {
listPreference.setEntryValues(values);
listPreference.setEntries(options);
listPreference.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference pref, Object newValue) {
if (listener != null) {
listener.onPreferenceChange(pref, newValue);
}
return true;
}
});
if (listener != null) {
listener.onPreferenceChange(listPreference, value);
}
}
/**
* Get the array index for a value.
*
* @param values the array
* @param value the value
*/
private int getIndex(String[] values, String value) {
for (int i = 0; i < values.length; i++) {
if (value.equals(values[i])) {
return i;
}
}
return -1;
}
} }
@@ -34,7 +34,6 @@ public class ChartSettingsActivity extends AbstractSettingsActivity {
protected void onCreate(Bundle bundle) { protected void onCreate(Bundle bundle) {
super.onCreate(bundle); super.onCreate(bundle);
addPreferencesFromResource(R.xml.settings_chart); addPreferencesFromResource(R.xml.settings_chart);
configXAxisListPreference();
} }
@Override @Override
@@ -44,22 +43,8 @@ public class ChartSettingsActivity extends AbstractSettingsActivity {
} }
private void updateUi() { private void updateUi() {
CheckBoxPreference speedCheckBoxPreference = (CheckBoxPreference) findPreference( CheckBoxPreference speedCheckBoxPreference = (CheckBoxPreference) findPreference(getString(R.string.chart_show_speed_key));
getString(R.string.chart_show_speed_key)); speedCheckBoxPreference.setTitle(PreferencesUtils.isReportSpeed(this) ? R.string.stats_speed : R.string.stats_pace);
speedCheckBoxPreference.setTitle(
PreferencesUtils.isReportSpeed(this) ? R.string.stats_speed : R.string.stats_pace);
} }
/**
* Configures the x axis list preference.
*/
private void configXAxisListPreference() {
ListPreference listPreference = (ListPreference) findPreference(
getString(R.string.chart_x_axis_key));
String value = PreferencesUtils.getString(
this, R.string.chart_x_axis_key, PreferencesUtils.CHART_X_AXIS_DEFAULT);
String[] values = getResources().getStringArray(R.array.chart_x_axis_values);
String[] options = getResources().getStringArray(R.array.chart_x_axis_options);
configureListPreference(listPreference, options, values, value, null);
}
} }
@@ -47,27 +47,17 @@ public class RecordingSettingsActivity extends AbstractSettingsActivity
boolean metricUnits = PreferencesUtils.isMetricUnits(this); boolean metricUnits = PreferencesUtils.isMetricUnits(this);
configFrequencyPreference(R.string.voice_frequency_key, configFrequencyPreference(R.string.voice_frequency_key, metricUnits);
PreferencesUtils.VOICE_FREQUENCY_DEFAULT, R.array.frequency_values, metricUnits); configFrequencyPreference(R.string.split_frequency_key, metricUnits);
configFrequencyPreference(R.string.split_frequency_key,
PreferencesUtils.SPLIT_FREQUENCY_DEFAULT, R.array.frequency_values, metricUnits);
configTrackName();
configDefaultActivity(); configDefaultActivity();
configListPreference(R.string.min_recording_interval_key, configListPreference(R.string.min_recording_interval_key, R.array.min_recording_interval_values,
PreferencesUtils.MIN_RECORDING_INTERVAL_DEFAULT, R.array.min_recording_interval_values,
metricUnits); metricUnits);
configListPreference(R.string.recording_distance_interval_key, configListPreference(R.string.recording_distance_interval_key, R.array.recording_distance_interval_values, metricUnits);
PreferencesUtils.RECORDING_DISTANCE_INTERVAL_DEFAULT, configListPreference(R.string.max_recording_distance_key, R.array.max_recording_distance_values,
R.array.recording_distance_interval_values, metricUnits);
configListPreference(R.string.max_recording_distance_key,
PreferencesUtils.MAX_RECORDING_DISTANCE_DEFAULT, R.array.max_recording_distance_values,
metricUnits); metricUnits);
configListPreference(R.string.recording_gps_accuracy_key, configListPreference(R.string.recording_gps_accuracy_key, R.array.recording_gps_accuracy_values,
PreferencesUtils.RECORDING_GPS_ACCURACY_DEFAULT, R.array.recording_gps_accuracy_values,
metricUnits); metricUnits);
configListPreference(R.string.auto_resume_track_timeout_key, configListPreference(R.string.auto_resume_track_timeout_key, R.array.auto_resume_track_timeout_values, metricUnits);
PreferencesUtils.AUTO_RESUME_TRACK_TIMEOUT_DEFAULT,
R.array.auto_resume_track_timeout_values, metricUnits);
} }
@Override @Override
@@ -81,21 +71,11 @@ public class RecordingSettingsActivity extends AbstractSettingsActivity
return ChooseActivityTypeDialogFragment.getDialog(this, category, this); return ChooseActivityTypeDialogFragment.getDialog(this, category, this);
} }
private void configFrequencyPreference(int key, int defaultValue, int valueArray, boolean metricUnits) { private void configFrequencyPreference(int key, boolean metricUnits) {
ListPreference preference = (ListPreference) findPreference(getString(key)); ListPreference preference = (ListPreference) findPreference(getString(key));
int value = PreferencesUtils.getInt(this, key, defaultValue);
String[] values = getResources().getStringArray(valueArray);
String[] options = StringUtils.getFrequencyOptions(this, metricUnits);
configureListPreference(preference, options, values, String.valueOf(value), null);
}
private void configTrackName() { String[] options = StringUtils.getFrequencyOptions(this, metricUnits);
ListPreference preference = (ListPreference) findPreference(getString(R.string.track_name_key)); preference.setEntries(options);
String value = PreferencesUtils.getString(
this, R.string.track_name_key, PreferencesUtils.TRACK_NAME_DEFAULT);
String[] values = getResources().getStringArray(R.array.track_name_values);
String[] options = getResources().getStringArray(R.array.track_name_options);
configureListPreference(preference, options, values, value, null);
} }
private void configDefaultActivity() { private void configDefaultActivity() {
@@ -120,78 +100,69 @@ public class RecordingSettingsActivity extends AbstractSettingsActivity
activityTypePreference.setRecordingSettingsActivity(this); activityTypePreference.setRecordingSettingsActivity(this);
} }
private void configListPreference( private void configListPreference(int key, int valueArray, boolean metricUnits) {
int key, int defaultValue, int valueArray, boolean metricUnits) {
ListPreference preference = (ListPreference) findPreference(getString(key)); ListPreference preference = (ListPreference) findPreference(getString(key));
int value = PreferencesUtils.getInt(this, key, defaultValue);
@Deprecated
String[] values = getResources().getStringArray(valueArray); String[] values = getResources().getStringArray(valueArray);
String[] options = new String[values.length]; String[] options = new String[values.length];
String[] summary = new String[values.length];
switch (key) { switch (key) {
case R.string.min_recording_interval_key: case R.string.min_recording_interval_key:
setMinRecordingIntervalSummaryAndOptions(summary, options, values); setMinRecordingIntervalOptions(options, values);
break; break;
case R.string.recording_distance_interval_key: case R.string.recording_distance_interval_key:
setRecordingDistanceIntervalSummaryAndOptions(summary, options, values, metricUnits); setRecordingDistanceIntervalOptions(options, values, metricUnits);
break; break;
case R.string.max_recording_distance_key: case R.string.max_recording_distance_key:
setMaxRecordingDistanceSummaryAndOptions(summary, options, values, metricUnits); setMaxRecordingDistanceOptions(options, values, metricUnits);
break; break;
case R.string.recording_gps_accuracy_key: case R.string.recording_gps_accuracy_key:
setRecordingGpsAccuracySummaryAndOptions(summary, options, values, metricUnits); setRecordingGpsAccuracyOptions(options, values, metricUnits);
break; break;
case R.string.auto_resume_track_timeout_key: case R.string.auto_resume_track_timeout_key:
setAutoResumeTrackTimeoutSummaryAndOptions(summary, options, values); setAutoResumeTrackTimeoutOptions(options, values);
break; break;
default: default:
return; return;
} }
configureListPreference(preference, options, values, String.valueOf(value), null);
preference.setEntries(options);
} }
/** /**
* Sets the min recording interval summary and options. * Sets the min recording interval options.
* *
* @param summary the summary
* @param options the options * @param options the options
* @param values the values * @param values the values
*/ */
private void setMinRecordingIntervalSummaryAndOptions( private void setMinRecordingIntervalOptions(String[] options, String[] values) {
String[] summary, String[] options, String[] values) {
for (int i = 0; i < values.length; i++) { for (int i = 0; i < values.length; i++) {
int value = Integer.parseInt(values[i]); int value = Integer.parseInt(values[i]);
switch (value) { switch (value) {
case PreferencesUtils.MIN_RECORDING_INTERVAL_ADAPT_BATTERY_LIFE: case PreferencesUtils.MIN_RECORDING_INTERVAL_ADAPT_BATTERY_LIFE:
options[i] = getString(R.string.value_adapt_battery_life); options[i] = getString(R.string.value_adapt_battery_life);
summary[i] = options[i];
break; break;
case PreferencesUtils.MIN_RECORDING_INTERVAL_ADAPT_ACCURACY: case PreferencesUtils.MIN_RECORDING_INTERVAL_ADAPT_ACCURACY:
options[i] = getString(R.string.value_adapt_accuracy); options[i] = getString(R.string.value_adapt_accuracy);
summary[i] = options[i];
break; break;
case PreferencesUtils.MIN_RECORDING_INTERVAL_DEFAULT: case PreferencesUtils.MIN_RECORDING_INTERVAL_DEFAULT:
options[i] = getString(R.string.value_smallest_recommended); options[i] = getString(R.string.value_smallest_recommended);
summary[i] = getString(R.string.value_smallest);
break; break;
default: default:
options[i] = value < 60 ? getString(R.string.value_integer_second, value) options[i] = value < 60 ? getString(R.string.value_integer_second, value)
: getString(R.string.value_integer_minute, value / 60); : getString(R.string.value_integer_minute, value / 60);
summary[i] = getString(
R.string.settings_recording_location_frequency_summary, options[i]);
} }
} }
} }
/** /**
* Sets the recording distance interval summary and options. * Sets the recording distance interval options.
* *
* @param summary the summary
* @param options the options * @param options the options
* @param values the values * @param values the values
* @param metricUnits true for metric units * @param metricUnits true for metric units
*/ */
private void setRecordingDistanceIntervalSummaryAndOptions( private void setRecordingDistanceIntervalOptions(String[] options, String[] values, boolean metricUnits) {
String[] summary, String[] options, String[] values, boolean metricUnits) {
for (int i = 0; i < values.length; i++) { for (int i = 0; i < values.length; i++) {
int value = Integer.parseInt(values[i]); int value = Integer.parseInt(values[i]);
String displayValue; String displayValue;
@@ -211,20 +182,17 @@ public class RecordingSettingsActivity extends AbstractSettingsActivity
options[i] = displayValue; options[i] = displayValue;
} }
} }
summary[i] = getString(R.string.settings_recording_location_frequency_summary, displayValue);
} }
} }
/** /**
* Sets the max recording distance summary and options. * Sets the max recording distance options.
* *
* @param summary the summary
* @param options the options * @param options the options
* @param values the values * @param values the values
* @param metricUnits true for metric units * @param metricUnits true for metric units
*/ */
private void setMaxRecordingDistanceSummaryAndOptions( private void setMaxRecordingDistanceOptions(String[] options, String[] values, boolean metricUnits) {
String[] summary, String[] options, String[] values, boolean metricUnits) {
for (int i = 0; i < values.length; i++) { for (int i = 0; i < values.length; i++) {
int value = Integer.parseInt(values[i]); int value = Integer.parseInt(values[i]);
String displayValue; String displayValue;
@@ -250,21 +218,17 @@ public class RecordingSettingsActivity extends AbstractSettingsActivity
options[i] = displayValue; options[i] = displayValue;
} }
} }
summary[i] = getString(
R.string.settings_recording_max_recording_distance_summary, displayValue);
} }
} }
/** /**
* Sets the recording gps accuracy summary and options. * Sets the recording gps accuracy options.
* *
* @param summary the summary
* @param options the options * @param options the options
* @param values the values * @param values the values
* @param metricUnits true for metric units * @param metricUnits true for metric units
*/ */
private void setRecordingGpsAccuracySummaryAndOptions( private void setRecordingGpsAccuracyOptions(String[] options, String[] values, boolean metricUnits) {
String[] summary, String[] options, String[] values, boolean metricUnits) {
for (int i = 0; i < values.length; i++) { for (int i = 0; i < values.length; i++) {
int value = Integer.parseInt(values[i]); int value = Integer.parseInt(values[i]);
String displayValue; String displayValue;
@@ -307,36 +271,27 @@ public class RecordingSettingsActivity extends AbstractSettingsActivity
} }
} }
} }
summary[i] = getString(
R.string.settings_recording_min_required_accuracy_summary, displayValue);
} }
} }
/** /**
* Sets the auto resume track timeout summary and options. * Sets the auto resume track timeout options.
* *
* @param summary the summary
* @param options the options * @param options the options
* @param values the values * @param values the values
*/ */
private void setAutoResumeTrackTimeoutSummaryAndOptions(String[] summary, String[] options, String[] values) { private void setAutoResumeTrackTimeoutOptions(String[] options, String[] values) {
for (int i = 0; i < values.length; i++) { for (int i = 0; i < values.length; i++) {
int value = Integer.parseInt(values[i]); int value = Integer.parseInt(values[i]);
switch (value) { switch (value) {
case PreferencesUtils.AUTO_RESUME_TRACK_TIMEOUT_NEVER: case PreferencesUtils.AUTO_RESUME_TRACK_TIMEOUT_NEVER:
options[i] = getString(R.string.value_never); options[i] = getString(R.string.value_never);
summary[i] = getString(
R.string.settings_recording_auto_resume_track_timeout_never_summary);
break; break;
case PreferencesUtils.AUTO_RESUME_TRACK_TIMEOUT_ALWAYS: case PreferencesUtils.AUTO_RESUME_TRACK_TIMEOUT_ALWAYS:
options[i] = getString(R.string.value_always); options[i] = getString(R.string.value_always);
summary[i] = getString(
R.string.settings_recording_auto_resume_track_timeout_always_summary);
break; break;
default: default:
options[i] = getString(R.string.value_integer_minute, value); options[i] = getString(R.string.value_integer_minute, value);
summary[i] = getString(
R.string.settings_recording_auto_resume_track_timeout_summary, options[i]);
} }
} }
} }
@@ -27,6 +27,7 @@ import android.provider.Settings;
import de.dennisguse.opentracks.util.BluetoothDeviceUtils; import de.dennisguse.opentracks.util.BluetoothDeviceUtils;
import de.dennisguse.opentracks.util.PreferencesUtils; import de.dennisguse.opentracks.util.PreferencesUtils;
import de.dennisguse.opentracks.R; import de.dennisguse.opentracks.R;
import de.dennisguse.opentracks.util.StringUtils;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@@ -83,8 +84,10 @@ public class SensorSettingsActivity extends AbstractSettingsActivity {
devicesNameList.add(0, getString(R.string.value_none)); devicesNameList.add(0, getString(R.string.value_none));
devicesAddressList.add(0, PreferencesUtils.BLUETOOTH_SENSOR_DEFAULT); devicesAddressList.add(0, PreferencesUtils.BLUETOOTH_SENSOR_DEFAULT);
String[] options = devicesNameList.toArray(new String[0]);
String[] values = devicesAddressList.toArray(new String[0]); String[] values = devicesAddressList.toArray(new String[0]);
configureListPreference(preference, options, values, value, null); preference.setEntryValues(values);
String[] options = devicesNameList.toArray(new String[0]);
preference.setEntries(options);
} }
} }
@@ -23,6 +23,7 @@ import android.preference.Preference.OnPreferenceChangeListener;
import de.dennisguse.opentracks.util.PreferencesUtils; import de.dennisguse.opentracks.util.PreferencesUtils;
import de.dennisguse.opentracks.R; import de.dennisguse.opentracks.R;
import de.dennisguse.opentracks.util.StringUtils;
/** /**
* An activity for accessing stats settings. * An activity for accessing stats settings.
@@ -36,20 +37,17 @@ public class StatsSettingsActivity extends AbstractSettingsActivity {
super.onCreate(bundle); super.onCreate(bundle);
addPreferencesFromResource(R.xml.settings_statistics); addPreferencesFromResource(R.xml.settings_statistics);
/*
* Note configureUnitsListPreference will trigger
* configureRateListPreference
*/
configUnitsListPreference(); configUnitsListPreference();
boolean metricUnits = PreferencesUtils.STATS_UNITS_DEFAULT.equals(PreferencesUtils.getString(this, R.string.stats_units_key, ""));
configRateListPreference(metricUnits);
} }
/** /**
* Configures the preferred units list preference. * Configures the preferred units list preference.
*/ */
private void configUnitsListPreference() { private void configUnitsListPreference() {
ListPreference listPreference = (ListPreference) findPreference( ListPreference listPreference = (ListPreference) findPreference(getString(R.string.stats_units_key));
getString(R.string.stats_units_key)); final OnPreferenceChangeListener listener = new OnPreferenceChangeListener() {
OnPreferenceChangeListener listener = new OnPreferenceChangeListener() {
@Override @Override
public boolean onPreferenceChange(Preference pref, Object newValue) { public boolean onPreferenceChange(Preference pref, Object newValue) {
@@ -58,11 +56,15 @@ public class StatsSettingsActivity extends AbstractSettingsActivity {
return true; return true;
} }
}; };
String value = PreferencesUtils.getString( listPreference.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
this, R.string.stats_units_key, PreferencesUtils.STATS_UNITS_DEFAULT); @Override
String[] values = getResources().getStringArray(R.array.stats_units_values); public boolean onPreferenceChange(Preference pref, Object newValue) {
String[] options = getResources().getStringArray(R.array.stats_units_options); if (listener != null) {
configureListPreference(listPreference, options, values, value, listener); listener.onPreferenceChange(pref, newValue);
}
return true;
}
});
} }
/** /**
@@ -71,13 +73,9 @@ public class StatsSettingsActivity extends AbstractSettingsActivity {
* @param metricUnits true if metric units * @param metricUnits true if metric units
*/ */
private void configRateListPreference(boolean metricUnits) { private void configRateListPreference(boolean metricUnits) {
ListPreference listPreference = (ListPreference) findPreference( ListPreference listPreference = (ListPreference) findPreference(getString(R.string.stats_rate_key));
getString(R.string.stats_rate_key)); String[] options = getResources().getStringArray(metricUnits ? R.array.stats_rate_metric_options : R.array.stats_rate_imperial_options);
String value = PreferencesUtils.getString(
this, R.string.stats_rate_key, PreferencesUtils.STATS_RATE_DEFAULT); listPreference.setEntries(options);
String[] values = getResources().getStringArray(R.array.stats_rate_values);
String[] options = getResources().getStringArray(
metricUnits ? R.array.stats_rate_metric_options : R.array.stats_rate_imperial_options);
configureListPreference(listPreference, options, values, value, null);
} }
} }
+2
View File
@@ -19,6 +19,8 @@ limitations under the License.
android:defaultValue="@string/chart_x_axis_distance" android:defaultValue="@string/chart_x_axis_distance"
android:key="@string/chart_x_axis_key" android:key="@string/chart_x_axis_key"
android:summary="%s" android:summary="%s"
android:entryValues="@array/chart_x_axis_values"
android:entries="@array/chart_x_axis_options"
android:title="@string/settings_chart_x_axis" /> android:title="@string/settings_chart_x_axis" />
<PreferenceCategory android:title="@string/settings_show"> <PreferenceCategory android:title="@string/settings_show">
<CheckBoxPreference <CheckBoxPreference
+10
View File
@@ -13,20 +13,25 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
--> -->
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
android:title="@string/settings_recording"> android:title="@string/settings_recording">
<ListPreference <ListPreference
android:defaultValue="0" android:defaultValue="0"
android:entryValues="@array/frequency_values"
android:key="@string/voice_frequency_key" android:key="@string/voice_frequency_key"
android:summary="%s" android:summary="%s"
android:title="@string/menu_voice_frequency" /> android:title="@string/menu_voice_frequency" />
<ListPreference <ListPreference
android:defaultValue="0" android:defaultValue="0"
android:entryValues="@array/frequency_values"
android:key="@string/split_frequency_key" android:key="@string/split_frequency_key"
android:summary="%s" android:summary="%s"
android:title="@string/menu_split_frequency" /> android:title="@string/menu_split_frequency" />
<ListPreference <ListPreference
android:defaultValue="@string/settings_recording_track_name_date_iso_8601_value" android:defaultValue="@string/settings_recording_track_name_date_iso_8601_value"
android:entries="@array/stats_units_options"
android:entryValues="@array/stats_units_values"
android:key="@string/track_name_key" android:key="@string/track_name_key"
android:summary="%s" android:summary="%s"
android:title="@string/settings_recording_track_name_title" /> android:title="@string/settings_recording_track_name_title" />
@@ -37,26 +42,31 @@ limitations under the License.
android:title="@string/settings_recording_default_activity_title" /> android:title="@string/settings_recording_default_activity_title" />
<ListPreference <ListPreference
android:defaultValue="0" android:defaultValue="0"
android:entryValues="@array/min_recording_interval_values"
android:key="@string/min_recording_interval_key" android:key="@string/min_recording_interval_key"
android:summary="%s" android:summary="%s"
android:title="@string/settings_recording_min_recording_interval_title" /> android:title="@string/settings_recording_min_recording_interval_title" />
<ListPreference <ListPreference
android:defaultValue="10" android:defaultValue="10"
android:entryValues="@array/recording_distance_interval_values"
android:key="@string/recording_distance_interval_key" android:key="@string/recording_distance_interval_key"
android:summary="%s" android:summary="%s"
android:title="@string/settings_recording_min_recording_distance_title" /> android:title="@string/settings_recording_min_recording_distance_title" />
<ListPreference <ListPreference
android:defaultValue="200" android:defaultValue="200"
android:entryValues="@array/max_recording_distance_values"
android:key="@string/max_recording_distance_key" android:key="@string/max_recording_distance_key"
android:summary="%s" android:summary="%s"
android:title="@string/settings_recording_max_recording_distance_title" /> android:title="@string/settings_recording_max_recording_distance_title" />
<ListPreference <ListPreference
android:defaultValue="50" android:defaultValue="50"
android:entryValues="@array/recording_gps_accuracy_values"
android:key="@string/recording_gps_accuracy_key" android:key="@string/recording_gps_accuracy_key"
android:summary="%s" android:summary="%s"
android:title="@string/settings_recording_min_required_accuracy_title" /> android:title="@string/settings_recording_min_required_accuracy_title" />
<ListPreference <ListPreference
android:defaultValue="10" android:defaultValue="10"
android:entryValues="@array/auto_resume_track_timeout_values"
android:key="@string/auto_resume_track_timeout_key" android:key="@string/auto_resume_track_timeout_key"
android:summary="%s" android:summary="%s"
android:title="@string/settings_recording_auto_resume_track_timeout_title" /> android:title="@string/settings_recording_auto_resume_track_timeout_title" />
+4
View File
@@ -17,11 +17,15 @@ limitations under the License.
android:title="@string/track_detail_stats_tab"> android:title="@string/track_detail_stats_tab">
<ListPreference <ListPreference
android:defaultValue="@string/stats_units_metric" android:defaultValue="@string/stats_units_metric"
android:entries="@array/stats_units_options"
android:entryValues="@array/stats_units_values"
android:key="@string/stats_units_key" android:key="@string/stats_units_key"
android:summary="%s" android:summary="%s"
android:title="@string/settings_stats_units_title" /> android:title="@string/settings_stats_units_title" />
<ListPreference <ListPreference
android:defaultValue="@string/stats_rate_speed" android:defaultValue="@string/stats_rate_speed"
android:entries="@array/stats_rate_metric_options"
android:entryValues="@array/stats_rate_values"
android:key="@string/stats_rate_key" android:key="@string/stats_rate_key"
android:summary="%s" android:summary="%s"
android:title="@string/settings_stats_rate_title" /> android:title="@string/settings_stats_rate_title" />