Announcements: can be triggered by time and distance (instead of either).

Fixes #921.
This commit is contained in:
Dennis Guse
2021-08-29 20:22:31 +02:00
parent 9cb3d8c1bb
commit 8f2d1722ad
65 changed files with 169 additions and 205 deletions
@@ -107,34 +107,6 @@ public class TrackRecordingServiceTestLooper {
fullRecordingSession();
}
@MediumTest
@Test
public void testWithProperties_voiceFrequencyDefault() throws TimeoutException {
SharedPreferences.Editor editor = PreferenceManager.getDefaultSharedPreferences(context).edit();
editor.putInt(context.getString(R.string.voice_frequency_key), Integer.parseInt(context.getResources().getString(R.string.voice_frequency_default)));
editor.commit();
fullRecordingSession();
}
@MediumTest
@Test
public void testWithProperties_voiceFrequencyByDistance() throws TimeoutException {
SharedPreferences.Editor editor = PreferenceManager.getDefaultSharedPreferences(context).edit();
editor.putInt(context.getString(R.string.voice_frequency_key), -1);
editor.commit();
fullRecordingSession();
}
@MediumTest
@Test
public void testWithProperties_voiceFrequencyByTime() throws TimeoutException {
SharedPreferences.Editor editor = PreferenceManager.getDefaultSharedPreferences(context).edit();
editor.putInt(context.getString(R.string.voice_frequency_key), 1);
editor.commit();
fullRecordingSession();
}
@MediumTest
@Test
public void testWithProperties_maxRecordingDistanceDefault() throws TimeoutException {
@@ -15,6 +15,7 @@ import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import java.time.Duration;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
@@ -54,16 +55,37 @@ public class VoiceAnnouncementManagerTest {
.getService();
VoiceAnnouncementManager voiceAnnouncementManager = new VoiceAnnouncementManager(service);
voiceAnnouncementManager.setMetricUnits(true);
voiceAnnouncementManager.setTaskFrequency(-5);
voiceAnnouncementManager.setFrequency(Distance.ofKilometer(5));
// when
TrackStatistics statistics = new TrackStatistics();
statistics.setTotalDistance(Distance.of(13000));
assertEquals(Distance.of(15000), voiceAnnouncementManager.calculateNextTaskDistance(statistics));
statistics.setTotalDistance(Distance.ofKilometer(13));
voiceAnnouncementManager.restore(statistics);
assertEquals(Distance.of(15000), voiceAnnouncementManager.getNextTotalDistance());
statistics.setTotalDistance(Distance.of(15100));
assertEquals(Distance.of(20000), voiceAnnouncementManager.calculateNextTaskDistance(statistics));
voiceAnnouncementManager.restore(statistics);
assertEquals(Distance.of(20000), voiceAnnouncementManager.getNextTotalDistance());
}
@Test
public void calculateNextTotalTime() throws TimeoutException {
// given
TrackRecordingService service = ((TrackRecordingService.Binder) mServiceRule.bindService(new Intent(context, TrackRecordingService.class)))
.getService();
VoiceAnnouncementManager voiceAnnouncementManager = new VoiceAnnouncementManager(service);
voiceAnnouncementManager.setFrequency(Duration.ofSeconds(5));
// when
TrackStatistics statistics = new TrackStatistics();
statistics.setTotalTime(Duration.ofSeconds(91));
voiceAnnouncementManager.restore(statistics);
assertEquals(Duration.ofSeconds(95), voiceAnnouncementManager.getNextTotalTime());
statistics.setTotalTime(Duration.ofSeconds(95));
voiceAnnouncementManager.restore(statistics);
assertEquals(Duration.ofSeconds(100), voiceAnnouncementManager.getNextTotalTime());
}
}
@@ -77,7 +77,7 @@ public class TrackListActivity extends AbstractTrackDeleteActivity implements Co
private static final String TAG = TrackListActivity.class.getSimpleName();
// The following are set in onCreate
// The following are setFrequency in onCreate
private SharedPreferences sharedPreferences;
private TrackRecordingServiceConnection trackRecordingServiceConnection;
private ResourceCursorAdapter resourceCursorAdapter;
@@ -66,7 +66,7 @@ public class TrackRecordedActivity extends AbstractTrackDeleteActivity implement
private static final String CURRENT_TAB_TAG_KEY = "current_tab_tag_key";
// The following are set in onCreate.
// The following are setFrequency in onCreate.
private ContentProviderUtils contentProviderUtils;
private SharedPreferences sharedPreferences;
private TrackDataHub trackDataHub;
@@ -51,7 +51,7 @@ public class TrackRecordingActivity extends AbstractActivity implements ChooseAc
private static final String CURRENT_TAB_TAG_KEY = "current_tab_tag_key";
// The following are set in onCreate
// The following are setFrequency in onCreate
private ContentProviderUtils contentProviderUtils;
private SharedPreferences sharedPreferences;
private TrackRecordingServiceConnection trackRecordingServiceConnection;
@@ -108,7 +108,7 @@ public class ChartFragment extends Fragment implements TrackDataListener {
};
/**
* A runnable that will set the orange pointer as appropriate and redraw.
* A runnable that will setFrequency the orange pointer as appropriate and redraw.
*/
private final Runnable updateChart = new Runnable() {
@Override
@@ -73,7 +73,7 @@ public class TrackRecordingService extends Service implements TrackPointCreator.
public static final RecordingData NOT_RECORDING = new RecordingData(null, null, null);
public static final GpsStatusValue STATUS_GPS_DEFAULT = GpsStatusValue.GPS_NONE;
// The following variables are set in onCreate:
// The following variables are setFrequency in onCreate:
private VoiceAnnouncementManager voiceAnnouncementManager;
private TrackRecordingServiceNotificationManager notificationManager;
@@ -104,20 +104,21 @@ public class TrackRecordingService extends Service implements TrackPointCreator.
Context context = TrackRecordingService.this;
if (PreferencesUtils.isKey(context, R.string.stats_units_key, key)) {
boolean metricUnits = PreferencesUtils.isMetricUnits(sharedPreferences, context);
voiceAnnouncementManager.setMetricUnits(metricUnits);
notificationManager.setMetricUnits(metricUnits);
}
if (PreferencesUtils.isKey(context, R.string.voice_frequency_key, key)) {
voiceAnnouncementManager.setTaskFrequency(PreferencesUtils.getVoiceFrequency(sharedPreferences, context));
if (PreferencesUtils.isKey(context, R.string.voice_announcement_frequency_key, key)) {
voiceAnnouncementManager.setFrequency(PreferencesUtils.getVoiceAnnouncementFrequency(sharedPreferences, context));
}
if (PreferencesUtils.isKey(context, new int[]{R.string.voice_announcement_distance_key, R.string.stats_units_key}, key)) {
voiceAnnouncementManager.setFrequency(PreferencesUtils.getVoiceAnnouncementDistance(sharedPreferences, context));
}
trackPointCreator.onSharedPreferenceChanged(sharedPreferences, key);
trackRecordingManager.onSharedPreferenceChanged(sharedPreferences, key);
}
};
// The following variables are set when recording:
// The following variables are setFrequency when recording:
private WakeLock wakeLock;
private final Binder binder = new Binder();
@@ -40,48 +40,35 @@ public class VoiceAnnouncementManager {
private final TrackRecordingService trackRecordingService;
private final int TASK_FREQUENCY_OFF;
/**
* The task frequency.
* A positive value is a time frequency (minutes).
* A negative value is a distance frequency (km or mi).
* A zero value is to turn off periodic task.
*/
private int taskFrequency;
private VoiceAnnouncement voiceAnnouncement;
private boolean metricUnits;
private TrackStatistics trackStatistics;
private static final Distance DISTANCE_OFF = Distance.of(Double.MAX_VALUE);
private Distance distanceFrequency = DISTANCE_OFF;
@NonNull
private Distance nextTotalDistance = DISTANCE_OFF;
private static final Duration TOTALTIME_OFF = Duration.ofMillis(Long.MAX_VALUE);
private Duration totalTimeFrequency = TOTALTIME_OFF;
@NonNull
private Duration nextTotalTime = TOTALTIME_OFF;
public VoiceAnnouncementManager(@NonNull TrackRecordingService trackRecordingService) {
this.trackRecordingService = trackRecordingService;
TASK_FREQUENCY_OFF = Integer.parseInt(trackRecordingService.getString(R.string.frequency_off));
taskFrequency = TASK_FREQUENCY_OFF;
}
public void restore(@Nullable TrackStatistics trackStatistics) {
if (taskFrequency == TASK_FREQUENCY_OFF) {
Log.d(TAG, "Task frequency is off.");
return;
}
voiceAnnouncement = new VoiceAnnouncement(trackRecordingService);
voiceAnnouncement.start();
if (isTimeFrequency()) {
nextTotalTime = trackStatistics != null ? calculateNextDuration(trackStatistics) : TOTALTIME_OFF;
} else {
// For distance periodic task
updateNextTaskDistance(trackStatistics);
this.trackStatistics = trackStatistics;
if (!totalTimeFrequency.isZero()) {
nextTotalTime = calculateNextDuration();
}
if (!distanceFrequency.isZero()) {
nextTotalDistance = calculateNextTaskDistance();
}
}
@@ -90,14 +77,15 @@ public class VoiceAnnouncementManager {
Log.e(TAG, "Cannot update when in status shutdown.");
return;
}
boolean announce = false;
this.trackStatistics = track.getTrackStatistics();
if (trackStatistics.getTotalDistance().greaterThan(nextTotalDistance)) {
updateNextTaskDistance(trackStatistics);
nextTotalDistance = calculateNextTaskDistance();
announce = true;
}
if (!trackStatistics.getTotalTime().minus(nextTotalTime).isNegative()) {
nextTotalTime = calculateNextDuration(trackStatistics);
nextTotalTime = calculateNextDuration();
announce = true;
}
@@ -113,59 +101,48 @@ public class VoiceAnnouncementManager {
}
}
public void setTaskFrequency(int taskFrequency) {
this.taskFrequency = taskFrequency;
public void setFrequency(Duration frequency) {
this.totalTimeFrequency = frequency;
restore(this.trackStatistics);
}
public void setMetricUnits(boolean metricUnits) {
this.metricUnits = metricUnits;
updateNextTaskDistance(this.trackStatistics);
}
private void updateNextTaskDistance(TrackStatistics trackStatistics) {
if (!isDistanceFrequency()) {
nextTotalDistance = DISTANCE_OFF;
Log.d(TAG, "SplitManager: Distance splits disabled.");
return;
}
if (trackStatistics == null) {
return;
}
nextTotalDistance = calculateNextTaskDistance(trackStatistics);
public void setFrequency(Distance frequency) {
this.distanceFrequency = frequency;
restore(this.trackStatistics);
}
@VisibleForTesting
public Distance calculateNextTaskDistance(@NonNull TrackStatistics trackStatistics) {
public Distance calculateNextTaskDistance() {
if (trackStatistics == null) {
return DISTANCE_OFF;
}
Distance distance = trackStatistics.getTotalDistance();
Distance announcementInterval = Distance.one(metricUnits).multipliedBy(Math.abs(taskFrequency));
int index = (int) (distance.dividedBy(announcementInterval));
return announcementInterval.multipliedBy(index + 1);
int index = (int) (distance.dividedBy(distanceFrequency));
return distanceFrequency.multipliedBy(index + 1);
}
private Duration calculateNextDuration(@Nullable TrackStatistics trackStatistics) {
private Duration calculateNextDuration() {
if (trackStatistics == null) {
return null;
return TOTALTIME_OFF;
}
if (!isTimeFrequency()) {
throw new RuntimeException("Using distance frequency as time frequency is impossible.");
}
Duration totalTime = trackStatistics.getTotalTime();
Duration interval = Duration.ofMinutes(taskFrequency);
Duration intervalMod = Duration.ofMillis(trackStatistics.getTotalTime().toMillis() % interval.toMillis());
Duration intervalMod = Duration.ofMillis(trackStatistics.getTotalTime().toMillis() % totalTimeFrequency.toMillis());
return totalTime.plus(interval.minus(intervalMod));
return totalTime.plus(totalTimeFrequency.minus(intervalMod));
}
private boolean isTimeFrequency() {
return taskFrequency > 0;
@VisibleForTesting
@NonNull
public Duration getNextTotalTime() {
return nextTotalTime;
}
private boolean isDistanceFrequency() {
return taskFrequency < 0;
@VisibleForTesting
@NonNull
public Distance getNextTotalDistance() {
return nextTotalDistance;
}
}
@@ -3,12 +3,10 @@ package de.dennisguse.opentracks.settings;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.speech.tts.TextToSpeech;
import android.util.Log;
import android.view.View;
import android.widget.Toast;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.widget.Toolbar;
import androidx.documentfile.provider.DocumentFile;
@@ -286,8 +284,11 @@ public class SettingsActivity extends AbstractActivity implements ChooseActivity
private void updateUnits() {
boolean metricUnits = PreferencesUtils.isMetricUnits(sharedPreferences, getActivity());
ListPreference voiceFrequency = findPreference(getString(R.string.voice_frequency_key));
voiceFrequency.setEntries(StringUtils.getFrequencyOptions(getActivity(), metricUnits));
ListPreference voiceFrequency = findPreference(getString(R.string.voice_announcement_frequency_key));
voiceFrequency.setEntries(StringUtils.getAnnouncementFrequency(getActivity()));
ListPreference voiceDistance = findPreference(getString(R.string.voice_announcement_distance_key));
voiceDistance.setEntries(StringUtils.getAnnouncementDistance(getActivity(), metricUnits));
ListPreference minRecordingInterval = findPreference(getString(R.string.min_recording_interval_key));
minRecordingInterval.setEntries(PreferenceHelper.getMinRecordingIntervalEntries(getActivity()));
@@ -90,6 +90,15 @@ public class PreferencesUtils {
return key == null || key.equals(getKey(context, keyId));
}
public static boolean isKey(Context context, int[] keyIds, String key) {
for(int keyId : keyIds) {
if (isKey(context, keyId, key)) {
return true;
}
}
return false;
}
private static boolean getBoolean(SharedPreferences sharedPreferences, Context context, int keyId, boolean defaultValue) {
return sharedPreferences.getBoolean(getKey(context, keyId), defaultValue);
}
@@ -216,13 +225,23 @@ public class PreferencesUtils {
return getBoolean(sharedPreferences, context, R.string.stats_fullscreen_while_recording_key, DEFAULT);
}
public static int getVoiceFrequency(SharedPreferences sharedPreferences, Context context) {
final int VOICE_FREQUENCY_DEFAULT = Integer.parseInt(context.getResources().getString(R.string.voice_frequency_default));
return getInt(sharedPreferences, context, R.string.voice_frequency_key, VOICE_FREQUENCY_DEFAULT);
public static Duration getVoiceAnnouncementFrequency(SharedPreferences sharedPreferences, Context context) {
final int DEFAULT = Integer.parseInt(context.getResources().getString(R.string.voice_announcement_frequency_default));
int value = getInt(sharedPreferences, context, R.string.voice_announcement_frequency_key, DEFAULT);
return Duration.ofSeconds(value);
}
/**
* @return Result depends on isMetricUnits
*/
public static Distance getVoiceAnnouncementDistance(SharedPreferences sharedPreferences, Context context) {
final float DEFAULT = Integer.parseInt(context.getResources().getString(R.string.voice_announcement_distance_default));
float value = getFloat(sharedPreferences, context, R.string.voice_announcement_distance_key, DEFAULT);
return Distance.one(isMetricUnits(sharedPreferences, context)).multipliedBy(value);
}
public static float getVoiceSpeedRate(SharedPreferences sharedPreferences, Context context) {
final float DEFAULT = Float.parseFloat(context.getResources().getString(R.string.voice_frequency_default));
final float DEFAULT = Float.parseFloat(context.getResources().getString(R.string.voice_speed_rate_default));
return getFloat(sharedPreferences, context, R.string.voice_speed_rate_key, DEFAULT);
}
@@ -292,28 +292,34 @@ public class StringUtils {
}
}
/**
* Gets the frequency display options.
*
* @param context the context
* @param metricUnits true to display in metric units
*/
public static String[] getFrequencyOptions(Context context, boolean metricUnits) {
String[] values = context.getResources().getStringArray(R.array.frequency_values);
public static String[] getAnnouncementFrequency(Context context) {
String[] values = context.getResources().getStringArray(R.array.voice_announcement_frequency_values);
String[] options = new String[values.length];
for (int i = 0; i < values.length; i++) {
int value = Integer.parseInt(values[i]);
if (context.getString(R.string.frequency_off).equals(values[i])) {
if (context.getString(R.string.announcement_off).equals(values[i])) {
options[i] = context.getString(R.string.value_off);
} else if (value < 0) {
options[i] = context.getString(metricUnits ? R.string.value_integer_kilometer : R.string.value_integer_mile, Math.abs(value));
} else {
int value = Integer.parseInt(values[i]);
options[i] = context.getString(R.string.value_integer_minute, value);
}
}
return options;
}
public static String[] getAnnouncementDistance(Context context, boolean metricUnits) {
String[] values = context.getResources().getStringArray(R.array.voice_announcement_distance_values);
String[] options = new String[values.length];
for (int i = 0; i < values.length; i++) {
if (context.getString(R.string.announcement_off).equals(values[i])) {
options[i] = context.getString(R.string.value_off);
} else {
int value = Integer.parseInt(values[i]);
options[i] = context.getString(metricUnits ? R.string.value_integer_kilometer : R.string.value_integer_mile, value);
}
}
return options;
}
/**
* @return the formatted altitude_m (or null) and it's unit as {@link Pair}
*/
-1
View File
@@ -177,7 +177,6 @@ limitations under the License.
<string name="menu_show_on_map">إظهار على الخريطة</string>
<string name="menu_start_gps">بدء GPS</string>
<string name="menu_stop_gps">إيقاف GPS</string>
<string name="menu_voice_frequency">معدل الصوت</string>
<!-- OpenTracks -->
<string name="recording_service">خدمة التسجيل</string>
<!-- Search -->
-1
View File
@@ -144,7 +144,6 @@
<string name="menu_show_on_map">Show on map</string>
<string name="menu_start_gps">Start GPS</string>
<string name="menu_stop_gps">Stop GPS</string>
<string name="menu_voice_frequency">Voice frequency</string>
<string name="recording_service">Recording service</string>
<string name="sensor_state_battery">Battery level</string>
<string name="sensor_state_cadence">Cadence</string>
-1
View File
@@ -145,7 +145,6 @@
<string name="menu_show_on_map">Mostrar en el mapa</string>
<string name="menu_start_gps">Iniciar GPS</string>
<string name="menu_stop_gps">Detener GPS</string>
<string name="menu_voice_frequency">Frecuencia de voz</string>
<string name="menu_resume_track">Reanudar ruta</string>
<string name="recording_service">Servicio de grabación</string>
<string name="sensor_state_battery">Nivel de la batería</string>
-1
View File
@@ -173,7 +173,6 @@ limitations under the License.
<string name="menu_show_on_map">Показване на картата</string>
<string name="menu_start_gps">Стартиране на GPS</string>
<string name="menu_stop_gps">Спиране на GPS</string>
<string name="menu_voice_frequency">Честота на гласа</string>
<!-- OpenTracks -->
<string name="recording_service">Услуга за запис</string>
<!-- Search -->
-1
View File
@@ -173,7 +173,6 @@ limitations under the License.
<string name="menu_show_on_map">Mostra-ho al mapa</string>
<string name="menu_start_gps">Activa el GPS</string>
<string name="menu_stop_gps">Desactiva el GPS</string>
<string name="menu_voice_frequency">Freqüència de veu</string>
<!-- OpenTracks -->
<string name="recording_service">Servei d\'enregistrament</string>
<!-- Search -->
-1
View File
@@ -227,7 +227,6 @@ Pokud zařízení GPS hlásí nepřesná data (např. Polohu, rychlost, nadmořs
<string name="menu_show_on_map">Zobrazit na mapě</string>
<string name="menu_start_gps">Spustit GPS</string>
<string name="menu_stop_gps">Ukončit GPS</string>
<string name="menu_voice_frequency">Frekvence hlasových oznámení</string>
<string name="menu_resume_track">Obnovit měření</string>
<!-- OpenTracks -->
<string name="recording_service">Služba pro záznam</string>
-1
View File
@@ -229,7 +229,6 @@ Hvis GPS-enheden rapporterer unøjagtige data (f.eks. Placering, hastighed, høj
<string name="menu_show_on_map">Vis på kort</string>
<string name="menu_start_gps">Start GPS</string>
<string name="menu_stop_gps">Stop GPS</string>
<string name="menu_voice_frequency">Stemmefrekvens</string>
<string name="menu_resume_track">Genoptag sporet</string>
<!-- OpenTracks -->
<string name="recording_service">Registreringstjeneste</string>
-1
View File
@@ -230,7 +230,6 @@ Meldet das GPS-Gerät ungenaue Daten (z.B. Standort, Geschwindigkeit, Höhe), ka
<string name="menu_show_on_map">Auf Karte anzeigen</string>
<string name="menu_start_gps">GPS aktivieren</string>
<string name="menu_stop_gps">GPS deaktivieren</string>
<string name="menu_voice_frequency">Ansagehäufigkeit</string>
<string name="menu_resume_track">Track fortsetzen</string>
<!-- OpenTracks -->
<string name="recording_service">Dienst für Aufzeichnung</string>
-1
View File
@@ -173,7 +173,6 @@ limitations under the License.
<string name="menu_show_on_map">Εμφάνιση στον χάρτη</string>
<string name="menu_start_gps">Έναρξη GPS</string>
<string name="menu_stop_gps">Διακοπή GPS</string>
<string name="menu_voice_frequency">Συχνότητα ανακοινώσεων</string>
<!-- OpenTracks -->
<string name="recording_service">Υπηρεσία καταγραφής</string>
<!-- Search -->
-1
View File
@@ -226,7 +226,6 @@ Si el dispositivo GPS reporta datos inexactos (por ejemplo, ubicación, velocida
<string name="menu_show_on_map">Mostrar en el mapa</string>
<string name="menu_start_gps">Iniciar GPS</string>
<string name="menu_stop_gps">Detener GPS</string>
<string name="menu_voice_frequency">Frecuencia de voz</string>
<string name="menu_resume_track">Reanudar ruta</string>
<!-- OpenTracks -->
<string name="recording_service">Servicio de grabación</string>
-1
View File
@@ -226,7 +226,6 @@ Kui GPS-seade teatab ebatäpsetest andmetest (nt asukoht, kiirus, kõrgus), ei s
<string name="menu_show_on_map">Kuva kaardil</string>
<string name="menu_start_gps">Käivita GPS</string>
<string name="menu_stop_gps">Peata GPS</string>
<string name="menu_voice_frequency">Häälteadete sagedus</string>
<string name="menu_resume_track">Jätka pala</string>
<!-- OpenTracks -->
<string name="recording_service">Salvestamisteenus</string>
-1
View File
@@ -227,7 +227,6 @@ GPS gailuak datu okerrak salatzen baditu (adibidez, kokapena, abiadura, kota), O
<string name="menu_show_on_map">Erakutsi mapan</string>
<string name="menu_start_gps">Hasi GPSa</string>
<string name="menu_stop_gps">Gelditu GPSa</string>
<string name="menu_voice_frequency">Ahotsaren frekuentzia</string>
<string name="menu_resume_track">Jarraitu pista</string>
<!-- OpenTracks -->
<string name="recording_service">Grabaketa-zerbitzua</string>
-1
View File
@@ -173,7 +173,6 @@ limitations under the License.
<string name="menu_show_on_map">نمایش روی نقشه</string>
<string name="menu_start_gps">شروع GPS</string>
<string name="menu_stop_gps">توقف GPS</string>
<string name="menu_voice_frequency">بسامد اعلان صوتی</string>
<!-- OpenTracks -->
<string name="recording_service">خدمات ضبط</string>
<!-- Search -->
-1
View File
@@ -230,7 +230,6 @@ limitations under the License.
<string name="menu_show_on_map">Näytä kartalta</string>
<string name="menu_start_gps">Käynnistä GPS</string>
<string name="menu_stop_gps">Pysäytä GPS</string>
<string name="menu_voice_frequency">Ilmoitustiheys</string>
<string name="menu_resume_track">Jatka reittiä</string>
<!-- OpenTracks -->
<string name="recording_service">Tallennuspalvelu</string>
-1
View File
@@ -144,7 +144,6 @@
<string name="menu_show_on_map">Afficher sur une carte</string>
<string name="menu_start_gps">Démarrer le GPS</string>
<string name="menu_stop_gps">Arrêter le GPS</string>
<string name="menu_voice_frequency">Fréquence vocale</string>
<string name="recording_service">Service d\'enregistrement</string>
<string name="sensor_state_battery">Niveau de charge de la pile</string>
<string name="sensor_state_cadence">Cadence</string>
-1
View File
@@ -144,7 +144,6 @@
<string name="menu_show_on_map">Afficher sur la carte</string>
<string name="menu_start_gps">Démarrer le GPS</string>
<string name="menu_stop_gps">Arrêter le GPS</string>
<string name="menu_voice_frequency">Fréquence vocale</string>
<string name="recording_service">Service enregistrement</string>
<string name="sensor_state_battery">Niveau de la batterie</string>
<string name="sensor_state_cadence">Cadence</string>
-1
View File
@@ -226,7 +226,6 @@ Si le dispositif GPS signale des données inexactes (par exemple, la localisatio
<string name="menu_show_on_map">Afficher sur la carte</string>
<string name="menu_start_gps">Démarrer le GPS</string>
<string name="menu_stop_gps">Arrêter le GPS</string>
<string name="menu_voice_frequency">Fréquence vocale</string>
<string name="menu_resume_track">Reprendre la trace</string>
<!-- OpenTracks -->
<string name="recording_service">Service enregistrement</string>
-1
View File
@@ -237,7 +237,6 @@ Se te detés ou estás en interiores, non se gardarán datos do sensor (mais ser
<string name="menu_show_on_map">Amosar no mapa</string>
<string name="menu_start_gps">Iniciar GPS</string>
<string name="menu_stop_gps">Desactivar GPS</string>
<string name="menu_voice_frequency">Frecuencia da voz</string>
<string name="menu_resume_track">Retomar gravación</string>
<!-- OpenTracks -->
<string name="recording_service">Servizo de gravación</string>
-1
View File
@@ -173,7 +173,6 @@ limitations under the License.
<string name="menu_show_on_map">नक्शे पर दिखाएं</string>
<string name="menu_start_gps">GPS प्रारंभ करें</string>
<string name="menu_stop_gps">GPS बंद करें</string>
<string name="menu_voice_frequency">ध्वनि आवृत्ति</string>
<!-- OpenTracks -->
<string name="recording_service">रिकॉर्डिंग सेवा</string>
<!-- Search -->
-1
View File
@@ -174,7 +174,6 @@ limitations under the License.
<string name="menu_show_on_map">Prikaži na karti</string>
<string name="menu_start_gps">Pokreni GPS</string>
<string name="menu_stop_gps">Zaustavi GPS</string>
<string name="menu_voice_frequency">Učest. glas. objava</string>
<!-- OpenTracks -->
<string name="recording_service">Usluga snimanja</string>
<!-- Search -->
-1
View File
@@ -173,7 +173,6 @@ limitations under the License.
<string name="menu_show_on_map">Megjelenítés a térképen</string>
<string name="menu_start_gps">GPS indítása</string>
<string name="menu_stop_gps">GPS leállítása</string>
<string name="menu_voice_frequency">Utasítások gyakorisága</string>
<!-- OpenTracks -->
<string name="recording_service">Rögzítőszolgáltatás</string>
<!-- Search -->
-1
View File
@@ -143,7 +143,6 @@
<string name="menu_show_on_map">Tampilkan di peta</string>
<string name="menu_start_gps">Nyalakan GPS</string>
<string name="menu_stop_gps">Matikan GPS</string>
<string name="menu_voice_frequency">Kerapatan suara</string>
<string name="recording_service">Layanan perekaman</string>
<string name="sensor_state_battery">Level baterai</string>
<string name="sensor_state_cadence">Tempo</string>
-1
View File
@@ -215,7 +215,6 @@ Infatti, un\'applicazione deve supportare <i>ACTION_VIEW</i> con MIME <i>applica
<string name="menu_show_on_map">Visualizza su mappa</string>
<string name="menu_start_gps">Accendi GPS</string>
<string name="menu_stop_gps">Spegni GPS</string>
<string name="menu_voice_frequency">Frequenza voce</string>
<!-- OpenTracks -->
<string name="recording_service">Servizio di registrazione</string>
<!-- Search -->
-1
View File
@@ -146,7 +146,6 @@
<string name="menu_show_on_map">הצג במפה</string>
<string name="menu_start_gps">הפעל GPS</string>
<string name="menu_stop_gps">עצור GPS</string>
<string name="menu_voice_frequency">תדירות הודעות קוליות</string>
<string name="recording_service">שירות הקלטה</string>
<string name="sensor_state_battery">טעינת סוללה</string>
<string name="sensor_state_cadence">קצב</string>
-1
View File
@@ -172,7 +172,6 @@ limitations under the License.
<string name="menu_show_on_map">地図で見る</string>
<string name="menu_start_gps">GPSを開始</string>
<string name="menu_stop_gps">GPSを停止</string>
<string name="menu_voice_frequency">音声アナウンスの頻度</string>
<!-- OpenTracks -->
<string name="recording_service">記録サービス</string>
<!-- Search -->
-1
View File
@@ -172,7 +172,6 @@ limitations under the License.
<string name="menu_show_on_map">지도에 표시</string>
<string name="menu_start_gps">GPS 시작</string>
<string name="menu_stop_gps">GPS 중지</string>
<string name="menu_voice_frequency">음성 안내 빈도</string>
<!-- OpenTracks -->
<string name="recording_service">기록 서비스</string>
<!-- Search -->
-1
View File
@@ -174,7 +174,6 @@ limitations under the License.
<string name="menu_show_on_map">Rodyti žemėlapyje</string>
<string name="menu_start_gps">Įjungti GPS</string>
<string name="menu_stop_gps">Išjungti GPS</string>
<string name="menu_voice_frequency">Balso dažnumas</string>
<!-- OpenTracks -->
<string name="recording_service">Įrašymo paslauga</string>
<!-- Search -->
-1
View File
@@ -174,7 +174,6 @@ limitations under the License.
<string name="menu_show_on_map">Rādīt kartē</string>
<string name="menu_start_gps">Palaist GPS</string>
<string name="menu_stop_gps">Apturēt GPS</string>
<string name="menu_voice_frequency">Balss ziņas</string>
<!-- OpenTracks -->
<string name="recording_service">Ierakstīšanas pakalpojums</string>
<!-- Search -->
-1
View File
@@ -145,7 +145,6 @@
<string name="menu_show_on_map">Afișați pe hartă</string>
<string name="menu_start_gps">Porniți GPS</string>
<string name="menu_stop_gps">Opriți GPS</string>
<string name="menu_voice_frequency">Frecvența vocii</string>
<string name="recording_service">Serviciu de înregistrare</string>
<string name="sensor_state_battery">Nivelul bateriei</string>
<string name="sensor_state_cadence">Cadenţă</string>
-1
View File
@@ -172,7 +172,6 @@ limitations under the License.
<string name="menu_show_on_map">Tunjukkan pada peta</string>
<string name="menu_start_gps">Mulakan GPS</string>
<string name="menu_stop_gps">Hentikan GPS</string>
<string name="menu_voice_frequency">Kekerapan suara</string>
<!-- OpenTracks -->
<string name="recording_service">Khidmat rakaman</string>
<!-- Search -->
-1
View File
@@ -173,7 +173,6 @@ limitations under the License.
<string name="menu_show_on_map">Vis på kart</string>
<string name="menu_start_gps">Start GPS</string>
<string name="menu_stop_gps">Stopp GPS</string>
<string name="menu_voice_frequency">Talefrekvens</string>
<!-- OpenTracks -->
<string name="recording_service">Opptakstjeneste</string>
<!-- Search -->
-1
View File
@@ -226,7 +226,6 @@ Als het GPS-apparaat onnauwkeurige gegevens rapporteert (bijv. locatie, snelheid
<string name="menu_show_on_map">Weergeven op kaart</string>
<string name="menu_start_gps">GPS starten</string>
<string name="menu_stop_gps">GPS stoppen</string>
<string name="menu_voice_frequency">Frequentie voor gesproken berichten</string>
<string name="menu_resume_track">Hervat spoor</string>
<!-- OpenTracks -->
<string name="recording_service">Opnameservice</string>
-1
View File
@@ -186,7 +186,6 @@ limitations under the License.
<string name="menu_show_on_map">Pokaż na mapie</string>
<string name="menu_start_gps">Uruchom GPS</string>
<string name="menu_stop_gps">Zatrzymaj GPS</string>
<string name="menu_voice_frequency">Częstość powiadomień</string>
<string name="menu_resume_track">Kontynuuj trasę</string>
<!-- OpenTracks -->
<string name="recording_service">Usługa rejestrowania</string>
-1
View File
@@ -144,7 +144,6 @@
<string name="menu_show_on_map">Mostrar no mapa</string>
<string name="menu_start_gps">Iniciar GPS</string>
<string name="menu_stop_gps">Parar GPS</string>
<string name="menu_voice_frequency">Frequência da voz</string>
<string name="recording_service">Serviço de gravação</string>
<string name="sensor_state_battery">Nível da bateria</string>
<string name="sensor_state_cadence">Cadência</string>
-1
View File
@@ -144,7 +144,6 @@
<string name="menu_show_on_map">Mostrar no mapa</string>
<string name="menu_start_gps">Ligar GPS</string>
<string name="menu_stop_gps">Desligar GPS</string>
<string name="menu_voice_frequency">Frequência de voz</string>
<string name="recording_service">Serviço de gravação</string>
<string name="sensor_state_battery">Nível da bateria</string>
<string name="sensor_state_cadence">Cadência</string>
-1
View File
@@ -173,7 +173,6 @@ limitations under the License.
<string name="menu_show_on_map">Mostrar no mapa</string>
<string name="menu_start_gps">Iniciar GPS</string>
<string name="menu_stop_gps">Parar GPS</string>
<string name="menu_voice_frequency">Frequência da voz</string>
<!-- OpenTracks -->
<string name="recording_service">Serviço de gravação</string>
<!-- Search -->
-1
View File
@@ -174,7 +174,6 @@ limitations under the License.
<string name="menu_show_on_map">Afișați pe hartă</string>
<string name="menu_start_gps">Porniți GPS</string>
<string name="menu_stop_gps">Opriți GPS</string>
<string name="menu_voice_frequency">Frecvența vocii</string>
<!-- OpenTracks -->
<string name="recording_service">Serviciu de înregistrare</string>
<!-- Search -->
-1
View File
@@ -175,7 +175,6 @@ limitations under the License.
<string name="menu_show_on_map">Показать на карте</string>
<string name="menu_start_gps">Включить GPS</string>
<string name="menu_stop_gps">Отключить GPS</string>
<string name="menu_voice_frequency">Голосовые оповещения</string>
<!-- OpenTracks -->
<string name="recording_service">Служба записи треков</string>
<!-- Search -->
-1
View File
@@ -174,7 +174,6 @@ limitations under the License.
<string name="menu_show_on_map">Zobraziť na mape</string>
<string name="menu_start_gps">Aktivovať GPS</string>
<string name="menu_stop_gps">Deaktivovať GPS</string>
<string name="menu_voice_frequency">Hlasová frekvencia</string>
<!-- OpenTracks -->
<string name="recording_service">Služba na záznam</string>
<!-- Search -->
-1
View File
@@ -175,7 +175,6 @@ limitations under the License.
<string name="menu_show_on_map">Pokaži na zemljevidu</string>
<string name="menu_start_gps">Zaženi GPS</string>
<string name="menu_stop_gps">Ustavi GPS</string>
<string name="menu_voice_frequency">Pogostost glas. obv.</string>
<!-- OpenTracks -->
<string name="recording_service">Storitev snemanja</string>
<!-- Search -->
-1
View File
@@ -174,7 +174,6 @@ limitations under the License.
<string name="menu_show_on_map">Прикажи на мапи</string>
<string name="menu_start_gps">Покрени GPS</string>
<string name="menu_stop_gps">Заустави GPS</string>
<string name="menu_voice_frequency">Учесталост гласа</string>
<!-- OpenTracks -->
<string name="recording_service">Услуга бележења</string>
<!-- Search -->
-1
View File
@@ -173,7 +173,6 @@ limitations under the License.
<string name="menu_show_on_map">Visa på karta</string>
<string name="menu_start_gps">Starta GPS</string>
<string name="menu_stop_gps">Stoppa GPS</string>
<string name="menu_voice_frequency">Röstfrekvens</string>
<!-- OpenTracks -->
<string name="recording_service">Inspelningstjänst</string>
<!-- Search -->
-1
View File
@@ -172,7 +172,6 @@ limitations under the License.
<string name="menu_show_on_map">แสดงบนแผนที่</string>
<string name="menu_start_gps">เริ่ม GPS</string>
<string name="menu_stop_gps">หยุด GPS</string>
<string name="menu_voice_frequency">ความถี่เสียง</string>
<!-- OpenTracks -->
<string name="recording_service">บริการการบันทึก</string>
<!-- Search -->
-1
View File
@@ -173,7 +173,6 @@ limitations under the License.
<string name="menu_show_on_map">Ipakita sa mapa</string>
<string name="menu_start_gps">Simulan ang GPS</string>
<string name="menu_stop_gps">Itigil ang GPS</string>
<string name="menu_voice_frequency">Dalas ng voice</string>
<!-- OpenTracks -->
<string name="recording_service">Serbisyo ng pagrerekord</string>
<!-- Search -->
-1
View File
@@ -173,7 +173,6 @@ limitations under the License.
<string name="menu_show_on_map">Haritada göster</string>
<string name="menu_start_gps">GPS\'i aç</string>
<string name="menu_stop_gps">GPS\'i kapat</string>
<string name="menu_voice_frequency">Ses sıklığı</string>
<!-- OpenTracks -->
<string name="recording_service">Kayıt hizmeti</string>
<!-- Search -->
-1
View File
@@ -175,7 +175,6 @@ limitations under the License.
<string name="menu_show_on_map">Показати на карті</string>
<string name="menu_start_gps">Увімкнути GPS</string>
<string name="menu_stop_gps">Вимкнути GPS</string>
<string name="menu_voice_frequency">Голосові сповіщення</string>
<!-- OpenTracks -->
<string name="recording_service">Служба запису</string>
<!-- Search -->
-1
View File
@@ -172,7 +172,6 @@ limitations under the License.
<string name="menu_show_on_map">Hiển thị trên bản đồ</string>
<string name="menu_start_gps">Bắt đầu GPS</string>
<string name="menu_stop_gps">Dừng GPS</string>
<string name="menu_voice_frequency">Tần suất giọng nói</string>
<!-- OpenTracks -->
<string name="recording_service">Dịch vụ ghi</string>
<!-- Search -->
-1
View File
@@ -143,7 +143,6 @@
<string name="menu_show_on_map">在地圖上顯示</string>
<string name="menu_start_gps">啟動 GPS</string>
<string name="menu_stop_gps">關閉 GPS</string>
<string name="menu_voice_frequency">語音播報頻率</string>
<string name="recording_service">記錄服務</string>
<string name="sensor_state_battery">電池電量</string>
<string name="sensor_state_cadence">轉速</string>
-1
View File
@@ -143,7 +143,6 @@
<string name="menu_show_on_map">在地圖上顯示</string>
<string name="menu_start_gps">啟動 GPS</string>
<string name="menu_stop_gps">關閉 GPS</string>
<string name="menu_voice_frequency">語音播報頻率</string>
<string name="recording_service">記錄服務</string>
<string name="sensor_state_battery">電池電量</string>
<string name="sensor_state_cadence">轉速</string>
-1
View File
@@ -172,7 +172,6 @@ limitations under the License.
<string name="menu_show_on_map">在地图上显示</string>
<string name="menu_start_gps">启动 GPS</string>
<string name="menu_stop_gps">关闭 GPS</string>
<string name="menu_voice_frequency">语音提示频率</string>
<string name="menu_voice_rate">语音提示速率</string>
<string name="menu_resume_track">继续</string>
<!-- OpenTracks -->
+20 -15
View File
@@ -211,24 +211,29 @@
<item>@string/settings_recording_track_name_number_option</item>
</string-array>
<string name="voice_frequency_key" translatable="false">voiceFrequency</string>
<string name="voice_frequency_default" translatable="false">@string/frequency_off</string>
<string name="frequency_off" translatable="false">0</string>
<string-array name="frequency_values">
<item>@string/frequency_off</item>
<string name="announcement_off" translatable="false">0</string>
<string name="voice_announcement_frequency_key" translatable="false">voiceFrequencyV2</string>
<string name="voice_announcement_frequency_default" translatable="false">@string/announcement_off</string>
<string-array name="voice_announcement_frequency_values"> <!-- seconds -->
<item>@string/voice_announcement_frequency_default</item>
<item>60</item>
<item>120</item>
<item>300</item>
<item>600</item>
<item>900</item>
<item>1800</item>
<item>3600</item>
</string-array>
<string name="voice_announcement_distance_key" translatable="false">voiceDistance</string>
<string name="voice_announcement_distance_default" translatable="false">@string/announcement_off</string>
<string-array name="voice_announcement_distance_values">
<item>@string/voice_announcement_distance_default</item> <!-- km/miles -->
<item>1</item>
<item>2</item>
<item>5</item>
<item>10</item>
<item>15</item>
<item>30</item>
<item>60</item>
<item>-1</item>
<item>-5</item>
<item>-10</item>
<item>-25</item>
<item>-50</item>
<item>-100</item>
<item>25</item>
<item>50</item>
<item>100</item>
</string-array>
<string name="voice_speed_rate_key" translatable="false">voiceSpeedRate</string>
<string name="voice_speed_rate_default" translatable="false">0.9</string>
@@ -17,7 +17,6 @@
</string-array>
<string name="split_frequency_key" translatable="false" tools:keep="@string/split_frequency_key">splitFrequency</string>
<string name="split_frequency_default" translatable="false" tools:keep="@string/split_frequency_default">@string/frequency_off</string>
<string name="chart_show_cadence_key" translatable="false" tools:keep="@string/chart_show_cadence_key">chartShowCadence</string>
<bool name="chart_show_cadence_default" translatable="false" tools:keep="@bool/chart_show_cadence_default">
+4 -2
View File
@@ -302,7 +302,6 @@ limitations under the License.
<string name="menu_show_on_map">Show on map</string>
<string name="menu_start_gps">Start GPS</string>
<string name="menu_stop_gps">Stop GPS</string>
<string name="menu_voice_frequency">Voice frequency</string>
<string name="menu_voice_rate">Voice speed</string>
<string name="menu_resume_track">Resume track</string>
<!-- OpenTracks -->
@@ -361,7 +360,10 @@ limitations under the License.
<string name="settings_night_mode_option_day">Day</string>
<string name="settings_night_mode_option_night">Night</string>
<!-- Reset -->
<string name="settings_announcements">Announcements</string>
<string name="settings_announcements_totaltime_frequency">Time interval</string>
<string name="settings_announcements_distance_frequency">Distance interval</string>
<string name="settings_reset">Reset</string>
<!-- Custom Layout Reset -->
<string name="settings_layout_reset">Reset Custom Layout</string>
+23 -13
View File
@@ -74,19 +74,6 @@ limitations under the License.
android:key="@string/stats_fullscreen_while_recording_key"
android:summary="@string/settings_recording_fullscreen_on_while_recording_summary"
android:title="@string/settings_recording_fullscreen_on_while_recording_title" />
<ListPreference
android:defaultValue="@string/voice_frequency_default"
android:entryValues="@array/frequency_values"
android:key="@string/voice_frequency_key"
android:title="@string/menu_voice_frequency"
app:useSimpleSummaryProvider="true" />
<ListPreference
android:defaultValue="@string/voice_speed_rate_default"
android:entryValues="@array/voice_speed_rate_values"
android:entries="@array/voice_speed_rate_values"
android:key="@string/voice_speed_rate_key"
android:title="@string/menu_voice_rate"
app:useSimpleSummaryProvider="true" />
<de.dennisguse.opentracks.settings.ActivityTypePreference
android:defaultValue="@string/default_activity_default"
android:key="@string/default_activity_key"
@@ -149,6 +136,29 @@ limitations under the License.
app:useSimpleSummaryProvider="true" />
</PreferenceCategory>
<PreferenceCategory
android:title="@string/settings_announcements">
<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" />
<ListPreference
android:defaultValue="@string/voice_speed_rate_default"
android:entryValues="@array/voice_speed_rate_values"
android:entries="@array/voice_speed_rate_values"
android:key="@string/voice_speed_rate_key"
android:title="@string/menu_voice_rate"
app:useSimpleSummaryProvider="true" />
</PreferenceCategory>
<PreferenceCategory android:title="@string/generic_tracks">
<Preference
android:key="@string/settings_import"