1 // Copyright 2014 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.
5 #include "chrome/browser/search/hotword_audio_history_handler.h"
7 #include "base/prefs/pref_service.h"
8 #include "chrome/browser/extensions/api/hotword_private/hotword_private_api.h"
9 #include "chrome/browser/history/web_history_service_factory.h"
10 #include "chrome/browser/profiles/profile.h"
11 #include "chrome/common/pref_names.h"
12 #include "components/history/core/browser/web_history_service.h"
14 using extensions::BrowserContextKeyedAPIFactory
;
15 using extensions::HotwordPrivateEventService
;
17 // Max number of hours between audio history checks.
18 static const int kHoursUntilNextAudioHistoryCheck
= 24;
20 HotwordAudioHistoryHandler::HotwordAudioHistoryHandler(
21 content::BrowserContext
* context
,
22 const scoped_refptr
<base::SingleThreadTaskRunner
>& task_runner
)
23 : task_runner_(task_runner
),
24 profile_(Profile::FromBrowserContext(context
)),
25 weak_ptr_factory_(this) {
28 HotwordAudioHistoryHandler::~HotwordAudioHistoryHandler() {
31 history::WebHistoryService
* HotwordAudioHistoryHandler::GetWebHistory() {
32 return WebHistoryServiceFactory::GetForProfile(profile_
);
35 void HotwordAudioHistoryHandler::UpdateAudioHistoryState() {
36 GetAudioHistoryEnabled(
37 base::Bind(&HotwordAudioHistoryHandler::UpdateLocalPreference
,
38 weak_ptr_factory_
.GetWeakPtr()));
39 // Set the function to update in a day.
40 task_runner_
->PostDelayedTask(
42 base::Bind(&HotwordAudioHistoryHandler::UpdateAudioHistoryState
,
43 weak_ptr_factory_
.GetWeakPtr()),
44 base::TimeDelta::FromHours(kHoursUntilNextAudioHistoryCheck
));
47 void HotwordAudioHistoryHandler::UpdateLocalPreference(
48 bool success
, bool new_enabled_value
) {
50 PrefService
* prefs
= profile_
->GetPrefs();
51 prefs
->SetBoolean(prefs::kHotwordAudioLoggingEnabled
, new_enabled_value
);
55 void HotwordAudioHistoryHandler::GetAudioHistoryEnabled(
56 const HotwordAudioHistoryCallback
& callback
) {
57 history::WebHistoryService
* web_history
= GetWebHistory();
59 web_history
->GetAudioHistoryEnabled(
60 base::Bind(&HotwordAudioHistoryHandler::GetAudioHistoryComplete
,
61 weak_ptr_factory_
.GetWeakPtr(),
64 // If web_history is null, the user is not signed in. Set the opt-in value
65 // to the last known value and run the callback with false for success.
66 PrefService
* prefs
= profile_
->GetPrefs();
67 callback
.Run(false, prefs
->GetBoolean(prefs::kHotwordAudioLoggingEnabled
));
71 void HotwordAudioHistoryHandler::SetAudioHistoryEnabled(
73 const HotwordAudioHistoryCallback
& callback
) {
74 history::WebHistoryService
* web_history
= GetWebHistory();
76 web_history
->SetAudioHistoryEnabled(
78 base::Bind(&HotwordAudioHistoryHandler::SetAudioHistoryComplete
,
79 weak_ptr_factory_
.GetWeakPtr(),
83 // If web_history is null, run the callback with false for success
84 // and return the last known value for the opt-in pref.
85 PrefService
* prefs
= profile_
->GetPrefs();
86 callback
.Run(false, prefs
->GetBoolean(prefs::kHotwordAudioLoggingEnabled
));
90 void HotwordAudioHistoryHandler::GetAudioHistoryComplete(
91 const HotwordAudioHistoryCallback
& callback
,
92 bool success
, bool new_enabled_value
) {
93 // Initialize value to the last known value of the audio history pref.
94 PrefService
* prefs
= profile_
->GetPrefs();
95 bool value
= prefs
->GetBoolean(prefs::kHotwordAudioLoggingEnabled
);
96 // If the call was successful, use the new value for updates.
98 value
= new_enabled_value
;
99 prefs
->SetBoolean(prefs::kHotwordAudioLoggingEnabled
, value
);
100 // If the setting is now turned off, always on should also be turned off,
101 // and the speaker model should be deleted.
103 if (prefs
->GetBoolean(prefs::kHotwordAlwaysOnSearchEnabled
)) {
104 prefs
->SetBoolean(prefs::kHotwordAlwaysOnSearchEnabled
, false);
105 HotwordPrivateEventService
* event_service
=
106 BrowserContextKeyedAPIFactory
<HotwordPrivateEventService
>::Get(
109 event_service
->OnDeleteSpeakerModel();
113 callback
.Run(success
, value
);
116 void HotwordAudioHistoryHandler::SetAudioHistoryComplete(
117 bool new_enabled_value
,
118 const HotwordAudioHistoryCallback
& callback
,
119 bool success
, bool callback_enabled_value
) {
120 UpdateLocalPreference(success
, new_enabled_value
);
121 callback
.Run(success
, new_enabled_value
);