blob: 0f8582a537d6f5a33430ca31b00d88769def1c11 [file] [log] [blame]
// Copyright 2020 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/authentication/ui_bundled/signin_notification_infobar_delegate.h"
#import <UIKit/UIKit.h>
#import <utility>
#import "base/check.h"
#import "base/memory/ptr_util.h"
#import "base/metrics/user_metrics.h"
#import "base/strings/sys_string_conversions.h"
#import "components/infobars/core/infobar.h"
#import "components/infobars/core/infobar_delegate.h"
#import "components/infobars/core/infobar_manager.h"
#import "ios/chrome/browser/infobars/model/infobar_utils.h"
#import "ios/chrome/browser/shared/model/browser/browser.h"
#import "ios/chrome/browser/shared/model/profile/profile_ios.h"
#import "ios/chrome/browser/shared/public/commands/settings_commands.h"
#import "ios/chrome/browser/shared/ui/util/uikit_ui_util.h"
#import "ios/chrome/browser/signin/model/authentication_service.h"
#import "ios/chrome/browser/signin/model/authentication_service_factory.h"
#import "ios/chrome/browser/signin/model/chrome_account_manager_service.h"
#import "ios/chrome/browser/signin/model/chrome_account_manager_service_factory.h"
#import "ios/chrome/browser/signin/model/system_identity.h"
#import "ios/chrome/grit/ios_branded_strings.h"
#import "ios/chrome/grit/ios_strings.h"
#import "ui/base/l10n/l10n_util.h"
#import "ui/base/models/image_model.h"
// static
bool SigninNotificationInfoBarDelegate::Create(
infobars::InfoBarManager* infobar_manager,
ProfileIOS* profile,
id<SettingsCommands> dispatcher,
UIViewController* view_controller) {
DCHECK(infobar_manager);
std::unique_ptr<ConfirmInfoBarDelegate> delegate(
std::make_unique<SigninNotificationInfoBarDelegate>(profile, dispatcher,
view_controller));
std::unique_ptr<infobars::InfoBar> infobar =
CreateHighPriorityConfirmInfoBar(std::move(delegate));
return !!infobar_manager->AddInfoBar(std::move(infobar));
}
SigninNotificationInfoBarDelegate::SigninNotificationInfoBarDelegate(
ProfileIOS* profile,
id<SettingsCommands> dispatcher,
UIViewController* view_controller)
: dispatcher_(dispatcher), base_view_controller_(view_controller) {
DCHECK(!profile->IsOffTheRecord());
AuthenticationService* auth_service =
AuthenticationServiceFactory::GetForProfile(profile);
DCHECK(auth_service);
id<SystemIdentity> identity =
auth_service->GetPrimaryIdentity(signin::ConsentLevel::kSignin);
ChromeAccountManagerService* accountManagerService =
ChromeAccountManagerServiceFactory::GetForProfile(profile);
UIImage* image = accountManagerService->GetIdentityAvatarWithIdentity(
identity, IdentityAvatarSize::Regular);
icon_ = gfx::Image(CircularImageFromImage(image, image.size.width));
title_ = base::SysNSStringToUTF16(l10n_util::GetNSStringF(
IDS_IOS_SIGNIN_ACCOUNT_NOTIFICATION_TITLE_WITH_USERNAME,
base::SysNSStringToUTF16(identity.userGivenName)));
message_ = base::SysNSStringToUTF16(identity.userEmail);
button_text_ =
base::SysNSStringToUTF16(l10n_util::GetNSString(IDS_IOS_SETTINGS_TITLE));
}
SigninNotificationInfoBarDelegate::~SigninNotificationInfoBarDelegate() {}
infobars::InfoBarDelegate::InfoBarIdentifier
SigninNotificationInfoBarDelegate::GetIdentifier() const {
return RE_SIGN_IN_INFOBAR_DELEGATE_IOS;
}
std::u16string SigninNotificationInfoBarDelegate::GetTitleText() const {
return title_;
}
std::u16string SigninNotificationInfoBarDelegate::GetMessageText() const {
return message_;
}
int SigninNotificationInfoBarDelegate::GetButtons() const {
return BUTTON_OK;
}
std::u16string SigninNotificationInfoBarDelegate::GetButtonLabel(
InfoBarButton button) const {
DCHECK(button == BUTTON_OK);
return button_text_;
}
ui::ImageModel SigninNotificationInfoBarDelegate::GetIcon() const {
return ui::ImageModel::FromImage(icon_);
}
bool SigninNotificationInfoBarDelegate::UseIconBackgroundTint() const {
return false;
}
bool SigninNotificationInfoBarDelegate::Accept() {
[dispatcher_ showAccountsSettingsFromViewController:base_view_controller_
skipIfUINotAvailable:NO];
base::RecordAction(base::UserMetricsAction(
"Settings.GoogleServices.FromSigninNotificationInfobar"));
return true;
}
bool SigninNotificationInfoBarDelegate::ShouldExpire(
const NavigationDetails& details) const {
// Due to the redirects that occur when navigating to a Google subdomain from
// the Omnibox, Chrome ensures that the sign-in infobar is displayed after
// restoring Gaia cookies regardless of the navigation type.
return false;
}