chromium/chrome/browser/ash/account_manager/account_manager_edu_coexistence_controller.h

// Copyright 2020 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef CHROME_BROWSER_ASH_ACCOUNT_MANAGER_ACCOUNT_MANAGER_EDU_COEXISTENCE_CONTROLLER_H_
#define CHROME_BROWSER_ASH_ACCOUNT_MANAGER_ACCOUNT_MANAGER_EDU_COEXISTENCE_CONTROLLER_H_

#include <string>
#include <vector>

#include "base/functional/callback.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
#include "components/account_id/account_id.h"
#include "components/account_manager_core/account.h"
#include "components/prefs/pref_change_registrar.h"

class PrefRegistrySimple;
class Profile;

namespace account_manager {
class AccountManagerFacade;
class AccountManager;
}

namespace ash {

// Listens to changes to prefs::kEduCoexistenceToSVersion policy
// preference and invalidates secondary edu accounts with outdated terms of
// service version.
class EduCoexistenceConsentInvalidationController {
 public:
  static void RegisterProfilePrefs(PrefRegistrySimple* registry);

  EduCoexistenceConsentInvalidationController(
      Profile* profile,
      account_manager::AccountManager* account_manager,
      account_manager::AccountManagerFacade* account_manager_facade,
      const AccountId& device_account_id);
  EduCoexistenceConsentInvalidationController(
      const EduCoexistenceConsentInvalidationController&) = delete;
  EduCoexistenceConsentInvalidationController& operator=(
      const EduCoexistenceConsentInvalidationController&) = delete;
  ~EduCoexistenceConsentInvalidationController();

  // Accesses the list from AccountManager to update the list of accounts stored
  // in prefs::kEduCoexistenceToSAcceptedVersion.
  void Init();

 private:
  // Removes accounts which may have been stored in pref but which have since
  // been removed as a secondary account.
  // Secondary edu accounts may have already been added to device prior to M88.
  // Therefore, it updates the
  // prefs::kEduCoexistenceToSAcceptedVersion pref to include those
  // accounts.
  void UpdateEduAccountsInTermsOfServicePref(
      const std::vector<::account_manager::Account>& accounts);

  void TermsOfServicePrefChanged();

  void InvalidateEduAccounts(
      const std::vector<std::string>& account_emails_to_invalidate,
      const std::vector<::account_manager::Account>& accounts);

  const raw_ptr<Profile> profile_;
  const raw_ptr<account_manager::AccountManager> account_manager_;
  const raw_ptr<account_manager::AccountManagerFacade> account_manager_facade_;
  const AccountId device_account_id_;
  PrefChangeRegistrar pref_change_registrar_;
  base::WeakPtrFactory<EduCoexistenceConsentInvalidationController>
      weak_factory_{this};
};

}  // namespace ash

#endif  // CHROME_BROWSER_ASH_ACCOUNT_MANAGER_ACCOUNT_MANAGER_EDU_COEXISTENCE_CONTROLLER_H_