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)
77dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "ash/ash_switches.h"
83551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "ash/root_window_controller.h"
95c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "ash/session/session_state_delegate.h"
103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "ash/shelf/shelf_layout_manager.h"
11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ash/shell_delegate.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/system/tray/system_tray.h"
135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "ash/system/tray/system_tray_delegate.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/system/tray/system_tray_notifier.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/tray/tray_constants.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/tray/tray_item_view.h"
17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ash/system/tray/tray_utils.h"
18a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "ash/system/user/accounts_detailed_view.h"
19a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "ash/system/user/rounded_image_view.h"
20a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "ash/system/user/user_view.h"
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/logging.h"
22868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string16.h"
23116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/user_manager/user_info.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/ash_strings.h"
2590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "ui/aura/window.h"
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/image/image.h"
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/border.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/label.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/layout/box_layout.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/view.h"
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/widget.h"
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)const int kUserLabelToIconPadding = 5;
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ash {
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)TrayUser::TrayUser(SystemTray* system_tray, MultiProfileIndex index)
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : SystemTrayItem(system_tray),
4490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      multiprofile_index_(index),
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      user_(NULL),
46b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      layout_view_(NULL),
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      avatar_(NULL),
48f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      label_(NULL) {
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Shell::GetInstance()->system_tray_notifier()->AddUserObserver(this);
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TrayUser::~TrayUser() {
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Shell::GetInstance()->system_tray_notifier()->RemoveUserObserver(this);
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)TrayUser::TestState TrayUser::GetStateForTest() const {
5790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (!user_)
5890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return HIDDEN;
5990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  return user_->GetStateForTest();
6090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
6190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
62a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)gfx::Size TrayUser::GetLayoutSizeForTest() const {
63a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (!layout_view_) {
64a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return gfx::Size(0, 0);
65a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  } else {
66a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return layout_view_->size();
67a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
7090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)gfx::Rect TrayUser::GetUserPanelBoundsInScreenForTest() const {
7190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DCHECK(user_);
7290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  return user_->GetBoundsInScreenOfUserButtonForTest();
7390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
7490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
75a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void TrayUser::UpdateAfterLoginStatusChangeForTest(user::LoginStatus status) {
76a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  UpdateAfterLoginStatusChange(status);
77a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
78a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)views::View* TrayUser::CreateTrayView(user::LoginStatus status) {
80b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  CHECK(layout_view_ == NULL);
8190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
82a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  layout_view_ = new views::View;
83b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  layout_view_->SetLayoutManager(
84b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      new views::BoxLayout(views::BoxLayout::kHorizontal,
85b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)                           0, 0, kUserLabelToIconPadding));
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateAfterLoginStatusChange(status);
87b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  return layout_view_;
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)views::View* TrayUser::CreateDefaultView(user::LoginStatus status) {
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (status == user::LOGGED_IN_NONE)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
931e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  const SessionStateDelegate* session_state_delegate =
941e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      Shell::GetInstance()->session_state_delegate();
951e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
9603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // If the screen is locked or a system modal dialog box is shown, show only
9703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // the currently active user.
9803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  if (multiprofile_index_ &&
9903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      (session_state_delegate->IsUserSessionBlocked() ||
10003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)       Shell::GetInstance()->IsSystemModalWindowOpen()))
1011e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    return NULL;
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK(user_ == NULL);
10490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
10590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  int logged_in_users = session_state_delegate->NumberOfLoggedInUsers();
10690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
10790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Do not show more UserView's then there are logged in users.
10890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (multiprofile_index_ >= logged_in_users)
10990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return NULL;
11090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
111a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  user_ = new tray::UserView(this, status, multiprofile_index_, false);
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return user_;
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)views::View* TrayUser::CreateDetailedView(user::LoginStatus status) {
116a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  return new tray::AccountsDetailedView(this, status);
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayUser::DestroyTrayView() {
120b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  layout_view_ = NULL;
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  avatar_ = NULL;
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  label_ = NULL;
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayUser::DestroyDefaultView() {
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  user_ = NULL;
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayUser::DestroyDetailedView() {
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayUser::UpdateAfterLoginStatusChange(user::LoginStatus status) {
13390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Only the active user is represented in the tray.
13490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (!layout_view_)
13590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return;
136a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (GetTrayIndex() > 0)
137f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return;
138b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  bool need_label = false;
139b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  bool need_avatar = false;
1401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SystemTrayDelegate* delegate = Shell::GetInstance()->system_tray_delegate();
1411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (delegate->IsUserSupervised())
1421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    need_label =  true;
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (status) {
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case user::LOGGED_IN_LOCKED:
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case user::LOGGED_IN_USER:
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case user::LOGGED_IN_OWNER:
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case user::LOGGED_IN_PUBLIC:
148b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      need_avatar = true;
149b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      break;
1505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    case user::LOGGED_IN_SUPERVISED:
151b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      need_avatar = true;
152b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      need_label = true;
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case user::LOGGED_IN_GUEST:
1553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      need_label = true;
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case user::LOGGED_IN_RETAIL_MODE:
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case user::LOGGED_IN_KIOSK_APP:
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case user::LOGGED_IN_NONE:
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
162b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
163b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  if ((need_avatar != (avatar_ != NULL)) ||
164b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      (need_label != (label_ != NULL))) {
165b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    layout_view_->RemoveAllChildViews(true);
166b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    if (need_label) {
167b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      label_ = new views::Label;
168b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      SetupLabelForTray(label_);
169b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      layout_view_->AddChildView(label_);
170b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    } else {
171b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      label_ = NULL;
172b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    }
173b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    if (need_avatar) {
174a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      avatar_ = new tray::RoundedImageView(kTrayAvatarCornerRadius, true);
175b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      layout_view_->AddChildView(avatar_);
176b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    } else {
177b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      avatar_ = NULL;
178b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    }
179b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  }
180b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
1811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (delegate->IsUserSupervised()) {
182b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    label_->SetText(
1835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_SUPERVISED_LABEL));
1843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  } else if (status == user::LOGGED_IN_GUEST) {
185a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    label_->SetText(l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_GUEST_LABEL));
186b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  }
187b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
188a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  if (avatar_) {
189a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    avatar_->SetCornerRadii(
190a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        0, kTrayAvatarCornerRadius, kTrayAvatarCornerRadius, 0);
1915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    avatar_->SetBorder(views::Border::NullBorder());
1927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
193ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  UpdateAvatarImage(status);
1943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Update layout after setting label_ and avatar_ with new login status.
1964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  UpdateLayoutOfItem();
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayUser::UpdateAfterShelfAlignmentChange(ShelfAlignment alignment) {
20090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Inactive users won't have a layout.
20190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (!layout_view_)
20290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return;
203b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  if (alignment == SHELF_ALIGNMENT_BOTTOM ||
204b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      alignment == SHELF_ALIGNMENT_TOP) {
205b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    if (avatar_) {
206a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      avatar_->SetBorder(views::Border::NullBorder());
207a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      avatar_->SetCornerRadii(
208a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch          0, kTrayAvatarCornerRadius, kTrayAvatarCornerRadius, 0);
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
210b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    if (label_) {
211a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      // If label_ hasn't figured out its size yet, do that first.
212a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      if (label_->GetContentsBounds().height() == 0)
213a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        label_->SizeToPreferredSize();
214a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      int height = label_->GetContentsBounds().height();
215a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      int vertical_pad = (kTrayItemSize - height) / 2;
216a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      int remainder = height % 2;
2175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      label_->SetBorder(views::Border::CreateEmptyBorder(
218a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          vertical_pad + remainder,
2195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          kTrayLabelItemHorizontalPaddingBottomAlignment,
220a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          vertical_pad,
2215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          kTrayLabelItemHorizontalPaddingBottomAlignment));
222b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    }
223b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    layout_view_->SetLayoutManager(
224b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        new views::BoxLayout(views::BoxLayout::kHorizontal,
225b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)                             0, 0, kUserLabelToIconPadding));
226b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  } else {
2277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    if (avatar_) {
228a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      avatar_->SetBorder(views::Border::NullBorder());
229a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      avatar_->SetCornerRadii(
230a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch          0, 0, kTrayAvatarCornerRadius, kTrayAvatarCornerRadius);
2317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    }
232b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    if (label_) {
2335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      label_->SetBorder(views::Border::CreateEmptyBorder(
234d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)          kTrayLabelItemVerticalPaddingVerticalAlignment,
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          kTrayLabelItemHorizontalPaddingBottomAlignment,
236d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)          kTrayLabelItemVerticalPaddingVerticalAlignment,
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          kTrayLabelItemHorizontalPaddingBottomAlignment));
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
239b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    layout_view_->SetLayoutManager(
240b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        new views::BoxLayout(views::BoxLayout::kVertical,
241b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)                             0, 0, kUserLabelToIconPadding));
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayUser::OnUserUpdate() {
246ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  UpdateAvatarImage(Shell::GetInstance()->system_tray_delegate()->
247ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      GetUserLoginStatus());
248ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
249ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
2504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void TrayUser::OnUserAddedToSession() {
2514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  SessionStateDelegate* session_state_delegate =
2524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      Shell::GetInstance()->session_state_delegate();
2534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Only create views for user items which are logged in.
2544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (GetTrayIndex() >= session_state_delegate->NumberOfLoggedInUsers())
2554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return;
2564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Enforce a layout change that newly added items become visible.
2584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  UpdateLayoutOfItem();
2594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Update the user item.
2614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  UpdateAvatarImage(
2624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      Shell::GetInstance()->system_tray_delegate()->GetUserLoginStatus());
2634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
2644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
265ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid TrayUser::UpdateAvatarImage(user::LoginStatus status) {
2664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  SessionStateDelegate* session_state_delegate =
2674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      Shell::GetInstance()->session_state_delegate();
2684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (!avatar_ ||
2694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      GetTrayIndex() >= session_state_delegate->NumberOfLoggedInUsers())
270ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    return;
271ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
27234680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  const user_manager::UserInfo* user_info =
27334680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)      session_state_delegate->GetUserInfo(GetTrayIndex());
27434680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  CHECK(user_info);
27534680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  avatar_->SetImage(user_info->GetImage(),
276a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                    gfx::Size(kTrayAvatarSize, kTrayAvatarSize));
2774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Unit tests might come here with no images for some users.
2794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (avatar_->size().IsEmpty())
280a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    avatar_->SetSize(gfx::Size(kTrayAvatarSize, kTrayAvatarSize));
2814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
2824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)MultiProfileIndex TrayUser::GetTrayIndex() {
2844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  Shell* shell = Shell::GetInstance();
2854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // If multi profile is not enabled we can use the normal index.
2864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (!shell->delegate()->IsMultiProfilesEnabled())
2874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return multiprofile_index_;
2884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // In case of multi profile we need to mirror the indices since the system
2894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // tray items are in the reverse order then the menu items.
2904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  return shell->session_state_delegate()->GetMaximumNumberOfLoggedInUsers() -
291f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)             1 - multiprofile_index_;
2924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
2934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void TrayUser::UpdateLayoutOfItem() {
295c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  RootWindowController* controller = GetRootWindowController(
296c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      system_tray()->GetWidget()->GetNativeWindow()->GetRootWindow());
2974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (controller && controller->shelf()) {
2984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    UpdateAfterShelfAlignmentChange(
2994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        controller->GetShelfLayoutManager()->GetAlignment());
3004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace ash
304