forked from upstream-mirrors/OpenTracks
Merge pull request #1276 from OpenTracksApp/voiceConfig#1275
Added settings for what to announce
This commit is contained in:
+39
-2
@@ -42,7 +42,13 @@ public class VoiceAnnouncementUtilsTest {
|
|||||||
@Before
|
@Before
|
||||||
public void setUp() {
|
public void setUp() {
|
||||||
contentProviderUtils = new ContentProviderUtils(context);
|
contentProviderUtils = new ContentProviderUtils(context);
|
||||||
PreferencesUtils.setVoiceAnnounceHeartRate(false);
|
|
||||||
|
PreferencesUtils.setVoiceAnnounceLapHeartRate(false);
|
||||||
|
PreferencesUtils.setVoiceAnnounceAverageHeartRate(false);
|
||||||
|
PreferencesUtils.setVoiceAnnounceTotalDistance(true);
|
||||||
|
PreferencesUtils.setVoiceAnnounceMovingTime(true);
|
||||||
|
PreferencesUtils.setVoiceAnnounceAverageSpeedPace(true);
|
||||||
|
PreferencesUtils.setVoiceAnnounceLapSpeedPace(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -199,7 +205,8 @@ public class VoiceAnnouncementUtilsTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void getAnnouncement_heart_rate_and_sensor_statistics() {
|
public void getAnnouncement_heart_rate_and_sensor_statistics() {
|
||||||
PreferencesUtils.setVoiceAnnounceHeartRate(true);
|
PreferencesUtils.setVoiceAnnounceAverageHeartRate(true);
|
||||||
|
PreferencesUtils.setVoiceAnnounceLapHeartRate(true);
|
||||||
|
|
||||||
int numberOfPoints = 1000;
|
int numberOfPoints = 1000;
|
||||||
Pair<Track.Id, TrackStatistics> trackWithStats = TestDataUtil.buildTrackWithTrackPoints(contentProviderUtils, numberOfPoints);
|
Pair<Track.Id, TrackStatistics> trackWithStats = TestDataUtil.buildTrackWithTrackPoints(contentProviderUtils, numberOfPoints);
|
||||||
@@ -221,4 +228,34 @@ public class VoiceAnnouncementUtilsTest {
|
|||||||
// then
|
// then
|
||||||
assertEquals("Total distance 14.21 kilometers. 16 minutes 39 seconds. Speed 51.2 kilometers per hour. Lap speed 51.2 kilometers per hour. Average heart rate 180 bpm. Current heart rate 133 bpm.", announcement);
|
assertEquals("Total distance 14.21 kilometers. 16 minutes 39 seconds. Speed 51.2 kilometers per hour. Lap speed 51.2 kilometers per hour. Average heart rate 180 bpm. Current heart rate 133 bpm.", announcement);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getAnnouncement_only_lap_heart_rate() {
|
||||||
|
PreferencesUtils.setVoiceAnnounceLapHeartRate(true);
|
||||||
|
PreferencesUtils.setVoiceAnnounceAverageHeartRate(false);
|
||||||
|
PreferencesUtils.setVoiceAnnounceTotalDistance(false);
|
||||||
|
PreferencesUtils.setVoiceAnnounceMovingTime(false);
|
||||||
|
PreferencesUtils.setVoiceAnnounceAverageSpeedPace(false);
|
||||||
|
PreferencesUtils.setVoiceAnnounceLapSpeedPace(false);
|
||||||
|
|
||||||
|
int numberOfPoints = 1000;
|
||||||
|
Pair<Track.Id, TrackStatistics> trackWithStats = TestDataUtil.buildTrackWithTrackPoints(contentProviderUtils, numberOfPoints);
|
||||||
|
Track.Id trackId = trackWithStats.first;
|
||||||
|
TrackStatistics stats = trackWithStats.second;
|
||||||
|
IntervalStatistics.Interval lastInterval;
|
||||||
|
try (TrackPointIterator trackPointIterator = contentProviderUtils.getTrackPointLocationIterator(trackId, null)) {
|
||||||
|
assertEquals(trackPointIterator.getCount(), numberOfPoints);
|
||||||
|
IntervalStatistics intervalStatistics = new IntervalStatistics(Distance.of(1000));
|
||||||
|
intervalStatistics.addTrackPoints(trackPointIterator);
|
||||||
|
lastInterval = intervalStatistics.getIntervalList().get(intervalStatistics.getIntervalList().size() - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
SensorStatistics sensorStatistics = new SensorStatistics(HeartRate.of(180f), HeartRate.of(180f), null, null, null);
|
||||||
|
|
||||||
|
// when
|
||||||
|
String announcement = VoiceAnnouncementUtils.getAnnouncement(context, stats, true, true, lastInterval, sensorStatistics).toString();
|
||||||
|
|
||||||
|
// then
|
||||||
|
assertEquals(" Current heart rate 132 bpm,", announcement);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -181,8 +181,10 @@ public class VoiceAnnouncement {
|
|||||||
|
|
||||||
Spannable announcement = VoiceAnnouncementUtils.getAnnouncement(context, track.getTrackStatistics(), unitSystem, isReportSpeed, lastInterval, sensorStatistics);
|
Spannable announcement = VoiceAnnouncementUtils.getAnnouncement(context, track.getTrackStatistics(), unitSystem, isReportSpeed, lastInterval, sensorStatistics);
|
||||||
|
|
||||||
// We don't care about the utterance id. It is supplied here to force onUtteranceCompleted to be called.
|
if (announcement.length() > 0) {
|
||||||
tts.speak(announcement, TextToSpeech.QUEUE_FLUSH, null, "not used");
|
// 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");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void stop() {
|
public void stop() {
|
||||||
|
|||||||
+53
-45
@@ -1,7 +1,12 @@
|
|||||||
package de.dennisguse.opentracks.services.announcement;
|
package de.dennisguse.opentracks.services.announcement;
|
||||||
|
|
||||||
import static android.text.Spanned.SPAN_INCLUSIVE_EXCLUSIVE;
|
import static android.text.Spanned.SPAN_INCLUSIVE_EXCLUSIVE;
|
||||||
import static de.dennisguse.opentracks.settings.PreferencesUtils.shouldVoiceAnnounceHeartRate;
|
import static de.dennisguse.opentracks.settings.PreferencesUtils.shouldVoiceAnnounceAverageHeartRate;
|
||||||
|
import static de.dennisguse.opentracks.settings.PreferencesUtils.shouldVoiceAnnounceAverageSpeedPace;
|
||||||
|
import static de.dennisguse.opentracks.settings.PreferencesUtils.shouldVoiceAnnounceLapHeartRate;
|
||||||
|
import static de.dennisguse.opentracks.settings.PreferencesUtils.shouldVoiceAnnounceLapSpeedPace;
|
||||||
|
import static de.dennisguse.opentracks.settings.PreferencesUtils.shouldVoiceAnnounceTotalDistance;
|
||||||
|
import static de.dennisguse.opentracks.settings.PreferencesUtils.shouldVoiceAnnounceMovingTime;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.text.Spannable;
|
import android.text.Spannable;
|
||||||
@@ -58,38 +63,42 @@ class VoiceAnnouncementUtils {
|
|||||||
|
|
||||||
double distanceInUnit = distance.toKM_Miles(unitSystem);
|
double distanceInUnit = distance.toKM_Miles(unitSystem);
|
||||||
|
|
||||||
builder.append(context.getString(R.string.total_distance));
|
if (shouldVoiceAnnounceTotalDistance()) {
|
||||||
long distanceIntegerPart = (long) distanceInUnit;
|
builder.append(context.getString(R.string.total_distance));
|
||||||
// Extract the decimal part
|
long distanceIntegerPart = (long) distanceInUnit;
|
||||||
String distanceFractionalPart = String.format("%.2f", (distanceInUnit - distanceIntegerPart)).substring(2);
|
// Extract the decimal part
|
||||||
// Units should always be english singular for TTS.
|
String distanceFractionalPart = String.format("%.2f", (distanceInUnit - distanceIntegerPart)).substring(2);
|
||||||
// See https://developer.android.com/reference/android/text/style/TtsSpan?hl=en#TYPE_MEASURE
|
// Units should always be english singular for TTS.
|
||||||
appendDecimalUnit(builder, context.getResources().getQuantityString(distanceId, getQuantityCount(distanceInUnit), distanceInUnit), distanceIntegerPart, distanceFractionalPart, unitDistanceTTS);
|
// See https://developer.android.com/reference/android/text/style/TtsSpan?hl=en#TYPE_MEASURE
|
||||||
// Punctuation helps introduce natural pauses in TTS
|
appendDecimalUnit(builder, context.getResources().getQuantityString(distanceId, getQuantityCount(distanceInUnit), distanceInUnit), distanceIntegerPart, distanceFractionalPart, unitDistanceTTS);
|
||||||
builder.append(".");
|
// Punctuation helps introduce natural pauses in TTS
|
||||||
|
builder.append(".");
|
||||||
|
}
|
||||||
if (distance.isZero()) {
|
if (distance.isZero()) {
|
||||||
return builder;
|
return builder;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Announce time
|
// Announce time
|
||||||
Duration movingTime = trackStatistics.getMovingTime();
|
Duration movingTime = trackStatistics.getMovingTime();
|
||||||
if (!movingTime.isZero()) {
|
if (shouldVoiceAnnounceMovingTime() && !movingTime.isZero()) {
|
||||||
appendDuration(context, builder, movingTime);
|
appendDuration(context, builder, movingTime);
|
||||||
builder.append(".");
|
builder.append(".");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isReportSpeed) {
|
if (isReportSpeed) {
|
||||||
double speedInUnit = distancePerTime.to(unitSystem);
|
if (shouldVoiceAnnounceAverageSpeedPace()) {
|
||||||
|
double speedInUnit = distancePerTime.to(unitSystem);
|
||||||
|
|
||||||
builder.append(" ")
|
builder.append(" ")
|
||||||
.append(context.getString(R.string.speed));
|
.append(context.getString(R.string.speed));
|
||||||
long speedIntegerPart = (long) speedInUnit;
|
long speedIntegerPart = (long) speedInUnit;
|
||||||
// Extract the decimal part
|
// Extract the decimal part
|
||||||
String speedFractionalPart = String.format("%.1f", (speedInUnit - speedIntegerPart)).substring(2);
|
String speedFractionalPart = String.format("%.1f", (speedInUnit - speedIntegerPart)).substring(2);
|
||||||
appendDecimalUnit(builder, context.getResources().getQuantityString(speedId, getQuantityCount(speedInUnit), speedInUnit), speedIntegerPart, speedFractionalPart, unitSpeedTTS);
|
appendDecimalUnit(builder, context.getResources().getQuantityString(speedId, getQuantityCount(speedInUnit), speedInUnit), speedIntegerPart, speedFractionalPart, unitSpeedTTS);
|
||||||
builder.append(".");
|
builder.append(".");
|
||||||
|
}
|
||||||
|
|
||||||
if (currentDistancePerTime != null) {
|
if (shouldVoiceAnnounceLapSpeedPace() && currentDistancePerTime != null) {
|
||||||
double currentDistancePerTimeInUnit = currentDistancePerTime.to(unitSystem);
|
double currentDistancePerTimeInUnit = currentDistancePerTime.to(unitSystem);
|
||||||
|
|
||||||
if (currentDistancePerTimeInUnit > 0) {
|
if (currentDistancePerTimeInUnit > 0) {
|
||||||
@@ -104,16 +113,18 @@ class VoiceAnnouncementUtils {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
Duration time = distancePerTime.toPace(unitSystem);
|
if (shouldVoiceAnnounceAverageSpeedPace()) {
|
||||||
builder.append(" ")
|
Duration time = distancePerTime.toPace(unitSystem);
|
||||||
.append(context.getString(R.string.pace));
|
builder.append(" ")
|
||||||
appendDuration(context, builder, time);
|
.append(context.getString(R.string.pace));
|
||||||
builder.append(" ")
|
appendDuration(context, builder, time);
|
||||||
.append(context.getString(perUnitStringId))
|
builder.append(" ")
|
||||||
.append(".");
|
.append(context.getString(perUnitStringId))
|
||||||
|
.append(".");
|
||||||
|
}
|
||||||
|
|
||||||
Duration currentTime = currentDistancePerTime != null ? currentDistancePerTime.toPace(unitSystem) : Duration.ofMillis(0);
|
if (shouldVoiceAnnounceLapSpeedPace() && currentDistancePerTime != null) {
|
||||||
if (!currentTime.isZero()) {
|
Duration currentTime = currentDistancePerTime.toPace(unitSystem);
|
||||||
builder.append(" ")
|
builder.append(" ")
|
||||||
.append(context.getString(R.string.lap_time));
|
.append(context.getString(R.string.lap_time));
|
||||||
appendDuration(context, builder, currentTime);
|
appendDuration(context, builder, currentTime);
|
||||||
@@ -123,24 +134,21 @@ class VoiceAnnouncementUtils {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (shouldVoiceAnnounceHeartRate()) {
|
if (shouldVoiceAnnounceAverageHeartRate() && sensorStatistics != null && sensorStatistics.hasHeartRate()) {
|
||||||
if (sensorStatistics != null && sensorStatistics.hasHeartRate()) {
|
int averageHeartRate = Math.round(sensorStatistics.getAvgHeartRate().getBPM());
|
||||||
int averageHeartRate = Math.round(sensorStatistics.getAvgHeartRate().getBPM());
|
|
||||||
|
|
||||||
builder.append(" ")
|
builder.append(" ")
|
||||||
.append(context.getString(R.string.average_heart_rate));
|
.append(context.getString(R.string.average_heart_rate));
|
||||||
appendCardinal(builder, context.getString(R.string.sensor_state_heart_rate_value, averageHeartRate), averageHeartRate);
|
appendCardinal(builder, context.getString(R.string.sensor_state_heart_rate_value, averageHeartRate), averageHeartRate);
|
||||||
builder.append(".");
|
builder.append(".");
|
||||||
}
|
}
|
||||||
|
if (shouldVoiceAnnounceLapHeartRate() && currentInterval != null && currentInterval.hasAverageHeartRate()) {
|
||||||
|
int currentHeartRate = Math.round(currentInterval.getAverageHeartRate().getBPM());
|
||||||
|
|
||||||
if (currentInterval != null && currentInterval.hasAverageHeartRate()) {
|
builder.append(" ")
|
||||||
int currentHeartRate = Math.round(currentInterval.getAverageHeartRate().getBPM());
|
.append(context.getString(R.string.current_heart_rate));
|
||||||
|
appendCardinal(builder, context.getString(R.string.sensor_state_heart_rate_value, currentHeartRate), currentHeartRate);
|
||||||
builder.append(" ")
|
builder.append(".");
|
||||||
.append(context.getString(R.string.current_heart_rate));
|
|
||||||
appendCardinal(builder, context.getString(R.string.sensor_state_heart_rate_value, currentHeartRate), currentHeartRate);
|
|
||||||
builder.append(".");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return builder;
|
return builder;
|
||||||
|
|||||||
@@ -343,13 +343,58 @@ public class PreferencesUtils {
|
|||||||
return getFloat(R.string.voice_speed_rate_key, DEFAULT);
|
return getFloat(R.string.voice_speed_rate_key, DEFAULT);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean shouldVoiceAnnounceHeartRate() {
|
public static boolean shouldVoiceAnnounceTotalDistance() {
|
||||||
return getBoolean(R.string.voice_announce_heart_rate_key, false);
|
return getBoolean(R.string.voice_announce_total_distance_key, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
public static void setVoiceAnnounceHeartRate(boolean value) {
|
public static void setVoiceAnnounceTotalDistance(boolean value) {
|
||||||
setBoolean(R.string.voice_announce_heart_rate_key, value);
|
setBoolean(R.string.voice_announce_total_distance_key, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean shouldVoiceAnnounceMovingTime() {
|
||||||
|
return getBoolean(R.string.voice_announce_moving_time_key, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@VisibleForTesting
|
||||||
|
public static void setVoiceAnnounceMovingTime(boolean value) {
|
||||||
|
setBoolean(R.string.voice_announce_moving_time_key, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean shouldVoiceAnnounceAverageSpeedPace() {
|
||||||
|
return getBoolean(R.string.voice_announce_average_speed_pace_key, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@VisibleForTesting
|
||||||
|
public static void setVoiceAnnounceAverageSpeedPace(boolean value) {
|
||||||
|
setBoolean(R.string.voice_announce_average_speed_pace_key, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean shouldVoiceAnnounceLapSpeedPace() {
|
||||||
|
return getBoolean(R.string.voice_announce_lap_speed_pace_key, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@VisibleForTesting
|
||||||
|
public static void setVoiceAnnounceLapSpeedPace(boolean value) {
|
||||||
|
setBoolean(R.string.voice_announce_lap_speed_pace_key, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean shouldVoiceAnnounceLapHeartRate() {
|
||||||
|
return getBoolean(R.string.voice_announce_lap_heart_rate_key, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
@VisibleForTesting
|
||||||
|
public static void setVoiceAnnounceLapHeartRate(boolean value) {
|
||||||
|
setBoolean(R.string.voice_announce_lap_heart_rate_key, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean shouldVoiceAnnounceAverageHeartRate() {
|
||||||
|
return getBoolean(R.string.voice_announce_average_heart_rate_key, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
@VisibleForTesting
|
||||||
|
public static void setVoiceAnnounceAverageHeartRate(boolean value) {
|
||||||
|
setBoolean(R.string.voice_announce_average_heart_rate_key, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Distance getRecordingDistanceInterval() {
|
public static Distance getRecordingDistanceInterval() {
|
||||||
|
|||||||
@@ -520,6 +520,5 @@
|
|||||||
</plurals>
|
</plurals>
|
||||||
<string name="average_heart_rate">Ritmo cardíaco promedio</string>
|
<string name="average_heart_rate">Ritmo cardíaco promedio</string>
|
||||||
<string name="current_heart_rate">Ritmo cardíaco actual</string>
|
<string name="current_heart_rate">Ritmo cardíaco actual</string>
|
||||||
<string name="settings_announcements_report_heart_rate">Anunciar ritmo cardíaco</string>
|
|
||||||
<string name="settings_export_filename_title">Formato del nombre del archivo</string>
|
<string name="settings_export_filename_title">Formato del nombre del archivo</string>
|
||||||
</resources>
|
</resources>
|
||||||
@@ -546,7 +546,6 @@ limitations under the License.
|
|||||||
<string name="export_dir_not_writable">" (nelze zapisovat!)"</string>
|
<string name="export_dir_not_writable">" (nelze zapisovat!)"</string>
|
||||||
<string name="generic_today">Dnes</string>
|
<string name="generic_today">Dnes</string>
|
||||||
<string name="no_compatible_file_manager_installed">Není nainstalován kompatibilní správce souborů</string>
|
<string name="no_compatible_file_manager_installed">Není nainstalován kompatibilní správce souborů</string>
|
||||||
<string name="settings_announcements_report_heart_rate">Hlásit tepovou frekvenci</string>
|
|
||||||
<string name="voice_per_kilometer">za kilometr</string>
|
<string name="voice_per_kilometer">za kilometr</string>
|
||||||
<string name="lap_time">Čas kola</string>
|
<string name="lap_time">Čas kola</string>
|
||||||
<string name="lap_speed">Rychlost kola</string>
|
<string name="lap_speed">Rychlost kola</string>
|
||||||
|
|||||||
@@ -554,7 +554,6 @@ limitations under the License.
|
|||||||
<string name="settings_public_api_dashboard_enabled_title">Transferencia automática de datos</string>
|
<string name="settings_public_api_dashboard_enabled_title">Transferencia automática de datos</string>
|
||||||
<string name="settings_public_api_dashboard_enabled_summary_on">Una aplicación que ha iniciado una grabación puede también acceder a los datos grabados.</string>
|
<string name="settings_public_api_dashboard_enabled_summary_on">Una aplicación que ha iniciado una grabación puede también acceder a los datos grabados.</string>
|
||||||
<string name="settings_public_api_dashboard_enabled_summary_off">Los datos grabados no se compartirán automáticamente con otras aplicaciones.</string>
|
<string name="settings_public_api_dashboard_enabled_summary_off">Los datos grabados no se compartirán automáticamente con otras aplicaciones.</string>
|
||||||
<string name="settings_announcements_report_heart_rate">Anunciar ritmo cardíaco</string>
|
|
||||||
<string name="voice_per_kilometer">por kilometro</string>
|
<string name="voice_per_kilometer">por kilometro</string>
|
||||||
<string name="voice_per_mile">por milla</string>
|
<string name="voice_per_mile">por milla</string>
|
||||||
<string name="lap_time">Tiempo de vuelta</string>
|
<string name="lap_time">Tiempo de vuelta</string>
|
||||||
|
|||||||
@@ -542,7 +542,6 @@ Si le dispositif GPS signale des données inexactes (par exemple, la localisatio
|
|||||||
<string name="export_cannot_write_to_dir">Impossible d\'écrire dans le répertoire d\'exportation.</string>
|
<string name="export_cannot_write_to_dir">Impossible d\'écrire dans le répertoire d\'exportation.</string>
|
||||||
<string name="export_dir_not_writable">" (non inscriptible !)"</string>
|
<string name="export_dir_not_writable">" (non inscriptible !)"</string>
|
||||||
<string name="no_compatible_file_manager_installed">Aucun gestionnaire de fichiers compatible n\'est installé</string>
|
<string name="no_compatible_file_manager_installed">Aucun gestionnaire de fichiers compatible n\'est installé</string>
|
||||||
<string name="settings_announcements_report_heart_rate">Rapport de la fréquence cardiaque</string>
|
|
||||||
<string name="settings_public_api_enabled_title">API publique</string>
|
<string name="settings_public_api_enabled_title">API publique</string>
|
||||||
<string name="average_heart_rate">Fréquence cardiaque moyenne</string>
|
<string name="average_heart_rate">Fréquence cardiaque moyenne</string>
|
||||||
<string name="current_heart_rate">Fréquence cardiaque actuelle</string>
|
<string name="current_heart_rate">Fréquence cardiaque actuelle</string>
|
||||||
|
|||||||
@@ -549,7 +549,6 @@ Se te detés ou estás en interiores, non se gardarán datos do sensor (mais ser
|
|||||||
<string name="export_dir_not_writable">" (non escribible!)"</string>
|
<string name="export_dir_not_writable">" (non escribible!)"</string>
|
||||||
<string name="no_compatible_file_manager_installed">Non compatible xestor de ficheiros instalados</string>
|
<string name="no_compatible_file_manager_installed">Non compatible xestor de ficheiros instalados</string>
|
||||||
<string name="settings_api_title">API pública</string>
|
<string name="settings_api_title">API pública</string>
|
||||||
<string name="settings_announcements_report_heart_rate">Informar do pulso</string>
|
|
||||||
<string name="settings_public_api_enabled_title">API pública</string>
|
<string name="settings_public_api_enabled_title">API pública</string>
|
||||||
<string name="settings_public_api_disabled_toast">API pública de OpenTracks desactivada: pode activarse nos axustes.</string>
|
<string name="settings_public_api_disabled_toast">API pública de OpenTracks desactivada: pode activarse nos axustes.</string>
|
||||||
<string name="lap_time">Tempo da volta</string>
|
<string name="lap_time">Tempo da volta</string>
|
||||||
|
|||||||
@@ -550,7 +550,6 @@ limitations under the License.
|
|||||||
<string name="settings_public_api_dashboard_enabled_title">Automatisk dataoverføring</string>
|
<string name="settings_public_api_dashboard_enabled_title">Automatisk dataoverføring</string>
|
||||||
<string name="settings_public_api_dashboard_enabled_summary_on">Et program som startet et opptak kan også få tilgang til de registrerte dataene.</string>
|
<string name="settings_public_api_dashboard_enabled_summary_on">Et program som startet et opptak kan også få tilgang til de registrerte dataene.</string>
|
||||||
<string name="settings_public_api_dashboard_enabled_summary_off">Registrerte data blir ikke delt automatisk med andre programmer.</string>
|
<string name="settings_public_api_dashboard_enabled_summary_off">Registrerte data blir ikke delt automatisk med andre programmer.</string>
|
||||||
<string name="settings_announcements_report_heart_rate">Rapporter puls</string>
|
|
||||||
<string name="voice_per_kilometer">per kilometer</string>
|
<string name="voice_per_kilometer">per kilometer</string>
|
||||||
<string name="voice_per_mile">per engelsk mil</string>
|
<string name="voice_per_mile">per engelsk mil</string>
|
||||||
<string name="lap_time">Rundetid</string>
|
<string name="lap_time">Rundetid</string>
|
||||||
|
|||||||
@@ -499,7 +499,6 @@ Als het GPS-apparaat onnauwkeurige gegevens rapporteert (bijv. locatie, snelheid
|
|||||||
<string name="settings_public_api_dashboard_enabled_summary_on">Een app die een opname start, heeft ook toegang tot de opgenomen gegevens.</string>
|
<string name="settings_public_api_dashboard_enabled_summary_on">Een app die een opname start, heeft ook toegang tot de opgenomen gegevens.</string>
|
||||||
<string name="stats_sensors_cadence">Cadans</string>
|
<string name="stats_sensors_cadence">Cadans</string>
|
||||||
<string name="stats_sensors_heart_rate">Hartslag</string>
|
<string name="stats_sensors_heart_rate">Hartslag</string>
|
||||||
<string name="settings_announcements_report_heart_rate">Hartslag melden</string>
|
|
||||||
<string name="settings_layout_reset">Aangepaste lay-out terugzetten</string>
|
<string name="settings_layout_reset">Aangepaste lay-out terugzetten</string>
|
||||||
<string name="settings_layout_reset_confirm_message">Alle lay-out instellingen worden teruggezet naar de standaardwaarden. Tracks worden niet gewist.</string>
|
<string name="settings_layout_reset_confirm_message">Alle lay-out instellingen worden teruggezet naar de standaardwaarden. Tracks worden niet gewist.</string>
|
||||||
<string name="settings_public_api_enabled_summary_on">Andere geïnstalleerde apps kunnen opnames starten of stoppen.</string>
|
<string name="settings_public_api_enabled_summary_on">Andere geïnstalleerde apps kunnen opnames starten of stoppen.</string>
|
||||||
|
|||||||
@@ -508,7 +508,6 @@
|
|||||||
<item quantity="other">%1$.2f quilômetros</item>
|
<item quantity="other">%1$.2f quilômetros</item>
|
||||||
</plurals>
|
</plurals>
|
||||||
<string name="generic_dismiss">Dispensar</string>
|
<string name="generic_dismiss">Dispensar</string>
|
||||||
<string name="settings_announcements_report_heart_rate">Informar frequência cardíaca</string>
|
|
||||||
<string name="settings_api_title">API pública</string>
|
<string name="settings_api_title">API pública</string>
|
||||||
<string name="settings_public_api_dashboard_enabled_title">Transferência automática de dados</string>
|
<string name="settings_public_api_dashboard_enabled_title">Transferência automática de dados</string>
|
||||||
<string name="voice_per_kilometer">por quilômetro</string>
|
<string name="voice_per_kilometer">por quilômetro</string>
|
||||||
|
|||||||
@@ -532,7 +532,6 @@ limitations under the License.
|
|||||||
<string name="settings_reset_summary">Сбросить настройки</string>
|
<string name="settings_reset_summary">Сбросить настройки</string>
|
||||||
<string name="settings_recording_idle_speed_title">Порог скорости холостого хода</string>
|
<string name="settings_recording_idle_speed_title">Порог скорости холостого хода</string>
|
||||||
<string name="settings_generic_sensor">Обычные</string>
|
<string name="settings_generic_sensor">Обычные</string>
|
||||||
<string name="settings_announcements_report_heart_rate">Сообщать пульс</string>
|
|
||||||
<string name="custom_layout_select_layout">Выбрать раскладку</string>
|
<string name="custom_layout_select_layout">Выбрать раскладку</string>
|
||||||
<string name="stats_custom_layout_default_layout">Раскладка по умолчанию</string>
|
<string name="stats_custom_layout_default_layout">Раскладка по умолчанию</string>
|
||||||
<string name="settings_layout_reset_confirm_title">Сбросить свои раскладки\?</string>
|
<string name="settings_layout_reset_confirm_title">Сбросить свои раскладки\?</string>
|
||||||
|
|||||||
@@ -386,7 +386,6 @@ limitations under the License.
|
|||||||
<string name="settings_cycling_sensor">Kolesarjenje</string>
|
<string name="settings_cycling_sensor">Kolesarjenje</string>
|
||||||
<string name="settings_running_sensor">Teče</string>
|
<string name="settings_running_sensor">Teče</string>
|
||||||
<string name="track_recording_notification_accuracy">Natančnost lokacije: %1$s</string>
|
<string name="track_recording_notification_accuracy">Natančnost lokacije: %1$s</string>
|
||||||
<string name="settings_announcements_report_heart_rate">Poročanje o srčnem utripu</string>
|
|
||||||
<string name="location_latitude_longitude">%1$s, %2$s</string>
|
<string name="location_latitude_longitude">%1$s, %2$s</string>
|
||||||
<string name="location_coordinate">%1$s°</string>
|
<string name="location_coordinate">%1$s°</string>
|
||||||
<string name="track_distance_notification">Razdalja: %1$s</string>
|
<string name="track_distance_notification">Razdalja: %1$s</string>
|
||||||
|
|||||||
@@ -512,7 +512,6 @@ limitations under the License.
|
|||||||
<string name="location_coordinate">%1$s°</string>
|
<string name="location_coordinate">%1$s°</string>
|
||||||
<string name="settings_all_reset">Sıfırla</string>
|
<string name="settings_all_reset">Sıfırla</string>
|
||||||
<string name="settings_generic_sensor">Genel</string>
|
<string name="settings_generic_sensor">Genel</string>
|
||||||
<string name="settings_announcements_report_heart_rate">Kalp atış hızını bildir</string>
|
|
||||||
<string name="custom_layout_list_edit_name">Eklemek için dizilimin adını yazın</string>
|
<string name="custom_layout_list_edit_name">Eklemek için dizilimin adını yazın</string>
|
||||||
<string name="settings_layout_reset_confirm_message">Tüm dizilim ayarları varsayılan değerlere döndürülecektir. Bu cihazdaki hiçbir parçayı silmez.</string>
|
<string name="settings_layout_reset_confirm_message">Tüm dizilim ayarları varsayılan değerlere döndürülecektir. Bu cihazdaki hiçbir parçayı silmez.</string>
|
||||||
<string name="settings_running_sensor">Koşu</string>
|
<string name="settings_running_sensor">Koşu</string>
|
||||||
|
|||||||
@@ -535,7 +535,6 @@ limitations under the License.
|
|||||||
<string name="settings_public_api_enabled_title">API công khai</string>
|
<string name="settings_public_api_enabled_title">API công khai</string>
|
||||||
<string name="settings_public_api_enabled_summary_off">Chỉ OpenTracks có thể bắt đầu và dừng ghi.</string>
|
<string name="settings_public_api_enabled_summary_off">Chỉ OpenTracks có thể bắt đầu và dừng ghi.</string>
|
||||||
<string name="settings_public_api_enabled_summary_on">Các ứng dụng khác có thể bắt đầu hoặc dừng ghi.</string>
|
<string name="settings_public_api_enabled_summary_on">Các ứng dụng khác có thể bắt đầu hoặc dừng ghi.</string>
|
||||||
<string name="settings_announcements_report_heart_rate">Báo cáo nhịp tim</string>
|
|
||||||
<string name="settings_api_title">API công khai</string>
|
<string name="settings_api_title">API công khai</string>
|
||||||
<string name="generic_dismiss">Bỏ</string>
|
<string name="generic_dismiss">Bỏ</string>
|
||||||
<string name="gps_recording_status">%1$s: %2$s</string>
|
<string name="gps_recording_status">%1$s: %2$s</string>
|
||||||
|
|||||||
@@ -291,7 +291,12 @@
|
|||||||
<item>1.2</item>
|
<item>1.2</item>
|
||||||
<item>1.3</item>
|
<item>1.3</item>
|
||||||
</string-array>
|
</string-array>
|
||||||
<string name="voice_announce_heart_rate_key" translatable="false">voiceAnnounceHeartRate</string>
|
<string name="voice_announce_total_distance_key" translatable="false">voiceAnnounceTotalDistance</string>
|
||||||
|
<string name="voice_announce_moving_time_key" translatable="false">voiceAnnounceMovingTime</string>
|
||||||
|
<string name="voice_announce_average_speed_pace_key" translatable="false">voiceAnnounceAverageSpeedPace</string>
|
||||||
|
<string name="voice_announce_lap_speed_pace_key" translatable="false">voiceAnnounceLapSpeedPace</string>
|
||||||
|
<string name="voice_announce_average_heart_rate_key" translatable="false">voiceAnnounceAverageHeartRate</string>
|
||||||
|
<string name="voice_announce_lap_heart_rate_key" translatable="false">voiceAnnounceLapHeartRate</string>
|
||||||
|
|
||||||
<string name="export_trackfileformat_key" translatable="false">exportTrackFileFormat</string>
|
<string name="export_trackfileformat_key" translatable="false">exportTrackFileFormat</string>
|
||||||
<!-- See TrackFileFormat -->
|
<!-- See TrackFileFormat -->
|
||||||
|
|||||||
@@ -395,7 +395,10 @@ limitations under the License.
|
|||||||
|
|
||||||
<string name="settings_announcements_totaltime_frequency">Time interval</string>
|
<string name="settings_announcements_totaltime_frequency">Time interval</string>
|
||||||
<string name="settings_announcements_distance_frequency">Distance interval</string>
|
<string name="settings_announcements_distance_frequency">Distance interval</string>
|
||||||
<string name="settings_announcements_report_heart_rate">Report heart rate</string>
|
<string name="settings_announcements_average_heart_rate">Average heart rate</string>
|
||||||
|
<string name="settings_announcements_lap_heart_rate">Lap heart rate</string>
|
||||||
|
<string name="settings_announcements_average_speed_pace">Average speed/pace</string>
|
||||||
|
<string name="settings_announcements_lap_speed_pace">Lap speed/pace</string>
|
||||||
|
|
||||||
<!-- Custom Layout -->
|
<!-- Custom Layout -->
|
||||||
<string name="custom_layout_list_title">Layouts</string>
|
<string name="custom_layout_list_title">Layouts</string>
|
||||||
|
|||||||
@@ -26,9 +26,37 @@
|
|||||||
android:title="@string/menu_voice_rate"
|
android:title="@string/menu_voice_rate"
|
||||||
app:useSimpleSummaryProvider="true" />
|
app:useSimpleSummaryProvider="true" />
|
||||||
|
|
||||||
<SwitchPreference
|
<PreferenceCategory android:title="@string/settings_announcements_title">
|
||||||
android:defaultValue="false"
|
|
||||||
android:key="@string/voice_announce_heart_rate_key"
|
<SwitchPreference
|
||||||
android:title="@string/settings_announcements_report_heart_rate" />
|
android:defaultValue="true"
|
||||||
|
android:key="@string/voice_announce_total_distance_key"
|
||||||
|
android:title="@string/total_distance" />
|
||||||
|
|
||||||
|
<SwitchPreference
|
||||||
|
android:defaultValue="true"
|
||||||
|
android:key="@string/voice_announce_moving_time_key"
|
||||||
|
android:title="@string/stats_moving_time" />
|
||||||
|
|
||||||
|
<SwitchPreference
|
||||||
|
android:defaultValue="true"
|
||||||
|
android:key="@string/voice_announce_average_speed_pace_key"
|
||||||
|
android:title="@string/settings_announcements_average_speed_pace" />
|
||||||
|
|
||||||
|
<SwitchPreference
|
||||||
|
android:defaultValue="true"
|
||||||
|
android:key="@string/voice_announce_lap_speed_pace_key"
|
||||||
|
android:title="@string/settings_announcements_lap_speed_pace" />
|
||||||
|
|
||||||
|
<SwitchPreference
|
||||||
|
android:defaultValue="false"
|
||||||
|
android:key="@string/voice_announce_average_heart_rate_key"
|
||||||
|
android:title="@string/settings_announcements_average_heart_rate" />
|
||||||
|
|
||||||
|
<SwitchPreference
|
||||||
|
android:defaultValue="false"
|
||||||
|
android:key="@string/voice_announce_lap_heart_rate_key"
|
||||||
|
android:title="@string/settings_announcements_lap_heart_rate" />
|
||||||
|
</PreferenceCategory>
|
||||||
|
|
||||||
</PreferenceScreen>
|
</PreferenceScreen>
|
||||||
Reference in New Issue
Block a user