From 9089689ce3fa706e95dff7e606fa17ae2c75d9f6 Mon Sep 17 00:00:00 2001 From: jannis Date: Wed, 8 Jan 2020 13:19:20 +0100 Subject: [PATCH] Request audio focus for announcements to duck other media --- .../announcement/VoiceAnnouncements.java | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/app/src/main/java/de/tadris/fitness/announcement/VoiceAnnouncements.java b/app/src/main/java/de/tadris/fitness/announcement/VoiceAnnouncements.java index 93fea5e..dce822f 100644 --- a/app/src/main/java/de/tadris/fitness/announcement/VoiceAnnouncements.java +++ b/app/src/main/java/de/tadris/fitness/announcement/VoiceAnnouncements.java @@ -20,7 +20,9 @@ package de.tadris.fitness.announcement; import android.content.Context; +import android.media.AudioManager; import android.speech.tts.TextToSpeech; +import android.speech.tts.UtteranceProgressListener; import android.util.Log; import java.util.Locale; @@ -43,6 +45,8 @@ public class VoiceAnnouncements { private final long intervalTime; private final int intervalInMeters; + private final AudioManager audioManager; + public VoiceAnnouncements(Context context, VoiceAnnouncementCallback callback) { this.callback = callback; UserPreferences prefs = Instance.getInstance(context).userPreferences; @@ -52,10 +56,14 @@ public class VoiceAnnouncements { this.intervalInMeters = (int) (1000.0 / UnitUtils.CHOSEN_SYSTEM.getDistanceFromKilometers(1) * prefs.getSpokenUpdateDistancePeriod()); this.manager = new AnnouncementManager(context); + this.audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); } private void ttsReady(int status) { ttsAvailable = status == TextToSpeech.SUCCESS && textToSpeech.setLanguage(Locale.getDefault()) >= 0; + if (ttsAvailable) { + textToSpeech.setOnUtteranceProgressListener(new TextToSpeechListener()); + } callback.onVoiceAnnouncementIsReady(ttsAvailable); } @@ -111,6 +119,23 @@ public class VoiceAnnouncements { textToSpeech.shutdown(); } + private class TextToSpeechListener extends UtteranceProgressListener { + + @Override + public void onStart(String utteranceId) { + audioManager.requestAudioFocus(null, AudioManager.STREAM_SYSTEM, AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK); + } + + @Override + public void onDone(String utteranceId) { + audioManager.abandonAudioFocus(null); + } + + @Override + public void onError(String utteranceId) { + } + } + public interface VoiceAnnouncementCallback { void onVoiceAnnouncementIsReady(boolean available); }