Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(120)

Side by Side Diff: ios/chrome/browser/ui/settings/settings_collection_view_controller.mm

Issue 2953083005: Implementing sign-in promo histograms for settings (Closed)
Patch Set: Adding "iSO only" Created 3 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « ios/chrome/browser/ui/settings/BUILD.gn ('k') | tools/metrics/histograms/histograms.xml » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #import "ios/chrome/browser/ui/settings/settings_collection_view_controller.h" 5 #import "ios/chrome/browser/ui/settings/settings_collection_view_controller.h"
6 6
7 #include <memory> 7 #include <memory>
8 8
9 #import "base/mac/foundation_util.h" 9 #import "base/mac/foundation_util.h"
10 #include "base/metrics/histogram_macros.h"
10 #include "base/metrics/user_metrics.h" 11 #include "base/metrics/user_metrics.h"
11 #include "base/scoped_observer.h" 12 #include "base/scoped_observer.h"
12 #include "base/strings/sys_string_conversions.h" 13 #include "base/strings/sys_string_conversions.h"
13 #include "components/autofill/core/common/autofill_pref_names.h" 14 #include "components/autofill/core/common/autofill_pref_names.h"
14 #include "components/browser_sync/profile_sync_service.h" 15 #include "components/browser_sync/profile_sync_service.h"
15 #include "components/keyed_service/core/service_access_type.h" 16 #include "components/keyed_service/core/service_access_type.h"
16 #include "components/password_manager/core/browser/password_store.h" 17 #include "components/password_manager/core/browser/password_store.h"
17 #include "components/password_manager/core/common/password_manager_pref_names.h" 18 #include "components/password_manager/core/common/password_manager_pref_names.h"
19 #include "components/pref_registry/pref_registry_syncable.h"
18 #include "components/prefs/pref_change_registrar.h" 20 #include "components/prefs/pref_change_registrar.h"
19 #include "components/prefs/pref_service.h" 21 #include "components/prefs/pref_service.h"
20 #include "components/search_engines/util.h" 22 #include "components/search_engines/util.h"
21 #include "components/signin/core/browser/signin_manager.h" 23 #include "components/signin/core/browser/signin_manager.h"
22 #include "components/signin/core/common/signin_pref_names.h" 24 #include "components/signin/core/common/signin_pref_names.h"
23 #include "components/strings/grit/components_strings.h" 25 #include "components/strings/grit/components_strings.h"
24 #include "ios/chrome/browser/application_context.h" 26 #include "ios/chrome/browser/application_context.h"
25 #include "ios/chrome/browser/browser_state/chrome_browser_state.h" 27 #include "ios/chrome/browser/browser_state/chrome_browser_state.h"
26 #include "ios/chrome/browser/browser_state/chrome_browser_state_removal_controll er.h" 28 #include "ios/chrome/browser/browser_state/chrome_browser_state_removal_controll er.h"
27 #include "ios/chrome/browser/experimental_flags.h" 29 #include "ios/chrome/browser/experimental_flags.h"
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
89 91
90 @interface SettingsCollectionViewController (NotificationBridgeDelegate) 92 @interface SettingsCollectionViewController (NotificationBridgeDelegate)
91 // Notifies this controller that the sign in state has changed. 93 // Notifies this controller that the sign in state has changed.
92 - (void)onSignInStateChanged; 94 - (void)onSignInStateChanged;
93 @end 95 @end
94 96
95 namespace { 97 namespace {
96 98
97 const CGFloat kAccountProfilePhotoDimension = 40.0f; 99 const CGFloat kAccountProfilePhotoDimension = 40.0f;
98 100
101 const int kAutomaticSigninPromoViewDismissCount = 20;
102
99 typedef NS_ENUM(NSInteger, SectionIdentifier) { 103 typedef NS_ENUM(NSInteger, SectionIdentifier) {
100 SectionIdentifierSignIn = kSectionIdentifierEnumZero, 104 SectionIdentifierSignIn = kSectionIdentifierEnumZero,
101 SectionIdentifierBasics, 105 SectionIdentifierBasics,
102 SectionIdentifierAdvanced, 106 SectionIdentifierAdvanced,
103 SectionIdentifierInfo, 107 SectionIdentifierInfo,
104 SectionIdentifierDebug, 108 SectionIdentifierDebug,
105 }; 109 };
106 110
107 typedef NS_ENUM(NSInteger, ItemType) { 111 typedef NS_ENUM(NSInteger, ItemType) {
108 ItemTypeSignInButton = kItemTypeEnumZero, 112 ItemTypeSignInButton = kItemTypeEnumZero,
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after
217 // TODO(crbug.com/662435): Refactor PrefObserverBridge so it owns the 221 // TODO(crbug.com/662435): Refactor PrefObserverBridge so it owns the
218 // PrefChangeRegistrar. 222 // PrefChangeRegistrar.
219 // Registrar for pref changes notifications. 223 // Registrar for pref changes notifications.
220 PrefChangeRegistrar _prefChangeRegistrar; 224 PrefChangeRegistrar _prefChangeRegistrar;
221 225
222 // Updatable Items. 226 // Updatable Items.
223 CollectionViewDetailItem* _voiceSearchDetailItem; 227 CollectionViewDetailItem* _voiceSearchDetailItem;
224 CollectionViewDetailItem* _defaultSearchEngineItem; 228 CollectionViewDetailItem* _defaultSearchEngineItem;
225 CollectionViewDetailItem* _savePasswordsDetailItem; 229 CollectionViewDetailItem* _savePasswordsDetailItem;
226 CollectionViewDetailItem* _autoFillDetailItem; 230 CollectionViewDetailItem* _autoFillDetailItem;
231
232 // YES if the user used at least once the sign-in promo view buttons.
233 BOOL _signinStarted;
227 } 234 }
228 235
229 // Stops observing browser state services. This is required during the shutdown 236 // Stops observing browser state services. This is required during the shutdown
230 // phase to avoid observing services for a profile that is being killed. 237 // phase to avoid observing services for a profile that is being killed.
231 - (void)stopBrowserStateServiceObservers; 238 - (void)stopBrowserStateServiceObservers;
232 239
233 @end 240 @end
234 241
235 @implementation SettingsCollectionViewController 242 @implementation SettingsCollectionViewController
236 @synthesize dispatcher = _dispatcher; 243 @synthesize dispatcher = _dispatcher;
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
303 #pragma mark View lifecycle 310 #pragma mark View lifecycle
304 311
305 // TODO(crbug.com/661915): Refactor TemplateURLObserver and re-implement this so 312 // TODO(crbug.com/661915): Refactor TemplateURLObserver and re-implement this so
306 // it observes the default search engine name instead of reloading on 313 // it observes the default search engine name instead of reloading on
307 // ViewWillAppear. 314 // ViewWillAppear.
308 - (void)viewWillAppear:(BOOL)animated { 315 - (void)viewWillAppear:(BOOL)animated {
309 [super viewWillAppear:animated]; 316 [super viewWillAppear:animated];
310 [self updateSearchCell]; 317 [self updateSearchCell];
311 } 318 }
312 319
320 - (void)viewDidDisappear:(BOOL)animated {
321 [super viewDidDisappear:animated];
322 if (!_signinStarted && _signinPromoViewMediator) {
323 PrefService* prefs = _browserState->GetPrefs();
324 int displayedCount =
325 prefs->GetInteger(prefs::kIosSettingsSigninPromoDisplayedCount);
326 UMA_HISTOGRAM_COUNTS_100(
327 "MobileSignInPromo.SettingsManager.ImpressionsTilDismiss",
328 displayedCount);
329 }
330 }
331
313 #pragma mark SettingsRootCollectionViewController 332 #pragma mark SettingsRootCollectionViewController
314 333
315 - (void)loadModel { 334 - (void)loadModel {
316 [super loadModel]; 335 [super loadModel];
317 336
318 CollectionViewModel* model = self.collectionViewModel; 337 CollectionViewModel* model = self.collectionViewModel;
319 338
320 // Sign in/Account section 339 // Sign in/Account section
321 [model addSectionWithIdentifier:SectionIdentifierSignIn]; 340 [model addSectionWithIdentifier:SectionIdentifierSignIn];
322 AuthenticationService* authService = 341 AuthenticationService* authService =
323 AuthenticationServiceFactory::GetForBrowserState(_browserState); 342 AuthenticationServiceFactory::GetForBrowserState(_browserState);
324 if (!authService->IsAuthenticated()) { 343 if (!authService->IsAuthenticated()) {
325 if (!_hasRecordedSigninImpression) { 344 if (!_hasRecordedSigninImpression) {
326 // Once the Settings are open, this button impression will at most be 345 // Once the Settings are open, this button impression will at most be
327 // recorded once until they are closed. 346 // recorded once until they are closed.
328 base::RecordAction( 347 base::RecordAction(
329 base::UserMetricsAction("Signin_Impression_FromSettings")); 348 base::UserMetricsAction("Signin_Impression_FromSettings"));
330 _hasRecordedSigninImpression = YES; 349 _hasRecordedSigninImpression = YES;
331 } 350 }
332 if (experimental_flags::IsSigninPromoEnabled()) { 351 PrefService* prefs = _browserState->GetPrefs();
352 int displayedCount =
353 prefs->GetInteger(prefs::kIosSettingsSigninPromoDisplayedCount);
354 if (experimental_flags::IsSigninPromoEnabled() &&
355 displayedCount < kAutomaticSigninPromoViewDismissCount) {
333 _signinPromoViewMediator = 356 _signinPromoViewMediator =
334 [[SigninPromoViewMediator alloc] initWithBrowserState:_browserState]; 357 [[SigninPromoViewMediator alloc] initWithBrowserState:_browserState];
335 _signinPromoViewMediator.consumer = self; 358 _signinPromoViewMediator.consumer = self;
359 prefs->SetInteger(prefs::kIosSettingsSigninPromoDisplayedCount,
360 displayedCount + 1);
336 } 361 }
337 [model addItem:[self signInTextItem] 362 [model addItem:[self signInTextItem]
338 toSectionWithIdentifier:SectionIdentifierSignIn]; 363 toSectionWithIdentifier:SectionIdentifierSignIn];
339 } else { 364 } else {
340 _signinPromoViewMediator = nil; 365 _signinPromoViewMediator = nil;
341 [model addItem:[self accountCellItem] 366 [model addItem:[self accountCellItem]
342 toSectionWithIdentifier:SectionIdentifierSignIn]; 367 toSectionWithIdentifier:SectionIdentifierSignIn];
343 } 368 }
344 369
345 // Basics section 370 // Basics section
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
405 [model addItem:[self showAutofillTypePredictionsSwitchItem] 430 [model addItem:[self showAutofillTypePredictionsSwitchItem]
406 toSectionWithIdentifier:SectionIdentifierDebug]; 431 toSectionWithIdentifier:SectionIdentifierDebug];
407 [model addItem:[self materialCatalogDetailItem] 432 [model addItem:[self materialCatalogDetailItem]
408 toSectionWithIdentifier:SectionIdentifierDebug]; 433 toSectionWithIdentifier:SectionIdentifierDebug];
409 #endif // CHROMIUM_BUILD && !defined(NDEBUG) 434 #endif // CHROMIUM_BUILD && !defined(NDEBUG)
410 } 435 }
411 436
412 #pragma mark - Model Items 437 #pragma mark - Model Items
413 438
414 - (CollectionViewItem*)signInTextItem { 439 - (CollectionViewItem*)signInTextItem {
415 if (experimental_flags::IsSigninPromoEnabled()) { 440 if (_signinPromoViewMediator) {
416 DCHECK(_signinPromoViewMediator);
417 SigninPromoItem* signinPromoItem = 441 SigninPromoItem* signinPromoItem =
418 [[SigninPromoItem alloc] initWithType:ItemTypeSigninPromo]; 442 [[SigninPromoItem alloc] initWithType:ItemTypeSigninPromo];
419 signinPromoItem.configurator = 443 signinPromoItem.configurator =
420 [_signinPromoViewMediator createConfigurator]; 444 [_signinPromoViewMediator createConfigurator];
421 return signinPromoItem; 445 return signinPromoItem;
422 } 446 }
423 AccountSignInItem* signInTextItem = 447 AccountSignInItem* signInTextItem =
424 [[AccountSignInItem alloc] initWithType:ItemTypeSignInButton]; 448 [[AccountSignInItem alloc] initWithType:ItemTypeSignInButton];
425 signInTextItem.accessibilityIdentifier = kSettingsSignInCellId; 449 signInTextItem.accessibilityIdentifier = kSettingsSignInCellId;
426 UIImage* image = CircularImageFromImage(ios::GetChromeBrowserProvider() 450 UIImage* image = CircularImageFromImage(ios::GetChromeBrowserProvider()
(...skipping 727 matching lines...) Expand 10 before | Expand all | Expand 10 after
1154 [self reconfigureCellsForItems:@[ signinPromoItem ]]; 1178 [self reconfigureCellsForItems:@[ signinPromoItem ]];
1155 if (identityChanged) 1179 if (identityChanged)
1156 [self.collectionViewLayout invalidateLayout]; 1180 [self.collectionViewLayout invalidateLayout];
1157 } 1181 }
1158 } 1182 }
1159 1183
1160 #pragma mark - SigninPromoViewDelegate 1184 #pragma mark - SigninPromoViewDelegate
1161 1185
1162 - (void)signinPromoViewDidTapSigninWithNewAccount: 1186 - (void)signinPromoViewDidTapSigninWithNewAccount:
1163 (SigninPromoView*)signinPromoView { 1187 (SigninPromoView*)signinPromoView {
1188 [self sendImpressionsTilSigninButtonsHistogram];
1164 DCHECK(!_signinPromoViewMediator.defaultIdentity); 1189 DCHECK(!_signinPromoViewMediator.defaultIdentity);
1165 base::RecordAction( 1190 base::RecordAction(
1166 base::UserMetricsAction("Signin_SigninNewAccount_FromSettings")); 1191 base::UserMetricsAction("Signin_SigninNewAccount_FromSettings"));
1167 [self showSignInWithIdentity:nil 1192 [self showSignInWithIdentity:nil
1168 promoAction:signin_metrics::PromoAction:: 1193 promoAction:signin_metrics::PromoAction::
1169 PROMO_ACTION_NEW_ACCOUNT]; 1194 PROMO_ACTION_NEW_ACCOUNT];
1170 } 1195 }
1171 1196
1172 - (void)signinPromoViewDidTapSigninWithDefaultAccount: 1197 - (void)signinPromoViewDidTapSigninWithDefaultAccount:
1173 (SigninPromoView*)signinPromoView { 1198 (SigninPromoView*)signinPromoView {
1199 [self sendImpressionsTilSigninButtonsHistogram];
1174 ChromeIdentity* identity = _signinPromoViewMediator.defaultIdentity; 1200 ChromeIdentity* identity = _signinPromoViewMediator.defaultIdentity;
1175 DCHECK(identity); 1201 DCHECK(identity);
1176 base::RecordAction( 1202 base::RecordAction(
1177 base::UserMetricsAction("Signin_SigninWithDefault_FromSettings")); 1203 base::UserMetricsAction("Signin_SigninWithDefault_FromSettings"));
1178 [self showSignInWithIdentity:identity 1204 [self showSignInWithIdentity:identity
1179 promoAction:signin_metrics::PromoAction:: 1205 promoAction:signin_metrics::PromoAction::
1180 PROMO_ACTION_WITH_DEFAULT]; 1206 PROMO_ACTION_WITH_DEFAULT];
1181 } 1207 }
1182 1208
1183 - (void)signinPromoViewDidTapSigninWithOtherAccount: 1209 - (void)signinPromoViewDidTapSigninWithOtherAccount:
1184 (SigninPromoView*)signinPromoView { 1210 (SigninPromoView*)signinPromoView {
1211 [self sendImpressionsTilSigninButtonsHistogram];
1185 DCHECK(_signinPromoViewMediator.defaultIdentity); 1212 DCHECK(_signinPromoViewMediator.defaultIdentity);
1186 base::RecordAction( 1213 base::RecordAction(
1187 base::UserMetricsAction("Signin_SigninNotDefault_FromSettings")); 1214 base::UserMetricsAction("Signin_SigninNotDefault_FromSettings"));
1188 [self showSignInWithIdentity:nil 1215 [self showSignInWithIdentity:nil
1189 promoAction:signin_metrics::PromoAction:: 1216 promoAction:signin_metrics::PromoAction::
1190 PROMO_ACTION_NOT_DEFAULT]; 1217 PROMO_ACTION_NOT_DEFAULT];
1191 } 1218 }
1192 1219
1220 #pragma mark - Metrics
1221
1222 - (void)sendImpressionsTilSigninButtonsHistogram {
1223 _signinStarted = YES;
1224 PrefService* prefs = _browserState->GetPrefs();
1225 int displayedCount =
1226 prefs->GetInteger(prefs::kIosSettingsSigninPromoDisplayedCount);
1227 UMA_HISTOGRAM_COUNTS_100(
1228 "MobileSignInPromo.SettingsManager.ImpressionsTilSigninButtons",
1229 displayedCount);
1230 }
1231
1193 @end 1232 @end
OLDNEW
« no previous file with comments | « ios/chrome/browser/ui/settings/BUILD.gn ('k') | tools/metrics/histograms/histograms.xml » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698