Home | History | Annotate | Download | only in search
      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
      3 // found in the LICENSE file.
      4 
      5 #include "chrome/browser/search/hotword_service_factory.h"
      6 
      7 #include "base/prefs/pref_service.h"
      8 #include "chrome/browser/profiles/profile.h"
      9 #include "chrome/browser/search/hotword_service.h"
     10 #include "chrome/common/pref_names.h"
     11 #include "components/keyed_service/content/browser_context_dependency_manager.h"
     12 #include "components/pref_registry/pref_registry_syncable.h"
     13 #include "content/public/browser/browser_context.h"
     14 #include "content/public/browser/browser_thread.h"
     15 
     16 using content::BrowserContext;
     17 using content::BrowserThread;
     18 
     19 // static
     20 HotwordService* HotwordServiceFactory::GetForProfile(BrowserContext* context) {
     21   return static_cast<HotwordService*>(
     22       GetInstance()->GetServiceForBrowserContext(context, true));
     23 }
     24 
     25 // static
     26 HotwordServiceFactory* HotwordServiceFactory::GetInstance() {
     27   return Singleton<HotwordServiceFactory>::get();
     28 }
     29 
     30 // static
     31 bool HotwordServiceFactory::IsServiceAvailable(BrowserContext* context) {
     32   HotwordService* hotword_service = GetForProfile(context);
     33   return hotword_service && hotword_service->IsServiceAvailable();
     34 }
     35 
     36 // static
     37 bool HotwordServiceFactory::IsHotwordAllowed(BrowserContext* context) {
     38   HotwordService* hotword_service = GetForProfile(context);
     39   return hotword_service && hotword_service->IsHotwordAllowed();
     40 }
     41 
     42 // static
     43 int HotwordServiceFactory::GetCurrentError(BrowserContext* context) {
     44   HotwordService* hotword_service = GetForProfile(context);
     45   if (!hotword_service)
     46     return 0;
     47   return hotword_service->error_message();
     48 }
     49 
     50 // static
     51 bool HotwordServiceFactory::IsMicrophoneAvailable() {
     52   return GetInstance()->microphone_available();
     53 }
     54 
     55 HotwordServiceFactory::HotwordServiceFactory()
     56     : BrowserContextKeyedServiceFactory(
     57         "HotwordService",
     58         BrowserContextDependencyManager::GetInstance()),
     59       microphone_available_(false) {
     60   // No dependencies.
     61 
     62   // Register with the device observer list to update the microphone
     63   // availability.
     64   BrowserThread::PostTask(
     65       BrowserThread::UI, FROM_HERE,
     66       base::Bind(&HotwordServiceFactory::InitializeMicrophoneObserver,
     67                  base::Unretained(this)));
     68 }
     69 
     70 HotwordServiceFactory::~HotwordServiceFactory() {
     71 }
     72 
     73 void HotwordServiceFactory::InitializeMicrophoneObserver() {
     74   MediaCaptureDevicesDispatcher::GetInstance()->AddObserver(this);
     75 }
     76 
     77 void HotwordServiceFactory::OnUpdateAudioDevices(
     78     const content::MediaStreamDevices& devices) {
     79   microphone_available_ = !devices.empty();
     80 }
     81 
     82 void HotwordServiceFactory::UpdateMicrophoneState() {
     83   // In order to trigger the monitor, just call getAudioCaptureDevices.
     84   content::MediaStreamDevices devices =
     85       MediaCaptureDevicesDispatcher::GetInstance()->GetAudioCaptureDevices();
     86 
     87   // If the monitor had not previously been started, there may be 0 devices
     88   // even if that is not accurate. However, we can update the microphone
     89   // availability state now. Either the number of devices will be correct or
     90   // we know that the call above will start the monitor and the microphone
     91   // state will be updated very soon and call OnUpdateAudioDevices.
     92   OnUpdateAudioDevices(devices);
     93 }
     94 
     95 void HotwordServiceFactory::RegisterProfilePrefs(
     96     user_prefs::PrefRegistrySyncable* prefs) {
     97   prefs->RegisterBooleanPref(prefs::kHotwordSearchEnabled,
     98                              false,
     99                              user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
    100   // Although this is default true, users will not send back information to
    101   // Google unless they have opted in to Hotwording at which point they must
    102   // also confirm that they wish this preference to be true or opt out of it.
    103   prefs->RegisterBooleanPref(prefs::kHotwordAudioLoggingEnabled,
    104                              true,
    105                              user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
    106   prefs->RegisterStringPref(prefs::kHotwordPreviousLanguage,
    107                             std::string(),
    108                             user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
    109 }
    110 
    111 KeyedService* HotwordServiceFactory::BuildServiceInstanceFor(
    112     BrowserContext* context) const {
    113   return new HotwordService(Profile::FromBrowserContext(context));
    114 }
    115