tray_user.cc revision 90dce4d38c5ff5333bea97d859d4e484e27edf0c
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)
1190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "ash/popup_message.h"
1290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "ash/session_state_delegate.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/shell.h"
14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ash/shell_delegate.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/system/tray/system_tray.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/tray/system_tray_delegate.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/system/tray/system_tray_notifier.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/tray/tray_constants.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/tray/tray_item_view.h"
20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ash/system/tray/tray_popup_label_button.h"
21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ash/system/tray/tray_popup_label_button_border.h"
22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ash/system/tray/tray_utils.h"
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/i18n/rtl.h"
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/logging.h"
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/scoped_vector.h"
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/string16.h"
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/string_util.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/utf_string_conversions.h"
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "grit/ash_resources.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/ash_strings.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "skia/ext/image_operations.h"
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/skia/include/core/SkCanvas.h"
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/skia/include/core/SkPaint.h"
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/skia/include/core/SkPath.h"
3590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "ui/aura/window.h"
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/range/range.h"
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/resource/resource_bundle.h"
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/text/text_elider.h"
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/canvas.h"
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/font.h"
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/image/image.h"
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/image/image_skia_operations.h"
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/insets.h"
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/rect.h"
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/render_text.h"
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/size.h"
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/skia_util.h"
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/border.h"
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/bubble/tray_bubble_view.h"
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/button/button.h"
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/controls/button/custom_button.h"
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/image_view.h"
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/label.h"
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/controls/link.h"
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/controls/link_listener.h"
5790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "ui/views/corewm/shadow_types.h"
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/layout/box_layout.h"
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/layout/fill_layout.h"
6090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "ui/views/mouse_watcher.h"
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/painter.h"
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/view.h"
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/widget.h"
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const int kUserDetailsVerticalPadding = 5;
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const int kUserCardVerticalPadding = 10;
6990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)const int kInactiveUserCardVerticalPadding = 4;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kProfileRoundedCornerRadius = 2;
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const int kUserIconSize = 27;
72b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)const int kUserLabelToIconPadding = 5;
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// When a hover border is used, it is starting this many pixels before the icon
7590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// position.
7690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)const int kTrayUserTileHoverBorderInset = 10;
7790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
7890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// The border color of the user button.
7990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)const SkColor kBorderColor = 0xffdcdcdc;
8090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// The invisible word joiner character, used as a marker to indicate the start
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// and end of the user's display name in the public account user card's text.
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char16 kDisplayNameMark[] = { 0x2060, 0 };
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const int kPublicAccountLogoutButtonBorderImagesNormal[] = {
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IDR_AURA_TRAY_POPUP_PUBLIC_ACCOUNT_LOGOUT_BUTTON_BORDER,
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IDR_AURA_TRAY_POPUP_LABEL_BUTTON_NORMAL_BACKGROUND,
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IDR_AURA_TRAY_POPUP_LABEL_BUTTON_NORMAL_BACKGROUND,
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IDR_AURA_TRAY_POPUP_PUBLIC_ACCOUNT_LOGOUT_BUTTON_BORDER,
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IDR_AURA_TRAY_POPUP_LABEL_BUTTON_NORMAL_BACKGROUND,
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IDR_AURA_TRAY_POPUP_LABEL_BUTTON_NORMAL_BACKGROUND,
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IDR_AURA_TRAY_POPUP_PUBLIC_ACCOUNT_LOGOUT_BUTTON_BORDER,
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IDR_AURA_TRAY_POPUP_LABEL_BUTTON_NORMAL_BACKGROUND,
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IDR_AURA_TRAY_POPUP_LABEL_BUTTON_NORMAL_BACKGROUND,
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const int kPublicAccountLogoutButtonBorderImagesHovered[] = {
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IDR_AURA_TRAY_POPUP_PUBLIC_ACCOUNT_LOGOUT_BUTTON_BORDER,
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IDR_AURA_TRAY_POPUP_PUBLIC_ACCOUNT_LOGOUT_BUTTON_BORDER,
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IDR_AURA_TRAY_POPUP_PUBLIC_ACCOUNT_LOGOUT_BUTTON_BORDER,
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IDR_AURA_TRAY_POPUP_PUBLIC_ACCOUNT_LOGOUT_BUTTON_BORDER,
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IDR_AURA_TRAY_POPUP_LABEL_BUTTON_HOVER_BACKGROUND,
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IDR_AURA_TRAY_POPUP_PUBLIC_ACCOUNT_LOGOUT_BUTTON_BORDER,
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IDR_AURA_TRAY_POPUP_PUBLIC_ACCOUNT_LOGOUT_BUTTON_BORDER,
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)};
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Offsetting the popup message relative to the tray menu.
11090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)const int kPopupMessageOffset = 25;
11190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ash {
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace internal {
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace tray {
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A custom image view with rounded edges.
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RoundedImageView : public views::View {
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Constructs a new rounded image view with rounded corners of radius
12390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // |corner_radius|. If |active_user| is set, the icon will be drawn in
12490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // full colors - otherwise it will fade into the background.
12590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  RoundedImageView(int corner_radius, bool active_user);
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~RoundedImageView();
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set the image that should be displayed. The image contents is copied to the
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // receiver's image.
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetImage(const gfx::ImageSkia& img, const gfx::Size& size);
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overridden from views::View.
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual gfx::Size GetPreferredSize() OVERRIDE;
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE;
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::ImageSkia image_;
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::ImageSkia resized_;
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Size image_size_;
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int corner_radius_;
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // True if the given user is the active user and the icon should get
14390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // painted as active.
14490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  bool active_user_;
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(RoundedImageView);
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// The user details shown in public account mode. This is essentially a label
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// but with custom painting code as the text is styled with multiple colors and
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// contains a link.
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class PublicAccountUserDetails : public views::View,
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 public views::LinkListener {
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PublicAccountUserDetails(SystemTrayItem* owner, int used_width);
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~PublicAccountUserDetails();
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Overridden from views::View.
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void Layout() OVERRIDE;
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual gfx::Size GetPreferredSize() OVERRIDE;
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE;
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Overridden from views::LinkListener.
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void LinkClicked(views::Link* source, int event_flags) OVERRIDE;
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Calculate a preferred size that ensures the label text and the following
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // link do not wrap over more than three lines in total for aesthetic reasons
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // if possible.
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void CalculatePreferredSize(SystemTrayItem* owner, int used_width);
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 text_;
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  views::Link* learn_more_;
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Size preferred_size_;
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedVector<gfx::RenderText> lines_;
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(PublicAccountUserDetails);
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// The button which holds the user card in case of multi profile.
18190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class UserCard : public views::CustomButton {
18290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public:
18390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  UserCard(views::ButtonListener* listener, bool active_user);
18490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual ~UserCard();
18590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
18690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Called when the border should remain even in the non highlighted state.
18790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void ForceBorderVisible(bool show);
18890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
18990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Overridden from views::View
19090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual void OnMouseEntered(const ui::MouseEvent& event) OVERRIDE;
19190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual void OnMouseExited(const ui::MouseEvent& event) OVERRIDE;
19290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
19390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Check if the item is hovered.
19490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  bool is_hovered_for_test() {return button_hovered_; }
19590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
19690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) private:
19790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Change the hover/active state of the "button" when the status changes.
19890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void ShowActive();
19990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
20090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // True if this is the active user.
20190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  bool is_active_user_;
20290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
20390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // True if button is hovered.
20490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  bool button_hovered_;
20590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
20690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // True if the border should be visible.
20790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  bool show_border_;
20890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
20990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(UserCard);
21090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)};
21190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
21290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class UserViewMouseWatcherHost : public views::MouseWatcherHost {
21390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)public:
21490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) explicit UserViewMouseWatcherHost(const gfx::Rect& screen_area)
21590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)     : screen_area_(screen_area) {}
21690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual ~UserViewMouseWatcherHost() {}
21790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
21890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Implementation of MouseWatcherHost.
21990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual bool Contains(const gfx::Point& screen_point,
22090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                       views::MouseWatcherHost::MouseEventType type) OVERRIDE {
22190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)   return screen_area_.Contains(screen_point);
22290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) }
22390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
22490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)private:
22590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) gfx::Rect screen_area_;
22690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
22790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(UserViewMouseWatcherHost);
22890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)};
22990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
23090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// The view of a user item.
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class UserView : public views::View,
23290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                 public views::ButtonListener,
23390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                 public views::MouseWatcherListener {
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
23590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  UserView(SystemTrayItem* owner,
23690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)           ash::user::LoginStatus login,
23790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)           MultiProfileIndex index);
2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~UserView();
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Overridden from MouseWatcherListener:
24190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual void MouseMovedOutOfHost() OVERRIDE;
24290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
24390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  TrayUser::TestState GetStateForTest() const;
24490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  gfx::Rect GetBoundsInScreenOfUserButtonForTest();
24590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Overridden from views::View.
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual gfx::Size GetPreferredSize() OVERRIDE;
249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual int GetHeightForWidth(int width) OVERRIDE;
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void Layout() OVERRIDE;
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Overridden from views::ButtonListener.
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void ButtonPressed(views::Button* sender,
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                             const ui::Event& event) OVERRIDE;
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void AddLogoutButton(ash::user::LoginStatus login);
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void AddUserCard(SystemTrayItem* owner, ash::user::LoginStatus login);
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
25990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Create a user icon representation for the user card.
26090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  views::View* CreateIconForUserCard(ash::user::LoginStatus login);
26190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
26290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Create the additional user card content for the retail logged in mode.
26390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void AddLoggedInRetailModeUserCardContent();
26490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
26590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Create the additional user card content for the public mode.
26690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void AddLoggedInPublicModeUserCardContent(SystemTrayItem* owner);
26790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
26890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Create the menu option to add another user. If |disabled| is set the user
26990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // cannot actively click on the item.
27090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void ToggleAddUserMenuOption();
27190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
27290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  MultiProfileIndex multiprofile_index_;
27390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // The view of the user card.
27490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  views::View* user_card_view_;
27590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
27690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // True if |user_card_view_| is a |UserView| - otherwise it is only a
27790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // |views::View|.
27890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  bool is_user_card_;
2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  views::View* logout_button_;
28090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  scoped_ptr<ash::PopupMessage> popup_message_;
28190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  scoped_ptr<views::Widget> add_menu_option_;
28290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
28390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // True when the add user panel is visible but not activatable.
28490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  bool add_user_visible_but_disabled_;
28590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
28690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // The mouse watcher which takes care of out of window hover events.
28790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  scoped_ptr<views::MouseWatcher> mouse_watcher_;
2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(UserView);
2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
29290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// The menu item view which gets shown when the user clicks in multi profile
29390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// mode onto the user item.
29490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class AddUserView : public views::CustomButton,
29590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                    public views::ButtonListener {
29690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public:
29790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // The |owner| is the view for which this view gets created. The |listener|
29890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // will get notified when this item gets clicked.
29990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  AddUserView(UserCard* owner, views::ButtonListener* listener);
30090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual ~AddUserView();
30190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
30290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Get the anchor view for a message.
30390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  views::View* anchor() { return anchor_; }
30490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
30590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Overridden from views::ButtonListener.
30690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual void ButtonPressed(views::Button* sender,
30790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                             const ui::Event& event) OVERRIDE;
30890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
30990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) private:
31090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Overridden from views::View.
31190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual gfx::Size GetPreferredSize() OVERRIDE;
31290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual int GetHeightForWidth(int width) OVERRIDE;
31390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual void Layout() OVERRIDE;
31490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
31590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Create the additional client content for this item.
31690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void AddContent();
31790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
31890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // This is the content we create and show.
31990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  views::View* add_user_;
32090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
32190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // This listener will get informed when someone clicks on this button.
32290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  views::ButtonListener* listener_;
32390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
32490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // This is the owner view of this item.
32590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  UserCard* owner_;
32690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
32790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // The anchor view for targetted bubble messages.
32890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  views::View* anchor_;
32990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
33090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(AddUserView);
33190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)};
33290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
33390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)RoundedImageView::RoundedImageView(int corner_radius, bool active_user)
33490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    : corner_radius_(corner_radius),
33590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      active_user_(active_user) {}
3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)RoundedImageView::~RoundedImageView() {}
3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RoundedImageView::SetImage(const gfx::ImageSkia& img,
3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                const gfx::Size& size) {
3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  image_ = img;
3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  image_size_ = size;
3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Try to get the best image quality for the avatar.
3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  resized_ = gfx::ImageSkiaOperations::CreateResizedImage(image_,
3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      skia::ImageOperations::RESIZE_BEST, size);
3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (GetWidget() && visible()) {
3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PreferredSizeChanged();
3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SchedulePaint();
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gfx::Size RoundedImageView::GetPreferredSize() {
3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return gfx::Size(image_size_.width() + GetInsets().width(),
3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   image_size_.height() + GetInsets().height());
3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RoundedImageView::OnPaint(gfx::Canvas* canvas) {
3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  View::OnPaint(canvas);
3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Rect image_bounds(size());
3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  image_bounds.ClampToCenteredSize(GetPreferredSize());
3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  image_bounds.Inset(GetInsets());
3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const SkScalar kRadius = SkIntToScalar(corner_radius_);
3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SkPath path;
3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  path.addRoundRect(gfx::RectToSkRect(image_bounds), kRadius, kRadius);
3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SkPaint paint;
3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  paint.setAntiAlias(true);
36890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  paint.setXfermodeMode(active_user_ ? SkXfermode::kSrcOver_Mode :
36990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                       SkXfermode::kLuminosity_Mode);
3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  canvas->DrawImageInPath(resized_, image_bounds.x(), image_bounds.y(),
3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          path, paint);
3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)PublicAccountUserDetails::PublicAccountUserDetails(SystemTrayItem* owner,
3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                   int used_width)
3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : learn_more_(NULL) {
3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const int inner_padding =
3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      kTrayPopupPaddingHorizontal - kTrayPopupPaddingBetweenItems;
3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const bool rtl = base::i18n::IsRTL();
3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  set_border(views::Border::CreateEmptyBorder(
3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      kUserDetailsVerticalPadding, rtl ? 0 : inner_padding,
3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      kUserDetailsVerticalPadding, rtl ? inner_padding : 0));
3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Retrieve the user's display name and wrap it with markers.
38590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Note that since this is a public account it always has to be the primary
38690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // user.
38790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::string16 display_name =
38890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      ash::Shell::GetInstance()->session_state_delegate()->
38990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          GetUserDisplayName(0);
3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RemoveChars(display_name, kDisplayNameMark, &display_name);
3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  display_name = kDisplayNameMark[0] + display_name + kDisplayNameMark[0];
3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Retrieve the domain managing the device and wrap it with markers.
39390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::string16 domain = UTF8ToUTF16(
39490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      ash::Shell::GetInstance()->system_tray_delegate()->GetEnterpriseDomain());
3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RemoveChars(domain, kDisplayNameMark, &domain);
3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::i18n::WrapStringWithLTRFormatting(&domain);
3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Retrieve the label text, inserting the display name and domain.
3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  text_ = l10n_util::GetStringFUTF16(IDS_ASH_STATUS_TRAY_PUBLIC_LABEL,
3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                     display_name, domain);
4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  learn_more_ = new views::Link(l10n_util::GetStringUTF16(IDS_ASH_LEARN_MORE));
4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  learn_more_->SetUnderline(false);
4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  learn_more_->set_listener(this);
4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AddChildView(learn_more_);
4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CalculatePreferredSize(owner, used_width);
4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)PublicAccountUserDetails::~PublicAccountUserDetails() {}
4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PublicAccountUserDetails::Layout() {
4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  lines_.clear();
4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const gfx::Rect contents_area = GetContentsBounds();
4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (contents_area.IsEmpty())
41590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return;
4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Word-wrap the label text.
4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const gfx::Font font;
419c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::vector<base::string16> lines;
4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui::ElideRectangleText(text_, font, contents_area.width(),
4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         contents_area.height(), ui::ELIDE_LONG_WORDS, &lines);
4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Loop through the lines, creating a renderer for each.
4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Point position = contents_area.origin();
4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui::Range display_name(ui::Range::InvalidRange());
425c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  for (std::vector<base::string16>::const_iterator it = lines.begin();
4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       it != lines.end(); ++it) {
4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::RenderText* line = gfx::RenderText::CreateInstance();
4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    line->SetDirectionalityMode(gfx::DIRECTIONALITY_FROM_UI);
4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    line->SetText(*it);
4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const gfx::Size size(contents_area.width(), line->GetStringSize().height());
4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    line->SetDisplayRect(gfx::Rect(position, size));
4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    position.set_y(position.y() + size.height());
4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Set the default text color for the line.
4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    line->SetColor(kPublicAccountUserCardTextColor);
4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // If a range of the line contains the user's display name, apply a custom
4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // text color to it.
4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (display_name.is_empty())
4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      display_name.set_start(it->find(kDisplayNameMark));
4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!display_name.is_empty()) {
4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      display_name.set_end(
4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          it->find(kDisplayNameMark, display_name.start() + 1));
4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::Range line_range(0, it->size());
4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      line->ApplyColor(kPublicAccountUserCardNameColor,
4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       display_name.Intersect(line_range));
4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // Update the range for the next line.
4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (display_name.end() >= line_range.end())
4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        display_name.set_start(0);
4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      else
4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        display_name = ui::Range::InvalidRange();
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    lines_.push_back(line);
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Position the link after the label text, separated by a space. If it does
4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // not fit onto the last line of the text, wrap the link onto its own line.
4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const gfx::Size last_line_size = lines_.back()->GetStringSize();
4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const int space_width = font.GetStringWidth(ASCIIToUTF16(" "));
4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const gfx::Size link_size = learn_more_->GetPreferredSize();
4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (contents_area.width() - last_line_size.width() >=
4632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      space_width + link_size.width()) {
4642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    position.set_x(position.x() + last_line_size.width() + space_width);
4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    position.set_y(position.y() - last_line_size.height());
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  position.set_y(position.y() - learn_more_->GetInsets().top());
4682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Rect learn_more_bounds(position, link_size);
4692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  learn_more_bounds.Intersect(contents_area);
4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (base::i18n::IsRTL()) {
4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const gfx::Insets insets = GetInsets();
4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    learn_more_bounds.Offset(insets.right() - insets.left(), 0);
4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  learn_more_->SetBoundsRect(learn_more_bounds);
4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gfx::Size PublicAccountUserDetails::GetPreferredSize() {
4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return preferred_size_;
4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PublicAccountUserDetails::OnPaint(gfx::Canvas* canvas) {
4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (ScopedVector<gfx::RenderText>::const_iterator it = lines_.begin();
4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       it != lines_.end(); ++it) {
4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    (*it)->Draw(canvas);
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  views::View::OnPaint(canvas);
4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PublicAccountUserDetails::LinkClicked(views::Link* source,
4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                           int event_flags) {
4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK_EQ(source, learn_more_);
4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ash::Shell::GetInstance()->system_tray_delegate()->ShowPublicAccountInfo();
4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PublicAccountUserDetails::CalculatePreferredSize(SystemTrayItem* owner,
4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                      int used_width) {
4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const gfx::Font font;
4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const gfx::Size link_size = learn_more_->GetPreferredSize();
4992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const int space_width = font.GetStringWidth(ASCIIToUTF16(" "));
5002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const gfx::Insets insets = GetInsets();
5012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  views::TrayBubbleView* bubble_view =
5022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      owner->system_tray()->GetSystemBubble()->bubble_view();
5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int min_width = std::max(
5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      link_size.width(),
5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      bubble_view->GetPreferredSize().width() - (used_width + insets.width()));
5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int max_width = std::min(
5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      font.GetStringWidth(text_) + space_width + link_size.width(),
5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      bubble_view->GetMaximumSize().width() - (used_width + insets.width()));
5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Do a binary search for the minimum width that ensures no more than three
5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // lines are needed. The lower bound is the minimum of the current bubble
5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // width and the width of the link (as no wrapping is permitted inside the
5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // link). The upper bound is the maximum of the largest allowed bubble width
5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // and the sum of the label text and link widths when put on a single line.
514c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::vector<base::string16> lines;
5152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  while (min_width < max_width) {
5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    lines.clear();
5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const int width = (min_width + max_width) / 2;
5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const bool too_narrow = ui::ElideRectangleText(
5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        text_, font, width, INT_MAX, ui::TRUNCATE_LONG_WORDS, &lines) != 0;
5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int line_count = lines.size();
5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!too_narrow && line_count == 3 &&
5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            width - font.GetStringWidth(lines.back()) <=
5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            space_width + link_size.width()) {
5242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ++line_count;
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (too_narrow || line_count > 3)
5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      min_width = width + 1;
5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    else
5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      max_width = width;
5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Calculate the corresponding height and set the preferred size.
5332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  lines.clear();
5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui::ElideRectangleText(
5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      text_, font, min_width, INT_MAX, ui::TRUNCATE_LONG_WORDS, &lines);
5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int line_count = lines.size();
5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (min_width - font.GetStringWidth(lines.back()) <=
5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      space_width + link_size.width()) {
5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ++line_count;
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const int line_height = font.GetHeight();
5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const int link_extra_height = std::max(
5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      link_size.height() - learn_more_->GetInsets().top() - line_height, 0);
5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  preferred_size_ = gfx::Size(
5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      min_width + insets.width(),
5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      line_count * line_height + link_extra_height + insets.height());
5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bubble_view->SetWidth(preferred_size_.width() + used_width);
5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)UserCard::UserCard(views::ButtonListener* listener, bool active_user)
55290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    : CustomButton(listener),
55390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      is_active_user_(active_user),
55490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      button_hovered_(false),
55590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      show_border_(false) {
55690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (is_active_user_) {
55790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    set_background(
55890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        views::Background::CreateSolidBackground(kBackgroundColor));
55990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    ShowActive();
56090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
56190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
56290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
56390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)UserCard::~UserCard() {}
56490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
56590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void UserCard::ForceBorderVisible(bool show) {
56690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  show_border_ = show;
56790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ShowActive();
56890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
56990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
57090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void UserCard::OnMouseEntered(const ui::MouseEvent& event) {
57190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (is_active_user_) {
57290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    button_hovered_ = true;
57390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    background()->SetNativeControlColor(kHoverBackgroundColor);
57490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    ShowActive();
57590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
57690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
57790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
57890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void UserCard::OnMouseExited(const ui::MouseEvent& event) {
57990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (is_active_user_) {
58090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    button_hovered_ = false;
58190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    background()->SetNativeControlColor(kBackgroundColor);
58290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    ShowActive();
58390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
58490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
58590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
58690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void UserCard::ShowActive() {
58790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  int width = button_hovered_ || show_border_ ? 1 : 0;
58890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  set_border(views::Border::CreateSolidSidedBorder(width, width, width, 1,
58990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                                   kBorderColor));
59090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  SchedulePaint();
59190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
59290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
59390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)UserView::UserView(SystemTrayItem* owner,
59490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                   ash::user::LoginStatus login,
59590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                   MultiProfileIndex index)
59690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    : multiprofile_index_(index),
59790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      user_card_view_(NULL),
59890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      is_user_card_(false),
5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      logout_button_(NULL),
60090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      add_user_visible_but_disabled_(false) {
6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CHECK_NE(ash::user::LOGGED_IN_NONE, login);
60290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (!index) {
60390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // Only the logged in user will have a background. All other users will have
60490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // to allow the TrayPopupContainer highlighting the menu line.
60590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    set_background(views::Background::CreateSolidBackground(
60690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        login == ash::user::LOGGED_IN_PUBLIC ? kPublicAccountBackgroundColor :
60790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                               kBackgroundColor));
60890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
6092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetLayoutManager(new views::BoxLayout(views::BoxLayout::kHorizontal, 0, 0,
6102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        kTrayPopupPaddingBetweenItems));
6112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The logout button must be added before the user card so that the user card
6122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // can correctly calculate the remaining available width.
61390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Note that only the current multiprofile user gets a button.
61490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  AddLogoutButton(!multiprofile_index_ ? login : ash::user::LOGGED_IN_LOCKED);
6152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AddUserCard(owner, login);
6162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)UserView::~UserView() {}
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
62090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void UserView::MouseMovedOutOfHost() {
62190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  popup_message_.reset();
62290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  mouse_watcher_.reset();
62390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  add_menu_option_.reset();
62490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
62590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
62690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)TrayUser::TestState UserView::GetStateForTest() const {
62790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (add_menu_option_.get()) {
62890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return add_user_visible_but_disabled_ ? TrayUser::ACTIVE_BUT_DISABLED :
62990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                            TrayUser::ACTIVE;
63090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
63190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
63290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (!is_user_card_)
63390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return TrayUser::SHOWN;
63490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
63590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  return static_cast<UserCard*>(user_card_view_)->is_hovered_for_test() ?
63690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      TrayUser::HOVERED : TrayUser::SHOWN;
63790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
63890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
63990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)gfx::Rect UserView::GetBoundsInScreenOfUserButtonForTest() {
64090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DCHECK(user_card_view_);
64190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  return user_card_view_->GetBoundsInScreen();
64290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
64390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
6442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gfx::Size UserView::GetPreferredSize() {
6452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Size size = views::View::GetPreferredSize();
64690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Only the active user panel will be forced to a certain height.
64790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (!multiprofile_index_) {
6482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    size.set_height(std::max(size.height(),
6492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                             kTrayPopupItemHeight + GetInsets().height()));
6502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return size;
6522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
654c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)int UserView::GetHeightForWidth(int width) {
655c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return GetPreferredSize().height();
656c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
657c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
6582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void UserView::Layout() {
6592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Rect contents_area(GetContentsBounds());
66090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (user_card_view_ && logout_button_) {
6612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Give the logout button the space it requests.
6622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::Rect logout_area = contents_area;
6632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    logout_area.ClampToCenteredSize(logout_button_->GetPreferredSize());
6642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    logout_area.set_x(contents_area.right() - logout_area.width());
6652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Give the remaining space to the user card.
6672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::Rect user_card_area = contents_area;
66890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    int remaining_width = contents_area.width() - logout_area.width();
66990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    if (ash::Shell::GetInstance()->delegate()->IsMultiProfilesEnabled()) {
67090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      // In multiprofile case |user_card_view_| and |logout_button_| have to
67190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      // have the same height.
67290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      int y = std::min(user_card_area.y(), logout_area.y());
67390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      int height = std::max(user_card_area.height(), logout_area.height());
67490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      logout_area.set_y(y);
67590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      logout_area.set_height(height);
67690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      user_card_area.set_y(y);
67790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      user_card_area.set_height(height);
67890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
67990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      // In multiprofile mode we have also to increase the size of the card by
68090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      // the size of the border to make it overlap with the logout button.
68190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      user_card_area.set_width(std::max(0, remaining_width + 1));
68290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
68390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      // To make the logout button symmetrical with the user card we also make
68490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      // the button longer by the same size the hover area in front of the icon
68590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      // got inset.
68690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      logout_area.set_width(logout_area.width() +
68790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                            kTrayUserTileHoverBorderInset);
68890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    } else {
68990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      // In all other modes we have to make sure that there is enough spacing
69090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      // between the two.
69190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      remaining_width -= kTrayPopupPaddingBetweenItems;
69290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    }
69390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    user_card_view_->SetBoundsRect(user_card_area);
69490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    logout_button_->SetBoundsRect(logout_area);
69590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  } else if (user_card_view_) {
69690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    user_card_view_->SetBoundsRect(contents_area);
6972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else if (logout_button_) {
6982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    logout_button_->SetBoundsRect(contents_area);
6992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
7002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void UserView::ButtonPressed(views::Button* sender, const ui::Event& event) {
703c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (sender == logout_button_) {
7042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ash::Shell::GetInstance()->system_tray_delegate()->SignOut();
70590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  } else if (sender == user_card_view_ &&
70690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)             ash::Shell::GetInstance()->delegate()->IsMultiProfilesEnabled()) {
70790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    if (!multiprofile_index_) {
70890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      ToggleAddUserMenuOption();
70990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    } else {
71090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      ash::SessionStateDelegate* delegate =
71190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          ash::Shell::GetInstance()->session_state_delegate();
71290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      delegate->SwitchActiveUser(delegate->GetUserEmail(multiprofile_index_));
71390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    }
71490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  } else if (add_menu_option_.get() &&
71590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)             sender == add_menu_option_->GetContentsView()) {
71690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // Let the user add another account to the session.
71790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    ash::Shell::GetInstance()->system_tray_delegate()->ShowUserLogin();
718c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  } else {
7192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    NOTREACHED();
720c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
7212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void UserView::AddLogoutButton(ash::user::LoginStatus login) {
7242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // A user should not be able to modify logged-in state when screen is
7252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // locked.
7262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (login == ash::user::LOGGED_IN_LOCKED)
7272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
7282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
729c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const base::string16 title = ash::user::GetLocalizedSignOutStringForStatus(
730c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      login, true);
7312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TrayPopupLabelButton* logout_button = new TrayPopupLabelButton(this, title);
7322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  logout_button->SetAccessibleName(title);
7332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  logout_button_ = logout_button;
7342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // In public account mode, the logout button border has a custom color.
7352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (login == ash::user::LOGGED_IN_PUBLIC) {
7362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    TrayPopupLabelButtonBorder* border =
7372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        static_cast<TrayPopupLabelButtonBorder*>(logout_button_->border());
7382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    border->SetPainter(false, views::Button::STATE_NORMAL,
7392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       views::Painter::CreateImageGridPainter(
7402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           kPublicAccountLogoutButtonBorderImagesNormal));
7412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    border->SetPainter(false, views::Button::STATE_HOVERED,
7422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       views::Painter::CreateImageGridPainter(
7432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           kPublicAccountLogoutButtonBorderImagesHovered));
7442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    border->SetPainter(false, views::Button::STATE_PRESSED,
7452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       views::Painter::CreateImageGridPainter(
7462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           kPublicAccountLogoutButtonBorderImagesHovered));
7472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
7482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AddChildView(logout_button_);
7492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void UserView::AddUserCard(SystemTrayItem* owner,
7522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           ash::user::LoginStatus login) {
75390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Add padding around the panel.
75490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  set_border(views::Border::CreateEmptyBorder(
75590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      kUserCardVerticalPadding, kTrayPopupPaddingHorizontal,
75690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      kUserCardVerticalPadding, kTrayPopupPaddingHorizontal));
7572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
75890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (ash::Shell::GetInstance()->delegate()->IsMultiProfilesEnabled() &&
75990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      login != ash::user::LOGGED_IN_RETAIL_MODE) {
76090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    user_card_view_ = new UserCard(this, multiprofile_index_ == 0);
76190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    is_user_card_ = true;
76290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  } else {
76390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    user_card_view_ = new views::View();
76490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    is_user_card_ = false;
76590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
7662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
76790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  user_card_view_->SetLayoutManager(new views::BoxLayout(
76890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      views::BoxLayout::kHorizontal, 0, 0 , kTrayPopupPaddingBetweenItems));
76990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  AddChildViewAt(user_card_view_, 0);
7702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (login == ash::user::LOGGED_IN_RETAIL_MODE) {
77290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    AddLoggedInRetailModeUserCardContent();
7732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
7742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
77590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
77690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // The entire user card should trigger hover (the inner items get disabled).
77790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  user_card_view_->SetEnabled(true);
77890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  user_card_view_->set_notify_enter_exit_on_child(true);
7792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (login == ash::user::LOGGED_IN_PUBLIC) {
78190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    AddLoggedInPublicModeUserCardContent(owner);
7822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
7832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
7842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
78590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  views::View* icon = CreateIconForUserCard(login);
78690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  user_card_view_->AddChildView(icon);
78790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
78890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // To allow the border to start before the icon, reduce the size before and
78990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // add an inset to the icon to get the spacing.
79090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (multiprofile_index_ == 0 &&
79190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      ash::Shell::GetInstance()->delegate()->IsMultiProfilesEnabled()) {
79290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    icon->set_border(views::Border::CreateEmptyBorder(
79390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        0, kTrayUserTileHoverBorderInset, 0, 0));
79490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    set_border(views::Border::CreateEmptyBorder(
79590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        kUserCardVerticalPadding,
79690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        kTrayPopupPaddingHorizontal - kTrayUserTileHoverBorderInset,
79790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        kUserCardVerticalPadding,
79890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        kTrayPopupPaddingHorizontal));
79990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
80090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ash::SessionStateDelegate* delegate =
80190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      ash::Shell::GetInstance()->session_state_delegate();
80290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  views::Label* username = NULL;
80390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance();
80490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (!multiprofile_index_) {
80590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    username = new views::Label(
80690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        login == ash::user::LOGGED_IN_GUEST ?
80790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)            bundle.GetLocalizedString(IDS_ASH_STATUS_TRAY_GUEST_LABEL) :
80890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)            delegate->GetUserDisplayName(multiprofile_index_));
80990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    username->SetHorizontalAlignment(gfx::ALIGN_LEFT);
81090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
81190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
81290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  views::Label* additional = NULL;
81390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (login != ash::user::LOGGED_IN_GUEST) {
81490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    additional = new views::Label();
81590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    additional->SetText(login == ash::user::LOGGED_IN_LOCALLY_MANAGED ?
81690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        bundle.GetLocalizedString(IDS_ASH_STATUS_TRAY_LOCALLY_MANAGED_LABEL) :
81790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        UTF8ToUTF16(delegate->GetUserEmail(multiprofile_index_)));
81890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
81990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    additional->SetFont(bundle.GetFont(ui::ResourceBundle::SmallFont));
82090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    additional->SetHorizontalAlignment(gfx::ALIGN_LEFT);
82190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
82290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
82390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Adjust text properties dependent on if it is an active or inactive user.
82490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (multiprofile_index_) {
82590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // Fade the text of non active users to 50%.
82690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    SkColor text_color = additional->enabled_color();
82790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    text_color = SkColorSetA(text_color, SkColorGetA(text_color) / 2);
82890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    if (additional)
82990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      additional->SetDisabledColor(text_color);
83090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    if (username)
83190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      username->SetDisabledColor(text_color);
83290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
83390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
83490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (additional && username) {
83590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    views::View* details = new views::View;
83690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    details->SetLayoutManager(new views::BoxLayout(
83790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        views::BoxLayout::kVertical, 0, kUserDetailsVerticalPadding, 0));
83890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    details->AddChildView(username);
83990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    details->AddChildView(additional);
84090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    user_card_view_->AddChildView(details);
84190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  } else {
84290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    if (username)
84390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      user_card_view_->AddChildView(username);
84490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    if (additional)
84590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      user_card_view_->AddChildView(additional);
84690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
84790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
84890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
84990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)views::View* UserView::CreateIconForUserCard(ash::user::LoginStatus login) {
85090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  RoundedImageView* icon = new RoundedImageView(kProfileRoundedCornerRadius,
85190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                                multiprofile_index_ == 0);
85290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  icon->SetEnabled(false);
85390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (login == ash::user::LOGGED_IN_GUEST) {
85490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    icon->SetImage(*ui::ResourceBundle::GetSharedInstance().
85590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        GetImageNamed(IDR_AURA_UBER_TRAY_GUEST_ICON).ToImageSkia(),
85690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        gfx::Size(kUserIconSize, kUserIconSize));
85790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  } else {
85890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    icon->SetImage(
85990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        ash::Shell::GetInstance()->session_state_delegate()->
86090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)            GetUserImage(multiprofile_index_),
86190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        gfx::Size(kUserIconSize, kUserIconSize));
86290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
86390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  return icon;
86490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
8652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
86690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void UserView::AddLoggedInRetailModeUserCardContent() {
86790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  views::Label* details = new views::Label;
8682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance();
86990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  details->SetText(
87090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      bundle.GetLocalizedString(IDS_ASH_STATUS_TRAY_KIOSK_LABEL));
87190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  details->set_border(views::Border::CreateEmptyBorder(0, 4, 0, 1));
87290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  details->SetHorizontalAlignment(gfx::ALIGN_LEFT);
87390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  user_card_view_->AddChildView(details);
87490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
87590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
87690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void UserView::AddLoggedInPublicModeUserCardContent(SystemTrayItem* owner) {
87790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  user_card_view_->AddChildView(
87890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      CreateIconForUserCard(ash::user::LOGGED_IN_PUBLIC));
87990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  user_card_view_->AddChildView(new PublicAccountUserDetails(
88090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      owner, GetPreferredSize().width() + kTrayPopupPaddingBetweenItems));
88190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
88290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
88390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void UserView::ToggleAddUserMenuOption() {
88490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (add_menu_option_.get()) {
88590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    popup_message_.reset();
88690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    mouse_watcher_.reset();
88790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    add_menu_option_.reset();
88890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return;
88990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
890c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
89190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Note: We do not need to install a global event handler to delete this
89290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // item since it will destroyed automatically before the menu / user menu item
89390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // gets destroyed..
89490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  const SessionStateDelegate* session_state_delegate =
89590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      ash::Shell::GetInstance()->session_state_delegate();
89690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  add_user_visible_but_disabled_ =
89790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      session_state_delegate->NumberOfLoggedInUsers() >=
89890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          session_state_delegate->GetMaximumNumberOfLoggedInUsers();
89990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  add_menu_option_.reset(new views::Widget);
90090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  views::Widget::InitParams params;
90190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  params.type = views::Widget::InitParams::TYPE_TOOLTIP;
90290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  params.keep_on_top = true;
90390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  params.context = this->GetWidget()->GetNativeWindow();
90490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  params.accept_events = true;
90590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
90690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  params.transparent = true;
90790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  add_menu_option_->Init(params);
90890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  add_menu_option_->SetOpacity(0xFF);
90990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  add_menu_option_->GetNativeWindow()->set_owned_by_parent(false);
91090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  SetShadowType(add_menu_option_->GetNativeView(),
91190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                views::corewm::SHADOW_TYPE_NONE);
91290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
91390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Position it below our user card.
91490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  gfx::Rect bounds = user_card_view_->GetBoundsInScreen();
91590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  bounds.set_y(bounds.y() + bounds.height());
91690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  add_menu_option_->SetBounds(bounds);
91790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
91890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Show the content.
91990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  AddUserView* add_user_view = new AddUserView(
92090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      static_cast<UserCard*>(user_card_view_), this);
92190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  add_menu_option_->SetContentsView(add_user_view);
92290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  add_menu_option_->SetAlwaysOnTop(true);
92390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  add_menu_option_->Show();
92490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (add_user_visible_but_disabled_) {
92590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance();
92690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    popup_message_.reset(new PopupMessage(
92790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        bundle.GetLocalizedString(IDS_ASH_STATUS_TRAY_CAPTION_CANNOT_ADD_USER),
92890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        bundle.GetLocalizedString(IDS_ASH_STATUS_TRAY_MESSAGE_CANNOT_ADD_USER),
92990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        PopupMessage::ICON_WARNING,
93090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        add_user_view->anchor(),
93190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        views::BubbleBorder::TOP_LEFT,
93290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        gfx::Size(parent()->bounds().width() - kPopupMessageOffset, 0),
93390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        2 * kPopupMessageOffset));
93490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
93590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Find the screen area which encloses both elements and sets then a mouse
93690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // watcher which will close the "menu".
93790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  gfx::Rect area = user_card_view_->GetBoundsInScreen();
93890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  area.set_height(2 * area.height());
93990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  mouse_watcher_.reset(new views::MouseWatcher(
94090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      new UserViewMouseWatcherHost(area),
94190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      this));
94290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  mouse_watcher_->Start();
94390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
944c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
94590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)AddUserView::AddUserView(UserCard* owner, views::ButtonListener* listener)
94690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    : CustomButton(listener_),
94790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      add_user_(NULL),
94890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      listener_(listener),
94990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      owner_(owner),
95090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      anchor_(NULL) {
95190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  AddContent();
95290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  owner_->ForceBorderVisible(true);
95390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
954c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
95590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)AddUserView::~AddUserView() {
95690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  owner_->ForceBorderVisible(false);
95790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
95890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
95990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)gfx::Size AddUserView::GetPreferredSize() {
96090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  return owner_->bounds().size();
96190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
96290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
96390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)int AddUserView::GetHeightForWidth(int width) {
96490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  return owner_->bounds().size().height();
96590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
96690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
96790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void AddUserView::Layout() {
96890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  gfx::Rect contents_area(GetContentsBounds());
96990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  add_user_->SetBoundsRect(contents_area);
97090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
97190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
97290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void AddUserView::ButtonPressed(views::Button* sender, const ui::Event& event) {
97390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (add_user_ == sender)
97490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    listener_->ButtonPressed(this, event);
97590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  else
97690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    NOTREACHED();
97790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
97890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
97990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void AddUserView::AddContent() {
98090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  set_notify_enter_exit_on_child(true);
98190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
98290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  const SessionStateDelegate* delegate =
98390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      ash::Shell::GetInstance()->session_state_delegate();
98490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  bool enable = delegate->NumberOfLoggedInUsers() <
98590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                    delegate->GetMaximumNumberOfLoggedInUsers();
98690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
98790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  SetLayoutManager(new views::FillLayout());
98890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  set_background(views::Background::CreateSolidBackground(kBackgroundColor));
98990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
99090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Add padding around the panel.
99190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  set_border(views::Border::CreateSolidBorder(1, kBorderColor));
99290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
99390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  add_user_ = new UserCard(this, enable);
99490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  add_user_->set_border(views::Border::CreateEmptyBorder(
99590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      kUserCardVerticalPadding,
99690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      kTrayPopupPaddingHorizontal- kTrayUserTileHoverBorderInset,
99790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      kUserCardVerticalPadding,
99890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      kTrayPopupPaddingHorizontal- kTrayUserTileHoverBorderInset));
99990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
100090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  add_user_->SetLayoutManager(new views::BoxLayout(
100190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      views::BoxLayout::kHorizontal, 0, 0 , kTrayPopupPaddingBetweenItems));
100290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  AddChildViewAt(add_user_, 0);
100390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
100490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Add the [+] icon which is also the anchor for messages.
100590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance();
100690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  RoundedImageView* icon = new RoundedImageView(kProfileRoundedCornerRadius,
100790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                                true);
100890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  anchor_ = icon;
100990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  icon->SetImage(*ui::ResourceBundle::GetSharedInstance().
101090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      GetImageNamed(IDR_AURA_UBER_TRAY_ADD_MULTIPROFILE_USER).ToImageSkia(),
101190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      gfx::Size(kUserIconSize, kUserIconSize));
101290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  add_user_->AddChildView(icon);
101390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
101490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Add the command text.
101590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  views::Label* command_label = new views::Label(
101690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      bundle.GetLocalizedString(IDS_ASH_STATUS_TRAY_SIGN_IN_ANOTHER_ACCOUNT));
101790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  command_label->SetHorizontalAlignment(gfx::ALIGN_LEFT);
101890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  add_user_->AddChildView(command_label);
10192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace tray
10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
102390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)TrayUser::TrayUser(SystemTray* system_tray, MultiProfileIndex index)
10242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : SystemTrayItem(system_tray),
102590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      multiprofile_index_(index),
10262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      user_(NULL),
1027b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      layout_view_(NULL),
10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      avatar_(NULL),
102990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      label_(NULL),
103090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      separator_shown_(false) {
10312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Shell::GetInstance()->system_tray_notifier()->AddUserObserver(this);
10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TrayUser::~TrayUser() {
10352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Shell::GetInstance()->system_tray_notifier()->RemoveUserObserver(this);
10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
103890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)TrayUser::TestState TrayUser::GetStateForTest() const {
103990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (separator_shown_)
104090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return SEPARATOR;
104190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (!user_)
104290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return HIDDEN;
104390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  return user_->GetStateForTest();
104490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
104590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
104690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)gfx::Rect TrayUser::GetUserPanelBoundsInScreenForTest() const {
104790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DCHECK(user_);
104890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  return user_->GetBoundsInScreenOfUserButtonForTest();
104990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
105090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)views::View* TrayUser::CreateTrayView(user::LoginStatus status) {
1052b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  CHECK(layout_view_ == NULL);
105390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Only the current user gets an icon. All other users will only be
105490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // represented in the tray menu.
105590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (multiprofile_index_)
105690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return NULL;
105790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1058b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  layout_view_ = new views::View();
1059b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  layout_view_->SetLayoutManager(
1060b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      new views::BoxLayout(views::BoxLayout::kHorizontal,
1061b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)                           0, 0, kUserLabelToIconPadding));
10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateAfterLoginStatusChange(status);
1063b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  return layout_view_;
10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)views::View* TrayUser::CreateDefaultView(user::LoginStatus status) {
10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (status == user::LOGGED_IN_NONE)
10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK(user_ == NULL);
107190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
107290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  const SessionStateDelegate* session_state_delegate =
107390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      ash::Shell::GetInstance()->session_state_delegate();
107490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  int logged_in_users = session_state_delegate->NumberOfLoggedInUsers();
107590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
107690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // If there are multiple users logged in, the users will be separated from the
107790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // rest of the menu by a separator.
107890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (multiprofile_index_ ==
107990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          session_state_delegate->GetMaximumNumberOfLoggedInUsers() &&
108090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      logged_in_users > 1) {
108190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    separator_shown_ = true;
108290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return new views::View();
108390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
108490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
108590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Do not show more UserView's then there are logged in users.
108690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (multiprofile_index_ >= logged_in_users)
108790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return NULL;
108890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
108990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  user_ = new tray::UserView(this, status, multiprofile_index_);
10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return user_;
10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)views::View* TrayUser::CreateDetailedView(user::LoginStatus status) {
10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NULL;
10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayUser::DestroyTrayView() {
1098b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  layout_view_ = NULL;
10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  avatar_ = NULL;
11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  label_ = NULL;
110190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  separator_shown_ = false;
11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayUser::DestroyDefaultView() {
11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  user_ = NULL;
11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayUser::DestroyDetailedView() {
11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayUser::UpdateAfterLoginStatusChange(user::LoginStatus status) {
111290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Only the active user is represented in the tray.
111390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (!layout_view_)
111490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return;
1115b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  bool need_label = false;
1116b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  bool need_avatar = false;
11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (status) {
11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case user::LOGGED_IN_LOCKED:
11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case user::LOGGED_IN_USER:
11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case user::LOGGED_IN_OWNER:
11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case user::LOGGED_IN_PUBLIC:
1122b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      need_avatar = true;
1123b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      break;
11242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case user::LOGGED_IN_LOCALLY_MANAGED:
1125b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      need_avatar = true;
1126b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      need_label = true;
11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case user::LOGGED_IN_GUEST:
112990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      need_avatar = true;
11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
11312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case user::LOGGED_IN_RETAIL_MODE:
11322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case user::LOGGED_IN_KIOSK_APP:
11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case user::LOGGED_IN_NONE:
11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1136b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
1137b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  if ((need_avatar != (avatar_ != NULL)) ||
1138b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      (need_label != (label_ != NULL))) {
1139b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    layout_view_->RemoveAllChildViews(true);
1140b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    if (need_label) {
1141b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      label_ = new views::Label;
1142b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      SetupLabelForTray(label_);
1143b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      layout_view_->AddChildView(label_);
1144b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    } else {
1145b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      label_ = NULL;
1146b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    }
1147b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    if (need_avatar) {
114890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      avatar_ = new tray::RoundedImageView(kProfileRoundedCornerRadius, true);
1149b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      layout_view_->AddChildView(avatar_);
1150b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    } else {
1151b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      avatar_ = NULL;
1152b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    }
1153b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  }
1154b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
1155b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance();
1156b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  if (status == user::LOGGED_IN_LOCALLY_MANAGED) {
1157b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    label_->SetText(
1158b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        bundle.GetLocalizedString(IDS_ASH_STATUS_TRAY_LOCALLY_MANAGED_LABEL));
1159b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  }
1160b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
1161b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  if (avatar_) {
116290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    if (status == user::LOGGED_IN_GUEST) {
116390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        avatar_->SetImage(*ui::ResourceBundle::GetSharedInstance().
116490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)            GetImageNamed(IDR_AURA_UBER_TRAY_GUEST_ICON).ToImageSkia(),
116590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)            gfx::Size(kUserIconSize, kUserIconSize));
116690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    } else {
116790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      avatar_->SetImage(
116890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          ash::Shell::GetInstance()->session_state_delegate()->GetUserImage(
116990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)              multiprofile_index_),
117090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          gfx::Size(kUserIconSize, kUserIconSize));
117190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    }
1172b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  }
11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayUser::UpdateAfterShelfAlignmentChange(ShelfAlignment alignment) {
117690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Inactive users won't have a layout.
117790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (!layout_view_)
117890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return;
1179b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  if (alignment == SHELF_ALIGNMENT_BOTTOM ||
1180b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      alignment == SHELF_ALIGNMENT_TOP) {
1181b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    if (avatar_) {
11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      avatar_->set_border(views::Border::CreateEmptyBorder(
11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          0, kTrayImageItemHorizontalPaddingBottomAlignment + 2,
11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          0, kTrayImageItemHorizontalPaddingBottomAlignment));
1185b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1187b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    if (label_) {
11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      label_->set_border(views::Border::CreateEmptyBorder(
11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          0, kTrayLabelItemHorizontalPaddingBottomAlignment,
11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          0, kTrayLabelItemHorizontalPaddingBottomAlignment));
1191b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    }
1192b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    layout_view_->SetLayoutManager(
1193b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        new views::BoxLayout(views::BoxLayout::kHorizontal,
1194b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)                             0, 0, kUserLabelToIconPadding));
1195b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  } else {
1196b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    if (avatar_)
1197b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      SetTrayImageItemBorder(avatar_, alignment);
1198b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    if (label_) {
11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      label_->set_border(views::Border::CreateEmptyBorder(
12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          kTrayLabelItemVerticalPaddingVeriticalAlignment,
12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          kTrayLabelItemHorizontalPaddingBottomAlignment,
12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          kTrayLabelItemVerticalPaddingVeriticalAlignment,
12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          kTrayLabelItemHorizontalPaddingBottomAlignment));
12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1205b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    layout_view_->SetLayoutManager(
1206b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        new views::BoxLayout(views::BoxLayout::kVertical,
1207b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)                             0, 0, kUserLabelToIconPadding));
12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayUser::OnUserUpdate() {
12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check for null to avoid crbug.com/150944.
12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (avatar_) {
12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    avatar_->SetImage(
121590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        ash::Shell::GetInstance()->session_state_delegate()->GetUserImage(
121690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)            multiprofile_index_),
12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        gfx::Size(kUserIconSize, kUserIconSize));
12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace internal
12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace ash
1223