| OLD | NEW |
| 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 "base/command_line.h" | 7 #include "base/command_line.h" |
| 8 #include "base/i18n/case_conversion.h" | 8 #include "base/i18n/case_conversion.h" |
| 9 #include "base/metrics/field_trial.h" | 9 #include "base/metrics/field_trial.h" |
| 10 #include "base/metrics/histogram.h" | 10 #include "base/metrics/histogram.h" |
| (...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 156 } | 156 } |
| 157 | 157 |
| 158 } // namespace | 158 } // namespace |
| 159 | 159 |
| 160 namespace hotword_internal { | 160 namespace hotword_internal { |
| 161 // Constants for the hotword field trial. | 161 // Constants for the hotword field trial. |
| 162 const char kHotwordFieldTrialName[] = "VoiceTrigger"; | 162 const char kHotwordFieldTrialName[] = "VoiceTrigger"; |
| 163 const char kHotwordFieldTrialDisabledGroupName[] = "Disabled"; | 163 const char kHotwordFieldTrialDisabledGroupName[] = "Disabled"; |
| 164 // Old preference constant. | 164 // Old preference constant. |
| 165 const char kHotwordUnusablePrefName[] = "hotword.search_enabled"; | 165 const char kHotwordUnusablePrefName[] = "hotword.search_enabled"; |
| 166 // String passed to indicate the training state has changed. |
| 167 const char kHotwordTrainingEnabled[] = "hotword_training_enabled"; |
| 166 } // namespace hotword_internal | 168 } // namespace hotword_internal |
| 167 | 169 |
| 168 // static | 170 // static |
| 169 bool HotwordService::DoesHotwordSupportLanguage(Profile* profile) { | 171 bool HotwordService::DoesHotwordSupportLanguage(Profile* profile) { |
| 170 std::string normalized_locale = | 172 std::string normalized_locale = |
| 171 l10n_util::NormalizeLocale(GetCurrentLocale(profile)); | 173 l10n_util::NormalizeLocale(GetCurrentLocale(profile)); |
| 172 base::StringToLowerASCII(&normalized_locale); | 174 base::StringToLowerASCII(&normalized_locale); |
| 173 | 175 |
| 174 for (size_t i = 0; i < arraysize(kSupportedLocales); i++) { | 176 for (size_t i = 0; i < arraysize(kSupportedLocales); i++) { |
| 175 if (normalized_locale.compare(0, 2, kSupportedLocales[i]) == 0) | 177 if (normalized_locale.compare(0, 2, kSupportedLocales[i]) == 0) |
| 176 return true; | 178 return true; |
| 177 } | 179 } |
| 178 return false; | 180 return false; |
| 179 } | 181 } |
| 180 | 182 |
| 181 // static | 183 // static |
| 182 bool HotwordService::IsExperimentalHotwordingEnabled() { | 184 bool HotwordService::IsExperimentalHotwordingEnabled() { |
| 183 CommandLine* command_line = CommandLine::ForCurrentProcess(); | 185 CommandLine* command_line = CommandLine::ForCurrentProcess(); |
| 184 return command_line->HasSwitch(switches::kEnableExperimentalHotwording); | 186 return command_line->HasSwitch(switches::kEnableExperimentalHotwording); |
| 185 } | 187 } |
| 186 | 188 |
| 187 HotwordService::HotwordService(Profile* profile) | 189 HotwordService::HotwordService(Profile* profile) |
| 188 : profile_(profile), | 190 : profile_(profile), |
| 189 extension_registry_observer_(this), | 191 extension_registry_observer_(this), |
| 190 client_(NULL), | 192 client_(NULL), |
| 191 error_message_(0), | 193 error_message_(0), |
| 192 reinstall_pending_(false), | 194 reinstall_pending_(false), |
| 195 training_(false), |
| 193 weak_factory_(this) { | 196 weak_factory_(this) { |
| 194 extension_registry_observer_.Add(extensions::ExtensionRegistry::Get(profile)); | 197 extension_registry_observer_.Add(extensions::ExtensionRegistry::Get(profile)); |
| 195 // This will be called during profile initialization which is a good time | 198 // This will be called during profile initialization which is a good time |
| 196 // to check the user's hotword state. | 199 // to check the user's hotword state. |
| 197 HotwordEnabled enabled_state = UNSET; | 200 HotwordEnabled enabled_state = UNSET; |
| 198 if (IsExperimentalHotwordingEnabled()) { | 201 if (IsExperimentalHotwordingEnabled()) { |
| 199 // Disable the old extension so it doesn't interfere with the new stuff. | 202 // Disable the old extension so it doesn't interfere with the new stuff. |
| 200 DisableHotwordExtension(GetExtensionService(profile_)); | 203 DisableHotwordExtension(GetExtensionService(profile_)); |
| 201 } else { | 204 } else { |
| 202 if (profile_->GetPrefs()->HasPrefPath(prefs::kHotwordSearchEnabled)) { | 205 if (profile_->GetPrefs()->HasPrefPath(prefs::kHotwordSearchEnabled)) { |
| (...skipping 267 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 470 | 473 |
| 471 OpenApplication(AppLaunchParams( | 474 OpenApplication(AppLaunchParams( |
| 472 profile_, extension, extensions::LAUNCH_CONTAINER_WINDOW, NEW_WINDOW)); | 475 profile_, extension, extensions::LAUNCH_CONTAINER_WINDOW, NEW_WINDOW)); |
| 473 } | 476 } |
| 474 | 477 |
| 475 HotwordService::LaunchMode | 478 HotwordService::LaunchMode |
| 476 HotwordService::GetHotwordAudioVerificationLaunchMode() { | 479 HotwordService::GetHotwordAudioVerificationLaunchMode() { |
| 477 return hotword_audio_verification_launch_mode_; | 480 return hotword_audio_verification_launch_mode_; |
| 478 } | 481 } |
| 479 | 482 |
| 483 void HotwordService::StartTraining() { |
| 484 training_ = true; |
| 485 |
| 486 if (!IsServiceAvailable()) |
| 487 return; |
| 488 |
| 489 HotwordPrivateEventService* event_service = |
| 490 BrowserContextKeyedAPIFactory<HotwordPrivateEventService>::Get(profile_); |
| 491 if (event_service) |
| 492 event_service->OnEnabledChanged(hotword_internal::kHotwordTrainingEnabled); |
| 493 } |
| 494 |
| 495 void HotwordService::FinalizeSpeakerModel() { |
| 496 if (!IsServiceAvailable()) |
| 497 return; |
| 498 |
| 499 HotwordPrivateEventService* event_service = |
| 500 BrowserContextKeyedAPIFactory<HotwordPrivateEventService>::Get(profile_); |
| 501 if (event_service) |
| 502 event_service->OnFinalizeSpeakerModel(); |
| 503 } |
| 504 |
| 505 void HotwordService::StopTraining() { |
| 506 training_ = false; |
| 507 |
| 508 if (!IsServiceAvailable()) |
| 509 return; |
| 510 |
| 511 HotwordPrivateEventService* event_service = |
| 512 BrowserContextKeyedAPIFactory<HotwordPrivateEventService>::Get(profile_); |
| 513 if (event_service) |
| 514 event_service->OnEnabledChanged(hotword_internal::kHotwordTrainingEnabled); |
| 515 } |
| 516 |
| 517 void HotwordService::NotifyHotwordTriggered() { |
| 518 if (!IsServiceAvailable()) |
| 519 return; |
| 520 |
| 521 HotwordPrivateEventService* event_service = |
| 522 BrowserContextKeyedAPIFactory<HotwordPrivateEventService>::Get(profile_); |
| 523 if (event_service) |
| 524 event_service->OnHotwordTriggered(); |
| 525 } |
| 526 |
| 527 bool HotwordService::IsTraining() { |
| 528 return training_; |
| 529 } |
| 530 |
| 480 void HotwordService::OnHotwordSearchEnabledChanged( | 531 void HotwordService::OnHotwordSearchEnabledChanged( |
| 481 const std::string& pref_name) { | 532 const std::string& pref_name) { |
| 482 DCHECK_EQ(pref_name, std::string(prefs::kHotwordSearchEnabled)); | 533 DCHECK_EQ(pref_name, std::string(prefs::kHotwordSearchEnabled)); |
| 483 | 534 |
| 484 ExtensionService* extension_service = GetExtensionService(profile_); | 535 ExtensionService* extension_service = GetExtensionService(profile_); |
| 485 if (profile_->GetPrefs()->GetBoolean(prefs::kHotwordSearchEnabled)) | 536 if (profile_->GetPrefs()->GetBoolean(prefs::kHotwordSearchEnabled)) |
| 486 EnableHotwordExtension(extension_service); | 537 EnableHotwordExtension(extension_service); |
| 487 else | 538 else |
| 488 DisableHotwordExtension(extension_service); | 539 DisableHotwordExtension(extension_service); |
| 489 } | 540 } |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 528 return false; | 579 return false; |
| 529 | 580 |
| 530 std::string previous_locale = | 581 std::string previous_locale = |
| 531 profile_->GetPrefs()->GetString(prefs::kHotwordPreviousLanguage); | 582 profile_->GetPrefs()->GetString(prefs::kHotwordPreviousLanguage); |
| 532 std::string locale = GetCurrentLocale(profile_); | 583 std::string locale = GetCurrentLocale(profile_); |
| 533 | 584 |
| 534 // If it's a new locale, then the old extension should be uninstalled. | 585 // If it's a new locale, then the old extension should be uninstalled. |
| 535 return locale != previous_locale && | 586 return locale != previous_locale && |
| 536 HotwordService::DoesHotwordSupportLanguage(profile_); | 587 HotwordService::DoesHotwordSupportLanguage(profile_); |
| 537 } | 588 } |
| OLD | NEW |