Revert "Kids Management Service"

This reverts commit b7ffd570f91223895582e7c25c42d0e9fa23b38c.

Reason for revert: Broke the build https://ci.chromium.org/ui/p/chromium/builders/ci/lacros64-archive-rel/23742/overview on lacros

Original change's description:
> Kids Management Service
>
> It brings together components responsible for token fetching, api querying into the already established interface. It aims at removing the direct profile dependency when ready, breaking service's dependency list into separate items.
>
> Bug: b:243919730
>
> Change-Id: Icbd5617f787a5c696c6893b9261a2c12c37ee296
> Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3923815
> Commit-Queue: Tomek Jurkiewicz <tju@google.com>
> Reviewed-by: Nohemi Fernandez <fernandex@chromium.org>
> Cr-Commit-Position: refs/heads/main@{#1061508}

Bug: b:243919730
Change-Id: If20419c3720df5c46b27939ab301fa74aa1e24a7
No-Presubmit: true
No-Tree-Checks: true
No-Try: true
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3967778
Owners-Override: Mohamed Amir Yosef <mamir@chromium.org>
Reviewed-by: Christoph Schwering <schwering@google.com>
Commit-Queue: Mohamed Amir Yosef <mamir@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1061511}
diff --git a/chrome/browser/supervised_user/kids_chrome_management/kids_external_fetcher.cc b/chrome/browser/supervised_user/kids_chrome_management/kids_external_fetcher.cc
index 9562801..8cbc5cb 100644
--- a/chrome/browser/supervised_user/kids_chrome_management/kids_external_fetcher.cc
+++ b/chrome/browser/supervised_user/kids_chrome_management/kids_external_fetcher.cc
@@ -9,7 +9,9 @@
 #include <utility>
 
 #include "base/functional/bind.h"
+#include "base/memory/safe_ref.h"
 #include "base/memory/scoped_refptr.h"
+#include "base/memory/weak_ptr.h"
 #include "base/strings/string_piece.h"
 #include "base/strings/stringprintf.h"
 #include "base/types/expected.h"
@@ -29,7 +31,6 @@
 const int kNumFamilyInfoFetcherRetries = 1;
 
 using ::base::BindOnce;
-using ::base::StringPiece;
 using ::base::Unretained;
 using ::kids_chrome_management::ListFamilyMembersRequest;
 using ::kids_chrome_management::ListFamilyMembersResponse;
@@ -52,8 +53,8 @@
 }
 
 std::unique_ptr<network::SimpleURLLoader> InitializeSimpleUrlLoader(
-    StringPiece payload,
-    StringPiece access_token,
+    base::StringPiece payload,
+    base::StringPiece access_token,
     const GURL& url,
     net::NetworkTrafficAnnotationTag traffic_annotation) {
   std::unique_ptr<ResourceRequest> resource_request =
@@ -122,14 +123,14 @@
   explicit FetcherImpl(
       IdentityManager& identity_manager,
       scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory,
-      StringPiece url,
+      base::StringPiece url,
       Request request,
       Callback callback) {
     access_token_fetcher_ = std::make_unique<KidsAccessTokenFetcher>(
         identity_manager,
         BindOnce(&FetcherImpl::StartRequest, Unretained(this),
                  url_loader_factory, GURL(url), request,
-                 std::move(callback)));  // Unretained(.) is safe because `this`
+                 std::move(callback)));  // Unretained() is safe because `this`
                                          // owns `access_token_fetcher_`.
   }
 
@@ -154,23 +155,20 @@
                               std::make_unique<Response>());
       return;
     }
-
-    StringPiece token_value = access_token.value().token;
+    base::StringPiece token_value = access_token.value().token;
     net::NetworkTrafficAnnotationTag traffic_annotation =
         GetDefaultNetworkTrafficAnnotationTag<Request>();
     std::unique_ptr<network::SimpleURLLoader> simple_url_loader =
         InitializeSimpleUrlLoader(request.SerializeAsString(), token_value,
                                   gurl, traffic_annotation);
 
+    DCHECK(simple_url_loader);
     auto* simple_url_loader_ptr = simple_url_loader.get();
     simple_url_loader_ptr->DownloadToStringOfUnboundedSizeUntilCrashAndDie(
         url_loader_factory.get(),
-        BindOnce(
-            &FetcherImpl::OnSimpleUrlLoaderComplete, Unretained(this),
-            std::move(callback),
-            std::move(
-                simple_url_loader)));  // Unretained(.) is safe because `this`
-                                       // owns `access_token_fetcher_`.
+        base::BindOnce(&FetcherImpl::OnSimpleUrlLoaderComplete,
+                       weak_ptr_factory_.GetSafeRef(), std::move(callback),
+                       std::move(simple_url_loader)));
   }
 
   void OnSimpleUrlLoaderComplete(
@@ -196,6 +194,7 @@
   }
 
   std::unique_ptr<KidsAccessTokenFetcher> access_token_fetcher_;
+  base::WeakPtrFactory<FetcherImpl> weak_ptr_factory_{this};
 };
 
 template class FetcherImpl<ListFamilyMembersRequest, ListFamilyMembersResponse>;
@@ -246,25 +245,6 @@
 bool KidsExternalFetcherStatus::IsOk() const {
   return state_ == State::NO_ERROR;
 }
-bool KidsExternalFetcherStatus::IsTransientError() const {
-  if (state_ == State::HTTP_ERROR) {
-    return true;
-  }
-  if (state_ == State::GOOGLE_SERVICE_AUTH_ERROR) {
-    return google_service_auth_error_.IsTransientError();
-  }
-  return false;
-}
-bool KidsExternalFetcherStatus::IsPersistentError() const {
-  if (state_ == State::INVALID_RESPONSE) {
-    return true;
-  }
-  if (state_ == State::GOOGLE_SERVICE_AUTH_ERROR) {
-    return google_service_auth_error_.IsPersistentError();
-  }
-  return false;
-}
-
 KidsExternalFetcherStatus::State KidsExternalFetcherStatus::state() const {
   return state_;
 }
@@ -278,7 +258,7 @@
 FetchListFamilyMembers(
     IdentityManager& identity_manager,
     scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory,
-    StringPiece url,
+    base::StringPiece url,
     KidsExternalFetcher<ListFamilyMembersRequest,
                         ListFamilyMembersResponse>::Callback callback) {
   return std::make_unique<
diff --git a/chrome/browser/supervised_user/kids_chrome_management/kids_external_fetcher.h b/chrome/browser/supervised_user/kids_chrome_management/kids_external_fetcher.h
index 94a35d5..8fccb7f 100644
--- a/chrome/browser/supervised_user/kids_chrome_management/kids_external_fetcher.h
+++ b/chrome/browser/supervised_user/kids_chrome_management/kids_external_fetcher.h
@@ -5,9 +5,10 @@
 #ifndef CHROME_BROWSER_SUPERVISED_USER_KIDS_CHROME_MANAGEMENT_KIDS_EXTERNAL_FETCHER_H_
 #define CHROME_BROWSER_SUPERVISED_USER_KIDS_CHROME_MANAGEMENT_KIDS_EXTERNAL_FETCHER_H_
 
-#include "base/functional/callback_forward.h"
+#include "base/callback.h"
 #include "base/memory/scoped_refptr.h"
 #include "base/strings/string_piece.h"
+#include "chrome/browser/supervised_user/kids_chrome_management/kids_access_token_fetcher.h"
 #include "chrome/browser/supervised_user/kids_chrome_management/kidschromemanagement_messages.pb.h"
 #include "components/signin/public/identity_manager/identity_manager.h"
 #include "google_apis/gaia/google_service_auth_error.h"
@@ -47,11 +48,6 @@
   // KidsExternalFetcherStatus::IsOk iff google_service_auth_error_.state() ==
   // NONE and state_ == NONE
   bool IsOk() const;
-  // Indicates whether the status is not ok, but is worth retrying because it
-  // might go away.
-  bool IsTransientError() const;
-  // Indicates whether the status is not ok and there is no point in retrying.
-  bool IsPersistentError() const;
 
   State state() const;
   const class GoogleServiceAuthError& google_service_auth_error() const;
diff --git a/chrome/browser/supervised_user/kids_chrome_management/kids_management_service.cc b/chrome/browser/supervised_user/kids_chrome_management/kids_management_service.cc
index fc0edbb..a0de0fe5 100644
--- a/chrome/browser/supervised_user/kids_chrome_management/kids_management_service.cc
+++ b/chrome/browser/supervised_user/kids_chrome_management/kids_management_service.cc
@@ -4,331 +4,16 @@
 
 #include "chrome/browser/supervised_user/kids_chrome_management/kids_management_service.h"
 
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "base/functional/bind.h"
-#include "base/functional/callback_forward.h"
-#include "base/no_destructor.h"
-#include "base/ranges/algorithm.h"
-#include "base/strings/string_piece.h"
-#include "base/time/time.h"
-#include "base/types/expected.h"
-#include "chrome/browser/profiles/profile.h"
-#include "chrome/browser/signin/identity_manager_factory.h"
-#include "chrome/browser/signin/signin_util.h"
-#include "chrome/browser/supervised_user/child_accounts/permission_request_creator_apiary.h"
-#include "chrome/browser/supervised_user/kids_chrome_management/families_common.pb.h"
-#include "chrome/browser/supervised_user/kids_chrome_management/kids_external_fetcher.h"
-#include "chrome/browser/supervised_user/kids_chrome_management/kids_profile_manager.h"
-#include "chrome/browser/supervised_user/kids_chrome_management/kidschromemanagement_messages.pb.h"
-#include "chrome/browser/supervised_user/supervised_user_service.h"
-#include "chrome/browser/supervised_user/supervised_user_service_factory.h"
-#include "chrome/browser/sync/sync_service_factory.h"
 #include "components/keyed_service/core/keyed_service.h"
-#include "components/signin/public/identity_manager/identity_manager.h"
-#include "components/signin/public/identity_manager/primary_account_change_event.h"
-#include "components/signin/public/identity_manager/tribool.h"
 #include "content/public/browser/browser_context.h"
-#include "net/base/backoff_entry.h"
-#include "services/network/public/cpp/shared_url_loader_factory.h"
 
 namespace {
-using ::base::BindOnce;
-using ::base::Days;
-using ::base::Hours;
-using ::base::NoDestructor;
-using ::base::OnceCallback;
-using ::base::OnceClosure;
-using ::base::Seconds;
-using ::base::Singleton;
-using ::base::StringPiece;
-using ::base::Unretained;
-using ::base::ranges::find;
 using ::content::BrowserContext;
-using ::kids_chrome_management::FamilyMember;
-using ::kids_chrome_management::FamilyRole;
-using ::kids_chrome_management::ListFamilyMembersResponse;
-using ::net::BackoffEntry;
-using ::network::SharedURLLoaderFactory;
-using ::signin::ConsentLevel;
-using ::signin::IdentityManager;
-using ::signin::PrimaryAccountChangeEvent;
-using ::signin::Tribool;
-using ::signin_util::SetUserSignoutAllowedForProfile;
-
-const BackoffEntry::Policy& GetFamilyFetchBackoffPolicy() {
-  static const BackoffEntry::Policy nonce{
-      // Number of initial errors (in sequence) to ignore before applying
-      // exponential back-off rules.
-      0,
-
-      // Initial delay for exponential backoff.
-      static_cast<int>(Seconds(2).InMilliseconds()),
-
-      // Factor by which the waiting time will be multiplied.
-      2,
-
-      // Fuzzing percentage. ex: 10% will spread requests randomly
-      // between 90%-100% of the calculated time.
-      0.2,  // 20%
-
-      // Maximum amount of time we are willing to delay our request.
-      static_cast<int>(Hours(4).InMilliseconds()),
-
-      // Time to keep an entry from being discarded even when it
-      // has no significant state, -1 to never discard.
-      -1,
-
-      // Don't use initial delay unless the last request was an error.
-      false,
-  };
-  return nonce;
-}
-
-constexpr bool HasSupervisionSupport() {
-#if BUILDFLAG(ENABLE_SUPERVISED_USERS)
-  return true;
-#else
-  return false;
-#endif
-}
-
-constexpr bool IsChromeOs() {
-#if !BUILDFLAG(IS_CHROMEOS)
-  return false;
-#else
-  return true;
-#endif
-}
-
-AccountInfo GetPrimaryAccount(const IdentityManager& identity_manager) {
-  return identity_manager.FindExtendedAccountInfo(
-      identity_manager.GetPrimaryAccountInfo(ConsentLevel::kSignin));
-}
-
-std::vector<const FamilyMember>::iterator FindFamilyMemberWithRole(
-    const std::vector<FamilyMember>& members,
-    const FamilyRole role) {
-  return find(members, role,
-              [](const FamilyMember& member) { return member.role(); });
-}
 }  // namespace
 
-KidsManagementService::KidsManagementService(
-    Profile* profile,
-    IdentityManager& identity_manager,
-    SupervisedUserService& supervised_user_service,
-    PrefService& pref_service,
-    scoped_refptr<SharedURLLoaderFactory> url_loader_factory)
-    : profile_(profile),
-      identity_manager_(identity_manager),
-      supervised_user_service_(supervised_user_service),
-      profile_manager_(pref_service, *profile),
-      url_loader_factory_(url_loader_factory),
-      list_family_members_backoff_(&GetFamilyFetchBackoffPolicy()) {}
-KidsManagementService::~KidsManagementService() = default;
-
-void KidsManagementService::Init() {
-  SupervisedUserServiceFactory::GetForProfile(profile_)->SetDelegate(this);
-  identity_manager_.AddObserver(this);
-
-  // If we're already signed in, check the account immediately just to be sure.
-  // (We might have missed an update before registering as an observer.)
-  // "Unconsented" because this class doesn't care about browser sync consent.
-  AccountInfo primary_account_info = GetPrimaryAccount(identity_manager_);
-  if (!primary_account_info.IsEmpty()) {
-    OnExtendedAccountInfoUpdated(primary_account_info);
-  }
-}
-
-void KidsManagementService::Shutdown() {
-  list_family_members_timer_.Stop();
-  list_family_members_fetcher_.reset();
-
-  identity_manager_.RemoveObserver(this);
-  SupervisedUserServiceFactory::GetForProfile(profile_)->SetDelegate(nullptr);
-}
-
-bool KidsManagementService::IsChildAccountStatusKnown() const {
-  return profile_manager_.IsChildAccountStatusKnown();
-}
-
-bool KidsManagementService::IsFetchFamilyMembersStarted() const {
-  return !!(list_family_members_fetcher_);
-}
-
-CoreAccountId KidsManagementService::GetAuthAccountId() const {
-  return identity_manager_.GetPrimaryAccountId(ConsentLevel::kSignin);
-}
-
-void KidsManagementService::AddChildStatusReceivedCallback(
-    OnceClosure callback) {
-  if (IsChildAccountStatusKnown()) {
-    std::move(callback).Run();
-    return;
-  }
-  status_received_listeners_.push_back(std::move(callback));
-}
-
-void KidsManagementService::SetActive(bool newValue) {
-  if (!profile_manager_.IsChildAccount()) {
-    return;
-  }
-  if (newValue == IsFetchFamilyMembersStarted()) {
-    return;
-  }
-
-  if (!IsChromeOs()) {
-    SetUserSignoutAllowedForProfile(profile_, !newValue);
-  }
-
-  if (newValue) {
-    StartFetchFamilyMembers();
-    DCHECK(IsFetchFamilyMembersStarted())
-        << "StartFetchFamilyMembers should make the status started";
-
-    // Registers a request for permission for the user to access a blocked site.
-    supervised_user_service_.web_approvals_manager()
-        .AddRemoteApprovalRequestCreator(
-            PermissionRequestCreatorApiary::CreateWithProfile(profile_));
-  } else {
-    StopFetchFamilyMembers();
-    DCHECK(!IsFetchFamilyMembersStarted())
-        << "StopFetchFamilyMembers should make the status stopped";
-  }
-}
-
-void KidsManagementService::OnPrimaryAccountChanged(
-    const PrimaryAccountChangeEvent& event_details) {
-  if (event_details.GetEventTypeFor(signin::ConsentLevel::kSignin) ==
-      signin::PrimaryAccountChangeEvent::Type::kSet) {
-    AccountInfo account_info = identity_manager_.FindExtendedAccountInfo(
-        event_details.GetCurrentState().primary_account);
-    if (!account_info.IsEmpty()) {
-      OnExtendedAccountInfoUpdated(account_info);
-    }
-    // Otherwise OnExtendedAccountInfoUpdated will be notified once
-    // the account info is available.
-  }
-}
-
-void KidsManagementService::OnExtendedAccountInfoUpdated(
-    const AccountInfo& account_info) {
-  if (GetAuthAccountId() == account_info.account_id) {
-    return;
-  }
-
-  if (!HasSupervisionSupport()) {
-    SetIsChildAccount(false);
-    return;
-  }
-
-  SetIsChildAccount(account_info.is_child_account == Tribool::kTrue);
-}
-
-void KidsManagementService::OnExtendedAccountInfoRemoved(
-    const AccountInfo& account_info) {
-  if (GetAuthAccountId() == account_info.account_id) {
-    return;
-  }
-  SetIsChildAccount(false);
-}
-
-void KidsManagementService::SetIsChildAccount(bool is_child_account) {
-  profile_manager_.UpdateChildAccountStatus(is_child_account);
-
-  for (OnceClosure& callback : status_received_listeners_) {
-    std::move(callback).Run();
-  }
-  status_received_listeners_.clear();
-}
-
-void KidsManagementService::StartFetchFamilyMembers() {
-  list_family_members_fetcher_ = FetchListFamilyMembers(
-      identity_manager_, url_loader_factory_, GetEndpointUrl(),
-      BindOnce(&KidsManagementService::ConsumeListFamilyMembers,
-               Unretained(this)));
-}
-
-void KidsManagementService::StopFetchFamilyMembers() {
-  list_family_members_fetcher_.reset();
-  list_family_members_timer_.Stop();
-}
-
-void KidsManagementService::ConsumeListFamilyMembers(
-    KidsExternalFetcherStatus status,
-    std::unique_ptr<ListFamilyMembersResponse> response) {
-  if (status.IsTransientError()) {
-    list_family_members_backoff_.InformOfRequest(false);
-    list_family_members_timer_.Start(
-        FROM_HERE, list_family_members_backoff_.GetTimeUntilRelease(), this,
-        &KidsManagementService::StartFetchFamilyMembers);
-    return;
-  }
-  if (status.IsPersistentError()) {
-    return;
-  }
-
-  DCHECK(status.IsOk());
-
-  family_members_ = std::vector<kids_chrome_management::FamilyMember>(
-      response->members().begin(), response->members().end());
-
-  auto head_of_household = FindFamilyMemberWithRole(
-      family_members_, kids_chrome_management::HEAD_OF_HOUSEHOLD);
-  auto parent =
-      FindFamilyMemberWithRole(family_members_, kids_chrome_management::PARENT);
-
-  if (head_of_household != family_members_.end()) {
-    profile_manager_.SetFirstCustodian(*head_of_household);
-  }
-  if (parent != family_members_.end()) {
-    profile_manager_.SetSecondCustodian(*parent);
-  }
-  list_family_members_backoff_.InformOfRequest(true);
-  list_family_members_timer_.Start(
-      FROM_HERE, Days(1), this,
-      &KidsManagementService::StartFetchFamilyMembers);
-}
-
-bool KidsManagementService::IsPendingNextFetchFamilyMembers() const {
-  return list_family_members_timer_.IsRunning();
-}
-
-const std::string& KidsManagementService::GetEndpointUrl() {
-  static const NoDestructor<std::string> nonce(
-      "https://kidsmanagement-pa.googleapis.com/kidsmanagement/v1/");
-  return *nonce;
-}
-
-KidsManagementServiceFactory::KidsManagementServiceFactory()
-    : ProfileKeyedServiceFactory("KidsManagementService") {
-  DependsOn(IdentityManagerFactory::GetInstance());
-  DependsOn(SyncServiceFactory::GetInstance());
-  DependsOn(SupervisedUserServiceFactory::GetInstance());
-}
-KidsManagementServiceFactory::~KidsManagementServiceFactory() = default;
-
-KidsManagementService* KidsManagementServiceFactory::GetForProfile(
-    Profile* profile) {
-  return static_cast<KidsManagementService*>(
-      GetInstance()->GetServiceForBrowserContext(profile, /*create=*/true));
-}
-
-// static
-KidsManagementServiceFactory* KidsManagementServiceFactory::GetInstance() {
-  return Singleton<KidsManagementServiceFactory>::get();
-}
-
 // Builds the service instance and its local dependencies.
 // The profile dependency is needed to verify the dynamic child account status.
 KeyedService* KidsManagementServiceFactory::BuildServiceInstanceFor(
     BrowserContext* browser_context) const {
-  Profile* profile = Profile::FromBrowserContext(browser_context);
-  return new KidsManagementService(
-      profile, *IdentityManagerFactory::GetForProfile(profile),
-      *SupervisedUserServiceFactory::GetForProfile(profile),
-      *profile->GetPrefs(), profile->GetURLLoaderFactory());
+  return new KidsManagementService();
 }
diff --git a/chrome/browser/supervised_user/kids_chrome_management/kids_management_service.h b/chrome/browser/supervised_user/kids_chrome_management/kids_management_service.h
index d0c6605..9166091 100644
--- a/chrome/browser/supervised_user/kids_chrome_management/kids_management_service.h
+++ b/chrome/browser/supervised_user/kids_chrome_management/kids_management_service.h
@@ -5,114 +5,14 @@
 #ifndef CHROME_BROWSER_SUPERVISED_USER_KIDS_CHROME_MANAGEMENT_KIDS_MANAGEMENT_SERVICE_H_
 #define CHROME_BROWSER_SUPERVISED_USER_KIDS_CHROME_MANAGEMENT_KIDS_MANAGEMENT_SERVICE_H_
 
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "base/functional/callback.h"
-#include "base/functional/callback_forward.h"
-#include "base/memory/scoped_refptr.h"
 #include "base/memory/singleton.h"
-#include "base/strings/string_piece.h"
-#include "base/timer/timer.h"
-#include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/profiles/profile_keyed_service_factory.h"
-#include "chrome/browser/supervised_user/kids_chrome_management/kids_external_fetcher.h"
-#include "chrome/browser/supervised_user/kids_chrome_management/kids_profile_manager.h"
-#include "chrome/browser/supervised_user/kids_chrome_management/kidschromemanagement_messages.pb.h"
-#include "chrome/browser/supervised_user/supervised_user_service.h"
 #include "components/keyed_service/core/keyed_service.h"
-#include "components/prefs/pref_service.h"
-#include "components/signin/public/identity_manager/account_info.h"
-#include "components/signin/public/identity_manager/identity_manager.h"
-#include "components/signin/public/identity_manager/primary_account_change_event.h"
 #include "content/public/browser/browser_context.h"
-#include "net/base/backoff_entry.h"
-#include "services/network/public/cpp/shared_url_loader_factory.h"
 
 // A keyed service aggregating services for respective RPCs in
 // KidsManagementAPI.
-class KidsManagementService : public KeyedService,
-                              public signin::IdentityManager::Observer,
-                              SupervisedUserService::Delegate {
- public:
-  KidsManagementService() = delete;
-  KidsManagementService(
-      Profile* profile,
-      signin::IdentityManager& identity_manager,
-      SupervisedUserService& supervised_user_service,
-      PrefService& pref_service,
-      scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory);
-  KidsManagementService(const KidsManagementService&) = delete;
-  KidsManagementService& operator=(const KidsManagementService&) = delete;
-  ~KidsManagementService() override;
-
-  // KeyedService implementation
-  void Shutdown() override;
-
-  // signin::IdentityManager::Observer implementation
-  void OnPrimaryAccountChanged(
-      const signin::PrimaryAccountChangeEvent& event_details) override;
-  void OnExtendedAccountInfoUpdated(const AccountInfo& info) override;
-  void OnExtendedAccountInfoRemoved(const AccountInfo& info) override;
-
-  // SupervisedUserService::Delegate implementation
-  void SetActive(bool active) override;
-
-  // Framework initialization in the profile manager.
-  void Init();
-
-  // Initiates the fetch sequence with dependencies, and writes the result onto
-  // this instance.
-  void StartFetchFamilyMembers();
-  void StopFetchFamilyMembers();
-
-  // Returns true iff next fetch of family is scheduled.
-  bool IsPendingNextFetchFamilyMembers() const;
-
-  // Returns true if fetching mechanism is started.
-  bool IsFetchFamilyMembersStarted() const;
-
-  const std::vector<kids_chrome_management::FamilyMember>& family_members()
-      const {
-    return family_members_;
-  }
-
-  static const std::string& GetEndpointUrl();
-
-  // 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() const;
-  // Notifies observers about received status.
-  void AddChildStatusReceivedCallback(base::OnceClosure callback);
-
- private:
-  using ListFamilyMembersFetcher =
-      KidsExternalFetcher<kids_chrome_management::ListFamilyMembersRequest,
-                          kids_chrome_management::ListFamilyMembersResponse>;
-  void ConsumeListFamilyMembers(
-      KidsExternalFetcherStatus status,
-      std::unique_ptr<kids_chrome_management::ListFamilyMembersResponse>
-          response);
-
-  void SetIsChildAccount(bool is_child_account);
-
-  CoreAccountId GetAuthAccountId() const;
-
-  Profile* profile_;  // TODO(b/252793687): remove direct uses of the profile.
-  signin::IdentityManager& identity_manager_;
-  SupervisedUserService& supervised_user_service_;
-  KidsProfileManager profile_manager_;
-  scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory_;
-
-  std::vector<base::OnceClosure> status_received_listeners_;
-
-  // Data members related to fetching the list of family members
-  std::vector<kids_chrome_management::FamilyMember> family_members_;
-  net::BackoffEntry list_family_members_backoff_;
-  std::unique_ptr<ListFamilyMembersFetcher> list_family_members_fetcher_;
-  base::OneShotTimer list_family_members_timer_;
-};
+class KidsManagementService : public KeyedService {};
 
 // The framework binding for the KidsManagementAPI service.
 class KidsManagementServiceFactory : public ProfileKeyedServiceFactory {
diff --git a/chrome/browser/supervised_user/kids_chrome_management/kids_management_service_unittest.cc b/chrome/browser/supervised_user/kids_chrome_management/kids_management_service_unittest.cc
deleted file mode 100644
index 1e0da39..0000000
--- a/chrome/browser/supervised_user/kids_chrome_management/kids_management_service_unittest.cc
+++ /dev/null
@@ -1,359 +0,0 @@
-// Copyright 2022 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/supervised_user/kids_chrome_management/kids_management_service.h"
-
-#include <cstddef>
-#include <memory>
-#include <string>
-
-#include "base/strings/string_piece_forward.h"
-#include "base/test/bind.h"
-#include "base/test/task_environment.h"
-#include "base/time/time.h"
-#include "chrome/browser/signin/chrome_signin_client_factory.h"
-#include "chrome/browser/signin/identity_test_environment_profile_adaptor.h"
-#include "chrome/browser/supervised_user/kids_chrome_management/families_common.pb.h"
-#include "chrome/browser/supervised_user/kids_chrome_management/kidschromemanagement_messages.pb.h"
-#include "chrome/browser/supervised_user/supervised_user_service.h"
-#include "chrome/browser/supervised_user/supervised_user_service_factory.h"
-#include "chrome/browser/sync/sync_service_factory.h"
-#include "chrome/common/pref_names.h"
-#include "chrome/test/base/testing_profile.h"
-#include "components/signin/public/base/test_signin_client.h"
-#include "components/signin/public/identity_manager/identity_manager.h"
-#include "components/signin/public/identity_manager/identity_test_environment.h"
-#include "content/public/test/browser_task_environment.h"
-#include "services/network/public/cpp/weak_wrapper_shared_url_loader_factory.h"
-#include "services/network/test/test_url_loader_factory.h"
-#include "services/network/test/test_utils.h"
-#include "testing/gmock/include/gmock/gmock.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace {
-
-using ::base::StringPiece;
-using ::base::Time;
-using ::kids_chrome_management::FamilyMember;
-using ::kids_chrome_management::FamilyRole;
-using ::kids_chrome_management::ListFamilyMembersRequest;
-using ::kids_chrome_management::ListFamilyMembersResponse;
-using ::network::TestURLLoaderFactory;
-using ::signin::ConsentLevel;
-using ::signin::IdentityTestEnvironment;
-
-std::unique_ptr<KeyedService> MakeTestSigninClient(
-    content::BrowserContext* context) {
-  Profile* profile = Profile::FromBrowserContext(context);
-  return std::make_unique<TestSigninClient>(profile->GetPrefs());
-}
-
-std::unique_ptr<TestingProfile> MakeTestingProfile(
-    network::TestURLLoaderFactory& test_url_loader_factory,
-    bool is_supervised = true) {
-  TestingProfile::Builder builder;
-  builder.SetSharedURLLoaderFactory(
-      base::MakeRefCounted<network::WeakWrapperSharedURLLoaderFactory>(
-          &test_url_loader_factory));
-  builder.AddTestingFactory(ChromeSigninClientFactory::GetInstance(),
-                            base::BindRepeating(&MakeTestSigninClient));
-  builder.AddTestingFactory(SyncServiceFactory::GetInstance(),
-                            SyncServiceFactory::GetDefaultFactory());
-  if (is_supervised) {
-    builder.SetIsSupervisedProfile();
-  }
-  return IdentityTestEnvironmentProfileAdaptor::
-      CreateProfileForIdentityTestEnvironment(builder);
-}
-
-FamilyMember* AddFamilyMember(ListFamilyMembersResponse& response,
-                              FamilyRole role,
-                              StringPiece display_name,
-                              StringPiece user_id,
-                              StringPiece email) {
-  FamilyMember* member = response.add_members();
-  member->set_role(role);
-  *member->mutable_profile()->mutable_display_name() =
-      std::string(display_name);
-  *member->mutable_profile()->mutable_obfuscated_user_id() =
-      std::string(user_id);
-  *member->mutable_profile()->mutable_email() = std::string(email);
-  return member;
-}
-
-FamilyMember* AddParentTo(ListFamilyMembersResponse& response) {
-  return AddFamilyMember(response, FamilyRole::PARENT, "Alice", "alice_id",
-                         "alice@gmail.com");
-}
-FamilyMember* AddHeadOfHouseholdTo(ListFamilyMembersResponse& response) {
-  return AddFamilyMember(response, FamilyRole::HEAD_OF_HOUSEHOLD, "Bob",
-                         "bob_id", "bob@gmail.com");
-}
-FamilyMember* AddChildTo(ListFamilyMembersResponse& response) {
-  return AddFamilyMember(response, FamilyRole::CHILD, "Eve", "eve_id",
-                         "eve@gmail.com");
-}
-
-class KidsManagementServiceTest : public ::testing::Test {
- protected:
-  void ActivateValidAccessToken() {
-    identity_test_environment
-        ->WaitForAccessTokenRequestIfNecessaryAndRespondWithToken(
-            "access_token", Time::Max());
-  }
-  void ActivateInvalidAccessToken(GoogleServiceAuthError error) {
-    identity_test_environment
-        ->WaitForAccessTokenRequestIfNecessaryAndRespondWithError(error);
-  }
-  AccountInfo CreatePrimaryAccount(StringPiece email = "joedoe@gmail.com") {
-    return identity_test_environment->MakePrimaryAccountAvailable(
-        std::string(email), ConsentLevel::kSignin);
-  }
-
-  content::BrowserTaskEnvironment task_environment_{
-      base::test::TaskEnvironment::TimeSource::
-          MOCK_TIME};  // The test must run on Chrome_UIThread.
-  network::TestURLLoaderFactory test_url_loader_factory_;
-  std::unique_ptr<TestingProfile> profile_ =
-      MakeTestingProfile(test_url_loader_factory_);
-  KidsManagementService* under_test_ =
-      KidsManagementServiceFactory::GetForProfile(profile_.get());
-  IdentityTestEnvironmentProfileAdaptor
-      identity_test_environment_profile_adaptor_{
-          profile_.get()};  // Must be owned by test fixture.
-  IdentityTestEnvironment* identity_test_environment{
-      identity_test_environment_profile_adaptor_.identity_test_env()};
-};
-
-// Test if the data from endpoint is properly stored in the service.
-TEST_F(KidsManagementServiceTest, FetchesData) {
-  ListFamilyMembersResponse response;
-  response.set_self_obfuscated_gaia_id("gaia_id");
-  FamilyMember* member = AddChildTo(response);
-
-  identity_test_environment->MakePrimaryAccountAvailable(
-      member->profile().email(), ConsentLevel::kSignin);
-
-  under_test_->StartFetchFamilyMembers();
-  ActivateValidAccessToken();
-
-  test_url_loader_factory_.SimulateResponseForPendingRequest(
-      under_test_->GetEndpointUrl(), response.SerializeAsString());
-
-  ASSERT_EQ(under_test_->family_members().size(), std::size_t(1));
-  EXPECT_EQ(under_test_->family_members().at(0).profile().display_name(),
-            member->profile().display_name());
-}
-
-// Test if the parent and head of household are set.
-TEST_F(KidsManagementServiceTest, SetsCustodians) {
-  ListFamilyMembersResponse response;
-  response.set_self_obfuscated_gaia_id("gaia_id");
-  FamilyMember* child = AddChildTo(response);
-  FamilyMember* parent = AddParentTo(response);
-  FamilyMember* head_of_household = AddHeadOfHouseholdTo(response);
-
-  CreatePrimaryAccount(child->profile().email());
-
-  under_test_->StartFetchFamilyMembers();
-
-  ActivateValidAccessToken();
-
-  test_url_loader_factory_.SimulateResponseForPendingRequest(
-      under_test_->GetEndpointUrl(), response.SerializeAsString());
-
-  EXPECT_EQ(profile_->GetTestingPrefService()->GetString(
-                prefs::kSupervisedUserCustodianName),
-            head_of_household->profile().display_name());
-  EXPECT_EQ(profile_->GetTestingPrefService()->GetString(
-                prefs::kSupervisedUserSecondCustodianName),
-            parent->profile().display_name());
-}
-
-// Test if the daily fetches are scheduled.
-TEST_F(KidsManagementServiceTest, SchedulesNextFetch) {
-  ListFamilyMembersResponse response;
-  response.set_self_obfuscated_gaia_id("gaia_id");
-  FamilyMember* child = AddChildTo(response);
-
-  CreatePrimaryAccount(child->profile().email());
-
-  under_test_->StartFetchFamilyMembers();
-  EXPECT_FALSE(under_test_->IsPendingNextFetchFamilyMembers());
-  ActivateValidAccessToken();
-  test_url_loader_factory_.SimulateResponseForPendingRequest(
-      under_test_->GetEndpointUrl(), response.SerializeAsString());
-
-  EXPECT_TRUE(under_test_->IsPendingNextFetchFamilyMembers());
-}
-
-// Test if server's persistent error is ignored to avoid ddosing it.
-TEST_F(KidsManagementServiceTest, PersistentErrorsAreNotRetried) {
-  CreatePrimaryAccount();
-
-  under_test_->StartFetchFamilyMembers();
-  EXPECT_FALSE(under_test_->IsPendingNextFetchFamilyMembers());
-  ActivateValidAccessToken();
-  test_url_loader_factory_.SimulateResponseForPendingRequest(
-      under_test_->GetEndpointUrl(), "garbage");
-
-  // Mocking time and FastForwardBy is impossible:
-  // https://chromium.googlesource.com/chromium/src/+/master/docs/threading_and_tasks_testing.md#mock_time-in-browser-tests
-  EXPECT_FALSE(under_test_->IsPendingNextFetchFamilyMembers());
-}
-
-// Test if auth's transient errors are scheduled for retry.
-TEST_F(KidsManagementServiceTest, TransientAuthErrorsAreRetried) {
-  CreatePrimaryAccount();
-
-  under_test_->StartFetchFamilyMembers();
-  EXPECT_FALSE(under_test_->IsPendingNextFetchFamilyMembers());
-
-  GoogleServiceAuthError error(
-      GoogleServiceAuthError::State::CONNECTION_FAILED);
-  ASSERT_TRUE(error.IsTransientError());
-  ActivateInvalidAccessToken(error);
-
-  // Mocking time and FastForwardBy is impossible:
-  // https://chromium.googlesource.com/chromium/src/+/master/docs/threading_and_tasks_testing.md#mock_time-in-browser-tests
-  EXPECT_TRUE(under_test_->IsPendingNextFetchFamilyMembers());
-}
-
-// Test if auth's persistent errors are not scheduled for retry.
-TEST_F(KidsManagementServiceTest, PersistentAuthErrorsAreNotRetried) {
-  CreatePrimaryAccount();
-
-  under_test_->StartFetchFamilyMembers();
-  EXPECT_FALSE(under_test_->IsPendingNextFetchFamilyMembers());
-
-  GoogleServiceAuthError error(
-      GoogleServiceAuthError::State::INVALID_GAIA_CREDENTIALS);
-  ASSERT_TRUE(error.IsPersistentError());
-  ActivateInvalidAccessToken(error);
-
-  // Mocking time and FastForwardBy is impossible:
-  // https://chromium.googlesource.com/chromium/src/+/master/docs/threading_and_tasks_testing.md#mock_time-in-browser-tests
-  EXPECT_FALSE(under_test_->IsPendingNextFetchFamilyMembers());
-}
-
-// Test if server's transient errors are scheduled for retry.
-TEST_F(KidsManagementServiceTest, TransientServerErrorsAreRetried) {
-  CreatePrimaryAccount();
-
-  under_test_->StartFetchFamilyMembers();
-  EXPECT_FALSE(under_test_->IsPendingNextFetchFamilyMembers());
-
-  ActivateValidAccessToken();
-  test_url_loader_factory_.SimulateResponseForPendingRequest(
-      under_test_->GetEndpointUrl(), /*content=*/"", net::HTTP_BAD_REQUEST);
-
-  // Mocking time and FastForwardBy is impossible:
-  // https://chromium.googlesource.com/chromium/src/+/master/docs/threading_and_tasks_testing.md#mock_time-in-browser-tests
-  EXPECT_TRUE(under_test_->IsPendingNextFetchFamilyMembers());
-}
-
-// Tests whether the service handles the creation of accounts.
-TEST_F(KidsManagementServiceTest, HandlePrimaryAccountChange) {
-  bool state{false};
-
-  identity_test_environment->identity_manager()->AddObserver(under_test_);
-  under_test_->AddChildStatusReceivedCallback(
-      base::BindLambdaForTesting([&state] { state = true; }));
-
-  EXPECT_FALSE(state);
-  AccountInfo account_info = CreatePrimaryAccount();
-  account_info.picture_url = "http://example.com/picture.jpg";
-  ASSERT_FALSE(account_info.IsEmpty())
-      << "Setting picture_url should make account_info non-empty.";
-  identity_test_environment->UpdateAccountInfoForAccount(account_info);
-  EXPECT_TRUE(state);
-}
-
-// Tests whether the service handles the removal of accounts.
-TEST_F(KidsManagementServiceTest, HandlePrimaryAccountRemoval) {
-#if BUILDFLAG(IS_CHROMEOS_ASH)
-  GTEST_SKIP() << "Removing primary accounts is not supported in ChromeOs, see "
-                  "https://source.chromium.org/chromium/chromium/src/+/"
-                  "main:components/signin/public/identity_manager/"
-                  "identity_test_utils.cc;l=258;drc="
-                  "53ff537cffdec939a5cb20fdb7df69f812d4a421 for reference";
-#else
-
-  identity_test_environment->identity_manager()->AddObserver(under_test_);
-  AccountInfo account_info = CreatePrimaryAccount();
-  account_info.picture_url = "http://example.com/picture.jpg";
-  ASSERT_FALSE(account_info.IsEmpty())
-      << "Setting picture_url should make account_info non-empty.";
-  identity_test_environment->UpdateAccountInfoForAccount(account_info);
-
-  {
-    // The account status was still known when callback was registered, so it
-    // was called immediately.
-    bool state{false};
-    under_test_->AddChildStatusReceivedCallback(
-        base::BindLambdaForTesting([&state] { state = true; }));
-    EXPECT_TRUE(state);
-  }
-
-  {
-    // The account status was still known when callback was registered, so it
-    // was called immediately.
-    identity_test_environment->ClearPrimaryAccount();
-    bool state{false};
-    under_test_->AddChildStatusReceivedCallback(
-        base::BindLambdaForTesting([&state] { state = true; }));
-    EXPECT_TRUE(state);
-  }
-#endif
-}
-
-TEST_F(KidsManagementServiceTest, IsStoppable) {
-  EXPECT_FALSE(under_test_->IsFetchFamilyMembersStarted());
-
-  // One way to make the service active and inactive.
-  under_test_->StartFetchFamilyMembers();
-  EXPECT_TRUE(under_test_->IsFetchFamilyMembersStarted());
-
-  under_test_->StopFetchFamilyMembers();
-  EXPECT_FALSE(under_test_->IsFetchFamilyMembersStarted());
-
-  // Another way to do so.
-  under_test_->SetActive(true);
-  EXPECT_TRUE(under_test_->IsFetchFamilyMembersStarted());
-
-  under_test_->SetActive(false);
-  EXPECT_FALSE(under_test_->IsFetchFamilyMembersStarted());
-}
-
-// If the primary account is not supervised, the service must not be activated.
-TEST_F(KidsManagementServiceTest, DoesNotActivate) {
-  std::unique_ptr<TestingProfile> unsupervised_profile =
-      MakeTestingProfile(test_url_loader_factory_, /* is_supervised=*/false);
-  KidsManagementService* under_test =
-      KidsManagementServiceFactory::GetForProfile(unsupervised_profile.get());
-
-  under_test->SetActive(true);
-  EXPECT_FALSE(under_test->IsFetchFamilyMembersStarted());
-}
-
-TEST_F(KidsManagementServiceTest, ActivationIsIdempotent) {
-  EXPECT_FALSE(under_test_->IsFetchFamilyMembersStarted());
-
-  under_test_->SetActive(true);
-  EXPECT_TRUE(under_test_->IsFetchFamilyMembersStarted());
-
-  under_test_->SetActive(true);
-  EXPECT_TRUE(under_test_->IsFetchFamilyMembersStarted());
-}
-
-// If the delegate for SupervisedUserService is properly set, activating the
-// SupervisedUserService will activate the service under test.
-TEST_F(KidsManagementServiceTest, InitSetsSupervisedUserServiceDelegate) {
-  under_test_->Init();
-  EXPECT_FALSE(under_test_->IsFetchFamilyMembersStarted());
-
-  SupervisedUserServiceFactory::GetForProfile(profile_.get())->Init();
-  EXPECT_TRUE(under_test_->IsFetchFamilyMembersStarted());
-}
-}  // namespace
diff --git a/chrome/browser/supervised_user/kids_chrome_management/kids_profile_manager.cc b/chrome/browser/supervised_user/kids_chrome_management/kids_profile_manager.cc
index ea32880..5b8dd25c 100644
--- a/chrome/browser/supervised_user/kids_chrome_management/kids_profile_manager.cc
+++ b/chrome/browser/supervised_user/kids_chrome_management/kids_profile_manager.cc
@@ -16,6 +16,14 @@
 namespace {
 using ::base::StringPiece;
 using ::kids_chrome_management::FamilyMember;
+
+bool IsChildAccount(const Profile& profile) {
+  return profile
+      .IsChild();  // TODO(b/252793687): Use AccountInfo.is_child_account ==
+                   // Tribool::kTrue once setting child status is possible in
+                   // test and remove the direct Profile dependency.
+}
+
 }  // namespace
 
 KidsProfileManager::KidsProfileManager(PrefService& pref_service,
@@ -38,15 +46,8 @@
       pref_service_(pref_service),
       profile_(profile) {}
 
-bool KidsProfileManager::IsChildAccount() const {
-  return profile_
-      .IsChild();  // TODO(b/252793687): Use AccountInfo.is_child_account ==
-                   // Tribool::kTrue once setting child status is possible in
-                   // test and remove the direct Profile dependency.
-}
-
 void KidsProfileManager::UpdateChildAccountStatus(bool is_child_account) {
-  if (IsChildAccount() != is_child_account) {
+  if (IsChildAccount(profile_) != is_child_account) {
     if (is_child_account) {
       supervised_user_id_.Set(StringPiece(supervised_users::kChildAccountSUID));
     } else {
diff --git a/chrome/browser/supervised_user/kids_chrome_management/kids_profile_manager.h b/chrome/browser/supervised_user/kids_chrome_management/kids_profile_manager.h
index 0893bdc..033f46f3 100644
--- a/chrome/browser/supervised_user/kids_chrome_management/kids_profile_manager.h
+++ b/chrome/browser/supervised_user/kids_chrome_management/kids_profile_manager.h
@@ -13,7 +13,7 @@
 // A helper utility to manage the Profile properties consistently.
 class KidsProfileManager {
  public:
-  // An individual property which can be read and written.
+  // An invididual property which can be read and written.
   class Property {
    public:
     Property() = delete;
@@ -56,7 +56,6 @@
                      Profile& profile);
   void UpdateChildAccountStatus(bool is_child_account);
   bool IsChildAccountStatusKnown() const;
-  bool IsChildAccount() const;
   void SetFirstCustodian(kids_chrome_management::FamilyMember member);
   void SetSecondCustodian(kids_chrome_management::FamilyMember member);
 
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn
index 2d70294..877f2bb 100644
--- a/chrome/test/BUILD.gn
+++ b/chrome/test/BUILD.gn
@@ -8971,7 +8971,6 @@
       "../browser/supervised_user/child_accounts/permission_request_creator_apiary_unittest.cc",
       "../browser/supervised_user/kids_chrome_management/kids_access_token_fetcher_unittest.cc",
       "../browser/supervised_user/kids_chrome_management/kids_external_fetcher_unittest.cc",
-      "../browser/supervised_user/kids_chrome_management/kids_management_service_unittest.cc",
       "../browser/supervised_user/kids_chrome_management/kids_profile_manager_unittest.cc",
       "../browser/supervised_user/kids_management_url_checker_client_unittest.cc",
       "../browser/supervised_user/parental_control_metrics_unittest.cc",