blob: cbecb839e4133db2110516bf2a7b2564092b5edd [file] [log] [blame]
// Copyright 2017 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 "components/ntp_snippets/remote/remote_suggestions_status_service_impl.h"
#include <string>
#include "base/feature_list.h"
#include "components/ntp_snippets/content_suggestions_metrics.h"
#include "components/ntp_snippets/features.h"
#include "components/ntp_snippets/pref_names.h"
#include "components/prefs/pref_registry_simple.h"
#include "components/prefs/pref_service.h"
#include "components/variations/variations_associated_data.h"
namespace ntp_snippets {
RemoteSuggestionsStatusServiceImpl::RemoteSuggestionsStatusServiceImpl(
bool is_signed_in,
PrefService* pref_service,
const std::string& additional_toggle_pref)
: status_(RemoteSuggestionsStatus::EXPLICITLY_DISABLED),
additional_toggle_pref_(additional_toggle_pref),
is_signed_in_(is_signed_in),
list_visible_during_session_(true),
pref_service_(pref_service) {
ntp_snippets::metrics::RecordRemoteSuggestionsProviderState(
!IsExplicitlyDisabled());
}
RemoteSuggestionsStatusServiceImpl::~RemoteSuggestionsStatusServiceImpl() =
default;
// static
void RemoteSuggestionsStatusServiceImpl::RegisterProfilePrefs(
PrefRegistrySimple* registry) {
registry->RegisterBooleanPref(prefs::kEnableSnippets, true);
registry->RegisterBooleanPref(prefs::kArticlesListVisible, true);
}
void RemoteSuggestionsStatusServiceImpl::Init(
const StatusChangeCallback& callback) {
DCHECK(status_change_callback_.is_null());
status_change_callback_ = callback;
list_visible_during_session_ =
pref_service_->GetBoolean(prefs::kArticlesListVisible);
// Notify about the current state before registering the observer, to make
// sure we don't get a double notification due to an undefined start state.
RemoteSuggestionsStatus old_status = status_;
status_ = GetStatusFromDeps();
status_change_callback_.Run(old_status, status_);
pref_change_registrar_.Init(pref_service_);
pref_change_registrar_.Add(
prefs::kEnableSnippets,
base::BindRepeating(
&RemoteSuggestionsStatusServiceImpl::OnSnippetsEnabledChanged,
base::Unretained(this)));
pref_change_registrar_.Add(
prefs::kArticlesListVisible,
base::BindRepeating(
&RemoteSuggestionsStatusServiceImpl::OnListVisibilityChanged,
base::Unretained(this)));
if (!additional_toggle_pref_.empty()) {
pref_change_registrar_.Add(
additional_toggle_pref_,
base::BindRepeating(
&RemoteSuggestionsStatusServiceImpl::OnSnippetsEnabledChanged,
base::Unretained(this)));
}
}
void RemoteSuggestionsStatusServiceImpl::OnSnippetsEnabledChanged() {
OnStateChanged(GetStatusFromDeps());
}
void RemoteSuggestionsStatusServiceImpl::OnStateChanged(
RemoteSuggestionsStatus new_status) {
if (new_status == status_) {
return;
}
status_change_callback_.Run(status_, new_status);
status_ = new_status;
}
bool RemoteSuggestionsStatusServiceImpl::IsSignedIn() const {
return is_signed_in_;
}
void RemoteSuggestionsStatusServiceImpl::OnSignInStateChanged(
bool has_signed_in) {
is_signed_in_ = has_signed_in;
OnStateChanged(GetStatusFromDeps());
}
void RemoteSuggestionsStatusServiceImpl::OnListVisibilityChanged() {
if (pref_service_->GetBoolean(prefs::kArticlesListVisible)) {
list_visible_during_session_ = true;
}
OnStateChanged(GetStatusFromDeps());
}
bool RemoteSuggestionsStatusServiceImpl::IsExplicitlyDisabled() const {
if (!pref_service_->GetBoolean(prefs::kEnableSnippets)) {
DVLOG(1) << "[GetStatusFromDeps] Disabled via pref.";
return true;
}
if (!list_visible_during_session_) {
DVLOG(1) << "[GetStatusFromDeps] Disabled because articles list hidden.";
return true;
}
// |additional_toggle_pref_| will always be empty on Android.
if (!additional_toggle_pref_.empty()) {
if (!pref_service_->GetBoolean(additional_toggle_pref_)) {
DVLOG(1) << "[GetStatusFromDeps] Disabled via additional pref";
return true;
}
}
return false;
}
RemoteSuggestionsStatus RemoteSuggestionsStatusServiceImpl::GetStatusFromDeps()
const {
if (IsExplicitlyDisabled()) {
return RemoteSuggestionsStatus::EXPLICITLY_DISABLED;
}
DVLOG(1) << "[GetStatusFromDeps] Enabled, signed "
<< (IsSignedIn() ? "in" : "out");
return IsSignedIn() ? RemoteSuggestionsStatus::ENABLED_AND_SIGNED_IN
: RemoteSuggestionsStatus::ENABLED_AND_SIGNED_OUT;
}
} // namespace ntp_snippets