Skip to content

Commit

Permalink
Request audio focus on tts
Browse files Browse the repository at this point in the history
  • Loading branch information
AndreyPavlenko committed May 21, 2023
1 parent 55fb6c5 commit 48f14a8
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 0 deletions.
1 change: 1 addition & 0 deletions modules/chat/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -22,4 +22,5 @@ dependencies {
implementation project(':utils')
implementation project(':fermata')
implementation "com.google.android.material:material:${ANDROID_MATERIAL_VERSION}"
implementation "androidx.media:media:${ANDROIDX_MEDIA_VERSION}"
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@

import android.content.Context;
import android.content.res.Configuration;
import android.media.AudioManager;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.LayoutInflater;
Expand All @@ -24,6 +25,9 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.media.AudioAttributesCompat;
import androidx.media.AudioFocusRequestCompat;
import androidx.media.AudioManagerCompat;

import java.util.List;
import java.util.Locale;
Expand Down Expand Up @@ -53,6 +57,7 @@ public class ChatFragment extends MainActivityFragment
private TextToSpeech tts;
private String chatLang;
private Pattern openPattern;
private AudioFocusRequestCompat audioFocusReq;

@Override
public int getFragmentId() {
Expand Down Expand Up @@ -208,14 +213,43 @@ private void sendRequest(String text, boolean voice) {

private void speak(String text) {
assert tts != null;
requestAudioFocus();
Cancellable interrupt = getActivityDelegate().interruptPlayback();
tts.speak(text).onCompletion((r, err) -> {
releaseAudioFocus();
if ((err != null) && !(err instanceof CancellationException))
UiUtils.showAlert(requireContext(), "TTS failed: " + err);
interrupt.cancel();
});
}

private void requestAudioFocus() {
AudioManager am = (AudioManager) requireContext().getSystemService(Context.AUDIO_SERVICE);
if (am == null) return;
AudioManagerCompat.requestAudioFocus(am, getAudioFocusReq());
}

private void releaseAudioFocus() {
AudioManager am = (AudioManager) requireContext().getSystemService(Context.AUDIO_SERVICE);
if (am == null) return;
AudioManagerCompat.requestAudioFocus(am, getAudioFocusReq());
}

public AudioFocusRequestCompat getAudioFocusReq() {
if (audioFocusReq == null) {
AudioAttributesCompat attrs = new AudioAttributesCompat.Builder()
.setUsage(AudioAttributesCompat.USAGE_MEDIA)
.setContentType(AudioAttributesCompat.CONTENT_TYPE_MUSIC)
.build();
audioFocusReq = new AudioFocusRequestCompat.Builder(AudioManagerCompat.AUDIOFOCUS_GAIN)
.setAudioAttributes(attrs)
.setWillPauseWhenDucked(false)
.setOnAudioFocusChangeListener(ignore -> {})
.build();
}
return audioFocusReq;
}

private static final class ChatToolMediator implements ToolBarView.Mediator {
static final ChatToolMediator instance = new ChatToolMediator();

Expand Down

0 comments on commit 48f14a8

Please sign in to comment.