| // Copyright 2013 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. |
| |
| #import "ios/chrome/browser/ui/authentication/re_signin_infobar_delegate.h" |
| |
| #import <UIKit/UIKit.h> |
| |
| #include <memory> |
| #include <utility> |
| |
| #include "base/logging.h" |
| #include "base/memory/ptr_util.h" |
| #include "base/metrics/user_metrics.h" |
| #include "components/infobars/core/infobar_manager.h" |
| #include "components/strings/grit/components_strings.h" |
| #import "ios/chrome/browser/browser_state/chrome_browser_state.h" |
| #include "ios/chrome/browser/infobars/infobar.h" |
| #include "ios/chrome/browser/signin/authentication_service.h" |
| #include "ios/chrome/browser/signin/authentication_service_factory.h" |
| #include "ios/chrome/browser/tabs/tab.h" |
| #import "ios/chrome/browser/ui/commands/UIKit+ChromeExecuteCommand.h" |
| #import "ios/chrome/browser/ui/commands/show_signin_command.h" |
| #include "ios/chrome/grit/ios_strings.h" |
| #include "ui/base/l10n/l10n_util.h" |
| |
| #if !defined(__has_feature) || !__has_feature(objc_arc) |
| #error "This file requires ARC support." |
| #endif |
| |
| // static |
| bool ReSignInInfoBarDelegate::Create(ios::ChromeBrowserState* browser_state, |
| Tab* tab) { |
| infobars::InfoBarManager* infobar_manager = [tab infoBarManager]; |
| DCHECK(infobar_manager); |
| |
| std::unique_ptr<infobars::InfoBar> infobar = |
| ReSignInInfoBarDelegate::CreateInfoBar(infobar_manager, browser_state); |
| if (!infobar) |
| return false; |
| return !!infobar_manager->AddInfoBar(std::move(infobar)); |
| } |
| |
| // static |
| std::unique_ptr<infobars::InfoBar> ReSignInInfoBarDelegate::CreateInfoBar( |
| infobars::InfoBarManager* infobar_manager, |
| ios::ChromeBrowserState* browser_state) { |
| DCHECK(infobar_manager); |
| std::unique_ptr<ReSignInInfoBarDelegate> delegate = |
| ReSignInInfoBarDelegate::CreateInfoBarDelegate(browser_state); |
| if (!delegate) |
| return nullptr; |
| return infobar_manager->CreateConfirmInfoBar(std::move(delegate)); |
| } |
| |
| // static |
| std::unique_ptr<ReSignInInfoBarDelegate> |
| ReSignInInfoBarDelegate::CreateInfoBarDelegate( |
| ios::ChromeBrowserState* browser_state) { |
| DCHECK(browser_state); |
| // Do not ask user to sign in if current profile is incognito. |
| if (browser_state->IsOffTheRecord()) |
| return nullptr; |
| // Returns null if user does not need to be prompted to sign in again. |
| AuthenticationService* authService = |
| AuthenticationServiceFactory::GetForBrowserState(browser_state); |
| if (!authService->ShouldPromptForSignIn()) |
| return nullptr; |
| // Returns null if user has already signed in via some other path. |
| if ([authService->GetAuthenticatedUserEmail() length]) { |
| authService->SetPromptForSignIn(false); |
| return nullptr; |
| } |
| base::RecordAction( |
| base::UserMetricsAction("Signin_Impression_FromReSigninInfobar")); |
| // User needs to be reminded to sign in again. Creates a new infobar delegate |
| // and returns it. |
| return base::MakeUnique<ReSignInInfoBarDelegate>(browser_state); |
| } |
| |
| ReSignInInfoBarDelegate::ReSignInInfoBarDelegate( |
| ios::ChromeBrowserState* browser_state) |
| : browser_state_(browser_state), |
| icon_([UIImage imageNamed:@"infobar_warning"]) { |
| DCHECK(browser_state_); |
| DCHECK(!browser_state_->IsOffTheRecord()); |
| } |
| |
| ReSignInInfoBarDelegate::~ReSignInInfoBarDelegate() {} |
| |
| infobars::InfoBarDelegate::InfoBarIdentifier |
| ReSignInInfoBarDelegate::GetIdentifier() const { |
| return RE_SIGN_IN_INFOBAR_DELEGATE; |
| } |
| |
| base::string16 ReSignInInfoBarDelegate::GetMessageText() const { |
| return l10n_util::GetStringUTF16(IDS_IOS_SYNC_LOGIN_INFO_OUT_OF_DATE); |
| } |
| |
| int ReSignInInfoBarDelegate::GetButtons() const { |
| return BUTTON_OK; |
| } |
| |
| base::string16 ReSignInInfoBarDelegate::GetButtonLabel( |
| InfoBarButton button) const { |
| return l10n_util::GetStringUTF16( |
| IDS_IOS_SYNC_INFOBAR_SIGN_IN_SETTINGS_BUTTON_MOBILE); |
| } |
| |
| gfx::Image ReSignInInfoBarDelegate::GetIcon() const { |
| return icon_; |
| } |
| |
| bool ReSignInInfoBarDelegate::Accept() { |
| base::RecordAction( |
| base::UserMetricsAction("Signin_Signin_FromReSigninInfobar")); |
| UIView* infobarView = static_cast<InfoBarIOS*>(infobar())->view(); |
| DCHECK(infobarView); |
| ShowSigninCommand* command = [[ShowSigninCommand alloc] |
| initWithOperation:AUTHENTICATION_OPERATION_REAUTHENTICATE |
| accessPoint:signin_metrics::AccessPoint:: |
| ACCESS_POINT_RESIGNIN_INFOBAR]; |
| [infobarView chromeExecuteCommand:command]; |
| |
| // Stop displaying the infobar once user interacted with it. |
| AuthenticationServiceFactory::GetForBrowserState(browser_state_) |
| ->SetPromptForSignIn(false); |
| return true; |
| } |
| |
| void ReSignInInfoBarDelegate::InfoBarDismissed() { |
| // Stop displaying the infobar once user interacted with it. |
| AuthenticationServiceFactory::GetForBrowserState(browser_state_) |
| ->SetPromptForSignIn(false); |
| } |