blob: 4d1a1cbfb6b0f278043c734d706133cf44cf8d3b [file] [log] [blame]
// Copyright 2016 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.
#ifndef COMPONENTS_NTP_SNIPPETS_REMOTE_REMOTE_SUGGESTIONS_STATUS_SERVICE_H_
#define COMPONENTS_NTP_SNIPPETS_REMOTE_REMOTE_SUGGESTIONS_STATUS_SERVICE_H_
#include "base/callback.h"
#include "base/gtest_prod_util.h"
#include "base/scoped_observer.h"
#include "components/prefs/pref_change_registrar.h"
class PrefRegistrySimple;
class PrefService;
class SigninManagerBase;
namespace ntp_snippets {
enum class RemoteSuggestionsStatus : int {
// Suggestions are enabled and the user is signed in.
ENABLED_AND_SIGNED_IN,
// Suggestions are enabled; the user is signed out (sign-in is not required).
ENABLED_AND_SIGNED_OUT,
// Suggestions have been disabled as part of the service configuration.
EXPLICITLY_DISABLED,
};
// Aggregates data from preferences and signin to notify the provider of
// relevant changes in their states.
class RemoteSuggestionsStatusService {
public:
using StatusChangeCallback =
base::Callback<void(RemoteSuggestionsStatus old_status,
RemoteSuggestionsStatus new_status)>;
RemoteSuggestionsStatusService(SigninManagerBase* signin_manager,
PrefService* pref_service);
virtual ~RemoteSuggestionsStatusService();
static void RegisterProfilePrefs(PrefRegistrySimple* registry);
// Starts listening for changes from the dependencies. |callback| will be
// called when a significant change in state is detected.
void Init(const StatusChangeCallback& callback);
// To be called when the signin state changed. Will compute the new
// state considering the initialisation configuration and the preferences,
// and notify via the registered callback if appropriate.
void OnSignInStateChanged();
private:
// TODO(jkrcal): Rewrite the tests using the public API - observing status
// changes instead of calling private GetStatusFromDeps() directly.
FRIEND_TEST_ALL_PREFIXES(RemoteSuggestionsStatusServiceTest,
SigninNeededIfSpecifiedByParam);
FRIEND_TEST_ALL_PREFIXES(RemoteSuggestionsStatusServiceTest, NoSigninNeeded);
FRIEND_TEST_ALL_PREFIXES(RemoteSuggestionsStatusServiceTest, DisabledViaPref);
// Callback for the PrefChangeRegistrar.
void OnSnippetsEnabledChanged();
void OnStateChanged(RemoteSuggestionsStatus new_status);
bool IsSignedIn() const;
RemoteSuggestionsStatus GetStatusFromDeps() const;
RemoteSuggestionsStatus status_;
StatusChangeCallback status_change_callback_;
SigninManagerBase* signin_manager_;
PrefService* pref_service_;
PrefChangeRegistrar pref_change_registrar_;
DISALLOW_COPY_AND_ASSIGN(RemoteSuggestionsStatusService);
};
} // namespace ntp_snippets
#endif // COMPONENTS_NTP_SNIPPETS_REMOTE_REMOTE_SUGGESTIONS_STATUS_SERVICE_H_