Index: chrome/browser/ui/app_list/start_page_service.cc |
diff --git a/chrome/browser/ui/app_list/start_page_service.cc b/chrome/browser/ui/app_list/start_page_service.cc |
index 3bf52716cae76ce23a0fb9bb3b43a12a1d3d475b..09c66ca0cf5e9bd799579033518de37491075e47 100644 |
--- a/chrome/browser/ui/app_list/start_page_service.cc |
+++ b/chrome/browser/ui/app_list/start_page_service.cc |
@@ -11,12 +11,14 @@ |
#include "base/memory/singleton.h" |
#include "base/metrics/user_metrics.h" |
#include "base/prefs/pref_service.h" |
+#include "chrome/browser/browser_process.h" |
#include "chrome/browser/chrome_notification_types.h" |
#include "chrome/browser/media/media_stream_infobar_delegate.h" |
#include "chrome/browser/profiles/profile.h" |
#include "chrome/browser/search/hotword_service.h" |
#include "chrome/browser/search/hotword_service_factory.h" |
#include "chrome/browser/ui/app_list/recommended_apps.h" |
+#include "chrome/browser/ui/app_list/speech_recognizer.h" |
#include "chrome/browser/ui/app_list/start_page_observer.h" |
#include "chrome/browser/ui/app_list/start_page_service_factory.h" |
#include "chrome/common/chrome_switches.h" |
@@ -112,7 +114,8 @@ StartPageService::StartPageService(Profile* profile) |
state_(app_list::SPEECH_RECOGNITION_OFF), |
speech_button_toggled_manually_(false), |
speech_result_obtained_(false), |
- webui_finished_loading_(false) { |
+ webui_finished_loading_(false), |
+ weak_factory_(this) { |
// If experimental hotwording is enabled, then we're always "ready". |
// Transitioning into the "hotword recognizing" state is handled by the |
// hotword extension. |
@@ -136,14 +139,14 @@ void StartPageService::RemoveObserver(StartPageObserver* observer) { |
void StartPageService::AppListShown() { |
if (!contents_) { |
LoadContents(); |
- } else if (contents_->GetWebUI()) { |
- // If experimental hotwording is enabled, don't enable hotwording in the |
- // start page, since the hotword extension is taking care of this. |
- bool hotword_enabled = HotwordEnabled() && |
- !HotwordService::IsExperimentalHotwordingEnabled(); |
+ } else if (contents_->GetWebUI() && |
+ !HotwordService::IsExperimentalHotwordingEnabled()) { |
+ // If experimental hotwording is enabled, don't call onAppListShown. |
+ // onAppListShown() initializes the web speech API, which is not used with |
+ // experimental hotwording. |
contents_->GetWebUI()->CallJavascriptFunction( |
"appList.startPage.onAppListShown", |
- base::FundamentalValue(hotword_enabled)); |
+ base::FundamentalValue(HotwordEnabled())); |
} |
} |
@@ -154,6 +157,11 @@ void StartPageService::AppListHidden() { |
} |
if (!app_list::switches::IsExperimentalAppListEnabled()) |
UnloadContents(); |
+ |
+ if (HotwordService::IsExperimentalHotwordingEnabled() && |
+ speech_recognizer_) { |
+ speech_recognizer_->Stop(); |
+ } |
} |
void StartPageService::ToggleSpeechRecognition() { |
@@ -162,14 +170,35 @@ void StartPageService::ToggleSpeechRecognition() { |
if (!contents_->GetWebUI()) |
return; |
- if (webui_finished_loading_) { |
- contents_->GetWebUI()->CallJavascriptFunction( |
- "appList.startPage.toggleSpeechRecognition"); |
- } else { |
+ if (!webui_finished_loading_) { |
pending_webui_callbacks_.push_back( |
base::Bind(&StartPageService::ToggleSpeechRecognition, |
base::Unretained(this))); |
+ return; |
} |
+ |
+ if (HotwordService::IsExperimentalHotwordingEnabled()) { |
+ if (!speech_recognizer_) { |
+ std::string profile_locale; |
+#if defined(OS_CHROMEOS) |
+ profile_locale = profile_->GetPrefs()->GetString( |
+ prefs::kApplicationLocale); |
+#endif |
+ if (profile_locale.empty()) |
+ profile_locale = g_browser_process->GetApplicationLocale(); |
+ |
+ speech_recognizer_.reset( |
+ new SpeechRecognizer(weak_factory_.GetWeakPtr(), |
+ profile_->GetRequestContext(), |
+ profile_locale)); |
+ } |
+ |
+ speech_recognizer_->Start(); |
+ return; |
+ } |
+ |
+ contents_->GetWebUI()->CallJavascriptFunction( |
+ "appList.startPage.toggleSpeechRecognition"); |
} |
bool StartPageService::HotwordEnabled() { |
@@ -212,7 +241,7 @@ void StartPageService::OnSpeechResult( |
OnSpeechResult(query, is_final)); |
} |
-void StartPageService::OnSpeechSoundLevelChanged(int16 level) { |
+void StartPageService::OnSpeechSoundLevelChanged(int16_t level) { |
FOR_EACH_OBSERVER(StartPageObserver, |
observers_, |
OnSpeechSoundLevelChanged(level)); |
@@ -220,6 +249,13 @@ void StartPageService::OnSpeechSoundLevelChanged(int16 level) { |
void StartPageService::OnSpeechRecognitionStateChanged( |
SpeechRecognitionState new_state) { |
+ |
+ if (HotwordService::IsExperimentalHotwordingEnabled() && |
+ new_state == SPEECH_RECOGNITION_READY && |
+ speech_recognizer_) { |
+ speech_recognizer_->Stop(); |
+ } |
+ |
if (!InSpeechRecognition(state_) && InSpeechRecognition(new_state)) { |
if (!speech_button_toggled_manually_ && |
state_ == SPEECH_RECOGNITION_HOTWORD_LISTENING) { |
@@ -239,6 +275,10 @@ void StartPageService::OnSpeechRecognitionStateChanged( |
OnSpeechRecognitionStateChanged(new_state)); |
} |
+content::WebContents* StartPageService::GetSpeechContents() { |
+ return GetSpeechRecognitionContents(); |
+} |
+ |
void StartPageService::Shutdown() { |
UnloadContents(); |
} |