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

Side by Side Diff: ash/system/user/tray_user.cc

Issue 14756019: Adding new user menu section to the SystemTrayMenu & refactoring of user access (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: More windows breakages addressed Created 7 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "ash/system/user/tray_user.h" 5 #include "ash/system/user/tray_user.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <climits> 8 #include <climits>
9 #include <vector> 9 #include <vector>
10 10
11 #include "ash/session_state_delegate.h"
11 #include "ash/shell.h" 12 #include "ash/shell.h"
12 #include "ash/shell_delegate.h" 13 #include "ash/shell_delegate.h"
13 #include "ash/system/tray/system_tray.h" 14 #include "ash/system/tray/system_tray.h"
14 #include "ash/system/tray/system_tray_delegate.h" 15 #include "ash/system/tray/system_tray_delegate.h"
15 #include "ash/system/tray/system_tray_notifier.h" 16 #include "ash/system/tray/system_tray_notifier.h"
16 #include "ash/system/tray/tray_constants.h" 17 #include "ash/system/tray/tray_constants.h"
17 #include "ash/system/tray/tray_item_view.h" 18 #include "ash/system/tray/tray_item_view.h"
18 #include "ash/system/tray/tray_popup_label_button.h" 19 #include "ash/system/tray/tray_popup_label_button.h"
19 #include "ash/system/tray/tray_popup_label_button_border.h" 20 #include "ash/system/tray/tray_popup_label_button_border.h"
20 #include "ash/system/tray/tray_utils.h" 21 #include "ash/system/tray/tray_utils.h"
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
54 #include "ui/views/layout/box_layout.h" 55 #include "ui/views/layout/box_layout.h"
55 #include "ui/views/layout/fill_layout.h" 56 #include "ui/views/layout/fill_layout.h"
56 #include "ui/views/painter.h" 57 #include "ui/views/painter.h"
57 #include "ui/views/view.h" 58 #include "ui/views/view.h"
58 #include "ui/views/widget/widget.h" 59 #include "ui/views/widget/widget.h"
59 60
60 namespace { 61 namespace {
61 62
62 const int kUserDetailsVerticalPadding = 5; 63 const int kUserDetailsVerticalPadding = 5;
63 const int kUserCardVerticalPadding = 10; 64 const int kUserCardVerticalPadding = 10;
65 const int kInactiveUserCardVerticalPadding = 4;
64 const int kProfileRoundedCornerRadius = 2; 66 const int kProfileRoundedCornerRadius = 2;
65 const int kUserIconSize = 27; 67 const int kUserIconSize = 27;
66 const int kUserLabelToIconPadding = 5; 68 const int kUserLabelToIconPadding = 5;
67 69
70 // When a hover border is used, it is starting this many pixels before the icon
71 // position.
72 const int kTrayUserTileHoverBorderInset = 10;
73
74 // The border color of the user button.
75 const SkColor kBorderColor = 0xffdcdcdc;
76
68 // The invisible word joiner character, used as a marker to indicate the start 77 // The invisible word joiner character, used as a marker to indicate the start
69 // and end of the user's display name in the public account user card's text. 78 // and end of the user's display name in the public account user card's text.
70 const char16 kDisplayNameMark[] = { 0x2060, 0 }; 79 const char16 kDisplayNameMark[] = { 0x2060, 0 };
71 80
72 const int kPublicAccountLogoutButtonBorderImagesNormal[] = { 81 const int kPublicAccountLogoutButtonBorderImagesNormal[] = {
73 IDR_AURA_TRAY_POPUP_PUBLIC_ACCOUNT_LOGOUT_BUTTON_BORDER, 82 IDR_AURA_TRAY_POPUP_PUBLIC_ACCOUNT_LOGOUT_BUTTON_BORDER,
74 IDR_AURA_TRAY_POPUP_LABEL_BUTTON_NORMAL_BACKGROUND, 83 IDR_AURA_TRAY_POPUP_LABEL_BUTTON_NORMAL_BACKGROUND,
75 IDR_AURA_TRAY_POPUP_LABEL_BUTTON_NORMAL_BACKGROUND, 84 IDR_AURA_TRAY_POPUP_LABEL_BUTTON_NORMAL_BACKGROUND,
76 IDR_AURA_TRAY_POPUP_PUBLIC_ACCOUNT_LOGOUT_BUTTON_BORDER, 85 IDR_AURA_TRAY_POPUP_PUBLIC_ACCOUNT_LOGOUT_BUTTON_BORDER,
77 IDR_AURA_TRAY_POPUP_LABEL_BUTTON_NORMAL_BACKGROUND, 86 IDR_AURA_TRAY_POPUP_LABEL_BUTTON_NORMAL_BACKGROUND,
(...skipping 19 matching lines...) Expand all
97 106
98 namespace ash { 107 namespace ash {
99 namespace internal { 108 namespace internal {
100 109
101 namespace tray { 110 namespace tray {
102 111
103 // A custom image view with rounded edges. 112 // A custom image view with rounded edges.
104 class RoundedImageView : public views::View { 113 class RoundedImageView : public views::View {
105 public: 114 public:
106 // Constructs a new rounded image view with rounded corners of radius 115 // Constructs a new rounded image view with rounded corners of radius
107 // |corner_radius|. 116 // |corner_radius|. If |active_user| is set, the icon will be drawn in
108 explicit RoundedImageView(int corner_radius); 117 // full colors - otherwise it will fade into the background.
118 RoundedImageView(int corner_radius, bool active_user);
109 virtual ~RoundedImageView(); 119 virtual ~RoundedImageView();
110 120
111 // Set the image that should be displayed. The image contents is copied to the 121 // Set the image that should be displayed. The image contents is copied to the
112 // receiver's image. 122 // receiver's image.
113 void SetImage(const gfx::ImageSkia& img, const gfx::Size& size); 123 void SetImage(const gfx::ImageSkia& img, const gfx::Size& size);
114 124
115 private: 125 private:
116 // Overridden from views::View. 126 // Overridden from views::View.
117 virtual gfx::Size GetPreferredSize() OVERRIDE; 127 virtual gfx::Size GetPreferredSize() OVERRIDE;
118 virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE; 128 virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE;
119 129
120 gfx::ImageSkia image_; 130 gfx::ImageSkia image_;
121 gfx::ImageSkia resized_; 131 gfx::ImageSkia resized_;
122 gfx::Size image_size_; 132 gfx::Size image_size_;
123 int corner_radius_; 133 int corner_radius_;
124 134
135 // True if the given user is the active user and the icon should get
136 // painted as active.
137 bool active_user_;
138
125 DISALLOW_COPY_AND_ASSIGN(RoundedImageView); 139 DISALLOW_COPY_AND_ASSIGN(RoundedImageView);
126 }; 140 };
127 141
128 class ClickableAvatar : public views::CustomButton {
129 public:
130 ClickableAvatar(views::ButtonListener* listener,
131 ash::user::LoginStatus login);
132 virtual ~ClickableAvatar();
133
134 private:
135 DISALLOW_COPY_AND_ASSIGN(ClickableAvatar);
136 };
137
138 // The user details shown in public account mode. This is essentially a label 142 // The user details shown in public account mode. This is essentially a label
139 // but with custom painting code as the text is styled with multiple colors and 143 // but with custom painting code as the text is styled with multiple colors and
140 // contains a link. 144 // contains a link.
141 class PublicAccountUserDetails : public views::View, 145 class PublicAccountUserDetails : public views::View,
142 public views::LinkListener { 146 public views::LinkListener {
143 public: 147 public:
144 PublicAccountUserDetails(SystemTrayItem* owner, int used_width); 148 PublicAccountUserDetails(SystemTrayItem* owner, int used_width);
145 virtual ~PublicAccountUserDetails(); 149 virtual ~PublicAccountUserDetails();
146 150
147 private: 151 private:
(...skipping 11 matching lines...) Expand all
159 void CalculatePreferredSize(SystemTrayItem* owner, int used_width); 163 void CalculatePreferredSize(SystemTrayItem* owner, int used_width);
160 164
161 base::string16 text_; 165 base::string16 text_;
162 views::Link* learn_more_; 166 views::Link* learn_more_;
163 gfx::Size preferred_size_; 167 gfx::Size preferred_size_;
164 ScopedVector<gfx::RenderText> lines_; 168 ScopedVector<gfx::RenderText> lines_;
165 169
166 DISALLOW_COPY_AND_ASSIGN(PublicAccountUserDetails); 170 DISALLOW_COPY_AND_ASSIGN(PublicAccountUserDetails);
167 }; 171 };
168 172
173 // The button which holds the user card in case of multi profile.
174 class UserCard : public views::CustomButton {
175 public:
176 UserCard(views::ButtonListener* listener, bool active_user);
177 virtual ~UserCard();
178
179 // Overridden from views::View
180 virtual void OnMouseEntered(const ui::MouseEvent& event) OVERRIDE;
181 virtual void OnMouseExited(const ui::MouseEvent& event) OVERRIDE;
182
183 private:
184 // Change the hover/active state of the "button".
185 void ShowActive(bool active);
186
187 // True if this is the active user.
188 bool is_active_user_;
189 DISALLOW_COPY_AND_ASSIGN(UserCard);
190 };
191
169 class UserView : public views::View, 192 class UserView : public views::View,
170 public views::ButtonListener { 193 public views::ButtonListener {
171 public: 194 public:
172 explicit UserView(SystemTrayItem* owner, ash::user::LoginStatus login); 195 UserView(SystemTrayItem* owner,
196 ash::user::LoginStatus login,
197 MultiProfileIndex index);
173 virtual ~UserView(); 198 virtual ~UserView();
174 199
175 private: 200 private:
176 // Overridden from views::View. 201 // Overridden from views::View.
177 virtual gfx::Size GetPreferredSize() OVERRIDE; 202 virtual gfx::Size GetPreferredSize() OVERRIDE;
178 virtual int GetHeightForWidth(int width) OVERRIDE; 203 virtual int GetHeightForWidth(int width) OVERRIDE;
179 virtual void Layout() OVERRIDE; 204 virtual void Layout() OVERRIDE;
180 205
181 // Overridden from views::ButtonListener. 206 // Overridden from views::ButtonListener.
182 virtual void ButtonPressed(views::Button* sender, 207 virtual void ButtonPressed(views::Button* sender,
183 const ui::Event& event) OVERRIDE; 208 const ui::Event& event) OVERRIDE;
184 209
185 void AddLogoutButton(ash::user::LoginStatus login); 210 void AddLogoutButton(ash::user::LoginStatus login);
186 void AddUserCard(SystemTrayItem* owner, ash::user::LoginStatus login); 211 void AddUserCard(SystemTrayItem* owner, ash::user::LoginStatus login);
187 212
213 // Create a user icon representation for the user card.
214 views::View* CreateIconForUserCard(ash::user::LoginStatus login);
215
216 // Create the additional user card content for the retail logged in mode.
217 void AddLoggedInRetailModeUserCardContent();
218
219 // Create the additional user card content for the public mode.
220 void AddLoggedInPublicModeUserCardContent(SystemTrayItem* owner);
221
222 MultiProfileIndex multiprofile_index_;
188 views::View* user_card_; 223 views::View* user_card_;
189 views::View* logout_button_; 224 views::View* logout_button_;
190 ClickableAvatar* profile_picture_;
191 225
192 DISALLOW_COPY_AND_ASSIGN(UserView); 226 DISALLOW_COPY_AND_ASSIGN(UserView);
193 }; 227 };
194 228
195 RoundedImageView::RoundedImageView(int corner_radius) 229 RoundedImageView::RoundedImageView(int corner_radius, bool active_user)
196 : corner_radius_(corner_radius) {} 230 : corner_radius_(corner_radius),
231 active_user_(active_user) {}
197 232
198 RoundedImageView::~RoundedImageView() {} 233 RoundedImageView::~RoundedImageView() {}
199 234
200 void RoundedImageView::SetImage(const gfx::ImageSkia& img, 235 void RoundedImageView::SetImage(const gfx::ImageSkia& img,
201 const gfx::Size& size) { 236 const gfx::Size& size) {
202 image_ = img; 237 image_ = img;
203 image_size_ = size; 238 image_size_ = size;
204 239
205 // Try to get the best image quality for the avatar. 240 // Try to get the best image quality for the avatar.
206 resized_ = gfx::ImageSkiaOperations::CreateResizedImage(image_, 241 resized_ = gfx::ImageSkiaOperations::CreateResizedImage(image_,
(...skipping 12 matching lines...) Expand all
219 void RoundedImageView::OnPaint(gfx::Canvas* canvas) { 254 void RoundedImageView::OnPaint(gfx::Canvas* canvas) {
220 View::OnPaint(canvas); 255 View::OnPaint(canvas);
221 gfx::Rect image_bounds(size()); 256 gfx::Rect image_bounds(size());
222 image_bounds.ClampToCenteredSize(GetPreferredSize()); 257 image_bounds.ClampToCenteredSize(GetPreferredSize());
223 image_bounds.Inset(GetInsets()); 258 image_bounds.Inset(GetInsets());
224 const SkScalar kRadius = SkIntToScalar(corner_radius_); 259 const SkScalar kRadius = SkIntToScalar(corner_radius_);
225 SkPath path; 260 SkPath path;
226 path.addRoundRect(gfx::RectToSkRect(image_bounds), kRadius, kRadius); 261 path.addRoundRect(gfx::RectToSkRect(image_bounds), kRadius, kRadius);
227 SkPaint paint; 262 SkPaint paint;
228 paint.setAntiAlias(true); 263 paint.setAntiAlias(true);
229 paint.setXfermodeMode(SkXfermode::kSrcOver_Mode); 264 paint.setXfermodeMode(active_user_ ? SkXfermode::kSrcOver_Mode :
265 SkXfermode::kLuminosity_Mode);
230 canvas->DrawImageInPath(resized_, image_bounds.x(), image_bounds.y(), 266 canvas->DrawImageInPath(resized_, image_bounds.x(), image_bounds.y(),
231 path, paint); 267 path, paint);
232 } 268 }
233 269
234 ClickableAvatar::ClickableAvatar(views::ButtonListener* listener,
235 ash::user::LoginStatus login)
236 : views::CustomButton(listener) {
237 SetLayoutManager(new views::FillLayout());
238 RoundedImageView* user_picture =
239 new RoundedImageView(kProfileRoundedCornerRadius);
240 if (login == ash::user::LOGGED_IN_GUEST) {
241 user_picture->SetImage(*ui::ResourceBundle::GetSharedInstance().
242 GetImageNamed(IDR_AURA_UBER_TRAY_GUEST_ICON).ToImageSkia(),
243 gfx::Size(kUserIconSize, kUserIconSize));
244 } else {
245 user_picture->SetImage(
246 ash::Shell::GetInstance()->system_tray_delegate()->GetUserImage(),
247 gfx::Size(kUserIconSize, kUserIconSize));
248 }
249 AddChildView(user_picture);
250 }
251
252 ClickableAvatar::~ClickableAvatar() {}
253
254 PublicAccountUserDetails::PublicAccountUserDetails(SystemTrayItem* owner, 270 PublicAccountUserDetails::PublicAccountUserDetails(SystemTrayItem* owner,
255 int used_width) 271 int used_width)
256 : learn_more_(NULL) { 272 : learn_more_(NULL) {
257 const int inner_padding = 273 const int inner_padding =
258 kTrayPopupPaddingHorizontal - kTrayPopupPaddingBetweenItems; 274 kTrayPopupPaddingHorizontal - kTrayPopupPaddingBetweenItems;
259 const bool rtl = base::i18n::IsRTL(); 275 const bool rtl = base::i18n::IsRTL();
260 set_border(views::Border::CreateEmptyBorder( 276 set_border(views::Border::CreateEmptyBorder(
261 kUserDetailsVerticalPadding, rtl ? 0 : inner_padding, 277 kUserDetailsVerticalPadding, rtl ? 0 : inner_padding,
262 kUserDetailsVerticalPadding, rtl ? inner_padding : 0)); 278 kUserDetailsVerticalPadding, rtl ? inner_padding : 0));
263 279
264 ash::SystemTrayDelegate* delegate =
265 ash::Shell::GetInstance()->system_tray_delegate();
266 // Retrieve the user's display name and wrap it with markers. 280 // Retrieve the user's display name and wrap it with markers.
267 base::string16 display_name = delegate->GetUserDisplayName(); 281 // Note that since this is a public account it always has to be the primary
282 // user.
283 base::string16 display_name =
284 ash::Shell::GetInstance()->session_state_delegate()->
285 GetUserDisplayName(0);
268 RemoveChars(display_name, kDisplayNameMark, &display_name); 286 RemoveChars(display_name, kDisplayNameMark, &display_name);
269 display_name = kDisplayNameMark[0] + display_name + kDisplayNameMark[0]; 287 display_name = kDisplayNameMark[0] + display_name + kDisplayNameMark[0];
270 // Retrieve the domain managing the device and wrap it with markers. 288 // Retrieve the domain managing the device and wrap it with markers.
271 base::string16 domain = UTF8ToUTF16(delegate->GetEnterpriseDomain()); 289 base::string16 domain = UTF8ToUTF16(
290 ash::Shell::GetInstance()->system_tray_delegate()->GetEnterpriseDomain());
272 RemoveChars(domain, kDisplayNameMark, &domain); 291 RemoveChars(domain, kDisplayNameMark, &domain);
273 base::i18n::WrapStringWithLTRFormatting(&domain); 292 base::i18n::WrapStringWithLTRFormatting(&domain);
274 // Retrieve the label text, inserting the display name and domain. 293 // Retrieve the label text, inserting the display name and domain.
275 text_ = l10n_util::GetStringFUTF16(IDS_ASH_STATUS_TRAY_PUBLIC_LABEL, 294 text_ = l10n_util::GetStringFUTF16(IDS_ASH_STATUS_TRAY_PUBLIC_LABEL,
276 display_name, domain); 295 display_name, domain);
277 296
278 learn_more_ = new views::Link(l10n_util::GetStringUTF16(IDS_ASH_LEARN_MORE)); 297 learn_more_ = new views::Link(l10n_util::GetStringUTF16(IDS_ASH_LEARN_MORE));
279 learn_more_->SetUnderline(false); 298 learn_more_->SetUnderline(false);
280 learn_more_->set_listener(this); 299 learn_more_->set_listener(this);
281 AddChildView(learn_more_); 300 AddChildView(learn_more_);
282 301
283 CalculatePreferredSize(owner, used_width); 302 CalculatePreferredSize(owner, used_width);
284 } 303 }
285 304
286 PublicAccountUserDetails::~PublicAccountUserDetails() {} 305 PublicAccountUserDetails::~PublicAccountUserDetails() {}
287 306
288 void PublicAccountUserDetails::Layout() { 307 void PublicAccountUserDetails::Layout() {
289 lines_.clear(); 308 lines_.clear();
290 const gfx::Rect contents_area = GetContentsBounds(); 309 const gfx::Rect contents_area = GetContentsBounds();
291 if (contents_area.IsEmpty()) 310 if (contents_area.IsEmpty())
292 return; 311 return;
293 312
294 // Word-wrap the label text. 313 // Word-wrap the label text.
295 const gfx::Font font; 314 const gfx::Font font;
296 std::vector<base::string16> lines; 315 std::vector<base::string16> lines;
297 ui::ElideRectangleText(text_, font, contents_area.width(), 316 ui::ElideRectangleText(text_, font, contents_area.width(),
298 contents_area.height(), ui::ELIDE_LONG_WORDS, &lines); 317 contents_area.height(), ui::ELIDE_LONG_WORDS, &lines);
299 // Loop through the lines, creating a renderer for each. 318 // Loop through the lines, creating a renderer for each.
300 gfx::Point position = contents_area.origin(); 319 gfx::Point position = contents_area.origin();
301 ui::Range display_name(ui::Range::InvalidRange()); 320 ui::Range display_name(ui::Range::InvalidRange());
302 for (std::vector<base::string16>::const_iterator it = lines.begin(); 321 for (std::vector<base::string16>::const_iterator it = lines.begin();
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after
418 const int line_height = font.GetHeight(); 437 const int line_height = font.GetHeight();
419 const int link_extra_height = std::max( 438 const int link_extra_height = std::max(
420 link_size.height() - learn_more_->GetInsets().top() - line_height, 0); 439 link_size.height() - learn_more_->GetInsets().top() - line_height, 0);
421 preferred_size_ = gfx::Size( 440 preferred_size_ = gfx::Size(
422 min_width + insets.width(), 441 min_width + insets.width(),
423 line_count * line_height + link_extra_height + insets.height()); 442 line_count * line_height + link_extra_height + insets.height());
424 443
425 bubble_view->SetWidth(preferred_size_.width() + used_width); 444 bubble_view->SetWidth(preferred_size_.width() + used_width);
426 } 445 }
427 446
428 UserView::UserView(SystemTrayItem* owner, ash::user::LoginStatus login) 447 UserCard::UserCard(views::ButtonListener* listener, bool active_user)
429 : user_card_(NULL), 448 : CustomButton(listener),
430 logout_button_(NULL), 449 is_active_user_(active_user) {
431 profile_picture_(NULL) { 450 if (is_active_user_) {
451 set_background(
452 views::Background::CreateSolidBackground(kBackgroundColor));
453 ShowActive(false);
454 }
455 }
456
457 UserCard::~UserCard() {}
458
459 void UserCard::OnMouseEntered(const ui::MouseEvent& event) {
460 if (is_active_user_) {
461 background()->SetNativeControlColor(kHoverBackgroundColor);
462 ShowActive(true);
463 SchedulePaint();
464 }
465 }
466
467 void UserCard::OnMouseExited(const ui::MouseEvent& event) {
468 if (is_active_user_) {
469 background()->SetNativeControlColor(kBackgroundColor);
470 ShowActive(false);
471 SchedulePaint();
472 }
473 }
474
475 void UserCard::ShowActive(bool active) {
476 int width = active ? 1 : 0;
477 set_border(views::Border::CreateSolidSidedBorder(width, width, width, 1,
478 kBorderColor));
479 }
480
481 UserView::UserView(SystemTrayItem* owner,
482 ash::user::LoginStatus login,
483 MultiProfileIndex index)
484 : multiprofile_index_(index),
485 user_card_(NULL),
486 logout_button_(NULL) {
432 CHECK_NE(ash::user::LOGGED_IN_NONE, login); 487 CHECK_NE(ash::user::LOGGED_IN_NONE, login);
433 set_background(views::Background::CreateSolidBackground( 488 if (!index) {
434 login == ash::user::LOGGED_IN_PUBLIC ? kPublicAccountBackgroundColor : 489 // Only the logged in user will have a background. All other users will have
435 kBackgroundColor)); 490 // to allow the TrayPopupContainer highlighting the menu line.
491 set_background(views::Background::CreateSolidBackground(
492 login == ash::user::LOGGED_IN_PUBLIC ? kPublicAccountBackgroundColor :
493 kBackgroundColor));
494 }
436 SetLayoutManager(new views::BoxLayout(views::BoxLayout::kHorizontal, 0, 0, 495 SetLayoutManager(new views::BoxLayout(views::BoxLayout::kHorizontal, 0, 0,
437 kTrayPopupPaddingBetweenItems)); 496 kTrayPopupPaddingBetweenItems));
438 // The logout button must be added before the user card so that the user card 497 // The logout button must be added before the user card so that the user card
439 // can correctly calculate the remaining available width. 498 // can correctly calculate the remaining available width.
440 AddLogoutButton(login); 499 // Note that only the current multiprofile user gets a button.
500 AddLogoutButton(!multiprofile_index_ ? login : ash::user::LOGGED_IN_LOCKED);
441 AddUserCard(owner, login); 501 AddUserCard(owner, login);
442 } 502 }
443 503
444 UserView::~UserView() {} 504 UserView::~UserView() {}
445 505
446 gfx::Size UserView::GetPreferredSize() { 506 gfx::Size UserView::GetPreferredSize() {
447 gfx::Size size = views::View::GetPreferredSize(); 507 gfx::Size size = views::View::GetPreferredSize();
448 // Make sure the default user view item is at least as tall as the other 508 // Only the active user panel will be forced to a certain height.
449 // items. 509 if (!multiprofile_index_) {
450 size.set_height(std::max(size.height(), 510 size.set_height(std::max(size.height(),
451 kTrayPopupItemHeight + GetInsets().height())); 511 kTrayPopupItemHeight + GetInsets().height()));
512 }
452 return size; 513 return size;
453 } 514 }
454 515
455 int UserView::GetHeightForWidth(int width) { 516 int UserView::GetHeightForWidth(int width) {
456 return GetPreferredSize().height(); 517 return GetPreferredSize().height();
457 } 518 }
458 519
459 void UserView::Layout() { 520 void UserView::Layout() {
460 gfx::Rect contents_area(GetContentsBounds()); 521 gfx::Rect contents_area(GetContentsBounds());
461 if (user_card_ && logout_button_) { 522 if (user_card_ && logout_button_) {
462 // Give the logout button the space it requests. 523 // Give the logout button the space it requests.
463 gfx::Rect logout_area = contents_area; 524 gfx::Rect logout_area = contents_area;
464 logout_area.ClampToCenteredSize(logout_button_->GetPreferredSize()); 525 logout_area.ClampToCenteredSize(logout_button_->GetPreferredSize());
465 logout_area.set_x(contents_area.right() - logout_area.width()); 526 logout_area.set_x(contents_area.right() - logout_area.width());
466 logout_button_->SetBoundsRect(logout_area);
467 527
468 // Give the remaining space to the user card. 528 // Give the remaining space to the user card.
469 gfx::Rect user_card_area = contents_area; 529 gfx::Rect user_card_area = contents_area;
470 int remaining_width = contents_area.width() - 530 int remaining_width = contents_area.width() - logout_area.width();
471 (logout_area.width() + kTrayPopupPaddingBetweenItems); 531 if (ash::Shell::GetInstance()->delegate()->IsMultiProfilesEnabled()) {
472 user_card_area.set_width(std::max(0, remaining_width)); 532 // In multiprofile case |user_card_| and |logout_button_| have to have the
533 // same height.
534 int y = std::min(user_card_area.y(), logout_area.y());
535 int height = std::max(user_card_area.height(), logout_area.height());
536 logout_area.set_y(y);
537 logout_area.set_height(height);
538 user_card_area.set_y(y);
539 user_card_area.set_height(height);
540
541 // In multiprofile mode we have also to increase the size of the card by
542 // the size of the border to make it overlap with the logout button.
543 user_card_area.set_width(std::max(0, remaining_width + 1));
544
545 // To make the logout button symmetrical with the user card we also make
546 // the button longer by the same size the hover area in front of the icon
547 // got inset.
548 logout_area.set_width(logout_area.width() +
549 kTrayUserTileHoverBorderInset);
550 } else {
551 // In all other modes we have to make sure that there is enough spacing
552 // between the two.
553 remaining_width -= kTrayPopupPaddingBetweenItems;
554 }
473 user_card_->SetBoundsRect(user_card_area); 555 user_card_->SetBoundsRect(user_card_area);
556 logout_button_->SetBoundsRect(logout_area);
474 } else if (user_card_) { 557 } else if (user_card_) {
475 user_card_->SetBoundsRect(contents_area); 558 user_card_->SetBoundsRect(contents_area);
476 } else if (logout_button_) { 559 } else if (logout_button_) {
477 logout_button_->SetBoundsRect(contents_area); 560 logout_button_->SetBoundsRect(contents_area);
478 } 561 }
479 } 562 }
480 563
481 void UserView::ButtonPressed(views::Button* sender, const ui::Event& event) { 564 void UserView::ButtonPressed(views::Button* sender, const ui::Event& event) {
482 if (sender == logout_button_) { 565 if (sender == logout_button_) {
483 ash::Shell::GetInstance()->system_tray_delegate()->SignOut(); 566 ash::Shell::GetInstance()->system_tray_delegate()->SignOut();
484 } else if (sender == profile_picture_) { 567 } else if (sender == user_card_ &&
485 if (ash::Shell::GetInstance()->delegate()->IsMultiProfilesEnabled()) 568 ash::Shell::GetInstance()->delegate()->IsMultiProfilesEnabled()) {
486 ash::Shell::GetInstance()->system_tray_delegate()->ShowUserLogin(); 569 if (!multiprofile_index_) {
487 else 570 // TODO(skuhne): Need to add the images & adding logic here.
488 ash::Shell::GetInstance()->system_tray_delegate()->ChangeProfilePicture(); 571 // TODO(skuhne): Make sure that we do not offer an add when this mode is
572 // active.
573 // TODO(skuhne): Use IDS_ASH_STATUS_TRAY_SIGN_IN_ANOTHER_ACCOUNT as
574 // string.
575 const SessionStateDelegate* session_state_delegate =
576 ash::Shell::GetInstance()->session_state_delegate();
577 if (session_state_delegate->NumberOfLoggedInUsers() >=
578 session_state_delegate->GetMaximumNumberOfLoggedInUsers()) {
579 // TODO(skuhne): Use IDS_ASH_STATUS_TRAY_CAPTION_CANNOT_ADD_USER and
580 // IDS_ASH_STATUS_TRAY_MESSAGE_CANNOT_ADD_USER when showing the error
581 // message that no more users can be added.
582 } else {
583 ash::Shell::GetInstance()->system_tray_delegate()->ShowUserLogin();
584 }
585 } else {
586 ash::SessionStateDelegate* delegate =
587 ash::Shell::GetInstance()->session_state_delegate();
588 delegate->SwitchActiveUser(delegate->GetUserEmail(multiprofile_index_));
589 }
489 } else { 590 } else {
490 NOTREACHED(); 591 NOTREACHED();
491 } 592 }
492 } 593 }
493 594
494 void UserView::AddLogoutButton(ash::user::LoginStatus login) { 595 void UserView::AddLogoutButton(ash::user::LoginStatus login) {
495 // A user should not be able to modify logged-in state when screen is 596 // A user should not be able to modify logged-in state when screen is
496 // locked. 597 // locked.
497 if (login == ash::user::LOGGED_IN_LOCKED) 598 if (login == ash::user::LOGGED_IN_LOCKED)
498 return; 599 return;
(...skipping 15 matching lines...) Expand all
514 kPublicAccountLogoutButtonBorderImagesHovered)); 615 kPublicAccountLogoutButtonBorderImagesHovered));
515 border->SetPainter(false, views::Button::STATE_PRESSED, 616 border->SetPainter(false, views::Button::STATE_PRESSED,
516 views::Painter::CreateImageGridPainter( 617 views::Painter::CreateImageGridPainter(
517 kPublicAccountLogoutButtonBorderImagesHovered)); 618 kPublicAccountLogoutButtonBorderImagesHovered));
518 } 619 }
519 AddChildView(logout_button_); 620 AddChildView(logout_button_);
520 } 621 }
521 622
522 void UserView::AddUserCard(SystemTrayItem* owner, 623 void UserView::AddUserCard(SystemTrayItem* owner,
523 ash::user::LoginStatus login) { 624 ash::user::LoginStatus login) {
524 set_border(views::Border::CreateEmptyBorder(0, kTrayPopupPaddingHorizontal, 625 // Add padding around the panel.
525 0, kTrayPopupPaddingHorizontal)); 626 set_border(views::Border::CreateEmptyBorder(
627 kUserCardVerticalPadding, kTrayPopupPaddingHorizontal,
628 kUserCardVerticalPadding, kTrayPopupPaddingHorizontal));
526 629
527 user_card_ = new views::View(); 630 if (ash::Shell::GetInstance()->delegate()->IsMultiProfilesEnabled() &&
631 login != ash::user::LOGGED_IN_RETAIL_MODE) {
632 user_card_ = new UserCard(this, multiprofile_index_ == 0);
633 } else {
634 user_card_ = new views::View();
635 }
636
528 user_card_->SetLayoutManager(new views::BoxLayout( 637 user_card_->SetLayoutManager(new views::BoxLayout(
529 views::BoxLayout::kHorizontal, 0, kUserCardVerticalPadding, 638 views::BoxLayout::kHorizontal, 0, 0 , kTrayPopupPaddingBetweenItems));
530 kTrayPopupPaddingBetweenItems));
531 AddChildViewAt(user_card_, 0); 639 AddChildViewAt(user_card_, 0);
532 640
533 if (login == ash::user::LOGGED_IN_RETAIL_MODE) { 641 if (login == ash::user::LOGGED_IN_RETAIL_MODE) {
534 views::Label* details = new views::Label; 642 AddLoggedInRetailModeUserCardContent();
535 ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance();
536 details->SetText(
537 bundle.GetLocalizedString(IDS_ASH_STATUS_TRAY_KIOSK_LABEL));
538 details->set_border(views::Border::CreateEmptyBorder(0, 4, 0, 1));
539 details->SetHorizontalAlignment(gfx::ALIGN_LEFT);
540 user_card_->AddChildView(details);
541 return;
542 }
543 profile_picture_ = new ClickableAvatar(this, login);
544 user_card_->AddChildView(profile_picture_);
545
546 if (login == ash::user::LOGGED_IN_PUBLIC) {
547 user_card_->AddChildView(new PublicAccountUserDetails(
548 owner, GetPreferredSize().width() + kTrayPopupPaddingBetweenItems));
549 return; 643 return;
550 } 644 }
551 645
552 ash::SystemTrayDelegate* delegate = 646 // The entire user card should trigger hover (the inner items get disabled).
553 ash::Shell::GetInstance()->system_tray_delegate(); 647 user_card_->SetEnabled(true);
648
649 if (login == ash::user::LOGGED_IN_PUBLIC) {
650 AddLoggedInPublicModeUserCardContent(owner);
651 return;
652 }
653
654 views::View* icon = CreateIconForUserCard(login);
655 user_card_->AddChildView(icon);
656
657 // To allow the border to start before the icon, reduce the size before and
658 // add an inset to the icon to get the spacing.
659 if (multiprofile_index_ == 0 &&
660 ash::Shell::GetInstance()->delegate()->IsMultiProfilesEnabled()) {
661 icon->set_border(views::Border::CreateEmptyBorder(
662 0, kTrayUserTileHoverBorderInset, 0, 0));
663 set_border(views::Border::CreateEmptyBorder(
664 kUserCardVerticalPadding,
665 kTrayPopupPaddingHorizontal - kTrayUserTileHoverBorderInset,
666 kUserCardVerticalPadding,
667 kTrayPopupPaddingHorizontal));
668 }
669 ash::SessionStateDelegate* delegate =
670 ash::Shell::GetInstance()->session_state_delegate();
554 views::View* details = new views::View; 671 views::View* details = new views::View;
672 details->SetEnabled(false);
555 details->SetLayoutManager(new views::BoxLayout( 673 details->SetLayoutManager(new views::BoxLayout(
556 views::BoxLayout::kVertical, 0, kUserDetailsVerticalPadding, 0)); 674 views::BoxLayout::kVertical, 0, kUserDetailsVerticalPadding, 0));
675 views::Label* username = NULL;
676 ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance();
677 if (!multiprofile_index_) {
678 views::Label* username = new views::Label(
679 login == ash::user::LOGGED_IN_GUEST ?
680 bundle.GetLocalizedString(IDS_ASH_STATUS_TRAY_GUEST_LABEL) :
681 delegate->GetUserDisplayName(multiprofile_index_));
682 username->SetEnabled(false);
683 username->SetHorizontalAlignment(gfx::ALIGN_LEFT);
684 details->AddChildView(username);
685 }
557 686
558 ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance(); 687 views::Label* additional = NULL;
559 views::Label* username = new views::Label(
560 login == ash::user::LOGGED_IN_GUEST ?
561 bundle.GetLocalizedString(IDS_ASH_STATUS_TRAY_GUEST_LABEL) :
562 delegate->GetUserDisplayName());
563 username->SetHorizontalAlignment(gfx::ALIGN_LEFT);
564 details->AddChildView(username);
565
566 if (login != ash::user::LOGGED_IN_GUEST) { 688 if (login != ash::user::LOGGED_IN_GUEST) {
567 views::Label* additional = new views::Label(); 689 additional = new views::Label();
568 additional->SetText(login == ash::user::LOGGED_IN_LOCALLY_MANAGED ? 690 additional->SetText(login == ash::user::LOGGED_IN_LOCALLY_MANAGED ?
569 bundle.GetLocalizedString(IDS_ASH_STATUS_TRAY_LOCALLY_MANAGED_LABEL) : 691 bundle.GetLocalizedString(IDS_ASH_STATUS_TRAY_LOCALLY_MANAGED_LABEL) :
570 UTF8ToUTF16(delegate->GetUserEmail())); 692 UTF8ToUTF16(delegate->GetUserEmail(multiprofile_index_)));
571 693
572 additional->SetFont(bundle.GetFont(ui::ResourceBundle::SmallFont)); 694 additional->SetFont(bundle.GetFont(ui::ResourceBundle::SmallFont));
573 additional->SetHorizontalAlignment(gfx::ALIGN_LEFT); 695 additional->SetHorizontalAlignment(gfx::ALIGN_LEFT);
574 additional->SetEnabled(false); 696 additional->SetEnabled(false);
575 details->AddChildView(additional); 697 details->AddChildView(additional);
576 } 698 }
577 699
700 // Adjust text properties dependent on if it is an active or inactive user.
701 if (multiprofile_index_) {
702 // Fade the text of non active users to 50%.
703 SkColor text_color = additional->enabled_color();
704 text_color = SkColorSetA(text_color, SkColorGetA(text_color) / 2);
705 if (additional)
706 additional->SetDisabledColor(text_color);
707 if (username)
708 username->SetDisabledColor(text_color);
709 }
710
711 // Use a small font for email address if username exists as well.
712 if (username)
713 additional->SetFont(bundle.GetFont(ui::ResourceBundle::SmallFont));
714
578 user_card_->AddChildView(details); 715 user_card_->AddChildView(details);
579 } 716 }
580 717
718 views::View* UserView::CreateIconForUserCard(ash::user::LoginStatus login) {
719 RoundedImageView* icon = new RoundedImageView(kProfileRoundedCornerRadius,
720 multiprofile_index_ == 0);
721 icon->SetEnabled(false);
722 if (login == ash::user::LOGGED_IN_GUEST) {
723 icon->SetImage(*ui::ResourceBundle::GetSharedInstance().
724 GetImageNamed(IDR_AURA_UBER_TRAY_GUEST_ICON).ToImageSkia(),
725 gfx::Size(kUserIconSize, kUserIconSize));
726 } else {
727 icon->SetImage(
728 ash::Shell::GetInstance()->session_state_delegate()->
729 GetUserImage(multiprofile_index_),
730 gfx::Size(kUserIconSize, kUserIconSize));
731 }
732 return icon;
733 }
734
735 void UserView::AddLoggedInRetailModeUserCardContent() {
736 views::Label* details = new views::Label;
737 ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance();
738 details->SetText(
739 bundle.GetLocalizedString(IDS_ASH_STATUS_TRAY_KIOSK_LABEL));
740 details->set_border(views::Border::CreateEmptyBorder(0, 4, 0, 1));
741 details->SetHorizontalAlignment(gfx::ALIGN_LEFT);
742 user_card_->AddChildView(details);
743 }
744
745 void UserView::AddLoggedInPublicModeUserCardContent(SystemTrayItem* owner) {
746 user_card_->AddChildView(CreateIconForUserCard(ash::user::LOGGED_IN_PUBLIC));
747 user_card_->AddChildView(new PublicAccountUserDetails(
748 owner, GetPreferredSize().width() + kTrayPopupPaddingBetweenItems));
749 }
750
581 } // namespace tray 751 } // namespace tray
582 752
583 TrayUser::TrayUser(SystemTray* system_tray) 753 TrayUser::TrayUser(SystemTray* system_tray, MultiProfileIndex index)
584 : SystemTrayItem(system_tray), 754 : SystemTrayItem(system_tray),
755 multiprofile_index_(index),
585 user_(NULL), 756 user_(NULL),
586 layout_view_(NULL), 757 layout_view_(NULL),
587 avatar_(NULL), 758 avatar_(NULL),
588 label_(NULL) { 759 label_(NULL) {
589 Shell::GetInstance()->system_tray_notifier()->AddUserObserver(this); 760 Shell::GetInstance()->system_tray_notifier()->AddUserObserver(this);
590 } 761 }
591 762
592 TrayUser::~TrayUser() { 763 TrayUser::~TrayUser() {
593 Shell::GetInstance()->system_tray_notifier()->RemoveUserObserver(this); 764 Shell::GetInstance()->system_tray_notifier()->RemoveUserObserver(this);
594 } 765 }
595 766
596 views::View* TrayUser::CreateTrayView(user::LoginStatus status) { 767 views::View* TrayUser::CreateTrayView(user::LoginStatus status) {
597 CHECK(layout_view_ == NULL); 768 CHECK(layout_view_ == NULL);
769 // Only the current user gets an icon. All other users will only be
770 // represented in the tray menu.
771 if (multiprofile_index_)
772 return NULL;
773
598 layout_view_ = new views::View(); 774 layout_view_ = new views::View();
599 layout_view_->SetLayoutManager( 775 layout_view_->SetLayoutManager(
600 new views::BoxLayout(views::BoxLayout::kHorizontal, 776 new views::BoxLayout(views::BoxLayout::kHorizontal,
601 0, 0, kUserLabelToIconPadding)); 777 0, 0, kUserLabelToIconPadding));
602 UpdateAfterLoginStatusChange(status); 778 UpdateAfterLoginStatusChange(status);
603 return layout_view_; 779 return layout_view_;
604 } 780 }
605 781
606 views::View* TrayUser::CreateDefaultView(user::LoginStatus status) { 782 views::View* TrayUser::CreateDefaultView(user::LoginStatus status) {
607 if (status == user::LOGGED_IN_NONE) 783 if (status == user::LOGGED_IN_NONE)
608 return NULL; 784 return NULL;
609 785
610 CHECK(user_ == NULL); 786 CHECK(user_ == NULL);
611 user_ = new tray::UserView(this, status); 787
788 const SessionStateDelegate* session_state_delegate =
789 ash::Shell::GetInstance()->session_state_delegate();
790 int logged_in_users = session_state_delegate->NumberOfLoggedInUsers();
791
792 // If there are multiple users logged in, the users will be separated from the
793 // rest of the menu by a separator.
794 if (multiprofile_index_ ==
795 session_state_delegate->GetMaximumNumberOfLoggedInUsers() &&
796 logged_in_users > 1) {
797 return new views::View();
798 }
799
800 // Do not show more UserView's then there are logged in users.
801 if (multiprofile_index_ >= logged_in_users)
802 return NULL;;
803
804 user_ = new tray::UserView(this, status, multiprofile_index_);
612 return user_; 805 return user_;
613 } 806 }
614 807
615 views::View* TrayUser::CreateDetailedView(user::LoginStatus status) { 808 views::View* TrayUser::CreateDetailedView(user::LoginStatus status) {
616 return NULL; 809 return NULL;
617 } 810 }
618 811
619 void TrayUser::DestroyTrayView() { 812 void TrayUser::DestroyTrayView() {
620 layout_view_ = NULL; 813 layout_view_ = NULL;
621 avatar_ = NULL; 814 avatar_ = NULL;
622 label_ = NULL; 815 label_ = NULL;
623 } 816 }
624 817
625 void TrayUser::DestroyDefaultView() { 818 void TrayUser::DestroyDefaultView() {
626 user_ = NULL; 819 user_ = NULL;
627 } 820 }
628 821
629 void TrayUser::DestroyDetailedView() { 822 void TrayUser::DestroyDetailedView() {
630 } 823 }
631 824
632 void TrayUser::UpdateAfterLoginStatusChange(user::LoginStatus status) { 825 void TrayUser::UpdateAfterLoginStatusChange(user::LoginStatus status) {
633 CHECK(layout_view_); 826 // Only the active user is represented in the tray.
827 if (!layout_view_)
828 return;
634 bool need_label = false; 829 bool need_label = false;
635 bool need_avatar = false; 830 bool need_avatar = false;
636 switch (status) { 831 switch (status) {
637 case user::LOGGED_IN_LOCKED: 832 case user::LOGGED_IN_LOCKED:
638 case user::LOGGED_IN_USER: 833 case user::LOGGED_IN_USER:
639 case user::LOGGED_IN_OWNER: 834 case user::LOGGED_IN_OWNER:
640 case user::LOGGED_IN_PUBLIC: 835 case user::LOGGED_IN_PUBLIC:
641 need_avatar = true; 836 need_avatar = true;
642 break; 837 break;
643 case user::LOGGED_IN_LOCALLY_MANAGED: 838 case user::LOGGED_IN_LOCALLY_MANAGED:
(...skipping 13 matching lines...) Expand all
657 (need_label != (label_ != NULL))) { 852 (need_label != (label_ != NULL))) {
658 layout_view_->RemoveAllChildViews(true); 853 layout_view_->RemoveAllChildViews(true);
659 if (need_label) { 854 if (need_label) {
660 label_ = new views::Label; 855 label_ = new views::Label;
661 SetupLabelForTray(label_); 856 SetupLabelForTray(label_);
662 layout_view_->AddChildView(label_); 857 layout_view_->AddChildView(label_);
663 } else { 858 } else {
664 label_ = NULL; 859 label_ = NULL;
665 } 860 }
666 if (need_avatar) { 861 if (need_avatar) {
667 avatar_ = new tray::RoundedImageView(kProfileRoundedCornerRadius); 862 avatar_ = new tray::RoundedImageView(kProfileRoundedCornerRadius, true);
668 layout_view_->AddChildView(avatar_); 863 layout_view_->AddChildView(avatar_);
669 } else { 864 } else {
670 avatar_ = NULL; 865 avatar_ = NULL;
671 } 866 }
672 } 867 }
673 868
674 ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance(); 869 ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance();
675 if (status == user::LOGGED_IN_LOCALLY_MANAGED) { 870 if (status == user::LOGGED_IN_LOCALLY_MANAGED) {
676 label_->SetText( 871 label_->SetText(
677 bundle.GetLocalizedString(IDS_ASH_STATUS_TRAY_LOCALLY_MANAGED_LABEL)); 872 bundle.GetLocalizedString(IDS_ASH_STATUS_TRAY_LOCALLY_MANAGED_LABEL));
678 } 873 }
679 874
680 if (avatar_) { 875 if (avatar_) {
681 if (status == user::LOGGED_IN_GUEST) { 876 if (status == user::LOGGED_IN_GUEST) {
682 avatar_->SetImage(*ui::ResourceBundle::GetSharedInstance(). 877 avatar_->SetImage(*ui::ResourceBundle::GetSharedInstance().
683 GetImageNamed(IDR_AURA_UBER_TRAY_GUEST_ICON).ToImageSkia(), 878 GetImageNamed(IDR_AURA_UBER_TRAY_GUEST_ICON).ToImageSkia(),
684 gfx::Size(kUserIconSize, kUserIconSize)); 879 gfx::Size(kUserIconSize, kUserIconSize));
685 } else { 880 } else {
686 avatar_->SetImage( 881 avatar_->SetImage(
687 ash::Shell::GetInstance()->system_tray_delegate()->GetUserImage(), 882 ash::Shell::GetInstance()->session_state_delegate()->GetUserImage(
883 multiprofile_index_),
688 gfx::Size(kUserIconSize, kUserIconSize)); 884 gfx::Size(kUserIconSize, kUserIconSize));
689 } 885 }
690 } 886 }
691 } 887 }
692 888
693 void TrayUser::UpdateAfterShelfAlignmentChange(ShelfAlignment alignment) { 889 void TrayUser::UpdateAfterShelfAlignmentChange(ShelfAlignment alignment) {
694 CHECK(layout_view_); 890 // Inactive users won't have a layout.
891 if (!layout_view_)
892 return;
695 if (alignment == SHELF_ALIGNMENT_BOTTOM || 893 if (alignment == SHELF_ALIGNMENT_BOTTOM ||
696 alignment == SHELF_ALIGNMENT_TOP) { 894 alignment == SHELF_ALIGNMENT_TOP) {
697 if (avatar_) { 895 if (avatar_) {
698 avatar_->set_border(views::Border::CreateEmptyBorder( 896 avatar_->set_border(views::Border::CreateEmptyBorder(
699 0, kTrayImageItemHorizontalPaddingBottomAlignment + 2, 897 0, kTrayImageItemHorizontalPaddingBottomAlignment + 2,
700 0, kTrayImageItemHorizontalPaddingBottomAlignment)); 898 0, kTrayImageItemHorizontalPaddingBottomAlignment));
701 899
702 } 900 }
703 if (label_) { 901 if (label_) {
704 label_->set_border(views::Border::CreateEmptyBorder( 902 label_->set_border(views::Border::CreateEmptyBorder(
(...skipping 16 matching lines...) Expand all
721 layout_view_->SetLayoutManager( 919 layout_view_->SetLayoutManager(
722 new views::BoxLayout(views::BoxLayout::kVertical, 920 new views::BoxLayout(views::BoxLayout::kVertical,
723 0, 0, kUserLabelToIconPadding)); 921 0, 0, kUserLabelToIconPadding));
724 } 922 }
725 } 923 }
726 924
727 void TrayUser::OnUserUpdate() { 925 void TrayUser::OnUserUpdate() {
728 // Check for null to avoid crbug.com/150944. 926 // Check for null to avoid crbug.com/150944.
729 if (avatar_) { 927 if (avatar_) {
730 avatar_->SetImage( 928 avatar_->SetImage(
731 ash::Shell::GetInstance()->system_tray_delegate()->GetUserImage(), 929 ash::Shell::GetInstance()->session_state_delegate()->GetUserImage(
930 multiprofile_index_),
732 gfx::Size(kUserIconSize, kUserIconSize)); 931 gfx::Size(kUserIconSize, kUserIconSize));
733 } 932 }
734 } 933 }
735 934
736 } // namespace internal 935 } // namespace internal
737 } // namespace ash 936 } // namespace ash
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698