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