blob: 4d60cdd8c335f14dc6f236c6f96725633e1592e5 [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.
#ifndef CHROME_BROWSER_SUPERVISED_USER_CHILD_ACCOUNTS_CHILD_ACCOUNT_SERVICE_H_
#define CHROME_BROWSER_SUPERVISED_USER_CHILD_ACCOUNTS_CHILD_ACCOUNT_SERVICE_H_
#include <memory>
#include <string>
#include <vector>
#include "base/callback_forward.h"
#include "base/callback_list.h"
#include "base/macros.h"
#include "base/memory/weak_ptr.h"
#include "base/scoped_observer.h"
#include "base/time/time.h"
#include "base/timer/timer.h"
#include "chrome/browser/supervised_user/child_accounts/family_info_fetcher.h"
#include "chrome/browser/supervised_user/supervised_user_service.h"
#include "components/keyed_service/core/keyed_service.h"
#include "net/base/backoff_entry.h"
#include "services/identity/public/cpp/identity_manager.h"
namespace user_prefs {
class PrefRegistrySyncable;
}
class Profile;
// This class handles detection of child accounts (on sign-in as well as on
// browser restart), and triggers the appropriate behavior (e.g. enable the
// supervised user experience, fetch information about the parent(s)).
class ChildAccountService : public KeyedService,
public FamilyInfoFetcher::Consumer,
public identity::IdentityManager::Observer,
public SupervisedUserService::Delegate {
public:
enum class AuthState { AUTHENTICATED, NOT_AUTHENTICATED, PENDING };
~ChildAccountService() override;
static bool IsChildAccountDetectionEnabled();
static void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry);
void Init();
// Responds whether at least one request for child status was successful.
// And we got answer whether the profile belongs to a child account or not.
bool IsChildAccountStatusKnown();
// KeyedService:
void Shutdown() override;
void AddChildStatusReceivedCallback(base::OnceClosure callback);
// Returns whether or not the user is authenticated on Google web properties
// based on the state of the cookie jar. Returns AuthState::PENDING if
// authentication state can't be determined at the moment.
AuthState GetGoogleAuthState();
// Subscribes to changes to the Google authentication state
// (see IsGoogleAuthenticated()). Can send a notification even if the
// authentication state has not changed.
std::unique_ptr<base::CallbackList<void()>::Subscription>
ObserveGoogleAuthState(const base::Callback<void()>& callback);
private:
friend class ChildAccountServiceFactory;
// Use |ChildAccountServiceFactory::GetForProfile(...)| to get an instance of
// this service.
explicit ChildAccountService(Profile* profile);
// SupervisedUserService::Delegate implementation.
bool SetActive(bool active) override;
// Sets whether the signed-in account is a child account.
void SetIsChildAccount(bool is_child_account);
// identity::IdentityManager::Observer implementation.
void OnExtendedAccountInfoUpdated(const AccountInfo& info) override;
void OnExtendedAccountInfoRemoved(const AccountInfo& info) override;
// FamilyInfoFetcher::Consumer implementation.
void OnGetFamilyMembersSuccess(
const std::vector<FamilyInfoFetcher::FamilyMember>& members) override;
void OnFailure(FamilyInfoFetcher::ErrorCode error) override;
// IdentityManager::Observer implementation.
void OnAccountsInCookieUpdated(
const identity::AccountsInCookieJarInfo& accounts_in_cookie_jar_info,
const GoogleServiceAuthError& error) override;
void StartFetchingFamilyInfo();
void CancelFetchingFamilyInfo();
void ScheduleNextFamilyInfoUpdate(base::TimeDelta delay);
void PropagateChildStatusToUser(bool is_child);
void SetFirstCustodianPrefs(const FamilyInfoFetcher::FamilyMember& custodian);
void SetSecondCustodianPrefs(
const FamilyInfoFetcher::FamilyMember& custodian);
void ClearFirstCustodianPrefs();
void ClearSecondCustodianPrefs();
// Owns us via the KeyedService mechanism.
Profile* profile_;
bool active_;
std::unique_ptr<FamilyInfoFetcher> family_fetcher_;
// If fetching the family info fails, retry with exponential backoff.
base::OneShotTimer family_fetch_timer_;
net::BackoffEntry family_fetch_backoff_;
identity::IdentityManager* identity_manager_;
base::CallbackList<void()> google_auth_state_observers_;
// Callbacks to run when the user status becomes known.
std::vector<base::OnceClosure> status_received_callback_list_;
base::WeakPtrFactory<ChildAccountService> weak_ptr_factory_;
DISALLOW_COPY_AND_ASSIGN(ChildAccountService);
};
#endif // CHROME_BROWSER_SUPERVISED_USER_CHILD_ACCOUNTS_CHILD_ACCOUNT_SERVICE_H_