start_page_handler.cc revision f8ee788a64d60abd8f2d742a5fdedde054ecd910
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" 13c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "chrome/browser/omaha_query_params/omaha_query_params.h" 144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chrome/browser/profiles/profile.h" 155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/search/hotword_service.h" 164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chrome/browser/ui/app_list/app_list_controller_delegate.h" 174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chrome/browser/ui/app_list/app_list_service.h" 184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chrome/browser/ui/app_list/recommended_apps.h" 194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chrome/browser/ui/app_list/start_page_service.h" 201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "chrome/browser/ui/host_desktop.h" 214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chrome/browser/ui/webui/extensions/extension_icon_source.h" 225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/common/pref_names.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) 38010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)const char kOldHotwordExtensionVersionString[] = "0.1.1.5014_0"; 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( 147010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::Version(kOldHotwordExtensionVersionString)) <= 0) { 148010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) StartPageService* service = StartPageService::Get(profile); 149010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) web_ui()->CallJavascriptFunction( 150010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) "appList.startPage.setHotwordEnabled", 151010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::FundamentalValue(service->HotwordEnabled())); 152010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 1535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif 1555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void StartPageHandler::HandleInitialize(const base::ListValue* args) { 1574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) Profile* profile = Profile::FromWebUI(web_ui()); 1584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) StartPageService* service = StartPageService::Get(profile); 1594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (!service) 1604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return; 1614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) recommended_apps_ = service->recommended_apps(); 1634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) recommended_apps_->AddObserver(this); 1644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) SendRecommendedApps(); 1665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_CHROMEOS) 1685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (app_list::switches::IsVoiceSearchEnabled() && 169a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) HotwordService::DoesHotwordSupportLanguage(profile)) { 1705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OnHotwordEnabledChanged(); 1715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) pref_change_registrar_.Init(profile->GetPrefs()); 1725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) pref_change_registrar_.Add( 1735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prefs::kHotwordSearchEnabled, 1745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Bind(&StartPageHandler::OnHotwordEnabledChanged, 1755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Unretained(this))); 176cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 177cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) extension_registry_observer_.Add( 178cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) extensions::ExtensionRegistry::Get(profile)); 1795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif 1814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 182c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch web_ui()->CallJavascriptFunction( 183c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch "appList.startPage.setNaclArch", 184c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch base::StringValue(chrome::OmahaQueryParams::GetNaclArch())); 185c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 186c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (!app_list::switches::IsExperimentalAppListEnabled()) { 187c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch web_ui()->CallJavascriptFunction( 188c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch "appList.startPage.onAppListShown", 189c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch base::FundamentalValue(service->HotwordEnabled())); 190c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 191a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 192a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void StartPageHandler::HandleLaunchApp(const base::ListValue* args) { 1944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) std::string app_id; 1954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) CHECK(args->GetString(0, &app_id)); 1964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) Profile* profile = Profile::FromWebUI(web_ui()); 198cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const extensions::Extension* app = 199cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) extensions::ExtensionRegistry::Get(profile) 200cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ->GetExtensionById(app_id, extensions::ExtensionRegistry::EVERYTHING); 2014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (!app) { 2024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) NOTREACHED(); 2034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return; 2044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 2054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 206f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) AppListControllerDelegate* controller = AppListService::Get( 2071e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) chrome::GetHostDesktopTypeForNativeView( 208010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) web_ui()->GetWebContents()->GetNativeView()))-> 209010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GetControllerDelegate(); 2104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) controller->ActivateApp(profile, 2114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) app, 2124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) AppListControllerDelegate::LAUNCH_FROM_APP_LIST, 2134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ui::EF_NONE); 2144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 2154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 216a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void StartPageHandler::HandleSpeechResult(const base::ListValue* args) { 217f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::string16 query; 218a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool is_final = false; 219f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) CHECK(args->GetString(0, &query)); 220a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) CHECK(args->GetBoolean(1, &is_final)); 221f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 222a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) StartPageService::Get(Profile::FromWebUI(web_ui()))->OnSpeechResult( 223a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) query, is_final); 224a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 225a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 226a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void StartPageHandler::HandleSpeechSoundLevel(const base::ListValue* args) { 227a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) double level; 228a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) CHECK(args->GetDouble(0, &level)); 229a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 230a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) StartPageService* service = 231a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) StartPageService::Get(Profile::FromWebUI(web_ui())); 2325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (service) 2335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) service->OnSpeechSoundLevelChanged(static_cast<int16>(level)); 234f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 235f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 236f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void StartPageHandler::HandleSpeechRecognition(const base::ListValue* args) { 237a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) std::string state_string; 238a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) CHECK(args->GetString(0, &state_string)); 239a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 2405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SpeechRecognitionState new_state = SPEECH_RECOGNITION_OFF; 2415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (state_string == "READY") 2425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) new_state = SPEECH_RECOGNITION_READY; 2435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) else if (state_string == "HOTWORD_RECOGNIZING") 2445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) new_state = SPEECH_RECOGNITION_HOTWORD_LISTENING; 2455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) else if (state_string == "RECOGNIZING") 2465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) new_state = SPEECH_RECOGNITION_RECOGNIZING; 2475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) else if (state_string == "IN_SPEECH") 248a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) new_state = SPEECH_RECOGNITION_IN_SPEECH; 2495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) else if (state_string == "STOPPING") 2505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) new_state = SPEECH_RECOGNITION_STOPPING; 251f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) else if (state_string == "NETWORK_ERROR") 252f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) new_state = SPEECH_RECOGNITION_NETWORK_ERROR; 253f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 254c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch StartPageService* service = 255c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch StartPageService::Get(Profile::FromWebUI(web_ui())); 2565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (service) 2575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) service->OnSpeechRecognitionStateChanged(new_state); 258f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 259f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 2604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} // namespace app_list 261