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" /> +