OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 <Cocoa/Cocoa.h> | 5 #import <Cocoa/Cocoa.h> |
6 | 6 |
7 #import "chrome/browser/ui/cocoa/profiles/profile_chooser_controller.h" | 7 #import "chrome/browser/ui/cocoa/profiles/profile_chooser_controller.h" |
8 | 8 |
9 #include "base/mac/bundle_locations.h" | 9 #include "base/mac/bundle_locations.h" |
10 #include "base/prefs/pref_service.h" | 10 #include "base/prefs/pref_service.h" |
11 #include "base/strings/sys_string_conversions.h" | 11 #include "base/strings/sys_string_conversions.h" |
12 #include "base/strings/utf_string_conversions.h" | 12 #include "base/strings/utf_string_conversions.h" |
13 #include "chrome/browser/browser_process.h" | 13 #include "chrome/browser/browser_process.h" |
14 #include "chrome/browser/chrome_notification_types.h" | 14 #include "chrome/browser/chrome_notification_types.h" |
15 #include "chrome/browser/lifetime/application_lifetime.h" | 15 #include "chrome/browser/lifetime/application_lifetime.h" |
16 #include "chrome/browser/profiles/avatar_menu.h" | 16 #include "chrome/browser/profiles/avatar_menu.h" |
17 #include "chrome/browser/profiles/avatar_menu_observer.h" | 17 #include "chrome/browser/profiles/avatar_menu_observer.h" |
18 #include "chrome/browser/profiles/profile_avatar_icon_util.h" | 18 #include "chrome/browser/profiles/profile_avatar_icon_util.h" |
19 #include "chrome/browser/profiles/profile_info_cache.h" | 19 #include "chrome/browser/profiles/profile_info_cache.h" |
20 #include "chrome/browser/profiles/profile_manager.h" | 20 #include "chrome/browser/profiles/profile_manager.h" |
21 #include "chrome/browser/profiles/profile_metrics.h" | 21 #include "chrome/browser/profiles/profile_metrics.h" |
22 #include "chrome/browser/profiles/profile_window.h" | 22 #include "chrome/browser/profiles/profile_window.h" |
23 #include "chrome/browser/profiles/profiles_state.h" | 23 #include "chrome/browser/profiles/profiles_state.h" |
24 #include "chrome/browser/signin/profile_oauth2_token_service_factory.h" | 24 #include "chrome/browser/signin/profile_oauth2_token_service_factory.h" |
| 25 #include "chrome/browser/signin/signin_header_helper.h" |
25 #include "chrome/browser/signin/signin_manager_factory.h" | 26 #include "chrome/browser/signin/signin_manager_factory.h" |
26 #include "chrome/browser/signin/signin_promo.h" | 27 #include "chrome/browser/signin/signin_promo.h" |
27 #include "chrome/browser/ui/browser.h" | 28 #include "chrome/browser/ui/browser.h" |
28 #include "chrome/browser/ui/browser_commands.h" | 29 #include "chrome/browser/ui/browser_commands.h" |
29 #include "chrome/browser/ui/browser_dialogs.h" | 30 #include "chrome/browser/ui/browser_dialogs.h" |
30 #include "chrome/browser/ui/browser_window.h" | 31 #include "chrome/browser/ui/browser_window.h" |
31 #include "chrome/browser/ui/chrome_pages.h" | 32 #include "chrome/browser/ui/chrome_pages.h" |
32 #include "chrome/browser/ui/chrome_style.h" | 33 #include "chrome/browser/ui/chrome_style.h" |
33 #import "chrome/browser/ui/cocoa/hyperlink_text_view.h" | 34 #import "chrome/browser/ui/cocoa/hyperlink_text_view.h" |
34 #import "chrome/browser/ui/cocoa/info_bubble_view.h" | 35 #import "chrome/browser/ui/cocoa/info_bubble_view.h" |
(...skipping 321 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
356 } | 357 } |
357 @end | 358 @end |
358 | 359 |
359 // A custom image control that shows a "Change" button when moused over. | 360 // A custom image control that shows a "Change" button when moused over. |
360 @interface EditableProfilePhoto : NSImageView { | 361 @interface EditableProfilePhoto : NSImageView { |
361 @private | 362 @private |
362 AvatarMenu* avatarMenu_; // Weak; Owned by ProfileChooserController. | 363 AvatarMenu* avatarMenu_; // Weak; Owned by ProfileChooserController. |
363 base::scoped_nsobject<TransparentBackgroundButton> changePhotoButton_; | 364 base::scoped_nsobject<TransparentBackgroundButton> changePhotoButton_; |
364 // Used to display the "Change" button on hover. | 365 // Used to display the "Change" button on hover. |
365 ui::ScopedCrTrackingArea trackingArea_; | 366 ui::ScopedCrTrackingArea trackingArea_; |
| 367 ProfileChooserController* controller_; |
366 } | 368 } |
367 | 369 |
368 - (id)initWithFrame:(NSRect)frameRect | 370 - (id)initWithFrame:(NSRect)frameRect |
369 avatarMenu:(AvatarMenu*)avatarMenu | 371 avatarMenu:(AvatarMenu*)avatarMenu |
370 profileIcon:(const gfx::Image&)profileIcon | 372 profileIcon:(const gfx::Image&)profileIcon |
371 editingAllowed:(BOOL)editingAllowed; | 373 editingAllowed:(BOOL)editingAllowed |
| 374 withController:(ProfileChooserController*)controller; |
372 | 375 |
373 // Called when the "Change" button is clicked. | 376 // Called when the "Change" button is clicked. |
374 - (void)editPhoto:(id)sender; | 377 - (void)editPhoto:(id)sender; |
375 | 378 |
376 // When hovering over the profile photo, show the "Change" button. | 379 // When hovering over the profile photo, show the "Change" button. |
377 - (void)mouseEntered:(NSEvent*)event; | 380 - (void)mouseEntered:(NSEvent*)event; |
378 | 381 |
379 // When hovering away from the profile photo, hide the "Change" button. | 382 // When hovering away from the profile photo, hide the "Change" button. |
380 - (void)mouseExited:(NSEvent*)event; | 383 - (void)mouseExited:(NSEvent*)event; |
381 @end | 384 @end |
382 | 385 |
383 @interface EditableProfilePhoto (Private) | 386 @interface EditableProfilePhoto (Private) |
384 // Create the "Change" avatar photo button. | 387 // Create the "Change" avatar photo button. |
385 - (TransparentBackgroundButton*)changePhotoButtonWithRect:(NSRect)rect; | 388 - (TransparentBackgroundButton*)changePhotoButtonWithRect:(NSRect)rect; |
386 @end | 389 @end |
387 | 390 |
388 @implementation EditableProfilePhoto | 391 @implementation EditableProfilePhoto |
389 - (id)initWithFrame:(NSRect)frameRect | 392 - (id)initWithFrame:(NSRect)frameRect |
390 avatarMenu:(AvatarMenu*)avatarMenu | 393 avatarMenu:(AvatarMenu*)avatarMenu |
391 profileIcon:(const gfx::Image&)profileIcon | 394 profileIcon:(const gfx::Image&)profileIcon |
392 editingAllowed:(BOOL)editingAllowed { | 395 editingAllowed:(BOOL)editingAllowed |
| 396 withController:(ProfileChooserController*)controller { |
393 if ((self = [super initWithFrame:frameRect])) { | 397 if ((self = [super initWithFrame:frameRect])) { |
394 avatarMenu_ = avatarMenu; | 398 avatarMenu_ = avatarMenu; |
| 399 controller_ = controller; |
395 [self setImage:CreateProfileImage( | 400 [self setImage:CreateProfileImage( |
396 profileIcon, kLargeImageSide).ToNSImage()]; | 401 profileIcon, kLargeImageSide).ToNSImage()]; |
397 | 402 |
398 // Add a tracking area so that we can show/hide the button when hovering. | 403 // Add a tracking area so that we can show/hide the button when hovering. |
399 trackingArea_.reset([[CrTrackingArea alloc] | 404 trackingArea_.reset([[CrTrackingArea alloc] |
400 initWithRect:[self bounds] | 405 initWithRect:[self bounds] |
401 options:NSTrackingMouseEnteredAndExited | NSTrackingActiveAlways | 406 options:NSTrackingMouseEnteredAndExited | NSTrackingActiveAlways |
402 owner:self | 407 owner:self |
403 userInfo:nil]); | 408 userInfo:nil]); |
404 [self addTrackingArea:trackingArea_.get()]; | 409 [self addTrackingArea:trackingArea_.get()]; |
(...skipping 18 matching lines...) Expand all Loading... |
423 [path addClip]; | 428 [path addClip]; |
424 [self.image drawAtPoint:bounds.origin | 429 [self.image drawAtPoint:bounds.origin |
425 fromRect:bounds | 430 fromRect:bounds |
426 operation:NSCompositeSourceOver | 431 operation:NSCompositeSourceOver |
427 fraction:1.0]; | 432 fraction:1.0]; |
428 | 433 |
429 } | 434 } |
430 | 435 |
431 - (void)editPhoto:(id)sender { | 436 - (void)editPhoto:(id)sender { |
432 avatarMenu_->EditProfile(avatarMenu_->GetActiveProfileIndex()); | 437 avatarMenu_->EditProfile(avatarMenu_->GetActiveProfileIndex()); |
| 438 [controller_ |
| 439 postActionPerformed:ProfileMetrics::PROFILE_DESKTOP_MENU_EDIT_IMAGE]; |
433 } | 440 } |
434 | 441 |
435 - (void)mouseEntered:(NSEvent*)event { | 442 - (void)mouseEntered:(NSEvent*)event { |
436 [changePhotoButton_ setHidden:NO]; | 443 [changePhotoButton_ setHidden:NO]; |
437 } | 444 } |
438 | 445 |
439 - (void)mouseExited:(NSEvent*)event { | 446 - (void)mouseExited:(NSEvent*)event { |
440 [changePhotoButton_ setHidden:YES]; | 447 [changePhotoButton_ setHidden:YES]; |
441 } | 448 } |
442 | 449 |
443 - (TransparentBackgroundButton*)changePhotoButtonWithRect:(NSRect)rect { | 450 - (TransparentBackgroundButton*)changePhotoButtonWithRect:(NSRect)rect { |
444 TransparentBackgroundButton* button = | 451 TransparentBackgroundButton* button = |
445 [[TransparentBackgroundButton alloc] initWithFrame:rect]; | 452 [[TransparentBackgroundButton alloc] initWithFrame:rect]; |
446 [button setImage:ui::ResourceBundle::GetSharedInstance().GetNativeImageNamed( | 453 [button setImage:ui::ResourceBundle::GetSharedInstance().GetNativeImageNamed( |
447 IDR_ICON_PROFILES_EDIT_CAMERA).AsNSImage()]; | 454 IDR_ICON_PROFILES_EDIT_CAMERA).AsNSImage()]; |
448 [button setImagePosition:NSImageOnly]; | 455 [button setImagePosition:NSImageOnly]; |
449 [button setTarget:self]; | 456 [button setTarget:self]; |
450 [button setAction:@selector(editPhoto:)]; | 457 [button setAction:@selector(editPhoto:)]; |
451 return button; | 458 return button; |
452 } | 459 } |
453 @end | 460 @end |
454 | 461 |
455 // A custom text control that turns into a textfield for editing when clicked. | 462 // A custom text control that turns into a textfield for editing when clicked. |
456 @interface EditableProfileNameButton : HoverImageButton<NSTextFieldDelegate> { | 463 @interface EditableProfileNameButton : HoverImageButton<NSTextFieldDelegate> { |
457 @private | 464 @private |
458 base::scoped_nsobject<NSTextField> profileNameTextField_; | 465 base::scoped_nsobject<NSTextField> profileNameTextField_; |
459 Profile* profile_; // Weak. | 466 Profile* profile_; // Weak. |
| 467 ProfileChooserController* controller_; |
460 } | 468 } |
461 | 469 |
462 - (id)initWithFrame:(NSRect)frameRect | 470 - (id)initWithFrame:(NSRect)frameRect |
463 profile:(Profile*)profile | 471 profile:(Profile*)profile |
464 profileName:(NSString*)profileName | 472 profileName:(NSString*)profileName |
465 editingAllowed:(BOOL)editingAllowed; | 473 editingAllowed:(BOOL)editingAllowed |
| 474 withController:(ProfileChooserController*)controller; |
466 | 475 |
467 // Called when the button is clicked. | 476 // Called when the button is clicked. |
468 - (void)showEditableView:(id)sender; | 477 - (void)showEditableView:(id)sender; |
469 | 478 |
470 // Called when the user presses "Enter" in the textfield. | 479 // Called when the user presses "Enter" in the textfield. |
471 - (void)controlTextDidEndEditing:(NSNotification *)obj; | 480 - (void)controlTextDidEndEditing:(NSNotification *)obj; |
472 @end | 481 @end |
473 | 482 |
474 @implementation EditableProfileNameButton | 483 @implementation EditableProfileNameButton |
475 - (id)initWithFrame:(NSRect)frameRect | 484 - (id)initWithFrame:(NSRect)frameRect |
476 profile:(Profile*)profile | 485 profile:(Profile*)profile |
477 profileName:(NSString*)profileName | 486 profileName:(NSString*)profileName |
478 editingAllowed:(BOOL)editingAllowed { | 487 editingAllowed:(BOOL)editingAllowed |
| 488 withController:(ProfileChooserController*)controller { |
479 if ((self = [super initWithFrame:frameRect])) { | 489 if ((self = [super initWithFrame:frameRect])) { |
480 profile_ = profile; | 490 profile_ = profile; |
| 491 controller_ = controller; |
481 | 492 |
482 [self setBordered:NO]; | 493 [self setBordered:NO]; |
483 [self setFont:[NSFont labelFontOfSize:kTitleFontSize]]; | 494 [self setFont:[NSFont labelFontOfSize:kTitleFontSize]]; |
484 [self setAlignment:NSCenterTextAlignment]; | 495 [self setAlignment:NSCenterTextAlignment]; |
485 [[self cell] setLineBreakMode:NSLineBreakByTruncatingTail]; | 496 [[self cell] setLineBreakMode:NSLineBreakByTruncatingTail]; |
486 [self setTitle:profileName]; | 497 [self setTitle:profileName]; |
487 | 498 |
488 if (editingAllowed) { | 499 if (editingAllowed) { |
489 // Show an "edit" pencil icon when hovering over. In the default state, | 500 // Show an "edit" pencil icon when hovering over. In the default state, |
490 // we need to create an empty placeholder of the correct size, so that | 501 // we need to create an empty placeholder of the correct size, so that |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
526 return self; | 537 return self; |
527 } | 538 } |
528 | 539 |
529 // NSTextField objects send an NSNotification to a delegate if | 540 // NSTextField objects send an NSNotification to a delegate if |
530 // it implements this method: | 541 // it implements this method: |
531 - (void)controlTextDidEndEditing:(NSNotification *)obj { | 542 - (void)controlTextDidEndEditing:(NSNotification *)obj { |
532 NSString* text = [profileNameTextField_ stringValue]; | 543 NSString* text = [profileNameTextField_ stringValue]; |
533 // Empty profile names are not allowed, and are treated as a cancel. | 544 // Empty profile names are not allowed, and are treated as a cancel. |
534 if ([text length] > 0) { | 545 if ([text length] > 0) { |
535 profiles::UpdateProfileName(profile_, base::SysNSStringToUTF16(text)); | 546 profiles::UpdateProfileName(profile_, base::SysNSStringToUTF16(text)); |
| 547 [controller_ |
| 548 postActionPerformed:ProfileMetrics::PROFILE_DESKTOP_MENU_EDIT_NAME]; |
536 [self setTitle:text]; | 549 [self setTitle:text]; |
537 } | 550 } |
538 [profileNameTextField_ setHidden:YES]; | 551 [profileNameTextField_ setHidden:YES]; |
539 [profileNameTextField_ resignFirstResponder]; | 552 [profileNameTextField_ resignFirstResponder]; |
540 } | 553 } |
541 | 554 |
542 - (void)showEditableView:(id)sender { | 555 - (void)showEditableView:(id)sender { |
543 [profileNameTextField_ setHidden:NO]; | 556 [profileNameTextField_ setHidden:NO]; |
544 [profileNameTextField_ becomeFirstResponder]; | 557 [profileNameTextField_ becomeFirstResponder]; |
545 } | 558 } |
(...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
730 // |frameOrigin|. | 743 // |frameOrigin|. |
731 - (NSButton*)linkButtonWithTitle:(NSString*)title | 744 - (NSButton*)linkButtonWithTitle:(NSString*)title |
732 frameOrigin:(NSPoint)frameOrigin | 745 frameOrigin:(NSPoint)frameOrigin |
733 action:(SEL)action; | 746 action:(SEL)action; |
734 | 747 |
735 // Creates an email account button with |title| and a remove icon. |tag| | 748 // Creates an email account button with |title| and a remove icon. |tag| |
736 // indicates which account the button refers to. | 749 // indicates which account the button refers to. |
737 - (NSButton*)accountButtonWithRect:(NSRect)rect | 750 - (NSButton*)accountButtonWithRect:(NSRect)rect |
738 title:(const std::string&)title | 751 title:(const std::string&)title |
739 tag:(int)tag; | 752 tag:(int)tag; |
740 | |
741 @end | 753 @end |
742 | 754 |
743 @implementation ProfileChooserController | 755 @implementation ProfileChooserController |
744 - (profiles::BubbleViewMode) viewMode { | 756 - (profiles::BubbleViewMode) viewMode { |
745 return viewMode_; | 757 return viewMode_; |
746 } | 758 } |
747 | 759 |
748 - (IBAction)switchToProfile:(id)sender { | 760 - (IBAction)switchToProfile:(id)sender { |
749 // Check the event flags to see if a new window should be created. | 761 // Check the event flags to see if a new window should be created. |
750 bool alwaysCreate = ui::WindowOpenDispositionFromNSEvent( | 762 bool alwaysCreate = ui::WindowOpenDispositionFromNSEvent( |
(...skipping 15 matching lines...) Expand all Loading... |
766 - (IBAction)showAccountManagement:(id)sender { | 778 - (IBAction)showAccountManagement:(id)sender { |
767 [self initMenuContentsWithView:profiles::BUBBLE_VIEW_MODE_ACCOUNT_MANAGEMENT]; | 779 [self initMenuContentsWithView:profiles::BUBBLE_VIEW_MODE_ACCOUNT_MANAGEMENT]; |
768 } | 780 } |
769 | 781 |
770 - (IBAction)hideAccountManagement:(id)sender { | 782 - (IBAction)hideAccountManagement:(id)sender { |
771 [self initMenuContentsWithView:profiles::BUBBLE_VIEW_MODE_PROFILE_CHOOSER]; | 783 [self initMenuContentsWithView:profiles::BUBBLE_VIEW_MODE_PROFILE_CHOOSER]; |
772 } | 784 } |
773 | 785 |
774 - (IBAction)lockProfile:(id)sender { | 786 - (IBAction)lockProfile:(id)sender { |
775 profiles::LockProfile(browser_->profile()); | 787 profiles::LockProfile(browser_->profile()); |
| 788 [self postActionPerformed:ProfileMetrics::PROFILE_DESKTOP_MENU_LOCK]; |
776 } | 789 } |
777 | 790 |
778 - (IBAction)showInlineSigninPage:(id)sender { | 791 - (IBAction)showInlineSigninPage:(id)sender { |
779 [self initMenuContentsWithView:profiles::BUBBLE_VIEW_MODE_GAIA_SIGNIN]; | 792 [self initMenuContentsWithView:profiles::BUBBLE_VIEW_MODE_GAIA_SIGNIN]; |
780 } | 793 } |
781 | 794 |
782 - (IBAction)showTabbedSigninPage:(id)sender { | 795 - (IBAction)showTabbedSigninPage:(id)sender { |
783 chrome::ShowBrowserSignin(browser_, signin::SOURCE_MENU); | 796 chrome::ShowBrowserSignin(browser_, signin::SOURCE_MENU); |
784 } | 797 } |
785 | 798 |
786 - (IBAction)addAccount:(id)sender { | 799 - (IBAction)addAccount:(id)sender { |
787 [self initMenuContentsWithView:profiles::BUBBLE_VIEW_MODE_GAIA_ADD_ACCOUNT]; | 800 [self initMenuContentsWithView:profiles::BUBBLE_VIEW_MODE_GAIA_ADD_ACCOUNT]; |
| 801 [self postActionPerformed:ProfileMetrics::PROFILE_DESKTOP_MENU_ADD_ACCT]; |
788 } | 802 } |
789 | 803 |
790 - (IBAction)navigateBackFromSigninPage:(id)sender { | 804 - (IBAction)navigateBackFromSigninPage:(id)sender { |
791 std::string primaryAccount = SigninManagerFactory::GetForProfile( | 805 std::string primaryAccount = SigninManagerFactory::GetForProfile( |
792 browser_->profile())->GetAuthenticatedUsername(); | 806 browser_->profile())->GetAuthenticatedUsername(); |
793 [self initMenuContentsWithView:primaryAccount.empty() ? | 807 [self initMenuContentsWithView:primaryAccount.empty() ? |
794 profiles::BUBBLE_VIEW_MODE_PROFILE_CHOOSER : | 808 profiles::BUBBLE_VIEW_MODE_PROFILE_CHOOSER : |
795 profiles::BUBBLE_VIEW_MODE_ACCOUNT_MANAGEMENT]; | 809 profiles::BUBBLE_VIEW_MODE_ACCOUNT_MANAGEMENT]; |
796 } | 810 } |
797 | 811 |
(...skipping 11 matching lines...) Expand all Loading... |
809 accountIdToRemove_ = currentProfileAccounts_[tag]; | 823 accountIdToRemove_ = currentProfileAccounts_[tag]; |
810 } | 824 } |
811 | 825 |
812 [self initMenuContentsWithView:profiles::BUBBLE_VIEW_MODE_ACCOUNT_REMOVAL]; | 826 [self initMenuContentsWithView:profiles::BUBBLE_VIEW_MODE_ACCOUNT_REMOVAL]; |
813 } | 827 } |
814 | 828 |
815 - (IBAction)removeAccount:(id)sender { | 829 - (IBAction)removeAccount:(id)sender { |
816 DCHECK(!accountIdToRemove_.empty()); | 830 DCHECK(!accountIdToRemove_.empty()); |
817 ProfileOAuth2TokenServiceFactory::GetPlatformSpecificForProfile( | 831 ProfileOAuth2TokenServiceFactory::GetPlatformSpecificForProfile( |
818 browser_->profile())->RevokeCredentials(accountIdToRemove_); | 832 browser_->profile())->RevokeCredentials(accountIdToRemove_); |
| 833 [self postActionPerformed:ProfileMetrics::PROFILE_DESKTOP_MENU_REMOVE_ACCT]; |
819 accountIdToRemove_.clear(); | 834 accountIdToRemove_.clear(); |
820 | 835 |
821 [self initMenuContentsWithView:profiles::BUBBLE_VIEW_MODE_ACCOUNT_MANAGEMENT]; | 836 [self initMenuContentsWithView:profiles::BUBBLE_VIEW_MODE_ACCOUNT_MANAGEMENT]; |
822 } | 837 } |
823 | 838 |
824 - (IBAction)openTutorialLearnMoreURL:(id)sender { | 839 - (IBAction)openTutorialLearnMoreURL:(id)sender { |
825 ProfileMetrics::LogProfileUpgradeEnrollment( | 840 ProfileMetrics::LogProfileUpgradeEnrollment( |
826 ProfileMetrics::PROFILE_ENROLLMENT_LAUNCH_LEARN_MORE); | 841 ProfileMetrics::PROFILE_ENROLLMENT_LAUNCH_LEARN_MORE); |
827 // TODO(guohui): update |learnMoreUrl| once it is decided. | 842 // TODO(guohui): update |learnMoreUrl| once it is decided. |
828 const GURL learnMoreUrl("https://support.google.com/chrome/?hl=en#to"); | 843 const GURL learnMoreUrl("https://support.google.com/chrome/?hl=en#to"); |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
868 - (IBAction)endPreviewAndRelaunch:(id)sender { | 883 - (IBAction)endPreviewAndRelaunch:(id)sender { |
869 profiles::DisableNewProfileManagementPreview(); | 884 profiles::DisableNewProfileManagementPreview(); |
870 } | 885 } |
871 | 886 |
872 - (void)cleanUpEmbeddedViewContents { | 887 - (void)cleanUpEmbeddedViewContents { |
873 webContents_.reset(); | 888 webContents_.reset(); |
874 } | 889 } |
875 | 890 |
876 - (id)initWithBrowser:(Browser*)browser | 891 - (id)initWithBrowser:(Browser*)browser |
877 anchoredAt:(NSPoint)point | 892 anchoredAt:(NSPoint)point |
878 withMode:(profiles::BubbleViewMode)mode { | 893 withMode:(profiles::BubbleViewMode)mode |
| 894 withServiceType:(signin::GAIAServiceType)serviceType { |
879 base::scoped_nsobject<InfoBubbleWindow> window([[InfoBubbleWindow alloc] | 895 base::scoped_nsobject<InfoBubbleWindow> window([[InfoBubbleWindow alloc] |
880 initWithContentRect:ui::kWindowSizeDeterminedLater | 896 initWithContentRect:ui::kWindowSizeDeterminedLater |
881 styleMask:NSBorderlessWindowMask | 897 styleMask:NSBorderlessWindowMask |
882 backing:NSBackingStoreBuffered | 898 backing:NSBackingStoreBuffered |
883 defer:NO]); | 899 defer:NO]); |
884 | 900 |
885 if ((self = [super initWithWindow:window | 901 if ((self = [super initWithWindow:window |
886 parentWindow:browser->window()->GetNativeWindow() | 902 parentWindow:browser->window()->GetNativeWindow() |
887 anchoredAt:point])) { | 903 anchoredAt:point])) { |
888 browser_ = browser; | 904 browser_ = browser; |
889 viewMode_ = mode; | 905 viewMode_ = mode; |
890 tutorialMode_ = profiles::TUTORIAL_MODE_NONE; | 906 tutorialMode_ = profiles::TUTORIAL_MODE_NONE; |
891 observer_.reset(new ActiveProfileObserverBridge(self, browser_)); | 907 observer_.reset(new ActiveProfileObserverBridge(self, browser_)); |
| 908 serviceType_ = serviceType; |
892 | 909 |
893 avatarMenu_.reset(new AvatarMenu( | 910 avatarMenu_.reset(new AvatarMenu( |
894 &g_browser_process->profile_manager()->GetProfileInfoCache(), | 911 &g_browser_process->profile_manager()->GetProfileInfoCache(), |
895 observer_.get(), | 912 observer_.get(), |
896 browser_)); | 913 browser_)); |
897 avatarMenu_->RebuildMenu(); | 914 avatarMenu_->RebuildMenu(); |
898 | 915 |
899 // Guest profiles do not have a token service. | 916 // Guest profiles do not have a token service. |
900 isGuestSession_ = browser_->profile()->IsGuestSession(); | 917 isGuestSession_ = browser_->profile()->IsGuestSession(); |
901 | 918 |
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1024 if (!switches::IsNewProfileManagement() && | 1041 if (!switches::IsNewProfileManagement() && |
1025 tutorialMode_ != lastTutorialMode) { | 1042 tutorialMode_ != lastTutorialMode) { |
1026 ProfileMetrics::LogProfileUpgradeEnrollment( | 1043 ProfileMetrics::LogProfileUpgradeEnrollment( |
1027 ProfileMetrics::PROFILE_ENROLLMENT_SHOW_PREVIEW_PROMO); | 1044 ProfileMetrics::PROFILE_ENROLLMENT_SHOW_PREVIEW_PROMO); |
1028 } | 1045 } |
1029 } else { | 1046 } else { |
1030 tutorialMode_ = profiles::TUTORIAL_MODE_NONE; | 1047 tutorialMode_ = profiles::TUTORIAL_MODE_NONE; |
1031 } | 1048 } |
1032 | 1049 |
1033 [container setFrameSize:NSMakeSize(kFixedMenuWidth, yOffset)]; | 1050 [container setFrameSize:NSMakeSize(kFixedMenuWidth, yOffset)]; |
1034 return container.autorelease();; | 1051 return container.autorelease(); |
1035 } | 1052 } |
1036 | 1053 |
1037 - (NSView*)buildPreviewTutorialIfNeeded:(const AvatarMenu::Item&)item { | 1054 - (NSView*)buildPreviewTutorialIfNeeded:(const AvatarMenu::Item&)item { |
1038 if (!switches::IsNewProfileManagement()) { | 1055 if (!switches::IsNewProfileManagement()) { |
1039 return [self tutorialViewWithMode:profiles::TUTORIAL_MODE_ENABLE_PREVIEW | 1056 return [self tutorialViewWithMode:profiles::TUTORIAL_MODE_ENABLE_PREVIEW |
1040 titleMessage:IDS_PROFILES_PREVIEW_TUTORIAL_TITLE | 1057 titleMessage:IDS_PROFILES_PREVIEW_TUTORIAL_TITLE |
1041 contentMessage:IDS_PROFILES_PREVIEW_TUTORIAL_CONTENT_TEXT | 1058 contentMessage:IDS_PROFILES_PREVIEW_TUTORIAL_CONTENT_TEXT |
1042 linkMessage:IDS_PROFILES_PROFILE_TUTORIAL_LEARN_MORE | 1059 linkMessage:IDS_PROFILES_PROFILE_TUTORIAL_LEARN_MORE |
1043 buttonMessage:IDS_PROFILES_TUTORIAL_TRY_BUTTON | 1060 buttonMessage:IDS_PROFILES_TUTORIAL_TRY_BUTTON |
1044 linkAction:@selector(openTutorialLearnMoreURL:) | 1061 linkAction:@selector(openTutorialLearnMoreURL:) |
(...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1208 // Profile name, centered. | 1225 // Profile name, centered. |
1209 bool editingAllowed = !isGuestSession_ && !browser_->profile()->IsManaged(); | 1226 bool editingAllowed = !isGuestSession_ && !browser_->profile()->IsManaged(); |
1210 base::scoped_nsobject<EditableProfileNameButton> profileName( | 1227 base::scoped_nsobject<EditableProfileNameButton> profileName( |
1211 [[EditableProfileNameButton alloc] | 1228 [[EditableProfileNameButton alloc] |
1212 initWithFrame:NSMakeRect(xOffset, yOffset, | 1229 initWithFrame:NSMakeRect(xOffset, yOffset, |
1213 availableTextWidth, | 1230 availableTextWidth, |
1214 kProfileButtonHeight) | 1231 kProfileButtonHeight) |
1215 profile:browser_->profile() | 1232 profile:browser_->profile() |
1216 profileName:base::SysUTF16ToNSString( | 1233 profileName:base::SysUTF16ToNSString( |
1217 profiles::GetAvatarNameForProfile(browser_->profile())) | 1234 profiles::GetAvatarNameForProfile(browser_->profile())) |
1218 editingAllowed:editingAllowed]); | 1235 editingAllowed:editingAllowed |
| 1236 withController:self]); |
1219 | 1237 |
1220 [container addSubview:profileName]; | 1238 [container addSubview:profileName]; |
1221 yOffset = NSMaxY([profileName frame]); | 1239 yOffset = NSMaxY([profileName frame]); |
1222 | 1240 |
1223 // Profile icon, centered. | 1241 // Profile icon, centered. |
1224 xOffset = (kFixedMenuWidth - kLargeImageSide) / 2; | 1242 xOffset = (kFixedMenuWidth - kLargeImageSide) / 2; |
1225 base::scoped_nsobject<EditableProfilePhoto> iconView( | 1243 base::scoped_nsobject<EditableProfilePhoto> iconView( |
1226 [[EditableProfilePhoto alloc] | 1244 [[EditableProfilePhoto alloc] |
1227 initWithFrame:NSMakeRect(xOffset, yOffset, | 1245 initWithFrame:NSMakeRect(xOffset, yOffset, |
1228 kLargeImageSide, kLargeImageSide) | 1246 kLargeImageSide, kLargeImageSide) |
1229 avatarMenu:avatarMenu_.get() | 1247 avatarMenu:avatarMenu_.get() |
1230 profileIcon:item.icon | 1248 profileIcon:item.icon |
1231 editingAllowed:!isGuestSession_]); | 1249 editingAllowed:!isGuestSession_ |
| 1250 withController:self]); |
1232 | 1251 |
1233 [container addSubview:iconView]; | 1252 [container addSubview:iconView]; |
1234 yOffset = NSMaxY([iconView frame]); | 1253 yOffset = NSMaxY([iconView frame]); |
1235 | 1254 |
1236 if (switches::IsNewProfileManagementPreviewEnabled()) { | 1255 if (switches::IsNewProfileManagementPreviewEnabled()) { |
1237 base::scoped_nsobject<HoverImageButton> questionButton( | 1256 base::scoped_nsobject<HoverImageButton> questionButton( |
1238 [[HoverImageButton alloc] initWithFrame:NSZeroRect]); | 1257 [[HoverImageButton alloc] initWithFrame:NSZeroRect]); |
1239 [questionButton setBordered:NO]; | 1258 [questionButton setBordered:NO]; |
1240 ui::ResourceBundle* rb = &ui::ResourceBundle::GetSharedInstance(); | 1259 ui::ResourceBundle* rb = &ui::ResourceBundle::GetSharedInstance(); |
1241 [questionButton setDefaultImage:rb->GetNativeImageNamed( | 1260 [questionButton setDefaultImage:rb->GetNativeImageNamed( |
(...skipping 470 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1712 [deleteButton setPressedImage:rb->GetNativeImageNamed( | 1731 [deleteButton setPressedImage:rb->GetNativeImageNamed( |
1713 IDR_CLOSE_1_P).ToNSImage()]; | 1732 IDR_CLOSE_1_P).ToNSImage()]; |
1714 [deleteButton setTarget:self]; | 1733 [deleteButton setTarget:self]; |
1715 [deleteButton setAction:@selector(showAccountRemovalView:)]; | 1734 [deleteButton setAction:@selector(showAccountRemovalView:)]; |
1716 [deleteButton setTag:tag]; | 1735 [deleteButton setTag:tag]; |
1717 | 1736 |
1718 [button addSubview:deleteButton]; | 1737 [button addSubview:deleteButton]; |
1719 return button.autorelease(); | 1738 return button.autorelease(); |
1720 } | 1739 } |
1721 | 1740 |
| 1741 - (void)postActionPerformed:(ProfileMetrics::ProfileDesktopMenu)action { |
| 1742 ProfileMetrics::LogProfileDesktopMenu(action, serviceType_); |
| 1743 serviceType_ = signin::GAIA_SERVICE_TYPE_NONE; |
| 1744 } |
| 1745 |
1722 @end | 1746 @end |
OLD | NEW |