tray_user.cc revision 5821806d5e7f356e8fa4b058a389a808ea183019
125b3c049e70834cf33790a28643ab058b507b35cBen Cheng// Copyright (c) 2012 The Chromium Authors. All rights reserved. 225b3c049e70834cf33790a28643ab058b507b35cBen Cheng// Use of this source code is governed by a BSD-style license that can be 325b3c049e70834cf33790a28643ab058b507b35cBen Cheng// found in the LICENSE file. 425b3c049e70834cf33790a28643ab058b507b35cBen Cheng 525b3c049e70834cf33790a28643ab058b507b35cBen Cheng#include "ash/system/user/tray_user.h" 625b3c049e70834cf33790a28643ab058b507b35cBen Cheng 725b3c049e70834cf33790a28643ab058b507b35cBen Cheng#include "ash/shell.h" 825b3c049e70834cf33790a28643ab058b507b35cBen Cheng#include "ash/system/tray/system_tray_delegate.h" 925b3c049e70834cf33790a28643ab058b507b35cBen Cheng#include "ash/system/tray/tray_constants.h" 1025b3c049e70834cf33790a28643ab058b507b35cBen Cheng#include "ash/system/tray/tray_item_view.h" 1125b3c049e70834cf33790a28643ab058b507b35cBen Cheng#include "ash/system/tray/tray_views.h" 1225b3c049e70834cf33790a28643ab058b507b35cBen Cheng#include "base/utf_string_conversions.h" 1325b3c049e70834cf33790a28643ab058b507b35cBen Cheng#include "grit/ash_strings.h" 1425b3c049e70834cf33790a28643ab058b507b35cBen Cheng#include "skia/ext/image_operations.h" 1525b3c049e70834cf33790a28643ab058b507b35cBen Cheng#include "third_party/skia/include/core/SkCanvas.h" 1625b3c049e70834cf33790a28643ab058b507b35cBen Cheng#include "third_party/skia/include/core/SkPaint.h" 1725b3c049e70834cf33790a28643ab058b507b35cBen Cheng#include "third_party/skia/include/core/SkPath.h" 1825b3c049e70834cf33790a28643ab058b507b35cBen Cheng#include "ui/base/resource/resource_bundle.h" 1925b3c049e70834cf33790a28643ab058b507b35cBen Cheng#include "ui/gfx/canvas.h" 2025b3c049e70834cf33790a28643ab058b507b35cBen Cheng#include "ui/gfx/image/image.h" 2125b3c049e70834cf33790a28643ab058b507b35cBen Cheng#include "ui/gfx/image/image_skia_operations.h" 2225b3c049e70834cf33790a28643ab058b507b35cBen Cheng#include "ui/gfx/size.h" 2325b3c049e70834cf33790a28643ab058b507b35cBen Cheng#include "ui/gfx/skia_util.h" 2425b3c049e70834cf33790a28643ab058b507b35cBen Cheng#include "ui/views/controls/button/button.h" 2525b3c049e70834cf33790a28643ab058b507b35cBen Cheng#include "ui/views/controls/button/text_button.h" 2625b3c049e70834cf33790a28643ab058b507b35cBen Cheng#include "ui/views/controls/image_view.h" 2725b3c049e70834cf33790a28643ab058b507b35cBen Cheng#include "ui/views/controls/label.h" 2825b3c049e70834cf33790a28643ab058b507b35cBen Cheng#include "ui/views/layout/box_layout.h" 2925b3c049e70834cf33790a28643ab058b507b35cBen Cheng#include "ui/views/view.h" 3025b3c049e70834cf33790a28643ab058b507b35cBen Cheng#include "ui/views/widget/widget.h" 3125b3c049e70834cf33790a28643ab058b507b35cBen Cheng 3225b3c049e70834cf33790a28643ab058b507b35cBen Chengnamespace { 3325b3c049e70834cf33790a28643ab058b507b35cBen Cheng 3425b3c049e70834cf33790a28643ab058b507b35cBen Chengconst int kUserInfoVerticalPadding = 10; 3525b3c049e70834cf33790a28643ab058b507b35cBen Chengconst int kUserIconSize = 27; 3625b3c049e70834cf33790a28643ab058b507b35cBen Chengconst int kProfileRoundedCornerRadius = 2; 3725b3c049e70834cf33790a28643ab058b507b35cBen Cheng 3825b3c049e70834cf33790a28643ab058b507b35cBen Cheng} // namespace 3925b3c049e70834cf33790a28643ab058b507b35cBen Cheng 4025b3c049e70834cf33790a28643ab058b507b35cBen Chengnamespace ash { 4125b3c049e70834cf33790a28643ab058b507b35cBen Chengnamespace internal { 4225b3c049e70834cf33790a28643ab058b507b35cBen Cheng 4325b3c049e70834cf33790a28643ab058b507b35cBen Chengnamespace tray { 4425b3c049e70834cf33790a28643ab058b507b35cBen Cheng 4525b3c049e70834cf33790a28643ab058b507b35cBen Cheng// A custom image view with rounded edges. 4625b3c049e70834cf33790a28643ab058b507b35cBen Chengclass RoundedImageView : public views::View { 4725b3c049e70834cf33790a28643ab058b507b35cBen Cheng public: 4825b3c049e70834cf33790a28643ab058b507b35cBen Cheng // Constructs a new rounded image view with rounded corners of radius 4925b3c049e70834cf33790a28643ab058b507b35cBen Cheng // |corner_radius|. 5025b3c049e70834cf33790a28643ab058b507b35cBen Cheng explicit RoundedImageView(int corner_radius) : corner_radius_(corner_radius) { 5125b3c049e70834cf33790a28643ab058b507b35cBen Cheng } 5225b3c049e70834cf33790a28643ab058b507b35cBen Cheng 5325b3c049e70834cf33790a28643ab058b507b35cBen Cheng virtual ~RoundedImageView() { 5425b3c049e70834cf33790a28643ab058b507b35cBen Cheng } 5525b3c049e70834cf33790a28643ab058b507b35cBen Cheng 5625b3c049e70834cf33790a28643ab058b507b35cBen Cheng // Set the image that should be displayed from a pointer. The pointer 5725b3c049e70834cf33790a28643ab058b507b35cBen Cheng // contents is copied in the receiver's image. 5825b3c049e70834cf33790a28643ab058b507b35cBen Cheng void SetImage(const gfx::ImageSkia& img, const gfx::Size& size) { 5925b3c049e70834cf33790a28643ab058b507b35cBen Cheng image_ = img; 6025b3c049e70834cf33790a28643ab058b507b35cBen Cheng image_size_ = size; 6125b3c049e70834cf33790a28643ab058b507b35cBen Cheng 6225b3c049e70834cf33790a28643ab058b507b35cBen Cheng // Try to get the best image quality for the avatar. 6325b3c049e70834cf33790a28643ab058b507b35cBen Cheng resized_ = gfx::ImageSkiaOperations::CreateResizedImage(image_, 6425b3c049e70834cf33790a28643ab058b507b35cBen Cheng skia::ImageOperations::RESIZE_BEST, size); 6525b3c049e70834cf33790a28643ab058b507b35cBen Cheng if (GetWidget() && visible()) { 6625b3c049e70834cf33790a28643ab058b507b35cBen Cheng PreferredSizeChanged(); 6725b3c049e70834cf33790a28643ab058b507b35cBen Cheng SchedulePaint(); 6825b3c049e70834cf33790a28643ab058b507b35cBen Cheng } 6925b3c049e70834cf33790a28643ab058b507b35cBen Cheng } 7025b3c049e70834cf33790a28643ab058b507b35cBen Cheng 7125b3c049e70834cf33790a28643ab058b507b35cBen Cheng // Overridden from views::View. 7225b3c049e70834cf33790a28643ab058b507b35cBen Cheng virtual gfx::Size GetPreferredSize() OVERRIDE { 7325b3c049e70834cf33790a28643ab058b507b35cBen Cheng return gfx::Size(image_size_.width() + GetInsets().width(), 7425b3c049e70834cf33790a28643ab058b507b35cBen Cheng image_size_.height() + GetInsets().height()); 7525b3c049e70834cf33790a28643ab058b507b35cBen Cheng } 7625b3c049e70834cf33790a28643ab058b507b35cBen Cheng 7725b3c049e70834cf33790a28643ab058b507b35cBen Cheng virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE { 7825b3c049e70834cf33790a28643ab058b507b35cBen Cheng View::OnPaint(canvas); 7925b3c049e70834cf33790a28643ab058b507b35cBen Cheng gfx::Rect image_bounds(size()); 8025b3c049e70834cf33790a28643ab058b507b35cBen Cheng image_bounds.ClampToCenteredSize(GetPreferredSize()); 8125b3c049e70834cf33790a28643ab058b507b35cBen Cheng image_bounds.Inset(GetInsets()); 8225b3c049e70834cf33790a28643ab058b507b35cBen Cheng const SkScalar kRadius = SkIntToScalar(corner_radius_); 8325b3c049e70834cf33790a28643ab058b507b35cBen Cheng SkPath path; 8425b3c049e70834cf33790a28643ab058b507b35cBen Cheng path.addRoundRect(gfx::RectToSkRect(image_bounds), kRadius, kRadius); 8525b3c049e70834cf33790a28643ab058b507b35cBen Cheng SkPaint paint; 8625b3c049e70834cf33790a28643ab058b507b35cBen Cheng paint.setAntiAlias(true); 8725b3c049e70834cf33790a28643ab058b507b35cBen Cheng paint.setXfermodeMode(SkXfermode::kSrcOver_Mode); 8825b3c049e70834cf33790a28643ab058b507b35cBen Cheng canvas->DrawImageInPath(resized_, image_bounds.x(), image_bounds.y(), 8925b3c049e70834cf33790a28643ab058b507b35cBen Cheng path, paint); 9025b3c049e70834cf33790a28643ab058b507b35cBen Cheng } 9125b3c049e70834cf33790a28643ab058b507b35cBen Cheng 9225b3c049e70834cf33790a28643ab058b507b35cBen Cheng private: 9325b3c049e70834cf33790a28643ab058b507b35cBen Cheng gfx::ImageSkia image_; 9425b3c049e70834cf33790a28643ab058b507b35cBen Cheng gfx::ImageSkia resized_; 9525b3c049e70834cf33790a28643ab058b507b35cBen Cheng gfx::Size image_size_; 9625b3c049e70834cf33790a28643ab058b507b35cBen Cheng int corner_radius_; 9725b3c049e70834cf33790a28643ab058b507b35cBen Cheng 9825b3c049e70834cf33790a28643ab058b507b35cBen Cheng DISALLOW_COPY_AND_ASSIGN(RoundedImageView); 9925b3c049e70834cf33790a28643ab058b507b35cBen Cheng}; 10025b3c049e70834cf33790a28643ab058b507b35cBen Cheng 10125b3c049e70834cf33790a28643ab058b507b35cBen Chengclass UserView : public views::View, 10225b3c049e70834cf33790a28643ab058b507b35cBen Cheng public views::ButtonListener { 10325b3c049e70834cf33790a28643ab058b507b35cBen Cheng public: 10425b3c049e70834cf33790a28643ab058b507b35cBen Cheng explicit UserView(ash::user::LoginStatus login) 10525b3c049e70834cf33790a28643ab058b507b35cBen Cheng : login_(login), 10625b3c049e70834cf33790a28643ab058b507b35cBen Cheng container_(NULL), 10725b3c049e70834cf33790a28643ab058b507b35cBen Cheng user_info_(NULL), 10825b3c049e70834cf33790a28643ab058b507b35cBen Cheng username_(NULL), 10925b3c049e70834cf33790a28643ab058b507b35cBen Cheng email_(NULL), 11025b3c049e70834cf33790a28643ab058b507b35cBen Cheng signout_(NULL) { 11125b3c049e70834cf33790a28643ab058b507b35cBen Cheng CHECK(login_ != ash::user::LOGGED_IN_NONE); 11225b3c049e70834cf33790a28643ab058b507b35cBen Cheng set_background(views::Background::CreateSolidBackground(kBackgroundColor)); 11325b3c049e70834cf33790a28643ab058b507b35cBen Cheng 11425b3c049e70834cf33790a28643ab058b507b35cBen Cheng bool guest = login_ == ash::user::LOGGED_IN_GUEST; 11525b3c049e70834cf33790a28643ab058b507b35cBen Cheng bool locked = login_ == ash::user::LOGGED_IN_LOCKED; 11625b3c049e70834cf33790a28643ab058b507b35cBen Cheng 11725b3c049e70834cf33790a28643ab058b507b35cBen Cheng container_ = new TrayPopupTextButtonContainer; 11825b3c049e70834cf33790a28643ab058b507b35cBen Cheng container_->layout()->set_spread_blank_space(false); 11925b3c049e70834cf33790a28643ab058b507b35cBen Cheng AddChildView(container_); 12025b3c049e70834cf33790a28643ab058b507b35cBen Cheng 12125b3c049e70834cf33790a28643ab058b507b35cBen Cheng if (!guest) 12225b3c049e70834cf33790a28643ab058b507b35cBen Cheng AddUserInfo(); 12325b3c049e70834cf33790a28643ab058b507b35cBen Cheng 12425b3c049e70834cf33790a28643ab058b507b35cBen Cheng // A user should not be able to modify logged in state when screen is 12525b3c049e70834cf33790a28643ab058b507b35cBen Cheng // locked. 12625b3c049e70834cf33790a28643ab058b507b35cBen Cheng if (!locked) 12725b3c049e70834cf33790a28643ab058b507b35cBen Cheng AddButtonContainer(); 12825b3c049e70834cf33790a28643ab058b507b35cBen Cheng } 12925b3c049e70834cf33790a28643ab058b507b35cBen Cheng 13025b3c049e70834cf33790a28643ab058b507b35cBen Cheng virtual ~UserView() {} 13125b3c049e70834cf33790a28643ab058b507b35cBen Cheng 13225b3c049e70834cf33790a28643ab058b507b35cBen Cheng // Create container for buttons. 13325b3c049e70834cf33790a28643ab058b507b35cBen Cheng void AddButtonContainer() { 13425b3c049e70834cf33790a28643ab058b507b35cBen Cheng TrayPopupTextButton* button = new TrayPopupTextButton(this, 13525b3c049e70834cf33790a28643ab058b507b35cBen Cheng ash::user::GetLocalizedSignOutStringForStatus(login_)); 13625b3c049e70834cf33790a28643ab058b507b35cBen Cheng container_->AddTextButton(button); 13725b3c049e70834cf33790a28643ab058b507b35cBen Cheng signout_ = button; 13825b3c049e70834cf33790a28643ab058b507b35cBen Cheng } 13925b3c049e70834cf33790a28643ab058b507b35cBen Cheng 14025b3c049e70834cf33790a28643ab058b507b35cBen Cheng private: 14125b3c049e70834cf33790a28643ab058b507b35cBen Cheng void AddUserInfo() { 14225b3c049e70834cf33790a28643ab058b507b35cBen Cheng user_info_ = new views::View; 14325b3c049e70834cf33790a28643ab058b507b35cBen Cheng user_info_->SetLayoutManager(new views::BoxLayout( 14425b3c049e70834cf33790a28643ab058b507b35cBen Cheng views::BoxLayout::kHorizontal, kTrayPopupPaddingHorizontal, 14525b3c049e70834cf33790a28643ab058b507b35cBen Cheng kUserInfoVerticalPadding, kTrayPopupPaddingBetweenItems)); 14625b3c049e70834cf33790a28643ab058b507b35cBen Cheng container_->AddChildView(user_info_); 14725b3c049e70834cf33790a28643ab058b507b35cBen Cheng 14825b3c049e70834cf33790a28643ab058b507b35cBen Cheng if (login_ == ash::user::LOGGED_IN_KIOSK) { 14925b3c049e70834cf33790a28643ab058b507b35cBen Cheng views::Label* label = new views::Label; 15025b3c049e70834cf33790a28643ab058b507b35cBen Cheng ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance(); 15125b3c049e70834cf33790a28643ab058b507b35cBen Cheng label->SetText( 15225b3c049e70834cf33790a28643ab058b507b35cBen Cheng bundle.GetLocalizedString(IDS_ASH_STATUS_TRAY_KIOSK_LABEL)); 15325b3c049e70834cf33790a28643ab058b507b35cBen Cheng label->set_border(views::Border::CreateEmptyBorder( 15425b3c049e70834cf33790a28643ab058b507b35cBen Cheng 0, 4, 0, 1)); 15525b3c049e70834cf33790a28643ab058b507b35cBen Cheng label->SetHorizontalAlignment(gfx::ALIGN_LEFT); 15625b3c049e70834cf33790a28643ab058b507b35cBen Cheng user_info_->AddChildView(label); 15725b3c049e70834cf33790a28643ab058b507b35cBen Cheng return; 15825b3c049e70834cf33790a28643ab058b507b35cBen Cheng } 15925b3c049e70834cf33790a28643ab058b507b35cBen Cheng 16025b3c049e70834cf33790a28643ab058b507b35cBen Cheng RoundedImageView* image = new RoundedImageView(kProfileRoundedCornerRadius); 16125b3c049e70834cf33790a28643ab058b507b35cBen Cheng image->SetImage(ash::Shell::GetInstance()->tray_delegate()->GetUserImage(), 16225b3c049e70834cf33790a28643ab058b507b35cBen Cheng gfx::Size(kUserIconSize, kUserIconSize)); 16325b3c049e70834cf33790a28643ab058b507b35cBen Cheng user_info_->AddChildView(image); 16425b3c049e70834cf33790a28643ab058b507b35cBen Cheng 16525b3c049e70834cf33790a28643ab058b507b35cBen Cheng views::View* user = new views::View; 16625b3c049e70834cf33790a28643ab058b507b35cBen Cheng user->SetLayoutManager(new views::BoxLayout( 16725b3c049e70834cf33790a28643ab058b507b35cBen Cheng views::BoxLayout::kVertical, 0, 5, 0)); 16825b3c049e70834cf33790a28643ab058b507b35cBen Cheng ash::SystemTrayDelegate* tray = 16925b3c049e70834cf33790a28643ab058b507b35cBen Cheng ash::Shell::GetInstance()->tray_delegate(); 17025b3c049e70834cf33790a28643ab058b507b35cBen Cheng username_ = new views::Label(tray->GetUserDisplayName()); 17125b3c049e70834cf33790a28643ab058b507b35cBen Cheng username_->SetHorizontalAlignment(gfx::ALIGN_LEFT); 17225b3c049e70834cf33790a28643ab058b507b35cBen Cheng user->AddChildView(username_); 17325b3c049e70834cf33790a28643ab058b507b35cBen Cheng 17425b3c049e70834cf33790a28643ab058b507b35cBen Cheng email_ = new views::Label(UTF8ToUTF16(tray->GetUserEmail())); 17525b3c049e70834cf33790a28643ab058b507b35cBen Cheng email_->SetFont(username_->font().DeriveFont(-1)); 17625b3c049e70834cf33790a28643ab058b507b35cBen Cheng email_->SetHorizontalAlignment(gfx::ALIGN_LEFT); 17725b3c049e70834cf33790a28643ab058b507b35cBen Cheng email_->SetEnabled(false); 17825b3c049e70834cf33790a28643ab058b507b35cBen Cheng user->AddChildView(email_); 17925b3c049e70834cf33790a28643ab058b507b35cBen Cheng 18025b3c049e70834cf33790a28643ab058b507b35cBen Cheng user_info_->AddChildView(user); 18125b3c049e70834cf33790a28643ab058b507b35cBen Cheng } 18225b3c049e70834cf33790a28643ab058b507b35cBen Cheng 18325b3c049e70834cf33790a28643ab058b507b35cBen Cheng // Overridden from views::ButtonListener. 18425b3c049e70834cf33790a28643ab058b507b35cBen Cheng virtual void ButtonPressed(views::Button* sender, 18525b3c049e70834cf33790a28643ab058b507b35cBen Cheng const ui::Event& event) OVERRIDE { 18625b3c049e70834cf33790a28643ab058b507b35cBen Cheng CHECK(sender == signout_); 18725b3c049e70834cf33790a28643ab058b507b35cBen Cheng ash::SystemTrayDelegate* tray = ash::Shell::GetInstance()->tray_delegate(); 18825b3c049e70834cf33790a28643ab058b507b35cBen Cheng tray->SignOut(); 18925b3c049e70834cf33790a28643ab058b507b35cBen Cheng } 19025b3c049e70834cf33790a28643ab058b507b35cBen Cheng 19125b3c049e70834cf33790a28643ab058b507b35cBen Cheng // Overridden from views::View. 19225b3c049e70834cf33790a28643ab058b507b35cBen Cheng virtual gfx::Size GetPreferredSize() OVERRIDE { 19325b3c049e70834cf33790a28643ab058b507b35cBen Cheng gfx::Size size; 19425b3c049e70834cf33790a28643ab058b507b35cBen Cheng if (user_info_) 19525b3c049e70834cf33790a28643ab058b507b35cBen Cheng size = user_info_->GetPreferredSize(); 19625b3c049e70834cf33790a28643ab058b507b35cBen Cheng if (signout_) { 19725b3c049e70834cf33790a28643ab058b507b35cBen Cheng gfx::Size signout_size = signout_->GetPreferredSize(); 19825b3c049e70834cf33790a28643ab058b507b35cBen Cheng // Make sure the user default view item at least as tall as the other 19925b3c049e70834cf33790a28643ab058b507b35cBen Cheng // tray popup items. 20025b3c049e70834cf33790a28643ab058b507b35cBen Cheng if (size.height() == 0) 20125b3c049e70834cf33790a28643ab058b507b35cBen Cheng size.set_height(kTrayPopupItemHeight); 20225b3c049e70834cf33790a28643ab058b507b35cBen Cheng size.set_height(std::max(size.height(), signout_size.height())); 20325b3c049e70834cf33790a28643ab058b507b35cBen Cheng size.set_width(size.width() + signout_size.width() + 20425b3c049e70834cf33790a28643ab058b507b35cBen Cheng kTrayPopupPaddingHorizontal * 2 + kTrayPopupPaddingBetweenItems); 20525b3c049e70834cf33790a28643ab058b507b35cBen Cheng } 20625b3c049e70834cf33790a28643ab058b507b35cBen Cheng return size; 20725b3c049e70834cf33790a28643ab058b507b35cBen Cheng } 20825b3c049e70834cf33790a28643ab058b507b35cBen Cheng 20925b3c049e70834cf33790a28643ab058b507b35cBen Cheng virtual void Layout() OVERRIDE { 21025b3c049e70834cf33790a28643ab058b507b35cBen Cheng views::View::Layout(); 21125b3c049e70834cf33790a28643ab058b507b35cBen Cheng if (bounds().IsEmpty()) 212 return; 213 214 container_->SetBoundsRect(gfx::Rect(size())); 215 if (signout_ && user_info_) { 216 gfx::Rect signout_bounds(bounds()); 217 signout_bounds.ClampToCenteredSize(signout_->GetPreferredSize()); 218 signout_bounds.set_x(width() - signout_bounds.width() - 219 kTrayPopupPaddingHorizontal); 220 signout_->SetBoundsRect(signout_bounds); 221 222 gfx::Rect usercard_bounds(user_info_->GetPreferredSize()); 223 usercard_bounds.set_width(signout_bounds.x()); 224 user_info_->SetBoundsRect(usercard_bounds); 225 } else if (signout_) { 226 signout_->SetBoundsRect(gfx::Rect(size())); 227 } else if (user_info_) { 228 user_info_->SetBoundsRect(gfx::Rect(size())); 229 } 230 } 231 232 user::LoginStatus login_; 233 234 TrayPopupTextButtonContainer* container_; 235 views::View* user_info_; 236 views::Label* username_; 237 views::Label* email_; 238 239 views::Button* signout_; 240 241 DISALLOW_COPY_AND_ASSIGN(UserView); 242}; 243 244} // namespace tray 245 246TrayUser::TrayUser() 247 : user_(NULL), 248 avatar_(NULL), 249 label_(NULL) { 250} 251 252TrayUser::~TrayUser() { 253} 254 255views::View* TrayUser::CreateTrayView(user::LoginStatus status) { 256 CHECK(avatar_ == NULL); 257 CHECK(label_ == NULL); 258 if (status == user::LOGGED_IN_GUEST) { 259 label_ = new views::Label; 260 ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance(); 261 label_->SetText(bundle.GetLocalizedString(IDS_ASH_STATUS_TRAY_GUEST_LABEL)); 262 SetupLabelForTray(label_); 263 } else { 264 avatar_ = new tray::RoundedImageView(kProfileRoundedCornerRadius); 265 } 266 UpdateAfterLoginStatusChange(status); 267 return avatar_ ? static_cast<views::View*>(avatar_) 268 : static_cast<views::View*>(label_); 269} 270 271views::View* TrayUser::CreateDefaultView(user::LoginStatus status) { 272 if (status == user::LOGGED_IN_NONE) 273 return NULL; 274 275 CHECK(user_ == NULL); 276 user_ = new tray::UserView(status); 277 return user_; 278} 279 280views::View* TrayUser::CreateDetailedView(user::LoginStatus status) { 281 return NULL; 282} 283 284void TrayUser::DestroyTrayView() { 285 avatar_ = NULL; 286 label_ = NULL; 287} 288 289void TrayUser::DestroyDefaultView() { 290 user_ = NULL; 291} 292 293void TrayUser::DestroyDetailedView() { 294} 295 296void TrayUser::UpdateAfterLoginStatusChange(user::LoginStatus status) { 297 switch (status) { 298 case user::LOGGED_IN_LOCKED: 299 case user::LOGGED_IN_USER: 300 case user::LOGGED_IN_OWNER: 301 case user::LOGGED_IN_PUBLIC: 302 avatar_->SetImage( 303 ash::Shell::GetInstance()->tray_delegate()->GetUserImage(), 304 gfx::Size(kUserIconSize, kUserIconSize)); 305 avatar_->SetVisible(true); 306 break; 307 308 case user::LOGGED_IN_GUEST: 309 label_->SetVisible(true); 310 break; 311 312 case user::LOGGED_IN_KIOSK: 313 case user::LOGGED_IN_NONE: 314 avatar_->SetVisible(false); 315 break; 316 } 317} 318 319void TrayUser::UpdateAfterShelfAlignmentChange(ShelfAlignment alignment) { 320 if (avatar_) { 321 if (alignment == SHELF_ALIGNMENT_BOTTOM) { 322 avatar_->set_border(views::Border::CreateEmptyBorder( 323 0, kTrayImageItemHorizontalPaddingBottomAlignment + 2, 324 0, kTrayImageItemHorizontalPaddingBottomAlignment)); 325 } else { 326 SetTrayImageItemBorder(avatar_, alignment); 327 } 328 } else { 329 if (alignment == SHELF_ALIGNMENT_BOTTOM) { 330 label_->set_border(views::Border::CreateEmptyBorder( 331 0, kTrayLabelItemHorizontalPaddingBottomAlignment, 332 0, kTrayLabelItemHorizontalPaddingBottomAlignment)); 333 } else { 334 label_->set_border(views::Border::CreateEmptyBorder( 335 kTrayLabelItemVerticalPaddingVeriticalAlignment, 336 kTrayLabelItemHorizontalPaddingBottomAlignment, 337 kTrayLabelItemVerticalPaddingVeriticalAlignment, 338 kTrayLabelItemHorizontalPaddingBottomAlignment)); 339 } 340 } 341} 342 343void TrayUser::OnUserUpdate() { 344 // Check for null to avoid crbug.com/150944. 345 if (avatar_) { 346 avatar_->SetImage( 347 ash::Shell::GetInstance()->tray_delegate()->GetUserImage(), 348 gfx::Size(kUserIconSize, kUserIconSize)); 349 } 350} 351 352} // namespace internal 353} // namespace ash 354