start_page_handler.cc revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
19720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Copyright 2013 The Chromium Authors. All rights reserved.
29720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Use of this source code is governed by a BSD-style license that can be
39720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// found in the LICENSE file.
49720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
59720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#include "chrome/browser/ui/webui/app_list/start_page_handler.h"
69720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
79720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#include <string>
89720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
99720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#include "base/bind.h"
109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#include "base/memory/scoped_ptr.h"
119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#include "base/prefs/pref_service.h"
129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#include "base/sys_info.h"
139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#include "base/values.h"
149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#include "chrome/browser/extensions/extension_service.h"
159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#include "chrome/browser/profiles/profile.h"
169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#include "chrome/browser/search/hotword_service.h"
179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#include "chrome/browser/ui/app_list/app_list_controller_delegate.h"
189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#include "chrome/browser/ui/app_list/app_list_service.h"
199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#include "chrome/browser/ui/app_list/recommended_apps.h"
209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#include "chrome/browser/ui/app_list/start_page_service.h"
219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#include "chrome/browser/ui/host_desktop.h"
229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#include "chrome/browser/ui/webui/extensions/extension_icon_source.h"
239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#include "chrome/common/extensions/extension_icon_set.h"
249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#include "chrome/common/pref_names.h"
259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#include "content/public/browser/web_contents_view.h"
269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#include "content/public/browser/web_ui.h"
279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#include "extensions/browser/extension_system.h"
289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#include "extensions/common/extension.h"
299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#include "ui/app_list/app_list_switches.h"
309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#include "ui/app_list/speech_ui_model_observer.h"
319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#include "ui/events/event_constants.h"
329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocknamespace app_list {
349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocknamespace {
369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockscoped_ptr<base::DictionaryValue> CreateAppInfo(
389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    const extensions::Extension* app) {
399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue);
409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  dict->SetString("appId", app->id());
419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  dict->SetString("textTitle", app->short_name());
429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  dict->SetString("title", app->name());
439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  const bool grayscale = false;
459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  bool icon_exists = true;
469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  GURL icon_url = extensions::ExtensionIconSource::GetIconURL(
479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      app,
489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      extension_misc::EXTENSION_ICON_MEDIUM,
499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      ExtensionIconSet::MATCH_BIGGER,
509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      grayscale,
519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      &icon_exists);
529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  dict->SetString("iconUrl", icon_url.spec());
539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return dict.Pass();
559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}  // namespace
589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve BlockStartPageHandler::StartPageHandler() : recommended_apps_(NULL) {}
609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve BlockStartPageHandler::~StartPageHandler() {
629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (recommended_apps_)
639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    recommended_apps_->RemoveObserver(this);
649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockvoid StartPageHandler::RegisterMessages() {
679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  web_ui()->RegisterMessageCallback(
689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      "initialize",
699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      base::Bind(&StartPageHandler::HandleInitialize, base::Unretained(this)));
709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  web_ui()->RegisterMessageCallback(
719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      "launchApp",
729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      base::Bind(&StartPageHandler::HandleLaunchApp, base::Unretained(this)));
739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  web_ui()->RegisterMessageCallback(
749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      "speechResult",
759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      base::Bind(&StartPageHandler::HandleSpeechResult,
769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                 base::Unretained(this)));
779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  web_ui()->RegisterMessageCallback(
789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      "speechSoundLevel",
799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      base::Bind(&StartPageHandler::HandleSpeechSoundLevel,
809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                 base::Unretained(this)));
819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  web_ui()->RegisterMessageCallback(
829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      "setSpeechRecognitionState",
839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      base::Bind(&StartPageHandler::HandleSpeechRecognition,
849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                 base::Unretained(this)));
859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockvoid StartPageHandler::OnRecommendedAppsChanged() {
889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  SendRecommendedApps();
899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockvoid StartPageHandler::SendRecommendedApps() {
929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  const RecommendedApps::Apps& recommends = recommended_apps_->apps();
939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  base::ListValue recommended_list;
959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  for (size_t i = 0; i < recommends.size(); ++i) {
969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    recommended_list.Append(CreateAppInfo(recommends[i].get()).release());
979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  web_ui()->CallJavascriptFunction("appList.startPage.setRecommendedApps",
1009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                   recommended_list);
1019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
1029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined(OS_CHROMEOS)
1049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbool StartPageHandler::HotwordEnabled() {
1059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  Profile* profile = Profile::FromWebUI(web_ui());
1069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return HotwordService::DoesHotwordSupportLanguage(profile) &&
1079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      profile->GetPrefs()->GetBoolean(prefs::kHotwordAppListEnabled);
1089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
1099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockvoid StartPageHandler::OnHotwordEnabledChanged() {
1119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  web_ui()->CallJavascriptFunction(
1129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      "appList.startPage.setHotwordEnabled",
1139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      base::FundamentalValue(HotwordEnabled()));
1149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
1159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockvoid StartPageHandler::SynchronizeHotwordEnabled() {
1179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  Profile* profile = Profile::FromWebUI(web_ui());
1189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  PrefService* pref_service = profile->GetPrefs();
1199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  const PrefService::Preference* pref =
1209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      pref_service->FindPreference(prefs::kHotwordSearchEnabled);
1219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (!pref || pref->IsDefaultValue())
1229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return;
1239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  bool search_enabled = false;
1259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (!pref->GetValue()->GetAsBoolean(&search_enabled))
1269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return;
1279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (pref_service->GetBoolean(prefs::kHotwordAppListEnabled) != search_enabled)
1299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    pref_service->SetBoolean(prefs::kHotwordAppListEnabled, search_enabled);
1309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
1319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
1329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockvoid StartPageHandler::HandleInitialize(const base::ListValue* args) {
1349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  Profile* profile = Profile::FromWebUI(web_ui());
1359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  StartPageService* service = StartPageService::Get(profile);
1369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (!service)
1379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return;
1389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  recommended_apps_ = service->recommended_apps();
1409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  recommended_apps_->AddObserver(this);
1419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  SendRecommendedApps();
1439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined(OS_CHROMEOS)
1459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (app_list::switches::IsVoiceSearchEnabled() &&
1469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      HotwordService::DoesHotwordSupportLanguage(profile) &&
1479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      base::SysInfo::IsRunningOnChromeOS()) {
1489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    SynchronizeHotwordEnabled();
1499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    OnHotwordEnabledChanged();
1509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    pref_change_registrar_.Init(profile->GetPrefs());
1519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    pref_change_registrar_.Add(
1529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        prefs::kHotwordSearchEnabled,
1539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        base::Bind(&StartPageHandler::SynchronizeHotwordEnabled,
1549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                   base::Unretained(this)));
1559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    pref_change_registrar_.Add(
1569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        prefs::kHotwordAppListEnabled,
1579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        base::Bind(&StartPageHandler::OnHotwordEnabledChanged,
1589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                   base::Unretained(this)));
1599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
1609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
1619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
1629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockvoid StartPageHandler::HandleLaunchApp(const base::ListValue* args) {
1649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  std::string app_id;
1659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  CHECK(args->GetString(0, &app_id));
1669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  Profile* profile = Profile::FromWebUI(web_ui());
1689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  ExtensionService* service =
1699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      extensions::ExtensionSystem::Get(profile)->extension_service();
1709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  const extensions::Extension* app = service->GetInstalledExtension(app_id);
1719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (!app) {
1729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    NOTREACHED();
1739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return;
1749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
1759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  AppListControllerDelegate* controller = AppListService::Get(
1779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      chrome::GetHostDesktopTypeForNativeView(
1789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          web_ui()->GetWebContents()->GetView()->GetNativeView()))
1799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      ->GetControllerDelegate();
1809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  controller->ActivateApp(profile,
1819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                          app,
1829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                          AppListControllerDelegate::LAUNCH_FROM_APP_LIST,
1839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                          ui::EF_NONE);
1849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
1859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockvoid StartPageHandler::HandleSpeechResult(const base::ListValue* args) {
1879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  base::string16 query;
1889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  bool is_final = false;
1899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  CHECK(args->GetString(0, &query));
1909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  CHECK(args->GetBoolean(1, &is_final));
1919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  StartPageService::Get(Profile::FromWebUI(web_ui()))->OnSpeechResult(
193e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      query, is_final);
194e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
195e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
196e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid StartPageHandler::HandleSpeechSoundLevel(const base::ListValue* args) {
1979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  double level;
1989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  CHECK(args->GetDouble(0, &level));
1999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  StartPageService* service =
2019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      StartPageService::Get(Profile::FromWebUI(web_ui()));
2029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (service)
2039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    service->OnSpeechSoundLevelChanged(static_cast<int16>(level));
2049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
2059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockvoid StartPageHandler::HandleSpeechRecognition(const base::ListValue* args) {
2079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  std::string state_string;
2089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  CHECK(args->GetString(0, &state_string));
2099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
210ee3d0ea50df7a77e11a83ad627d492b105e39207Elliott Hughes  SpeechRecognitionState new_state = SPEECH_RECOGNITION_OFF;
211ee3d0ea50df7a77e11a83ad627d492b105e39207Elliott Hughes  if (state_string == "READY")
2129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    new_state = SPEECH_RECOGNITION_READY;
2139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  else if (state_string == "HOTWORD_RECOGNIZING")
2149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    new_state = SPEECH_RECOGNITION_HOTWORD_LISTENING;
2159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  else if (state_string == "RECOGNIZING")
2169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    new_state = SPEECH_RECOGNITION_RECOGNIZING;
2179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  else if (state_string == "IN_SPEECH")
2189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    new_state = SPEECH_RECOGNITION_IN_SPEECH;
2199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  else if (state_string == "STOPPING")
2209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    new_state = SPEECH_RECOGNITION_STOPPING;
2219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  StartPageService* service =
2239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      StartPageService::Get(Profile::FromWebUI(web_ui()));
2249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (service)
2259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    service->OnSpeechRecognitionStateChanged(new_state);
226ee3d0ea50df7a77e11a83ad627d492b105e39207Elliott Hughes}
227ee3d0ea50df7a77e11a83ad627d492b105e39207Elliott Hughes
228ee3d0ea50df7a77e11a83ad627d492b105e39207Elliott Hughes}  // namespace app_list
229ee3d0ea50df7a77e11a83ad627d492b105e39207Elliott Hughes