forked from upstream-mirrors/OpenTracks
+16
-16
@@ -63,7 +63,7 @@ public class VoiceAnnouncementUtilsTest {
|
||||
stats.setTotalAltitudeGain(6000f);
|
||||
|
||||
// when
|
||||
String announcement = VoiceAnnouncementUtils.getAnnouncement(context, stats, UnitSystem.METRIC, true, null, null).toString();
|
||||
String announcement = VoiceAnnouncementUtils.createStatistics(context, stats, UnitSystem.METRIC, true, null, null).toString();
|
||||
|
||||
// then
|
||||
assertEquals("Total distance 20.0 kilometers. 1 hour 5 minutes 10 seconds. Average moving speed 18.4 kilometers per hour.", announcement);
|
||||
@@ -79,7 +79,7 @@ public class VoiceAnnouncementUtilsTest {
|
||||
stats.setTotalAltitudeGain(6000f);
|
||||
|
||||
// when
|
||||
String announcement = VoiceAnnouncementUtils.getAnnouncement(context, stats, UnitSystem.METRIC, true, null, null).toString();
|
||||
String announcement = VoiceAnnouncementUtils.createStatistics(context, stats, UnitSystem.METRIC, true, null, null).toString();
|
||||
|
||||
// then
|
||||
assertEquals("Total distance 20.0 kilometers. 1 hour 1 second. Average moving speed 20.0 kilometers per hour.", announcement);
|
||||
@@ -95,7 +95,7 @@ public class VoiceAnnouncementUtilsTest {
|
||||
stats.setTotalAltitudeGain(6000f);
|
||||
|
||||
// when
|
||||
String announcement = VoiceAnnouncementUtils.getAnnouncement(context, stats, UnitSystem.METRIC, true, null, null).toString();
|
||||
String announcement = VoiceAnnouncementUtils.createStatistics(context, stats, UnitSystem.METRIC, true, null, null).toString();
|
||||
|
||||
// then
|
||||
assertEquals("Total distance 20.0 kilometers. 1 hour. Average moving speed 20.0 kilometers per hour.", announcement);
|
||||
@@ -111,7 +111,7 @@ public class VoiceAnnouncementUtilsTest {
|
||||
stats.setTotalAltitudeGain(6000f);
|
||||
|
||||
// when
|
||||
String announcement = VoiceAnnouncementUtils.getAnnouncement(context, stats, UnitSystem.METRIC, true, null, null).toString();
|
||||
String announcement = VoiceAnnouncementUtils.createStatistics(context, stats, UnitSystem.METRIC, true, null, null).toString();
|
||||
|
||||
// then
|
||||
assertEquals("Total distance 19.9 kilometers. 1 hour. Average moving speed 19.9 kilometers per hour.", announcement);
|
||||
@@ -133,7 +133,7 @@ public class VoiceAnnouncementUtilsTest {
|
||||
}
|
||||
|
||||
// when
|
||||
String announcement = VoiceAnnouncementUtils.getAnnouncement(context, stats, UnitSystem.METRIC, true, lastInterval, null).toString();
|
||||
String announcement = VoiceAnnouncementUtils.createStatistics(context, stats, UnitSystem.METRIC, true, lastInterval, null).toString();
|
||||
|
||||
// then
|
||||
assertEquals("Total distance 14.2 kilometers. 16 minutes 39 seconds. Average moving speed 51.2 kilometers per hour. Lap speed 51.2 kilometers per hour.", announcement);
|
||||
@@ -149,7 +149,7 @@ public class VoiceAnnouncementUtilsTest {
|
||||
stats.setTotalAltitudeGain(6000f);
|
||||
|
||||
// when
|
||||
String announcement = VoiceAnnouncementUtils.getAnnouncement(context, stats, UnitSystem.METRIC, false, null, null).toString();
|
||||
String announcement = VoiceAnnouncementUtils.createStatistics(context, stats, UnitSystem.METRIC, false, null, null).toString();
|
||||
|
||||
// then
|
||||
assertEquals("Total distance 20.0 kilometers. 1 hour 5 minutes 10 seconds. Pace 3 minutes 15 seconds per kilometer.", announcement);
|
||||
@@ -171,7 +171,7 @@ public class VoiceAnnouncementUtilsTest {
|
||||
}
|
||||
|
||||
// when
|
||||
String announcement = VoiceAnnouncementUtils.getAnnouncement(context, stats, UnitSystem.METRIC, false, lastInterval, null).toString();
|
||||
String announcement = VoiceAnnouncementUtils.createStatistics(context, stats, UnitSystem.METRIC, false, lastInterval, null).toString();
|
||||
|
||||
// then
|
||||
assertEquals("Total distance 14.2 kilometers. 16 minutes 39 seconds. Pace 1 minute 10 seconds per kilometer. Lap time 1 minute 10 seconds per kilometer.", announcement);
|
||||
@@ -187,7 +187,7 @@ public class VoiceAnnouncementUtilsTest {
|
||||
stats.setTotalAltitudeGain(6000f);
|
||||
|
||||
// when
|
||||
String announcement = VoiceAnnouncementUtils.getAnnouncement(context, stats, UnitSystem.IMPERIAL_FEET, true, null, null).toString();
|
||||
String announcement = VoiceAnnouncementUtils.createStatistics(context, stats, UnitSystem.IMPERIAL_FEET, true, null, null).toString();
|
||||
|
||||
// then
|
||||
assertEquals("Total distance 12.4 miles. 1 hour 5 minutes 10 seconds. Average moving speed 11.4 miles per hour.", announcement);
|
||||
@@ -201,7 +201,7 @@ public class VoiceAnnouncementUtilsTest {
|
||||
stats.setMovingTime(Duration.ofHours(1));
|
||||
|
||||
// when
|
||||
String announcement = VoiceAnnouncementUtils.getAnnouncement(context, stats, UnitSystem.IMPERIAL_FEET, true, null, null).toString();
|
||||
String announcement = VoiceAnnouncementUtils.createStatistics(context, stats, UnitSystem.IMPERIAL_FEET, true, null, null).toString();
|
||||
|
||||
// then
|
||||
assertEquals("Total distance 1.1 miles. 1 hour. Average moving speed 1.1 miles per hour.", announcement);
|
||||
@@ -215,7 +215,7 @@ public class VoiceAnnouncementUtilsTest {
|
||||
stats.setMovingTime(Duration.ofHours(1));
|
||||
|
||||
// when
|
||||
String announcement = VoiceAnnouncementUtils.getAnnouncement(context, stats, UnitSystem.IMPERIAL_METER, true, null, null).toString();
|
||||
String announcement = VoiceAnnouncementUtils.createStatistics(context, stats, UnitSystem.IMPERIAL_METER, true, null, null).toString();
|
||||
|
||||
// then
|
||||
assertEquals("Total distance 1.1 miles. 1 hour. Average moving speed 1.1 miles per hour.", announcement);
|
||||
@@ -229,7 +229,7 @@ public class VoiceAnnouncementUtilsTest {
|
||||
stats.setMovingTime(Duration.ofHours(1));
|
||||
|
||||
// when
|
||||
String announcement = VoiceAnnouncementUtils.getAnnouncement(context, stats, UnitSystem.METRIC, true, null, null).toString();
|
||||
String announcement = VoiceAnnouncementUtils.createStatistics(context, stats, UnitSystem.METRIC, true, null, null).toString();
|
||||
|
||||
// then
|
||||
assertEquals("Total distance 1.1 kilometers. 1 hour. Average moving speed 1.1 kilometers per hour.", announcement);
|
||||
@@ -251,7 +251,7 @@ public class VoiceAnnouncementUtilsTest {
|
||||
}
|
||||
|
||||
// when
|
||||
String announcement = VoiceAnnouncementUtils.getAnnouncement(context, stats, UnitSystem.IMPERIAL_FEET, true, lastInterval, null).toString();
|
||||
String announcement = VoiceAnnouncementUtils.createStatistics(context, stats, UnitSystem.IMPERIAL_FEET, true, lastInterval, null).toString();
|
||||
|
||||
// then
|
||||
assertEquals("Total distance 8.8 miles. 16 minutes 39 seconds. Average moving speed 31.8 miles per hour. Lap speed 31.8 miles per hour.", announcement);
|
||||
@@ -267,7 +267,7 @@ public class VoiceAnnouncementUtilsTest {
|
||||
stats.setTotalAltitudeGain(6000f);
|
||||
|
||||
// when
|
||||
String announcement = VoiceAnnouncementUtils.getAnnouncement(context, stats, UnitSystem.IMPERIAL_FEET, false, null, null).toString();
|
||||
String announcement = VoiceAnnouncementUtils.createStatistics(context, stats, UnitSystem.IMPERIAL_FEET, false, null, null).toString();
|
||||
|
||||
// then
|
||||
assertEquals("Total distance 12.4 miles. 1 hour 5 minutes 10 seconds. Pace 5 minutes 15 seconds per mile.", announcement);
|
||||
@@ -289,7 +289,7 @@ public class VoiceAnnouncementUtilsTest {
|
||||
}
|
||||
|
||||
// when
|
||||
String announcement = VoiceAnnouncementUtils.getAnnouncement(context, stats, UnitSystem.IMPERIAL_FEET, false, lastInterval, null).toString();
|
||||
String announcement = VoiceAnnouncementUtils.createStatistics(context, stats, UnitSystem.IMPERIAL_FEET, false, lastInterval, null).toString();
|
||||
|
||||
// then
|
||||
assertEquals("Total distance 8.8 miles. 16 minutes 39 seconds. Pace 1 minute 53 seconds per mile. Lap time 1 minute 53 seconds per mile.", announcement);
|
||||
@@ -315,7 +315,7 @@ public class VoiceAnnouncementUtilsTest {
|
||||
SensorStatistics sensorStatistics = new SensorStatistics(HeartRate.of(180f), HeartRate.of(180f), null, null, null, null);
|
||||
|
||||
// when
|
||||
String announcement = VoiceAnnouncementUtils.getAnnouncement(context, stats, UnitSystem.METRIC, true, lastInterval, sensorStatistics).toString();
|
||||
String announcement = VoiceAnnouncementUtils.createStatistics(context, stats, UnitSystem.METRIC, true, lastInterval, sensorStatistics).toString();
|
||||
|
||||
// then
|
||||
assertEquals("Total distance 14.2 kilometers. 16 minutes 39 seconds. Average moving speed 51.2 kilometers per hour. Lap speed 51.2 kilometers per hour. Average heart rate 180 bpm. Current heart rate 133 bpm.", announcement);
|
||||
@@ -345,7 +345,7 @@ public class VoiceAnnouncementUtilsTest {
|
||||
SensorStatistics sensorStatistics = new SensorStatistics(HeartRate.of(180f), HeartRate.of(180f), null, null, null, null);
|
||||
|
||||
// when
|
||||
String announcement = VoiceAnnouncementUtils.getAnnouncement(context, stats, UnitSystem.METRIC, true, lastInterval, sensorStatistics).toString();
|
||||
String announcement = VoiceAnnouncementUtils.createStatistics(context, stats, UnitSystem.METRIC, true, lastInterval, sensorStatistics).toString();
|
||||
|
||||
// then
|
||||
assertEquals(" Current heart rate 133 bpm.", announcement);
|
||||
|
||||
@@ -21,7 +21,7 @@ import android.view.View;
|
||||
|
||||
import androidx.appcompat.app.AppCompatActivity;
|
||||
|
||||
import de.dennisguse.opentracks.services.announcement.VoiceAnnouncement;
|
||||
import de.dennisguse.opentracks.services.announcement.TTSManager;
|
||||
|
||||
/**
|
||||
* @author Jimmy Shih
|
||||
@@ -33,7 +33,7 @@ public abstract class AbstractActivity extends AppCompatActivity {
|
||||
super.onCreate(savedInstanceState);
|
||||
|
||||
// Set volume control stream for text to speech
|
||||
setVolumeControlStream(VoiceAnnouncement.AUDIO_STREAM);
|
||||
setVolumeControlStream(TTSManager.AUDIO_STREAM);
|
||||
|
||||
setContentView(getRootView());
|
||||
}
|
||||
|
||||
@@ -40,6 +40,7 @@ public class TrackRecordingManager implements SharedPreferences.OnSharedPreferen
|
||||
|
||||
private final ContentProviderUtils contentProviderUtils;
|
||||
private final Context context;
|
||||
private final IdleObserver idleObserver;
|
||||
|
||||
private final Handler handler;
|
||||
|
||||
@@ -59,8 +60,9 @@ public class TrackRecordingManager implements SharedPreferences.OnSharedPreferen
|
||||
private TrackPoint lastStoredTrackPoint;
|
||||
private TrackPoint lastStoredTrackPointWithLocation;
|
||||
|
||||
TrackRecordingManager(Context context, TrackPointCreator trackPointCreator, Handler handler) {
|
||||
TrackRecordingManager(Context context, TrackPointCreator trackPointCreator, IdleObserver idleObserver, Handler handler) {
|
||||
this.context = context;
|
||||
this.idleObserver = idleObserver;
|
||||
this.trackPointCreator = trackPointCreator;
|
||||
this.handler = handler;
|
||||
contentProviderUtils = new ContentProviderUtils(context);
|
||||
@@ -165,6 +167,8 @@ public class TrackRecordingManager implements SharedPreferences.OnSharedPreferen
|
||||
public void onIdle() {
|
||||
Log.d(TAG, "Becoming idle");
|
||||
onNewTrackPoint(trackPointCreator.createIdle());
|
||||
|
||||
idleObserver.onIdle();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -270,6 +274,7 @@ public class TrackRecordingManager implements SharedPreferences.OnSharedPreferen
|
||||
lastStoredTrackPointWithLocation = lastStoredTrackPoint;
|
||||
}
|
||||
} catch (SQLiteException e) {
|
||||
// TODO Remove; if this is a problem; use a synchronized method.
|
||||
/*
|
||||
* Insert failed, most likely because of SqlLite error code 5 (SQLite_BUSY).
|
||||
* This is expected to happen extremely rarely (if our listener gets invoked twice at about the same time).
|
||||
@@ -299,4 +304,8 @@ public class TrackRecordingManager implements SharedPreferences.OnSharedPreferen
|
||||
idleDuration = PreferencesUtils.getIdleDurationTimeout();
|
||||
}
|
||||
}
|
||||
|
||||
public interface IdleObserver {
|
||||
void onIdle();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -47,7 +47,7 @@ import de.dennisguse.opentracks.services.handlers.TrackPointCreator;
|
||||
import de.dennisguse.opentracks.settings.PreferencesUtils;
|
||||
import de.dennisguse.opentracks.util.SystemUtils;
|
||||
|
||||
public class TrackRecordingService extends Service implements TrackPointCreator.Callback, SharedPreferences.OnSharedPreferenceChangeListener {
|
||||
public class TrackRecordingService extends Service implements TrackPointCreator.Callback, SharedPreferences.OnSharedPreferenceChangeListener, TrackRecordingManager.IdleObserver {
|
||||
|
||||
private static final String TAG = TrackRecordingService.class.getSimpleName();
|
||||
|
||||
@@ -108,7 +108,7 @@ public class TrackRecordingService extends Service implements TrackPointCreator.
|
||||
recordingDataObservable = new MutableLiveData<>(NOT_RECORDING);
|
||||
|
||||
trackPointCreator = new TrackPointCreator(this);
|
||||
trackRecordingManager = new TrackRecordingManager(this, trackPointCreator, handler);
|
||||
trackRecordingManager = new TrackRecordingManager(this, trackPointCreator, this , handler);
|
||||
|
||||
voiceAnnouncementManager = new VoiceAnnouncementManager(this);
|
||||
notificationManager = new TrackRecordingServiceNotificationManager(this);
|
||||
@@ -296,11 +296,15 @@ public class TrackRecordingService extends Service implements TrackPointCreator.
|
||||
// Compute temporary track statistics using sensorData and update time.
|
||||
Pair<Track, Pair<TrackPoint, SensorDataSet>> data = trackRecordingManager.getDataForUI();
|
||||
|
||||
voiceAnnouncementManager.update(this, data.first);
|
||||
voiceAnnouncementManager.announceStatisticsIfNeeded(data.first);
|
||||
|
||||
recordingDataObservable.postValue(new RecordingData(data.first, data.second.first, data.second.second));
|
||||
}
|
||||
|
||||
public void onIdle() {
|
||||
voiceAnnouncementManager.announceIdle();
|
||||
}
|
||||
|
||||
@VisibleForTesting
|
||||
public void stopUpdateRecordingData() {
|
||||
handler.removeCallbacks(updateRecordingData);
|
||||
|
||||
+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