Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(971)

Unified Diff: chrome/browser/speech/speech_input_extension_manager.cc

Issue 8386074: Add a tray notification UI for speech input recording in the extension API. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: requested file renames and api constants refactor. Created 9 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/speech/speech_input_extension_manager.cc
diff --git a/chrome/browser/extensions/speech_input/extension_speech_input_manager.cc b/chrome/browser/speech/speech_input_extension_manager.cc
similarity index 61%
rename from chrome/browser/extensions/speech_input/extension_speech_input_manager.cc
rename to chrome/browser/speech/speech_input_extension_manager.cc
index b8c6bf520686d37818b07b7c2e14781955cb29c5..7a314be2603393e9a8fa9a9cf4bb22dc6ee533ba 100644
--- a/chrome/browser/extensions/speech_input/extension_speech_input_manager.cc
+++ b/chrome/browser/speech/speech_input_extension_manager.cc
@@ -2,46 +2,68 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "chrome/browser/extensions/speech_input/extension_speech_input_manager.h"
+#include "chrome/browser/speech/speech_input_extension_manager.h"
#include "base/bind.h"
#include "base/json/json_writer.h"
#include "base/utf_string_conversions.h"
#include "base/values.h"
#include "chrome/browser/extensions/extension_event_router.h"
-#include "chrome/browser/extensions/speech_input/extension_speech_input_api_constants.h"
+#include "chrome/browser/extensions/extension_service.h"
+#include "chrome/browser/prefs/pref_service.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/profiles/profile_dependency_manager.h"
#include "chrome/browser/profiles/profile_keyed_service.h"
#include "chrome/browser/profiles/profile_keyed_service_factory.h"
+#include "chrome/browser/speech/speech_input_extension_notification_ui.h"
#include "chrome/common/chrome_notification_types.h"
#include "chrome/common/extensions/extension.h"
+#include "chrome/common/pref_names.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/notification_service.h"
using content::BrowserThread;
-
using namespace speech_input;
-namespace constants = extension_speech_input_api_constants;
-
namespace {
+const char kErrorNoRecordingDeviceFound[] = "noRecordingDeviceFound";
+const char kErrorRecordingDeviceInUse[] = "recordingDeviceInUse";
+const char kErrorUnableToStart[] = "unableToStart";
+const char kErrorRequestDenied[] = "requestDenied";
+const char kErrorRequestInProgress[] = "requestInProgress";
+const char kErrorInvalidOperation[] = "invalidOperation";
+
+const char kErrorCodeKey[] = "code";
+const char kErrorCaptureError[] = "captureError";
+const char kErrorNetworkError[] = "networkError";
+const char kErrorNoSpeechHeard[] = "noSpeechHeard";
+const char kErrorNoResults[] = "noResults";
+
+const char kUtteranceKey[] = "utterance";
+const char kConfidenceKey[] = "confidence";
+const char kHypothesesKey[] = "hypotheses";
+
+const char kOnErrorEvent[] = "experimental.speechInput.onError";
+const char kOnResultEvent[] = "experimental.speechInput.onResult";
+const char kOnSoundStartEvent[] = "experimental.speechInput.onSoundStart";
+const char kOnSoundEndEvent[] = "experimental.speechInput.onSoundEnd";
+
// Caller id provided to the speech recognizer. Since only one extension can
// be recording on the same time a constant value is enough as id.
static const int kSpeechCallerId = 1;
-// Wrap an ExtensionSpeechInputManager using scoped_refptr to avoid
+// Wrap an SpeechInputExtensionManager using scoped_refptr to avoid
// assertion failures on destruction because of not using release().
-class ExtensionSpeechInputManagerWrapper : public ProfileKeyedService {
+class SpeechInputExtensionManagerWrapper : public ProfileKeyedService {
public:
- explicit ExtensionSpeechInputManagerWrapper(
- ExtensionSpeechInputManager* manager)
+ explicit SpeechInputExtensionManagerWrapper(
+ SpeechInputExtensionManager* manager)
: manager_(manager) {}
- virtual ~ExtensionSpeechInputManagerWrapper() {}
+ virtual ~SpeechInputExtensionManagerWrapper() {}
- ExtensionSpeechInputManager* manager() const { return manager_.get(); }
+ SpeechInputExtensionManager* manager() const { return manager_.get(); }
private:
// Methods from ProfileKeyedService.
@@ -49,18 +71,18 @@ class ExtensionSpeechInputManagerWrapper : public ProfileKeyedService {
manager()->ShutdownOnUIThread();
}
- scoped_refptr<ExtensionSpeechInputManager> manager_;
+ scoped_refptr<SpeechInputExtensionManager> manager_;
};
}
-// Factory for ExtensionSpeechInputManagers as profile keyed services.
-class ExtensionSpeechInputManager::Factory : public ProfileKeyedServiceFactory {
+// Factory for SpeechInputExtensionManagers as profile keyed services.
+class SpeechInputExtensionManager::Factory : public ProfileKeyedServiceFactory {
public:
static void Initialize();
static Factory* GetInstance();
- ExtensionSpeechInputManagerWrapper* GetForProfile(Profile* profile);
+ SpeechInputExtensionManagerWrapper* GetForProfile(Profile* profile);
private:
friend struct DefaultSingletonTraits<Factory>;
@@ -78,68 +100,69 @@ class ExtensionSpeechInputManager::Factory : public ProfileKeyedServiceFactory {
DISALLOW_COPY_AND_ASSIGN(Factory);
};
-void ExtensionSpeechInputManager::Factory::Initialize() {
+void SpeechInputExtensionManager::Factory::Initialize() {
GetInstance();
}
-ExtensionSpeechInputManager::Factory*
- ExtensionSpeechInputManager::Factory::GetInstance() {
- return Singleton<ExtensionSpeechInputManager::Factory>::get();
+SpeechInputExtensionManager::Factory*
+ SpeechInputExtensionManager::Factory::GetInstance() {
+ return Singleton<SpeechInputExtensionManager::Factory>::get();
}
-ExtensionSpeechInputManagerWrapper*
- ExtensionSpeechInputManager::Factory::GetForProfile(
+SpeechInputExtensionManagerWrapper*
+ SpeechInputExtensionManager::Factory::GetForProfile(
Profile* profile) {
- return static_cast<ExtensionSpeechInputManagerWrapper*>(
+ return static_cast<SpeechInputExtensionManagerWrapper*>(
GetServiceForProfile(profile, true));
}
-ExtensionSpeechInputManager::Factory::Factory()
+SpeechInputExtensionManager::Factory::Factory()
: ProfileKeyedServiceFactory(ProfileDependencyManager::GetInstance()) {
}
-ExtensionSpeechInputManager::Factory::~Factory() {
+SpeechInputExtensionManager::Factory::~Factory() {
}
ProfileKeyedService*
- ExtensionSpeechInputManager::Factory::BuildServiceInstanceFor(
+ SpeechInputExtensionManager::Factory::BuildServiceInstanceFor(
Profile* profile) const {
- scoped_refptr<ExtensionSpeechInputManager> manager(
- new ExtensionSpeechInputManager(profile));
- return new ExtensionSpeechInputManagerWrapper(manager);
+ scoped_refptr<SpeechInputExtensionManager> manager(
+ new SpeechInputExtensionManager(profile));
+ return new SpeechInputExtensionManagerWrapper(manager);
}
-ExtensionSpeechInterface::ExtensionSpeechInterface() {
+SpeechExtensionInterface::SpeechExtensionInterface() {
}
-ExtensionSpeechInterface::~ExtensionSpeechInterface() {
+SpeechExtensionInterface::~SpeechExtensionInterface() {
}
-ExtensionSpeechInputManager::ExtensionSpeechInputManager(Profile* profile)
+SpeechInputExtensionManager::SpeechInputExtensionManager(Profile* profile)
: profile_(profile),
state_(kIdle),
- speech_interface_(NULL) {
+ speech_interface_(NULL),
+ notification_(profile) {
registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_UNLOADED,
content::Source<Profile>(profile_));
}
-ExtensionSpeechInputManager::~ExtensionSpeechInputManager() {
+SpeechInputExtensionManager::~SpeechInputExtensionManager() {
}
-ExtensionSpeechInputManager* ExtensionSpeechInputManager::GetForProfile(
+SpeechInputExtensionManager* SpeechInputExtensionManager::GetForProfile(
Profile* profile) {
- ExtensionSpeechInputManagerWrapper *wrapper =
+ SpeechInputExtensionManagerWrapper *wrapper =
Factory::GetInstance()->GetForProfile(profile);
if (!wrapper)
return NULL;
return wrapper->manager();
}
-void ExtensionSpeechInputManager::InitializeFactory() {
+void SpeechInputExtensionManager::InitializeFactory() {
Factory::Initialize();
}
-void ExtensionSpeechInputManager::Observe(int type,
+void SpeechInputExtensionManager::Observe(int type,
const content::NotificationSource& source,
const content::NotificationDetails& details) {
if (type == chrome::NOTIFICATION_EXTENSION_UNLOADED) {
@@ -150,15 +173,16 @@ void ExtensionSpeechInputManager::Observe(int type,
}
}
-void ExtensionSpeechInputManager::ShutdownOnUIThread() {
+void SpeechInputExtensionManager::ShutdownOnUIThread() {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
VLOG(1) << "Profile shutting down.";
base::AutoLock auto_lock(state_lock_);
DCHECK(state_ != kShutdown);
if (state_ != kIdle) {
+ notification_.Hide();
BrowserThread::PostTask(BrowserThread::IO, FROM_HERE,
- base::Bind(&ExtensionSpeechInputManager::ForceStopOnIOThread, this));
+ base::Bind(&SpeechInputExtensionManager::ForceStopOnIOThread, this));
}
state_ = kShutdown;
VLOG(1) << "Entering the shutdown sink state.";
@@ -166,7 +190,7 @@ void ExtensionSpeechInputManager::ShutdownOnUIThread() {
profile_ = NULL;
}
-void ExtensionSpeechInputManager::ExtensionUnloaded(
+void SpeechInputExtensionManager::ExtensionUnloaded(
const std::string& extension_id) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
@@ -178,28 +202,28 @@ void ExtensionSpeechInputManager::ExtensionUnloaded(
if (extension_id_in_use_ == extension_id) {
if (state_ != kIdle) {
BrowserThread::PostTask(BrowserThread::IO, FROM_HERE,
- base::Bind(&ExtensionSpeechInputManager::ForceStopOnIOThread, this));
+ base::Bind(&SpeechInputExtensionManager::ForceStopOnIOThread, this));
}
}
}
-void ExtensionSpeechInputManager::SetExtensionSpeechInterface(
- ExtensionSpeechInterface* interface) {
+void SpeechInputExtensionManager::SetSpeechExtensionInterface(
+ SpeechExtensionInterface* interface) {
speech_interface_ = interface;
}
-ExtensionSpeechInterface*
- ExtensionSpeechInputManager::GetExtensionSpeechInterface() {
+SpeechExtensionInterface*
+ SpeechInputExtensionManager::GetSpeechExtensionInterface() {
return speech_interface_ ? speech_interface_ : this;
}
-void ExtensionSpeechInputManager::ResetToIdleState() {
+void SpeechInputExtensionManager::ResetToIdleState() {
VLOG(1) << "State changed to idle. Deassociating any extensions.";
state_ = kIdle;
extension_id_in_use_.clear();
}
-void ExtensionSpeechInputManager::SetRecognitionResult(
+void SpeechInputExtensionManager::SetRecognitionResult(
int caller_id,
const SpeechInputResult& result) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
@@ -211,11 +235,11 @@ void ExtensionSpeechInputManager::SetRecognitionResult(
ForceStopOnIOThread();
BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
- base::Bind(&ExtensionSpeechInputManager::SetRecognitionResultOnUIThread,
+ base::Bind(&SpeechInputExtensionManager::SetRecognitionResultOnUIThread,
this, result, extension_id));
}
-void ExtensionSpeechInputManager::SetRecognitionResultOnUIThread(
+void SpeechInputExtensionManager::SetRecognitionResultOnUIThread(
const SpeechInputResult& result, const std::string& extension_id) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
@@ -224,7 +248,7 @@ void ExtensionSpeechInputManager::SetRecognitionResultOnUIThread(
args.Append(js_event);
ListValue* js_hypothesis_array = new ListValue();
- js_event->Set(constants::kHypothesesKey, js_hypothesis_array);
+ js_event->Set(kHypothesesKey, js_hypothesis_array);
for (size_t i = 0; i < result.hypotheses.size(); ++i) {
const SpeechInputHypothesis& hypothesis = result.hypotheses[i];
@@ -232,37 +256,37 @@ void ExtensionSpeechInputManager::SetRecognitionResultOnUIThread(
DictionaryValue* js_hypothesis_object = new DictionaryValue();
js_hypothesis_array->Append(js_hypothesis_object);
- js_hypothesis_object->SetString(constants::kUtteranceKey,
+ js_hypothesis_object->SetString(kUtteranceKey,
UTF16ToUTF8(hypothesis.utterance));
- js_hypothesis_object->SetDouble(constants::kConfidenceKey,
+ js_hypothesis_object->SetDouble(kConfidenceKey,
hypothesis.confidence);
}
std::string json_args;
base::JSONWriter::Write(&args, false, &json_args);
VLOG(1) << "Results: " << json_args;
- DispatchEventToExtension(extension_id, constants::kOnResultEvent, json_args);
+ DispatchEventToExtension(extension_id, kOnResultEvent, json_args);
}
-void ExtensionSpeechInputManager::DidStartReceivingAudio(int caller_id) {
+void SpeechInputExtensionManager::DidStartReceivingAudio(int caller_id) {
VLOG(1) << "DidStartReceivingAudio";
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
DCHECK_EQ(caller_id, kSpeechCallerId);
BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
- base::Bind(&ExtensionSpeechInputManager::DidStartReceivingAudioOnUIThread,
+ base::Bind(&SpeechInputExtensionManager::DidStartReceivingAudioOnUIThread,
this));
}
-void ExtensionSpeechInputManager::DidCompleteRecording(int caller_id) {
+void SpeechInputExtensionManager::DidCompleteRecording(int caller_id) {
DCHECK_EQ(caller_id, kSpeechCallerId);
}
-void ExtensionSpeechInputManager::DidCompleteRecognition(int caller_id) {
+void SpeechInputExtensionManager::DidCompleteRecognition(int caller_id) {
DCHECK_EQ(caller_id, kSpeechCallerId);
}
-void ExtensionSpeechInputManager::DidStartReceivingAudioOnUIThread() {
+void SpeechInputExtensionManager::DidStartReceivingAudioOnUIThread() {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
base::AutoLock auto_lock(state_lock_);
@@ -273,6 +297,20 @@ void ExtensionSpeechInputManager::DidStartReceivingAudioOnUIThread() {
VLOG(1) << "State changed to recording";
state_ = kRecording;
+ const Extension* extension = profile_->GetExtensionService()->
+ GetExtensionById(extension_id_in_use_, true);
+ DCHECK(extension);
+
+ bool show_notification = !profile_->GetPrefs()->GetBoolean(
+ prefs::kSpeechInputTrayNotificationShown);
+
+ notification_.Show(extension, show_notification);
+
+ if (show_notification) {
+ profile_->GetPrefs()->SetBoolean(
+ prefs::kSpeechInputTrayNotificationShown, true);
+ }
+
VLOG(1) << "Sending start notification";
content::NotificationService::current()->Notify(
chrome::NOTIFICATION_EXTENSION_SPEECH_INPUT_RECORDING_STARTED,
@@ -280,7 +318,7 @@ void ExtensionSpeechInputManager::DidStartReceivingAudioOnUIThread() {
content::Details<std::string>(&extension_id_in_use_));
}
-void ExtensionSpeechInputManager::OnRecognizerError(
+void SpeechInputExtensionManager::OnRecognizerError(
int caller_id, SpeechInputError error) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
DCHECK_EQ(caller_id, kSpeechCallerId);
@@ -291,7 +329,7 @@ void ExtensionSpeechInputManager::OnRecognizerError(
return;
// Release the recognizer object.
- GetExtensionSpeechInterface()->StopRecording(true);
+ GetSpeechExtensionInterface()->StopRecording(true);
std::string event_error_code;
bool report_to_event = true;
@@ -302,30 +340,30 @@ void ExtensionSpeechInputManager::OnRecognizerError(
case kErrorAudio:
if (state_ == kStarting) {
- event_error_code = constants::kErrorUnableToStart;
+ event_error_code = kErrorUnableToStart;
report_to_event = false;
} else {
- event_error_code = constants::kErrorCaptureError;
+ event_error_code = kErrorCaptureError;
}
break;
case kErrorNetwork:
- event_error_code = constants::kErrorNetworkError;
+ event_error_code = kErrorNetworkError;
break;
case kErrorBadGrammar:
// No error is returned on invalid language, for example.
// To avoid confusion about when this is would be fired, the invalid
// params error is not being exposed to the onError event.
- event_error_code = constants::kErrorUnableToStart;
+ event_error_code = kErrorUnableToStart;
break;
case kErrorNoSpeech:
- event_error_code = constants::kErrorNoSpeechHeard;
+ event_error_code = kErrorNoSpeechHeard;
break;
case kErrorNoMatch:
- event_error_code = constants::kErrorNoResults;
+ event_error_code = kErrorNoResults;
break;
// The remaining kErrorAborted case should never be returned by the server.
@@ -335,41 +373,41 @@ void ExtensionSpeechInputManager::OnRecognizerError(
if (!event_error_code.empty()) {
BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
- base::Bind(&ExtensionSpeechInputManager::DispatchError,
+ base::Bind(&SpeechInputExtensionManager::DispatchError,
this, event_error_code, report_to_event));
}
}
-void ExtensionSpeechInputManager::DidCompleteEnvironmentEstimation(
+void SpeechInputExtensionManager::DidCompleteEnvironmentEstimation(
int caller_id) {
DCHECK_EQ(caller_id, kSpeechCallerId);
}
-void ExtensionSpeechInputManager::DidStartReceivingSpeech(int caller_id) {
+void SpeechInputExtensionManager::DidStartReceivingSpeech(int caller_id) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
DCHECK_EQ(caller_id, kSpeechCallerId);
VLOG(1) << "DidStartReceivingSpeech";
std::string json_args;
BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
- base::Bind(&ExtensionSpeechInputManager::DispatchEventToExtension,
- this, extension_id_in_use_, std::string(constants::kOnSoundStartEvent),
+ base::Bind(&SpeechInputExtensionManager::DispatchEventToExtension,
+ this, extension_id_in_use_, std::string(kOnSoundStartEvent),
json_args));
}
-void ExtensionSpeechInputManager::DidStopReceivingSpeech(int caller_id) {
+void SpeechInputExtensionManager::DidStopReceivingSpeech(int caller_id) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
DCHECK_EQ(caller_id, kSpeechCallerId);
VLOG(1) << "DidStopReceivingSpeech";
std::string json_args;
BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
- base::Bind(&ExtensionSpeechInputManager::DispatchEventToExtension,
- this, extension_id_in_use_, std::string(constants::kOnSoundEndEvent),
+ base::Bind(&SpeechInputExtensionManager::DispatchEventToExtension,
+ this, extension_id_in_use_, std::string(kOnSoundEndEvent),
json_args));
}
-void ExtensionSpeechInputManager::DispatchEventToExtension(
+void SpeechInputExtensionManager::DispatchEventToExtension(
const std::string& extension_id, const std::string& event,
const std::string& json_args) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
@@ -392,7 +430,7 @@ void ExtensionSpeechInputManager::DispatchEventToExtension(
}
}
-void ExtensionSpeechInputManager::DispatchError(
+void SpeechInputExtensionManager::DispatchError(
const std::string& error, bool dispatch_event) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
@@ -402,6 +440,9 @@ void ExtensionSpeechInputManager::DispatchError(
if (state_ == kShutdown)
return;
+ if (state_ == kRecording)
+ notification_.Hide();
+
extension_id = extension_id_in_use_;
ResetToIdleState();
@@ -418,15 +459,15 @@ void ExtensionSpeechInputManager::DispatchError(
ListValue args;
DictionaryValue *js_error = new DictionaryValue();
args.Append(js_error);
- js_error->SetString(constants::kErrorCodeKey, error);
+ js_error->SetString(kErrorCodeKey, error);
std::string json_args;
base::JSONWriter::Write(&args, false, &json_args);
DispatchEventToExtension(extension_id,
- constants::kOnErrorEvent, json_args);
+ kOnErrorEvent, json_args);
}
}
-bool ExtensionSpeechInputManager::Start(const std::string& extension_id,
+bool SpeechInputExtensionManager::Start(const std::string& extension_id,
const std::string& language, const std::string& grammar,
bool filter_profanities, std::string* error) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
@@ -436,7 +477,7 @@ bool ExtensionSpeechInputManager::Start(const std::string& extension_id,
base::AutoLock auto_lock(state_lock_);
if (state_ == kShutdown ||
(!extension_id_in_use_.empty() && extension_id_in_use_ != extension_id)) {
- *error = constants::kErrorRequestDenied;
+ *error = kErrorRequestDenied;
return false;
}
@@ -445,12 +486,12 @@ bool ExtensionSpeechInputManager::Start(const std::string& extension_id,
break;
case kStarting:
- *error = constants::kErrorRequestInProgress;
+ *error = kErrorRequestInProgress;
return false;
case kRecording:
case kStopping:
- *error = constants::kErrorInvalidOperation;
+ *error = kErrorInvalidOperation;
return false;
default:
@@ -462,12 +503,12 @@ bool ExtensionSpeechInputManager::Start(const std::string& extension_id,
state_ = kStarting;
BrowserThread::PostTask(BrowserThread::IO, FROM_HERE,
- base::Bind(&ExtensionSpeechInputManager::StartOnIOThread, this,
+ base::Bind(&SpeechInputExtensionManager::StartOnIOThread, this,
profile_->GetRequestContext(), language, grammar, filter_profanities));
return true;
}
-void ExtensionSpeechInputManager::StartOnIOThread(
+void SpeechInputExtensionManager::StartOnIOThread(
net::URLRequestContextGetter* context_getter,
const std::string& language, const std::string& grammar,
bool filter_profanities) {
@@ -481,38 +522,38 @@ void ExtensionSpeechInputManager::StartOnIOThread(
if (state_ == kShutdown)
return;
- if (!GetExtensionSpeechInterface()->HasAudioInputDevices()) {
+ if (!GetSpeechExtensionInterface()->HasAudioInputDevices()) {
BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
- base::Bind(&ExtensionSpeechInputManager::DispatchError, this,
- std::string(constants::kErrorNoRecordingDeviceFound), false));
+ base::Bind(&SpeechInputExtensionManager::DispatchError, this,
+ std::string(kErrorNoRecordingDeviceFound), false));
return;
}
- if (GetExtensionSpeechInterface()->IsRecordingInProcess()) {
+ if (GetSpeechExtensionInterface()->IsRecordingInProcess()) {
BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
- base::Bind(&ExtensionSpeechInputManager::DispatchError, this,
- std::string(constants::kErrorRecordingDeviceInUse), false));
+ base::Bind(&SpeechInputExtensionManager::DispatchError, this,
+ std::string(kErrorRecordingDeviceInUse), false));
return;
}
- GetExtensionSpeechInterface()->StartRecording(this, context_getter,
+ GetSpeechExtensionInterface()->StartRecording(this, context_getter,
kSpeechCallerId, language, grammar, filter_profanities);
}
-bool ExtensionSpeechInputManager::HasAudioInputDevices() {
+bool SpeechInputExtensionManager::HasAudioInputDevices() {
return AudioManager::GetAudioManager()->HasAudioInputDevices();
}
-bool ExtensionSpeechInputManager::IsRecordingInProcess() {
+bool SpeechInputExtensionManager::IsRecordingInProcess() {
// Thread-safe query.
return AudioManager::GetAudioManager()->IsRecordingInProcess();
}
-bool ExtensionSpeechInputManager::IsRecording() {
- return GetExtensionSpeechInterface()->IsRecordingInProcess();
+bool SpeechInputExtensionManager::IsRecording() {
+ return GetSpeechExtensionInterface()->IsRecordingInProcess();
}
-void ExtensionSpeechInputManager::StartRecording(
+void SpeechInputExtensionManager::StartRecording(
speech_input::SpeechRecognizerDelegate* delegate,
net::URLRequestContextGetter* context_getter, int caller_id,
const std::string& language, const std::string& grammar,
@@ -523,12 +564,12 @@ void ExtensionSpeechInputManager::StartRecording(
recognizer_->StartRecording();
}
-bool ExtensionSpeechInputManager::HasValidRecognizer() {
+bool SpeechInputExtensionManager::HasValidRecognizer() {
// Conditional expression used to avoid a performance warning on windows.
return recognizer_ ? true : false;
}
-bool ExtensionSpeechInputManager::Stop(const std::string& extension_id,
+bool SpeechInputExtensionManager::Stop(const std::string& extension_id,
std::string* error) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
DCHECK(error);
@@ -537,7 +578,7 @@ bool ExtensionSpeechInputManager::Stop(const std::string& extension_id,
base::AutoLock auto_lock(state_lock_);
if (state_ == kShutdown ||
(!extension_id_in_use_.empty() && extension_id_in_use_ != extension_id)) {
- *error = constants::kErrorRequestDenied;
+ *error = kErrorRequestDenied;
return false;
}
@@ -546,12 +587,12 @@ bool ExtensionSpeechInputManager::Stop(const std::string& extension_id,
break;
case kStopping:
- *error = constants::kErrorRequestInProgress;
+ *error = kErrorRequestInProgress;
return false;
case kIdle:
case kStarting:
- *error = constants::kErrorInvalidOperation;
+ *error = kErrorInvalidOperation;
return false;
default:
@@ -559,33 +600,33 @@ bool ExtensionSpeechInputManager::Stop(const std::string& extension_id,
}
// Guarded by the state lock.
- DCHECK(GetExtensionSpeechInterface()->HasValidRecognizer());
+ DCHECK(GetSpeechExtensionInterface()->HasValidRecognizer());
VLOG(1) << "State changed to stopping";
state_ = kStopping;
BrowserThread::PostTask(BrowserThread::IO, FROM_HERE,
- base::Bind(&ExtensionSpeechInputManager::ForceStopOnIOThread, this));
+ base::Bind(&SpeechInputExtensionManager::ForceStopOnIOThread, this));
return true;
}
-void ExtensionSpeechInputManager::ForceStopOnIOThread() {
+void SpeechInputExtensionManager::ForceStopOnIOThread() {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
VLOG(1) << "Requesting forced stop (IO thread)";
base::AutoLock auto_lock(state_lock_);
DCHECK(state_ != kIdle);
- GetExtensionSpeechInterface()->StopRecording(false);
+ GetSpeechExtensionInterface()->StopRecording(false);
if (state_ == kShutdown)
return;
BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
- base::Bind(&ExtensionSpeechInputManager::StopSucceededOnUIThread, this));
+ base::Bind(&SpeechInputExtensionManager::StopSucceededOnUIThread, this));
}
-void ExtensionSpeechInputManager::StopRecording(bool recognition_failed) {
+void SpeechInputExtensionManager::StopRecording(bool recognition_failed) {
if (recognizer_) {
// Recognition is already cancelled in case of failure.
// Double-cancelling leads to assertion failures.
@@ -595,7 +636,7 @@ void ExtensionSpeechInputManager::StopRecording(bool recognition_failed) {
}
}
-void ExtensionSpeechInputManager::StopSucceededOnUIThread() {
+void SpeechInputExtensionManager::StopSucceededOnUIThread() {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
VLOG(1) << "Stop succeeded (UI thread)";
@@ -606,9 +647,27 @@ void ExtensionSpeechInputManager::StopSucceededOnUIThread() {
std::string extension_id = extension_id_in_use_;
ResetToIdleState();
+ notification_.Hide();
+
content::NotificationService::current()->Notify(
chrome::NOTIFICATION_EXTENSION_SPEECH_INPUT_RECORDING_STOPPED,
// Guarded by the state_ == kShutdown check.
content::Source<Profile>(profile_),
content::Details<std::string>(&extension_id));
}
+
+void SpeechInputExtensionManager::SetInputVolume(int caller_id,
+ float volume,
+ float noise_volume) {
+ DCHECK_EQ(caller_id, kSpeechCallerId);
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
+ BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
+ base::Bind(&SpeechInputExtensionManager::SetInputVolumeOnUIThread,
+ this, volume));
+}
+
+void SpeechInputExtensionManager::SetInputVolumeOnUIThread(
+ float volume) {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+ notification_.SetVUMeterVolume(volume);
+}

Powered by Google App Engine
This is Rietveld 408576698