blob: d0bc386b3e02be1378e64d54580b60682c854eb9 [file] [log] [blame]
// Copyright 2021 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/autofill_assistant/browser/autofill_assistant_tts_controller.h"
#include "base/logging.h"
#include "components/autofill_assistant/browser/metrics.h"
namespace autofill_assistant {
namespace {
constexpr char kGoogleTtsEngineId[] = "com.google.android.tts";
} // namespace
AutofillAssistantTtsController::AutofillAssistantTtsController(
content::TtsController* tts_controller)
: tts_controller_(tts_controller) {}
AutofillAssistantTtsController::~AutofillAssistantTtsController() {
// Remove self from receiving any further Tts Events for any pending
// utterance. Also stops any ongoing/queued utterance with this delegate.
if (tts_controller_ != nullptr) {
tts_controller_->RemoveUtteranceEventDelegate(this);
}
}
void AutofillAssistantTtsController::Speak(const std::string& message,
const std::string& locale) {
std::unique_ptr<content::TtsUtterance> tts_utterance =
content::TtsUtterance::Create();
tts_utterance->SetText(message);
tts_utterance->SetLang(locale);
tts_utterance->SetShouldClearQueue(true);
tts_utterance->SetEventDelegate(this);
// TtsController will use the default TTS engine if the Google TTS engine
// is not available.
tts_utterance->SetEngineId(kGoogleTtsEngineId);
tts_controller_->SpeakOrEnqueue(std::move(tts_utterance));
}
void AutofillAssistantTtsController::Stop() {
tts_controller_->Stop();
}
void AutofillAssistantTtsController::SetTtsEventDelegate(
base::WeakPtr<TtsEventDelegate> tts_event_delegate) {
// Ensure that it is set only once
DCHECK(!tts_event_delegate_);
tts_event_delegate_ = tts_event_delegate;
}
void AutofillAssistantTtsController::OnTtsEvent(
content::TtsUtterance* utterance,
content::TtsEventType event_type,
int char_index,
int char_length,
const std::string& error_message) {
if (!tts_event_delegate_) {
VLOG(1) << "AssistantAutofillTtsController: No TtsEventDelegate set.";
return;
}
switch (event_type) {
case content::TTS_EVENT_START:
tts_event_delegate_->OnTtsEvent(TTS_START);
Metrics::RecordTtsEngineEvent(Metrics::TtsEngineEvent::TTS_EVENT_START);
break;
case content::TTS_EVENT_END:
tts_event_delegate_->OnTtsEvent(TTS_END);
Metrics::RecordTtsEngineEvent(Metrics::TtsEngineEvent::TTS_EVENT_END);
break;
case content::TTS_EVENT_ERROR:
VLOG(1) << __func__ << ": " << error_message;
tts_event_delegate_->OnTtsEvent(TTS_ERROR);
Metrics::RecordTtsEngineEvent(Metrics::TtsEngineEvent::TTS_EVENT_ERROR);
break;
case content::TTS_EVENT_INTERRUPTED:
case content::TTS_EVENT_CANCELLED:
case content::TTS_EVENT_WORD:
case content::TTS_EVENT_SENTENCE:
case content::TTS_EVENT_MARKER:
case content::TTS_EVENT_PAUSE:
case content::TTS_EVENT_RESUME:
// Do not care about these events. Android does not send back these
// events anyways.
Metrics::RecordTtsEngineEvent(Metrics::TtsEngineEvent::TTS_EVENT_OTHER);
break;
}
}
} // namespace autofill_assistant