diff --git a/MyTracks/AndroidManifest.xml b/MyTracks/AndroidManifest.xml index 6162cfcdd..0a7e83581 100755 --- a/MyTracks/AndroidManifest.xml +++ b/MyTracks/AndroidManifest.xml @@ -208,7 +208,7 @@ limitations under the License. - + diff --git a/MyTracks/res/values/arrays_do_not_translate.xml b/MyTracks/res/values/arrays_do_not_translate.xml index 6afb23b62..d97c63fbe 100644 --- a/MyTracks/res/values/arrays_do_not_translate.xml +++ b/MyTracks/res/values/arrays_do_not_translate.xml @@ -15,6 +15,7 @@ See the License for the specific language governing permissions and limitations under the License. --> + @string/activity_type_airplane @@ -160,32 +161,37 @@ limitations under the License. 5000 - @string/value_none - @string/settings_sensor_type_ant @string/settings_sensor_type_polar @string/settings_sensor_type_zephyr + @string/settings_sensor_type_ant + @string/value_none - @string/sensor_type_value_none - @string/sensor_type_value_ant @string/sensor_type_value_polar @string/sensor_type_value_zephyr + @string/sensor_type_value_ant + @string/sensor_type_value_none - @string/value_none @string/settings_sensor_type_polar @string/settings_sensor_type_zephyr + @string/value_none - @string/sensor_type_value_none @string/sensor_type_value_polar @string/sensor_type_value_zephyr + @string/sensor_type_value_none @string/settings_map_track_color_mode_single @string/settings_map_track_color_mode_fixed @string/settings_map_track_color_mode_dynamic + + @string/settings_map_track_color_mode_single + @string/settings_map_track_color_mode_fixed_summary + @string/settings_map_track_color_mode_dynamic_summary + @string/settings_map_track_color_mode_single_value @string/settings_map_track_color_mode_fixed_value @@ -256,4 +262,5 @@ limitations under the License. @string/waypoint_type_water_fountain @string/waypoint_type_waypoint + \ No newline at end of file diff --git a/MyTracks/res/values/keys.xml b/MyTracks/res/values/keys.xml index 631f15b66..ed696f8b2 100644 --- a/MyTracks/res/values/keys.xml +++ b/MyTracks/res/values/keys.xml @@ -71,8 +71,7 @@ limitations under the License. settingsBackup - settingsBackupNow - settingsBackupRestore + settingsBackupReset settingsChart settingsGoogle settingsMap @@ -81,6 +80,7 @@ limitations under the License. settingsMapSlowDisplay settingsRecording settingsReset + settingsRestore settingsSensor settingsSensorAnt settingsSensorAntResetBikeCadenceSensor diff --git a/MyTracks/res/values/strings.xml b/MyTracks/res/values/strings.xml index 7abf8dbaf..5e7db06cf 100644 --- a/MyTracks/res/values/strings.xml +++ b/MyTracks/res/values/strings.xml @@ -1585,7 +1585,7 @@ limitations under the License. - Not available while recording a track. + Not available while recording a track - Backup + Backup & reset Backup now @@ -1616,15 +1615,15 @@ limitations under the License. Unable to backup. + translation_description="In the 'Backup and reset' settings, after pressing the 'Backup now' + option, the progress message telling the user that it is writing all tracks and settings to + the external storage."> Writing all tracks and settings… - Write a full copy of all your tracks and settings to the external storage. + translation_description="In the 'Backup and reset' settings, the summary for the 'Backup now' + option explaining that all tracks and settings will be written to the external storage."> + Write a full copy of all your tracks and settings to the external storage @@ -1633,16 +1632,16 @@ limitations under the License. Restore now + translation_description="In the 'Backup and reset' settings, after pressing the 'Restore now' + option, the message in the alert dialog asking the user to confirm that he wants to restore + from a backup and it will overwrite all the current tracks and settings."> Restoring a backup from the external storage will overwrite all your current tracks and settings. @@ -1651,25 +1650,26 @@ limitations under the License. Unable to restore from backup. + translation_description="In the 'Backup and reset' settings, after pressing the 'Restore now' + option, the message in the alert dialog informing the user that there is no backup to restore + from."> No backup found. + translation_description="In the 'Backup and reset' settings, after pressing the 'Restore now' + option, the progress message informing that My Tracks is reading all tracks and settings from + the backup on the external storage."> Reading all tracks and settings… + translation_description="In the 'Backup and reset' settings, after pressing the 'Restore now' + option, the title in the picker dialog asking the user to select a backup."> Select a backup to restore - Restore all tracks and settings from the external storage. + translation_description="In the 'Backup and reset' settings, the summary for the 'Restore now' + option explaining that it restores all tracks and settings from the external storage."> + Restore all tracks and settings from the external storage @@ -1820,73 +1820,84 @@ limitations under the License. Recording + + Always resume a recording after reboot + + + Never resume a recording after reboot + + + Resume a recording after reboot if the last recorded loation was within the last %1$s + Auto-resume - - Recording is resumed after reboot if the last recorded time is within this. - - Default activity + Default activity type - - Default activity type for a new track. + + %1$s between recorded locations + + + A new segment is created if the distance between two locations is greater than %1$s Max distance - - Maximum distance between locations in the same segment. - - Min distance - - - Minimum distance between recorded locations. + Recording distance interval - Location frequency + Recording time interval - - Time between two GPS locations. + + Location is ignored if its accuracy is less than %1$s GPS accuracy - - GPS location is ignored if it is not this accurate. - - - Time/distance between two split markers. - Date (ISO 8601) Date (local) Location Number - Track name - - - Way to name a new track. - - - Time/distance between two voice announcements. + Default track name Reset - All your settings will be erased and reverted to the default values. Saved tracks will be - preserved. + translation_description="In the 'Backup and reset' settings, after pressing the 'Reset' option, + the confirmation dialog message informing the user that all settings will be reverted."> + All settings will be erased and reverted to the default values. Saved tracks will be preserved. - All settings have been reverted to their defaults. + translation_description="In the 'Backup and reset' settings, after pressing the 'Reset' option, + the confirmation dialog informing the user that all settings have been reverted to the default + values."> + All settings have been reverted to the default values. - Revert all your settings to the default values. + translation_description="In the 'Backup and reset' settings, the summary for the 'Reset' option + explaining it will revert all settings to the default values."> + Revert all your settings to the default values Sensor - - ANT+ options + + Not connected - Paired with: %1$d + Paired with %1$d Reset bike cadence Reset combined bike Reset heart rate Reset foot pod - - Bluetooth options + Bluetooth Bluetooth pairing - Open Android\'s Bluetooth settings to pair a device. + translation_description="In the 'Sensor' settings, under the 'Bluetooth' section, the summary + for the 'Bluetooth pairing' option explaining that it will open the Android's Bluetooth + settings to pair a sensor."> + Open Android\'s Bluetooth settings to pair a sensor Bluetooth sensor - - The Bluetooth sensor to connect to. - + %1$s: sensor name. E.g., 'Polar Bluetooth'."> Connected to %1$s - - Not connected. - Sensor type ANT+ Polar Bluetooth - - The type of sensor to connect to. - Zephyr Bluetooth @@ -2660,6 +2633,10 @@ limitations under the License. translation_description="In a setting picker, the value to turn off the feature."> Off + + Smallest + diff --git a/MyTracks/res/xml/backup_settings.xml b/MyTracks/res/xml/backup_reset_settings.xml similarity index 76% rename from MyTracks/res/xml/backup_settings.xml rename to MyTracks/res/xml/backup_reset_settings.xml index e336832e9..f4341c29b 100644 --- a/MyTracks/res/xml/backup_settings.xml +++ b/MyTracks/res/xml/backup_reset_settings.xml @@ -15,13 +15,17 @@ See the License for the specific language governing permissions and limitations under the License. --> + android:title="@string/settings_backup_reset" > + \ No newline at end of file diff --git a/MyTracks/res/xml/sensor_settings.xml b/MyTracks/res/xml/sensor_settings.xml index e79307e31..40d1d4335 100644 --- a/MyTracks/res/xml/sensor_settings.xml +++ b/MyTracks/res/xml/sensor_settings.xml @@ -23,7 +23,7 @@ limitations under the License. android:title="@string/settings_sensor_type" /> + android:title="@string/settings_sensor_bluetooth" > + android:title="@string/settings_sensor_type_ant" > - + android:title="@string/settings_backup_reset" /> \ No newline at end of file diff --git a/MyTracks/src/com/google/android/apps/mytracks/TrackEditActivity.java b/MyTracks/src/com/google/android/apps/mytracks/TrackEditActivity.java index 7ef48c44e..0173d6f24 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/TrackEditActivity.java +++ b/MyTracks/src/com/google/android/apps/mytracks/TrackEditActivity.java @@ -124,7 +124,7 @@ public class TrackEditActivity extends AbstractMyTracksActivity { Button cancel = (Button) findViewById(R.id.track_edit_cancel); if (getIntent().getBooleanExtra(EXTRA_NEW_TRACK, false)) { String trackName = TrackNameUtils.getTrackName( - this, -1L, -1L, myTracksProviderUtils.getLastValidTrackPoint(trackId)); + this, -1L, -1L, myTracksProviderUtils.getFirstValidTrackPoint(trackId)); if (trackName != null) { name.setText(trackName); } diff --git a/MyTracks/src/com/google/android/apps/mytracks/settings/AbstractSettingsActivity.java b/MyTracks/src/com/google/android/apps/mytracks/settings/AbstractSettingsActivity.java index a719753bb..70497e42d 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/settings/AbstractSettingsActivity.java +++ b/MyTracks/src/com/google/android/apps/mytracks/settings/AbstractSettingsActivity.java @@ -52,7 +52,7 @@ public class AbstractSettingsActivity extends PreferenceActivity { preferenceManager.setSharedPreferencesMode(Context.MODE_PRIVATE); // Set up automatic preferences backup - backupPreferencesListener = new BackupPreferencesListener(this); + backupPreferencesListener = new BackupPreferencesListener(this); preferenceManager.getSharedPreferences() .registerOnSharedPreferenceChangeListener(backupPreferencesListener); @@ -77,114 +77,66 @@ public class AbstractSettingsActivity extends PreferenceActivity { } /** - * Configures a preference. + * Configures a list preference. * - * @param preference the preference - * @param options the list of displayed options - * @param values the list of stored values - * @param summaryId the summary id - * @param value the stored value + * @param listPreference the list preference + * @param summary the summary array + * @param options the options array + * @param values the values array + * @param value the value + * @param listener optional listener */ - protected void configurePreference(final Preference preference, final String[] options, - final String[] values, final int summaryId, String value) { - configurePreference(preference, options, values, summaryId, value, null); - } - - /** - * Configures a preference. - * - * @param preference the preference - * @param options the list of displayed options - * @param values the list of stored values - * @param summaryId the summary id - * @param value the stored value - * @param listener listener to invoke - */ - protected void configurePreference(final Preference preference, final String[] options, - final String[] values, final int summaryId, String value, + protected void configureListPreference(ListPreference listPreference, final String[] summary, + final String[] options, final String[] values, String value, final OnPreferenceChangeListener listener) { - if (options != null) { - ((ListPreference) preference).setEntries(options); - } - if (values != null) { - ((ListPreference) preference).setEntryValues(values); - } - preference.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { + listPreference.setEntryValues(values); + listPreference.setEntries(options); + listPreference.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { @Override public boolean onPreferenceChange(Preference pref, Object newValue) { - updatePreferenceSummary(pref, options, values, summaryId, (String) newValue); + updatePreferenceSummary(pref, summary, values, (String) newValue); if (listener != null) { listener.onPreferenceChange(pref, newValue); } return true; } }); - updatePreferenceSummary(preference, options, values, summaryId, value); + updatePreferenceSummary(listPreference, summary, values, value); if (listener != null) { - listener.onPreferenceChange(preference, value); + listener.onPreferenceChange(listPreference, value); } } - protected void configurePreference(final Preference preference, final String[] options, - final String[] values, String value, final OnPreferenceChangeListener listener) { - if (options != null) { - ((ListPreference) preference).setEntries(options); - } - if (values != null) { - ((ListPreference) preference).setEntryValues(values); - } - preference.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(preference, value); - } - } - /** - * Updates a preference when a stored value changes. + * Update the preference summary. * * @param preference the preference - * @param options the list of displayed options - * @param values the list of stored values - * @param summaryId the summary id - * @param value the stored value + * @param summary the summary array + * @param values the values array + * @param value the value */ private void updatePreferenceSummary( - Preference preference, String[] options, String[] values, int summaryId, String value) { - String summary = getString(summaryId); - String option; - if (options != null && values != null) { - option = getOption(options, values, value); - if (option == null) { - option = getString(R.string.value_unknown); - } + Preference preference, String[] summary, String[] values, String value) { + int index = getIndex(values, value); + if (index == -1) { + preference.setSummary(R.string.value_unknown); } else { - option = value != null && value.length() != 0 ? value : getString(R.string.value_unknown); + preference.setSummary(summary[index]); } - summary += "\n" + option; - preference.setSummary(summary); } /** - * Gets the display option for a stored value. + * Get the array index for a value. * - * @param options the list of the display options - * @param values the list of the stored values - * @param value the store value + * @param values the array + * @param value the value */ - private String getOption(String[] options, String[] values, String value) { + private int getIndex(String[] values, String value) { for (int i = 0; i < values.length; i++) { if (value.equals(values[i])) { - return options[i]; + return i; } } - return null; + return -1; } } diff --git a/MyTracks/src/com/google/android/apps/mytracks/settings/BackupSettingsActivity.java b/MyTracks/src/com/google/android/apps/mytracks/settings/BackupResetSettingsActivity.java similarity index 51% rename from MyTracks/src/com/google/android/apps/mytracks/settings/BackupSettingsActivity.java rename to MyTracks/src/com/google/android/apps/mytracks/settings/BackupResetSettingsActivity.java index 52b5abad6..1835dbfb7 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/settings/BackupSettingsActivity.java +++ b/MyTracks/src/com/google/android/apps/mytracks/settings/BackupResetSettingsActivity.java @@ -33,19 +33,24 @@ import android.content.SharedPreferences.OnSharedPreferenceChangeListener; 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 the backup settings. + * An activity for accessing the backup and reset settings. * * @author Jimmy Shih */ -public class BackupSettingsActivity extends AbstractSettingsActivity { +public class BackupResetSettingsActivity extends AbstractSettingsActivity { + private static final String TAG = BackupResetSettingsActivity.class.getSimpleName(); private static final int DIALOG_CONFIRM_RESTORE_ID = 0; + private static final int DIALOG_CONFIRM_RESET_ID = 1; private SharedPreferences sharedPreferences; private Preference backupPreference; - private Preference restorePreference; + private Preference restoreNowPreference; + private Preference resetPreference; private long recordingTrackId = PreferencesUtils.RECORDING_TRACK_ID_DEFAULT; @@ -57,12 +62,10 @@ public class BackupSettingsActivity extends AbstractSettingsActivity { sharedPreferenceChangeListener = new OnSharedPreferenceChangeListener() { @Override public void onSharedPreferenceChanged(SharedPreferences preferences, String key) { - if (key == null || key.equals(PreferencesUtils.getKey( - BackupSettingsActivity.this, R.string.recording_track_id_key))) { + if (key != null && key.equals(PreferencesUtils.getKey( + BackupResetSettingsActivity.this, R.string.recording_track_id_key))) { recordingTrackId = PreferencesUtils.getLong( - BackupSettingsActivity.this, R.string.recording_track_id_key); - } - if (key != null) { + BackupResetSettingsActivity.this, R.string.recording_track_id_key); runOnUiThread(new Runnable() { @Override public void run() { @@ -77,60 +80,81 @@ public class BackupSettingsActivity extends AbstractSettingsActivity { @Override protected void onCreate(Bundle bundle) { super.onCreate(bundle); + addPreferencesFromResource(R.xml.backup_reset_settings); + sharedPreferences = getSharedPreferences(Constants.SETTINGS_NAME, Context.MODE_PRIVATE); - addPreferencesFromResource(R.xml.backup_settings); - backupPreference = findPreference(getString(R.string.settings_backup_now_key)); + backupPreference = findPreference(getString(R.string.settings_backup_key)); backupPreference.setOnPreferenceClickListener(new OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference preference) { - Intent intent = IntentUtils.newIntent(BackupSettingsActivity.this, BackupActivity.class); + Intent intent = IntentUtils.newIntent( + BackupResetSettingsActivity.this, BackupActivity.class); startActivity(intent); return true; } }); - restorePreference = findPreference(getString(R.string.settings_backup_restore_key)); - restorePreference.setOnPreferenceClickListener(new OnPreferenceClickListener() { + restoreNowPreference = findPreference(getString(R.string.settings_restore_key)); + restoreNowPreference.setOnPreferenceClickListener(new OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference preference) { showDialog(DIALOG_CONFIRM_RESTORE_ID); 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 Dialog onCreateDialog(int id) { - if (id != DIALOG_CONFIRM_RESTORE_ID) { - return null; + Dialog dialog; + switch (id) { + case DIALOG_CONFIRM_RESTORE_ID: + dialog = DialogUtils.createConfirmationDialog(this, + R.string.settings_backup_restore_confirm_message, + new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface d, int which) { + Intent intent = IntentUtils.newIntent( + BackupResetSettingsActivity.this, RestoreChooserActivity.class); + startActivity(intent); + } + }); + break; + case DIALOG_CONFIRM_RESET_ID: + dialog = DialogUtils.createConfirmationDialog( + this, R.string.settings_reset_confirm_message, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface d, int button) { + onResetPreferencesConfirmed(); + } + }); + break; + default: + dialog = 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 onStart() { - super.onStart(); - sharedPreferences.registerOnSharedPreferenceChangeListener(sharedPreferenceChangeListener); - sharedPreferenceChangeListener.onSharedPreferenceChanged(null, null); + return dialog; } @Override protected void onResume() { super.onResume(); + sharedPreferences.registerOnSharedPreferenceChangeListener(sharedPreferenceChangeListener); + recordingTrackId = PreferencesUtils.getLong(this, R.string.recording_track_id_key); updateUi(); } @Override - protected void onStop() { - super.onStop(); + protected void onPause() { + super.onPause(); sharedPreferences.unregisterOnSharedPreferenceChangeListener(sharedPreferenceChangeListener); } @@ -140,10 +164,45 @@ public class BackupSettingsActivity extends AbstractSettingsActivity { private void updateUi() { boolean isRecording = recordingTrackId != 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 + + restoreNowPreference.setEnabled(!isRecording); + restoreNowPreference.setSummary(isRecording ? R.string.settings_not_while_recording : R.string.settings_backup_restore_summary); + + resetPreference.setEnabled(!isRecording); + resetPreference.setSummary( + isRecording ? R.string.settings_not_while_recording : R.string.settings_reset_summary); + } + + /** + * 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"); + + // 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( + BackupResetSettingsActivity.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(); } } diff --git a/MyTracks/src/com/google/android/apps/mytracks/settings/MapSettingsActivity.java b/MyTracks/src/com/google/android/apps/mytracks/settings/MapSettingsActivity.java index 5e909d24a..9a61c4ff5 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/settings/MapSettingsActivity.java +++ b/MyTracks/src/com/google/android/apps/mytracks/settings/MapSettingsActivity.java @@ -41,7 +41,6 @@ public class MapSettingsActivity extends AbstractSettingsActivity { private static final String TAG = MapSettingsActivity.class.getSimpleName(); - private ListPreference trackColorModePreference; private EditTextPreference slowPreference; private EditTextPreference mediumPreference; private EditTextPreference percentagePreference; @@ -52,8 +51,6 @@ public class MapSettingsActivity extends AbstractSettingsActivity { super.onCreate(bundle); addPreferencesFromResource(R.xml.map_settings); - trackColorModePreference = (ListPreference) findPreference( - getString(R.string.track_color_mode_key)); slowPreference = (EditTextPreference) findPreference( getString(R.string.settings_map_slow_display_key)); mediumPreference = (EditTextPreference) findPreference( @@ -79,6 +76,8 @@ public class MapSettingsActivity extends AbstractSettingsActivity { * Configures the track color mode preference. */ private void configTrackColorModePerference() { + ListPreference preference = (ListPreference) findPreference( + getString(R.string.track_color_mode_key)); OnPreferenceChangeListener listener = new OnPreferenceChangeListener() { @Override public boolean onPreferenceChange(Preference preference, Object newValue) { @@ -86,11 +85,12 @@ public class MapSettingsActivity extends AbstractSettingsActivity { return true; } }; - String trackColorMode = PreferencesUtils.getString( + String value = PreferencesUtils.getString( this, R.string.track_color_mode_key, PreferencesUtils.TRACK_COLOR_MODE_DEFAULT); - configurePreference(trackColorModePreference, - getResources().getStringArray(R.array.track_color_mode_options), - getResources().getStringArray(R.array.track_color_mode_values), trackColorMode, listener); + String[] values = getResources().getStringArray(R.array.track_color_mode_values); + String[] options = getResources().getStringArray(R.array.track_color_mode_options); + String[] summary = getResources().getStringArray(R.array.track_color_mode_summary); + configureListPreference(preference, summary, options, values, value, listener); } /** @@ -204,13 +204,6 @@ public class MapSettingsActivity extends AbstractSettingsActivity { getString(R.string.settings_map_track_color_mode_fixed_value)); boolean isDynamicValue = trackColorMode.equals( getString(R.string.settings_map_track_color_mode_dynamic_value)); - if (isDynamicValue) { - trackColorModePreference.setSummary(R.string.settings_map_track_color_mode_dynamic_summary); - } else if (isFixedValue) { - trackColorModePreference.setSummary(R.string.settings_map_track_color_mode_fixed_summary); - } else { - trackColorModePreference.setSummary(R.string.settings_map_track_color_mode_single); - } slowPreference.setEnabled(isFixedValue); mediumPreference.setEnabled(isFixedValue); percentagePreference.setEnabled(isDynamicValue); diff --git a/MyTracks/src/com/google/android/apps/mytracks/settings/RecordingSettingsActivity.java b/MyTracks/src/com/google/android/apps/mytracks/settings/RecordingSettingsActivity.java index 5c3db1d88..ca456ce30 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/settings/RecordingSettingsActivity.java +++ b/MyTracks/src/com/google/android/apps/mytracks/settings/RecordingSettingsActivity.java @@ -41,178 +41,224 @@ public class RecordingSettingsActivity extends AbstractSettingsActivity { boolean metricUnits = PreferencesUtils.getBoolean( this, R.string.metric_units_key, PreferencesUtils.METRIC_UNITS_DEFAULT); - int voiceFrequencyValue = PreferencesUtils.getInt( - this, R.string.voice_frequency_key, PreferencesUtils.VOICE_FREQUENCY_DEFAULT); - ListPreference voiceFrequencyListPreference = (ListPreference) findPreference( - getString(R.string.voice_frequency_key)); - configurePreference(voiceFrequencyListPreference, - StringUtils.getFrequencyOptions(this, metricUnits), - getResources().getStringArray(R.array.frequency_values), - R.string.settings_recording_voice_frequency_summary, String.valueOf(voiceFrequencyValue)); + configFrequencyPreference(R.string.voice_frequency_key, + PreferencesUtils.VOICE_FREQUENCY_DEFAULT, R.array.frequency_values, metricUnits); + configFrequencyPreference(R.string.split_frequency_key, + PreferencesUtils.SPLIT_FREQUENCY_DEFAULT, R.array.frequency_values, metricUnits); + configTrackName(); + configDefaultActivity(); + configListPreference(R.string.min_recording_interval_key, + PreferencesUtils.MIN_RECORDING_INTERVAL_DEFAULT, R.array.min_recording_interval_values, + metricUnits); + configListPreference(R.string.min_recording_distance_key, + PreferencesUtils.MIN_RECORDING_DISTANCE_DEFAULT, R.array.min_recording_distance_values, + metricUnits); + configListPreference(R.string.max_recording_distance_key, + PreferencesUtils.MAX_RECORDING_DISTANCE_DEFAULT, R.array.max_recording_distance_values, + metricUnits); + configListPreference(R.string.min_required_accuracy_key, + PreferencesUtils.MIN_REQUIRED_ACCURACY_DEFAULT, R.array.min_required_accuracy_values, + metricUnits); + configListPreference(R.string.auto_resume_track_timeout_key, + PreferencesUtils.AUTO_RESUME_TRACK_TIMEOUT_DEFAULT, + R.array.auto_resume_track_timeout_values, metricUnits); + } - int splitFrequencyValue = PreferencesUtils.getInt( - this, R.string.split_frequency_key, PreferencesUtils.SPLIT_FREQUENCY_DEFAULT); - ListPreference splitFrequencyListPreference = (ListPreference) findPreference( - getString(R.string.split_frequency_key)); - configurePreference(splitFrequencyListPreference, - StringUtils.getFrequencyOptions(this, metricUnits), - getResources().getStringArray(R.array.frequency_values), - R.string.settings_recording_split_frequency_summary, String.valueOf(splitFrequencyValue)); + private void configFrequencyPreference( + int key, int defaultValue, int valueArray, boolean metricUnits) { + 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, options, values, String.valueOf(value), null); + } - String trackNameValue = PreferencesUtils.getString( + private void configTrackName() { + ListPreference preference = (ListPreference) findPreference(getString(R.string.track_name_key)); + String value = PreferencesUtils.getString( this, R.string.track_name_key, PreferencesUtils.TRACK_NAME_DEFAULT); - ListPreference trackNameListPreference = (ListPreference) findPreference( - getString(R.string.track_name_key)); - configurePreference(trackNameListPreference, - getResources().getStringArray(R.array.track_name_options), - getResources().getStringArray(R.array.track_name_values), - R.string.settings_recording_track_name_summary, trackNameValue); + String[] values = getResources().getStringArray(R.array.track_name_values); + String[] options = getResources().getStringArray(R.array.track_name_options); + configureListPreference(preference, options, options, values, value, null); + } - String defaultActivityValue = PreferencesUtils.getString( + private void configDefaultActivity() { + Preference preference = findPreference(getString(R.string.default_activity_key)); + String value = PreferencesUtils.getString( this, R.string.default_activity_key, PreferencesUtils.DEFAULT_ACTIVITY_DEFAULT); - Preference defaultActivityPreference = findPreference(getString(R.string.default_activity_key)); - configurePreference(defaultActivityPreference, null, null, - R.string.settings_recording_default_activity_summary, defaultActivityValue); + preference.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { + @Override + public boolean onPreferenceChange(Preference pref, Object newValue) { + String stringValue = (String) newValue; + pref.setSummary(stringValue != null + && !stringValue.equals(PreferencesUtils.DEFAULT_ACTIVITY_DEFAULT) ? stringValue + : getString(R.string.value_unknown)); + return true; + } + }); + preference.setSummary( + value != null && !value.equals(PreferencesUtils.DEFAULT_ACTIVITY_DEFAULT) ? value + : getString(R.string.value_unknown)); + } - int minRecordingIntervalValue = PreferencesUtils.getInt( - this, R.string.min_recording_interval_key, PreferencesUtils.MIN_RECORDING_INTERVAL_DEFAULT); - ListPreference minRecordingIntervalListPreference = (ListPreference) findPreference( - getString(R.string.min_recording_interval_key)); - configurePreference(minRecordingIntervalListPreference, getMinRecordingIntervalOptions(), - getResources().getStringArray(R.array.min_recording_interval_values), - R.string.settings_recording_min_recording_interval_summary, - String.valueOf(minRecordingIntervalValue)); - - int minRecordingDistanceValue = PreferencesUtils.getInt( - this, R.string.min_recording_distance_key, PreferencesUtils.MIN_RECORDING_DISTANCE_DEFAULT); - ListPreference minRecordingDistanceListPreference = (ListPreference) findPreference( - getString(R.string.min_recording_distance_key)); - configurePreference(minRecordingDistanceListPreference, - getMinRecordingDistanceOptions(metricUnits), - getResources().getStringArray(R.array.min_recording_distance_values), - R.string.settings_recording_min_recording_distance_summary, - String.valueOf(minRecordingDistanceValue)); - - int maxRecordingDistanceValue = PreferencesUtils.getInt( - this, R.string.max_recording_distance_key, PreferencesUtils.MAX_RECORDING_DISTANCE_DEFAULT); - ListPreference maxRecordingDistanceListPreference = (ListPreference) findPreference( - getString(R.string.max_recording_distance_key)); - configurePreference(maxRecordingDistanceListPreference, - getMaxRecordingDistanceOptions(metricUnits), - getResources().getStringArray(R.array.max_recording_distance_values), - R.string.settings_recording_max_recording_distance_summary, - String.valueOf(maxRecordingDistanceValue)); - - int minRequiredAcuracyValue = PreferencesUtils.getInt( - this, R.string.min_required_accuracy_key, PreferencesUtils.MIN_REQUIRED_ACCURACY_DEFAULT); - ListPreference minRequiredAccuracyListPreference = (ListPreference) findPreference( - getString(R.string.min_required_accuracy_key)); - configurePreference(minRequiredAccuracyListPreference, - getMinRequiredAccuracyOptions(metricUnits), - getResources().getStringArray(R.array.min_required_accuracy_values), - R.string.settings_recording_min_required_accuracy_summary, - String.valueOf(minRequiredAcuracyValue)); - - int autoResumeTrackTimeoutValue = PreferencesUtils.getInt(this, - R.string.auto_resume_track_timeout_key, PreferencesUtils.AUTO_RESUME_TRACK_TIMEOUT_DEFAULT); - ListPreference autoResumeTrackTimeoutListPreference = (ListPreference) findPreference( - getString(R.string.auto_resume_track_timeout_key)); - configurePreference(autoResumeTrackTimeoutListPreference, getAutoResumeTrackTimeoutOptions(), - getResources().getStringArray(R.array.auto_resume_track_timeout_values), - R.string.settings_recording_auto_resume_track_timeout_summary, - String.valueOf(autoResumeTrackTimeoutValue)); + private void configListPreference( + int key, int defaultValue, int valueArray, boolean metricUnits) { + ListPreference preference = (ListPreference) findPreference(getString(key)); + int value = PreferencesUtils.getInt(this, key, defaultValue); + String[] values = getResources().getStringArray(valueArray); + String[] options = new String[values.length]; + String[] summary = new String[values.length]; + switch (key) { + case R.string.min_recording_interval_key: + setMinRecordingIntervalSummaryAndOptions(summary, options, values); + break; + case R.string.min_recording_distance_key: + setMinRecordingDistanceSummaryAndOptions(summary, options, values, metricUnits); + break; + case R.string.max_recording_distance_key: + setMaxRecordingDistanceSummaryAndOptions(summary, options, values, metricUnits); + break; + case R.string.min_required_accuracy_key: + setMinRequiredAccuracySummaryAndOptions(summary, options, values, metricUnits); + break; + case R.string.auto_resume_track_timeout_key: + setAutoResumeTrackTimeoutSummaryAndOptions(summary, options, values); + break; + default: + return; + } + configureListPreference(preference, summary, options, values, String.valueOf(value), null); } /** - * Gets the min recording interval display options. + * Sets the min recording interval summary and options. + * + * @param summary the summary + * @param options the options + * @param values the values */ - private String[] getMinRecordingIntervalOptions() { - String[] values = getResources().getStringArray(R.array.min_recording_interval_values); - String[] options = new String[values.length]; + private void setMinRecordingIntervalSummaryAndOptions( + String[] summary, String[] options, String[] values) { 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); + summary[i] = options[i]; break; case PreferencesUtils.MIN_RECORDING_INTERVAL_ADAPT_ACCURACY: options[i] = getString(R.string.value_adapt_accuracy); + summary[i] = options[i]; break; case PreferencesUtils.MIN_RECORDING_INTERVAL_DEFAULT: options[i] = getString(R.string.value_smallest_recommended); + summary[i] = getString(R.string.value_smallest); break; default: options[i] = value < 60 ? getString(R.string.value_integer_second, value) : getString(R.string.value_integer_minute, value / 60); + summary[i] = getString( + R.string.settings_recording_location_frequency_summary, options[i]); } } - return options; } /** - * Gets the min recording distance display options. + * Sets the min recording distance summary and options. * - * @param metricUnits true to display metric units + * @param summary the summary + * @param options the options + * @param values the values + * @param metricUnits true for metric units */ - private String[] getMinRecordingDistanceOptions(boolean metricUnits) { - String[] values = getResources().getStringArray(R.array.min_recording_distance_values); - String[] options = new String[values.length]; + private void setMinRecordingDistanceSummaryAndOptions( + String[] summary, String[] options, String[] values, boolean metricUnits) { for (int i = 0; i < values.length; i++) { int value = Integer.parseInt(values[i]); + String displayValue; if (metricUnits) { - options[i] = getString( - value == PreferencesUtils.MIN_RECORDING_DISTANCE_DEFAULT ? R.string.value_integer_meter_recommended - : R.string.value_integer_meter, value); + displayValue = getString(R.string.value_integer_meter, value); + switch (value) { + case PreferencesUtils.MIN_RECORDING_DISTANCE_DEFAULT: + options[i] = getString(R.string.value_integer_meter_recommended, value); + break; + default: + options[i] = displayValue; + } } 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); + displayValue = getString(R.string.value_integer_feet, feet); + switch (value) { + case PreferencesUtils.MIN_RECORDING_DISTANCE_DEFAULT: + options[i] = getString(R.string.value_integer_feet_recommended, feet); + break; + default: + options[i] = displayValue; + } } + summary[i] = getString(R.string.settings_recording_location_frequency_summary, displayValue); } - return options; } /** - * Gets the max recording distance display options. + * Sets the max recording distance summary and options. * - * @param metricUnits true to display metric units + * @param summary the summary + * @param options the options + * @param values the values + * @param metricUnits true for metric units */ - private String[] getMaxRecordingDistanceOptions(boolean metricUnits) { - String[] values = getResources().getStringArray(R.array.max_recording_distance_values); - String[] options = new String[values.length]; + private void setMaxRecordingDistanceSummaryAndOptions( + String[] summary, String[] options, String[] values, boolean metricUnits) { for (int i = 0; i < values.length; i++) { int value = Integer.parseInt(values[i]); + String displayValue; if (metricUnits) { - options[i] = getString( - value == PreferencesUtils.MAX_RECORDING_DISTANCE_DEFAULT ? R.string.value_integer_meter_recommended - : R.string.value_integer_meter, value); + displayValue = getString(R.string.value_integer_meter, value); + switch (value) { + case PreferencesUtils.MAX_RECORDING_DISTANCE_DEFAULT: + options[i] = getString(R.string.value_integer_meter_recommended, value); + break; + default: + options[i] = displayValue; + } } 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); + displayValue = getString(R.string.value_integer_feet, feet); + switch (value) { + case PreferencesUtils.MAX_RECORDING_DISTANCE_DEFAULT: + options[i] = getString(R.string.value_integer_feet_recommended, feet); + break; + default: + options[i] = displayValue; + } } else { double mile = feet * UnitConversions.FT_TO_MI; - options[i] = getString(R.string.value_float_mile, mile); + displayValue = getString(R.string.value_float_mile, mile); + options[i] = displayValue; } } + summary[i] = getString( + R.string.settings_recording_max_recording_distance_summary, displayValue); } - return options; } /** - * Gets the min required accuracy display options. + * Sets the min required accuracy summary and options. * - * @param metricUnits true to display metric units + * @param summary the summary + * @param options the options + * @param values the values + * @param metricUnits true for metric units */ - private String[] getMinRequiredAccuracyOptions(boolean metricUnits) { - String[] values = getResources().getStringArray(R.array.min_required_accuracy_values); - String[] options = new String[values.length]; + private void setMinRequiredAccuracySummaryAndOptions( + String[] summary, String[] options, String[] values, boolean metricUnits) { for (int i = 0; i < values.length; i++) { int value = Integer.parseInt(values[i]); + String displayValue; if (metricUnits) { + displayValue = getString(R.string.value_integer_meter, value); switch (value) { case PreferencesUtils.MIN_REQUIRED_ACCURACY_DEFAULT: options[i] = getString(R.string.value_integer_meter_recommended, value); @@ -224,11 +270,12 @@ public class RecordingSettingsActivity extends AbstractSettingsActivity { options[i] = getString(R.string.value_integer_meter_poor_gps, value); break; default: - options[i] = getString(R.string.value_integer_meter, value); + options[i] = displayValue; } } else { int feet = (int) (value * UnitConversions.M_TO_FT); if (feet < 2000) { + displayValue = getString(R.string.value_integer_feet, feet); switch (value) { case PreferencesUtils.MIN_REQUIRED_ACCURACY_DEFAULT: options[i] = getString(R.string.value_integer_feet_recommended, feet); @@ -237,38 +284,52 @@ public class RecordingSettingsActivity extends AbstractSettingsActivity { options[i] = getString(R.string.value_integer_feet_excellent_gps, feet); break; default: - options[i] = getString(R.string.value_integer_feet, feet); + options[i] = displayValue; } } 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); + displayValue = getString(R.string.value_float_mile, mile); + switch (value) { + case PreferencesUtils.MIN_REQUIRED_ACCURACY_POOR: + options[i] = getString(R.string.value_float_mile_poor_gps, mile); + break; + default: + options[i] = displayValue; + } } } + summary[i] = getString( + R.string.settings_recording_min_required_accuracy_summary, displayValue); } - return options; } /** - * Gets the auto resume track timeout display options. + * Sets the auto resume track timeout summary and options. + * + * @param summary the summary + * @param options the options + * @param values the values */ - private String[] getAutoResumeTrackTimeoutOptions() { - String[] values = getResources().getStringArray(R.array.auto_resume_track_timeout_values); - String[] options = new String[values.length]; + private void setAutoResumeTrackTimeoutSummaryAndOptions( + String[] summary, String[] options, String[] values) { 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); + summary[i] = getString( + R.string.settings_recording_auto_resume_track_timeout_never_summary); break; case PreferencesUtils.AUTO_RESUME_TRACK_TIMEOUT_ALWAYS: options[i] = getString(R.string.value_always); + summary[i] = getString( + R.string.settings_recording_auto_resume_track_timeout_always_summary); break; default: options[i] = getString(R.string.value_integer_minute, value); + summary[i] = getString( + R.string.settings_recording_auto_resume_track_timeout_summary, options[i]); } } - return options; } } diff --git a/MyTracks/src/com/google/android/apps/mytracks/settings/SensorSettingsActivity.java b/MyTracks/src/com/google/android/apps/mytracks/settings/SensorSettingsActivity.java index aa9954be7..a21bb27d9 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/settings/SensorSettingsActivity.java +++ b/MyTracks/src/com/google/android/apps/mytracks/settings/SensorSettingsActivity.java @@ -49,23 +49,8 @@ public class SensorSettingsActivity extends AbstractSettingsActivity { addPreferencesFromResource(R.xml.sensor_settings); boolean hasAntSupport = AntInterface.hasAntSupport(this); - ListPreference sensorTypeListPreference = (ListPreference) findPreference( - getString(R.string.sensor_type_key)); - String[] sensorTypeOptions = getResources().getStringArray( - hasAntSupport ? R.array.sensor_type_all_options : R.array.sensor_type_bluetooth_options); - String[] sensorTypeValues = getResources().getStringArray( - hasAntSupport ? R.array.sensor_type_all_values : R.array.sensor_type_bluetooth_values); - String sensorTypeValue = PreferencesUtils.getString( - this, R.string.sensor_type_key, PreferencesUtils.SENSOR_TYPE_DEFAULT); - OnPreferenceChangeListener listener = new OnPreferenceChangeListener() { - @Override - public boolean onPreferenceChange(Preference preference, Object newValue) { - updateUiBySensorType((String) newValue); - return true; - } - }; - configurePreference(sensorTypeListPreference, sensorTypeOptions, sensorTypeValues, - R.string.settings_sensor_type_summary, sensorTypeValue, listener); + + configSensorType(hasAntSupport); findPreference(getString(R.string.settings_sensor_bluetooth_pairing_key)) .setOnPreferenceClickListener(new OnPreferenceClickListener() { @@ -84,6 +69,31 @@ public class SensorSettingsActivity extends AbstractSettingsActivity { } } + private void configSensorType(boolean hasAntSupport) { + ListPreference preference = (ListPreference) findPreference( + getString(R.string.sensor_type_key)); + String value = PreferencesUtils.getString( + this, R.string.sensor_type_key, PreferencesUtils.SENSOR_TYPE_DEFAULT); + String[] options = getResources().getStringArray( + hasAntSupport ? R.array.sensor_type_all_options : R.array.sensor_type_bluetooth_options); + String[] values = getResources().getStringArray( + hasAntSupport ? R.array.sensor_type_all_values : R.array.sensor_type_bluetooth_values); + + if (!hasAntSupport && value.equals(R.string.sensor_type_value_ant)) { + value = PreferencesUtils.SENSOR_TYPE_DEFAULT; + PreferencesUtils.setString(this, R.string.sensor_type_key, value); + } + + OnPreferenceChangeListener listener = new OnPreferenceChangeListener() { + @Override + public boolean onPreferenceChange(Preference pref, Object newValue) { + updateUiBySensorType((String) newValue); + return true; + } + }; + configureListPreference(preference, options, options, values, value, listener); + } + /** * Updates the UI based on the sensor type. * @@ -120,7 +130,7 @@ public class SensorSettingsActivity extends AbstractSettingsActivity { preference.setEnabled(enabled); int deviceId = PreferencesUtils.getInt(this, valueKey, AntSensorManager.WILDCARD); if (deviceId == AntSensorManager.WILDCARD) { - preference.setSummary(R.string.settings_sensor_not_connected); + preference.setSummary(R.string.settings_sensor_ant_not_connected); } else { preference.setSummary(getString(R.string.settings_sensor_ant_paired, deviceId)); } @@ -128,7 +138,7 @@ public class SensorSettingsActivity extends AbstractSettingsActivity { @Override public boolean onPreferenceClick(Preference pref) { PreferencesUtils.setInt(SensorSettingsActivity.this, valueKey, AntSensorManager.WILDCARD); - pref.setSummary(R.string.settings_sensor_not_connected); + pref.setSummary(R.string.settings_sensor_ant_not_connected); return true; } }); @@ -138,14 +148,20 @@ public class SensorSettingsActivity extends AbstractSettingsActivity { @Override protected void onResume() { super.onResume(); - updateBluetoothSensorListPreference(); + + // Update each time in case the list of bluetooth sensors has changed + configBluetoothSensor(); } /** - * Updates the bluetooth sensor list preference. + * Configures the bluetooth sensor. */ @SuppressWarnings("deprecation") - private void updateBluetoothSensorListPreference() { + private void configBluetoothSensor() { + ListPreference preference = (ListPreference) findPreference( + getString(R.string.bluetooth_sensor_key)); + String value = PreferencesUtils.getString( + this, R.string.bluetooth_sensor_key, PreferencesUtils.BLUETOOTH_SENSOR_DEFAULT); List optionsList = new ArrayList(); List valuesList = new ArrayList(); BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); @@ -155,22 +171,17 @@ public class SensorSettingsActivity extends AbstractSettingsActivity { String[] options = optionsList.toArray(new String[optionsList.size()]); String[] values = valuesList.toArray(new String[valuesList.size()]); - String bluetoothSensorValue = PreferencesUtils.getString( - this, R.string.bluetooth_sensor_key, PreferencesUtils.BLUETOOTH_SENSOR_DEFAULT); - ListPreference bluetoothSensorListPreference = (ListPreference) findPreference( - getString(R.string.bluetooth_sensor_key)); if (valuesList.size() == 1) { - if (!valuesList.get(0).equals(bluetoothSensorValue)) { - bluetoothSensorValue = valuesList.get(0); - PreferencesUtils.setString(this, R.string.bluetooth_sensor_key, bluetoothSensorValue); + if (!valuesList.get(0).equals(value)) { + value = valuesList.get(0); + PreferencesUtils.setString(this, R.string.bluetooth_sensor_key, value); } } else { - if (!valuesList.contains(bluetoothSensorValue)) { - bluetoothSensorValue = PreferencesUtils.BLUETOOTH_SENSOR_DEFAULT; - PreferencesUtils.setString(this, R.string.bluetooth_sensor_key, bluetoothSensorValue); + if (!valuesList.contains(value)) { + value = PreferencesUtils.BLUETOOTH_SENSOR_DEFAULT; + PreferencesUtils.setString(this, R.string.bluetooth_sensor_key, value); } } - configurePreference(bluetoothSensorListPreference, options, values, - R.string.settings_sensor_bluetooth_sensor_summary, bluetoothSensorValue); + configureListPreference(preference, options, options, values, value, null); } } diff --git a/MyTracks/src/com/google/android/apps/mytracks/settings/SettingsActivity.java b/MyTracks/src/com/google/android/apps/mytracks/settings/SettingsActivity.java index f679e983b..c2ca2982a 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/settings/SettingsActivity.java +++ b/MyTracks/src/com/google/android/apps/mytracks/settings/SettingsActivity.java @@ -16,22 +16,13 @@ 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. @@ -41,11 +32,6 @@ import android.widget.Toast; */ 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) { @@ -59,16 +45,7 @@ public class SettingsActivity extends AbstractSettingsActivity { configPreference(R.string.settings_recording_key, RecordingSettingsActivity.class); configPreference(R.string.settings_sharing_key, SharingSettingsActivity.class); configPreference(R.string.settings_sensor_key, SensorSettingsActivity.class); - configPreference(R.string.settings_backup_key, BackupSettingsActivity.class); - - 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; - } - }); + configPreference(R.string.settings_backup_reset_key, BackupResetSettingsActivity.class); } /** @@ -88,58 +65,4 @@ public class SettingsActivity extends AbstractSettingsActivity { } }); } - - @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(); - } } diff --git a/MyTracks/src/com/google/android/apps/mytracks/util/TrackNameUtils.java b/MyTracks/src/com/google/android/apps/mytracks/util/TrackNameUtils.java index 6def459d9..b0ef60cf4 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/util/TrackNameUtils.java +++ b/MyTracks/src/com/google/android/apps/mytracks/util/TrackNameUtils.java @@ -27,6 +27,7 @@ import android.location.Location; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.List; +import java.util.Locale; /** * Utilities for track name. @@ -65,7 +66,7 @@ public class TrackNameUtils { if (startTime == -1L) { return null; } - SimpleDateFormat dateFormat = new SimpleDateFormat(ISO_8601_FORMAT); + SimpleDateFormat dateFormat = new SimpleDateFormat(ISO_8601_FORMAT, Locale.US); return dateFormat.format(startTime); } else if (trackName.equals( context.getString(R.string.settings_recording_track_name_number_value))) { diff --git a/MyTracksLib/src/com/google/android/apps/mytracks/content/MyTracksProviderUtils.java b/MyTracksLib/src/com/google/android/apps/mytracks/content/MyTracksProviderUtils.java index db82735b7..fc96df102 100644 --- a/MyTracksLib/src/com/google/android/apps/mytracks/content/MyTracksProviderUtils.java +++ b/MyTracksLib/src/com/google/android/apps/mytracks/content/MyTracksProviderUtils.java @@ -227,6 +227,13 @@ public interface MyTracksProviderUtils { */ public long getLastTrackPointId(long trackId); + /** + * Gets the first valid location for a track. Returns null if it doesn't exist. + * + * @param trackId the track id + */ + public Location getFirstValidTrackPoint(long trackId); + /** * Gets the last valid location for a track. Returns null if it doesn't exist. * diff --git a/MyTracksLib/src/com/google/android/apps/mytracks/content/MyTracksProviderUtilsImpl.java b/MyTracksLib/src/com/google/android/apps/mytracks/content/MyTracksProviderUtilsImpl.java index ddebefaa8..50eb9bae5 100644 --- a/MyTracksLib/src/com/google/android/apps/mytracks/content/MyTracksProviderUtilsImpl.java +++ b/MyTracksLib/src/com/google/android/apps/mytracks/content/MyTracksProviderUtilsImpl.java @@ -748,6 +748,18 @@ public class MyTracksProviderUtilsImpl implements MyTracksProviderUtils { return -1L; } + @Override + public Location getFirstValidTrackPoint(long trackId) { + if (trackId < 0) { + return null; + } + String selection = TrackPointsColumns._ID + "=(select min(" + TrackPointsColumns._ID + ") from " + + TrackPointsColumns.TABLE_NAME + " WHERE " + TrackPointsColumns.TRACKID + "=? AND " + + TrackPointsColumns.LATITUDE + "<=" + MAX_LATITUDE + ")"; + String[] selectionArgs = new String[] { Long.toString(trackId) }; + return findTrackPointBy(selection, selectionArgs); + } + @Override public Location getLastValidTrackPoint(long trackId) { if (trackId < 0) {