start_page_handler.cc revision 03b57e008b61dfcb1fbad3aea950ae0e001748b0
14e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
24e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
34e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// found in the LICENSE file.
44e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
54e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chrome/browser/ui/webui/app_list/start_page_handler.h"
64e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
74e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include <string>
84e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
94e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "base/bind.h"
104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "base/memory/scoped_ptr.h"
114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "base/values.h"
12cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/version.h"
134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chrome/browser/profiles/profile.h"
145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/search/hotword_service.h"
154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chrome/browser/ui/app_list/app_list_controller_delegate.h"
164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chrome/browser/ui/app_list/app_list_service.h"
174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chrome/browser/ui/app_list/recommended_apps.h"
184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chrome/browser/ui/app_list/start_page_service.h"
191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "chrome/browser/ui/host_desktop.h"
204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chrome/browser/ui/webui/extensions/extension_icon_source.h"
215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/common/pref_names.h"
22116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/omaha_query_params/omaha_query_params.h"
234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "content/public/browser/web_ui.h"
24cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "extensions/browser/extension_registry.h"
255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/browser/extension_system.h"
26cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "extensions/common/constants.h"
27f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/extension.h"
28c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "extensions/common/extension_icon_set.h"
295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/app_list/app_list_switches.h"
30c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "ui/app_list/speech_ui_model_observer.h"
314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "ui/events/event_constants.h"
324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)namespace app_list {
344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)namespace {
364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
37010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#if defined(OS_CHROMEOS)
38116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst char kOldHotwordExtensionVersionString[] = "0.1.1.5023";
39010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#endif
40010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)scoped_ptr<base::DictionaryValue> CreateAppInfo(
424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    const extensions::Extension* app) {
434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue);
444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  dict->SetString("appId", app->id());
454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  dict->SetString("textTitle", app->short_name());
464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  dict->SetString("title", app->name());
474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  const bool grayscale = false;
494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  bool icon_exists = true;
504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  GURL icon_url = extensions::ExtensionIconSource::GetIconURL(
514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      app,
524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      extension_misc::EXTENSION_ICON_MEDIUM,
534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      ExtensionIconSet::MATCH_BIGGER,
544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      grayscale,
554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      &icon_exists);
564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  dict->SetString("iconUrl", icon_url.spec());
574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  return dict.Pass();
594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}  // namespace
624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
63cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)StartPageHandler::StartPageHandler()
64cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    : recommended_apps_(NULL),
65cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      extension_registry_observer_(this) {
66cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)StartPageHandler::~StartPageHandler() {
694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (recommended_apps_)
704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    recommended_apps_->RemoveObserver(this);
714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void StartPageHandler::RegisterMessages() {
744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  web_ui()->RegisterMessageCallback(
754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      "initialize",
764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      base::Bind(&StartPageHandler::HandleInitialize, base::Unretained(this)));
774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  web_ui()->RegisterMessageCallback(
784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      "launchApp",
794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      base::Bind(&StartPageHandler::HandleLaunchApp, base::Unretained(this)));
80f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  web_ui()->RegisterMessageCallback(
81a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      "speechResult",
82a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      base::Bind(&StartPageHandler::HandleSpeechResult,
83a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                 base::Unretained(this)));
84a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  web_ui()->RegisterMessageCallback(
85a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      "speechSoundLevel",
86a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      base::Bind(&StartPageHandler::HandleSpeechSoundLevel,
87a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                 base::Unretained(this)));
88f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  web_ui()->RegisterMessageCallback(
89f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "setSpeechRecognitionState",
90f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      base::Bind(&StartPageHandler::HandleSpeechRecognition,
91f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                 base::Unretained(this)));
924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
94cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void StartPageHandler::OnExtensionLoaded(
95cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    content::BrowserContext* browser_context,
96cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const extensions::Extension* extension) {
97a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#if defined(OS_CHROMEOS)
98a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DCHECK_EQ(Profile::FromWebUI(web_ui()),
99cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)            Profile::FromBrowserContext(browser_context));
100cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (extension->id() == extension_misc::kHotwordExtensionId)
101cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    OnHotwordEnabledChanged();
102cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif
103cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
104cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
105cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void StartPageHandler::OnExtensionUnloaded(
106cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    content::BrowserContext* browser_context,
107cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const extensions::Extension* extension,
108cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    extensions::UnloadedExtensionInfo::Reason reason) {
109cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#if defined(OS_CHROMEOS)
110cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DCHECK_EQ(Profile::FromWebUI(web_ui()),
111cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)            Profile::FromBrowserContext(browser_context));
112cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (extension->id() == extension_misc::kHotwordExtensionId)
113cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    OnHotwordEnabledChanged();
114a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#endif
115a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
116a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void StartPageHandler::OnRecommendedAppsChanged() {
1184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  SendRecommendedApps();
1194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
1204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void StartPageHandler::SendRecommendedApps() {
1224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  const RecommendedApps::Apps& recommends = recommended_apps_->apps();
1234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  base::ListValue recommended_list;
1254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  for (size_t i = 0; i < recommends.size(); ++i) {
1264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    recommended_list.Append(CreateAppInfo(recommends[i].get()).release());
1274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
1284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  web_ui()->CallJavascriptFunction("appList.startPage.setRecommendedApps",
1304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                   recommended_list);
1314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
1324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_CHROMEOS)
1345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void StartPageHandler::OnHotwordEnabledChanged() {
135010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // If the hotword extension is new enough, we should use the new
136010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // hotwordPrivate API to provide the feature.
137010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // TODO(mukai): remove this after everything gets stable.
138010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  Profile* profile = Profile::FromWebUI(web_ui());
139010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
140cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  extensions::ExtensionRegistry* registry =
141cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      extensions::ExtensionRegistry::Get(profile);
142010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  const extensions::Extension* hotword_extension =
143cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      registry->GetExtensionById(extension_misc::kHotwordExtensionId,
144cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                 extensions::ExtensionRegistry::ENABLED);
145cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (hotword_extension &&
146cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      hotword_extension->version()->CompareTo(
14703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)          base::Version(kOldHotwordExtensionVersionString)) <= 0 &&
14803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      !HotwordService::IsExperimentalHotwordingEnabled()) {
149010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    StartPageService* service = StartPageService::Get(profile);
150010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    web_ui()->CallJavascriptFunction(
151010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        "appList.startPage.setHotwordEnabled",
152010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        base::FundamentalValue(service->HotwordEnabled()));
153010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
1545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif
1565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void StartPageHandler::HandleInitialize(const base::ListValue* args) {
1584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  Profile* profile = Profile::FromWebUI(web_ui());
1594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  StartPageService* service = StartPageService::Get(profile);
1604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (!service)
1614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return;
1624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  recommended_apps_ = service->recommended_apps();
1644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  recommended_apps_->AddObserver(this);
1654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  SendRecommendedApps();
1675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_CHROMEOS)
1695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (app_list::switches::IsVoiceSearchEnabled() &&
170a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      HotwordService::DoesHotwordSupportLanguage(profile)) {
1715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    OnHotwordEnabledChanged();
1725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    pref_change_registrar_.Init(profile->GetPrefs());
1735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    pref_change_registrar_.Add(
1745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        prefs::kHotwordSearchEnabled,
1755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        base::Bind(&StartPageHandler::OnHotwordEnabledChanged,
1765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                   base::Unretained(this)));
177cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
178cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    extension_registry_observer_.Add(
179cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        extensions::ExtensionRegistry::Get(profile));
1805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
182116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  extensions::ExtensionRegistry* registry =
183116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      extensions::ExtensionRegistry::Get(profile);
184116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  const extensions::Extension* hotword_extension =
185116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      registry->GetExtensionById(extension_misc::kHotwordExtensionId,
186116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                 extensions::ExtensionRegistry::ENABLED);
187116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (hotword_extension &&
188116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      hotword_extension->version()->CompareTo(
189116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          base::Version(kOldHotwordExtensionVersionString)) <= 0) {
190116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    web_ui()->CallJavascriptFunction(
191116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        "appList.startPage.setNaclArch",
192116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        base::StringValue(omaha_query_params::OmahaQueryParams::GetNaclArch()));
193116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
194116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif
195c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
196c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (!app_list::switches::IsExperimentalAppListEnabled()) {
19703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    // If experimental hotwording is enabled, don't enable hotwording in the
19803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    // start page, since the hotword extension is taking care of this.
19903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    bool hotword_enabled = service->HotwordEnabled() &&
20003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        !HotwordService::IsExperimentalHotwordingEnabled();
201c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    web_ui()->CallJavascriptFunction(
202c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        "appList.startPage.onAppListShown",
20303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        base::FundamentalValue(hotword_enabled));
204c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
205a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
206a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
2074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void StartPageHandler::HandleLaunchApp(const base::ListValue* args) {
2084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  std::string app_id;
2094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  CHECK(args->GetString(0, &app_id));
2104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  Profile* profile = Profile::FromWebUI(web_ui());
212cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const extensions::Extension* app =
213cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      extensions::ExtensionRegistry::Get(profile)
214cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          ->GetExtensionById(app_id, extensions::ExtensionRegistry::EVERYTHING);
2154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (!app) {
2164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    NOTREACHED();
2174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return;
2184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
2194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
220f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  AppListControllerDelegate* controller = AppListService::Get(
2211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      chrome::GetHostDesktopTypeForNativeView(
222010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          web_ui()->GetWebContents()->GetNativeView()))->
223010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              GetControllerDelegate();
2244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  controller->ActivateApp(profile,
2254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                          app,
2264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                          AppListControllerDelegate::LAUNCH_FROM_APP_LIST,
2274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                          ui::EF_NONE);
2284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
2294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
230a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void StartPageHandler::HandleSpeechResult(const base::ListValue* args) {
231f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  base::string16 query;
232a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  bool is_final = false;
233f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  CHECK(args->GetString(0, &query));
234a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  CHECK(args->GetBoolean(1, &is_final));
235f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
236a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  StartPageService::Get(Profile::FromWebUI(web_ui()))->OnSpeechResult(
237a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      query, is_final);
238a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
239a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
240a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void StartPageHandler::HandleSpeechSoundLevel(const base::ListValue* args) {
241a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  double level;
242a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  CHECK(args->GetDouble(0, &level));
243a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
244a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  StartPageService* service =
245a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      StartPageService::Get(Profile::FromWebUI(web_ui()));
2465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (service)
2475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    service->OnSpeechSoundLevelChanged(static_cast<int16>(level));
248f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
249f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
250f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void StartPageHandler::HandleSpeechRecognition(const base::ListValue* args) {
251a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  std::string state_string;
252a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  CHECK(args->GetString(0, &state_string));
253a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
2545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  SpeechRecognitionState new_state = SPEECH_RECOGNITION_OFF;
2555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (state_string == "READY")
2565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    new_state = SPEECH_RECOGNITION_READY;
2575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  else if (state_string == "HOTWORD_RECOGNIZING")
2585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    new_state = SPEECH_RECOGNITION_HOTWORD_LISTENING;
2595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  else if (state_string == "RECOGNIZING")
2605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    new_state = SPEECH_RECOGNITION_RECOGNIZING;
2615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  else if (state_string == "IN_SPEECH")
262a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    new_state = SPEECH_RECOGNITION_IN_SPEECH;
2635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  else if (state_string == "STOPPING")
2645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    new_state = SPEECH_RECOGNITION_STOPPING;
265f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  else if (state_string == "NETWORK_ERROR")
266f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    new_state = SPEECH_RECOGNITION_NETWORK_ERROR;
267f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
268c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  StartPageService* service =
269c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      StartPageService::Get(Profile::FromWebUI(web_ui()));
2705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (service)
2715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    service->OnSpeechRecognitionStateChanged(new_state);
272f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
273f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
2744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}  // namespace app_list
275