1168fc36b549a3bdda30fa40b0da0379a23b062c9Srinivas Visvanathanpackage com.android.car.messenger.tts; 2168fc36b549a3bdda30fa40b0da0379a23b062c9Srinivas Visvanathan 3168fc36b549a3bdda30fa40b0da0379a23b062c9Srinivas Visvanathanimport android.content.Context; 4168fc36b549a3bdda30fa40b0da0379a23b062c9Srinivas Visvanathanimport android.os.Bundle; 5168fc36b549a3bdda30fa40b0da0379a23b062c9Srinivas Visvanathanimport android.speech.tts.TextToSpeech; 6168fc36b549a3bdda30fa40b0da0379a23b062c9Srinivas Visvanathanimport android.speech.tts.UtteranceProgressListener; 7168fc36b549a3bdda30fa40b0da0379a23b062c9Srinivas Visvanathan 8168fc36b549a3bdda30fa40b0da0379a23b062c9Srinivas Visvanathanimport java.util.LinkedList; 9168fc36b549a3bdda30fa40b0da0379a23b062c9Srinivas Visvanathan 10168fc36b549a3bdda30fa40b0da0379a23b062c9Srinivas Visvanathan/** 11168fc36b549a3bdda30fa40b0da0379a23b062c9Srinivas Visvanathan * Fake implementation of {@link TTSEngine} for unit-testing. 12168fc36b549a3bdda30fa40b0da0379a23b062c9Srinivas Visvanathan */ 13168fc36b549a3bdda30fa40b0da0379a23b062c9Srinivas Visvanathanclass FakeTTSEngine implements TTSEngine { 14168fc36b549a3bdda30fa40b0da0379a23b062c9Srinivas Visvanathan TextToSpeech.OnInitListener mOnInitListener; 15168fc36b549a3bdda30fa40b0da0379a23b062c9Srinivas Visvanathan UtteranceProgressListener mProgressListener; 16168fc36b549a3bdda30fa40b0da0379a23b062c9Srinivas Visvanathan LinkedList<Request> mRequests = new LinkedList<>(); 17168fc36b549a3bdda30fa40b0da0379a23b062c9Srinivas Visvanathan 18168fc36b549a3bdda30fa40b0da0379a23b062c9Srinivas Visvanathan @Override 19168fc36b549a3bdda30fa40b0da0379a23b062c9Srinivas Visvanathan public void initialize(Context context, TextToSpeech.OnInitListener initListener) { 20168fc36b549a3bdda30fa40b0da0379a23b062c9Srinivas Visvanathan mOnInitListener = initListener; 21168fc36b549a3bdda30fa40b0da0379a23b062c9Srinivas Visvanathan } 22168fc36b549a3bdda30fa40b0da0379a23b062c9Srinivas Visvanathan 23168fc36b549a3bdda30fa40b0da0379a23b062c9Srinivas Visvanathan @Override 24168fc36b549a3bdda30fa40b0da0379a23b062c9Srinivas Visvanathan public boolean isInitialized() { 25168fc36b549a3bdda30fa40b0da0379a23b062c9Srinivas Visvanathan return mOnInitListener != null; 26168fc36b549a3bdda30fa40b0da0379a23b062c9Srinivas Visvanathan } 27168fc36b549a3bdda30fa40b0da0379a23b062c9Srinivas Visvanathan 28168fc36b549a3bdda30fa40b0da0379a23b062c9Srinivas Visvanathan @Override 29168fc36b549a3bdda30fa40b0da0379a23b062c9Srinivas Visvanathan public void setOnUtteranceProgressListener(UtteranceProgressListener progressListener) { 30168fc36b549a3bdda30fa40b0da0379a23b062c9Srinivas Visvanathan mProgressListener = progressListener; 31168fc36b549a3bdda30fa40b0da0379a23b062c9Srinivas Visvanathan } 32168fc36b549a3bdda30fa40b0da0379a23b062c9Srinivas Visvanathan 33168fc36b549a3bdda30fa40b0da0379a23b062c9Srinivas Visvanathan @Override 34168fc36b549a3bdda30fa40b0da0379a23b062c9Srinivas Visvanathan public int speak(CharSequence text, int queueMode, Bundle params, String utteranceId) { 35168fc36b549a3bdda30fa40b0da0379a23b062c9Srinivas Visvanathan mRequests.add(new Request(text, queueMode, params, utteranceId)); 36168fc36b549a3bdda30fa40b0da0379a23b062c9Srinivas Visvanathan return TextToSpeech.SUCCESS; 37168fc36b549a3bdda30fa40b0da0379a23b062c9Srinivas Visvanathan } 38168fc36b549a3bdda30fa40b0da0379a23b062c9Srinivas Visvanathan 39168fc36b549a3bdda30fa40b0da0379a23b062c9Srinivas Visvanathan @Override 40168fc36b549a3bdda30fa40b0da0379a23b062c9Srinivas Visvanathan public void stop() { 41168fc36b549a3bdda30fa40b0da0379a23b062c9Srinivas Visvanathan mRequests.clear(); 42168fc36b549a3bdda30fa40b0da0379a23b062c9Srinivas Visvanathan } 43168fc36b549a3bdda30fa40b0da0379a23b062c9Srinivas Visvanathan 44168fc36b549a3bdda30fa40b0da0379a23b062c9Srinivas Visvanathan @Override 454a5024d82db356bc7c6e0848c80f4f0d7e213a0eSrinivas Visvanathan public boolean isSpeaking() { 464a5024d82db356bc7c6e0848c80f4f0d7e213a0eSrinivas Visvanathan // NOTE: currently not used in tests. 474a5024d82db356bc7c6e0848c80f4f0d7e213a0eSrinivas Visvanathan return false; 484a5024d82db356bc7c6e0848c80f4f0d7e213a0eSrinivas Visvanathan } 494a5024d82db356bc7c6e0848c80f4f0d7e213a0eSrinivas Visvanathan 504a5024d82db356bc7c6e0848c80f4f0d7e213a0eSrinivas Visvanathan @Override 51168fc36b549a3bdda30fa40b0da0379a23b062c9Srinivas Visvanathan public void shutdown() { 52168fc36b549a3bdda30fa40b0da0379a23b062c9Srinivas Visvanathan stop(); 53168fc36b549a3bdda30fa40b0da0379a23b062c9Srinivas Visvanathan mOnInitListener = null; 54168fc36b549a3bdda30fa40b0da0379a23b062c9Srinivas Visvanathan } 55168fc36b549a3bdda30fa40b0da0379a23b062c9Srinivas Visvanathan 56168fc36b549a3bdda30fa40b0da0379a23b062c9Srinivas Visvanathan void startRequest(String utteranceId) { 57168fc36b549a3bdda30fa40b0da0379a23b062c9Srinivas Visvanathan mProgressListener.onStart(utteranceId); 58168fc36b549a3bdda30fa40b0da0379a23b062c9Srinivas Visvanathan } 59168fc36b549a3bdda30fa40b0da0379a23b062c9Srinivas Visvanathan 60168fc36b549a3bdda30fa40b0da0379a23b062c9Srinivas Visvanathan void finishRequest(String utteranceId) { 61168fc36b549a3bdda30fa40b0da0379a23b062c9Srinivas Visvanathan removeRequest(utteranceId); 62168fc36b549a3bdda30fa40b0da0379a23b062c9Srinivas Visvanathan mProgressListener.onDone(utteranceId); 63168fc36b549a3bdda30fa40b0da0379a23b062c9Srinivas Visvanathan } 64168fc36b549a3bdda30fa40b0da0379a23b062c9Srinivas Visvanathan 65168fc36b549a3bdda30fa40b0da0379a23b062c9Srinivas Visvanathan void interruptRequest(String utteranceId, boolean interrupted) { 66168fc36b549a3bdda30fa40b0da0379a23b062c9Srinivas Visvanathan removeRequest(utteranceId); 67168fc36b549a3bdda30fa40b0da0379a23b062c9Srinivas Visvanathan mProgressListener.onStop(utteranceId, interrupted); 68168fc36b549a3bdda30fa40b0da0379a23b062c9Srinivas Visvanathan } 69168fc36b549a3bdda30fa40b0da0379a23b062c9Srinivas Visvanathan 70168fc36b549a3bdda30fa40b0da0379a23b062c9Srinivas Visvanathan void failRequest(String utteranceId, int errorCode) { 71168fc36b549a3bdda30fa40b0da0379a23b062c9Srinivas Visvanathan removeRequest(utteranceId); 72168fc36b549a3bdda30fa40b0da0379a23b062c9Srinivas Visvanathan mProgressListener.onError(utteranceId, errorCode); 73168fc36b549a3bdda30fa40b0da0379a23b062c9Srinivas Visvanathan } 74168fc36b549a3bdda30fa40b0da0379a23b062c9Srinivas Visvanathan 75168fc36b549a3bdda30fa40b0da0379a23b062c9Srinivas Visvanathan private void removeRequest(String utteranceId) { 76168fc36b549a3bdda30fa40b0da0379a23b062c9Srinivas Visvanathan mRequests.removeIf((request) -> request.mUtteranceId.equals(utteranceId)); 77168fc36b549a3bdda30fa40b0da0379a23b062c9Srinivas Visvanathan } 78168fc36b549a3bdda30fa40b0da0379a23b062c9Srinivas Visvanathan 79168fc36b549a3bdda30fa40b0da0379a23b062c9Srinivas Visvanathan static class Request { 80168fc36b549a3bdda30fa40b0da0379a23b062c9Srinivas Visvanathan CharSequence mText; 81168fc36b549a3bdda30fa40b0da0379a23b062c9Srinivas Visvanathan int mQueueMode; 82168fc36b549a3bdda30fa40b0da0379a23b062c9Srinivas Visvanathan Bundle mParams; 83168fc36b549a3bdda30fa40b0da0379a23b062c9Srinivas Visvanathan String mUtteranceId; 84168fc36b549a3bdda30fa40b0da0379a23b062c9Srinivas Visvanathan 85168fc36b549a3bdda30fa40b0da0379a23b062c9Srinivas Visvanathan public Request(CharSequence text, int queueMode, Bundle params, String utteranceId) { 86168fc36b549a3bdda30fa40b0da0379a23b062c9Srinivas Visvanathan mText = text; 87168fc36b549a3bdda30fa40b0da0379a23b062c9Srinivas Visvanathan mQueueMode = queueMode; 88168fc36b549a3bdda30fa40b0da0379a23b062c9Srinivas Visvanathan mParams = params; 89168fc36b549a3bdda30fa40b0da0379a23b062c9Srinivas Visvanathan mUtteranceId = utteranceId; 90168fc36b549a3bdda30fa40b0da0379a23b062c9Srinivas Visvanathan } 91168fc36b549a3bdda30fa40b0da0379a23b062c9Srinivas Visvanathan } 92168fc36b549a3bdda30fa40b0da0379a23b062c9Srinivas Visvanathan} 93