diff --git a/src/main/java/de/dennisguse/opentracks/services/tasks/AnnouncementPeriodicTask.java b/src/main/java/de/dennisguse/opentracks/services/tasks/AnnouncementPeriodicTask.java
index e5fc9227c..06576e81b 100644
--- a/src/main/java/de/dennisguse/opentracks/services/tasks/AnnouncementPeriodicTask.java
+++ b/src/main/java/de/dennisguse/opentracks/services/tasks/AnnouncementPeriodicTask.java
@@ -25,13 +25,11 @@ import android.util.Log;
import androidx.annotation.NonNull;
-import java.util.ArrayList;
import java.util.Arrays;
import java.util.Locale;
import de.dennisguse.opentracks.content.data.Distance;
import de.dennisguse.opentracks.content.data.Track;
-import de.dennisguse.opentracks.content.data.TrackPoint;
import de.dennisguse.opentracks.content.provider.ContentProviderUtils;
import de.dennisguse.opentracks.content.provider.TrackPointIterator;
import de.dennisguse.opentracks.services.TrackRecordingService;
@@ -47,11 +45,6 @@ import de.dennisguse.opentracks.viewmodels.IntervalStatistics;
*/
public class AnnouncementPeriodicTask implements PeriodicTask {
- /**
- * The rate at which announcements are spoken.
- */
- private static final float TTS_SPEECH_RATE = 0.9f;
-
private static final String TAG = AnnouncementPeriodicTask.class.getSimpleName();
private final Context context;
@@ -213,10 +206,7 @@ public class AnnouncementPeriodicTask implements PeriodicTask {
*/
}
tts.setLanguage(locale);
-
- // Slow down the speed just a bit as it is hard to hear when exercising.
- tts.setSpeechRate(TTS_SPEECH_RATE);
-
+ tts.setSpeechRate(PreferencesUtils.getVoiceSpeedRate(PreferencesUtils.getSharedPreferences(context), context));
tts.setOnUtteranceProgressListener(utteranceListener);
}
diff --git a/src/main/java/de/dennisguse/opentracks/settings/SettingsActivity.java b/src/main/java/de/dennisguse/opentracks/settings/SettingsActivity.java
index 44280e7bd..63145bcee 100644
--- a/src/main/java/de/dennisguse/opentracks/settings/SettingsActivity.java
+++ b/src/main/java/de/dennisguse/opentracks/settings/SettingsActivity.java
@@ -130,7 +130,8 @@ public class SettingsActivity extends AbstractActivity implements ChooseActivity
// Used to forward update from ChooseActivityTypeDialogFragment; TODO Could be replaced with LiveData.
private ActivityTypePreference.ActivityPreferenceDialog activityPreferenceDialog;
- private Preference voiceAnnouncements;
+ private Preference announcementsFrequency;
+ private Preference announcementsSpeed;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
@@ -140,7 +141,7 @@ public class SettingsActivity extends AbstractActivity implements ChooseActivity
ttsInitStatus = status;
Log.i(TAG, "TextToSpeech initialized with status " + status);
- if (voiceAnnouncements != null) {
+ if (announcementsFrequency != null && announcementsSpeed != null) {
updateVoiceAnnouncements();
}
});
@@ -172,7 +173,8 @@ public class SettingsActivity extends AbstractActivity implements ChooseActivity
return directory != null ? directory.getName() : getString(R.string.not_set);
});
- voiceAnnouncements = findPreference(getString(R.string.voice_frequency_key));
+ announcementsFrequency = findPreference(getString(R.string.voice_frequency_key));
+ announcementsSpeed = findPreference(getString(R.string.voice_speed_rate_key));
updateVoiceAnnouncements();
}
@@ -232,7 +234,8 @@ public class SettingsActivity extends AbstractActivity implements ChooseActivity
super.onDestroy();
trackRecordingServiceConnection.unbind(getContext());
sharedPreferences = null;
- voiceAnnouncements = null;
+ announcementsFrequency = null;
+ announcementsSpeed = null;
tts = null;
}
@@ -323,7 +326,9 @@ public class SettingsActivity extends AbstractActivity implements ChooseActivity
}
private void updateVoiceAnnouncements() {
- voiceAnnouncements.setEnabled(ttsInitStatus == TextToSpeech.SUCCESS);
+ boolean enabled = ttsInitStatus == TextToSpeech.SUCCESS;
+ announcementsFrequency.setEnabled(enabled);
+ announcementsSpeed.setEnabled(enabled);
}
private void onRecordingStatusChanged(TrackRecordingService.RecordingStatus status) {
diff --git a/src/main/java/de/dennisguse/opentracks/util/PreferencesUtils.java b/src/main/java/de/dennisguse/opentracks/util/PreferencesUtils.java
index 6431b7b33..b7af715f9 100644
--- a/src/main/java/de/dennisguse/opentracks/util/PreferencesUtils.java
+++ b/src/main/java/de/dennisguse/opentracks/util/PreferencesUtils.java
@@ -96,6 +96,22 @@ public class PreferencesUtils {
}
}
+ private static float getFloat(SharedPreferences sharedPreferences, Context context, int keyId, float defaultValue) {
+ try {
+ return sharedPreferences.getFloat(getKey(context, keyId), defaultValue);
+ } catch (ClassCastException e) {
+ //Ignore
+ }
+
+ //NOTE: We assume that the data was stored as String due to use of ListPreference.
+ try {
+ String stringValue = sharedPreferences.getString(getKey(context, keyId), null);
+ return Float.parseFloat(stringValue);
+ } catch (NumberFormatException e) {
+ return defaultValue;
+ }
+ }
+
public static String getString(SharedPreferences sharedPreferences, Context context, int keyId, String defaultValue) {
return sharedPreferences.getString(getKey(context, keyId), defaultValue);
}
@@ -191,6 +207,11 @@ public class PreferencesUtils {
return getInt(sharedPreferences, context, R.string.voice_frequency_key, VOICE_FREQUENCY_DEFAULT);
}
+ public static float getVoiceSpeedRate(SharedPreferences sharedPreferences, Context context) {
+ final float DEFAULT = Float.parseFloat(context.getResources().getString(R.string.voice_frequency_default));
+ return getFloat(sharedPreferences, context, R.string.voice_speed_rate_key, DEFAULT);
+ }
+
public static Distance getRecordingDistanceInterval(SharedPreferences sharedPreferences, Context context) {
return Distance.of(getInt(sharedPreferences, context, R.string.recording_distance_interval_key, getRecordingDistanceIntervalDefaultInternal(context)));
}
diff --git a/src/main/res/values/settings.xml b/src/main/res/values/settings.xml
index e3b611699..f5c30914d 100644
--- a/src/main/res/values/settings.xml
+++ b/src/main/res/values/settings.xml
@@ -238,6 +238,17 @@
- -50
- -100
+ voiceSpeedRate
+ 0.9
+
+ - 0.7
+ - 0.8
+ - @string/voice_speed_rate_default
+ - 1.0
+ - 1.1
+ - 1.2
+ - 1.3
+
exportTrackFileFormat
diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml
index 0642d4896..c633df4ad 100644
--- a/src/main/res/values/strings.xml
+++ b/src/main/res/values/strings.xml
@@ -349,6 +349,7 @@ limitations under the License.
Stop GPS
View photo
Voice frequency
+ Voice speed
Resume track
Recording service
diff --git a/src/main/res/xml/settings.xml b/src/main/res/xml/settings.xml
index 3cda5767f..70ee4e718 100644
--- a/src/main/res/xml/settings.xml
+++ b/src/main/res/xml/settings.xml
@@ -85,6 +85,13 @@ limitations under the License.
android:key="@string/voice_frequency_key"
android:title="@string/menu_voice_frequency"
app:useSimpleSummaryProvider="true" />
+