|  | // Copyright 2021 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/ash/crosapi/identity_manager_ash.h" | 
|  |  | 
|  | #include "base/functional/callback.h" | 
|  | #include "chrome/browser/ash/profiles/profile_helper.h" | 
|  | #include "chrome/browser/profiles/profile.h" | 
|  | #include "chrome/browser/signin/identity_manager_factory.h" | 
|  | #include "chromeos/crosapi/mojom/identity_manager.mojom.h" | 
|  | #include "components/signin/public/identity_manager/account_info.h" | 
|  | #include "components/signin/public/identity_manager/identity_manager.h" | 
|  | #include "components/user_manager/user.h" | 
|  | #include "components/user_manager/user_manager.h" | 
|  | #include "google_apis/gaia/google_service_auth_error.h" | 
|  | #include "ui/gfx/image/image.h" | 
|  |  | 
|  | namespace crosapi { | 
|  |  | 
|  | namespace { | 
|  |  | 
|  | signin::IdentityManager* GetIdentityManager(const std::string& gaia_id) { | 
|  | user_manager::User* const user = | 
|  | user_manager::UserManager::Get()->GetActiveUser(); | 
|  | if (!user) | 
|  | return nullptr; | 
|  |  | 
|  | Profile* const profile = ash::ProfileHelper::Get()->GetProfileByUser(user); | 
|  | if (!profile) | 
|  | return nullptr; | 
|  |  | 
|  | return IdentityManagerFactory::GetInstance()->GetForProfileIfExists(profile); | 
|  | } | 
|  |  | 
|  | AccountInfo GetAccountInfo(const std::string& gaia_id) { | 
|  | signin::IdentityManager* identity_manager = GetIdentityManager(gaia_id); | 
|  | if (!identity_manager) | 
|  | return AccountInfo(); | 
|  | return identity_manager->FindExtendedAccountInfoByGaiaId(gaia_id); | 
|  | } | 
|  | }  // namespace | 
|  |  | 
|  | IdentityManagerAsh::IdentityManagerAsh() = default; | 
|  |  | 
|  | IdentityManagerAsh::~IdentityManagerAsh() = default; | 
|  |  | 
|  | void IdentityManagerAsh::BindReceiver( | 
|  | mojo::PendingReceiver<mojom::IdentityManager> receiver) { | 
|  | receivers_.Add(this, std::move(receiver)); | 
|  | } | 
|  |  | 
|  | void IdentityManagerAsh::GetAccountFullName( | 
|  | const std::string& gaia_id, | 
|  | GetAccountFullNameCallback callback) { | 
|  | AccountInfo account_info = GetAccountInfo(gaia_id); | 
|  | if (GetAccountInfo(gaia_id).IsEmpty()) { | 
|  | std::move(callback).Run(""); | 
|  | return; | 
|  | } | 
|  | std::move(callback).Run(account_info.full_name); | 
|  | } | 
|  |  | 
|  | void IdentityManagerAsh::GetAccountImage(const std::string& gaia_id, | 
|  | GetAccountImageCallback callback) { | 
|  | AccountInfo account_info = GetAccountInfo(gaia_id); | 
|  | if (account_info.IsEmpty()) { | 
|  | std::move(callback).Run(gfx::ImageSkia()); | 
|  | return; | 
|  | } | 
|  | std::move(callback).Run(account_info.account_image.AsImageSkia()); | 
|  | } | 
|  |  | 
|  | void IdentityManagerAsh::GetAccountEmail(const std::string& gaia_id, | 
|  | GetAccountEmailCallback callback) { | 
|  | AccountInfo account_info = GetAccountInfo(gaia_id); | 
|  | if (GetAccountInfo(gaia_id).IsEmpty()) { | 
|  | std::move(callback).Run(""); | 
|  | return; | 
|  | } | 
|  | std::move(callback).Run(account_info.email); | 
|  | } | 
|  |  | 
|  | void IdentityManagerAsh::HasAccountWithPersistentError( | 
|  | const std::string& gaia_id, | 
|  | HasAccountWithPersistentErrorCallback callback) { | 
|  | signin::IdentityManager* identity_manager = GetIdentityManager(gaia_id); | 
|  | AccountInfo account_info = GetAccountInfo(gaia_id); | 
|  | if (!identity_manager || account_info.IsEmpty()) { | 
|  | std::move(callback).Run(false); | 
|  | return; | 
|  | } | 
|  | GoogleServiceAuthError error = | 
|  | identity_manager->GetErrorStateOfRefreshTokenForAccount( | 
|  | account_info.account_id); | 
|  | std::move(callback).Run(error.IsPersistentError()); | 
|  | } | 
|  |  | 
|  | }  // namespace crosapi |