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] |