forked from upstream-mirrors/OpenTracks
@@ -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);
|
||||
|
||||
+5
-43
@@ -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");
|
||||
+63
-9
@@ -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();
|
||||
|
||||
+6
-1
@@ -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);
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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 -->
|
||||
|
||||
@@ -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}
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user