tray_user.cc revision c5cede9ae108bb15f6b7a8aea21c7e1fefa2834c
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/user/tray_user.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <algorithm>
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <climits>
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <vector>
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "ash/ash_switches.h"
125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ash/metrics/user_metrics_recorder.h"
134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "ash/multi_profile_uma.h"
1490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "ash/popup_message.h"
153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "ash/root_window_controller.h"
1690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "ash/session_state_delegate.h"
173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "ash/shelf/shelf_layout_manager.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/shell.h"
19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ash/shell_delegate.h"
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/system/tray/system_tray.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/tray/system_tray_delegate.h"
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/system/tray/system_tray_notifier.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/tray/tray_constants.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/tray/tray_item_view.h"
25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ash/system/tray/tray_popup_label_button.h"
26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ash/system/tray/tray_popup_label_button_border.h"
27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ash/system/tray/tray_utils.h"
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/i18n/rtl.h"
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/logging.h"
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/scoped_vector.h"
31868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string16.h"
32868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h"
33868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "grit/ash_resources.h"
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/ash_strings.h"
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "skia/ext/image_operations.h"
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/skia/include/core/SkCanvas.h"
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/skia/include/core/SkPaint.h"
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/skia/include/core/SkPath.h"
4090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "ui/aura/window.h"
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/resource/resource_bundle.h"
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/canvas.h"
44f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "ui/gfx/font_list.h"
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/image/image.h"
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/image/image_skia_operations.h"
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/insets.h"
4858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "ui/gfx/range/range.h"
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/rect.h"
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/render_text.h"
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/size.h"
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/skia_util.h"
5358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "ui/gfx/text_elider.h"
54f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "ui/gfx/text_utils.h"
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/border.h"
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/bubble/tray_bubble_view.h"
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/button/button.h"
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/controls/button/custom_button.h"
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/image_view.h"
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/label.h"
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/controls/link.h"
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/controls/link_listener.h"
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/layout/box_layout.h"
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/layout/fill_layout.h"
6590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "ui/views/mouse_watcher.h"
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/painter.h"
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/view.h"
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/widget.h"
69a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/wm/core/shadow_types.h"
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const int kUserDetailsVerticalPadding = 5;
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const int kUserCardVerticalPadding = 10;
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kProfileRoundedCornerRadius = 2;
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const int kUserIconSize = 27;
777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochconst int kUserIconLargeSize = 32;
787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochconst int kUserIconLargeCornerRadius = 2;
79b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)const int kUserLabelToIconPadding = 5;
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// When a hover border is used, it is starting this many pixels before the icon
8290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// position.
8390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)const int kTrayUserTileHoverBorderInset = 10;
8490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
8590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// The border color of the user button.
8690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)const SkColor kBorderColor = 0xffdcdcdc;
8790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// The invisible word joiner character, used as a marker to indicate the start
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// and end of the user's display name in the public account user card's text.
905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const base::char16 kDisplayNameMark[] = { 0x2060, 0 };
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const int kPublicAccountLogoutButtonBorderImagesNormal[] = {
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IDR_AURA_TRAY_POPUP_PUBLIC_ACCOUNT_LOGOUT_BUTTON_BORDER,
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IDR_AURA_TRAY_POPUP_LABEL_BUTTON_NORMAL_BACKGROUND,
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IDR_AURA_TRAY_POPUP_LABEL_BUTTON_NORMAL_BACKGROUND,
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IDR_AURA_TRAY_POPUP_PUBLIC_ACCOUNT_LOGOUT_BUTTON_BORDER,
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IDR_AURA_TRAY_POPUP_LABEL_BUTTON_NORMAL_BACKGROUND,
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IDR_AURA_TRAY_POPUP_LABEL_BUTTON_NORMAL_BACKGROUND,
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IDR_AURA_TRAY_POPUP_PUBLIC_ACCOUNT_LOGOUT_BUTTON_BORDER,
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IDR_AURA_TRAY_POPUP_LABEL_BUTTON_NORMAL_BACKGROUND,
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IDR_AURA_TRAY_POPUP_LABEL_BUTTON_NORMAL_BACKGROUND,
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const int kPublicAccountLogoutButtonBorderImagesHovered[] = {
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IDR_AURA_TRAY_POPUP_PUBLIC_ACCOUNT_LOGOUT_BUTTON_BORDER,
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IDR_AURA_TRAY_POPUP_PUBLIC_ACCOUNT_LOGOUT_BUTTON_BORDER,
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IDR_AURA_TRAY_POPUP_PUBLIC_ACCOUNT_LOGOUT_BUTTON_BORDER,
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IDR_AURA_TRAY_POPUP_PUBLIC_ACCOUNT_LOGOUT_BUTTON_BORDER,
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IDR_AURA_TRAY_POPUP_LABEL_BUTTON_HOVER_BACKGROUND,
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IDR_AURA_TRAY_POPUP_PUBLIC_ACCOUNT_LOGOUT_BUTTON_BORDER,
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IDR_AURA_TRAY_POPUP_PUBLIC_ACCOUNT_LOGOUT_BUTTON_BORDER,
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IDR_AURA_TRAY_POPUP_PUBLIC_ACCOUNT_LOGOUT_BUTTON_BORDER,
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IDR_AURA_TRAY_POPUP_PUBLIC_ACCOUNT_LOGOUT_BUTTON_BORDER,
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Offsetting the popup message relative to the tray menu.
11790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)const int kPopupMessageOffset = 25;
11890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Switch to a user with the given |user_index|.
1204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void SwitchUser(ash::MultiProfileIndex user_index) {
1211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Do not switch users when the log screen is presented.
1221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (ash::Shell::GetInstance()->session_state_delegate()->
1231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)          IsUserSessionBlocked())
1241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    return;
1251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  DCHECK(user_index > 0);
1274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ash::SessionStateDelegate* delegate =
1284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      ash::Shell::GetInstance()->session_state_delegate();
1294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ash::MultiProfileUMA::RecordSwitchActiveUser(
1304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      ash::MultiProfileUMA::SWITCH_ACTIVE_USER_BY_TRAY);
1318bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  delegate->SwitchActiveUser(delegate->GetUserID(user_index));
1324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
1334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ash {
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace tray {
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A custom image view with rounded edges.
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RoundedImageView : public views::View {
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Constructs a new rounded image view with rounded corners of radius
14390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // |corner_radius|. If |active_user| is set, the icon will be drawn in
14490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // full colors - otherwise it will fade into the background.
14590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  RoundedImageView(int corner_radius, bool active_user);
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~RoundedImageView();
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set the image that should be displayed. The image contents is copied to the
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // receiver's image.
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetImage(const gfx::ImageSkia& img, const gfx::Size& size);
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Set the radii of the corners independently.
1537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  void SetCornerRadii(int top_left,
1547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                      int top_right,
1557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                      int bottom_right,
1567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                      int bottom_left);
1577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overridden from views::View.
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual gfx::Size GetPreferredSize() OVERRIDE;
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE;
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::ImageSkia image_;
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::ImageSkia resized_;
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Size image_size_;
1667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  int corner_radius_[4];
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // True if the given user is the active user and the icon should get
16990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // painted as active.
17090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  bool active_user_;
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(RoundedImageView);
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// The user details shown in public account mode. This is essentially a label
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// but with custom painting code as the text is styled with multiple colors and
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// contains a link.
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class PublicAccountUserDetails : public views::View,
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 public views::LinkListener {
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PublicAccountUserDetails(SystemTrayItem* owner, int used_width);
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~PublicAccountUserDetails();
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Overridden from views::View.
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void Layout() OVERRIDE;
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual gfx::Size GetPreferredSize() OVERRIDE;
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE;
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Overridden from views::LinkListener.
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void LinkClicked(views::Link* source, int event_flags) OVERRIDE;
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Calculate a preferred size that ensures the label text and the following
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // link do not wrap over more than three lines in total for aesthetic reasons
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // if possible.
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void CalculatePreferredSize(SystemTrayItem* owner, int used_width);
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
198c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 text_;
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  views::Link* learn_more_;
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Size preferred_size_;
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedVector<gfx::RenderText> lines_;
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(PublicAccountUserDetails);
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
20690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// The button which holds the user card in case of multi profile.
20790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class UserCard : public views::CustomButton {
20890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public:
20990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  UserCard(views::ButtonListener* listener, bool active_user);
21090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual ~UserCard();
21190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
21290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Called when the border should remain even in the non highlighted state.
21390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void ForceBorderVisible(bool show);
21490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
21590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Overridden from views::View
21690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual void OnMouseEntered(const ui::MouseEvent& event) OVERRIDE;
21790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual void OnMouseExited(const ui::MouseEvent& event) OVERRIDE;
21890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
21990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Check if the item is hovered.
22090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  bool is_hovered_for_test() {return button_hovered_; }
22190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
22290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) private:
22390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Change the hover/active state of the "button" when the status changes.
22490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void ShowActive();
22590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
22690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // True if this is the active user.
22790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  bool is_active_user_;
22890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
22990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // True if button is hovered.
23090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  bool button_hovered_;
23190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
23290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // True if the border should be visible.
23390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  bool show_border_;
23490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
23590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(UserCard);
23690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)};
23790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
23890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class UserViewMouseWatcherHost : public views::MouseWatcherHost {
23990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)public:
24090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) explicit UserViewMouseWatcherHost(const gfx::Rect& screen_area)
24190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)     : screen_area_(screen_area) {}
24290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual ~UserViewMouseWatcherHost() {}
24390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
24490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Implementation of MouseWatcherHost.
24590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual bool Contains(const gfx::Point& screen_point,
24690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                       views::MouseWatcherHost::MouseEventType type) OVERRIDE {
24790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)   return screen_area_.Contains(screen_point);
24890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) }
24990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
25090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)private:
25190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) gfx::Rect screen_area_;
25290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
25390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(UserViewMouseWatcherHost);
25490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)};
25590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
25690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// The view of a user item.
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class UserView : public views::View,
25890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                 public views::ButtonListener,
25990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                 public views::MouseWatcherListener {
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
26190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  UserView(SystemTrayItem* owner,
26290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)           ash::user::LoginStatus login,
26390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)           MultiProfileIndex index);
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~UserView();
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Overridden from MouseWatcherListener:
26790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual void MouseMovedOutOfHost() OVERRIDE;
26890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
26990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  TrayUser::TestState GetStateForTest() const;
27090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  gfx::Rect GetBoundsInScreenOfUserButtonForTest();
27190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Overridden from views::View.
2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual gfx::Size GetPreferredSize() OVERRIDE;
275c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual int GetHeightForWidth(int width) OVERRIDE;
2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void Layout() OVERRIDE;
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Overridden from views::ButtonListener.
2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void ButtonPressed(views::Button* sender,
2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                             const ui::Event& event) OVERRIDE;
2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  void AddLogoutButton(user::LoginStatus login);
2834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  void AddUserCard(SystemTrayItem* owner, user::LoginStatus login);
2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
28590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Create a user icon representation for the user card.
2864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  views::View* CreateIconForUserCard(user::LoginStatus login);
28790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
28890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Create the additional user card content for the retail logged in mode.
28990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void AddLoggedInRetailModeUserCardContent();
29090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
29190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Create the additional user card content for the public mode.
29290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void AddLoggedInPublicModeUserCardContent(SystemTrayItem* owner);
29390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
29490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Create the menu option to add another user. If |disabled| is set the user
29590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // cannot actively click on the item.
29690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void ToggleAddUserMenuOption();
29790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
29868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Returns true when multi profile is supported.
29968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  bool SupportsMultiProfile();
30068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
30190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  MultiProfileIndex multiprofile_index_;
30290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // The view of the user card.
30390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  views::View* user_card_view_;
30490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
305868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // This is the owner system tray item of this view.
306868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SystemTrayItem* owner_;
307868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
30890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // True if |user_card_view_| is a |UserView| - otherwise it is only a
30990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // |views::View|.
31090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  bool is_user_card_;
3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  views::View* logout_button_;
3124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_ptr<PopupMessage> popup_message_;
31390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  scoped_ptr<views::Widget> add_menu_option_;
31490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
31590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // True when the add user panel is visible but not activatable.
31690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  bool add_user_visible_but_disabled_;
31790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
31890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // The mouse watcher which takes care of out of window hover events.
31990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  scoped_ptr<views::MouseWatcher> mouse_watcher_;
3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(UserView);
3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
32490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// The menu item view which gets shown when the user clicks in multi profile
32590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// mode onto the user item.
32690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class AddUserView : public views::CustomButton,
32790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                    public views::ButtonListener {
32890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public:
32990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // The |owner| is the view for which this view gets created. The |listener|
33090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // will get notified when this item gets clicked.
33190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  AddUserView(UserCard* owner, views::ButtonListener* listener);
33290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual ~AddUserView();
33390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
33490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Get the anchor view for a message.
33590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  views::View* anchor() { return anchor_; }
33690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
33790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Overridden from views::ButtonListener.
33890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual void ButtonPressed(views::Button* sender,
33990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                             const ui::Event& event) OVERRIDE;
34090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
34190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) private:
34290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Overridden from views::View.
34390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual gfx::Size GetPreferredSize() OVERRIDE;
34490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual int GetHeightForWidth(int width) OVERRIDE;
34590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual void Layout() OVERRIDE;
34690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
34790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Create the additional client content for this item.
34890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void AddContent();
34990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
35090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // This is the content we create and show.
35190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  views::View* add_user_;
35290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
35390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // This listener will get informed when someone clicks on this button.
35490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  views::ButtonListener* listener_;
35590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
35690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // This is the owner view of this item.
35790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  UserCard* owner_;
35890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
35990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // The anchor view for targetted bubble messages.
36090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  views::View* anchor_;
36190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
36290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(AddUserView);
36390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)};
36490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
36590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)RoundedImageView::RoundedImageView(int corner_radius, bool active_user)
3667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    : active_user_(active_user) {
3677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  for (int i = 0; i < 4; ++i)
3687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    corner_radius_[i] = corner_radius;
3697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)RoundedImageView::~RoundedImageView() {}
3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RoundedImageView::SetImage(const gfx::ImageSkia& img,
3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                const gfx::Size& size) {
3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  image_ = img;
3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  image_size_ = size;
3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Try to get the best image quality for the avatar.
3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  resized_ = gfx::ImageSkiaOperations::CreateResizedImage(image_,
3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      skia::ImageOperations::RESIZE_BEST, size);
3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (GetWidget() && visible()) {
3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PreferredSizeChanged();
3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SchedulePaint();
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid RoundedImageView::SetCornerRadii(int top_left,
3887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                      int top_right,
3897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                      int bottom_right,
3907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                      int bottom_left) {
3917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  corner_radius_[0] = top_left;
3927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  corner_radius_[1] = top_right;
3937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  corner_radius_[2] = bottom_right;
3947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  corner_radius_[3] = bottom_left;
3957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
3967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gfx::Size RoundedImageView::GetPreferredSize() {
3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return gfx::Size(image_size_.width() + GetInsets().width(),
3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   image_size_.height() + GetInsets().height());
4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RoundedImageView::OnPaint(gfx::Canvas* canvas) {
4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  View::OnPaint(canvas);
4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Rect image_bounds(size());
4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  image_bounds.ClampToCenteredSize(GetPreferredSize());
4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  image_bounds.Inset(GetInsets());
4077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  const SkScalar kRadius[8] = {
4087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    SkIntToScalar(corner_radius_[0]),
4097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    SkIntToScalar(corner_radius_[0]),
4107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    SkIntToScalar(corner_radius_[1]),
4117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    SkIntToScalar(corner_radius_[1]),
4127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    SkIntToScalar(corner_radius_[2]),
4137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    SkIntToScalar(corner_radius_[2]),
4147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    SkIntToScalar(corner_radius_[3]),
4157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    SkIntToScalar(corner_radius_[3])
4167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  };
4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SkPath path;
4187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  path.addRoundRect(gfx::RectToSkRect(image_bounds), kRadius);
4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SkPaint paint;
4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  paint.setAntiAlias(true);
42190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  paint.setXfermodeMode(active_user_ ? SkXfermode::kSrcOver_Mode :
42290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                       SkXfermode::kLuminosity_Mode);
4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  canvas->DrawImageInPath(resized_, image_bounds.x(), image_bounds.y(),
4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          path, paint);
4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)PublicAccountUserDetails::PublicAccountUserDetails(SystemTrayItem* owner,
4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                   int used_width)
4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : learn_more_(NULL) {
4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const int inner_padding =
4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      kTrayPopupPaddingHorizontal - kTrayPopupPaddingBetweenItems;
4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const bool rtl = base::i18n::IsRTL();
4335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  SetBorder(views::Border::CreateEmptyBorder(kUserDetailsVerticalPadding,
4345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                             rtl ? 0 : inner_padding,
4355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                             kUserDetailsVerticalPadding,
4365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                             rtl ? inner_padding : 0));
4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Retrieve the user's display name and wrap it with markers.
43990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Note that since this is a public account it always has to be the primary
44090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // user.
44190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::string16 display_name =
4424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      Shell::GetInstance()->session_state_delegate()->GetUserDisplayName(0);
443a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::RemoveChars(display_name, kDisplayNameMark, &display_name);
4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  display_name = kDisplayNameMark[0] + display_name + kDisplayNameMark[0];
4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Retrieve the domain managing the device and wrap it with markers.
4465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::string16 domain = base::UTF8ToUTF16(
4474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      Shell::GetInstance()->system_tray_delegate()->GetEnterpriseDomain());
448a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::RemoveChars(domain, kDisplayNameMark, &domain);
4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::i18n::WrapStringWithLTRFormatting(&domain);
4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Retrieve the label text, inserting the display name and domain.
4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  text_ = l10n_util::GetStringFUTF16(IDS_ASH_STATUS_TRAY_PUBLIC_LABEL,
4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                     display_name, domain);
4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  learn_more_ = new views::Link(l10n_util::GetStringUTF16(IDS_ASH_LEARN_MORE));
4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  learn_more_->SetUnderline(false);
4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  learn_more_->set_listener(this);
4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AddChildView(learn_more_);
4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CalculatePreferredSize(owner, used_width);
4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)PublicAccountUserDetails::~PublicAccountUserDetails() {}
4632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PublicAccountUserDetails::Layout() {
4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  lines_.clear();
4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const gfx::Rect contents_area = GetContentsBounds();
4672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (contents_area.IsEmpty())
46890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return;
4692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Word-wrap the label text.
471f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  const gfx::FontList font_list;
472c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::vector<base::string16> lines;
473f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  gfx::ElideRectangleText(text_, font_list, contents_area.width(),
47458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                          contents_area.height(), gfx::ELIDE_LONG_WORDS,
47558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                          &lines);
4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Loop through the lines, creating a renderer for each.
4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Point position = contents_area.origin();
47858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  gfx::Range display_name(gfx::Range::InvalidRange());
479c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  for (std::vector<base::string16>::const_iterator it = lines.begin();
4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       it != lines.end(); ++it) {
4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::RenderText* line = gfx::RenderText::CreateInstance();
4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    line->SetDirectionalityMode(gfx::DIRECTIONALITY_FROM_UI);
4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    line->SetText(*it);
4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const gfx::Size size(contents_area.width(), line->GetStringSize().height());
4852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    line->SetDisplayRect(gfx::Rect(position, size));
4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    position.set_y(position.y() + size.height());
4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Set the default text color for the line.
4892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    line->SetColor(kPublicAccountUserCardTextColor);
4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // If a range of the line contains the user's display name, apply a custom
4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // text color to it.
4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (display_name.is_empty())
4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      display_name.set_start(it->find(kDisplayNameMark));
4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!display_name.is_empty()) {
4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      display_name.set_end(
4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          it->find(kDisplayNameMark, display_name.start() + 1));
49858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      gfx::Range line_range(0, it->size());
4992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      line->ApplyColor(kPublicAccountUserCardNameColor,
5002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       display_name.Intersect(line_range));
5012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // Update the range for the next line.
5022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (display_name.end() >= line_range.end())
5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        display_name.set_start(0);
5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      else
50558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        display_name = gfx::Range::InvalidRange();
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    lines_.push_back(line);
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Position the link after the label text, separated by a space. If it does
5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // not fit onto the last line of the text, wrap the link onto its own line.
5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const gfx::Size last_line_size = lines_.back()->GetStringSize();
5145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const int space_width =
5155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      gfx::GetStringWidth(base::ASCIIToUTF16(" "), font_list);
5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const gfx::Size link_size = learn_more_->GetPreferredSize();
5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (contents_area.width() - last_line_size.width() >=
5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      space_width + link_size.width()) {
5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    position.set_x(position.x() + last_line_size.width() + space_width);
5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    position.set_y(position.y() - last_line_size.height());
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  position.set_y(position.y() - learn_more_->GetInsets().top());
5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Rect learn_more_bounds(position, link_size);
5242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  learn_more_bounds.Intersect(contents_area);
5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (base::i18n::IsRTL()) {
5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const gfx::Insets insets = GetInsets();
5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    learn_more_bounds.Offset(insets.right() - insets.left(), 0);
5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  learn_more_->SetBoundsRect(learn_more_bounds);
5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gfx::Size PublicAccountUserDetails::GetPreferredSize() {
5332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return preferred_size_;
5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PublicAccountUserDetails::OnPaint(gfx::Canvas* canvas) {
5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (ScopedVector<gfx::RenderText>::const_iterator it = lines_.begin();
5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       it != lines_.end(); ++it) {
5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    (*it)->Draw(canvas);
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  views::View::OnPaint(canvas);
5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PublicAccountUserDetails::LinkClicked(views::Link* source,
5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                           int event_flags) {
5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK_EQ(source, learn_more_);
5474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  Shell::GetInstance()->system_tray_delegate()->ShowPublicAccountInfo();
5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PublicAccountUserDetails::CalculatePreferredSize(SystemTrayItem* owner,
5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                      int used_width) {
552f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  const gfx::FontList font_list;
5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const gfx::Size link_size = learn_more_->GetPreferredSize();
5545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const int space_width =
5555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      gfx::GetStringWidth(base::ASCIIToUTF16(" "), font_list);
5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const gfx::Insets insets = GetInsets();
5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  views::TrayBubbleView* bubble_view =
5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      owner->system_tray()->GetSystemBubble()->bubble_view();
5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int min_width = std::max(
5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      link_size.width(),
5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      bubble_view->GetPreferredSize().width() - (used_width + insets.width()));
5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int max_width = std::min(
563f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      gfx::GetStringWidth(text_, font_list) + space_width + link_size.width(),
5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      bubble_view->GetMaximumSize().width() - (used_width + insets.width()));
5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Do a binary search for the minimum width that ensures no more than three
5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // lines are needed. The lower bound is the minimum of the current bubble
5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // width and the width of the link (as no wrapping is permitted inside the
5682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // link). The upper bound is the maximum of the largest allowed bubble width
5692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // and the sum of the label text and link widths when put on a single line.
570c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::vector<base::string16> lines;
5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  while (min_width < max_width) {
5722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    lines.clear();
5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const int width = (min_width + max_width) / 2;
574f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const bool too_narrow =
575f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        gfx::ElideRectangleText(text_, font_list, width, INT_MAX,
576f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                gfx::TRUNCATE_LONG_WORDS, &lines) != 0;
5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int line_count = lines.size();
5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!too_narrow && line_count == 3 &&
579f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        width - gfx::GetStringWidth(lines.back(), font_list) <=
580f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)            space_width + link_size.width())
5812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ++line_count;
5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (too_narrow || line_count > 3)
5832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      min_width = width + 1;
5842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    else
5852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      max_width = width;
5862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Calculate the corresponding height and set the preferred size.
5892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  lines.clear();
59058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  gfx::ElideRectangleText(
591f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      text_, font_list, min_width, INT_MAX, gfx::TRUNCATE_LONG_WORDS, &lines);
5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int line_count = lines.size();
593f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (min_width - gfx::GetStringWidth(lines.back(), font_list) <=
594f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          space_width + link_size.width()) {
5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ++line_count;
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
597f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  const int line_height = font_list.GetHeight();
5982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const int link_extra_height = std::max(
5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      link_size.height() - learn_more_->GetInsets().top() - line_height, 0);
6002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  preferred_size_ = gfx::Size(
6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      min_width + insets.width(),
6022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      line_count * line_height + link_extra_height + insets.height());
6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bubble_view->SetWidth(preferred_size_.width() + used_width);
6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
60790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)UserCard::UserCard(views::ButtonListener* listener, bool active_user)
60890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    : CustomButton(listener),
60990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      is_active_user_(active_user),
61090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      button_hovered_(false),
61190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      show_border_(false) {
61290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (is_active_user_) {
61390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    set_background(
61490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        views::Background::CreateSolidBackground(kBackgroundColor));
61590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    ShowActive();
61690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
61790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
61890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
61990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)UserCard::~UserCard() {}
62090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
62190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void UserCard::ForceBorderVisible(bool show) {
62290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  show_border_ = show;
62390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ShowActive();
62490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
62590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
62690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void UserCard::OnMouseEntered(const ui::MouseEvent& event) {
62790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (is_active_user_) {
62890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    button_hovered_ = true;
62990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    background()->SetNativeControlColor(kHoverBackgroundColor);
63090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    ShowActive();
63190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
63290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
63390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
63490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void UserCard::OnMouseExited(const ui::MouseEvent& event) {
63590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (is_active_user_) {
63690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    button_hovered_ = false;
63790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    background()->SetNativeControlColor(kBackgroundColor);
63890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    ShowActive();
63990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
64090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
64190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
64290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void UserCard::ShowActive() {
64390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  int width = button_hovered_ || show_border_ ? 1 : 0;
6445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  SetBorder(views::Border::CreateSolidSidedBorder(
6455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      width, width, width, 1, kBorderColor));
64690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  SchedulePaint();
64790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
64890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
64990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)UserView::UserView(SystemTrayItem* owner,
6504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                   user::LoginStatus login,
65190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                   MultiProfileIndex index)
65290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    : multiprofile_index_(index),
65390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      user_card_view_(NULL),
654868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      owner_(owner),
65590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      is_user_card_(false),
6562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      logout_button_(NULL),
65790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      add_user_visible_but_disabled_(false) {
6584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  CHECK_NE(user::LOGGED_IN_NONE, login);
65990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (!index) {
66090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // Only the logged in user will have a background. All other users will have
66190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // to allow the TrayPopupContainer highlighting the menu line.
66290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    set_background(views::Background::CreateSolidBackground(
6634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        login == user::LOGGED_IN_PUBLIC ? kPublicAccountBackgroundColor :
6644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                          kBackgroundColor));
66590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
6662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetLayoutManager(new views::BoxLayout(views::BoxLayout::kHorizontal, 0, 0,
6672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        kTrayPopupPaddingBetweenItems));
6682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The logout button must be added before the user card so that the user card
6692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // can correctly calculate the remaining available width.
67090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Note that only the current multiprofile user gets a button.
671d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  if (!multiprofile_index_)
672d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    AddLogoutButton(login);
6732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AddUserCard(owner, login);
6742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)UserView::~UserView() {}
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
67890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void UserView::MouseMovedOutOfHost() {
67990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  popup_message_.reset();
68090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  mouse_watcher_.reset();
68190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  add_menu_option_.reset();
68290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
68390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
68490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)TrayUser::TestState UserView::GetStateForTest() const {
68590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (add_menu_option_.get()) {
68690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return add_user_visible_but_disabled_ ? TrayUser::ACTIVE_BUT_DISABLED :
68790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                            TrayUser::ACTIVE;
68890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
68990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
69090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (!is_user_card_)
69190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return TrayUser::SHOWN;
69290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
69390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  return static_cast<UserCard*>(user_card_view_)->is_hovered_for_test() ?
69490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      TrayUser::HOVERED : TrayUser::SHOWN;
69590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
69690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
69790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)gfx::Rect UserView::GetBoundsInScreenOfUserButtonForTest() {
69890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DCHECK(user_card_view_);
69990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  return user_card_view_->GetBoundsInScreen();
70090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
70190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
7022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gfx::Size UserView::GetPreferredSize() {
7032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Size size = views::View::GetPreferredSize();
70490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Only the active user panel will be forced to a certain height.
70590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (!multiprofile_index_) {
7062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    size.set_height(std::max(size.height(),
7072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                             kTrayPopupItemHeight + GetInsets().height()));
7082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
7092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return size;
7102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
712c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)int UserView::GetHeightForWidth(int width) {
713c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return GetPreferredSize().height();
714c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
715c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
7162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void UserView::Layout() {
7172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Rect contents_area(GetContentsBounds());
71890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (user_card_view_ && logout_button_) {
7192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Give the logout button the space it requests.
7202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::Rect logout_area = contents_area;
7212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    logout_area.ClampToCenteredSize(logout_button_->GetPreferredSize());
7222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    logout_area.set_x(contents_area.right() - logout_area.width());
7232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Give the remaining space to the user card.
7252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::Rect user_card_area = contents_area;
72690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    int remaining_width = contents_area.width() - logout_area.width();
72768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    if (SupportsMultiProfile()) {
72890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      // In multiprofile case |user_card_view_| and |logout_button_| have to
72990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      // have the same height.
73090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      int y = std::min(user_card_area.y(), logout_area.y());
73190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      int height = std::max(user_card_area.height(), logout_area.height());
73290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      logout_area.set_y(y);
73390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      logout_area.set_height(height);
73490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      user_card_area.set_y(y);
73590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      user_card_area.set_height(height);
73690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
73790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      // In multiprofile mode we have also to increase the size of the card by
73890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      // the size of the border to make it overlap with the logout button.
73990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      user_card_area.set_width(std::max(0, remaining_width + 1));
74090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
74190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      // To make the logout button symmetrical with the user card we also make
74290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      // the button longer by the same size the hover area in front of the icon
74390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      // got inset.
74490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      logout_area.set_width(logout_area.width() +
74590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                            kTrayUserTileHoverBorderInset);
74690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    } else {
74790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      // In all other modes we have to make sure that there is enough spacing
74890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      // between the two.
74990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      remaining_width -= kTrayPopupPaddingBetweenItems;
75090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    }
751eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    user_card_area.set_width(remaining_width);
75290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    user_card_view_->SetBoundsRect(user_card_area);
75390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    logout_button_->SetBoundsRect(logout_area);
75490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  } else if (user_card_view_) {
75590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    user_card_view_->SetBoundsRect(contents_area);
7562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else if (logout_button_) {
7572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    logout_button_->SetBoundsRect(contents_area);
7582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
7592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void UserView::ButtonPressed(views::Button* sender, const ui::Event& event) {
762c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (sender == logout_button_) {
7635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    Shell::GetInstance()->metrics()->RecordUserMetricsAction(
7645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        ash::UMA_STATUS_AREA_SIGN_OUT);
7654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    Shell::GetInstance()->system_tray_delegate()->SignOut();
76668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  } else if (sender == user_card_view_ && SupportsMultiProfile()) {
76790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    if (!multiprofile_index_) {
76890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      ToggleAddUserMenuOption();
76990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    } else {
7704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      SwitchUser(multiprofile_index_);
771868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      // Since the user list is about to change the system menu should get
772868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      // closed.
773868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      owner_->system_tray()->CloseSystemBubble();
77490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    }
77590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  } else if (add_menu_option_.get() &&
77690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)             sender == add_menu_option_->GetContentsView()) {
77790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // Let the user add another account to the session.
7784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    MultiProfileUMA::RecordSigninUser(MultiProfileUMA::SIGNIN_USER_BY_TRAY);
7794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    Shell::GetInstance()->system_tray_delegate()->ShowUserLogin();
780a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    owner_->system_tray()->CloseSystemBubble();
781c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  } else {
7822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    NOTREACHED();
783c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
7842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void UserView::AddLogoutButton(user::LoginStatus login) {
7874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  const base::string16 title = user::GetLocalizedSignOutStringForStatus(login,
7884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                                                        true);
7892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TrayPopupLabelButton* logout_button = new TrayPopupLabelButton(this, title);
7902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  logout_button->SetAccessibleName(title);
7912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  logout_button_ = logout_button;
7922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // In public account mode, the logout button border has a custom color.
7934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (login == user::LOGGED_IN_PUBLIC) {
7945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    scoped_ptr<TrayPopupLabelButtonBorder> border(
7955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        new TrayPopupLabelButtonBorder());
7962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    border->SetPainter(false, views::Button::STATE_NORMAL,
7972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       views::Painter::CreateImageGridPainter(
7982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           kPublicAccountLogoutButtonBorderImagesNormal));
7992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    border->SetPainter(false, views::Button::STATE_HOVERED,
8002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       views::Painter::CreateImageGridPainter(
8012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           kPublicAccountLogoutButtonBorderImagesHovered));
8022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    border->SetPainter(false, views::Button::STATE_PRESSED,
8032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       views::Painter::CreateImageGridPainter(
8042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           kPublicAccountLogoutButtonBorderImagesHovered));
8055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    logout_button_->SetBorder(border.PassAs<views::Border>());
8062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
8072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AddChildView(logout_button_);
8082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void UserView::AddUserCard(SystemTrayItem* owner, user::LoginStatus login) {
81190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Add padding around the panel.
8125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  SetBorder(views::Border::CreateEmptyBorder(kUserCardVerticalPadding,
8135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                             kTrayPopupPaddingHorizontal,
8145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                             kUserCardVerticalPadding,
8155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                             kTrayPopupPaddingHorizontal));
8162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (SupportsMultiProfile() && login != user::LOGGED_IN_RETAIL_MODE) {
81890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    user_card_view_ = new UserCard(this, multiprofile_index_ == 0);
81990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    is_user_card_ = true;
82090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  } else {
82190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    user_card_view_ = new views::View();
82290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    is_user_card_ = false;
82390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
8242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
82590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  user_card_view_->SetLayoutManager(new views::BoxLayout(
82690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      views::BoxLayout::kHorizontal, 0, 0 , kTrayPopupPaddingBetweenItems));
82790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  AddChildViewAt(user_card_view_, 0);
8282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (login == user::LOGGED_IN_RETAIL_MODE) {
83090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    AddLoggedInRetailModeUserCardContent();
8312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
8322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
83390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
83490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // The entire user card should trigger hover (the inner items get disabled).
83590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  user_card_view_->SetEnabled(true);
83690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  user_card_view_->set_notify_enter_exit_on_child(true);
8372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (login == user::LOGGED_IN_PUBLIC) {
83990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    AddLoggedInPublicModeUserCardContent(owner);
8402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
8412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
8422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
84390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  views::View* icon = CreateIconForUserCard(login);
84490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  user_card_view_->AddChildView(icon);
84590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
84690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // To allow the border to start before the icon, reduce the size before and
84790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // add an inset to the icon to get the spacing.
84868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  if (multiprofile_index_ == 0 && SupportsMultiProfile()) {
8495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    icon->SetBorder(views::Border::CreateEmptyBorder(
85090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        0, kTrayUserTileHoverBorderInset, 0, 0));
8515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    SetBorder(views::Border::CreateEmptyBorder(
85290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        kUserCardVerticalPadding,
85390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        kTrayPopupPaddingHorizontal - kTrayUserTileHoverBorderInset,
85490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        kUserCardVerticalPadding,
85590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        kTrayPopupPaddingHorizontal));
85690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
8574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  SessionStateDelegate* delegate =
8584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      Shell::GetInstance()->session_state_delegate();
85990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  views::Label* username = NULL;
86090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance();
86190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (!multiprofile_index_) {
862eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    base::string16 user_name_string =
8634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        login == user::LOGGED_IN_GUEST ?
86490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)            bundle.GetLocalizedString(IDS_ASH_STATUS_TRAY_GUEST_LABEL) :
865eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            delegate->GetUserDisplayName(multiprofile_index_);
866eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    if (!user_name_string.empty()) {
867eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      username = new views::Label(user_name_string);
868eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      username->SetHorizontalAlignment(gfx::ALIGN_LEFT);
869eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    }
87090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
87190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
87290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  views::Label* additional = NULL;
8734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (login != user::LOGGED_IN_GUEST) {
874eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    base::string16 user_email_string =
8754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        login == user::LOGGED_IN_LOCALLY_MANAGED ?
876eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            bundle.GetLocalizedString(
877eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                IDS_ASH_STATUS_TRAY_LOCALLY_MANAGED_LABEL) :
8785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            base::UTF8ToUTF16(delegate->GetUserEmail(multiprofile_index_));
879eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    if (!user_email_string.empty()) {
880eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      additional = new views::Label(user_email_string);
881f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      additional->SetFontList(
882f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          bundle.GetFontList(ui::ResourceBundle::SmallFont));
883eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      additional->SetHorizontalAlignment(gfx::ALIGN_LEFT);
884eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    }
88590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
88690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
88790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Adjust text properties dependent on if it is an active or inactive user.
88890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (multiprofile_index_) {
88990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // Fade the text of non active users to 50%.
89090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    SkColor text_color = additional->enabled_color();
89190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    text_color = SkColorSetA(text_color, SkColorGetA(text_color) / 2);
89290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    if (additional)
89390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      additional->SetDisabledColor(text_color);
89490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    if (username)
89590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      username->SetDisabledColor(text_color);
89690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
89790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
89890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (additional && username) {
89990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    views::View* details = new views::View;
90090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    details->SetLayoutManager(new views::BoxLayout(
90190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        views::BoxLayout::kVertical, 0, kUserDetailsVerticalPadding, 0));
90290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    details->AddChildView(username);
90390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    details->AddChildView(additional);
90490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    user_card_view_->AddChildView(details);
90590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  } else {
90690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    if (username)
90790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      user_card_view_->AddChildView(username);
90890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    if (additional)
90990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      user_card_view_->AddChildView(additional);
91090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
91190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
91290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
9134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)views::View* UserView::CreateIconForUserCard(user::LoginStatus login) {
91490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  RoundedImageView* icon = new RoundedImageView(kProfileRoundedCornerRadius,
91590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                                multiprofile_index_ == 0);
91690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  icon->SetEnabled(false);
9174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (login == user::LOGGED_IN_GUEST) {
91890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    icon->SetImage(*ui::ResourceBundle::GetSharedInstance().
91990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        GetImageNamed(IDR_AURA_UBER_TRAY_GUEST_ICON).ToImageSkia(),
92090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        gfx::Size(kUserIconSize, kUserIconSize));
92190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  } else {
922a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    SessionStateDelegate* delegate =
923a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        Shell::GetInstance()->session_state_delegate();
924a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    content::BrowserContext* context = delegate->GetBrowserContextByIndex(
925a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        multiprofile_index_);
926a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    icon->SetImage(delegate->GetUserImage(context),
927a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                   gfx::Size(kUserIconSize, kUserIconSize));
92890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
92990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  return icon;
93090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
9312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
93290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void UserView::AddLoggedInRetailModeUserCardContent() {
93390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  views::Label* details = new views::Label;
9342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance();
93590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  details->SetText(
93690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      bundle.GetLocalizedString(IDS_ASH_STATUS_TRAY_KIOSK_LABEL));
9375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  details->SetBorder(views::Border::CreateEmptyBorder(0, 4, 0, 1));
93890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  details->SetHorizontalAlignment(gfx::ALIGN_LEFT);
93990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  user_card_view_->AddChildView(details);
94090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
94190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
94290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void UserView::AddLoggedInPublicModeUserCardContent(SystemTrayItem* owner) {
9434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  user_card_view_->AddChildView(CreateIconForUserCard(user::LOGGED_IN_PUBLIC));
94490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  user_card_view_->AddChildView(new PublicAccountUserDetails(
94590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      owner, GetPreferredSize().width() + kTrayPopupPaddingBetweenItems));
94690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
94790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
94890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void UserView::ToggleAddUserMenuOption() {
94990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (add_menu_option_.get()) {
95090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    popup_message_.reset();
95190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    mouse_watcher_.reset();
95290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    add_menu_option_.reset();
95390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return;
95490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
955c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
95690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Note: We do not need to install a global event handler to delete this
95790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // item since it will destroyed automatically before the menu / user menu item
95890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // gets destroyed..
95990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  const SessionStateDelegate* session_state_delegate =
9604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      Shell::GetInstance()->session_state_delegate();
96190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  add_user_visible_but_disabled_ =
96290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      session_state_delegate->NumberOfLoggedInUsers() >=
96390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          session_state_delegate->GetMaximumNumberOfLoggedInUsers();
96490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  add_menu_option_.reset(new views::Widget);
96590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  views::Widget::InitParams params;
96690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  params.type = views::Widget::InitParams::TYPE_TOOLTIP;
96790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  params.keep_on_top = true;
96890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  params.context = this->GetWidget()->GetNativeWindow();
96990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  params.accept_events = true;
97090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
971eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  params.opacity = views::Widget::InitParams::TRANSLUCENT_WINDOW;
97290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  add_menu_option_->Init(params);
97390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  add_menu_option_->SetOpacity(0xFF);
97490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  add_menu_option_->GetNativeWindow()->set_owned_by_parent(false);
97590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  SetShadowType(add_menu_option_->GetNativeView(),
976a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                wm::SHADOW_TYPE_NONE);
97790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
97890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Position it below our user card.
97990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  gfx::Rect bounds = user_card_view_->GetBoundsInScreen();
98090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  bounds.set_y(bounds.y() + bounds.height());
98190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  add_menu_option_->SetBounds(bounds);
98290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
98390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Show the content.
98490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  AddUserView* add_user_view = new AddUserView(
98590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      static_cast<UserCard*>(user_card_view_), this);
98690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  add_menu_option_->SetContentsView(add_user_view);
98790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  add_menu_option_->SetAlwaysOnTop(true);
98890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  add_menu_option_->Show();
98990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (add_user_visible_but_disabled_) {
99090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance();
99190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    popup_message_.reset(new PopupMessage(
99290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        bundle.GetLocalizedString(IDS_ASH_STATUS_TRAY_CAPTION_CANNOT_ADD_USER),
99390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        bundle.GetLocalizedString(IDS_ASH_STATUS_TRAY_MESSAGE_CANNOT_ADD_USER),
99490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        PopupMessage::ICON_WARNING,
99590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        add_user_view->anchor(),
99690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        views::BubbleBorder::TOP_LEFT,
99790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        gfx::Size(parent()->bounds().width() - kPopupMessageOffset, 0),
99890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        2 * kPopupMessageOffset));
99990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
100090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Find the screen area which encloses both elements and sets then a mouse
100190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // watcher which will close the "menu".
100290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  gfx::Rect area = user_card_view_->GetBoundsInScreen();
100390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  area.set_height(2 * area.height());
100490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  mouse_watcher_.reset(new views::MouseWatcher(
100590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      new UserViewMouseWatcherHost(area),
100690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      this));
100790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  mouse_watcher_->Start();
100890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
1009c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
101068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)bool UserView::SupportsMultiProfile() {
10111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // We do not want to see any multi profile additions to a user view when the
10121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // log in screen is shown.
10131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  return Shell::GetInstance()->delegate()->IsMultiProfilesEnabled() &&
10141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      !Shell::GetInstance()->session_state_delegate()->IsUserSessionBlocked();
101568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
101668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
101790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)AddUserView::AddUserView(UserCard* owner, views::ButtonListener* listener)
10185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : CustomButton(listener),
101990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      add_user_(NULL),
102090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      listener_(listener),
102190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      owner_(owner),
102290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      anchor_(NULL) {
102390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  AddContent();
102490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  owner_->ForceBorderVisible(true);
102590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
1026c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
102790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)AddUserView::~AddUserView() {
102890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  owner_->ForceBorderVisible(false);
102990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
103090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
103190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)gfx::Size AddUserView::GetPreferredSize() {
103290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  return owner_->bounds().size();
103390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
103490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
103590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)int AddUserView::GetHeightForWidth(int width) {
103690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  return owner_->bounds().size().height();
103790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
103890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
103990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void AddUserView::Layout() {
104090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  gfx::Rect contents_area(GetContentsBounds());
104190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  add_user_->SetBoundsRect(contents_area);
104290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
104390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
104490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void AddUserView::ButtonPressed(views::Button* sender, const ui::Event& event) {
104590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (add_user_ == sender)
104690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    listener_->ButtonPressed(this, event);
104790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  else
104890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    NOTREACHED();
104990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
105090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
105190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void AddUserView::AddContent() {
105290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  set_notify_enter_exit_on_child(true);
105390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
105490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  const SessionStateDelegate* delegate =
10554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      Shell::GetInstance()->session_state_delegate();
105690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  bool enable = delegate->NumberOfLoggedInUsers() <
105790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                    delegate->GetMaximumNumberOfLoggedInUsers();
105890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
105990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  SetLayoutManager(new views::FillLayout());
106090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  set_background(views::Background::CreateSolidBackground(kBackgroundColor));
106190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
106290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Add padding around the panel.
10635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  SetBorder(views::Border::CreateSolidBorder(1, kBorderColor));
106490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
106590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  add_user_ = new UserCard(this, enable);
10665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  add_user_->SetBorder(views::Border::CreateEmptyBorder(
106790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      kUserCardVerticalPadding,
10685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      kTrayPopupPaddingHorizontal - kTrayUserTileHoverBorderInset,
106990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      kUserCardVerticalPadding,
10705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      kTrayPopupPaddingHorizontal - kTrayUserTileHoverBorderInset));
107190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
107290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  add_user_->SetLayoutManager(new views::BoxLayout(
107390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      views::BoxLayout::kHorizontal, 0, 0 , kTrayPopupPaddingBetweenItems));
107490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  AddChildViewAt(add_user_, 0);
107590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
107690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Add the [+] icon which is also the anchor for messages.
107790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance();
107890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  RoundedImageView* icon = new RoundedImageView(kProfileRoundedCornerRadius,
107990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                                true);
108090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  anchor_ = icon;
108190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  icon->SetImage(*ui::ResourceBundle::GetSharedInstance().
108290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      GetImageNamed(IDR_AURA_UBER_TRAY_ADD_MULTIPROFILE_USER).ToImageSkia(),
108390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      gfx::Size(kUserIconSize, kUserIconSize));
108490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  add_user_->AddChildView(icon);
108590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
108690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Add the command text.
108790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  views::Label* command_label = new views::Label(
108890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      bundle.GetLocalizedString(IDS_ASH_STATUS_TRAY_SIGN_IN_ANOTHER_ACCOUNT));
108990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  command_label->SetHorizontalAlignment(gfx::ALIGN_LEFT);
109090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  add_user_->AddChildView(command_label);
10912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace tray
10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
109590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)TrayUser::TrayUser(SystemTray* system_tray, MultiProfileIndex index)
10962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : SystemTrayItem(system_tray),
109790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      multiprofile_index_(index),
10982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      user_(NULL),
1099b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      layout_view_(NULL),
11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      avatar_(NULL),
1101f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      label_(NULL) {
11022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Shell::GetInstance()->system_tray_notifier()->AddUserObserver(this);
11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TrayUser::~TrayUser() {
11062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Shell::GetInstance()->system_tray_notifier()->RemoveUserObserver(this);
11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
110990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)TrayUser::TestState TrayUser::GetStateForTest() const {
111090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (!user_)
111190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return HIDDEN;
111290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  return user_->GetStateForTest();
111390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
111490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1115a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)gfx::Size TrayUser::GetLayoutSizeForTest() const {
1116a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (!layout_view_) {
1117a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return gfx::Size(0, 0);
1118a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  } else {
1119a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return layout_view_->size();
1120a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
11214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
11224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
112390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)gfx::Rect TrayUser::GetUserPanelBoundsInScreenForTest() const {
112490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DCHECK(user_);
112590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  return user_->GetBoundsInScreenOfUserButtonForTest();
112690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
112790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1128a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void TrayUser::UpdateAfterLoginStatusChangeForTest(user::LoginStatus status) {
1129a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  UpdateAfterLoginStatusChange(status);
1130a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
1131a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)views::View* TrayUser::CreateTrayView(user::LoginStatus status) {
1133b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  CHECK(layout_view_ == NULL);
113490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1135b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  layout_view_ = new views::View();
1136b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  layout_view_->SetLayoutManager(
1137b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      new views::BoxLayout(views::BoxLayout::kHorizontal,
1138b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)                           0, 0, kUserLabelToIconPadding));
11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateAfterLoginStatusChange(status);
1140b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  return layout_view_;
11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)views::View* TrayUser::CreateDefaultView(user::LoginStatus status) {
11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (status == user::LOGGED_IN_NONE)
11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
11461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  const SessionStateDelegate* session_state_delegate =
11471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      Shell::GetInstance()->session_state_delegate();
11481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
11491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // If the screen is locked show only the currently active user.
11501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (multiprofile_index_ && session_state_delegate->IsUserSessionBlocked())
11511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    return NULL;
11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK(user_ == NULL);
115490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
115590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  int logged_in_users = session_state_delegate->NumberOfLoggedInUsers();
115690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
115790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Do not show more UserView's then there are logged in users.
115890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (multiprofile_index_ >= logged_in_users)
115990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return NULL;
116090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
116190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  user_ = new tray::UserView(this, status, multiprofile_index_);
11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return user_;
11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)views::View* TrayUser::CreateDetailedView(user::LoginStatus status) {
11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NULL;
11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayUser::DestroyTrayView() {
1170b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  layout_view_ = NULL;
11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  avatar_ = NULL;
11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  label_ = NULL;
11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayUser::DestroyDefaultView() {
11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  user_ = NULL;
11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayUser::DestroyDetailedView() {
11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayUser::UpdateAfterLoginStatusChange(user::LoginStatus status) {
118390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Only the active user is represented in the tray.
118490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (!layout_view_)
118590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return;
1186a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (GetTrayIndex() > 0)
1187f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return;
1188b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  bool need_label = false;
1189b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  bool need_avatar = false;
11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (status) {
11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case user::LOGGED_IN_LOCKED:
11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case user::LOGGED_IN_USER:
11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case user::LOGGED_IN_OWNER:
11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case user::LOGGED_IN_PUBLIC:
1195b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      need_avatar = true;
1196b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      break;
11972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case user::LOGGED_IN_LOCALLY_MANAGED:
1198b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      need_avatar = true;
1199b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      need_label = true;
12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case user::LOGGED_IN_GUEST:
12023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      need_label = true;
12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
12042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case user::LOGGED_IN_RETAIL_MODE:
12052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case user::LOGGED_IN_KIOSK_APP:
12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case user::LOGGED_IN_NONE:
12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1209b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
1210b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  if ((need_avatar != (avatar_ != NULL)) ||
1211b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      (need_label != (label_ != NULL))) {
1212b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    layout_view_->RemoveAllChildViews(true);
1213b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    if (need_label) {
1214b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      label_ = new views::Label;
1215b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      SetupLabelForTray(label_);
1216b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      layout_view_->AddChildView(label_);
1217b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    } else {
1218b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      label_ = NULL;
1219b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    }
1220b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    if (need_avatar) {
1221a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      avatar_ = new tray::RoundedImageView(kProfileRoundedCornerRadius, true);
1222b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      layout_view_->AddChildView(avatar_);
1223b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    } else {
1224b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      avatar_ = NULL;
1225b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    }
1226b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  }
1227b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
1228b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance();
1229b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  if (status == user::LOGGED_IN_LOCALLY_MANAGED) {
1230b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    label_->SetText(
1231b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        bundle.GetLocalizedString(IDS_ASH_STATUS_TRAY_LOCALLY_MANAGED_LABEL));
12323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  } else if (status == user::LOGGED_IN_GUEST) {
12333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    label_->SetText(bundle.GetLocalizedString(IDS_ASH_STATUS_TRAY_GUEST_LABEL));
1234b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  }
1235b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
12364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (avatar_ && switches::UseAlternateShelfLayout()) {
1237a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    avatar_->SetCornerRadii(
1238a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        0, kUserIconLargeCornerRadius, kUserIconLargeCornerRadius, 0);
12395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    avatar_->SetBorder(views::Border::NullBorder());
12407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
1241ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  UpdateAvatarImage(status);
12423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
12433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Update layout after setting label_ and avatar_ with new login status.
12444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  UpdateLayoutOfItem();
12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayUser::UpdateAfterShelfAlignmentChange(ShelfAlignment alignment) {
124890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Inactive users won't have a layout.
124990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (!layout_view_)
125090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return;
1251b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  if (alignment == SHELF_ALIGNMENT_BOTTOM ||
1252b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      alignment == SHELF_ALIGNMENT_TOP) {
1253b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    if (avatar_) {
12544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      if (switches::UseAlternateShelfLayout()) {
1255a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        avatar_->SetBorder(views::Border::NullBorder());
1256a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        avatar_->SetCornerRadii(
1257a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            0, kUserIconLargeCornerRadius, kUserIconLargeCornerRadius, 0);
12587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      } else {
12595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        avatar_->SetBorder(views::Border::CreateEmptyBorder(
12605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            0,
12615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            kTrayImageItemHorizontalPaddingBottomAlignment + 2,
12625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            0,
12635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            kTrayImageItemHorizontalPaddingBottomAlignment));
12647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      }
12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1266b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    if (label_) {
1267a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      // If label_ hasn't figured out its size yet, do that first.
1268a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      if (label_->GetContentsBounds().height() == 0)
1269a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        label_->SizeToPreferredSize();
1270a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      int height = label_->GetContentsBounds().height();
1271a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      int vertical_pad = (kTrayItemSize - height) / 2;
1272a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      int remainder = height % 2;
12735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      label_->SetBorder(views::Border::CreateEmptyBorder(
1274a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          vertical_pad + remainder,
12755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          kTrayLabelItemHorizontalPaddingBottomAlignment,
1276a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          vertical_pad,
12775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          kTrayLabelItemHorizontalPaddingBottomAlignment));
1278b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    }
1279b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    layout_view_->SetLayoutManager(
1280b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        new views::BoxLayout(views::BoxLayout::kHorizontal,
1281b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)                             0, 0, kUserLabelToIconPadding));
1282b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  } else {
12837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    if (avatar_) {
12844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      if (switches::UseAlternateShelfLayout()) {
1285a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        avatar_->SetBorder(views::Border::NullBorder());
1286a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        avatar_->SetCornerRadii(
1287a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            0, 0, kUserIconLargeCornerRadius, kUserIconLargeCornerRadius);
12887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      } else {
12897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        SetTrayImageItemBorder(avatar_, alignment);
12907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      }
12917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    }
1292b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    if (label_) {
12935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      label_->SetBorder(views::Border::CreateEmptyBorder(
1294d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)          kTrayLabelItemVerticalPaddingVerticalAlignment,
12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          kTrayLabelItemHorizontalPaddingBottomAlignment,
1296d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)          kTrayLabelItemVerticalPaddingVerticalAlignment,
12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          kTrayLabelItemHorizontalPaddingBottomAlignment));
12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1299b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    layout_view_->SetLayoutManager(
1300b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        new views::BoxLayout(views::BoxLayout::kVertical,
1301b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)                             0, 0, kUserLabelToIconPadding));
13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayUser::OnUserUpdate() {
1306ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  UpdateAvatarImage(Shell::GetInstance()->system_tray_delegate()->
1307ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      GetUserLoginStatus());
1308ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
1309ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
13104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void TrayUser::OnUserAddedToSession() {
13114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  SessionStateDelegate* session_state_delegate =
13124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      Shell::GetInstance()->session_state_delegate();
13134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Only create views for user items which are logged in.
13144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (GetTrayIndex() >= session_state_delegate->NumberOfLoggedInUsers())
13154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return;
13164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
13174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Enforce a layout change that newly added items become visible.
13184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  UpdateLayoutOfItem();
13194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
13204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Update the user item.
13214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  UpdateAvatarImage(
13224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      Shell::GetInstance()->system_tray_delegate()->GetUserLoginStatus());
13234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
13244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1325ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid TrayUser::UpdateAvatarImage(user::LoginStatus status) {
13264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  SessionStateDelegate* session_state_delegate =
13274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      Shell::GetInstance()->session_state_delegate();
13284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (!avatar_ ||
13294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      GetTrayIndex() >= session_state_delegate->NumberOfLoggedInUsers())
1330ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    return;
1331ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
13324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  int icon_size = switches::UseAlternateShelfLayout() ?
1333ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      kUserIconLargeSize : kUserIconSize;
1334ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1335a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  content::BrowserContext* context = session_state_delegate->
1336a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      GetBrowserContextByIndex(GetTrayIndex());
1337a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  avatar_->SetImage(session_state_delegate->GetUserImage(context),
1338a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                    gfx::Size(icon_size, icon_size));
13394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
13404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Unit tests might come here with no images for some users.
13414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (avatar_->size().IsEmpty())
13424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    avatar_->SetSize(gfx::Size(icon_size, icon_size));
13434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
13444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
13454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)MultiProfileIndex TrayUser::GetTrayIndex() {
13464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  Shell* shell = Shell::GetInstance();
13474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // If multi profile is not enabled we can use the normal index.
13484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (!shell->delegate()->IsMultiProfilesEnabled())
13494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return multiprofile_index_;
13504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // In case of multi profile we need to mirror the indices since the system
13514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // tray items are in the reverse order then the menu items.
13524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  return shell->session_state_delegate()->GetMaximumNumberOfLoggedInUsers() -
1353f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)             1 - multiprofile_index_;
13544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
13554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
13564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void TrayUser::UpdateLayoutOfItem() {
1357c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  RootWindowController* controller = GetRootWindowController(
1358c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      system_tray()->GetWidget()->GetNativeWindow()->GetRootWindow());
13594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (controller && controller->shelf()) {
13604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    UpdateAfterShelfAlignmentChange(
13614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        controller->GetShelfLayoutManager()->GetAlignment());
13624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace ash
1366