profile_chooser_view.cc revision 116680a4aac90f2aa7413d9095a592090648e557
1c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Copyright 2014 The Chromium Authors. All rights reserved. 27d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 37d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// found in the LICENSE file. 47d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 5c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "chrome/browser/ui/views/profiles/profile_chooser_view.h" 67d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 7a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/prefs/pref_service.h" 81e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 97d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "chrome/browser/browser_process.h" 10effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "chrome/browser/lifetime/application_lifetime.h" 11c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "chrome/browser/profiles/profile_avatar_icon_util.h" 120529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "chrome/browser/profiles/profile_info_cache.h" 137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "chrome/browser/profiles/profile_manager.h" 14010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "chrome/browser/profiles/profile_metrics.h" 15d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "chrome/browser/profiles/profile_window.h" 16f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/profiles/profiles_state.h" 171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "chrome/browser/signin/profile_oauth2_token_service_factory.h" 18cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/signin/signin_header_helper.h" 19a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "chrome/browser/signin/signin_manager_factory.h" 20d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "chrome/browser/signin/signin_promo.h" 2168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "chrome/browser/ui/browser.h" 225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "chrome/browser/ui/browser_commands.h" 230f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "chrome/browser/ui/browser_dialogs.h" 24c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "chrome/browser/ui/chrome_pages.h" 25d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "chrome/browser/ui/singleton_tabs.h" 26c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "chrome/browser/ui/views/profiles/user_manager_view.h" 27a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/common/pref_names.h" 284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chrome/common/url_constants.h" 29effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "components/signin/core/browser/mutable_profile_oauth2_token_service.h" 30effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "components/signin/core/browser/profile_oauth2_token_service.h" 31cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/signin/core/browser/signin_error_controller.h" 32e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "components/signin/core/browser/signin_manager.h" 330529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "components/signin/core/common/profile_management_switches.h" 34d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "grit/chromium_strings.h" 357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "grit/generated_resources.h" 363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "grit/theme_resources.h" 3768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "third_party/skia/include/core/SkColor.h" 387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h" 397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "ui/base/resource/resource_bundle.h" 405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/gfx/canvas.h" 417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "ui/gfx/image/image.h" 427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "ui/gfx/image/image_skia.h" 43cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/gfx/path.h" 44cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/gfx/skia_util.h" 45f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "ui/gfx/text_elider.h" 465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/native_theme/native_theme.h" 47d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/views/controls/button/blue_button.h" 48effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "ui/views/controls/button/image_button.h" 495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/views/controls/button/label_button.h" 50d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/views/controls/button/menu_button.h" 517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "ui/views/controls/label.h" 527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "ui/views/controls/link.h" 537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "ui/views/controls/separator.h" 54c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "ui/views/controls/styled_label.h" 55f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "ui/views/controls/textfield/textfield.h" 564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "ui/views/controls/webview/webview.h" 577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "ui/views/layout/grid_layout.h" 587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "ui/views/layout/layout_constants.h" 597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "ui/views/widget/widget.h" 607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 61d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)namespace { 62d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 6368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// Helpers -------------------------------------------------------------------- 6468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const int kFixedMenuWidth = 250; 6668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const int kButtonHeight = 29; 670de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)const int kProfileAvatarTutorialShowMax = 1; 68effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochconst int kFixedGaiaViewHeight = 400; 69effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochconst int kFixedGaiaViewWidth = 360; 70effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochconst int kFixedAccountRemovalViewWidth = 280; 715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuconst int kFixedEndPreviewViewWidth = 280; 725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuconst int kLargeImageSide = 88; 73d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 74d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// Creates a GridLayout with a single column. This ensures that all the child 75d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// views added get auto-expanded to fill the full width of the bubble. 765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)views::GridLayout* CreateSingleColumnLayout(views::View* view, int width) { 77d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) views::GridLayout* layout = new views::GridLayout(view); 78d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) view->SetLayoutManager(layout); 79d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 80d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) views::ColumnSet* columns = layout->AddColumnSet(0); 815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) columns->AddColumn(views::GridLayout::FILL, views::GridLayout::FILL, 0, 825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) views::GridLayout::FIXED, width, width); 83d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return layout; 84d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} 85d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 86f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)views::Link* CreateLink(const base::string16& link_text, 87d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) views::LinkListener* listener) { 88d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) views::Link* link_button = new views::Link(link_text); 89d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) link_button->SetHorizontalAlignment(gfx::ALIGN_LEFT); 90d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) link_button->SetUnderline(false); 91d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) link_button->set_listener(listener); 92d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return link_button; 93d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} 94d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 955c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liugfx::ImageSkia CreateSquarePlaceholderImage(int size) { 965c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu SkBitmap bitmap; 97116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bitmap.allocPixels(SkImageInfo::MakeA8(size, size)); 985c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu bitmap.eraseARGB(0, 0, 0, 0); 995c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return gfx::ImageSkia::CreateFrom1xBitmap(bitmap); 1005c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 10168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 102cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool HasAuthError(Profile* profile) { 103cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const SigninErrorController* error = 104cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) profiles::GetSigninErrorController(profile); 105cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return error && error->HasError(); 106cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 107cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 108cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)std::string GetAuthErrorAccountId(Profile* profile) { 109cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const SigninErrorController* error = 110cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) profiles::GetSigninErrorController(profile); 111cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!error) 112cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return std::string(); 113cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 114cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return error->error_account_id(); 115cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 116cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 117cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)std::string GetAuthErrorUsername(Profile* profile) { 118cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const SigninErrorController* error = 119cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) profiles::GetSigninErrorController(profile); 120cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!error) 121cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return std::string(); 122cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 123cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return error->error_username(); 124cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 125cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 126f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// BackgroundColorHoverButton ------------------------------------------------- 12768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 128f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// A custom button that allows for setting a background color when hovered over. 1295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class BackgroundColorHoverButton : public views::LabelButton { 13068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) public: 131f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) BackgroundColorHoverButton(views::ButtonListener* listener, 132f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const base::string16& text, 133f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const gfx::ImageSkia& normal_icon, 134f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const gfx::ImageSkia& hover_icon); 135f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual ~BackgroundColorHoverButton(); 13668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 13768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) private: 1385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // views::LabelButton: 1395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE; 14068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 141f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(BackgroundColorHoverButton); 14268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}; 14368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 144f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)BackgroundColorHoverButton::BackgroundColorHoverButton( 145f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) views::ButtonListener* listener, 146a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& text, 147f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const gfx::ImageSkia& normal_icon, 148f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const gfx::ImageSkia& hover_icon) 1495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : views::LabelButton(listener, text) { 1505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetBorder(views::Border::CreateEmptyBorder(0, views::kButtonHEdgeMarginNew, 1515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 0, views::kButtonHEdgeMarginNew)); 1525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) set_min_size(gfx::Size(0, kButtonHeight)); 1535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetImage(STATE_NORMAL, normal_icon); 1545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetImage(STATE_HOVERED, hover_icon); 1555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetImage(STATE_PRESSED, hover_icon); 156f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 15768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 1585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)BackgroundColorHoverButton::~BackgroundColorHoverButton() {} 159f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void BackgroundColorHoverButton::OnPaint(gfx::Canvas* canvas) { 1615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if ((state() == STATE_PRESSED) || (state() == STATE_HOVERED) || HasFocus()) { 1625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) canvas->DrawColor(GetNativeTheme()->GetSystemColor( 1635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ui::NativeTheme::kColorId_ButtonHoverBackgroundColor)); 1645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) LabelButton::OnPaint(canvas); 166f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 167f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 168f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// SizedContainer ------------------------------------------------- 169f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 170f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// A simple container view that takes an explicit preferred size. 171f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class SizedContainer : public views::View { 172f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) public: 173f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) explicit SizedContainer(const gfx::Size& preferred_size) 174f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) : preferred_size_(preferred_size) {} 175f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 176f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) virtual gfx::Size GetPreferredSize() const OVERRIDE { 177f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return preferred_size_; 178f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 179f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 180f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) private: 181f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) gfx::Size preferred_size_; 182f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}; 183f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 184f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} // namespace 185f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 186f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 187f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// EditableProfilePhoto ------------------------------------------------- 188f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 189f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// A custom Image control that shows a "change" button when moused over. 190f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class EditableProfilePhoto : public views::ImageView { 19168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) public: 192a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EditableProfilePhoto(views::ButtonListener* listener, 193a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const gfx::Image& icon, 1945c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu bool is_editing_allowed, 1955c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const gfx::Rect& bounds) 196a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) : views::ImageView(), 197a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) change_photo_button_(NULL) { 1980529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch gfx::Image image = profiles::GetSizedAvatarIcon( 199010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) icon, true, kLargeImageSide, kLargeImageSide); 200f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SetImage(image.ToImageSkia()); 2015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu SetBoundsRect(bounds); 202a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 203cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Calculate the circular mask that will be used to display the photo. 204f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) circular_mask_.addCircle(SkIntToScalar(bounds.width() / 2), 205f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) SkIntToScalar(bounds.height() / 2), 206cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SkIntToScalar(bounds.width() / 2)); 207010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 208a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!is_editing_allowed) 209a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return; 210a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 211f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) set_notify_enter_exit_on_child(true); 212f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 213f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Button overlay that appears when hovering over the image. 214010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) change_photo_button_ = new views::LabelButton(listener, base::string16()); 2155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) change_photo_button_->SetHorizontalAlignment(gfx::ALIGN_CENTER); 2165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) change_photo_button_->SetBorder(views::Border::NullBorder()); 217f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 218010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const SkColor kBackgroundColor = SkColorSetARGB(65, 255, 255, 255); 219f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) change_photo_button_->set_background( 220f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) views::Background::CreateSolidBackground(kBackgroundColor)); 221010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) change_photo_button_->SetImage(views::LabelButton::STATE_NORMAL, 222cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) *ui::ResourceBundle::GetSharedInstance().GetImageSkiaNamed( 223cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) IDR_ICON_PROFILES_EDIT_CAMERA)); 224010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 225f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) change_photo_button_->SetSize(bounds.size()); 226f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) change_photo_button_->SetVisible(false); 227f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) AddChildView(change_photo_button_); 228f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 229f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 230cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE { 231cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Display the profile picture as a circle. 232cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) canvas->ClipPath(circular_mask_, true); 233cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) views::ImageView::OnPaint(canvas); 234cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 235cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 236cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual void PaintChildren(gfx::Canvas* canvas, 237f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const views::CullSet& cull_set) OVERRIDE { 238cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Display any children (the "change photo" overlay) as a circle. 239cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) canvas->ClipPath(circular_mask_, true); 240cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) View::PaintChildren(canvas, cull_set); 241cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 242cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) views::LabelButton* change_photo_button() { return change_photo_button_; } 24468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 24568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) private: 246f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // views::View: 24768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) virtual void OnMouseEntered(const ui::MouseEvent& event) OVERRIDE { 248a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (change_photo_button_) 249a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) change_photo_button_->SetVisible(true); 250f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 25168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 25268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) virtual void OnMouseExited(const ui::MouseEvent& event) OVERRIDE { 253a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (change_photo_button_) 254a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) change_photo_button_->SetVisible(false); 255f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 25668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 257cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) gfx::Path circular_mask_; 258cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 259a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Button that is shown when hovering over the image view. Can be NULL if 260a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // the photo isn't allowed to be edited (e.g. for guest profiles). 2615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) views::LabelButton* change_photo_button_; 262f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 263f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(EditableProfilePhoto); 26468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}; 26568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 266f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 267f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// EditableProfileName ------------------------------------------------- 268f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 269f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// A custom text control that turns into a textfield for editing when clicked. 2705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class EditableProfileName : public views::LabelButton, 271f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) public views::ButtonListener { 272f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) public: 273f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EditableProfileName(views::TextfieldController* controller, 274a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& text, 275a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool is_editing_allowed) 2765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : views::LabelButton(this, text), 277a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) profile_name_textfield_(NULL) { 278f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ui::ResourceBundle* rb = &ui::ResourceBundle::GetSharedInstance(); 2795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const gfx::FontList& medium_font_list = 2805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) rb->GetFontList(ui::ResourceBundle::MediumFont); 2815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetFontList(medium_font_list); 2825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu SetHorizontalAlignment(gfx::ALIGN_CENTER); 283a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 284cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!is_editing_allowed) { 285cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SetBorder(views::Border::CreateEmptyBorder(2, 0, 2, 0)); 286a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return; 287cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 288f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 2895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Show an "edit" pencil icon when hovering over. In the default state, 2905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // we need to create an empty placeholder of the correct size, so that 2915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // the text doesn't jump around when the hovered icon appears. 2925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu gfx::ImageSkia hover_image = 2935c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu *rb->GetImageSkiaNamed(IDR_ICON_PROFILES_EDIT_HOVER); 2945c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu SetImage(STATE_NORMAL, CreateSquarePlaceholderImage(hover_image.width())); 2955c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu SetImage(STATE_HOVERED, hover_image); 2965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetImage(STATE_PRESSED, 2975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) *rb->GetImageSkiaNamed(IDR_ICON_PROFILES_EDIT_PRESSED)); 2985c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // To center the text, we need to offest it by the width of the icon we 2995c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // are adding. We need to also add a small top/bottom padding to account 3005c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // for the textfield's border. 3015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu SetBorder(views::Border::CreateEmptyBorder(2, hover_image.width(), 2, 0)); 302f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 303f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Textfield that overlaps the button. 304f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) profile_name_textfield_ = new views::Textfield(); 3055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) profile_name_textfield_->set_controller(controller); 3065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) profile_name_textfield_->SetFontList(medium_font_list); 3075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu profile_name_textfield_->SetHorizontalAlignment(gfx::ALIGN_CENTER); 3085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 309f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) profile_name_textfield_->SetVisible(false); 310f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) AddChildView(profile_name_textfield_); 311f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 312f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 313f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) views::Textfield* profile_name_textfield() { 314f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return profile_name_textfield_; 315f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 316f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 3175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Hide the editable textfield to show the profile name button instead. 318f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void ShowReadOnlyView() { 319a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (profile_name_textfield_) 320a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) profile_name_textfield_->SetVisible(false); 321f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 322f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 323f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) private: 324f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // views::ButtonListener: 325f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void ButtonPressed(views::Button* sender, 326f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const ui::Event& event) OVERRIDE { 327a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (profile_name_textfield_) { 328a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) profile_name_textfield_->SetVisible(true); 3295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) profile_name_textfield_->SetText(GetText()); 330a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) profile_name_textfield_->SelectAll(false); 331a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) profile_name_textfield_->RequestFocus(); 332a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 333f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 334f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 3355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // views::LabelButton: 336f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual bool OnKeyReleased(const ui::KeyEvent& event) OVERRIDE { 337f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Override CustomButton's implementation, which presses the button when 338f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // you press space and clicks it when you release space, as the space can be 339f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // part of the new profile name typed in the textfield. 340f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return false; 341f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 342f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 343f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void Layout() OVERRIDE { 344a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (profile_name_textfield_) 345a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) profile_name_textfield_->SetBounds(0, 0, width(), height()); 3465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // This layout trick keeps the text left-aligned and the icon right-aligned. 3475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetHorizontalAlignment(gfx::ALIGN_RIGHT); 3485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) views::LabelButton::Layout(); 3495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu label()->SetHorizontalAlignment(gfx::ALIGN_CENTER); 350f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 351f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 3525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Textfield that is shown when editing the profile name. Can be NULL if 353a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // the profile name isn't allowed to be edited (e.g. for guest profiles). 354f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) views::Textfield* profile_name_textfield_; 355f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 356f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(EditableProfileName); 357f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}; 358d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 359effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// A title card with one back button right aligned and one label center aligned. 360effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochclass TitleCard : public views::View { 361effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch public: 362010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) TitleCard(int message_id, views::ButtonListener* listener, 363effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch views::ImageButton** back_button) { 364effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch back_button_ = new views::ImageButton(listener); 365effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch back_button_->SetImageAlignment(views::ImageButton::ALIGN_LEFT, 366effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch views::ImageButton::ALIGN_MIDDLE); 367effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch ui::ResourceBundle* rb = &ui::ResourceBundle::GetSharedInstance(); 368effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch back_button_->SetImage(views::ImageButton::STATE_NORMAL, 369effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch rb->GetImageSkiaNamed(IDR_BACK)); 370effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch back_button_->SetImage(views::ImageButton::STATE_HOVERED, 371effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch rb->GetImageSkiaNamed(IDR_BACK_H)); 372effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch back_button_->SetImage(views::ImageButton::STATE_PRESSED, 373effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch rb->GetImageSkiaNamed(IDR_BACK_P)); 374effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch back_button_->SetImage(views::ImageButton::STATE_DISABLED, 375effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch rb->GetImageSkiaNamed(IDR_BACK_D)); 376effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch *back_button = back_button_; 377effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 378effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch title_label_ = new views::Label(l10n_util::GetStringUTF16(message_id)); 379effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch title_label_->SetHorizontalAlignment(gfx::ALIGN_CENTER); 380effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const gfx::FontList& medium_font_list = 381effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch rb->GetFontList(ui::ResourceBundle::MediumFont); 382effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch title_label_->SetFontList(medium_font_list); 383effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 384effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch AddChildView(back_button_); 385effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch AddChildView(title_label_); 386effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 387effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 388010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Creates a new view that has the |title_card| with padding at the top, an 389010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // edge-to-edge separator below, and the specified |view| at the bottom. 390010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) static views::View* AddPaddedTitleCard(views::View* view, 391010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) TitleCard* title_card, 392010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) int width) { 393010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) views::View* titled_view = new views::View(); 394010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) views::GridLayout* layout = new views::GridLayout(titled_view); 395010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) titled_view->SetLayoutManager(layout); 396010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 397010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Column set 0 is a single column layout with horizontal padding at left 398010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // and right, and column set 1 is a single column layout with no padding. 399010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) views::ColumnSet* columns = layout->AddColumnSet(0); 400010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) columns->AddPaddingColumn(1, views::kButtonHEdgeMarginNew); 401010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) int available_width = width - 2 * views::kButtonHEdgeMarginNew; 402010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) columns->AddColumn(views::GridLayout::FILL, views::GridLayout::FILL, 0, 403010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) views::GridLayout::FIXED, available_width, available_width); 404010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) columns->AddPaddingColumn(1, views::kButtonHEdgeMarginNew); 405010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) layout->AddColumnSet(1)->AddColumn(views::GridLayout::FILL, 406010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) views::GridLayout::FILL, 0,views::GridLayout::FIXED, width, width); 407010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 408010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) layout->StartRowWithPadding(1, 0, 0, views::kButtonVEdgeMarginNew); 409010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) layout->AddView(title_card); 410010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) layout->StartRowWithPadding(1, 1, 0, views::kRelatedControlVerticalSpacing); 411010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) layout->AddView(new views::Separator(views::Separator::HORIZONTAL)); 412010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 413010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) layout->StartRow(1, 1); 414010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) layout->AddView(view); 415010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 416010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return titled_view; 417010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 418010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 419effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch private: 420effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch virtual void Layout() OVERRIDE{ 421c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch back_button_->SetBounds( 422c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 0, 0, back_button_->GetPreferredSize().width(), height()); 423effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch title_label_->SetBoundsRect(GetContentsBounds()); 424effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 425effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 426cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual gfx::Size GetPreferredSize() const OVERRIDE{ 427010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) int height = std::max(title_label_->GetPreferredSize().height(), 428010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) back_button_->GetPreferredSize().height()); 429effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return gfx::Size(width(), height); 430effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 431effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 432effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch views::ImageButton* back_button_; 433effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch views::Label* title_label_; 434effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 435effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch DISALLOW_COPY_AND_ASSIGN(TitleCard); 436effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}; 437d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 438d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// ProfileChooserView --------------------------------------------------------- 439d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 4407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// static 4417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)ProfileChooserView* ProfileChooserView::profile_bubble_ = NULL; 442f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)bool ProfileChooserView::close_on_deactivate_for_testing_ = true; 4437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 4447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// static 4457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void ProfileChooserView::ShowBubble( 446cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) profiles::BubbleViewMode view_mode, 4476d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) const signin::ManageAccountsParams& manage_accounts_params, 4487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) views::View* anchor_view, 4497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) views::BubbleBorder::Arrow arrow, 4507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) views::BubbleBorder::BubbleAlignment border_alignment, 4517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) Browser* browser) { 452cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (IsShowing()) 453cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return; 454cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 455f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) profile_bubble_ = new ProfileChooserView(anchor_view, arrow, browser, 4566d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) view_mode, manage_accounts_params.service_type); 4577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) views::BubbleDelegateView::CreateBubble(profile_bubble_); 458f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) profile_bubble_->set_close_on_deactivate(close_on_deactivate_for_testing_); 4597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) profile_bubble_->SetAlignment(border_alignment); 4607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) profile_bubble_->GetWidget()->Show(); 4618bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) profile_bubble_->SetArrowPaintType(views::BubbleBorder::PAINT_NONE); 4627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 4637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 4647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// static 4657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)bool ProfileChooserView::IsShowing() { 4667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return profile_bubble_ != NULL; 4677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 4687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 4697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// static 4707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void ProfileChooserView::Hide() { 4717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (IsShowing()) 4727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) profile_bubble_->GetWidget()->Close(); 4737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 4747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 475d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)ProfileChooserView::ProfileChooserView(views::View* anchor_view, 476d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) views::BubbleBorder::Arrow arrow, 477a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch Browser* browser, 478cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) profiles::BubbleViewMode view_mode, 479cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) signin::GAIAServiceType service_type) 4807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) : BubbleDelegateView(anchor_view, arrow), 481f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) browser_(browser), 482a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch view_mode_(view_mode), 483cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) tutorial_mode_(profiles::TUTORIAL_MODE_NONE), 484cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) gaia_service_type_(service_type) { 485d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // Reset the default margins inherited from the BubbleDelegateView. 486d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) set_margins(gfx::Insets()); 487116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch set_background(views::Background::CreateSolidBackground( 488116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch GetNativeTheme()->GetSystemColor( 489116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ui::NativeTheme::kColorId_DialogBackground))); 490f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ResetView(); 49168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 49268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) avatar_menu_.reset(new AvatarMenu( 4937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) &g_browser_process->profile_manager()->GetProfileInfoCache(), 49468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) this, 49568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) browser_)); 49668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) avatar_menu_->RebuildMenu(); 497f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 498f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ProfileOAuth2TokenService* oauth2_token_service = 499f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ProfileOAuth2TokenServiceFactory::GetForProfile(browser_->profile()); 500f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (oauth2_token_service) 501f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) oauth2_token_service->AddObserver(this); 5027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 5037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 5047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)ProfileChooserView::~ProfileChooserView() { 505f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ProfileOAuth2TokenService* oauth2_token_service = 506f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ProfileOAuth2TokenServiceFactory::GetForProfile(browser_->profile()); 507f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (oauth2_token_service) 508f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) oauth2_token_service->RemoveObserver(this); 5097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 5107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 511f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void ProfileChooserView::ResetView() { 5125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu question_mark_button_ = NULL; 513d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) manage_accounts_link_ = NULL; 514d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) signin_current_profile_link_ = NULL; 515d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) users_button_ = NULL; 516effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch lock_button_ = NULL; 5175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu add_account_link_ = NULL; 518f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) current_profile_photo_ = NULL; 519f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) current_profile_name_ = NULL; 520a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) tutorial_ok_button_ = NULL; 521a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) tutorial_learn_more_link_ = NULL; 522a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch tutorial_enable_new_profile_management_button_ = NULL; 5235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu tutorial_end_preview_link_ = NULL; 5245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu tutorial_send_feedback_button_ = NULL; 5255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu end_preview_and_relaunch_button_ = NULL; 5265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu end_preview_cancel_button_ = NULL; 527010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) remove_account_button_ = NULL; 528effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch account_removal_cancel_button_ = NULL; 529effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch gaia_signin_cancel_button_ = NULL; 530d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) open_other_profile_indexes_map_.clear(); 531cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) delete_account_button_map_.clear(); 532cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) reauth_account_button_map_.clear(); 533cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) tutorial_mode_ = profiles::TUTORIAL_MODE_NONE; 5347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 5357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 536d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)void ProfileChooserView::Init() { 537cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // If view mode is PROFILE_CHOOSER but there is an auth error, force 538cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // ACCOUNT_MANAGEMENT mode. 539cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (view_mode_ == profiles::BUBBLE_VIEW_MODE_PROFILE_CHOOSER && 540cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) HasAuthError(browser_->profile())) { 541cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) view_mode_ = profiles::BUBBLE_VIEW_MODE_ACCOUNT_MANAGEMENT; 542cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 543cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 544a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch ShowView(view_mode_, avatar_menu_.get()); 5457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 5467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 54768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void ProfileChooserView::OnAvatarMenuChanged( 54868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) AvatarMenu* avatar_menu) { 54968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // Refresh the view with the new menu. We can't just update the local copy 550d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // as this may have been triggered by a sign out action, in which case 551d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // the view is being destroyed. 552cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ShowView(profiles::BUBBLE_VIEW_MODE_PROFILE_CHOOSER, avatar_menu); 5537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 5547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 555f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void ProfileChooserView::OnRefreshTokenAvailable( 556f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const std::string& account_id) { 557f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Refresh the account management view when a new account is added to the 558f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // profile. 559cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (view_mode_ == profiles::BUBBLE_VIEW_MODE_ACCOUNT_MANAGEMENT || 560cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) view_mode_ == profiles::BUBBLE_VIEW_MODE_GAIA_SIGNIN || 561cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) view_mode_ == profiles::BUBBLE_VIEW_MODE_GAIA_ADD_ACCOUNT || 562cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) view_mode_ == profiles::BUBBLE_VIEW_MODE_GAIA_REAUTH) { 563cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ShowView(profiles::BUBBLE_VIEW_MODE_ACCOUNT_MANAGEMENT, avatar_menu_.get()); 564f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 565f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 566f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 567f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void ProfileChooserView::OnRefreshTokenRevoked(const std::string& account_id) { 568f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Refresh the account management view when an account is removed from the 569f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // profile. 570cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (view_mode_ == profiles::BUBBLE_VIEW_MODE_ACCOUNT_MANAGEMENT) 571cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ShowView(profiles::BUBBLE_VIEW_MODE_ACCOUNT_MANAGEMENT, avatar_menu_.get()); 572f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 573f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 574cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void ProfileChooserView::ShowView(profiles::BubbleViewMode view_to_display, 57568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) AvatarMenu* avatar_menu) { 576d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // The account management view should only be displayed if the active profile 577d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // is signed in. 578cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (view_to_display == profiles::BUBBLE_VIEW_MODE_ACCOUNT_MANAGEMENT) { 57968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) const AvatarMenu::Item& active_item = avatar_menu->GetItemAt( 58068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) avatar_menu->GetActiveProfileIndex()); 581d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) DCHECK(active_item.signed_in); 5827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 5837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 584116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (browser_->profile()->IsSupervised() && 585116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch (view_to_display == profiles::BUBBLE_VIEW_MODE_GAIA_ADD_ACCOUNT || 586116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch view_to_display == profiles::BUBBLE_VIEW_MODE_ACCOUNT_REMOVAL)) { 587116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch LOG(WARNING) << "Supervised user attempted to add/remove account"; 588116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return; 589116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 590116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 5915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Records the last tutorial mode. 592cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) profiles::TutorialMode last_tutorial_mode = tutorial_mode_; 593f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ResetView(); 5947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) RemoveAllChildViews(true); 595f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) view_mode_ = view_to_display; 5967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 597a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch views::GridLayout* layout; 598a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch views::View* sub_view; 599a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch switch (view_mode_) { 600cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case profiles::BUBBLE_VIEW_MODE_GAIA_SIGNIN: 601cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case profiles::BUBBLE_VIEW_MODE_GAIA_ADD_ACCOUNT: 602cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case profiles::BUBBLE_VIEW_MODE_GAIA_REAUTH: 603a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch layout = CreateSingleColumnLayout(this, kFixedGaiaViewWidth); 604cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) sub_view = CreateGaiaSigninView(); 605a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch break; 606cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case profiles::BUBBLE_VIEW_MODE_ACCOUNT_REMOVAL: 607a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch layout = CreateSingleColumnLayout(this, kFixedAccountRemovalViewWidth); 608a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch sub_view = CreateAccountRemovalView(); 609a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch break; 610cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case profiles::BUBBLE_VIEW_MODE_END_PREVIEW: 6115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu layout = CreateSingleColumnLayout(this, kFixedEndPreviewViewWidth); 6125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu sub_view = CreateEndPreviewView(); 6135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu break; 614a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch default: 615a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch layout = CreateSingleColumnLayout(this, kFixedMenuWidth); 6165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu sub_view = CreateProfileChooserView(avatar_menu, last_tutorial_mode); 617effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 6187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) layout->StartRow(1, 0); 619a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch layout->AddView(sub_view); 6207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) Layout(); 6218bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (GetBubbleFrameView()) 6228bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) SizeToContents(); 6237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 6247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 625d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)void ProfileChooserView::WindowClosing() { 626d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) DCHECK_EQ(profile_bubble_, this); 627d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) profile_bubble_ = NULL; 628d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} 6297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 630d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)void ProfileChooserView::ButtonPressed(views::Button* sender, 631d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const ui::Event& event) { 632d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // Disable button after clicking so that it doesn't get clicked twice and 633d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // start a second action... which can crash Chrome. But don't disable if it 634d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // has no parent (like in tests) because that will also crash. 635d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (sender->parent()) 636d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) sender->SetEnabled(false); 6377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 638effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (sender == users_button_) { 639c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch profiles::ShowUserManagerMaybeWithTutorial(browser_->profile()); 6405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // If this is a guest session, also close all the guest browser windows. 6415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (browser_->profile()->IsGuestSession()) 6425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu profiles::CloseGuestProfileWindows(); 643effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } else if (sender == lock_button_) { 644effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch profiles::LockProfile(browser_->profile()); 645cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PostActionPerformed(ProfileMetrics::PROFILE_DESKTOP_MENU_LOCK); 646a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } else if (sender == tutorial_ok_button_) { 64723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) // If the user manually dismissed the tutorial, never show it again by 64823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) // setting the number of times shown to the maximum plus 1, so that later we 64923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) // could distinguish between the dismiss case and the case when the tutorial 65023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) // is indeed shown for the maximum number of times. 651a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) browser_->profile()->GetPrefs()->SetInteger( 65223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) prefs::kProfileAvatarTutorialShown, kProfileAvatarTutorialShowMax + 1); 653010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 654010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ProfileMetrics::LogProfileUpgradeEnrollment( 655010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ProfileMetrics::PROFILE_ENROLLMENT_CLOSE_WELCOME_CARD); 656cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ShowView(profiles::BUBBLE_VIEW_MODE_PROFILE_CHOOSER, avatar_menu_.get()); 657a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch } else if (sender == tutorial_enable_new_profile_management_button_) { 658010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ProfileMetrics::LogProfileUpgradeEnrollment( 659010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ProfileMetrics::PROFILE_ENROLLMENT_ACCEPT_NEW_PROFILE_MGMT); 660f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) profiles::EnableNewProfileManagementPreview(browser_->profile()); 661010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } else if (sender == remove_account_button_) { 662effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch RemoveAccount(); 663effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } else if (sender == account_removal_cancel_button_) { 664effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch account_id_to_remove_.clear(); 665cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ShowView(profiles::BUBBLE_VIEW_MODE_ACCOUNT_MANAGEMENT, avatar_menu_.get()); 666effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } else if (sender == gaia_signin_cancel_button_) { 667effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch std::string primary_account = 668effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch SigninManagerFactory::GetForProfile(browser_->profile())-> 669effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch GetAuthenticatedUsername(); 670cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ShowView(primary_account.empty() ? 671cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) profiles::BUBBLE_VIEW_MODE_PROFILE_CHOOSER : 672cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) profiles::BUBBLE_VIEW_MODE_ACCOUNT_MANAGEMENT, 673effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch avatar_menu_.get()); 6745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } else if (sender == question_mark_button_) { 675cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) tutorial_mode_ = profiles::TUTORIAL_MODE_SEND_FEEDBACK; 676cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ShowView(profiles::BUBBLE_VIEW_MODE_PROFILE_CHOOSER, avatar_menu_.get()); 6775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } else if (sender == tutorial_send_feedback_button_) { 678cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ProfileMetrics::LogProfileUpgradeEnrollment( 679cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ProfileMetrics::PROFILE_ENROLLMENT_SEND_FEEDBACK); 6805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu chrome::OpenFeedbackDialog(browser_); 6815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } else if (sender == end_preview_and_relaunch_button_) { 682cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ProfileMetrics::LogProfileUpgradeEnrollment( 683cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ProfileMetrics::PROFILE_ENROLLMENT_DISABLE_NEW_PROFILE_MGMT); 684f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) profiles::DisableNewProfileManagementPreview(browser_->profile()); 6855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } else if (sender == end_preview_cancel_button_) { 686cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) tutorial_mode_ = profiles::TUTORIAL_MODE_SEND_FEEDBACK; 687cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ShowView(profiles::BUBBLE_VIEW_MODE_PROFILE_CHOOSER, avatar_menu_.get()); 688effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } else if (current_profile_photo_ && 689effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch sender == current_profile_photo_->change_photo_button()) { 690effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch avatar_menu_->EditProfile(avatar_menu_->GetActiveProfileIndex()); 691cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PostActionPerformed(ProfileMetrics::PROFILE_DESKTOP_MENU_EDIT_IMAGE); 6925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } else if (sender == signin_current_profile_link_) { 693010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Only show the inline signin if the new UI flag is flipped. Otherwise, 694010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // use the tab signin page. 695010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (switches::IsNewProfileManagement()) 696cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ShowView(profiles::BUBBLE_VIEW_MODE_GAIA_SIGNIN, avatar_menu_.get()); 697010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) else 698010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) chrome::ShowBrowserSignin(browser_, signin::SOURCE_MENU); 699d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } else { 7005c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Either one of the "other profiles", or one of the profile accounts 7015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // buttons was pressed. 7025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ButtonIndexes::const_iterator profile_match = 703d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) open_other_profile_indexes_map_.find(sender); 7045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (profile_match != open_other_profile_indexes_map_.end()) { 7055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu avatar_menu_->SwitchToProfile( 7065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu profile_match->second, 7075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ui::DispositionFromEventFlags(event.flags()) == NEW_WINDOW, 7085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ProfileMetrics::SWITCH_PROFILE_ICON); 7095c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } else { 7105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // This was a profile accounts button. 7115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu AccountButtonIndexes::const_iterator account_match = 712cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) delete_account_button_map_.find(sender); 713cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (account_match != delete_account_button_map_.end()) { 714cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) account_id_to_remove_ = account_match->second; 715cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ShowView(profiles::BUBBLE_VIEW_MODE_ACCOUNT_REMOVAL, 716cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) avatar_menu_.get()); 717cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } else { 718cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) account_match = reauth_account_button_map_.find(sender); 719cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DCHECK(account_match != reauth_account_button_map_.end()); 720cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ShowView(profiles::BUBBLE_VIEW_MODE_GAIA_REAUTH, avatar_menu_.get()); 721cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 7225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 723d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } 7247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 7257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 726effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid ProfileChooserView::RemoveAccount() { 727effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch DCHECK(!account_id_to_remove_.empty()); 7285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) MutableProfileOAuth2TokenService* oauth2_token_service = 7295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ProfileOAuth2TokenServiceFactory::GetPlatformSpecificForProfile( 730effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch browser_->profile()); 731cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (oauth2_token_service) { 732effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch oauth2_token_service->RevokeCredentials(account_id_to_remove_); 733cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PostActionPerformed(ProfileMetrics::PROFILE_DESKTOP_MENU_REMOVE_ACCT); 734cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 735effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch account_id_to_remove_.clear(); 736effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 737cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ShowView(profiles::BUBBLE_VIEW_MODE_ACCOUNT_MANAGEMENT, avatar_menu_.get()); 738f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 739f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 740d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)void ProfileChooserView::LinkClicked(views::Link* sender, int event_flags) { 741d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (sender == manage_accounts_link_) { 7425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // This link can either mean show/hide the account management view, 7435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // depending on which view it is displayed. ShowView() will DCHECK if 7445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // the account management view is displayed for non signed-in users. 7455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ShowView( 746cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) view_mode_ == profiles::BUBBLE_VIEW_MODE_ACCOUNT_MANAGEMENT ? 747cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) profiles::BUBBLE_VIEW_MODE_PROFILE_CHOOSER : 748cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) profiles::BUBBLE_VIEW_MODE_ACCOUNT_MANAGEMENT, 7495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu avatar_menu_.get()); 7505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } else if (sender == add_account_link_) { 751cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ShowView(profiles::BUBBLE_VIEW_MODE_GAIA_ADD_ACCOUNT, avatar_menu_.get()); 752cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PostActionPerformed(ProfileMetrics::PROFILE_DESKTOP_MENU_ADD_ACCT); 753a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } else if (sender == tutorial_learn_more_link_) { 754010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ProfileMetrics::LogProfileUpgradeEnrollment( 755010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ProfileMetrics::PROFILE_ENROLLMENT_LAUNCH_LEARN_MORE); 756a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // TODO(guohui): update |learn_more_url| once it is decided. 757a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const GURL lear_more_url("https://support.google.com/chrome/?hl=en#to"); 758a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) chrome::NavigateParams params( 759a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) browser_->profile(), 760a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) lear_more_url, 761a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) content::PAGE_TRANSITION_LINK); 762a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) params.disposition = NEW_FOREGROUND_TAB; 763a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) chrome::Navigate(¶ms); 764f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } else { 7655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu DCHECK(sender == tutorial_end_preview_link_); 766cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ShowView(profiles::BUBBLE_VIEW_MODE_END_PREVIEW, avatar_menu_.get()); 767f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 768f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 769f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 770c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid ProfileChooserView::StyledLabelLinkClicked( 771c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const gfx::Range& range, int event_flags) { 772c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch chrome::ShowSettings(browser_); 773c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 774c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 775f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)bool ProfileChooserView::HandleKeyEvent(views::Textfield* sender, 776f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const ui::KeyEvent& key_event) { 777f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) views::Textfield* name_textfield = 778f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) current_profile_name_->profile_name_textfield(); 779f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DCHECK(sender == name_textfield); 780f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 781f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (key_event.key_code() == ui::VKEY_RETURN || 782f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) key_event.key_code() == ui::VKEY_TAB) { 783f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Pressing Tab/Enter commits the new profile name, unless it's empty. 784f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::string16 new_profile_name = name_textfield->text(); 785f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (new_profile_name.empty()) 786f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return true; 787f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 788f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const AvatarMenu::Item& active_item = avatar_menu_->GetItemAt( 78968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) avatar_menu_->GetActiveProfileIndex()); 790f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) Profile* profile = g_browser_process->profile_manager()->GetProfile( 791f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) active_item.profile_path); 792f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DCHECK(profile); 793f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 794f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (profile->IsSupervised()) 795f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return true; 796f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 797f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) profiles::UpdateProfileName(profile, new_profile_name); 798cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PostActionPerformed(ProfileMetrics::PROFILE_DESKTOP_MENU_EDIT_NAME); 799f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) current_profile_name_->ShowReadOnlyView(); 800f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return true; 801d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } 802f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return false; 803d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} 8047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 805cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void ProfileChooserView::PostActionPerformed( 806cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ProfileMetrics::ProfileDesktopMenu action_performed) { 807cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ProfileMetrics::LogProfileDesktopMenu(action_performed, gaia_service_type_); 808cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) gaia_service_type_ = signin::GAIA_SERVICE_TYPE_NONE; 809cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 810cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 811a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochviews::View* ProfileChooserView::CreateProfileChooserView( 812010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) AvatarMenu* avatar_menu, 813cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) profiles::TutorialMode last_tutorial_mode) { 814a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // TODO(guohui, noms): the view should be customized based on whether new 815a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // profile management preview is enabled or not. 816a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 817a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch views::View* view = new views::View(); 818a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch views::GridLayout* layout = CreateSingleColumnLayout(view, kFixedMenuWidth); 819a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // Separate items into active and alternatives. 820a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch Indexes other_profiles; 821a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch views::View* tutorial_view = NULL; 822a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch views::View* current_profile_view = NULL; 823a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch views::View* current_profile_accounts = NULL; 824a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch views::View* option_buttons_view = NULL; 8255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu bool is_new_profile_management = switches::IsNewProfileManagement(); 826a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch for (size_t i = 0; i < avatar_menu->GetNumberOfItems(); ++i) { 827a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch const AvatarMenu::Item& item = avatar_menu->GetItemAt(i); 828a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (item.active) { 829a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch option_buttons_view = CreateOptionsView(item.signed_in); 8305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu current_profile_view = CreateCurrentProfileView(item, false); 831cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (view_mode_ == profiles::BUBBLE_VIEW_MODE_PROFILE_CHOOSER) { 8325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (is_new_profile_management) { 833cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) tutorial_view = 834cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) last_tutorial_mode == profiles::TUTORIAL_MODE_SEND_FEEDBACK ? 8355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu CreateSendPreviewFeedbackView() : 8365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu CreatePreviewEnabledTutorialView( 837cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) item, last_tutorial_mode == profiles::TUTORIAL_MODE_WELCOME); 8385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } else { 8395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu tutorial_view = CreateNewProfileManagementPreviewView(); 8405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 841a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch } else { 842a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch current_profile_accounts = CreateCurrentProfileAccountsView(item); 843a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch } 844a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch } else { 845a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch other_profiles.push_back(i); 846a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch } 847a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch } 848a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 849a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (tutorial_view) { 850010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Be sure not to track the tutorial display on View refresh, and only count 851010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // the preview-promo view, shown when New Profile Management is off. 852010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (tutorial_mode_ != last_tutorial_mode && !is_new_profile_management) { 853010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ProfileMetrics::LogProfileUpgradeEnrollment( 854010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ProfileMetrics::PROFILE_ENROLLMENT_SHOW_PREVIEW_PROMO); 855010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 856a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch layout->StartRow(1, 0); 857a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch layout->AddView(tutorial_view); 858a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch } 859a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 860a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (!current_profile_view) { 861a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // Guest windows don't have an active profile. 862a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch current_profile_view = CreateGuestProfileView(); 863a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch option_buttons_view = CreateOptionsView(false); 864a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch } 865a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 866a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch layout->StartRow(1, 0); 867a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch layout->AddView(current_profile_view); 868a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 869f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (view_mode_ != profiles::BUBBLE_VIEW_MODE_PROFILE_CHOOSER) { 870f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) DCHECK(current_profile_accounts); 871f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) layout->StartRow(0, 0); 872f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) layout->AddView(new views::Separator(views::Separator::HORIZONTAL)); 873f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) layout->StartRow(1, 0); 874f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) layout->AddView(current_profile_accounts); 875f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 876f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 877f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (browser_->profile()->IsSupervised()) { 878cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) layout->StartRow(0, 0); 879cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) layout->AddView(new views::Separator(views::Separator::HORIZONTAL)); 880cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) layout->StartRow(1, 0); 881cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) layout->AddView(CreateSupervisedUserDisclaimerView()); 882cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 883cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 884cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (view_mode_ == profiles::BUBBLE_VIEW_MODE_PROFILE_CHOOSER) { 885a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch layout->StartRow(1, 0); 886a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (switches::IsFastUserSwitching()) 887a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch layout->AddView(CreateOtherProfilesView(other_profiles)); 888a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch } 889a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 890a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch layout->StartRow(0, 0); 891a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch layout->AddView(new views::Separator(views::Separator::HORIZONTAL)); 892a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 8935c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Option buttons. Only available with the new profile management flag. 894010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (option_buttons_view) { 8955c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu layout->StartRow(0, 0); 8965c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu layout->AddView(option_buttons_view); 8975c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 898a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 899a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch return view; 900a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch} 901a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 902a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochviews::View* ProfileChooserView::CreatePreviewEnabledTutorialView( 903a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch const AvatarMenu::Item& current_avatar_item, 904a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch bool tutorial_shown) { 905a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (!switches::IsNewProfileManagementPreviewEnabled()) 906a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return NULL; 907a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 908a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Profile* profile = browser_->profile(); 90923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) const int show_count = profile->GetPrefs()->GetInteger( 910a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) prefs::kProfileAvatarTutorialShown); 91123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) // Do not show the tutorial if user has dismissed it. 91223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) if (show_count > kProfileAvatarTutorialShowMax) 913a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return NULL; 914a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 91523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) if (!tutorial_shown) { 91623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) if (show_count == kProfileAvatarTutorialShowMax) 91723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) return NULL; 91823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) profile->GetPrefs()->SetInteger( 91923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) prefs::kProfileAvatarTutorialShown, show_count + 1); 92023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) } 921a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 922a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch return CreateTutorialView( 923cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) profiles::TUTORIAL_MODE_WELCOME, 924a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch l10n_util::GetStringUTF16(IDS_PROFILES_PREVIEW_ENABLED_TUTORIAL_TITLE), 925a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch l10n_util::GetStringUTF16( 926a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch IDS_PROFILES_PREVIEW_ENABLED_TUTORIAL_CONTENT_TEXT), 927a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch l10n_util::GetStringUTF16(IDS_PROFILES_PROFILE_TUTORIAL_LEARN_MORE), 928a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch l10n_util::GetStringUTF16(IDS_PROFILES_TUTORIAL_OK_BUTTON), 929a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch &tutorial_learn_more_link_, 930a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch &tutorial_ok_button_); 931a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch} 932a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 9335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuviews::View* ProfileChooserView::CreateSendPreviewFeedbackView() { 9345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return CreateTutorialView( 935cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) profiles::TUTORIAL_MODE_SEND_FEEDBACK, 9365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu l10n_util::GetStringUTF16(IDS_PROFILES_FEEDBACK_TUTORIAL_TITLE), 9375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu l10n_util::GetStringUTF16( 9385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu IDS_PROFILES_FEEDBACK_TUTORIAL_CONTENT_TEXT), 9395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu l10n_util::GetStringUTF16(IDS_PROFILES_END_PREVIEW), 9405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu l10n_util::GetStringUTF16(IDS_PROFILES_SEND_FEEDBACK_BUTTON), 9415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu &tutorial_end_preview_link_, 9425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu &tutorial_send_feedback_button_); 9435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 9445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 945a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochviews::View* ProfileChooserView::CreateTutorialView( 946cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) profiles::TutorialMode tutorial_mode, 947a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch const base::string16& title_text, 948a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch const base::string16& content_text, 949a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch const base::string16& link_text, 950a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch const base::string16& button_text, 951a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch views::Link** link, 952a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch views::LabelButton** button) { 9535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu tutorial_mode_ = tutorial_mode; 9545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 955a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) views::View* view = new views::View(); 956c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch view->set_background(views::Background::CreateSolidBackground( 957c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch profiles::kAvatarTutorialBackgroundColor)); 958a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) views::GridLayout* layout = CreateSingleColumnLayout(view, 959a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) kFixedMenuWidth - 2 * views::kButtonHEdgeMarginNew); 960a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) layout->SetInsets(views::kButtonVEdgeMarginNew, 961a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) views::kButtonHEdgeMarginNew, 962a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) views::kButtonVEdgeMarginNew, 963a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) views::kButtonHEdgeMarginNew); 964a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 965a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Adds title. 966a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch views::Label* title_label = new views::Label(title_text); 967a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) title_label->SetHorizontalAlignment(gfx::ALIGN_LEFT); 968c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch title_label->SetAutoColorReadabilityEnabled(false); 969c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch title_label->SetEnabledColor(SK_ColorWHITE); 970010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) title_label->SetFontList(ui::ResourceBundle::GetSharedInstance().GetFontList( 971c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ui::ResourceBundle::MediumFont)); 972a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) layout->StartRow(1, 0); 973a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) layout->AddView(title_label); 974a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 975c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Adds body content. 976a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch views::Label* content_label = new views::Label(content_text); 977c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch content_label->SetMultiLine(true); 978c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch content_label->SetHorizontalAlignment(gfx::ALIGN_LEFT); 979c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch content_label->SetAutoColorReadabilityEnabled(false); 980c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch content_label->SetEnabledColor(profiles::kAvatarTutorialContentTextColor); 981a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) layout->StartRowWithPadding(1, 0, 0, views::kRelatedControlVerticalSpacing); 982c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch layout->AddView(content_label); 983a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 984c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Adds links and buttons. 985a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) views::View* button_row = new views::View(); 986a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) views::GridLayout* button_layout = new views::GridLayout(button_row); 987a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) views::ColumnSet* button_columns = button_layout->AddColumnSet(0); 988a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) button_columns->AddColumn(views::GridLayout::LEADING, 989a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) views::GridLayout::CENTER, 0, views::GridLayout::USE_PREF, 0, 0); 990a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) button_columns->AddPaddingColumn( 991a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1, views::kUnrelatedControlHorizontalSpacing); 992a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) button_columns->AddColumn(views::GridLayout::TRAILING, 993a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) views::GridLayout::CENTER, 0, views::GridLayout::USE_PREF, 0, 0); 994a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) button_row->SetLayoutManager(button_layout); 995a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 996a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch *link = CreateLink(link_text, this); 997a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch (*link)->SetHorizontalAlignment(gfx::ALIGN_LEFT); 998a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch (*link)->SetAutoColorReadabilityEnabled(false); 999a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch (*link)->SetEnabledColor(SK_ColorWHITE); 1000a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) button_layout->StartRow(1, 0); 1001a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch button_layout->AddView(*link); 1002a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1003a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch *button = new views::LabelButton(this, button_text); 1004a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch (*button)->SetHorizontalAlignment(gfx::ALIGN_CENTER); 1005a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch (*button)->SetStyle(views::Button::STYLE_BUTTON); 1006a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch button_layout->AddView(*button); 1007a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1008a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) layout->StartRowWithPadding(1, 0, 0, views::kUnrelatedControlVerticalSpacing); 1009a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) layout->AddView(button_row); 1010a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1011c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Adds a padded caret image at the bottom. 1012c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch views::View* padded_caret_view = new views::View(); 1013c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch views::GridLayout* padded_caret_layout = 1014c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch new views::GridLayout(padded_caret_view); 1015c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch views::ColumnSet* padded_columns = padded_caret_layout->AddColumnSet(0); 1016c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch padded_columns->AddPaddingColumn(0, views::kButtonHEdgeMarginNew); 1017c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch padded_columns->AddColumn(views::GridLayout::LEADING, 1018c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch views::GridLayout::CENTER, 0, views::GridLayout::USE_PREF, 0, 0); 1019c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch padded_caret_view->SetLayoutManager(padded_caret_layout); 1020c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 1021c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch views::ImageView* caret_image_view = new views::ImageView(); 1022c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ui::ResourceBundle* rb = &ui::ResourceBundle::GetSharedInstance(); 1023c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch caret_image_view->SetImage( 1024c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch *rb->GetImageSkiaNamed(IDR_ICON_PROFILES_MENU_CARET)); 1025c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 1026c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch padded_caret_layout->StartRow(1, 0); 1027c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch padded_caret_layout->AddView(caret_image_view); 1028c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 1029c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch views::View* view_with_caret = new views::View(); 1030c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch views::GridLayout* layout_with_caret = 1031c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch CreateSingleColumnLayout(view_with_caret, kFixedMenuWidth); 1032c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch layout_with_caret->StartRow(1, 0); 1033c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch layout_with_caret->AddView(view); 1034c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch layout_with_caret->StartRow(1, 0); 1035c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch layout_with_caret->AddView(padded_caret_view); 1036c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return view_with_caret; 1037a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 1038a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1039d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)views::View* ProfileChooserView::CreateCurrentProfileView( 104068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) const AvatarMenu::Item& avatar_item, 1041d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) bool is_guest) { 1042d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) views::View* view = new views::View(); 10435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu int column_width = kFixedMenuWidth - 2 * views::kButtonHEdgeMarginNew; 10445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu views::GridLayout* layout = CreateSingleColumnLayout(view, column_width); 104568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) layout->SetInsets(views::kButtonVEdgeMarginNew, 1046d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) views::kButtonHEdgeMarginNew, 1047010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) views::kUnrelatedControlVerticalSpacing, 104868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) views::kButtonHEdgeMarginNew); 10497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 10505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Profile icon, centered. 1051f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) int x_offset = (column_width - kLargeImageSide) / 2; 10525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu current_profile_photo_ = new EditableProfilePhoto( 10535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu this, avatar_item.icon, !is_guest, 10545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu gfx::Rect(x_offset, 0, kLargeImageSide, kLargeImageSide)); 1055f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) SizedContainer* profile_icon_container = 1056f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) new SizedContainer(gfx::Size(column_width, kLargeImageSide)); 1057f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) profile_icon_container->AddChildView(current_profile_photo_); 1058d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 10595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (switches::IsNewProfileManagementPreviewEnabled()) { 10605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu question_mark_button_ = new views::ImageButton(this); 10615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu question_mark_button_->SetImageAlignment( 10625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu views::ImageButton::ALIGN_LEFT, views::ImageButton::ALIGN_MIDDLE); 10635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ui::ResourceBundle* rb = &ui::ResourceBundle::GetSharedInstance(); 10645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu question_mark_button_->SetImage(views::ImageButton::STATE_NORMAL, 1065010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) rb->GetImageSkiaNamed(IDR_ICON_PROFILES_MENU_QUESTION_STABLE)); 1066010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) question_mark_button_->SetImage(views::ImageButton::STATE_HOVERED, 1067010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) rb->GetImageSkiaNamed(IDR_ICON_PROFILES_MENU_QUESTION_HOVER)); 1068010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) question_mark_button_->SetImage(views::ImageButton::STATE_PRESSED, 1069010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) rb->GetImageSkiaNamed(IDR_ICON_PROFILES_MENU_QUESTION_SELECT)); 10705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu gfx::Size preferred_size = question_mark_button_->GetPreferredSize(); 10715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu question_mark_button_->SetBounds( 10725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 0, 0, preferred_size.width(), preferred_size.height()); 1073f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) profile_icon_container->AddChildView(question_mark_button_); 1074d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } 10757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1076f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (browser_->profile()->IsSupervised()) { 107746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) views::ImageView* supervised_icon = new views::ImageView(); 107846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ui::ResourceBundle* rb = &ui::ResourceBundle::GetSharedInstance(); 107946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) supervised_icon->SetImage( 108046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) rb->GetImageSkiaNamed(IDR_ICON_PROFILES_MENU_SUPERVISED)); 108146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) gfx::Size preferred_size = supervised_icon->GetPreferredSize(); 108246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) gfx::Rect parent_bounds = current_profile_photo_->bounds(); 108346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) supervised_icon->SetBounds( 108446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) parent_bounds.right() - preferred_size.width(), 108546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) parent_bounds.bottom() - preferred_size.height(), 108646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) preferred_size.width(), 108746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) preferred_size.height()); 1088f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) profile_icon_container->AddChildView(supervised_icon); 108946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 109046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 10915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu layout->StartRow(1, 0); 1092f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) layout->AddView(profile_icon_container); 10937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 10945c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Profile name, centered. 1095f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) bool editing_allowed = !is_guest && !browser_->profile()->IsSupervised(); 1096a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) current_profile_name_ = new EditableProfileName( 1097116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch this, 1098116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch profiles::GetAvatarNameForProfile(browser_->profile()->GetPath()), 1099116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch editing_allowed); 1100d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) layout->StartRow(1, 0); 1101f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) layout->AddView(current_profile_name_); 11023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 11035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (is_guest) 11045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return view; 11053551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 11065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // The available links depend on the type of profile that is active. 11075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (avatar_item.signed_in) { 1108cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) layout->StartRow(1, 0); 11095c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (switches::IsNewProfileManagement()) { 11105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::string16 link_title = l10n_util::GetStringUTF16( 1111cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) view_mode_ == profiles::BUBBLE_VIEW_MODE_PROFILE_CHOOSER ? 11125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu IDS_PROFILES_PROFILE_MANAGE_ACCOUNTS_BUTTON : 11135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu IDS_PROFILES_PROFILE_HIDE_MANAGE_ACCOUNTS_BUTTON); 11145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu manage_accounts_link_ = CreateLink(link_title, this); 11155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu manage_accounts_link_->SetHorizontalAlignment(gfx::ALIGN_CENTER); 11165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu layout->AddView(manage_accounts_link_); 11175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } else { 11185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu views::Label* email_label = new views::Label(avatar_item.sync_state); 11195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu email_label->SetHorizontalAlignment(gfx::ALIGN_CENTER); 11205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu layout->AddView(email_label); 11215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 11225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } else { 1123cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SigninManagerBase* signin_manager = 1124cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SigninManagerFactory::GetForProfile( 1125cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) browser_->profile()->GetOriginalProfile()); 1126cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (signin_manager->IsSigninAllowed()) { 1127cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) signin_current_profile_link_ = new views::BlueButton( 1128cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) this, l10n_util::GetStringFUTF16(IDS_SYNC_START_SYNC_BUTTON_LABEL, 1129cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) l10n_util::GetStringUTF16(IDS_SHORT_PRODUCT_NAME))); 1130cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) layout->StartRow(1, 0); 1131cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) layout->AddView(signin_current_profile_link_); 1132cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 11335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 11345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 11353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return view; 11363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 11373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 11383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)views::View* ProfileChooserView::CreateGuestProfileView() { 1139d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) gfx::Image guest_icon = 11400529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ui::ResourceBundle::GetSharedInstance().GetImageNamed( 11410529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch profiles::GetPlaceholderAvatarIconResourceID()); 114268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) AvatarMenu::Item guest_avatar_item(0, 0, guest_icon); 11433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) guest_avatar_item.active = true; 11443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) guest_avatar_item.name = l10n_util::GetStringUTF16( 1145d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) IDS_PROFILES_GUEST_PROFILE_NAME); 11463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) guest_avatar_item.signed_in = false; 11473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1148d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return CreateCurrentProfileView(guest_avatar_item, true); 11497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 11507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 11517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)views::View* ProfileChooserView::CreateOtherProfilesView( 11527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const Indexes& avatars_to_show) { 11537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) views::View* view = new views::View(); 11545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu views::GridLayout* layout = CreateSingleColumnLayout(view, kFixedMenuWidth); 11555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 115668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) int num_avatars_to_show = avatars_to_show.size(); 115768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) for (int i = 0; i < num_avatars_to_show; ++i) { 115868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) const size_t index = avatars_to_show[i]; 115968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) const AvatarMenu::Item& item = avatar_menu_->GetItemAt(index); 1160f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const int kSmallImageSide = 32; 1161d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 11620529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch gfx::Image image = profiles::GetSizedAvatarIcon( 1163010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) item.icon, true, kSmallImageSide, kSmallImageSide); 1164d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 11655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu views::LabelButton* button = new BackgroundColorHoverButton( 11665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu this, 11675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu item.name, 11685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu *image.ToImageSkia(), 11695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu *image.ToImageSkia()); 11705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu button->set_min_size(gfx::Size( 11715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 0, kButtonHeight + views::kRelatedControlVerticalSpacing)); 11725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1173d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) open_other_profile_indexes_map_[button] = index; 1174d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 1175d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) layout->StartRow(1, 0); 11765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu layout->AddView(new views::Separator(views::Separator::HORIZONTAL)); 11775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu layout->StartRow(1, 0); 1178d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) layout->AddView(button); 11797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 11807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 11817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return view; 11827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 11837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1184effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochviews::View* ProfileChooserView::CreateOptionsView(bool enable_lock) { 1185010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (!switches::IsNewProfileManagement()) 1186010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return NULL; 1187010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 1188d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) views::View* view = new views::View(); 1189effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch views::GridLayout* layout; 1190effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 1191effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Only signed-in users have the ability to lock. 1192effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (enable_lock) { 1193effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch layout = new views::GridLayout(view); 1194effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch views::ColumnSet* columns = layout->AddColumnSet(0); 1195effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch int width_of_lock_button = 1196effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 2 * views::kUnrelatedControlLargeHorizontalSpacing + 12; 1197effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch int width_of_users_button = kFixedMenuWidth - width_of_lock_button; 1198effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch columns->AddColumn(views::GridLayout::FILL, views::GridLayout::FILL, 0, 1199effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch views::GridLayout::FIXED, width_of_users_button, 1200effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch width_of_users_button); 1201effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch columns->AddColumn(views::GridLayout::FILL, views::GridLayout::FILL, 0, 1202effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch views::GridLayout::FIXED, width_of_lock_button, 1203effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch width_of_lock_button); 1204effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch view->SetLayoutManager(layout); 1205effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } else { 1206effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch layout = CreateSingleColumnLayout(view, kFixedMenuWidth); 1207effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 1208effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 12095c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::string16 text = browser_->profile()->IsGuestSession() ? 12105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu l10n_util::GetStringUTF16(IDS_PROFILES_EXIT_GUEST) : 12115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu l10n_util::GetStringFUTF16(IDS_PROFILES_NOT_YOU_BUTTON, 1212116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch profiles::GetAvatarNameForProfile( 1213116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch browser_->profile()->GetPath())); 1214d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) ui::ResourceBundle* rb = &ui::ResourceBundle::GetSharedInstance(); 121568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) users_button_ = new BackgroundColorHoverButton( 121668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) this, 12175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu text, 1218effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch *rb->GetImageSkiaNamed(IDR_ICON_PROFILES_MENU_AVATAR), 1219effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch *rb->GetImageSkiaNamed(IDR_ICON_PROFILES_MENU_AVATAR)); 12205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu users_button_->set_min_size(gfx::Size( 12215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 0, kButtonHeight + views::kRelatedControlVerticalSpacing)); 1222effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 1223d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) layout->StartRow(1, 0); 1224d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) layout->AddView(users_button_); 1225a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 1226effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (enable_lock) { 1227effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch lock_button_ = new BackgroundColorHoverButton( 1228effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch this, 1229effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch base::string16(), 1230effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch *rb->GetImageSkiaNamed(IDR_ICON_PROFILES_MENU_LOCK), 1231effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch *rb->GetImageSkiaNamed(IDR_ICON_PROFILES_MENU_LOCK)); 12325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu lock_button_->set_min_size(gfx::Size( 12335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 0, kButtonHeight + views::kRelatedControlVerticalSpacing)); 1234effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch layout->AddView(lock_button_); 1235effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 1236d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return view; 1237d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} 12387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1239cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)views::View* ProfileChooserView::CreateSupervisedUserDisclaimerView() { 1240cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) views::View* view = new views::View(); 1241cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) views::GridLayout* layout = CreateSingleColumnLayout( 1242cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) view, kFixedMenuWidth - 2 * views::kButtonHEdgeMarginNew); 1243cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) layout->SetInsets(views::kRelatedControlVerticalSpacing, 1244cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) views::kButtonHEdgeMarginNew, 1245cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) views::kRelatedControlVerticalSpacing, 1246cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) views::kButtonHEdgeMarginNew); 1247cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) views::Label* disclaimer = new views::Label( 1248f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) avatar_menu_->GetSupervisedUserInformation()); 1249cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) disclaimer->SetMultiLine(true); 1250cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) disclaimer->SetHorizontalAlignment(gfx::ALIGN_LEFT); 1251cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ui::ResourceBundle* rb = &ui::ResourceBundle::GetSharedInstance(); 1252cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) disclaimer->SetFontList(rb->GetFontList(ui::ResourceBundle::SmallFont)); 1253cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) layout->StartRow(1, 0); 1254cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) layout->AddView(disclaimer); 1255cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1256cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return view; 1257cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 1258cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1259d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)views::View* ProfileChooserView::CreateCurrentProfileAccountsView( 126068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) const AvatarMenu::Item& avatar_item) { 1261d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) DCHECK(avatar_item.signed_in); 1262a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch views::View* view = new views::View(); 12635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu view->set_background(views::Background::CreateSolidBackground( 12645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu profiles::kAvatarBubbleAccountsBackgroundColor)); 12655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu views::GridLayout* layout = CreateSingleColumnLayout(view, kFixedMenuWidth); 12667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 12671e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) Profile* profile = browser_->profile(); 1268a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) std::string primary_account = 1269a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) SigninManagerFactory::GetForProfile(profile)->GetAuthenticatedUsername(); 1270a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK(!primary_account.empty()); 12715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::vector<std::string>accounts = 12725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) profiles::GetSecondaryAccountsForProfile(profile, primary_account); 12737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1274cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Get state of authentication error, if any. 1275cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::string error_account_id = GetAuthErrorAccountId(profile); 1276cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 12775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // The primary account should always be listed first. 12785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // TODO(rogerta): we still need to further differentiate the primary account 12795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // from the others in the UI, so more work is likely required here: 12805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // crbug.com/311124. 1281cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) CreateAccountButton(layout, primary_account, true, 1282cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) error_account_id == primary_account, kFixedMenuWidth); 12835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (size_t i = 0; i < accounts.size(); ++i) 1284cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) CreateAccountButton(layout, accounts[i], false, 1285cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) error_account_id == accounts[i], kFixedMenuWidth); 12867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1287116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (!profile->IsSupervised()) { 1288116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing); 1289116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1290116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch add_account_link_ = CreateLink(l10n_util::GetStringFUTF16( 1291116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch IDS_PROFILES_PROFILE_ADD_ACCOUNT_BUTTON, avatar_item.name), this); 1292116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch add_account_link_->SetBorder(views::Border::CreateEmptyBorder( 1293116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 0, views::kButtonVEdgeMarginNew, 1294116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch views::kRelatedControlVerticalSpacing, 0)); 1295116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch layout->StartRow(1, 0); 1296116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch layout->AddView(add_account_link_); 1297116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 1298116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 12997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return view; 13007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 1301a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1302a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void ProfileChooserView::CreateAccountButton(views::GridLayout* layout, 1303a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const std::string& account, 13045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool is_primary_account, 1305cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bool reauth_required, 13065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int width) { 1307a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ui::ResourceBundle* rb = &ui::ResourceBundle::GetSharedInstance(); 1308cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const gfx::ImageSkia* delete_default_image = 13095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) rb->GetImageNamed(IDR_CLOSE_1).ToImageSkia(); 1310cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const int kDeleteButtonWidth = delete_default_image->width(); 13116d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) const gfx::ImageSkia warning_default_image = reauth_required ? 13126d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) *rb->GetImageNamed(IDR_ICON_PROFILES_ACCOUNT_BUTTON_ERROR).ToImageSkia() : 13136d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) gfx::ImageSkia(); 1314cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const int kWarningButtonWidth = reauth_required ? 13156d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) warning_default_image.width() + views::kRelatedButtonHSpacing : 0; 13166d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) int available_width = width - 2 * views::kButtonHEdgeMarginNew 13176d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) - kDeleteButtonWidth - kWarningButtonWidth; 13185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu views::LabelButton* email_button = new BackgroundColorHoverButton( 13196d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) reauth_required ? this : NULL, 132046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) gfx::ElideText(base::UTF8ToUTF16(account), gfx::FontList(), 132146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) available_width, gfx::ELIDE_EMAIL), 13226d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) warning_default_image, 13236d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) warning_default_image); 1324a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) layout->StartRow(1, 0); 1325a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) layout->AddView(email_button); 1326a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 13276d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) if (reauth_required) 13286d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) reauth_account_button_map_[email_button] = account; 1329116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1330116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Delete button. 1331116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (!browser_->profile()->IsSupervised()) { 1332116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch views::ImageButton* delete_button = new views::ImageButton(this); 1333116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch delete_button->SetImageAlignment(views::ImageButton::ALIGN_RIGHT, 1334116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch views::ImageButton::ALIGN_MIDDLE); 1335116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch delete_button->SetImage(views::ImageButton::STATE_NORMAL, 1336116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch delete_default_image); 1337116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch delete_button->SetImage(views::ImageButton::STATE_HOVERED, 1338116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch rb->GetImageSkiaNamed(IDR_CLOSE_1_H)); 1339116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch delete_button->SetImage(views::ImageButton::STATE_PRESSED, 1340116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch rb->GetImageSkiaNamed(IDR_CLOSE_1_P)); 1341116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch delete_button->SetBounds( 1342116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch width - views::kButtonHEdgeMarginNew - kDeleteButtonWidth, 1343116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 0, kDeleteButtonWidth, kButtonHeight); 1344116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1345116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch email_button->set_notify_enter_exit_on_child(true); 1346116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch email_button->AddChildView(delete_button); 1347116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1348116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Save the original email address, as the button text could be elided. 1349116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch delete_account_button_map_[delete_button] = account; 1350116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 1351a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1352effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 1353cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)views::View* ProfileChooserView::CreateGaiaSigninView() { 1354cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GURL url; 1355cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int message_id; 1356cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1357cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) switch (view_mode_) { 1358cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case profiles::BUBBLE_VIEW_MODE_GAIA_SIGNIN: 1359cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) url = signin::GetPromoURL(signin::SOURCE_AVATAR_BUBBLE_SIGN_IN, 1360cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) false /* auto_close */, 1361cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) true /* is_constrained */); 1362cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) message_id = IDS_PROFILES_GAIA_SIGNIN_TITLE; 1363cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) break; 1364cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case profiles::BUBBLE_VIEW_MODE_GAIA_ADD_ACCOUNT: 1365cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) url = signin::GetPromoURL(signin::SOURCE_AVATAR_BUBBLE_ADD_ACCOUNT, 1366cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) false /* auto_close */, 1367cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) true /* is_constrained */); 1368cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) message_id = IDS_PROFILES_GAIA_ADD_ACCOUNT_TITLE; 1369cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) break; 1370cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case profiles::BUBBLE_VIEW_MODE_GAIA_REAUTH: { 1371cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DCHECK(HasAuthError(browser_->profile())); 1372cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) url = signin::GetReauthURL(browser_->profile(), 1373cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GetAuthErrorUsername(browser_->profile())); 1374cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) message_id = IDS_PROFILES_GAIA_REAUTH_TITLE; 1375cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) break; 1376cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 1377cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) default: 1378cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) NOTREACHED() << "Called with invalid mode=" << view_mode_; 1379cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return NULL; 1380cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 1381cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1382effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Adds Gaia signin webview 1383effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch Profile* profile = browser_->profile(); 1384effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch views::WebView* web_view = new views::WebView(profile); 1385effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch web_view->LoadInitialURL(url); 1386effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch web_view->SetPreferredSize( 1387effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch gfx::Size(kFixedGaiaViewWidth, kFixedGaiaViewHeight)); 1388effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 1389cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) TitleCard* title_card = new TitleCard(message_id, this, 1390cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) &gaia_signin_cancel_button_); 1391010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return TitleCard::AddPaddedTitleCard( 1392010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) web_view, title_card, kFixedGaiaViewWidth); 1393effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 1394effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 1395effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochviews::View* ProfileChooserView::CreateAccountRemovalView() { 1396effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch views::View* view = new views::View(); 1397effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch views::GridLayout* layout = CreateSingleColumnLayout( 1398effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch view, kFixedAccountRemovalViewWidth - 2 * views::kButtonHEdgeMarginNew); 1399010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) layout->SetInsets(0, 1400effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch views::kButtonHEdgeMarginNew, 1401effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch views::kButtonVEdgeMarginNew, 1402effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch views::kButtonHEdgeMarginNew); 1403effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 1404effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const std::string& primary_account = SigninManagerFactory::GetForProfile( 1405effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch browser_->profile())->GetAuthenticatedUsername(); 1406effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch bool is_primary_account = primary_account == account_id_to_remove_; 1407effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 1408effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Adds main text. 1409c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch layout->StartRowWithPadding(1, 0, 0, views::kUnrelatedControlVerticalSpacing); 1410effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch ui::ResourceBundle* rb = &ui::ResourceBundle::GetSharedInstance(); 1411effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const gfx::FontList& small_font_list = 1412effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch rb->GetFontList(ui::ResourceBundle::SmallFont); 1413c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 1414c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (is_primary_account) { 1415c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch std::vector<size_t> offsets; 1416c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const base::string16 settings_text = 1417c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch l10n_util::GetStringUTF16(IDS_PROFILES_SETTINGS_LINK); 14180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch const base::string16 primary_account_removal_text = 1419c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch l10n_util::GetStringFUTF16(IDS_PROFILES_PRIMARY_ACCOUNT_REMOVAL_TEXT, 1420c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch base::UTF8ToUTF16(account_id_to_remove_), settings_text, &offsets); 1421c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch views::StyledLabel* primary_account_removal_label = 14220529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch new views::StyledLabel(primary_account_removal_text, this); 1423c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch primary_account_removal_label->AddStyleRange( 1424c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch gfx::Range(offsets[1], offsets[1] + settings_text.size()), 1425c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch views::StyledLabel::RangeStyleInfo::CreateForLink()); 1426c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch primary_account_removal_label->SetBaseFontList(small_font_list); 1427c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch layout->AddView(primary_account_removal_label); 1428c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } else { 1429c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch views::Label* content_label = new views::Label( 1430c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch l10n_util::GetStringUTF16(IDS_PROFILES_ACCOUNT_REMOVAL_TEXT)); 1431c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch content_label->SetMultiLine(true); 1432c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch content_label->SetHorizontalAlignment(gfx::ALIGN_LEFT); 1433c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch content_label->SetFontList(small_font_list); 1434c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch layout->AddView(content_label); 1435c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 1436effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 1437effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Adds button. 1438effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (!is_primary_account) { 1439010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) remove_account_button_ = new views::BlueButton( 1440effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch this, l10n_util::GetStringUTF16(IDS_PROFILES_ACCOUNT_REMOVAL_BUTTON)); 1441010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) remove_account_button_->SetHorizontalAlignment( 1442effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch gfx::ALIGN_CENTER); 1443effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch layout->StartRowWithPadding( 1444effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 1, 0, 0, views::kUnrelatedControlVerticalSpacing); 1445010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) layout->AddView(remove_account_button_); 1446effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } else { 1447effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch layout->AddPaddingRow(0, views::kUnrelatedControlVerticalSpacing); 1448effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 1449effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 1450010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) TitleCard* title_card = new TitleCard(IDS_PROFILES_ACCOUNT_REMOVAL_TITLE, 1451010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) this, &account_removal_cancel_button_); 1452010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return TitleCard::AddPaddedTitleCard(view, title_card, 1453010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kFixedAccountRemovalViewWidth); 1454effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 1455a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 1456a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochviews::View* ProfileChooserView::CreateNewProfileManagementPreviewView() { 1457a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch return CreateTutorialView( 1458cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) profiles::TUTORIAL_MODE_ENABLE_PREVIEW, 1459a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch l10n_util::GetStringUTF16(IDS_PROFILES_PREVIEW_TUTORIAL_TITLE), 1460a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch l10n_util::GetStringUTF16(IDS_PROFILES_PREVIEW_TUTORIAL_CONTENT_TEXT), 1461a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch l10n_util::GetStringUTF16(IDS_PROFILES_PROFILE_TUTORIAL_LEARN_MORE), 1462a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch l10n_util::GetStringUTF16(IDS_PROFILES_TUTORIAL_TRY_BUTTON), 1463a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch &tutorial_learn_more_link_, 1464a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch &tutorial_enable_new_profile_management_button_); 1465a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch} 14665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 14675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuviews::View* ProfileChooserView::CreateEndPreviewView() { 14685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu views::View* view = new views::View(); 14695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu views::GridLayout* layout = CreateSingleColumnLayout( 14705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu view, kFixedAccountRemovalViewWidth - 2 * views::kButtonHEdgeMarginNew); 1471010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) layout->SetInsets(0, 14725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu views::kButtonHEdgeMarginNew, 14735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu views::kButtonVEdgeMarginNew, 14745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu views::kButtonHEdgeMarginNew); 14755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 14765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Adds main text. 14775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu views::Label* content_label = new views::Label( 14785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu l10n_util::GetStringUTF16(IDS_PROFILES_END_PREVIEW_TEXT)); 14795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu content_label->SetMultiLine(true); 14805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu content_label->SetHorizontalAlignment(gfx::ALIGN_LEFT); 14815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ui::ResourceBundle* rb = &ui::ResourceBundle::GetSharedInstance(); 14825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const gfx::FontList& small_font_list = 14835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu rb->GetFontList(ui::ResourceBundle::SmallFont); 14845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu content_label->SetFontList(small_font_list); 14855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu layout->StartRowWithPadding(1, 0, 0, views::kUnrelatedControlVerticalSpacing); 14865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu layout->AddView(content_label); 14875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 14885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Adds button. 14895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu end_preview_and_relaunch_button_ = new views::BlueButton( 14905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu this, l10n_util::GetStringUTF16(IDS_PROFILES_END_PREVIEW_AND_RELAUNCH)); 14915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu end_preview_and_relaunch_button_->SetHorizontalAlignment( 14925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu gfx::ALIGN_CENTER); 14935c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu layout->StartRowWithPadding( 14945c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1, 0, 0, views::kUnrelatedControlVerticalSpacing); 14955c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu layout->AddView(end_preview_and_relaunch_button_); 14965c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1497010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) TitleCard* title_card = new TitleCard( 1498010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) IDS_PROFILES_END_PREVIEW, this, &end_preview_cancel_button_); 1499010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return TitleCard::AddPaddedTitleCard( 1500010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) view, title_card, kFixedAccountRemovalViewWidth); 15015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 15025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1503