diff options
author | android-build-team Robot <android-build-team-robot@google.com> | 2018-05-15 07:20:54 +0000 |
---|---|---|
committer | android-build-team Robot <android-build-team-robot@google.com> | 2018-05-15 07:20:54 +0000 |
commit | 5e1351d0b9ef058a777279af0332c2c0b3c6cc75 (patch) | |
tree | dd42321a9fb8a9ae12eb9aa4c91867a07ad2d7c7 | |
parent | 3928257b7db93d9c07a34dfe2065b34edd9a7ff0 (diff) | |
parent | cbed6abf33fd300f3bf2e7f1659b12c97aa2d093 (diff) | |
download | Messenger-pie-r2-s2-release.tar.gz |
Snap for 4781566 from cbed6abf33fd300f3bf2e7f1659b12c97aa2d093 to pi-releaseandroid-wear-9.0.0_r9android-wear-9.0.0_r8android-wear-9.0.0_r7android-wear-9.0.0_r6android-wear-9.0.0_r5android-wear-9.0.0_r4android-wear-9.0.0_r34android-wear-9.0.0_r33android-wear-9.0.0_r32android-wear-9.0.0_r31android-wear-9.0.0_r30android-wear-9.0.0_r3android-wear-9.0.0_r29android-wear-9.0.0_r28android-wear-9.0.0_r27android-wear-9.0.0_r26android-wear-9.0.0_r25android-wear-9.0.0_r24android-wear-9.0.0_r23android-wear-9.0.0_r22android-wear-9.0.0_r21android-wear-9.0.0_r20android-wear-9.0.0_r2android-wear-9.0.0_r19android-wear-9.0.0_r18android-wear-9.0.0_r17android-wear-9.0.0_r16android-wear-9.0.0_r15android-wear-9.0.0_r14android-wear-9.0.0_r13android-wear-9.0.0_r12android-wear-9.0.0_r11android-wear-9.0.0_r10android-wear-9.0.0_r1android-vts-9.0_r9android-vts-9.0_r8android-vts-9.0_r7android-vts-9.0_r6android-vts-9.0_r5android-vts-9.0_r4android-vts-9.0_r19android-vts-9.0_r18android-vts-9.0_r17android-vts-9.0_r16android-vts-9.0_r15android-vts-9.0_r14android-vts-9.0_r13android-vts-9.0_r12android-vts-9.0_r11android-vts-9.0_r10android-security-9.0.0_r76android-security-9.0.0_r75android-security-9.0.0_r74android-security-9.0.0_r73android-security-9.0.0_r72android-security-9.0.0_r71android-security-9.0.0_r70android-security-9.0.0_r69android-security-9.0.0_r68android-security-9.0.0_r67android-security-9.0.0_r66android-security-9.0.0_r65android-security-9.0.0_r64android-security-9.0.0_r63android-security-9.0.0_r62android-cts-9.0_r9android-cts-9.0_r8android-cts-9.0_r7android-cts-9.0_r6android-cts-9.0_r5android-cts-9.0_r4android-cts-9.0_r3android-cts-9.0_r20android-cts-9.0_r2android-cts-9.0_r19android-cts-9.0_r18android-cts-9.0_r17android-cts-9.0_r16android-cts-9.0_r15android-cts-9.0_r14android-cts-9.0_r13android-cts-9.0_r12android-cts-9.0_r11android-cts-9.0_r10android-cts-9.0_r1android-9.0.0_r9android-9.0.0_r8android-9.0.0_r7android-9.0.0_r61android-9.0.0_r60android-9.0.0_r6android-9.0.0_r59android-9.0.0_r58android-9.0.0_r57android-9.0.0_r56android-9.0.0_r55android-9.0.0_r54android-9.0.0_r53android-9.0.0_r52android-9.0.0_r51android-9.0.0_r50android-9.0.0_r5android-9.0.0_r49android-9.0.0_r48android-9.0.0_r3android-9.0.0_r2android-9.0.0_r18android-9.0.0_r17android-9.0.0_r10android-9.0.0_r1security-pi-releasepie-vts-releasepie-security-releasepie-s2-releasepie-release-2pie-releasepie-r2-s2-releasepie-r2-s1-releasepie-r2-releasepie-platform-releasepie-gsipie-cuttlefish-testingpie-cts-release
Change-Id: I061974033182a10b922700eb49bc8fc8b00365f6
7 files changed, 79 insertions, 38 deletions
diff --git a/src/com/android/car/messenger/MapMessageMonitor.java b/src/com/android/car/messenger/MapMessageMonitor.java index b191e4b..3c427dd 100644 --- a/src/com/android/car/messenger/MapMessageMonitor.java +++ b/src/com/android/car/messenger/MapMessageMonitor.java @@ -35,7 +35,6 @@ import android.database.Cursor; import android.graphics.Bitmap; import android.graphics.drawable.Drawable; import android.graphics.drawable.Icon; -import android.media.AudioManager; import android.net.Uri; import android.os.Parcel; import android.os.Parcelable; @@ -49,7 +48,6 @@ import androidx.annotation.Nullable; import com.android.car.apps.common.LetterTileDrawable; import com.android.car.messenger.tts.TTSHelper; - import com.bumptech.glide.Glide; import com.bumptech.glide.request.RequestOptions; import com.bumptech.glide.request.target.SimpleTarget; @@ -94,8 +92,6 @@ class MapMessageMonitor { private final Map<SenderKey, NotificationInfo> mNotificationInfos = new HashMap<>(); private final TTSHelper mTTSHelper; private final HashMap<String, Boolean> mReplyFeatureMap = new HashMap<>(); - private final AudioManager mAudioManager; - private final AudioManager.OnAudioFocusChangeListener mNoOpAFChangeListener = (f) -> {}; MapMessageMonitor(Context context) { mContext = context; @@ -104,8 +100,6 @@ class MapMessageMonitor { mNotificationManager = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE); mTTSHelper = new TTSHelper(mContext); - - mAudioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE); } public boolean isPlaying() { @@ -348,34 +342,29 @@ class MapMessageMonitor { ttsMessages.add(mContext.getString(R.string.tts_sender_says, notificationInfo.mSenderName)); ttsMessages.add(ttsMessage); - int result = mAudioManager.requestAudioFocus(mNoOpAFChangeListener, - // Use the music stream. - AudioManager.STREAM_MUSIC, - // Request permanent focus. - AudioManager.AUDIOFOCUS_GAIN_TRANSIENT); - if (result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) { - mTTSHelper.requestPlay(ttsMessages, - new TTSHelper.Listener() { - @Override - public void onTTSStarted() { - Intent intent = new Intent(ACTION_MESSAGE_PLAY_START); - mContext.sendBroadcast(intent); - } + mTTSHelper.requestPlay(ttsMessages, + new TTSHelper.Listener() { + @Override + public void onTTSStarted() { + Intent intent = new Intent(ACTION_MESSAGE_PLAY_START); + mContext.sendBroadcast(intent); + } - @Override - public void onTTSStopped(boolean error) { - mAudioManager.abandonAudioFocus(mNoOpAFChangeListener); - Intent intent = new Intent(ACTION_MESSAGE_PLAY_STOP); - mContext.sendBroadcast(intent); - if (error) { - Toast.makeText(mContext, R.string.tts_failed_toast, - Toast.LENGTH_SHORT).show(); - } + @Override + public void onTTSStopped(boolean error) { + Intent intent = new Intent(ACTION_MESSAGE_PLAY_STOP); + mContext.sendBroadcast(intent); + if (error) { + Toast.makeText(mContext, R.string.tts_failed_toast, + Toast.LENGTH_SHORT).show(); } - }); - } else { - Log.w(TAG, "failed to require audio focus."); - } + } + + @Override + public void onAudioFocusFailed() { + Log.w(TAG, "failed to require audio focus."); + } + }); } void stopPlayout() { diff --git a/src/com/android/car/messenger/PlayMessageActivity.java b/src/com/android/car/messenger/PlayMessageActivity.java index 90dcf29..7bfc5f9 100644 --- a/src/com/android/car/messenger/PlayMessageActivity.java +++ b/src/com/android/car/messenger/PlayMessageActivity.java @@ -159,6 +159,11 @@ public class PlayMessageActivity extends Activity { } finish(); } + + @Override + public void onAudioFocusFailed() { + Log.w(TAG, "failed to require audio focus."); + } }); } diff --git a/src/com/android/car/messenger/tts/AndroidTTSEngine.java b/src/com/android/car/messenger/tts/AndroidTTSEngine.java index b6a7988..70d0aff 100644 --- a/src/com/android/car/messenger/tts/AndroidTTSEngine.java +++ b/src/com/android/car/messenger/tts/AndroidTTSEngine.java @@ -54,4 +54,9 @@ class AndroidTTSEngine implements TTSEngine { mTextToSpeech.shutdown(); mTextToSpeech = null; } + + @Override + public int getStream() { + return TextToSpeech.Engine.DEFAULT_STREAM; + } } diff --git a/src/com/android/car/messenger/tts/FakeTTSEngine.java b/src/com/android/car/messenger/tts/FakeTTSEngine.java index 0870379..6af64e4 100644 --- a/src/com/android/car/messenger/tts/FakeTTSEngine.java +++ b/src/com/android/car/messenger/tts/FakeTTSEngine.java @@ -53,6 +53,11 @@ class FakeTTSEngine implements TTSEngine { mOnInitListener = null; } + @Override + public int getStream() { + return TextToSpeech.Engine.DEFAULT_STREAM; + } + void startRequest(String utteranceId) { mProgressListener.onStart(utteranceId); } diff --git a/src/com/android/car/messenger/tts/TTSEngine.java b/src/com/android/car/messenger/tts/TTSEngine.java index ed1313f..e789327 100644 --- a/src/com/android/car/messenger/tts/TTSEngine.java +++ b/src/com/android/car/messenger/tts/TTSEngine.java @@ -48,4 +48,9 @@ public interface TTSEngine { * using this engine. */ void shutdown(); + + /** + * Returns the stream used by this TTS engine. + */ + int getStream(); } diff --git a/src/com/android/car/messenger/tts/TTSHelper.java b/src/com/android/car/messenger/tts/TTSHelper.java index 8ad132e..aef20d7 100644 --- a/src/com/android/car/messenger/tts/TTSHelper.java +++ b/src/com/android/car/messenger/tts/TTSHelper.java @@ -17,6 +17,7 @@ package com.android.car.messenger.tts; import android.content.Context; +import android.media.AudioManager; import android.os.Handler; import android.speech.tts.TextToSpeech; import android.speech.tts.UtteranceProgressListener; @@ -57,6 +58,12 @@ public class TTSHelper { * not considered an error. */ void onTTSStopped(boolean error); + + /** + * Called when request to get audio focus failed. This happens before the requested TTS + * is played. + */ + void onAudioFocusFailed(); } private static final String TAG = "Messenger.TTSHelper"; @@ -67,6 +74,8 @@ public class TTSHelper { private final Handler mHandler = new Handler(); private final Context mContext; + private final AudioManager mAudioManager; + private final AudioManager.OnAudioFocusChangeListener mNoOpAFChangeListener = (f) -> {}; private final long mShutdownDelayMillis; private TTSEngine mTTSEngine; private int mInitStatus; @@ -84,6 +93,7 @@ public class TTSHelper { @VisibleForTesting TTSHelper(Context context, TTSEngine ttsEngine, long shutdownDelayMillis) { mContext = context; + mAudioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE); mTTSEngine = ttsEngine; mShutdownDelayMillis = shutdownDelayMillis; // OnInitListener will only set to SUCCESS/ERROR. So we initialize to STOPPED. @@ -130,6 +140,7 @@ public class TTSHelper { * until then. Only one batch is supported at a time; If a previous batch is waiting engine * setup, that batch is dropped. If a previous batch is playing, the play-out is stopped and * next one is passed to the TTS Engine. Callbacks are issued on the provided {@code listener}. + * Will request audio focus first, failure will trigger onAudioFocusFailed in listener. * * NOTE: Underlying engine may have limit on length of text in each element of the batch; it * will reject anything longer. See {@link TextToSpeech#getMaxSpeechInputLength()}. @@ -138,16 +149,23 @@ public class TTSHelper { * @param listener Observer that will receive callbacks about play-out progress. */ public void requestPlay(List<CharSequence> textToSpeak, Listener listener) { - if (textToSpeak == null || textToSpeak.size() < 1) { + if (textToSpeak == null || textToSpeak.isEmpty()) { throw new IllegalArgumentException("Empty/null textToSpeak"); } + int result = mAudioManager.requestAudioFocus(mNoOpAFChangeListener, + getStream(), + AudioManager.AUDIOFOCUS_GAIN_TRANSIENT); + if (result != AudioManager.AUDIOFOCUS_REQUEST_GRANTED) { + listener.onAudioFocusFailed(); + return; + } initMaybeAndKeepAlive(); // Check if its still initializing. if (mInitStatus == TextToSpeech.STOPPED) { // Squash any already queued request. if (mPendingRequest != null) { - mPendingRequest.mListener.onTTSStopped(false /* error */); + onTtsStopped(mPendingRequest.mListener, false /* error */); } mPendingRequest = new SpeechRequest(textToSpeak, listener); } else { @@ -164,10 +182,16 @@ public class TTSHelper { return mTTSEngine.isSpeaking(); } + // wrap call back to listener.onTTSStopped with adandonAudioFocus. + private void onTtsStopped(Listener listener, boolean error) { + mAudioManager.abandonAudioFocus(mNoOpAFChangeListener); + mHandler.post(() -> listener.onTTSStopped(error)); + } + private void playInternal(List<CharSequence> textToSpeak, Listener listener) { if (mInitStatus == TextToSpeech.ERROR) { Log.e(TAG, "TTS setup failed!"); - mHandler.post(() -> listener.onTTSStopped(true /* error */)); + onTtsStopped(listener, true /* error */); return; } @@ -189,7 +213,7 @@ public class TTSHelper { mTTSEngine.stop(); currentBatchId = null; Log.e(TAG, "Queuing text failed!"); - mHandler.post(() -> listener.onTTSStopped(true /* error */)); + onTtsStopped(listener, true /* error */); return; } index--; @@ -207,6 +231,10 @@ public class TTSHelper { shutdownEngine(); } + public int getStream() { + return mTTSEngine.getStream(); + } + private void shutdownEngine() { if (mTTSEngine.isInitialized()) { if (DBG) { @@ -325,7 +353,7 @@ public class TTSHelper { // Handles terminal callbacks for the batch. We invoke stopped and remove ourselves. // No further callbacks will be handled for the batch. private void handleBatchFinished(Pair<String, Integer> parsedId, boolean error) { - mListener.onTTSStopped(error); + onTtsStopped(mListener, error); mListeners.remove(parsedId.first); } } diff --git a/tests/robotests/src/com/android/car/messenger/tts/TTSHelperTest.java b/tests/robotests/src/com/android/car/messenger/tts/TTSHelperTest.java index f9745f4..dbbb5e4 100644 --- a/tests/robotests/src/com/android/car/messenger/tts/TTSHelperTest.java +++ b/tests/robotests/src/com/android/car/messenger/tts/TTSHelperTest.java @@ -156,5 +156,9 @@ public class TTSHelperTest { mStopped = true; mError = error; } + + @Override + public void onAudioFocusFailed() { + } } -}
\ No newline at end of file +} |