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