tray_user.cc revision a02191e04bc25c4935f804f2c080ae28663d096d
1994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org// Use of this source code is governed by a BSD-style license that can be 3994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org// found in the LICENSE file. 4994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 5994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org#include "ash/system/user/tray_user.h" 6994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 7994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org#include "ash/ash_switches.h" 8994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org#include "ash/root_window_controller.h" 9994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org#include "ash/session_state_delegate.h" 10994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org#include "ash/shelf/shelf_layout_manager.h" 11994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org#include "ash/shell_delegate.h" 12994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org#include "ash/system/tray/system_tray.h" 13994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org#include "ash/system/tray/system_tray_notifier.h" 14994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org#include "ash/system/tray/tray_constants.h" 15994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org#include "ash/system/tray/tray_item_view.h" 16994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org#include "ash/system/tray/tray_utils.h" 17994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org#include "ash/system/user/accounts_detailed_view.h" 18994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org#include "ash/system/user/rounded_image_view.h" 19994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org#include "ash/system/user/user_view.h" 20994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org#include "base/logging.h" 21994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org#include "base/strings/string16.h" 22994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org#include "grit/ash_strings.h" 23994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org#include "ui/aura/window.h" 24994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org#include "ui/base/l10n/l10n_util.h" 25994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org#include "ui/gfx/image/image.h" 26994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org#include "ui/views/border.h" 27994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org#include "ui/views/controls/label.h" 28994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org#include "ui/views/layout/box_layout.h" 29994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org#include "ui/views/view.h" 30994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org#include "ui/views/widget/widget.h" 31994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 32994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.orgnamespace { 33994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 34994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.orgconst int kUserLabelToIconPadding = 5; 35994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 36994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org} // namespace 37994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 38994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.orgnamespace ash { 39994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 40994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.orgTrayUser::TrayUser(SystemTray* system_tray, MultiProfileIndex index) 41994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org : SystemTrayItem(system_tray), 42994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org multiprofile_index_(index), 43994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org user_(NULL), 44994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org layout_view_(NULL), 45994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org avatar_(NULL), 46994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org label_(NULL) { 47994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org Shell::GetInstance()->system_tray_notifier()->AddUserObserver(this); 48994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org} 49994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 50994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.orgTrayUser::~TrayUser() { 51994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org Shell::GetInstance()->system_tray_notifier()->RemoveUserObserver(this); 52994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org} 53994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 54994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.orgTrayUser::TestState TrayUser::GetStateForTest() const { 55994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org if (!user_) 56994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org return HIDDEN; 57994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org return user_->GetStateForTest(); 58994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org} 59994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 60994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.orggfx::Size TrayUser::GetLayoutSizeForTest() const { 61994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org if (!layout_view_) { 62994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org return gfx::Size(0, 0); 63994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org } else { 642c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org return layout_view_->size(); 65994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org } 66994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org} 67994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 68994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.orggfx::Rect TrayUser::GetUserPanelBoundsInScreenForTest() const { 69994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org DCHECK(user_); 70994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org return user_->GetBoundsInScreenOfUserButtonForTest(); 71a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org} 72994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 73994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.orgvoid TrayUser::UpdateAfterLoginStatusChangeForTest(user::LoginStatus status) { 74994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org UpdateAfterLoginStatusChange(status); 75994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org} 76994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 77994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.orgviews::View* TrayUser::CreateTrayView(user::LoginStatus status) { 78994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org CHECK(layout_view_ == NULL); 79994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 804cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org layout_view_ = new views::View; 81994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org layout_view_->SetLayoutManager( 82994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org new views::BoxLayout(views::BoxLayout::kHorizontal, 837c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org 0, 0, kUserLabelToIconPadding)); 847c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org UpdateAfterLoginStatusChange(status); 857c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org return layout_view_; 867c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org} 877c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org 887c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.orgviews::View* TrayUser::CreateDefaultView(user::LoginStatus status) { 897c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org if (status == user::LOGGED_IN_NONE) 907c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org return NULL; 917c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org const SessionStateDelegate* session_state_delegate = 927c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org Shell::GetInstance()->session_state_delegate(); 93994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 94994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org // If the screen is locked show only the currently active user. 95994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org if (multiprofile_index_ && session_state_delegate->IsUserSessionBlocked()) 96994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org return NULL; 97994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 984cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org CHECK(user_ == NULL); 99994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 100994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org int logged_in_users = session_state_delegate->NumberOfLoggedInUsers(); 1017c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org 1027c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org // Do not show more UserView's then there are logged in users. 1037c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org if (multiprofile_index_ >= logged_in_users) 1047c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org return NULL; 105994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 106a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org user_ = new tray::UserView(this, status, multiprofile_index_, false); 107a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org return user_; 108a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org} 109a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org 110a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.orgviews::View* TrayUser::CreateDetailedView(user::LoginStatus status) { 111a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org return new tray::AccountsDetailedView(this, status); 112a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org} 113a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org 114a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.orgvoid TrayUser::DestroyTrayView() { 1157c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org layout_view_ = NULL; 1167c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org avatar_ = NULL; 1177c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org label_ = NULL; 1187c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org} 1197c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org 1207c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.orgvoid TrayUser::DestroyDefaultView() { 1217c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org user_ = NULL; 1227c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org} 1237c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org 1247c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.orgvoid TrayUser::DestroyDetailedView() { 1257c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org} 1267c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org 1277c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.orgvoid TrayUser::UpdateAfterLoginStatusChange(user::LoginStatus status) { 1287c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org // Only the active user is represented in the tray. 129994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org if (!layout_view_) 130994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org return; 1319ca3017c616a778baff6d57c68d6d4746a130036ulan@chromium.org if (GetTrayIndex() > 0) 1329ca3017c616a778baff6d57c68d6d4746a130036ulan@chromium.org return; 133994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org bool need_label = false; 134994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org bool need_avatar = false; 135994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org switch (status) { 136994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org case user::LOGGED_IN_LOCKED: 137994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org case user::LOGGED_IN_USER: 138994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org case user::LOGGED_IN_OWNER: 139994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org case user::LOGGED_IN_PUBLIC: 140994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org need_avatar = true; 141994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org break; 142994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org case user::LOGGED_IN_LOCALLY_MANAGED: 143994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org need_avatar = true; 144994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org need_label = true; 145994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org break; 146994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org case user::LOGGED_IN_GUEST: 147994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org need_label = true; 148994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org break; 149994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org case user::LOGGED_IN_RETAIL_MODE: 150994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org case user::LOGGED_IN_KIOSK_APP: 1517c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org case user::LOGGED_IN_NONE: 1527c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org break; 1537c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org } 1547c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org 1557c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org if ((need_avatar != (avatar_ != NULL)) || 1567c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org (need_label != (label_ != NULL))) { 1577c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org layout_view_->RemoveAllChildViews(true); 1587c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org if (need_label) { 1597c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org label_ = new views::Label; 1607c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org SetupLabelForTray(label_); 161994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org layout_view_->AddChildView(label_); 162994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org } else { 163994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org label_ = NULL; 164994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org } 165fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org if (need_avatar) { 166a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org avatar_ = new tray::RoundedImageView(kTrayAvatarCornerRadius, true); 1674efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org layout_view_->AddChildView(avatar_); 168a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org } else { 1694efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org avatar_ = NULL; 1704efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org } 171994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org } 172994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 173994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org if (status == user::LOGGED_IN_LOCALLY_MANAGED) { 174994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org label_->SetText( 175994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_LOCALLY_MANAGED_LABEL)); 176994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org } else if (status == user::LOGGED_IN_GUEST) { 177994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org label_->SetText(l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_GUEST_LABEL)); 178994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org } 179994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 180994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org if (avatar_) { 181fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org avatar_->SetCornerRadii( 182994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 0, kTrayAvatarCornerRadius, kTrayAvatarCornerRadius, 0); 183994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org avatar_->SetBorder(views::Border::NullBorder()); 184994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org } 185994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org UpdateAvatarImage(status); 186994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 187994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org // Update layout after setting label_ and avatar_ with new login status. 188994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org UpdateLayoutOfItem(); 189994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org} 190994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 191994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.orgvoid TrayUser::UpdateAfterShelfAlignmentChange(ShelfAlignment alignment) { 192994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org // Inactive users won't have a layout. 193994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org if (!layout_view_) 194994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org return; 195994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org if (alignment == SHELF_ALIGNMENT_BOTTOM || 196994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org alignment == SHELF_ALIGNMENT_TOP) { 197994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org if (avatar_) { 198994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org avatar_->SetBorder(views::Border::NullBorder()); 199994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org avatar_->SetCornerRadii( 200994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 0, kTrayAvatarCornerRadius, kTrayAvatarCornerRadius, 0); 201994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org } 202994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org if (label_) { 203994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org // If label_ hasn't figured out its size yet, do that first. 204994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org if (label_->GetContentsBounds().height() == 0) 205994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org label_->SizeToPreferredSize(); 206994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org int height = label_->GetContentsBounds().height(); 207994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org int vertical_pad = (kTrayItemSize - height) / 2; 208994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org int remainder = height % 2; 209994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org label_->SetBorder(views::Border::CreateEmptyBorder( 210994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org vertical_pad + remainder, 211994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org kTrayLabelItemHorizontalPaddingBottomAlignment, 212994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org vertical_pad, 213994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org kTrayLabelItemHorizontalPaddingBottomAlignment)); 214994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org } 215994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org layout_view_->SetLayoutManager( 216994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org new views::BoxLayout(views::BoxLayout::kHorizontal, 217994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 0, 0, kUserLabelToIconPadding)); 218994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org } else { 219994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org if (avatar_) { 220994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org avatar_->SetBorder(views::Border::NullBorder()); 221994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org avatar_->SetCornerRadii( 222994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 0, 0, kTrayAvatarCornerRadius, kTrayAvatarCornerRadius); 223994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org } 224994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org if (label_) { 225994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org label_->SetBorder(views::Border::CreateEmptyBorder( 226994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org kTrayLabelItemVerticalPaddingVerticalAlignment, 227994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org kTrayLabelItemHorizontalPaddingBottomAlignment, 228994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org kTrayLabelItemVerticalPaddingVerticalAlignment, 229994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org kTrayLabelItemHorizontalPaddingBottomAlignment)); 230994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org } 231994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org layout_view_->SetLayoutManager( 232994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org new views::BoxLayout(views::BoxLayout::kVertical, 233994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 0, 0, kUserLabelToIconPadding)); 234994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org } 235994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org} 236994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 237994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.orgvoid TrayUser::OnUserUpdate() { 238994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org UpdateAvatarImage(Shell::GetInstance()->system_tray_delegate()-> 239994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org GetUserLoginStatus()); 240994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org} 241994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 242994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.orgvoid TrayUser::OnUserAddedToSession() { 243994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org SessionStateDelegate* session_state_delegate = 244994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org Shell::GetInstance()->session_state_delegate(); 245994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org // Only create views for user items which are logged in. 246994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org if (GetTrayIndex() >= session_state_delegate->NumberOfLoggedInUsers()) 247994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org return; 248994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 249994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org // Enforce a layout change that newly added items become visible. 250994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org UpdateLayoutOfItem(); 251994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 252994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org // Update the user item. 253994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org UpdateAvatarImage( 254994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org Shell::GetInstance()->system_tray_delegate()->GetUserLoginStatus()); 255994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org} 256994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 257994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.orgvoid TrayUser::UpdateAvatarImage(user::LoginStatus status) { 258994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org SessionStateDelegate* session_state_delegate = 259994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org Shell::GetInstance()->session_state_delegate(); 260994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org if (!avatar_ || 261994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org GetTrayIndex() >= session_state_delegate->NumberOfLoggedInUsers()) 262994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org return; 263994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 264994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org content::BrowserContext* context = session_state_delegate-> 265994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org GetBrowserContextByIndex(GetTrayIndex()); 266994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org avatar_->SetImage(session_state_delegate->GetUserImage(context), 267994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org gfx::Size(kTrayAvatarSize, kTrayAvatarSize)); 268994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 269994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org // Unit tests might come here with no images for some users. 270994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org if (avatar_->size().IsEmpty()) 271994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org avatar_->SetSize(gfx::Size(kTrayAvatarSize, kTrayAvatarSize)); 272994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org} 273994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 274994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.orgMultiProfileIndex TrayUser::GetTrayIndex() { 275994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org Shell* shell = Shell::GetInstance(); 276994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org // If multi profile is not enabled we can use the normal index. 277994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org if (!shell->delegate()->IsMultiProfilesEnabled()) 278994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org return multiprofile_index_; 279994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org // In case of multi profile we need to mirror the indices since the system 280994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org // tray items are in the reverse order then the menu items. 281994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org return shell->session_state_delegate()->GetMaximumNumberOfLoggedInUsers() - 282994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 1 - multiprofile_index_; 283994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org} 284994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 285994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.orgvoid TrayUser::UpdateLayoutOfItem() { 286994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org RootWindowController* controller = GetRootWindowController( 287994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org system_tray()->GetWidget()->GetNativeWindow()->GetRootWindow()); 288994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org if (controller && controller->shelf()) { 289994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org UpdateAfterShelfAlignmentChange( 290994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org controller->GetShelfLayoutManager()->GetAlignment()); 291994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org } 292994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org} 293994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 294994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org} // namespace ash 295994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org