blob: cb7311d2c845b80f934cb30bb08f3548ba6dafa2 [file] [log] [blame]
// Copyright 2022 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#import "ios/chrome/browser/signin/model/system_identity_manager.h"
#import "base/functional/bind.h"
#import "base/functional/callback.h"
#import "components/signin/internal/identity_manager/account_capabilities_constants.h"
namespace {
using CapabilityResult = SystemIdentityManager::CapabilityResult;
using DismissViewCallback = SystemIdentityManager::DismissViewCallback;
// Helper function used to extract the capability from `capabilities` map in
// `IsSubjectToParentalControls`.
CapabilityResult FetchCapabilityCompleted(
std::map<std::string, CapabilityResult> capabilities) {
DCHECK_EQ(capabilities.size(), 1u);
return capabilities.begin()->second;
}
} // anonymous namespace
SystemIdentityManager::PresentDialogConfiguration::
PresentDialogConfiguration() {}
SystemIdentityManager::PresentDialogConfiguration::
~PresentDialogConfiguration() {}
SystemIdentityManager::PresentDialogConfiguration::PresentDialogConfiguration(
SystemIdentityManager::PresentDialogConfiguration&& configuration) {
identity = configuration.identity;
view_controller = configuration.view_controller;
animated = configuration.animated;
dismissal_completion = std::move(configuration.dismissal_completion);
}
SystemIdentityManager::SystemIdentityManager() = default;
SystemIdentityManager::~SystemIdentityManager() {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
}
void SystemIdentityManager::IsSubjectToParentalControls(
id<SystemIdentity> identity,
FetchCapabilityCallback callback) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
FetchCapabilities(
identity, {kIsSubjectToParentalControlsCapabilityName},
base::BindOnce(&FetchCapabilityCompleted).Then(std::move(callback)));
}
void SystemIdentityManager::AddObserver(
SystemIdentityManagerObserver* observer) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
observers_.AddObserver(observer);
}
void SystemIdentityManager::RemoveObserver(
SystemIdentityManagerObserver* observer) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
observers_.RemoveObserver(observer);
}
DismissViewCallback SystemIdentityManager::PresentAccountDetailsController(
id<SystemIdentity> identity,
UIViewController* view_controller,
bool animated,
base::OnceClosure dismissal_completion) {
SystemIdentityManager::PresentDialogConfiguration configuration;
configuration.identity = identity;
configuration.view_controller = view_controller;
configuration.animated = animated;
configuration.dismissal_completion = std::move(dismissal_completion);
return PresentAccountDetailsController(std::move(configuration));
}
DismissViewCallback
SystemIdentityManager::PresentWebAndAppSettingDetailsController(
id<SystemIdentity> identity,
UIViewController* view_controller,
bool animated,
base::OnceClosure dismissal_completion) {
SystemIdentityManager::PresentDialogConfiguration configuration;
configuration.identity = identity;
configuration.view_controller = view_controller;
configuration.animated = animated;
configuration.dismissal_completion = std::move(dismissal_completion);
return PresentWebAndAppSettingDetailsController(std::move(configuration));
}
DismissViewCallback
SystemIdentityManager::PresentLinkedServicesSettingsDetailsController(
id<SystemIdentity> identity,
UIViewController* view_controller,
bool animated,
base::OnceClosure dismissal_completion) {
SystemIdentityManager::PresentDialogConfiguration configuration;
configuration.identity = identity;
configuration.view_controller = view_controller;
configuration.animated = animated;
configuration.dismissal_completion = std::move(dismissal_completion);
return PresentLinkedServicesSettingsDetailsController(
std::move(configuration));
}
void SystemIdentityManager::FireIdentityListChanged() {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
for (auto& observer : observers_) {
observer.OnIdentityListChanged();
}
}
void SystemIdentityManager::FireIdentityUpdated(id<SystemIdentity> identity) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
for (auto& observer : observers_) {
observer.OnIdentityUpdated(identity);
}
}
void SystemIdentityManager::FireIdentityRefreshTokenUpdated(
id<SystemIdentity> identity) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
for (auto& observer : observers_) {
observer.OnIdentityRefreshTokenUpdated(identity);
}
}
void SystemIdentityManager::FireIdentityAccessTokenRefreshFailed(
id<SystemIdentity> identity,
id<RefreshAccessTokenError> error,
const std::set<std::string>& scopes) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
for (auto& observer : observers_) {
observer.OnIdentityAccessTokenRefreshFailed(identity, error, scopes);
}
}
bool SystemIdentityManager::IsScopeLimitedError(
id<RefreshAccessTokenError> error) {
return false;
}