| Index: ios/chrome/browser/ui/authentication/signin_promo_view_mediator.mm | 
| diff --git a/ios/chrome/browser/ui/authentication/signin_promo_view_mediator.mm b/ios/chrome/browser/ui/authentication/signin_promo_view_mediator.mm | 
| index 5c7bfa4b8bb2221b73fefe40856514c2a607f379..80bd74673c927e52f400e9f1bf7aa6b8aa8d537c 100644 | 
| --- a/ios/chrome/browser/ui/authentication/signin_promo_view_mediator.mm | 
| +++ b/ios/chrome/browser/ui/authentication/signin_promo_view_mediator.mm | 
| @@ -5,9 +5,13 @@ | 
| #import "ios/chrome/browser/ui/authentication/signin_promo_view_mediator.h" | 
|  | 
| #include "base/memory/ptr_util.h" | 
| +#include "base/metrics/histogram_macros.h" | 
| #include "base/metrics/user_metrics.h" | 
| #include "base/metrics/user_metrics_action.h" | 
| #include "base/strings/sys_string_conversions.h" | 
| +#include "components/prefs/pref_service.h" | 
| +#include "ios/chrome/browser/browser_state/chrome_browser_state.h" | 
| +#include "ios/chrome/browser/pref_names.h" | 
| #include "ios/chrome/browser/signin/chrome_identity_service_observer_bridge.h" | 
| #import "ios/chrome/browser/ui/authentication/signin_promo_view_configurator.h" | 
| #import "ios/chrome/browser/ui/authentication/signin_promo_view_consumer.h" | 
| @@ -25,6 +29,8 @@ | 
| #endif | 
|  | 
| namespace { | 
| +const int kAutomaticSigninPromoViewDismissCount = 20; | 
| + | 
| void RecordSigninUserActionForAccessPoint( | 
| signin_metrics::AccessPoint access_point) { | 
| switch (access_point) { | 
| @@ -96,23 +102,40 @@ void RecordSigninNewAccountUserActionForAccessPoint( | 
| break; | 
| } | 
| } | 
| + | 
| +enum class SigninPromoViewState { | 
| +  Unused = 0, | 
| +  Visible, | 
| +  Hidden, | 
| +  SigninStarted, | 
| +  Dismissed, | 
| +}; | 
| }  // namespace | 
|  | 
| @interface SigninPromoViewMediator ()<ChromeIdentityServiceObserver> | 
| @end | 
|  | 
| @implementation SigninPromoViewMediator { | 
| +  ios::ChromeBrowserState* _browserState; | 
| std::unique_ptr<ChromeIdentityServiceObserverBridge> _identityServiceObserver; | 
| UIImage* _identityAvatar; | 
| +  SigninPromoViewState _signinPromoViewState; | 
| } | 
|  | 
| @synthesize consumer = _consumer; | 
| @synthesize defaultIdentity = _defaultIdentity; | 
| @synthesize accessPoint = _accessPoint; | 
| +@synthesize displayedCountPreferenceKey = _displayedCountPreferenceKey; | 
| +@synthesize alreadySeenSigninViewPreferenceKey = | 
| +    _alreadySeenSigninViewPreferenceKey; | 
| +@synthesize dismissalCountHistogramName = _dismissalCountHistogramName; | 
| +@synthesize countTilSigninHistogramName = _countTilSigninHistogramName; | 
| +@synthesize countTilXHistogramName = _countTilXHistogramName; | 
|  | 
| -- (instancetype)init { | 
| +- (instancetype)initWithBrowserState:(ios::ChromeBrowserState*)browserState { | 
| self = [super init]; | 
| if (self) { | 
| +    _browserState = browserState; | 
| NSArray* identities = ios::GetChromeBrowserProvider() | 
| ->GetChromeIdentityService() | 
| ->GetAllIdentitiesSortedForDisplay(); | 
| @@ -125,6 +148,16 @@ void RecordSigninNewAccountUserActionForAccessPoint( | 
| return self; | 
| } | 
|  | 
| +- (void)dealloc { | 
| +  if (_displayedCountPreferenceKey && _dismissalCountHistogramName && | 
| +      (_signinPromoViewState == SigninPromoViewState::Visible || | 
| +       _signinPromoViewState == SigninPromoViewState::Hidden)) { | 
| +    PrefService* prefs = _browserState->GetPrefs(); | 
| +    int displayedCount = prefs->GetInteger(_displayedCountPreferenceKey); | 
| +    UMA_HISTOGRAM_COUNTS_100(_dismissalCountHistogramName, displayedCount); | 
| +  } | 
| +} | 
| + | 
| - (SigninPromoViewConfigurator*)createConfigurator { | 
| if (_defaultIdentity) { | 
| return [[SigninPromoViewConfigurator alloc] | 
| @@ -165,6 +198,54 @@ void RecordSigninNewAccountUserActionForAccessPoint( | 
| identityChanged:identityChanged]; | 
| } | 
|  | 
| +- (void)sendCountTillSigninHistogram { | 
| +  DCHECK(_signinPromoViewState != SigninPromoViewState::Dismissed || | 
| +         _signinPromoViewState != SigninPromoViewState::Unused); | 
| +  _signinPromoViewState = SigninPromoViewState::SigninStarted; | 
| +  if (!_displayedCountPreferenceKey || !_countTilSigninHistogramName) | 
| +    return; | 
| +  PrefService* prefs = _browserState->GetPrefs(); | 
| +  int displayedCount = prefs->GetInteger(_displayedCountPreferenceKey); | 
| +  UMA_HISTOGRAM_COUNTS_100(_countTilSigninHistogramName, displayedCount); | 
| +} | 
| + | 
| +- (void)signinPromoViewVisible { | 
| +  DCHECK(_signinPromoViewState != SigninPromoViewState::Dismissed); | 
| +  if (_signinPromoViewState == SigninPromoViewState::Visible) | 
| +    return; | 
| +  _signinPromoViewState = SigninPromoViewState::Visible; | 
| +  if (!_displayedCountPreferenceKey) | 
| +    return; | 
| +  PrefService* prefs = _browserState->GetPrefs(); | 
| +  int displayedCount = prefs->GetInteger(_displayedCountPreferenceKey); | 
| +  ++displayedCount; | 
| +  prefs->SetInteger(_displayedCountPreferenceKey, displayedCount); | 
| +  if (displayedCount >= kAutomaticSigninPromoViewDismissCount && | 
| +      _alreadySeenSigninViewPreferenceKey) { | 
| +    PrefService* prefs = _browserState->GetPrefs(); | 
| +    prefs->SetBoolean(prefs::kIosBookmarkPromoAlreadySeen, true); | 
| +  } | 
| +} | 
| + | 
| +- (void)signinPromoViewHidden { | 
| +  DCHECK(_signinPromoViewState != SigninPromoViewState::Unused || | 
| +         _signinPromoViewState != SigninPromoViewState::Dismissed); | 
| +  if (_signinPromoViewState != SigninPromoViewState::Visible) | 
| +    return; | 
| +  _signinPromoViewState = SigninPromoViewState::Hidden; | 
| +} | 
| + | 
| +- (void)signinPromoViewDismissed { | 
| +  DCHECK(_signinPromoViewState != SigninPromoViewState::Unused || | 
| +         _signinPromoViewState != SigninPromoViewState::Hidden); | 
| +  _signinPromoViewState = SigninPromoViewState::Dismissed; | 
| +  if (!_displayedCountPreferenceKey || !_countTilXHistogramName) | 
| +    return; | 
| +  PrefService* prefs = _browserState->GetPrefs(); | 
| +  int displayedCount = prefs->GetInteger(_displayedCountPreferenceKey); | 
| +  UMA_HISTOGRAM_COUNTS_100(_countTilXHistogramName, displayedCount); | 
| +} | 
| + | 
| #pragma mark - ChromeIdentityServiceObserver | 
|  | 
| - (void)onIdentityListChanged { | 
| @@ -192,6 +273,7 @@ void RecordSigninNewAccountUserActionForAccessPoint( | 
| - (void)signinPromoViewDidTapSigninWithNewAccount: | 
| (SigninPromoView*)signinPromoView { | 
| DCHECK(!_defaultIdentity); | 
| +  [self sendCountTillSigninHistogram]; | 
| RecordSigninUserActionForAccessPoint(_accessPoint); | 
| RecordSigninNewAccountUserActionForAccessPoint(_accessPoint); | 
| ShowSigninCommand* command = [[ShowSigninCommand alloc] | 
| @@ -204,6 +286,7 @@ void RecordSigninNewAccountUserActionForAccessPoint( | 
| - (void)signinPromoViewDidTapSigninWithDefaultAccount: | 
| (SigninPromoView*)signinPromoView { | 
| DCHECK(_defaultIdentity); | 
| +  [self sendCountTillSigninHistogram]; | 
| RecordSigninUserActionForAccessPoint(_accessPoint); | 
| RecordSigninDefaultUserActionForAccessPoint(_accessPoint); | 
| ShowSigninCommand* command = [[ShowSigninCommand alloc] | 
| @@ -218,6 +301,7 @@ void RecordSigninNewAccountUserActionForAccessPoint( | 
| - (void)signinPromoViewDidTapSigninWithOtherAccount: | 
| (SigninPromoView*)signinPromoView { | 
| DCHECK(_defaultIdentity); | 
| +  [self sendCountTillSigninHistogram]; | 
| RecordSigninNotDefaultUserActionForAccessPoint(_accessPoint); | 
| RecordSigninUserActionForAccessPoint(_accessPoint); | 
| ShowSigninCommand* command = [[ShowSigninCommand alloc] | 
|  |