blob: 2ca8d2c6b500beb1dda8b83fc2f14af6c6b95cb0 [file] [log] [blame]
// Copyright 2018 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_UI_WEBUI_SETTINGS_CHROMEOS_ACCOUNT_MANAGER_HANDLER_H_
#define CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_ACCOUNT_MANAGER_HANDLER_H_
#include <vector>
#include "base/memory/weak_ptr.h"
#include "base/scoped_observation.h"
#include "chrome/browser/ash/account_manager/account_apps_availability.h"
#include "chrome/browser/ui/webui/settings/settings_page_ui_handler.h"
#include "components/account_id/account_id.h"
#include "components/account_manager_core/account.h"
#include "components/account_manager_core/account_manager_facade.h"
#include "components/account_manager_core/chromeos/account_manager.h"
#include "components/signin/public/identity_manager/identity_manager.h"
class Profile;
namespace chromeos {
namespace settings {
class AccountManagerUIHandler
: public ::settings::SettingsPageUIHandler,
public account_manager::AccountManagerFacade::Observer,
public signin::IdentityManager::Observer,
public ash::AccountAppsAvailability::Observer {
public:
// Accepts non-owning pointers to |account_manager::AccountManager|,
// |AccountManagerFacade| and |IdentityManager|. Both of these must outlive
// |this| instance.
AccountManagerUIHandler(
account_manager::AccountManager* account_manager,
account_manager::AccountManagerFacade* account_manager_facade,
signin::IdentityManager* identity_manager,
ash::AccountAppsAvailability* account_apps_availability);
AccountManagerUIHandler(const AccountManagerUIHandler&) = delete;
AccountManagerUIHandler& operator=(const AccountManagerUIHandler&) = delete;
~AccountManagerUIHandler() override;
// WebUIMessageHandler implementation.
void RegisterMessages() override;
void OnJavascriptAllowed() override;
void OnJavascriptDisallowed() override;
// |AccountManagerFacade::Observer| overrides.
// |account_manager::AccountManager| is considered to be the source of truth
// for account information.
void OnAccountUpserted(const ::account_manager::Account& account) override;
void OnAccountRemoved(const ::account_manager::Account& account) override;
// |signin::IdentityManager::Observer| overrides.
void OnRefreshTokenUpdatedForAccount(const CoreAccountInfo& info) override;
void OnExtendedAccountInfoUpdated(const AccountInfo& info) override;
void OnErrorStateOfRefreshTokenUpdatedForAccount(
const CoreAccountInfo& account_info,
const GoogleServiceAuthError& error) override;
// |ash::AccountAppsAvailability::Observer| overrides.
void OnAccountAvailableInArc(
const ::account_manager::Account& account) override;
void OnAccountUnavailableInArc(
const ::account_manager::Account& account) override;
private:
friend class AccountManagerUIHandlerTest;
friend class AccountManagerUIHandlerTestWithArcAccountRestrictions;
void SetProfileForTesting(Profile* profile);
// WebUI "getAccounts" message callback.
void HandleGetAccounts(const base::Value::List& args);
// WebUI "addAccount" message callback.
void HandleAddAccount(const base::Value::List& args);
// WebUI "reauthenticateAccount" message callback.
void HandleReauthenticateAccount(const base::Value::List& args);
// WebUI "migrateAccount" message callback.
void HandleMigrateAccount(const base::Value::List& args);
// WebUI "removeAccount" message callback.
void HandleRemoveAccount(const base::Value::List& args);
// WebUI "changeArcAvailability" message callback.
void HandleChangeArcAvailability(const base::Value::List& args);
// |account_manager::AccountManager::CheckDummyGaiaTokenForAllAccounts|
// callback.
void OnCheckDummyGaiaTokenForAllAccounts(
base::Value callback_id,
const std::vector<std::pair<::account_manager::Account, bool>>&
account_dummy_token_list);
void FinishHandleGetAccounts(
base::Value callback_id,
const std::vector<std::pair<::account_manager::Account, bool>>&
account_dummy_token_list,
const base::flat_set<account_manager::Account>& arc_accounts);
// Returns secondary Gaia accounts from |stored_accounts| list. If the Device
// Account is a Gaia account, populates |device_account| with information
// about that account, otherwise does not modify |device_account|.
// If user (device account) is child - |is_child_user| should be set to true,
// in this case "unmigrated" property will be always false for secondary
// accounts.
base::ListValue GetSecondaryGaiaAccounts(
const std::vector<std::pair<::account_manager::Account, bool>>&
account_dummy_token_list,
const base::flat_set<account_manager::Account>& arc_accounts,
const AccountId device_account_id,
const bool is_child_user,
base::DictionaryValue* device_account);
// Refreshes the UI.
void RefreshUI();
Profile* profile_ = nullptr;
// A non-owning pointer to |account_manager::AccountManager|.
account_manager::AccountManager* const account_manager_;
// A non-owning pointer to |AccountManagerFacade|.
account_manager::AccountManagerFacade* const account_manager_facade_;
// A non-owning pointer to |IdentityManager|.
signin::IdentityManager* const identity_manager_;
// A non-owning pointer to |AccountAppsAvailability| which is a KeyedService
// and should outlive this class.
ash::AccountAppsAvailability* account_apps_availability_ = nullptr;
// An observer for |AccountManagerFacade|. Automatically deregisters when
// |this| is destructed.
base::ScopedObservation<account_manager::AccountManagerFacade,
account_manager::AccountManagerFacade::Observer>
account_manager_facade_observation_{this};
// An observer for |signin::IdentityManager|. Automatically deregisters when
// |this| is destructed.
base::ScopedObservation<signin::IdentityManager,
signin::IdentityManager::Observer>
identity_manager_observation_{this};
// An observer for |ash::AccountAppsAvailability|. Registered on
// |OnJavascriptAllowed| and deregistered on |OnJavascriptDisallowed|.
base::ScopedObservation<ash::AccountAppsAvailability,
ash::AccountAppsAvailability::Observer>
account_apps_availability_observation_{this};
base::WeakPtrFactory<AccountManagerUIHandler> weak_factory_{this};
};
} // namespace settings
} // namespace chromeos
#endif // CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_ACCOUNT_MANAGER_HANDLER_H_