blob: 9021ebe36140c08d5d6928384450c400ce606990 [file] [log] [blame]
// Copyright 2017 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.
#include "ios/chrome/browser/signin/identity_manager_factory.h"
#include <memory>
#include <utility>
#include "components/image_fetcher/ios/ios_image_decoder_impl.h"
#include "components/keyed_service/core/keyed_service.h"
#include "components/keyed_service/ios/browser_state_dependency_manager.h"
#include "components/pref_registry/pref_registry_syncable.h"
#include "components/signin/public/base/account_consistency_method.h"
#include "components/signin/public/base/signin_client.h"
#include "components/signin/public/identity_manager/identity_manager.h"
#include "components/signin/public/identity_manager/identity_manager_builder.h"
#include "ios/chrome/browser/application_context.h"
#include "ios/chrome/browser/browser_state/chrome_browser_state.h"
#include "ios/chrome/browser/signin/device_accounts_provider_impl.h"
#include "ios/chrome/browser/signin/identity_manager_factory_observer.h"
#include "ios/chrome/browser/signin/signin_client_factory.h"
void IdentityManagerFactory::RegisterBrowserStatePrefs(
user_prefs::PrefRegistrySyncable* registry) {
signin::IdentityManager::RegisterProfilePrefs(registry);
}
IdentityManagerFactory::IdentityManagerFactory()
: BrowserStateKeyedServiceFactory(
"IdentityManager",
BrowserStateDependencyManager::GetInstance()) {
DependsOn(SigninClientFactory::GetInstance());
}
IdentityManagerFactory::~IdentityManagerFactory() {}
// static
signin::IdentityManager* IdentityManagerFactory::GetForBrowserState(
ios::ChromeBrowserState* browser_state) {
return static_cast<signin::IdentityManager*>(
GetInstance()->GetServiceForBrowserState(browser_state, true));
}
// static
signin::IdentityManager* IdentityManagerFactory::GetForBrowserStateIfExists(
ios::ChromeBrowserState* browser_state) {
return static_cast<signin::IdentityManager*>(
GetInstance()->GetServiceForBrowserState(browser_state, false));
}
// static
IdentityManagerFactory* IdentityManagerFactory::GetInstance() {
static base::NoDestructor<IdentityManagerFactory> instance;
return instance.get();
}
void IdentityManagerFactory::AddObserver(
IdentityManagerFactoryObserver* observer) {
observer_list_.AddObserver(observer);
}
void IdentityManagerFactory::RemoveObserver(
IdentityManagerFactoryObserver* observer) {
observer_list_.RemoveObserver(observer);
}
std::unique_ptr<KeyedService> IdentityManagerFactory::BuildServiceInstanceFor(
web::BrowserState* context) const {
ios::ChromeBrowserState* browser_state =
ios::ChromeBrowserState::FromBrowserState(context);
signin::IdentityManagerBuildParams params;
params.account_consistency = signin::AccountConsistencyMethod::kMirror;
params.device_accounts_provider =
std::make_unique<DeviceAccountsProviderImpl>();
params.image_decoder = image_fetcher::CreateIOSImageDecoder();
params.local_state = GetApplicationContext()->GetLocalState();
params.pref_service = browser_state->GetPrefs();
params.profile_path = base::FilePath();
params.signin_client = SigninClientFactory::GetForBrowserState(browser_state);
std::unique_ptr<signin::IdentityManager> identity_manager =
signin::BuildIdentityManager(&params);
for (auto& observer : observer_list_)
observer.IdentityManagerCreated(identity_manager.get());
return identity_manager;
}
void IdentityManagerFactory::BrowserStateShutdown(web::BrowserState* context) {
auto* identity_manager = static_cast<signin::IdentityManager*>(
GetServiceForBrowserState(context, false));
if (identity_manager) {
for (auto& observer : observer_list_)
observer.IdentityManagerShutdown(identity_manager);
}
BrowserStateKeyedServiceFactory::BrowserStateShutdown(context);
}