blob: c5f233cdb12b6adddaf7fa3cd522c51de63c4978 [file] [log] [blame]
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/search/hotword_audio_history_handler.h"
#include "chrome/browser/extensions/api/hotword_private/hotword_private_api.h"
#include "chrome/browser/history/web_history_service_factory.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/common/pref_names.h"
#include "components/history/core/browser/web_history_service.h"
#include "components/prefs/pref_service.h"
using extensions::BrowserContextKeyedAPIFactory;
using extensions::HotwordPrivateEventService;
// Max number of hours between audio history checks.
static const int kHoursUntilNextAudioHistoryCheck = 24;
HotwordAudioHistoryHandler::HotwordAudioHistoryHandler(
content::BrowserContext* context,
const scoped_refptr<base::SingleThreadTaskRunner>& task_runner)
: task_runner_(task_runner),
profile_(Profile::FromBrowserContext(context)),
weak_ptr_factory_(this) {
}
HotwordAudioHistoryHandler::~HotwordAudioHistoryHandler() {
}
history::WebHistoryService* HotwordAudioHistoryHandler::GetWebHistory() {
return WebHistoryServiceFactory::GetForProfile(profile_);
}
void HotwordAudioHistoryHandler::UpdateAudioHistoryState() {
GetAudioHistoryEnabled(
base::Bind(&HotwordAudioHistoryHandler::UpdateLocalPreference,
weak_ptr_factory_.GetWeakPtr()));
// Set the function to update in a day.
task_runner_->PostDelayedTask(
FROM_HERE,
base::Bind(&HotwordAudioHistoryHandler::UpdateAudioHistoryState,
weak_ptr_factory_.GetWeakPtr()),
base::TimeDelta::FromHours(kHoursUntilNextAudioHistoryCheck));
}
void HotwordAudioHistoryHandler::UpdateLocalPreference(
bool success, bool new_enabled_value) {
if (success) {
PrefService* prefs = profile_->GetPrefs();
prefs->SetBoolean(prefs::kHotwordAudioLoggingEnabled, new_enabled_value);
}
}
void HotwordAudioHistoryHandler::GetAudioHistoryEnabled(
const HotwordAudioHistoryCallback& callback) {
history::WebHistoryService* web_history = GetWebHistory();
if (web_history) {
web_history->GetAudioHistoryEnabled(
base::Bind(&HotwordAudioHistoryHandler::GetAudioHistoryComplete,
weak_ptr_factory_.GetWeakPtr(),
callback));
} else {
// If web_history is null, the user is not signed in. Set the opt-in value
// to the last known value and run the callback with false for success.
PrefService* prefs = profile_->GetPrefs();
callback.Run(false, prefs->GetBoolean(prefs::kHotwordAudioLoggingEnabled));
}
}
void HotwordAudioHistoryHandler::SetAudioHistoryEnabled(
const bool enabled,
const HotwordAudioHistoryCallback& callback) {
history::WebHistoryService* web_history = GetWebHistory();
if (web_history) {
web_history->SetAudioHistoryEnabled(
enabled,
base::Bind(&HotwordAudioHistoryHandler::SetAudioHistoryComplete,
weak_ptr_factory_.GetWeakPtr(),
enabled,
callback));
} else {
// If web_history is null, run the callback with false for success
// and return the last known value for the opt-in pref.
PrefService* prefs = profile_->GetPrefs();
callback.Run(false, prefs->GetBoolean(prefs::kHotwordAudioLoggingEnabled));
}
}
void HotwordAudioHistoryHandler::GetAudioHistoryComplete(
const HotwordAudioHistoryCallback& callback,
bool success, bool new_enabled_value) {
// Initialize value to the last known value of the audio history pref.
PrefService* prefs = profile_->GetPrefs();
bool value = prefs->GetBoolean(prefs::kHotwordAudioLoggingEnabled);
// If the call was successful, use the new value for updates.
if (success) {
value = new_enabled_value;
prefs->SetBoolean(prefs::kHotwordAudioLoggingEnabled, value);
// If the setting is now turned off, always on should also be turned off,
// and the speaker model should be deleted.
if (!value) {
if (prefs->GetBoolean(prefs::kHotwordAlwaysOnSearchEnabled)) {
prefs->SetBoolean(prefs::kHotwordAlwaysOnSearchEnabled, false);
HotwordPrivateEventService* event_service =
BrowserContextKeyedAPIFactory<HotwordPrivateEventService>::Get(
profile_);
if (event_service)
event_service->OnDeleteSpeakerModel();
}
}
}
callback.Run(success, value);
}
void HotwordAudioHistoryHandler::SetAudioHistoryComplete(
bool new_enabled_value,
const HotwordAudioHistoryCallback& callback,
bool success, bool callback_enabled_value) {
UpdateLocalPreference(success, new_enabled_value);
callback.Run(success, new_enabled_value);
}