diff --git a/android-buildsystem b/android-buildsystem index 121a36b..659da3f 160000 --- a/android-buildsystem +++ b/android-buildsystem @@ -1 +1 @@ -Subproject commit 121a36b29d7f6fa4636d5c60ed309efec0e8f333 +Subproject commit 659da3f5e4de5e7f9e1693bc4ef4b6d1ad802635 diff --git a/sdk-addon-amazon-speech/src/main/java/chattylabs/conversations/AmazonSpeechSynthesizer.java b/sdk-addon-amazon-speech/src/main/java/chattylabs/conversations/AmazonSpeechSynthesizer.java index 1c8bdde..50d5233 100644 --- a/sdk-addon-amazon-speech/src/main/java/chattylabs/conversations/AmazonSpeechSynthesizer.java +++ b/sdk-addon-amazon-speech/src/main/java/chattylabs/conversations/AmazonSpeechSynthesizer.java @@ -183,7 +183,8 @@ private void closeMediaPlayer() { } @Override - public void checkStatus(SynthesizerListener.OnStatusChecked listener) { + public void checkStatus(Activity activity, SynthesizerListener.OnStatusChecked listener) { + logger.i(TAG, "check AmazonSpeech status"); prepare(synthesizerStatus -> { final DescribeVoicesResult voicesResult = mAmazonSpeechClient.describeVoices(new DescribeVoicesRequest() .withLanguageCode(mLanguageCode)); @@ -196,6 +197,10 @@ public void checkStatus(SynthesizerListener.OnStatusChecked listener) { }); } + @Override + public void testStatus(SynthesizerListener.OnStatusChecked listener) { + } + @Override public void loadInstallation(Activity activity, SynthesizerListener.OnStatusChecked listener) { } diff --git a/sdk-addon-android-speech/src/main/java/chattylabs/conversations/AndroidSpeechSynthesizer.java b/sdk-addon-android-speech/src/main/java/chattylabs/conversations/AndroidSpeechSynthesizer.java index af208d0..a588b6e 100644 --- a/sdk-addon-android-speech/src/main/java/chattylabs/conversations/AndroidSpeechSynthesizer.java +++ b/sdk-addon-android-speech/src/main/java/chattylabs/conversations/AndroidSpeechSynthesizer.java @@ -57,8 +57,22 @@ public AndroidSpeechSynthesizer(Application application, } @Override - public void checkStatus(SynthesizerListener.OnStatusChecked listener) { + public void checkStatus(Activity activity, SynthesizerListener.OnStatusChecked listener) { logger.i(TAG, "check TTS status"); + + Intent checkData = new Intent(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA); + + boolean checkDataExists = checkData.resolveActivityInfo(activity.getPackageManager(), 0) != null; + + if (checkDataExists) { + activity.startActivityForResult(checkData, CHECK_TTS_REQUEST_CODE); + } else { + listener.execute(NOT_AVAILABLE_ERROR); + } + } + + @Override + public void testStatus(SynthesizerListener.OnStatusChecked listener) { try { prepare(status -> checkTTS(listener)); } catch (Exception e) { @@ -111,9 +125,12 @@ public void loadInstallation(Activity activity, SynthesizerListener.OnStatusChec final Locale speechLanguage = getConfiguration().getSpeechLanguage(); final TextToSpeech[] _tts = { null }; TextToSpeech.OnInitListener ttsListener = status -> { - int result = _tts[0].isLanguageAvailable(speechLanguage); - _tts[0].shutdown(); - _tts[0] = null; + TextToSpeech _currentTts = _tts[0]; + if (_currentTts == null) { + _currentTts = new TextToSpeech(application, status1 -> {}); + } + int result = _currentTts.isLanguageAvailable(speechLanguage); + _currentTts.shutdown(); if (ArraysKt.contains(new int[] {TextToSpeech.LANG_AVAILABLE, TextToSpeech.LANG_COUNTRY_AVAILABLE, TextToSpeech.LANG_COUNTRY_VAR_AVAILABLE}, result)) { @@ -133,14 +150,10 @@ public void onActivityResumed(Activity activity) { _tts[0] = new TextToSpeech(application, ttsListener); } }); - Intent checkData = new Intent(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA); - boolean checkDataExists = checkData.resolveActivityInfo(activity.getPackageManager(), 0) != null; - if (checkDataExists) - activity.startActivity(checkData); Intent installData = new Intent(TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA); boolean installDataExists = installData.resolveActivityInfo(activity.getPackageManager(), 0) != null; if (installDataExists) - activity.startActivity(checkData); + activity.startActivity(installData); else { shutdown(); logger.e(TAG, "NOT_AVAILABLE_ERROR"); diff --git a/sdk-addon-google-speech/src/main/java/chattylabs/conversations/GoogleSpeechSynthesizer.java b/sdk-addon-google-speech/src/main/java/chattylabs/conversations/GoogleSpeechSynthesizer.java index 768636d..aebaaff 100644 --- a/sdk-addon-google-speech/src/main/java/chattylabs/conversations/GoogleSpeechSynthesizer.java +++ b/sdk-addon-google-speech/src/main/java/chattylabs/conversations/GoogleSpeechSynthesizer.java @@ -81,8 +81,8 @@ public GoogleSpeechSynthesizer(Application application, @WorkerThread @Override - public void checkStatus(SynthesizerListener.OnStatusChecked listener) { - logger.i(TAG, "checkStatus and check language"); + public void checkStatus(Activity activity, SynthesizerListener.OnStatusChecked listener) { + logger.i(TAG, "check GoogleSpeech status and language"); // At this stage, we only want to check whether the api works and the language is available try (TextToSpeechClient ttsClient = generateFromRawFile( application, getConfiguration().getGoogleCredentialsResourceFile())) { @@ -100,6 +100,10 @@ application, getConfiguration().getGoogleCredentialsResourceFile())) { } } + @Override + public void testStatus(SynthesizerListener.OnStatusChecked listener) { + } + @Override public void loadInstallation(Activity activity, SynthesizerListener.OnStatusChecked listener) { } diff --git a/sdk-voice-user-interaction/src/main/java/chattylabs/conversations/BaseSpeechSynthesizer.java b/sdk-voice-user-interaction/src/main/java/chattylabs/conversations/BaseSpeechSynthesizer.java index d5666ae..89077ae 100644 --- a/sdk-voice-user-interaction/src/main/java/chattylabs/conversations/BaseSpeechSynthesizer.java +++ b/sdk-voice-user-interaction/src/main/java/chattylabs/conversations/BaseSpeechSynthesizer.java @@ -104,7 +104,6 @@ abstract class BaseSpeechSynthesizer implements SpeechSynthesizer { this.logger = logger; } - abstract void executeOnEngineReady(String utteranceId, String text); abstract void playSilence(String utteranceId, long durationInMillis); diff --git a/sdk-voice-user-interaction/src/main/java/chattylabs/conversations/ConversationalFlow.java b/sdk-voice-user-interaction/src/main/java/chattylabs/conversations/ConversationalFlow.java index bde6196..a32ac8f 100644 --- a/sdk-voice-user-interaction/src/main/java/chattylabs/conversations/ConversationalFlow.java +++ b/sdk-voice-user-interaction/src/main/java/chattylabs/conversations/ConversationalFlow.java @@ -28,7 +28,7 @@ public interface ConversationalFlow extends RequiredPermissions { * @see SynthesizerListener.OnStatusChecked * @see SynthesizerListener.Status */ - void checkSpeechSynthesizerStatus(Context context, SynthesizerListener.OnStatusChecked listener); + void checkSpeechSynthesizerStatus(Activity activity, SynthesizerListener.OnStatusChecked listener); /** * Checks whether the Recognizer is available and returns a {@link RecognizerListener.Status} @@ -45,7 +45,11 @@ public interface ConversationalFlow extends RequiredPermissions { * @see RecognizerListener.OnStatusChecked * @see RecognizerListener.Status */ - void checkSpeechRecognizerStatus(Context context, RecognizerListener.OnStatusChecked listener); + void checkSpeechRecognizerStatus(Activity activity, RecognizerListener.OnStatusChecked listener); + + boolean isCheckingSpeech(int requestCode); + + void checkSpeech(int resultCode, SynthesizerListener.OnStatusChecked listener); /** * Reuses the already set {@link ComponentConfig} allowing you to update only specific parts diff --git a/sdk-voice-user-interaction/src/main/java/chattylabs/conversations/ConversationalFlowImpl.java b/sdk-voice-user-interaction/src/main/java/chattylabs/conversations/ConversationalFlowImpl.java index de5a98f..c2d33ed 100644 --- a/sdk-voice-user-interaction/src/main/java/chattylabs/conversations/ConversationalFlowImpl.java +++ b/sdk-voice-user-interaction/src/main/java/chattylabs/conversations/ConversationalFlowImpl.java @@ -6,6 +6,7 @@ import android.app.Application; import android.content.Context; import android.media.AudioManager; +import android.speech.tts.TextToSpeech; import java.lang.ref.SoftReference; import java.lang.reflect.Constructor; @@ -14,6 +15,8 @@ import chattylabs.android.commons.internal.ILogger; +import static chattylabs.conversations.SynthesizerListener.Status.NOT_AVAILABLE_ERROR; + final class ConversationalFlowImpl implements ConversationalFlow { static class Instance { @@ -124,21 +127,33 @@ public void onIncomingCallRinging() { } @Override - public void checkSpeechSynthesizerStatus(Context context, SynthesizerListener.OnStatusChecked listener) { - final Application application = (Application) context.getApplicationContext(); + public void checkSpeechSynthesizerStatus(Activity activity, SynthesizerListener.OnStatusChecked listener) { + final Application application = (Application) activity.getApplicationContext(); initDependencies(application); createSpeechSynthesizerInstance(application); - speechSynthesizer.checkStatus(listener); + speechSynthesizer.checkStatus(activity, listener); } @Override - public void checkSpeechRecognizerStatus(Context context, RecognizerListener.OnStatusChecked listener) { - final Application application = (Application) context.getApplicationContext(); + public void checkSpeechRecognizerStatus(Activity activity, RecognizerListener.OnStatusChecked listener) { + final Application application = (Application) activity.getApplicationContext(); initDependencies(application); createSpeechRecognizerInstance(application); speechRecognizer.checkStatus(listener); } + @Override public boolean isCheckingSpeech(int requestCode) { + return requestCode == SpeechSynthesizer.CHECK_TTS_REQUEST_CODE; + } + + @Override public void checkSpeech(int resultCode, SynthesizerListener.OnStatusChecked listener) { + if (resultCode == TextToSpeech.Engine.CHECK_VOICE_DATA_PASS) { + speechSynthesizer.testStatus(listener); + } else { + listener.execute(NOT_AVAILABLE_ERROR); + } + } + private void createSpeechSynthesizerInstance(Context context) { try { if (speechSynthesizer == null) { diff --git a/sdk-voice-user-interaction/src/main/java/chattylabs/conversations/SpeechSynthesizer.java b/sdk-voice-user-interaction/src/main/java/chattylabs/conversations/SpeechSynthesizer.java index 502710b..0bd0463 100644 --- a/sdk-voice-user-interaction/src/main/java/chattylabs/conversations/SpeechSynthesizer.java +++ b/sdk-voice-user-interaction/src/main/java/chattylabs/conversations/SpeechSynthesizer.java @@ -13,6 +13,8 @@ */ public interface SpeechSynthesizer { + int CHECK_TTS_REQUEST_CODE = 775; + String EMPTY = ""; String VOICE_MALE = "#male"; @@ -22,7 +24,9 @@ public interface SpeechSynthesizer { void setDefaultVoice(); - void checkStatus(SynthesizerListener.OnStatusChecked listener); + void checkStatus(Activity activity, SynthesizerListener.OnStatusChecked listener); + + void testStatus(SynthesizerListener.OnStatusChecked listener); void loadInstallation(Activity activity, SynthesizerListener.OnStatusChecked listener);