blob: 815fea5e576568d8aae340cf729d02420d59916e [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.
#include "chrome/browser/chromeos/device_sync/device_sync_client_factory.h"
#include "base/macros.h"
#include "chrome/browser/chromeos/profiles/profile_helper.h"
#include "chrome/browser/gcm/gcm_profile_service_factory.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/signin/identity_manager_factory.h"
#include "chrome/common/pref_names.h"
#include "chromeos/chromeos_features.h"
#include "chromeos/services/device_sync/public/cpp/device_sync_client.h"
#include "chromeos/services/device_sync/public/cpp/device_sync_client_impl.h"
#include "chromeos/services/multidevice_setup/public/cpp/prefs.h"
#include "components/keyed_service/content/browser_context_dependency_manager.h"
#include "components/keyed_service/core/keyed_service.h"
#include "components/prefs/pref_service.h"
#include "content/public/browser/browser_context.h"
namespace chromeos {
namespace device_sync {
namespace {
// CryptAuth enrollment is allowed only if at least one multi-device feature is
// enabled. This ensures that we do not unnecessarily register devices on the
// CryptAuth back-end when the registration would never actually be used.
bool IsEnrollmentAllowedByPolicy(content::BrowserContext* context) {
return multidevice_setup::AreAnyMultiDeviceFeaturesAllowed(
Profile::FromBrowserContext(context)->GetPrefs());
}
} // namespace
// Class that wraps DeviceSyncClient in a KeyedService.
class DeviceSyncClientHolder : public KeyedService {
public:
explicit DeviceSyncClientHolder(content::BrowserContext* context)
: device_sync_client_(DeviceSyncClientImpl::Factory::Get()->BuildInstance(
content::BrowserContext::GetConnectorFor(context))) {}
DeviceSyncClient* device_sync_client() { return device_sync_client_.get(); }
private:
// KeyedService:
void Shutdown() override { device_sync_client_.reset(); }
std::unique_ptr<DeviceSyncClient> device_sync_client_;
DISALLOW_COPY_AND_ASSIGN(DeviceSyncClientHolder);
};
DeviceSyncClientFactory::DeviceSyncClientFactory()
: BrowserContextKeyedServiceFactory(
"DeviceSyncClient",
BrowserContextDependencyManager::GetInstance()) {
DependsOn(IdentityManagerFactory::GetInstance());
DependsOn(gcm::GCMProfileServiceFactory::GetInstance());
}
DeviceSyncClientFactory::~DeviceSyncClientFactory() {}
// static
DeviceSyncClient* DeviceSyncClientFactory::GetForProfile(Profile* profile) {
DeviceSyncClientHolder* holder = static_cast<DeviceSyncClientHolder*>(
GetInstance()->GetServiceForBrowserContext(profile, true));
return holder ? holder->device_sync_client() : nullptr;
}
// static
DeviceSyncClientFactory* DeviceSyncClientFactory::GetInstance() {
return base::Singleton<DeviceSyncClientFactory>::get();
}
KeyedService* DeviceSyncClientFactory::BuildServiceInstanceFor(
content::BrowserContext* context) const {
// TODO(crbug.com/848347): Check prohibited by policy in services that depend
// on this Factory, not here.
if (IsEnrollmentAllowedByPolicy(context))
return new DeviceSyncClientHolder(context);
return nullptr;
}
bool DeviceSyncClientFactory::ServiceIsNULLWhileTesting() const {
return true;
}
} // namespace device_sync
} // namespace chromeos