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