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

Side by Side Diff: chrome/browser/search/hotword_service.cc

Issue 992173002: Delete the old hotwording integration. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@hotword-remove-disable-option
Patch Set: Rebase. Created 5 years, 9 months 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 unified diff | Download patch
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/search/hotword_service.h" 5 #include "chrome/browser/search/hotword_service.h"
6 6
7 #include <string> 7 #include <string>
8 8
9 #include "base/command_line.h" 9 #include "base/command_line.h"
10 #include "base/i18n/case_conversion.h" 10 #include "base/i18n/case_conversion.h"
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
90 }; 90 };
91 91
92 // Maximum number of retries for installing the hotword shared module from the 92 // Maximum number of retries for installing the hotword shared module from the
93 // web store. 93 // web store.
94 static const int kMaxInstallRetries = 2; 94 static const int kMaxInstallRetries = 2;
95 95
96 // Delay between retries for installing the hotword shared module from the web 96 // Delay between retries for installing the hotword shared module from the web
97 // store. 97 // store.
98 static const int kInstallRetryDelaySeconds = 5; 98 static const int kInstallRetryDelaySeconds = 5;
99 99
100 // The extension id of the old hotword voice search trigger extension.
101 const char kHotwordOldExtensionId[] = "bepbmhgboaologfdajaanbcjmnhjmhfn";
102
100 // Enum describing the state of the hotword preference. 103 // Enum describing the state of the hotword preference.
101 // This is used for UMA stats -- do not reorder or delete items; only add to 104 // This is used for UMA stats -- do not reorder or delete items; only add to
102 // the end. 105 // the end.
103 enum HotwordEnabled { 106 enum HotwordEnabled {
104 UNSET = 0, // No hotword preference has been set. 107 UNSET = 0, // No hotword preference has been set.
105 ENABLED, // The (classic) hotword preference is enabled. 108 ENABLED, // The (classic) hotword preference is enabled.
106 DISABLED, // All hotwording is disabled. 109 DISABLED, // All hotwording is disabled.
107 ALWAYS_ON_ENABLED, // Always-on hotwording is enabled. 110 ALWAYS_ON_ENABLED, // Always-on hotwording is enabled.
108 NUM_HOTWORD_ENABLED_METRICS 111 NUM_HOTWORD_ENABLED_METRICS
109 }; 112 };
(...skipping 15 matching lines...) Expand all
125 // This is used for UMA stats -- do not reorder or delete items; only add to 128 // This is used for UMA stats -- do not reorder or delete items; only add to
126 // the end. 129 // the end.
127 enum HotwordError { 130 enum HotwordError {
128 NO_HOTWORD_ERROR = 0, 131 NO_HOTWORD_ERROR = 0,
129 GENERIC_HOTWORD_ERROR, 132 GENERIC_HOTWORD_ERROR,
130 NACL_HOTWORD_ERROR, 133 NACL_HOTWORD_ERROR,
131 MICROPHONE_HOTWORD_ERROR, 134 MICROPHONE_HOTWORD_ERROR,
132 NUM_HOTWORD_ERROR_METRICS 135 NUM_HOTWORD_ERROR_METRICS
133 }; 136 };
134 137
135 void RecordExtensionAvailabilityMetrics(
136 ExtensionService* service,
137 const extensions::Extension* extension) {
138 HotwordExtensionAvailability availability_state = UNAVAILABLE;
139 if (extension) {
140 availability_state = AVAILABLE;
141 } else if (service->pending_extension_manager() &&
142 service->pending_extension_manager()->IsIdPending(
143 extension_misc::kHotwordExtensionId)) {
144 availability_state = PENDING_DOWNLOAD;
145 } else if (!service->IsExtensionEnabled(
146 extension_misc::kHotwordExtensionId)) {
147 availability_state = DISABLED_EXTENSION;
148 }
149 UMA_HISTOGRAM_ENUMERATION("Hotword.HotwordExtensionAvailability",
150 availability_state,
151 NUM_HOTWORD_EXTENSION_AVAILABILITY_METRICS);
152 }
153
154 void RecordLoggingMetrics(Profile* profile) { 138 void RecordLoggingMetrics(Profile* profile) {
155 // If the user is not opted in to hotword voice search, the audio logging 139 // If the user is not opted in to hotword voice search, the audio logging
156 // metric is not valid so it is not recorded. 140 // metric is not valid so it is not recorded.
157 if (!profile->GetPrefs()->GetBoolean(prefs::kHotwordSearchEnabled)) 141 if (!profile->GetPrefs()->GetBoolean(prefs::kHotwordSearchEnabled))
158 return; 142 return;
159 143
160 UMA_HISTOGRAM_BOOLEAN( 144 UMA_HISTOGRAM_BOOLEAN(
161 "Hotword.HotwordAudioLogging", 145 "Hotword.HotwordAudioLogging",
162 profile->GetPrefs()->GetBoolean(prefs::kHotwordAudioLoggingEnabled)); 146 profile->GetPrefs()->GetBoolean(prefs::kHotwordAudioLoggingEnabled));
163 } 147 }
(...skipping 18 matching lines...) Expand all
182 error, 166 error,
183 NUM_HOTWORD_ERROR_METRICS); 167 NUM_HOTWORD_ERROR_METRICS);
184 } 168 }
185 169
186 void RecordHotwordEnabledMetric(HotwordService *service, Profile* profile) { 170 void RecordHotwordEnabledMetric(HotwordService *service, Profile* profile) {
187 HotwordEnabled enabled_state = DISABLED; 171 HotwordEnabled enabled_state = DISABLED;
188 auto prefs = profile->GetPrefs(); 172 auto prefs = profile->GetPrefs();
189 if (!prefs->HasPrefPath(prefs::kHotwordSearchEnabled) && 173 if (!prefs->HasPrefPath(prefs::kHotwordSearchEnabled) &&
190 !prefs->HasPrefPath(prefs::kHotwordAlwaysOnSearchEnabled)) { 174 !prefs->HasPrefPath(prefs::kHotwordAlwaysOnSearchEnabled)) {
191 enabled_state = UNSET; 175 enabled_state = UNSET;
192 } else if (service->IsExperimentalHotwordingEnabled() && 176 } else if (service->IsAlwaysOnEnabled()) {
193 service->IsAlwaysOnEnabled()) {
194 enabled_state = ALWAYS_ON_ENABLED; 177 enabled_state = ALWAYS_ON_ENABLED;
195 } else if (prefs->GetBoolean(prefs::kHotwordSearchEnabled)) { 178 } else if (prefs->GetBoolean(prefs::kHotwordSearchEnabled)) {
196 enabled_state = ENABLED; 179 enabled_state = ENABLED;
197 } 180 }
198 UMA_HISTOGRAM_ENUMERATION("Hotword.Enabled", enabled_state, 181 UMA_HISTOGRAM_ENUMERATION("Hotword.Enabled", enabled_state,
199 NUM_HOTWORD_ENABLED_METRICS); 182 NUM_HOTWORD_ENABLED_METRICS);
200 } 183 }
201 184
202 ExtensionService* GetExtensionService(Profile* profile) { 185 ExtensionService* GetExtensionService(Profile* profile) {
203 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); 186 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
291 base::StringToLowerASCII(&normalized_locale); 274 base::StringToLowerASCII(&normalized_locale);
292 275
293 for (size_t i = 0; i < arraysize(kSupportedLocales); i++) { 276 for (size_t i = 0; i < arraysize(kSupportedLocales); i++) {
294 if (normalized_locale == kSupportedLocales[i]) 277 if (normalized_locale == kSupportedLocales[i])
295 return true; 278 return true;
296 } 279 }
297 return false; 280 return false;
298 } 281 }
299 282
300 // static 283 // static
301 bool HotwordService::IsExperimentalHotwordingEnabled() {
302 return true;
303 }
304
305 // static
306 bool HotwordService::IsHotwordHardwareAvailable() { 284 bool HotwordService::IsHotwordHardwareAvailable() {
307 #if defined(OS_CHROMEOS) 285 #if defined(OS_CHROMEOS)
308 if (chromeos::CrasAudioHandler::IsInitialized()) { 286 if (chromeos::CrasAudioHandler::IsInitialized()) {
309 chromeos::AudioDeviceList devices; 287 chromeos::AudioDeviceList devices;
310 chromeos::CrasAudioHandler::Get()->GetAudioDevices(&devices); 288 chromeos::CrasAudioHandler::Get()->GetAudioDevices(&devices);
311 for (size_t i = 0; i < devices.size(); ++i) { 289 for (size_t i = 0; i < devices.size(); ++i) {
312 if (devices[i].type == chromeos::AUDIO_TYPE_AOKR) { 290 if (devices[i].type == chromeos::AUDIO_TYPE_AOKR) {
313 DCHECK(devices[i].is_input); 291 DCHECK(devices[i].is_input);
314 return true; 292 return true;
315 } 293 }
(...skipping 30 matching lines...) Expand all
346 324
347 HotwordService::HotwordService(Profile* profile) 325 HotwordService::HotwordService(Profile* profile)
348 : profile_(profile), 326 : profile_(profile),
349 extension_registry_observer_(this), 327 extension_registry_observer_(this),
350 client_(NULL), 328 client_(NULL),
351 error_message_(0), 329 error_message_(0),
352 reinstall_pending_(false), 330 reinstall_pending_(false),
353 training_(false), 331 training_(false),
354 weak_factory_(this) { 332 weak_factory_(this) {
355 extension_registry_observer_.Add(extensions::ExtensionRegistry::Get(profile)); 333 extension_registry_observer_.Add(extensions::ExtensionRegistry::Get(profile));
356 if (IsExperimentalHotwordingEnabled()) { 334
357 // Disable the old extension so it doesn't interfere with the new stuff. 335 // Disable the old extension so it doesn't interfere with the new stuff.
358 DisableHotwordExtension(GetExtensionService(profile_)); 336 ExtensionService* extension_service = GetExtensionService(profile_);
359 } else { 337 if (extension_service) {
360 if (!profile_->GetPrefs()->HasPrefPath(prefs::kHotwordSearchEnabled) && 338 extension_service->DisableExtension(
361 IsHotwordAllowed()) { 339 kHotwordOldExtensionId,
362 // If the preference has not been set the hotword extension should 340 extensions::Extension::DISABLE_USER_ACTION);
363 // not be running. However, this should only be done if auto-install
364 // is enabled which is gated through the IsHotwordAllowed check.
365 DisableHotwordExtension(GetExtensionService(profile_));
366 }
367 } 341 }
342
368 // This will be called during profile initialization which is a good time 343 // This will be called during profile initialization which is a good time
369 // to check the user's hotword state. 344 // to check the user's hotword state.
370 RecordHotwordEnabledMetric(this, profile_); 345 RecordHotwordEnabledMetric(this, profile_);
371 346
372 pref_registrar_.Init(profile_->GetPrefs()); 347 pref_registrar_.Init(profile_->GetPrefs());
373 pref_registrar_.Add( 348 pref_registrar_.Add(
374 prefs::kHotwordSearchEnabled,
375 base::Bind(&HotwordService::OnHotwordSearchEnabledChanged,
376 base::Unretained(this)));
377 pref_registrar_.Add(
378 prefs::kHotwordAlwaysOnSearchEnabled, 349 prefs::kHotwordAlwaysOnSearchEnabled,
379 base::Bind(&HotwordService::OnHotwordAlwaysOnSearchEnabledChanged, 350 base::Bind(&HotwordService::OnHotwordAlwaysOnSearchEnabledChanged,
380 base::Unretained(this))); 351 base::Unretained(this)));
381 352
382 extensions::ExtensionSystem::Get(profile_)->ready().Post( 353 extensions::ExtensionSystem::Get(profile_)->ready().Post(
383 FROM_HERE, 354 FROM_HERE,
384 base::Bind(base::IgnoreResult( 355 base::Bind(base::IgnoreResult(
385 &HotwordService::MaybeReinstallHotwordExtension), 356 &HotwordService::MaybeReinstallHotwordExtension),
386 weak_factory_.GetWeakPtr())); 357 weak_factory_.GetWeakPtr()));
387 358
388 // Clear the old user pref because it became unusable. 359 // Clear the old user pref because it became unusable.
389 // TODO(rlp): Remove this code per crbug.com/358789. 360 // TODO(rlp): Remove this code per crbug.com/358789.
390 if (profile_->GetPrefs()->HasPrefPath( 361 if (profile_->GetPrefs()->HasPrefPath(
391 hotword_internal::kHotwordUnusablePrefName)) { 362 hotword_internal::kHotwordUnusablePrefName)) {
392 profile_->GetPrefs()->ClearPref(hotword_internal::kHotwordUnusablePrefName); 363 profile_->GetPrefs()->ClearPref(hotword_internal::kHotwordUnusablePrefName);
393 } 364 }
394 365
395 SetAudioHistoryHandler(new HotwordAudioHistoryHandler( 366 SetAudioHistoryHandler(new HotwordAudioHistoryHandler(
396 profile_, base::MessageLoop::current()->task_runner())); 367 profile_, base::MessageLoop::current()->task_runner()));
397 368
398 if (HotwordServiceFactory::IsAlwaysOnAvailable() && 369 if (HotwordServiceFactory::IsAlwaysOnAvailable() &&
399 IsHotwordAllowed() && 370 IsHotwordAllowed()) {
400 IsExperimentalHotwordingEnabled()) {
401 // Show the hotword notification in 5 seconds if the experimental flag is 371 // Show the hotword notification in 5 seconds if the experimental flag is
402 // on, or in 10 minutes if not. We need to wait at least a few seconds 372 // on, or in 10 minutes if not. We need to wait at least a few seconds
403 // for the hotword extension to be installed. 373 // for the hotword extension to be installed.
404 base::CommandLine* command_line = base::CommandLine::ForCurrentProcess(); 374 base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
405 if (command_line->HasSwitch(switches::kEnableExperimentalHotwordHardware)) { 375 if (command_line->HasSwitch(switches::kEnableExperimentalHotwordHardware)) {
406 base::MessageLoop::current()->PostDelayedTask( 376 base::MessageLoop::current()->PostDelayedTask(
407 FROM_HERE, 377 FROM_HERE,
408 base::Bind(&HotwordService::ShowHotwordNotification, 378 base::Bind(&HotwordService::ShowHotwordNotification,
409 weak_factory_.GetWeakPtr()), 379 weak_factory_.GetWeakPtr()),
410 base::TimeDelta::FromSeconds(5)); 380 base::TimeDelta::FromSeconds(5));
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
470 profile_->GetPrefs()->SetBoolean( 440 profile_->GetPrefs()->SetBoolean(
471 prefs::kHotwordAlwaysOnNotificationSeen, true); 441 prefs::kHotwordAlwaysOnNotificationSeen, true);
472 } 442 }
473 443
474 void HotwordService::OnExtensionUninstalled( 444 void HotwordService::OnExtensionUninstalled(
475 content::BrowserContext* browser_context, 445 content::BrowserContext* browser_context,
476 const extensions::Extension* extension, 446 const extensions::Extension* extension,
477 extensions::UninstallReason reason) { 447 extensions::UninstallReason reason) {
478 CHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); 448 CHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
479 449
480 if ((extension->id() != extension_misc::kHotwordExtensionId && 450 if (extension->id() != extension_misc::kHotwordSharedModuleId ||
481 extension->id() != extension_misc::kHotwordSharedModuleId) || 451 profile_ != Profile::FromBrowserContext(browser_context) ||
482 profile_ != Profile::FromBrowserContext(browser_context) ||
483 !GetExtensionService(profile_)) 452 !GetExtensionService(profile_))
484 return; 453 return;
485 454
486 // If the extension wasn't uninstalled due to language change, don't try to 455 // If the extension wasn't uninstalled due to language change, don't try to
487 // reinstall it. 456 // reinstall it.
488 if (!reinstall_pending_) 457 if (!reinstall_pending_)
489 return; 458 return;
490 459
491 InstallHotwordExtensionFromWebstore(kMaxInstallRetries); 460 InstallHotwordExtensionFromWebstore(kMaxInstallRetries);
492 SetPreviousLanguagePref(); 461 SetPreviousLanguagePref();
493 } 462 }
494 463
495 std::string HotwordService::ReinstalledExtensionId() { 464 std::string HotwordService::ReinstalledExtensionId() {
496 if (IsExperimentalHotwordingEnabled()) 465 return extension_misc::kHotwordSharedModuleId;
497 return extension_misc::kHotwordSharedModuleId;
498
499 return extension_misc::kHotwordExtensionId;
500 } 466 }
501 467
502 void HotwordService::InstalledFromWebstoreCallback( 468 void HotwordService::InstalledFromWebstoreCallback(
503 int num_tries, 469 int num_tries,
504 bool success, 470 bool success,
505 const std::string& error, 471 const std::string& error,
506 extensions::webstore_install::Result result) { 472 extensions::webstore_install::Result result) {
507 if (result != extensions::webstore_install::SUCCESS && num_tries) { 473 if (result != extensions::webstore_install::SUCCESS && num_tries) {
508 // Try again on failure. 474 // Try again on failure.
509 content::BrowserThread::PostDelayedTask( 475 content::BrowserThread::PostDelayedTask(
(...skipping 14 matching lines...) Expand all
524 weak_factory_.GetWeakPtr(), 490 weak_factory_.GetWeakPtr(),
525 num_tries - 1)); 491 num_tries - 1));
526 installer_->BeginInstall(); 492 installer_->BeginInstall();
527 } 493 }
528 494
529 void HotwordService::OnExtensionInstalled( 495 void HotwordService::OnExtensionInstalled(
530 content::BrowserContext* browser_context, 496 content::BrowserContext* browser_context,
531 const extensions::Extension* extension, 497 const extensions::Extension* extension,
532 bool is_update) { 498 bool is_update) {
533 499
534 if ((extension->id() != extension_misc::kHotwordExtensionId && 500 if (extension->id() != extension_misc::kHotwordSharedModuleId ||
535 extension->id() != extension_misc::kHotwordSharedModuleId) || 501 profile_ != Profile::FromBrowserContext(browser_context))
536 profile_ != Profile::FromBrowserContext(browser_context))
537 return; 502 return;
538 503
539 // If the previous locale pref has never been set, set it now since 504 // If the previous locale pref has never been set, set it now since
540 // the extension has been installed. 505 // the extension has been installed.
541 if (!profile_->GetPrefs()->HasPrefPath(prefs::kHotwordPreviousLanguage)) 506 if (!profile_->GetPrefs()->HasPrefPath(prefs::kHotwordPreviousLanguage))
542 SetPreviousLanguagePref(); 507 SetPreviousLanguagePref();
543 508
544 // If MaybeReinstallHotwordExtension already triggered an uninstall, we 509 // If MaybeReinstallHotwordExtension already triggered an uninstall, we
545 // don't want to loop and trigger another uninstall-install cycle. 510 // don't want to loop and trigger another uninstall-install cycle.
546 // However, if we arrived here via an uninstall-triggered-install (and in 511 // However, if we arrived here via an uninstall-triggered-install (and in
547 // that case |reinstall_pending_| will be true) then we know install 512 // that case |reinstall_pending_| will be true) then we know install
548 // has completed and we can reset |reinstall_pending_|. 513 // has completed and we can reset |reinstall_pending_|.
549 if (!reinstall_pending_) 514 if (!reinstall_pending_)
550 MaybeReinstallHotwordExtension(); 515 MaybeReinstallHotwordExtension();
551 else 516 else
552 reinstall_pending_ = false; 517 reinstall_pending_ = false;
553
554 // Now that the extension is installed, if the user has not selected
555 // the preference on, make sure it is turned off.
556 //
557 // Disabling the extension automatically on install should only occur
558 // if the user is in the field trial for auto-install which is gated
559 // by the IsHotwordAllowed check. The check for IsHotwordAllowed() here
560 // can be removed once it's known that few people have manually
561 // installed extension.
562 if (IsHotwordAllowed() && !IsSometimesOnEnabled())
563 DisableHotwordExtension(GetExtensionService(profile_));
564 } 518 }
565 519
566 bool HotwordService::MaybeReinstallHotwordExtension() { 520 bool HotwordService::MaybeReinstallHotwordExtension() {
567 CHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); 521 CHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
568 522
569 ExtensionService* extension_service = GetExtensionService(profile_); 523 ExtensionService* extension_service = GetExtensionService(profile_);
570 if (!extension_service) 524 if (!extension_service)
571 return false; 525 return false;
572 526
573 const extensions::Extension* extension = extension_service->GetExtensionById( 527 const extensions::Extension* extension = extension_service->GetExtensionById(
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
636 extensions::ExtensionSystem* system = 590 extensions::ExtensionSystem* system =
637 extensions::ExtensionSystem::Get(profile_); 591 extensions::ExtensionSystem::Get(profile_);
638 ExtensionService* service = system->extension_service(); 592 ExtensionService* service = system->extension_service();
639 // Include disabled extensions (true parameter) since it may not be enabled 593 // Include disabled extensions (true parameter) since it may not be enabled
640 // if the user opted out. 594 // if the user opted out.
641 const extensions::Extension* extension = 595 const extensions::Extension* extension =
642 service->GetExtensionById(ReinstalledExtensionId(), true); 596 service->GetExtensionById(ReinstalledExtensionId(), true);
643 if (!extension) 597 if (!extension)
644 error_message_ = IDS_HOTWORD_GENERIC_ERROR_MESSAGE; 598 error_message_ = IDS_HOTWORD_GENERIC_ERROR_MESSAGE;
645 599
646 RecordExtensionAvailabilityMetrics(service, extension); 600 // TODO(amistry): Record availability of shared module in UMA.
647 RecordLoggingMetrics(profile_); 601 RecordLoggingMetrics(profile_);
648 602
649 // Determine if NaCl is available. 603 // Determine if NaCl is available.
650 bool nacl_enabled = false; 604 bool nacl_enabled = false;
651 base::FilePath path; 605 base::FilePath path;
652 if (PathService::Get(chrome::FILE_NACL_PLUGIN, &path)) { 606 if (PathService::Get(chrome::FILE_NACL_PLUGIN, &path)) {
653 content::WebPluginInfo info; 607 content::WebPluginInfo info;
654 PluginPrefs* plugin_prefs = PluginPrefs::GetForProfile(profile_).get(); 608 PluginPrefs* plugin_prefs = PluginPrefs::GetForProfile(profile_).get();
655 if (content::PluginService::GetInstance()->GetPluginInfoByPath(path, &info)) 609 if (content::PluginService::GetInstance()->GetPluginInfoByPath(path, &info))
656 nacl_enabled = plugin_prefs->IsPluginEnabled(info); 610 nacl_enabled = plugin_prefs->IsPluginEnabled(info);
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
703 profile_->GetPrefs()->GetBoolean(prefs::kHotwordAlwaysOnSearchEnabled) && 657 profile_->GetPrefs()->GetBoolean(prefs::kHotwordAlwaysOnSearchEnabled) &&
704 HotwordServiceFactory::IsAlwaysOnAvailable(); 658 HotwordServiceFactory::IsAlwaysOnAvailable();
705 } 659 }
706 660
707 bool HotwordService::IsSometimesOnEnabled() { 661 bool HotwordService::IsSometimesOnEnabled() {
708 return profile_->GetPrefs()->HasPrefPath(prefs::kHotwordSearchEnabled) && 662 return profile_->GetPrefs()->HasPrefPath(prefs::kHotwordSearchEnabled) &&
709 profile_->GetPrefs()->GetBoolean(prefs::kHotwordSearchEnabled) && 663 profile_->GetPrefs()->GetBoolean(prefs::kHotwordSearchEnabled) &&
710 !HotwordServiceFactory::IsAlwaysOnAvailable(); 664 !HotwordServiceFactory::IsAlwaysOnAvailable();
711 } 665 }
712 666
713 void HotwordService::EnableHotwordExtension(
714 ExtensionService* extension_service) {
715 if (extension_service && !IsExperimentalHotwordingEnabled())
716 extension_service->EnableExtension(extension_misc::kHotwordExtensionId);
717 }
718
719 void HotwordService::DisableHotwordExtension(
720 ExtensionService* extension_service) {
721 if (extension_service) {
722 extension_service->DisableExtension(
723 extension_misc::kHotwordExtensionId,
724 extensions::Extension::DISABLE_USER_ACTION);
725 }
726 }
727
728 void HotwordService::SpeakerModelExistsComplete(bool exists) { 667 void HotwordService::SpeakerModelExistsComplete(bool exists) {
729 if (exists) { 668 if (exists) {
730 profile_->GetPrefs()-> 669 profile_->GetPrefs()->
731 SetBoolean(prefs::kHotwordAlwaysOnSearchEnabled, true); 670 SetBoolean(prefs::kHotwordAlwaysOnSearchEnabled, true);
732 } else { 671 } else {
733 LaunchHotwordAudioVerificationApp(HotwordService::HOTWORD_ONLY); 672 LaunchHotwordAudioVerificationApp(HotwordService::HOTWORD_ONLY);
734 } 673 }
735 } 674 }
736 675
737 void HotwordService::OptIntoHotwording( 676 void HotwordService::OptIntoHotwording(
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
835 void HotwordService::DisableHotwordPreferences() { 774 void HotwordService::DisableHotwordPreferences() {
836 if (IsSometimesOnEnabled()) { 775 if (IsSometimesOnEnabled()) {
837 profile_->GetPrefs()->SetBoolean(prefs::kHotwordSearchEnabled, false); 776 profile_->GetPrefs()->SetBoolean(prefs::kHotwordSearchEnabled, false);
838 } 777 }
839 if (IsAlwaysOnEnabled()) { 778 if (IsAlwaysOnEnabled()) {
840 profile_->GetPrefs()->SetBoolean(prefs::kHotwordAlwaysOnSearchEnabled, 779 profile_->GetPrefs()->SetBoolean(prefs::kHotwordAlwaysOnSearchEnabled,
841 false); 780 false);
842 } 781 }
843 } 782 }
844 783
845 void HotwordService::OnHotwordSearchEnabledChanged(
846 const std::string& pref_name) {
847 DCHECK_EQ(pref_name, std::string(prefs::kHotwordSearchEnabled));
848
849 ExtensionService* extension_service = GetExtensionService(profile_);
850 if (profile_->GetPrefs()->GetBoolean(prefs::kHotwordSearchEnabled))
851 EnableHotwordExtension(extension_service);
852 else
853 DisableHotwordExtension(extension_service);
854 }
855
856 void HotwordService::OnHotwordAlwaysOnSearchEnabledChanged( 784 void HotwordService::OnHotwordAlwaysOnSearchEnabledChanged(
857 const std::string& pref_name) { 785 const std::string& pref_name) {
858 // If the pref for always on has been changed in some way, that means that 786 // If the pref for always on has been changed in some way, that means that
859 // the user is aware of always on (either from settings or another source) 787 // the user is aware of always on (either from settings or another source)
860 // so they don't need to be shown the notification. 788 // so they don't need to be shown the notification.
861 profile_->GetPrefs()->SetBoolean(prefs::kHotwordAlwaysOnNotificationSeen, 789 profile_->GetPrefs()->SetBoolean(prefs::kHotwordAlwaysOnNotificationSeen,
862 true); 790 true);
863 pref_registrar_.Remove(prefs::kHotwordAlwaysOnSearchEnabled); 791 pref_registrar_.Remove(prefs::kHotwordAlwaysOnSearchEnabled);
864 } 792 }
865 793
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
905 std::string previous_locale = 833 std::string previous_locale =
906 profile_->GetPrefs()->GetString(prefs::kHotwordPreviousLanguage); 834 profile_->GetPrefs()->GetString(prefs::kHotwordPreviousLanguage);
907 std::string locale = GetCurrentLocale(profile_); 835 std::string locale = GetCurrentLocale(profile_);
908 836
909 // If it's a new locale, then the old extension should be uninstalled. 837 // If it's a new locale, then the old extension should be uninstalled.
910 return locale != previous_locale && 838 return locale != previous_locale &&
911 HotwordService::DoesHotwordSupportLanguage(profile_); 839 HotwordService::DoesHotwordSupportLanguage(profile_);
912 } 840 }
913 841
914 void HotwordService::ActiveUserChanged() { 842 void HotwordService::ActiveUserChanged() {
915 // Do nothing for old hotwording.
916 if (!IsExperimentalHotwordingEnabled())
917 return;
918
919 // Don't bother notifying the extension if hotwording is completely off. 843 // Don't bother notifying the extension if hotwording is completely off.
920 if (!IsSometimesOnEnabled() && !IsAlwaysOnEnabled() && !IsTraining()) 844 if (!IsSometimesOnEnabled() && !IsAlwaysOnEnabled() && !IsTraining())
921 return; 845 return;
922 846
923 HotwordPrivateEventService* event_service = 847 HotwordPrivateEventService* event_service =
924 BrowserContextKeyedAPIFactory<HotwordPrivateEventService>::Get(profile_); 848 BrowserContextKeyedAPIFactory<HotwordPrivateEventService>::Get(profile_);
925 // "enabled" isn't being changed, but piggy-back off the notification anyway. 849 // "enabled" isn't being changed, but piggy-back off the notification anyway.
926 if (event_service) 850 if (event_service)
927 event_service->OnEnabledChanged(prefs::kHotwordSearchEnabled); 851 event_service->OnEnabledChanged(prefs::kHotwordSearchEnabled);
928 } 852 }
929 853
930 bool HotwordService::UserIsActive() { 854 bool HotwordService::UserIsActive() {
931 #if defined(OS_CHROMEOS) 855 #if defined(OS_CHROMEOS)
932 // Only support multiple profiles and profile switching in ChromeOS. 856 // Only support multiple profiles and profile switching in ChromeOS.
933 if (user_manager::UserManager::IsInitialized()) { 857 if (user_manager::UserManager::IsInitialized()) {
934 user_manager::User* user = 858 user_manager::User* user =
935 user_manager::UserManager::Get()->GetActiveUser(); 859 user_manager::UserManager::Get()->GetActiveUser();
936 if (user && user->is_profile_created()) 860 if (user && user->is_profile_created())
937 return profile_ == ProfileManager::GetActiveUserProfile(); 861 return profile_ == ProfileManager::GetActiveUserProfile();
938 } 862 }
939 #endif 863 #endif
940 return true; 864 return true;
941 } 865 }
OLDNEW
« no previous file with comments | « chrome/browser/search/hotword_service.h ('k') | chrome/browser/ui/app_list/app_list_view_delegate.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698