Idle: add voice announcement (user configurable).

Fixes of #1174
This commit is contained in:
Dennis Guse
2023-09-23 18:52:28 +02:00
parent 9a50d7bedf
commit 83da4f8f34
40 changed files with 192 additions and 132 deletions
@@ -63,7 +63,7 @@ public class VoiceAnnouncementUtilsTest {
stats.setTotalAltitudeGain(6000f);
// when
String announcement = VoiceAnnouncementUtils.getAnnouncement(context, stats, UnitSystem.METRIC, true, null, null).toString();
String announcement = VoiceAnnouncementUtils.createStatistics(context, stats, UnitSystem.METRIC, true, null, null).toString();
// then
assertEquals("Total distance 20.0 kilometers. 1 hour 5 minutes 10 seconds. Average moving speed 18.4 kilometers per hour.", announcement);
@@ -79,7 +79,7 @@ public class VoiceAnnouncementUtilsTest {
stats.setTotalAltitudeGain(6000f);
// when
String announcement = VoiceAnnouncementUtils.getAnnouncement(context, stats, UnitSystem.METRIC, true, null, null).toString();
String announcement = VoiceAnnouncementUtils.createStatistics(context, stats, UnitSystem.METRIC, true, null, null).toString();
// then
assertEquals("Total distance 20.0 kilometers. 1 hour 1 second. Average moving speed 20.0 kilometers per hour.", announcement);
@@ -95,7 +95,7 @@ public class VoiceAnnouncementUtilsTest {
stats.setTotalAltitudeGain(6000f);
// when
String announcement = VoiceAnnouncementUtils.getAnnouncement(context, stats, UnitSystem.METRIC, true, null, null).toString();
String announcement = VoiceAnnouncementUtils.createStatistics(context, stats, UnitSystem.METRIC, true, null, null).toString();
// then
assertEquals("Total distance 20.0 kilometers. 1 hour. Average moving speed 20.0 kilometers per hour.", announcement);
@@ -111,7 +111,7 @@ public class VoiceAnnouncementUtilsTest {
stats.setTotalAltitudeGain(6000f);
// when
String announcement = VoiceAnnouncementUtils.getAnnouncement(context, stats, UnitSystem.METRIC, true, null, null).toString();
String announcement = VoiceAnnouncementUtils.createStatistics(context, stats, UnitSystem.METRIC, true, null, null).toString();
// then
assertEquals("Total distance 19.9 kilometers. 1 hour. Average moving speed 19.9 kilometers per hour.", announcement);
@@ -133,7 +133,7 @@ public class VoiceAnnouncementUtilsTest {
}
// when
String announcement = VoiceAnnouncementUtils.getAnnouncement(context, stats, UnitSystem.METRIC, true, lastInterval, null).toString();
String announcement = VoiceAnnouncementUtils.createStatistics(context, stats, UnitSystem.METRIC, true, lastInterval, null).toString();
// then
assertEquals("Total distance 14.2 kilometers. 16 minutes 39 seconds. Average moving speed 51.2 kilometers per hour. Lap speed 51.2 kilometers per hour.", announcement);
@@ -149,7 +149,7 @@ public class VoiceAnnouncementUtilsTest {
stats.setTotalAltitudeGain(6000f);
// when
String announcement = VoiceAnnouncementUtils.getAnnouncement(context, stats, UnitSystem.METRIC, false, null, null).toString();
String announcement = VoiceAnnouncementUtils.createStatistics(context, stats, UnitSystem.METRIC, false, null, null).toString();
// then
assertEquals("Total distance 20.0 kilometers. 1 hour 5 minutes 10 seconds. Pace 3 minutes 15 seconds per kilometer.", announcement);
@@ -171,7 +171,7 @@ public class VoiceAnnouncementUtilsTest {
}
// when
String announcement = VoiceAnnouncementUtils.getAnnouncement(context, stats, UnitSystem.METRIC, false, lastInterval, null).toString();
String announcement = VoiceAnnouncementUtils.createStatistics(context, stats, UnitSystem.METRIC, false, lastInterval, null).toString();
// then
assertEquals("Total distance 14.2 kilometers. 16 minutes 39 seconds. Pace 1 minute 10 seconds per kilometer. Lap time 1 minute 10 seconds per kilometer.", announcement);
@@ -187,7 +187,7 @@ public class VoiceAnnouncementUtilsTest {
stats.setTotalAltitudeGain(6000f);
// when
String announcement = VoiceAnnouncementUtils.getAnnouncement(context, stats, UnitSystem.IMPERIAL_FEET, true, null, null).toString();
String announcement = VoiceAnnouncementUtils.createStatistics(context, stats, UnitSystem.IMPERIAL_FEET, true, null, null).toString();
// then
assertEquals("Total distance 12.4 miles. 1 hour 5 minutes 10 seconds. Average moving speed 11.4 miles per hour.", announcement);
@@ -201,7 +201,7 @@ public class VoiceAnnouncementUtilsTest {
stats.setMovingTime(Duration.ofHours(1));
// when
String announcement = VoiceAnnouncementUtils.getAnnouncement(context, stats, UnitSystem.IMPERIAL_FEET, true, null, null).toString();
String announcement = VoiceAnnouncementUtils.createStatistics(context, stats, UnitSystem.IMPERIAL_FEET, true, null, null).toString();
// then
assertEquals("Total distance 1.1 miles. 1 hour. Average moving speed 1.1 miles per hour.", announcement);
@@ -215,7 +215,7 @@ public class VoiceAnnouncementUtilsTest {
stats.setMovingTime(Duration.ofHours(1));
// when
String announcement = VoiceAnnouncementUtils.getAnnouncement(context, stats, UnitSystem.IMPERIAL_METER, true, null, null).toString();
String announcement = VoiceAnnouncementUtils.createStatistics(context, stats, UnitSystem.IMPERIAL_METER, true, null, null).toString();
// then
assertEquals("Total distance 1.1 miles. 1 hour. Average moving speed 1.1 miles per hour.", announcement);
@@ -229,7 +229,7 @@ public class VoiceAnnouncementUtilsTest {
stats.setMovingTime(Duration.ofHours(1));
// when
String announcement = VoiceAnnouncementUtils.getAnnouncement(context, stats, UnitSystem.METRIC, true, null, null).toString();
String announcement = VoiceAnnouncementUtils.createStatistics(context, stats, UnitSystem.METRIC, true, null, null).toString();
// then
assertEquals("Total distance 1.1 kilometers. 1 hour. Average moving speed 1.1 kilometers per hour.", announcement);
@@ -251,7 +251,7 @@ public class VoiceAnnouncementUtilsTest {
}
// when
String announcement = VoiceAnnouncementUtils.getAnnouncement(context, stats, UnitSystem.IMPERIAL_FEET, true, lastInterval, null).toString();
String announcement = VoiceAnnouncementUtils.createStatistics(context, stats, UnitSystem.IMPERIAL_FEET, true, lastInterval, null).toString();
// then
assertEquals("Total distance 8.8 miles. 16 minutes 39 seconds. Average moving speed 31.8 miles per hour. Lap speed 31.8 miles per hour.", announcement);
@@ -267,7 +267,7 @@ public class VoiceAnnouncementUtilsTest {
stats.setTotalAltitudeGain(6000f);
// when
String announcement = VoiceAnnouncementUtils.getAnnouncement(context, stats, UnitSystem.IMPERIAL_FEET, false, null, null).toString();
String announcement = VoiceAnnouncementUtils.createStatistics(context, stats, UnitSystem.IMPERIAL_FEET, false, null, null).toString();
// then
assertEquals("Total distance 12.4 miles. 1 hour 5 minutes 10 seconds. Pace 5 minutes 15 seconds per mile.", announcement);
@@ -289,7 +289,7 @@ public class VoiceAnnouncementUtilsTest {
}
// when
String announcement = VoiceAnnouncementUtils.getAnnouncement(context, stats, UnitSystem.IMPERIAL_FEET, false, lastInterval, null).toString();
String announcement = VoiceAnnouncementUtils.createStatistics(context, stats, UnitSystem.IMPERIAL_FEET, false, lastInterval, null).toString();
// then
assertEquals("Total distance 8.8 miles. 16 minutes 39 seconds. Pace 1 minute 53 seconds per mile. Lap time 1 minute 53 seconds per mile.", announcement);
@@ -315,7 +315,7 @@ public class VoiceAnnouncementUtilsTest {
SensorStatistics sensorStatistics = new SensorStatistics(HeartRate.of(180f), HeartRate.of(180f), null, null, null, null);
// when
String announcement = VoiceAnnouncementUtils.getAnnouncement(context, stats, UnitSystem.METRIC, true, lastInterval, sensorStatistics).toString();
String announcement = VoiceAnnouncementUtils.createStatistics(context, stats, UnitSystem.METRIC, true, lastInterval, sensorStatistics).toString();
// then
assertEquals("Total distance 14.2 kilometers. 16 minutes 39 seconds. Average moving speed 51.2 kilometers per hour. Lap speed 51.2 kilometers per hour. Average heart rate 180 bpm. Current heart rate 133 bpm.", announcement);
@@ -345,7 +345,7 @@ public class VoiceAnnouncementUtilsTest {
SensorStatistics sensorStatistics = new SensorStatistics(HeartRate.of(180f), HeartRate.of(180f), null, null, null, null);
// when
String announcement = VoiceAnnouncementUtils.getAnnouncement(context, stats, UnitSystem.METRIC, true, lastInterval, sensorStatistics).toString();
String announcement = VoiceAnnouncementUtils.createStatistics(context, stats, UnitSystem.METRIC, true, lastInterval, sensorStatistics).toString();
// then
assertEquals(" Current heart rate 133 bpm.", announcement);
@@ -21,7 +21,7 @@ import android.view.View;
import androidx.appcompat.app.AppCompatActivity;
import de.dennisguse.opentracks.services.announcement.VoiceAnnouncement;
import de.dennisguse.opentracks.services.announcement.TTSManager;
/**
* @author Jimmy Shih
@@ -33,7 +33,7 @@ public abstract class AbstractActivity extends AppCompatActivity {
super.onCreate(savedInstanceState);
// Set volume control stream for text to speech
setVolumeControlStream(VoiceAnnouncement.AUDIO_STREAM);
setVolumeControlStream(TTSManager.AUDIO_STREAM);
setContentView(getRootView());
}
@@ -40,6 +40,7 @@ public class TrackRecordingManager implements SharedPreferences.OnSharedPreferen
private final ContentProviderUtils contentProviderUtils;
private final Context context;
private final IdleObserver idleObserver;
private final Handler handler;
@@ -59,8 +60,9 @@ public class TrackRecordingManager implements SharedPreferences.OnSharedPreferen
private TrackPoint lastStoredTrackPoint;
private TrackPoint lastStoredTrackPointWithLocation;
TrackRecordingManager(Context context, TrackPointCreator trackPointCreator, Handler handler) {
TrackRecordingManager(Context context, TrackPointCreator trackPointCreator, IdleObserver idleObserver, Handler handler) {
this.context = context;
this.idleObserver = idleObserver;
this.trackPointCreator = trackPointCreator;
this.handler = handler;
contentProviderUtils = new ContentProviderUtils(context);
@@ -165,6 +167,8 @@ public class TrackRecordingManager implements SharedPreferences.OnSharedPreferen
public void onIdle() {
Log.d(TAG, "Becoming idle");
onNewTrackPoint(trackPointCreator.createIdle());
idleObserver.onIdle();
}
/**
@@ -270,6 +274,7 @@ public class TrackRecordingManager implements SharedPreferences.OnSharedPreferen
lastStoredTrackPointWithLocation = lastStoredTrackPoint;
}
} catch (SQLiteException e) {
// TODO Remove; if this is a problem; use a synchronized method.
/*
* Insert failed, most likely because of SqlLite error code 5 (SQLite_BUSY).
* This is expected to happen extremely rarely (if our listener gets invoked twice at about the same time).
@@ -299,4 +304,8 @@ public class TrackRecordingManager implements SharedPreferences.OnSharedPreferen
idleDuration = PreferencesUtils.getIdleDurationTimeout();
}
}
public interface IdleObserver {
void onIdle();
}
}
@@ -47,7 +47,7 @@ import de.dennisguse.opentracks.services.handlers.TrackPointCreator;
import de.dennisguse.opentracks.settings.PreferencesUtils;
import de.dennisguse.opentracks.util.SystemUtils;
public class TrackRecordingService extends Service implements TrackPointCreator.Callback, SharedPreferences.OnSharedPreferenceChangeListener {
public class TrackRecordingService extends Service implements TrackPointCreator.Callback, SharedPreferences.OnSharedPreferenceChangeListener, TrackRecordingManager.IdleObserver {
private static final String TAG = TrackRecordingService.class.getSimpleName();
@@ -108,7 +108,7 @@ public class TrackRecordingService extends Service implements TrackPointCreator.
recordingDataObservable = new MutableLiveData<>(NOT_RECORDING);
trackPointCreator = new TrackPointCreator(this);
trackRecordingManager = new TrackRecordingManager(this, trackPointCreator, handler);
trackRecordingManager = new TrackRecordingManager(this, trackPointCreator, this , handler);
voiceAnnouncementManager = new VoiceAnnouncementManager(this);
notificationManager = new TrackRecordingServiceNotificationManager(this);
@@ -296,11 +296,15 @@ public class TrackRecordingService extends Service implements TrackPointCreator.
// Compute temporary track statistics using sensorData and update time.
Pair<Track, Pair<TrackPoint, SensorDataSet>> data = trackRecordingManager.getDataForUI();
voiceAnnouncementManager.update(this, data.first);
voiceAnnouncementManager.announceStatisticsIfNeeded(data.first);
recordingDataObservable.postValue(new RecordingData(data.first, data.second.first, data.second.second));
}
public void onIdle() {
voiceAnnouncementManager.announceIdle();
}
@VisibleForTesting
public void stopUpdateRecordingData() {
handler.removeCallbacks(updateRecordingData);
@@ -31,37 +31,19 @@ import java.util.List;
import java.util.Locale;
import de.dennisguse.opentracks.R;
import de.dennisguse.opentracks.data.ContentProviderUtils;
import de.dennisguse.opentracks.data.TrackPointIterator;
import de.dennisguse.opentracks.data.models.Distance;
import de.dennisguse.opentracks.data.models.Track;
import de.dennisguse.opentracks.data.models.TrackPoint;
import de.dennisguse.opentracks.settings.PreferencesUtils;
import de.dennisguse.opentracks.stats.SensorStatistics;
import de.dennisguse.opentracks.stats.TrackStatistics;
import de.dennisguse.opentracks.ui.intervals.IntervalStatistics;
/**
* This class will announce the user's {@link TrackStatistics}.
*
* @author Sandor Dornbush
*/
public class VoiceAnnouncement {
public class TTSManager {
public final static int AUDIO_STREAM = TextToSpeech.Engine.DEFAULT_STREAM;
private static final String TAG = VoiceAnnouncement.class.getSimpleName();
private static final String TAG = TTSManager.class.getSimpleName();
private final Context context;
private final AudioManager audioManager;
private final ContentProviderUtils contentProviderUtils;
private TrackPoint.Id startTrackPointId = null;
private IntervalStatistics intervalStatistics;
private Distance intervalDistance;
private final AudioManager.OnAudioFocusChangeListener audioFocusChangeListener = new AudioManager.OnAudioFocusChangeListener() {
@Override
public void onAudioFocusChange(int focusChange) {
@@ -108,12 +90,9 @@ public class VoiceAnnouncement {
private MediaPlayer ttsFallback;
VoiceAnnouncement(Context context) {
TTSManager(Context context) {
this.context = context;
audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
contentProviderUtils = new ContentProviderUtils(context);
intervalDistance = PreferencesUtils.getVoiceAnnouncementDistance();
intervalStatistics = new IntervalStatistics(intervalDistance);
}
public void start() {
@@ -139,7 +118,7 @@ public class VoiceAnnouncement {
}
}
public void announce(@NonNull Track track) {
public void announce(@NonNull Spannable announcement) {
synchronized (this) {
if (!ttsReady) {
ttsReady = ttsInitStatus == TextToSpeech.SUCCESS;
@@ -166,23 +145,6 @@ public class VoiceAnnouncement {
return;
}
Distance currentIntervalDistance = PreferencesUtils.getVoiceAnnouncementDistance();
if (currentIntervalDistance != intervalDistance) {
intervalStatistics = new IntervalStatistics(currentIntervalDistance);
intervalDistance = currentIntervalDistance;
startTrackPointId = null;
}
TrackPointIterator trackPointIterator = new TrackPointIterator(contentProviderUtils, track.getId(), startTrackPointId);
startTrackPointId = intervalStatistics.addTrackPoints(trackPointIterator);
IntervalStatistics.Interval lastInterval = intervalStatistics.getLastInterval();
SensorStatistics sensorStatistics = null;
if (track.getId() != null) {
sensorStatistics = contentProviderUtils.getSensorStats(track.getId());
}
Spannable announcement = VoiceAnnouncementUtils.getAnnouncement(context, track.getTrackStatistics(), PreferencesUtils.getUnitSystem(), PreferencesUtils.isReportSpeed(track), lastInterval, sensorStatistics);
if (announcement.length() > 0) {
// We don't care about the utterance id. It is supplied here to force onUtteranceCompleted to be called.
tts.speak(announcement, TextToSpeech.QUEUE_FLUSH, null, "not used");
@@ -17,6 +17,7 @@ package de.dennisguse.opentracks.services.announcement;
import android.content.Context;
import android.content.SharedPreferences;
import android.text.Spannable;
import android.util.Log;
import androidx.annotation.NonNull;
@@ -27,11 +28,15 @@ import androidx.mediarouter.media.MediaRouter;
import java.time.Duration;
import de.dennisguse.opentracks.R;
import de.dennisguse.opentracks.data.ContentProviderUtils;
import de.dennisguse.opentracks.data.TrackPointIterator;
import de.dennisguse.opentracks.data.models.Distance;
import de.dennisguse.opentracks.data.models.Track;
import de.dennisguse.opentracks.services.TrackRecordingService;
import de.dennisguse.opentracks.data.models.TrackPoint;
import de.dennisguse.opentracks.settings.PreferencesUtils;
import de.dennisguse.opentracks.stats.SensorStatistics;
import de.dennisguse.opentracks.stats.TrackStatistics;
import de.dennisguse.opentracks.ui.intervals.IntervalStatistics;
/**
* Execute a periodic task on a time or distance schedule.
@@ -42,9 +47,9 @@ public class VoiceAnnouncementManager implements SharedPreferences.OnSharedPrefe
private static final String TAG = VoiceAnnouncementManager.class.getSimpleName();
private final TrackRecordingService trackRecordingService;
private final Context context;
private VoiceAnnouncement voiceAnnouncement;
private TTSManager voiceAnnouncement;
private TrackStatistics trackStatistics;
@@ -58,12 +63,22 @@ public class VoiceAnnouncementManager implements SharedPreferences.OnSharedPrefe
@NonNull
private Duration nextTotalTime = TOTALTIME_OFF;
public VoiceAnnouncementManager(@NonNull TrackRecordingService trackRecordingService) {
this.trackRecordingService = trackRecordingService;
private final ContentProviderUtils contentProviderUtils;
private TrackPoint.Id startTrackPointId = null;
private IntervalStatistics intervalStatistics;
private Distance intervalDistance;
public VoiceAnnouncementManager(@NonNull Context context) {
this.context = context;
contentProviderUtils = new ContentProviderUtils(context);
intervalDistance = PreferencesUtils.getVoiceAnnouncementDistance();
intervalStatistics = new IntervalStatistics(intervalDistance);
}
public void start(@Nullable TrackStatistics trackStatistics) {
voiceAnnouncement = new VoiceAnnouncement(trackRecordingService);
voiceAnnouncement = new TTSManager(context);
voiceAnnouncement.start();
update(trackStatistics);
}
@@ -74,10 +89,10 @@ public class VoiceAnnouncementManager implements SharedPreferences.OnSharedPrefe
updateNextTaskDistance();
}
public void update(@NonNull Context context, @NonNull Track track) {
private boolean shouldNotAnnounce() {
if (voiceAnnouncement == null) {
Log.e(TAG, "Cannot update when in status shutdown.");
return;
return true;
}
if (!PreferencesUtils.shouldVoiceAnnouncementOnDeviceSpeaker()
@@ -85,6 +100,26 @@ public class VoiceAnnouncementManager implements SharedPreferences.OnSharedPrefe
.getSelectedRoute()
.isDeviceSpeaker()) {
Log.i(TAG, "No voice announcement on device speaker.");
return true;
}
return false;
}
public void announceIdle() {
if (shouldNotAnnounce()) {
return;
}
if (!PreferencesUtils.shouldVoiceAnnouncementIdle()) {
return;
}
voiceAnnouncement.announce(VoiceAnnouncementUtils.createIdle(context));
}
public void announceStatisticsIfNeeded(@NonNull Track track) {
if (shouldNotAnnounce()) {
return;
}
@@ -100,10 +135,29 @@ public class VoiceAnnouncementManager implements SharedPreferences.OnSharedPrefe
}
if (announce) {
voiceAnnouncement.announce(track);
voiceAnnouncement.announce(createAnnouncement(track));
}
}
private Spannable createAnnouncement(Track track) {
Distance currentIntervalDistance = PreferencesUtils.getVoiceAnnouncementDistance();
if (currentIntervalDistance != intervalDistance) {
intervalStatistics = new IntervalStatistics(currentIntervalDistance);
intervalDistance = currentIntervalDistance;
startTrackPointId = null;
}
TrackPointIterator trackPointIterator = new TrackPointIterator(contentProviderUtils, track.getId(), startTrackPointId);
startTrackPointId = intervalStatistics.addTrackPoints(trackPointIterator);
IntervalStatistics.Interval lastInterval = intervalStatistics.getLastInterval();
SensorStatistics sensorStatistics = null;
if (track.getId() != null) {
sensorStatistics = contentProviderUtils.getSensorStats(track.getId());
}
return VoiceAnnouncementUtils.createStatistics(context, track.getTrackStatistics(), PreferencesUtils.getUnitSystem(), PreferencesUtils.isReportSpeed(track), lastInterval, sensorStatistics);
}
public void stop() {
if (voiceAnnouncement != null) {
voiceAnnouncement.stop();
@@ -33,7 +33,12 @@ class VoiceAnnouncementUtils {
private VoiceAnnouncementUtils() {
}
static Spannable getAnnouncement(Context context, TrackStatistics trackStatistics, UnitSystem unitSystem, boolean isReportSpeed, @Nullable IntervalStatistics.Interval currentInterval, @Nullable SensorStatistics sensorStatistics) {
static Spannable createIdle(Context context) {
return new SpannableStringBuilder()
.append(context.getString(R.string.voiceIdle));
}
static Spannable createStatistics(Context context, TrackStatistics trackStatistics, UnitSystem unitSystem, boolean isReportSpeed, @Nullable IntervalStatistics.Interval currentInterval, @Nullable SensorStatistics sensorStatistics) {
SpannableStringBuilder builder = new SpannableStringBuilder();
Distance totalDistance = trackStatistics.getTotalDistance();
Speed averageMovingSpeed = trackStatistics.getAverageMovingSpeed();
@@ -17,7 +17,7 @@ public class AnnouncementsSettingsFragment extends PreferenceFragmentCompat {
@Override
public void onStart() {
super.onStart();
((SettingsActivity) getActivity()).getSupportActionBar().setTitle(R.string.settings_announcements_title);
((SettingsActivity) getActivity()).getSupportActionBar().setTitle(R.string.settings_announcements_statistics_title);
}
@Override
@@ -312,6 +312,10 @@ public class PreferencesUtils {
return getBoolean(R.string.voice_on_device_speaker_key, DEFAULT);
}
public static boolean shouldVoiceAnnouncementIdle() {
return getBoolean(R.string.voice_announce_idle_key, true);
}
public static Duration getVoiceAnnouncementFrequency() {
final int DEFAULT = Integer.parseInt(resources.getString(R.string.voice_announcement_frequency_default));
int value = getInt(R.string.voice_announcement_frequency_key, DEFAULT);
+1 -1
View File
@@ -425,7 +425,7 @@
<string name="generic_filter">Filtrar</string>
<string name="menu_select_layout">Seleccionar diseño</string>
<string name="settings_import_export_title">Importar/Exportar</string>
<string name="settings_announcements_title">Avisos de voz</string>
<string name="settings_announcements_statistics_title">Avisos de voz</string>
<string name="settings_announcements_summary">Tiempo, Distancia, Velocidad de la voz</string>
<string name="settings_import_export_summary">Importar, Exportar, Autoexportar</string>
<string name="settings_units_category">Unidades</string>
+1 -1
View File
@@ -488,7 +488,7 @@ limitations under the License.
<string name="settings_import_export_summary">Import, export, automatický export</string>
<string name="settings_import_export_title">Import/Export</string>
<string name="settings_announcements_summary">Čas, vzdálenost, rychlost hlasu</string>
<string name="settings_announcements_title">Hlasová oznámení</string>
<string name="settings_announcements_statistics_title">Hlasová oznámení</string>
<string name="settings_sensors_title">Bluetooth senzory</string>
<string name="settings_gps_summary">Časový interval, Interval vzdálenosti, Maximální vzdálenost, Přesnost</string>
<string name="settings_ui_summary">Vzhled, Rozložení záznamu, Téma</string>
+1 -1
View File
@@ -458,7 +458,7 @@ Hvis GPS-enheden rapporterer unøjagtige data (f.eks. Placering, hastighed, høj
<string name="settings_defaults_summary">Foretrukne enheder, standardaktivitet, spor standardnavn</string>
<string name="settings_gps_summary">Tidsinterval, Distanceinterval, Maksimal afstand, Nøjagtighed</string>
<string name="settings_sensors_summary">Cykelsensorer, Hjulomkreds, Løbesensorer</string>
<string name="settings_announcements_title">Stemmemeddelelser</string>
<string name="settings_announcements_statistics_title">Stemmemeddelelser</string>
<string name="settings_announcements_summary">Tid, afstand, stemmehastighed</string>
<string name="settings_import_export_title">Import/eksport</string>
<string name="settings_import_export_summary">Import, eksport, automatisk eksport</string>
+1 -1
View File
@@ -500,7 +500,7 @@ Meldet das GPS-Gerät ungenaue Daten (z.B. Standort, Geschwindigkeit, Höhe), ka
<string name="settings_import_export_title">Import/Export</string>
<string name="settings_sensors_title">Bluetooth Sensoren</string>
<string name="settings_sensors_summary">Fahrradsensoren, Radumfang und Lauf-Sensoren</string>
<string name="settings_announcements_title">Sprachansagen</string>
<string name="settings_announcements_statistics_title">Sprachansagen</string>
<string name="generic_undo">Rückgängig</string>
<string name="generic_today">Heute</string>
<string name="generic_yesterday">Gestern</string>
+1 -1
View File
@@ -525,7 +525,7 @@ limitations under the License.
<string name="settings_ui_title">Interfaz de usuario</string>
<string name="settings_ui_summary">Apariencia, Diseño de grabación, Tema</string>
<string name="settings_gps_title">GPS</string>
<string name="settings_announcements_title">Avisos de voz</string>
<string name="settings_announcements_statistics_title">Avisos de voz</string>
<string name="settings_units_category">Unidades</string>
<string name="settings_import_export_title">Importar/Exportar</string>
<string name="stats_custom_layout_default_layout">Diseño predeterminado</string>
+1 -1
View File
@@ -468,7 +468,7 @@ limitations under the License.
<string name="settings_ui_summary">Välimus, Salvestamise Paigutus, Teema</string>
<string name="settings_gps_summary">Ajavahemik, vahemaa intervall, maksimaalne kaugus, täpsus</string>
<string name="settings_sensors_title">Bluetooth Andurid</string>
<string name="settings_announcements_title">Häälteated</string>
<string name="settings_announcements_statistics_title">Häälteated</string>
<string name="settings_announcements_summary">Aeg, Kaugus, Hääle Kiirus</string>
<string name="settings_units_category">Ühikud</string>
<string name="settings_import_export_summary">Import, Eksport, Automaatne Eksport</string>
+1 -1
View File
@@ -477,7 +477,7 @@ GPS gailuak datu okerrak salatzen baditu (adibidez, kokapena, abiadura, kota), O
<string name="value_float_mile_hour_recommended">%1$.1f mi/h (gomendatua)</string>
<string name="settings_sensors_title">Bluetooth</string>
<string name="settings_gps_summary">Denbora-tartea, Distantzia-tartea, Gehienezko Distantzia, Zehaztasuna</string>
<string name="settings_announcements_title">Ahots Iragarkiak</string>
<string name="settings_announcements_statistics_title">Ahots Iragarkiak</string>
<string name="settings_announcements_summary">Denbora, Distantzia, Ahotsaren Abiadura</string>
<string name="settings_import_export_title">Inportatu/Esportatu</string>
<string name="settings_import_export_summary">Inportatu, Esportatu, Auto-Export</string>
+1 -1
View File
@@ -539,7 +539,7 @@ limitations under the License.
<string name="settings_defaults_summary">Suositeltavat yksiköt, Oletusaktiviteetti, Seurannan oletusnimi</string>
<string name="select_show_on_map_behavior">Valitse\" Näytä kartalla\"käyttäytyminen</string>
<string name="settings_sensors_summary">Pyöräilyanturit, Pyörän ympärysmitta, Juoksuanturit</string>
<string name="settings_announcements_title">Ääni-ilmoitukset</string>
<string name="settings_announcements_statistics_title">Ääni-ilmoitukset</string>
<string name="settings_announcements_summary">Aika, etäisyys, äänennopeus</string>
<string name="settings_gps_summary">Aikaväli, etäisyysväli, maksimietäisyys, tarkkuus</string>
</resources>
+1 -1
View File
@@ -526,7 +526,7 @@ Si le dispositif GPS signale des données inexactes (par exemple, la localisatio
<string name="settings_import_export_summary">Importez, Exportez, Auto Export</string>
<string name="settings_import_export_title">Importez/Exportez</string>
<string name="settings_announcements_summary">Temps, distance, vitesse de la voix</string>
<string name="settings_announcements_title">Annonces vocales</string>
<string name="settings_announcements_statistics_title">Annonces vocales</string>
<string name="settings_sensors_title">Capteurs Bluetooth</string>
<string name="settings_gps_summary">Intervalle de temps, Intervalle de distance, Distance maximale, Précision</string>
<string name="settings_gps_title">GPS</string>
+1 -1
View File
@@ -352,7 +352,7 @@
<string name="settings_reset_summary">Athshocraigh Socruithe go Luachanna Réamhshocraithe</string>
<string name="settings_announcements_totaltime_frequency">Eatramh ama</string>
<string name="settings_layout_reset_confirm_message">Cuirfear gach socrú leagan amach ar ais chuig na luachanna réamhshocraithe. Ní scriosfaidh sé seo aon rianta ar an bhfeiste.</string>
<string name="settings_announcements_title">Fógraí Gutha</string>
<string name="settings_announcements_statistics_title">Fógraí Gutha</string>
<string name="settings_recording_show_on_lockscreen_while_recording_title">Taispeáin staitisticí ar an scáileán glas</string>
<string name="settings_announcements_average_heart_rate">Meánráta croí</string>
<string name="settings_layout_reset_confirm_title">Athshocraigh do leagan amach\?</string>
+1 -1
View File
@@ -492,7 +492,7 @@ Se o GPS informa sobre datos pouco precisos (ex.: localización, velocidade, ele
<string name="settings_gps_summary">Intervalo de tempo, Distancia intervalo, Max Distancia, Precisión</string>
<string name="settings_sensors_title">Sensores Bluetooth</string>
<string name="settings_sensors_summary">Sensores de ciclismo, Circunferencia da roda, Sensores de carreira</string>
<string name="settings_announcements_title">Indicacións por Voz</string>
<string name="settings_announcements_statistics_title">Indicacións por Voz</string>
<string name="settings_import_export_title">Importación/Exportación</string>
<string name="settings_import_export_summary">Importación, Exportación, Auto Exportación</string>
<string name="settings_units_category">Unidades</string>
+1 -1
View File
@@ -466,7 +466,7 @@ limitations under the License.
<string name="settings_sensors_title">Bluetooth Érzékelők</string>
<string name="generic_dismiss">Elbocsátás</string>
<string name="settings_sensors_summary">Kerékpáros Érzékelők, Kerék Kerülete, Futásérzékelők</string>
<string name="settings_announcements_title">Voice Közlemények</string>
<string name="settings_announcements_statistics_title">Voice Közlemények</string>
<string name="settings_export_filename_title">A fájlnév formátuma</string>
<string name="settings_public_api_dashboard_enabled_summary_off">A rögzített adatokat nem osztják meg automatikusan más alkalmazásokkal.</string>
<string name="field_remove_from_layout">Eltávolítás</string>
+1 -1
View File
@@ -489,7 +489,7 @@ Infatti, un\'applicazione deve supportare <i>ACTION_VIEW</i> con MIME <i>applica
<string name="settings_gps_title">GPS</string>
<string name="settings_gps_summary">Intervallo di tempo, Intervallo di distanza, Massima Distanza, Precisione</string>
<string name="settings_sensors_title">Sensori Bluetooth</string>
<string name="settings_announcements_title">Annunci Vocali</string>
<string name="settings_announcements_statistics_title">Annunci Vocali</string>
<string name="settings_announcements_summary">Tempo, Distanza, Velocità della Voce</string>
<string name="settings_import_export_title">Importa/Esporta</string>
<string name="settings_import_export_summary">Importa, Esporta, Auto Esporta</string>
+1 -1
View File
@@ -484,7 +484,7 @@ limitations under the License.
<string name="settings_gps_title">GPS</string>
<string name="settings_gps_summary">Tidsintervall, distanseintervall, maks, distanse, nøyaktighet</string>
<string name="settings_sensors_title">Blåtannssensorer</string>
<string name="settings_announcements_title">Talemeldinger</string>
<string name="settings_announcements_statistics_title">Talemeldinger</string>
<string name="settings_announcements_summary">Tid, distanse, talehastighet</string>
<string name="settings_import_export_title">Import/eksport</string>
<string name="settings_import_export_summary">Import, eksport, auto-eksport</string>
+1 -1
View File
@@ -532,7 +532,7 @@ Als het GPS-apparaat onnauwkeurige gegevens rapporteert (bijv. locatie, snelheid
<string name="settings_gps_summary">Tijdsinterval, afstandsinterval, maximale afstand, nauwkeurigheid</string>
<string name="settings_sensors_title">Bluetooth sensoren</string>
<string name="settings_sensors_summary">Fiets sensoren, wielomtrek, loop sensoren</string>
<string name="settings_announcements_title">Gesproken berichten</string>
<string name="settings_announcements_statistics_title">Gesproken berichten</string>
<string name="custom_layout_list_title">Lay-outs</string>
<string name="custom_layout_list_edit_name">Voer de naam van de lay-out in</string>
<string name="custom_layout_list_edit_already_exists">Lay-out naam bestaat al</string>
+1 -1
View File
@@ -474,7 +474,7 @@ limitations under the License.
<string name="settings_gps_title">GPS</string>
<string name="settings_sensors_title">Czujnik Bluetooth</string>
<string name="settings_sensors_summary">Czujniki rowerowe, Obwód koła, Czujniki biegowe</string>
<string name="settings_announcements_title">Wiadomości głosowe</string>
<string name="settings_announcements_statistics_title">Wiadomości głosowe</string>
<string name="settings_announcements_summary">Czas, Dystans, Głos prędkości</string>
<string name="settings_import_export_title">Import/Eksport</string>
<string name="settings_units_category">Jednostki</string>
+1 -1
View File
@@ -428,7 +428,7 @@
<string name="value_float_kilometer_hour">%1$.1f km/h</string>
<string name="value_float_kilometer_hour_recommended">%1$.1f km/h (Recomendado)</string>
<string name="stats_clock">Relógio</string>
<string name="settings_announcements_title">Anúncios de voz</string>
<string name="settings_announcements_statistics_title">Anúncios de voz</string>
<string name="settings_sensors_summary">Voice announcements</string>
<string name="settings_sensors_title">Sensores Bluetooth</string>
<string name="settings_gps_summary">Intervalo de tempo, Intervalo de distância, Distância máxima, Precisão</string>
+1 -1
View File
@@ -428,7 +428,7 @@
<string name="settings_gps_summary">Intervalo de tempo, Intervalo de distância, Distância máxima, Precisão</string>
<string name="settings_sensors_title">Sensores Bluetooth</string>
<string name="settings_sensors_summary">Voice announcements</string>
<string name="settings_announcements_title">Anúncios de voz</string>
<string name="settings_announcements_statistics_title">Anúncios de voz</string>
<string name="settings_announcements_summary">Tempo, distância, velocidade da voz</string>
<string name="settings_import_export_title">Importar/Exportar</string>
<string name="settings_import_export_summary">Importar, Exportar, Auto Export</string>
+1 -1
View File
@@ -460,7 +460,7 @@ limitations under the License.
<string name="settings_sensors_summary">Voice announcements</string>
<string name="settings_ui_summary">Aparência, Layout de gravação, Tema</string>
<string name="settings_gps_title">GPS</string>
<string name="settings_announcements_title">Anúncios de voz</string>
<string name="settings_announcements_statistics_title">Anúncios de voz</string>
<string name="settings_announcements_summary">Tempo, distância, velocidade da voz</string>
<string name="settings_import_export_title">Importar/Exportar</string>
<string name="settings_import_export_summary">Importar, Exportar, Auto Export</string>
+1 -1
View File
@@ -460,7 +460,7 @@ limitations under the License.
<string name="settings_gps_summary">Интервал времени и дистанции, Максимальная дистанция, Точность</string>
<string name="settings_sensors_title">Bluetooth-датчики</string>
<string name="settings_sensors_summary">Датчики велосипеда, Оборот колеса, Датчики бега</string>
<string name="settings_announcements_title">Голосовые подсказки</string>
<string name="settings_announcements_statistics_title">Голосовые подсказки</string>
<string name="settings_import_export_title">Импорт/Экспорт</string>
<string name="settings_import_export_summary">Импорт, Экспорт, Автоэкспорт</string>
<string name="settings_units_category">Единицы</string>
+1 -1
View File
@@ -483,7 +483,7 @@ limitations under the License.
<string name="settings_defaults_summary">Predvolené jednotky, predvolená aktivita, predvolený názov skladby</string>
<string name="settings_ui_title">Používateľské rozhranie</string>
<string name="settings_ui_summary">Vzhľad, Rozloženie nahrávania, Téma</string>
<string name="settings_announcements_title">Hlasové oznámenia</string>
<string name="settings_announcements_statistics_title">Hlasové oznámenia</string>
<string name="settings_gps_title">GPS</string>
<string name="settings_sensors_title">Senzory Bluetooth</string>
<string name="settings_sensors_summary">Cyklistické snímače, obvod kolies, snímače behu</string>
+1 -1
View File
@@ -401,7 +401,7 @@ limitations under the License.
<string name="export_with_photos">s fotografijami</string>
<string name="export_track_errors">Skladbe niso izvožene</string>
<string name="settings_layout_reset">Ponastavitev postavitve po meri</string>
<string name="settings_announcements_title">Glasovna obvestila</string>
<string name="settings_announcements_statistics_title">Glasovna obvestila</string>
<string name="settings_announcements_summary">Čas, razdalja, hitrost glasu</string>
<string name="settings_import_export_title">Uvoz/izvoz</string>
<string name="settings_activity_defaults_category">Privzete vrednosti dejavnosti</string>
+1 -1
View File
@@ -365,7 +365,7 @@ limitations under the License.
<string name="settings_gps_title">GPS</string>
<string name="settings_defaults_summary">Tercih Edilen Birimler, Varsayılan Etkinlik, Varsayılan Parça Adı</string>
<string name="settings_gps_summary">Zaman aralığı, Mesafe aralığı, Maks. Mesafe, Hassasiyet</string>
<string name="settings_announcements_title">Sesli Anonslar</string>
<string name="settings_announcements_statistics_title">Sesli Anonslar</string>
<string name="settings_announcements_summary">Zaman, Mesafe, Ses Hızı</string>
<string name="help_data_storage_content"> Sensör verileri, kaydedilen konum başına saklanır. Kalp atış hızı sensörü açısından bu, konum başına yalnızca <i>bir</i> kalp atış hızı ölçümünün depolandığı anlamına gelir. Hareketsiz duruyorsanız veya içerideyseniz, hiçbir sensör verisi kaydedilmeyecektir (ancak gösterilecektir). </string>
<string name="help_support_content"> Yapabileceklerin:
+1 -1
View File
@@ -488,7 +488,7 @@ limitations under the License.
<string name="settings_ui_title">Інтерфейс користувача</string>
<string name="settings_ui_summary">Зовнішній вигляд, Макет запису, Тема</string>
<string name="settings_sensors_title">Датчики Bluetooth</string>
<string name="settings_announcements_title">Голосові оголошення</string>
<string name="settings_announcements_statistics_title">Голосові оголошення</string>
<string name="settings_gps_summary">Інтервал часу, інтервал відстані, Максимальна відстань, точність</string>
<string name="settings_sensors_summary">Датчики Їзди На Велосипеді, Окружність Колеса, Датчики Ходу</string>
<string name="settings_cycling_sensor">Їзда на велосипеді</string>
+1 -1
View File
@@ -487,7 +487,7 @@ limitations under the License.
<string name="settings_gps_title">GPS</string>
<string name="settings_sensors_title">Cảm Biến Bluetooth</string>
<string name="settings_sensors_summary">Đi Xe Đạp Cảm Biến, Bánh Vòng, Chạy Bộ Cảm Biến</string>
<string name="settings_announcements_title">Giọng Nói Thông Báo</string>
<string name="settings_announcements_statistics_title">Giọng Nói Thông Báo</string>
<string name="settings_announcements_summary">Thời Gian, Khoảng Cách, Tốc Độ Giọng Nói</string>
<string name="settings_import_export_title">Xuất Nhập Khẩu</string>
<string name="generic_undo">Hoàn tác</string>
+1 -1
View File
@@ -332,7 +332,7 @@ limitations under the License.
<string name="settings_gps_summary">時間間隔、距離間隔、最大距離、精度</string>
<string name="settings_sensors_title">藍芽感測器</string>
<string name="settings_sensors_summary">自行車感測器、輪周、跑步感測器</string>
<string name="settings_announcements_title">語音播報</string>
<string name="settings_announcements_statistics_title">語音播報</string>
<string name="settings_announcements_summary">時間、距離、語速</string>
<string name="settings_import_export_title">匯入/匯出</string>
<string name="settings_import_export_summary">匯入、匯出、自動匯出</string>
+1 -1
View File
@@ -558,7 +558,7 @@ limitations under the License.
<string name="settings_defaults_title">默认的单位和活动类型</string>
<string name="settings_sensors_title">蓝牙传感器</string>
<string name="settings_sensors_summary">自行车传感器,车轮周长,跑步传感器</string>
<string name="settings_announcements_title">语音播报</string>
<string name="settings_announcements_statistics_title">语音播报</string>
<string name="settings_reset_summary">将设置重置为默认值</string>
<string name="settings_layout_reset">重置自定义布局</string>
<string name="description_pace_nautical">配速(分钟/海里)</string>
+10
View File
@@ -237,12 +237,22 @@
</string-array>
<string name="voice_on_device_speaker_key" translatable="false">voiceOnDeviceSpeaker</string>
<bool name="voice_on_device_speaker_default" translatable="false">true</bool>
<string name="voice_announce_idle_key" translatable="false">voice_announce_idle_key</string>
<bool name="voice_announce_idle_default" translatable="false">false</bool>
<string name="voice_announce_total_distance_key" translatable="false">voiceAnnounceTotalDistance</string>
<bool name="voice_announce_total_distance_default" translatable="false">true</bool>
<string name="voice_announce_moving_time_key" translatable="false">voiceAnnounceMovingTime</string>
<bool name="voice_announce_moving_time_default" translatable="false">true</bool>
<string name="voice_announce_average_speed_pace_key" translatable="false">voiceAnnounceAverageSpeedPace</string>
<bool name="voice_announce_average_speed_pace_default" translatable="false">true</bool>
<string name="voice_announce_lap_speed_pace_key" translatable="false">voiceAnnounceLapSpeedPace</string>
<bool name="voice_announce_lap_speed_pace_default" translatable="false">true</bool>
<string name="voice_announce_average_heart_rate_key" translatable="false">voiceAnnounceAverageHeartRate</string>
<bool name="voice_announce_average_heart_rate_default" translatable="false">false</bool>
<string name="voice_announce_lap_heart_rate_key" translatable="false">voiceAnnounceLapHeartRate</string>
<bool name="voice_announce_lap_heart_rate_default" translatable="false">false</bool>
<string name="export_trackfileformat_key" translatable="false">exportTrackFileFormat</string>
<!-- See TrackFileFormat -->
+6 -1
View File
@@ -356,7 +356,11 @@ limitations under the License.
<string name="settings_sensors_title">Bluetooth Sensors</string>
<string name="settings_sensors_summary">Cycling Sensors, Wheel Circumference, Running Sensors</string>
<string name="settings_announcements_title">Voice Announcements</string>
<string name="settings_announcements_idle_category_title">Idle Announcements</string>
<string name="settings_announcements_idle_title">Idle</string>
<string name="settings_announcements_statistics_title">Statistics Announcements</string>
<string name="settings_announcements_summary">Time, Distance, Voice Speed</string>
<string name="settings_import_export_title">Import/Export</string>
@@ -558,6 +562,7 @@ limitations under the License.
<string name="value_off">Off</string>
<string name="value_smallest_recommended">Smallest (recommended)</string>
<string name="value_int_seconds">%1$d s (recommended)</string>
<string name="voiceIdle">Becoming idle.</string>
<string name="voiceHoursPlural">
{n, plural,
=1 {1 hour}
+1 -1
View File
@@ -31,7 +31,7 @@
android:icon="@drawable/ic_baseline_volume_up_24"
android:key="@string/settings_announcements_key"
android:summary="@string/settings_announcements_summary"
android:title="@string/settings_announcements_title" />
android:title="@string/settings_announcements_statistics_title" />
<Preference
android:icon="@drawable/ic_baseline_import_export_24"
+34 -27
View File
@@ -2,21 +2,12 @@
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:title="@string/settings_announcements_title">
android:title="@string/settings_announcements_statistics_title">
<ListPreference
android:defaultValue="@string/voice_announcement_frequency_default"
android:entryValues="@array/voice_announcement_frequency_values"
android:key="@string/voice_announcement_frequency_key"
android:title="@string/settings_announcements_totaltime_frequency"
app:useSimpleSummaryProvider="true" />
<ListPreference
android:defaultValue="@string/voice_announcement_distance_default"
android:entryValues="@array/voice_announcement_distance_values"
android:key="@string/voice_announcement_distance_key"
android:title="@string/settings_announcements_distance_frequency"
app:useSimpleSummaryProvider="true" />
<CheckBoxPreference
android:defaultValue="@bool/voice_on_device_speaker_default"
android:key="@string/voice_on_device_speaker_key"
android:title="@string/voice_on_device_speaker_title" />
<ListPreference
android:defaultValue="@string/voice_speed_rate_default"
@@ -26,39 +17,55 @@
android:title="@string/menu_voice_rate"
app:useSimpleSummaryProvider="true" />
<CheckBoxPreference
android:defaultValue="@bool/voice_on_device_speaker_default"
android:key="@string/voice_on_device_speaker_key"
android:title="@string/voice_on_device_speaker_title" />
<PreferenceCategory android:title="@string/settings_announcements_title">
<PreferenceCategory android:title="@string/settings_announcements_idle_category_title">
<SwitchPreference
android:defaultValue="true"
android:defaultValue="@bool/voice_announce_total_distance_default"
android:key="@string/voice_announce_total_distance_key"
android:title="@string/total_distance" />
android:title="@string/settings_announcements_idle_title" />
</PreferenceCategory>
<PreferenceCategory android:title="@string/settings_announcements_statistics_title">
<ListPreference
android:defaultValue="@string/voice_announcement_frequency_default"
android:entryValues="@array/voice_announcement_frequency_values"
android:key="@string/voice_announcement_frequency_key"
android:title="@string/settings_announcements_totaltime_frequency"
app:useSimpleSummaryProvider="true" />
<ListPreference
android:defaultValue="@string/voice_announcement_distance_default"
android:entryValues="@array/voice_announcement_distance_values"
android:key="@string/voice_announcement_distance_key"
android:title="@string/settings_announcements_distance_frequency"
app:useSimpleSummaryProvider="true" />
<SwitchPreference
android:defaultValue="true"
android:defaultValue="@bool/voice_announce_idle_default"
android:key="@string/voice_announce_idle_key"
android:title="@string/settings_announcements_idle_title" />
<SwitchPreference
android:defaultValue="@bool/voice_announce_moving_time_default"
android:key="@string/voice_announce_moving_time_key"
android:title="@string/stats_moving_time" />
<SwitchPreference
android:defaultValue="true"
android:defaultValue="@bool/voice_announce_average_speed_pace_default"
android:key="@string/voice_announce_average_speed_pace_key"
android:title="@string/settings_announcements_average_speed_pace" />
<SwitchPreference
android:defaultValue="true"
android:defaultValue="@bool/voice_announce_lap_speed_pace_default"
android:key="@string/voice_announce_lap_speed_pace_key"
android:title="@string/settings_announcements_lap_speed_pace" />
<SwitchPreference
android:defaultValue="false"
android:defaultValue="@bool/voice_announce_average_heart_rate_default"
android:key="@string/voice_announce_average_heart_rate_key"
android:title="@string/settings_announcements_average_heart_rate" />
<SwitchPreference
android:defaultValue="false"
android:defaultValue="@bool/voice_announce_lap_heart_rate_default"
android:key="@string/voice_announce_lap_heart_rate_key"
android:title="@string/settings_announcements_lap_heart_rate" />
</PreferenceCategory>