tray_user.cc revision c5cede9ae108bb15f6b7a8aea21c7e1fefa2834c
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) 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <algorithm> 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <climits> 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <vector> 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "ash/ash_switches.h" 125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ash/metrics/user_metrics_recorder.h" 134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "ash/multi_profile_uma.h" 1490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "ash/popup_message.h" 153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "ash/root_window_controller.h" 1690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "ash/session_state_delegate.h" 173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "ash/shelf/shelf_layout_manager.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/shell.h" 19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ash/shell_delegate.h" 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/system/tray/system_tray.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/tray/system_tray_delegate.h" 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/system/tray/system_tray_notifier.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/tray/tray_constants.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/tray/tray_item_view.h" 25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ash/system/tray/tray_popup_label_button.h" 26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ash/system/tray/tray_popup_label_button_border.h" 27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ash/system/tray/tray_utils.h" 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/i18n/rtl.h" 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/logging.h" 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/scoped_vector.h" 31868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string16.h" 32868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h" 33868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "grit/ash_resources.h" 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/ash_strings.h" 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "skia/ext/image_operations.h" 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/skia/include/core/SkCanvas.h" 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/skia/include/core/SkPaint.h" 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/skia/include/core/SkPath.h" 4090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "ui/aura/window.h" 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/l10n/l10n_util.h" 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/resource/resource_bundle.h" 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/canvas.h" 44f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "ui/gfx/font_list.h" 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/image/image.h" 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/image/image_skia_operations.h" 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/insets.h" 4858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "ui/gfx/range/range.h" 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/rect.h" 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/render_text.h" 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/size.h" 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/skia_util.h" 5358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "ui/gfx/text_elider.h" 54f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "ui/gfx/text_utils.h" 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/border.h" 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/bubble/tray_bubble_view.h" 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/button/button.h" 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/controls/button/custom_button.h" 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/image_view.h" 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/label.h" 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/controls/link.h" 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/controls/link_listener.h" 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/layout/box_layout.h" 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/layout/fill_layout.h" 6590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "ui/views/mouse_watcher.h" 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/painter.h" 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/view.h" 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/widget.h" 69a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/wm/core/shadow_types.h" 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const int kUserDetailsVerticalPadding = 5; 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const int kUserCardVerticalPadding = 10; 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kProfileRoundedCornerRadius = 2; 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const int kUserIconSize = 27; 777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochconst int kUserIconLargeSize = 32; 787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochconst int kUserIconLargeCornerRadius = 2; 79b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)const int kUserLabelToIconPadding = 5; 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// When a hover border is used, it is starting this many pixels before the icon 8290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// position. 8390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)const int kTrayUserTileHoverBorderInset = 10; 8490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 8590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// The border color of the user button. 8690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)const SkColor kBorderColor = 0xffdcdcdc; 8790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// The invisible word joiner character, used as a marker to indicate the start 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// and end of the user's display name in the public account user card's text. 905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const base::char16 kDisplayNameMark[] = { 0x2060, 0 }; 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const int kPublicAccountLogoutButtonBorderImagesNormal[] = { 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IDR_AURA_TRAY_POPUP_PUBLIC_ACCOUNT_LOGOUT_BUTTON_BORDER, 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IDR_AURA_TRAY_POPUP_LABEL_BUTTON_NORMAL_BACKGROUND, 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IDR_AURA_TRAY_POPUP_LABEL_BUTTON_NORMAL_BACKGROUND, 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IDR_AURA_TRAY_POPUP_PUBLIC_ACCOUNT_LOGOUT_BUTTON_BORDER, 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IDR_AURA_TRAY_POPUP_LABEL_BUTTON_NORMAL_BACKGROUND, 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IDR_AURA_TRAY_POPUP_LABEL_BUTTON_NORMAL_BACKGROUND, 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IDR_AURA_TRAY_POPUP_PUBLIC_ACCOUNT_LOGOUT_BUTTON_BORDER, 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IDR_AURA_TRAY_POPUP_LABEL_BUTTON_NORMAL_BACKGROUND, 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IDR_AURA_TRAY_POPUP_LABEL_BUTTON_NORMAL_BACKGROUND, 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const int kPublicAccountLogoutButtonBorderImagesHovered[] = { 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IDR_AURA_TRAY_POPUP_PUBLIC_ACCOUNT_LOGOUT_BUTTON_BORDER, 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IDR_AURA_TRAY_POPUP_PUBLIC_ACCOUNT_LOGOUT_BUTTON_BORDER, 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IDR_AURA_TRAY_POPUP_PUBLIC_ACCOUNT_LOGOUT_BUTTON_BORDER, 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IDR_AURA_TRAY_POPUP_PUBLIC_ACCOUNT_LOGOUT_BUTTON_BORDER, 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IDR_AURA_TRAY_POPUP_LABEL_BUTTON_HOVER_BACKGROUND, 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IDR_AURA_TRAY_POPUP_PUBLIC_ACCOUNT_LOGOUT_BUTTON_BORDER, 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IDR_AURA_TRAY_POPUP_PUBLIC_ACCOUNT_LOGOUT_BUTTON_BORDER, 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IDR_AURA_TRAY_POPUP_PUBLIC_ACCOUNT_LOGOUT_BUTTON_BORDER, 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IDR_AURA_TRAY_POPUP_PUBLIC_ACCOUNT_LOGOUT_BUTTON_BORDER, 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Offsetting the popup message relative to the tray menu. 11790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)const int kPopupMessageOffset = 25; 11890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 1194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Switch to a user with the given |user_index|. 1204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void SwitchUser(ash::MultiProfileIndex user_index) { 1211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // Do not switch users when the log screen is presented. 1221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (ash::Shell::GetInstance()->session_state_delegate()-> 1231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) IsUserSessionBlocked()) 1241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return; 1251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 1264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DCHECK(user_index > 0); 1274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ash::SessionStateDelegate* delegate = 1284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ash::Shell::GetInstance()->session_state_delegate(); 1294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ash::MultiProfileUMA::RecordSwitchActiveUser( 1304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ash::MultiProfileUMA::SWITCH_ACTIVE_USER_BY_TRAY); 1318bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) delegate->SwitchActiveUser(delegate->GetUserID(user_index)); 1324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 1334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ash { 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace tray { 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A custom image view with rounded edges. 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RoundedImageView : public views::View { 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Constructs a new rounded image view with rounded corners of radius 14390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // |corner_radius|. If |active_user| is set, the icon will be drawn in 14490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // full colors - otherwise it will fade into the background. 14590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) RoundedImageView(int corner_radius, bool active_user); 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~RoundedImageView(); 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Set the image that should be displayed. The image contents is copied to the 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // receiver's image. 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void SetImage(const gfx::ImageSkia& img, const gfx::Size& size); 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Set the radii of the corners independently. 1537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch void SetCornerRadii(int top_left, 1547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch int top_right, 1557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch int bottom_right, 1567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch int bottom_left); 1577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Overridden from views::View. 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual gfx::Size GetPreferredSize() OVERRIDE; 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE; 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::ImageSkia image_; 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::ImageSkia resized_; 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Size image_size_; 1667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch int corner_radius_[4]; 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // True if the given user is the active user and the icon should get 16990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // painted as active. 17090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) bool active_user_; 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(RoundedImageView); 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// The user details shown in public account mode. This is essentially a label 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// but with custom painting code as the text is styled with multiple colors and 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// contains a link. 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class PublicAccountUserDetails : public views::View, 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public views::LinkListener { 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PublicAccountUserDetails(SystemTrayItem* owner, int used_width); 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~PublicAccountUserDetails(); 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Overridden from views::View. 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void Layout() OVERRIDE; 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual gfx::Size GetPreferredSize() OVERRIDE; 1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE; 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Overridden from views::LinkListener. 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void LinkClicked(views::Link* source, int event_flags) OVERRIDE; 1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Calculate a preferred size that ensures the label text and the following 1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // link do not wrap over more than three lines in total for aesthetic reasons 1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // if possible. 1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void CalculatePreferredSize(SystemTrayItem* owner, int used_width); 1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 198c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::string16 text_; 1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) views::Link* learn_more_; 2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Size preferred_size_; 2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScopedVector<gfx::RenderText> lines_; 2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(PublicAccountUserDetails); 2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 20690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// The button which holds the user card in case of multi profile. 20790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class UserCard : public views::CustomButton { 20890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public: 20990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) UserCard(views::ButtonListener* listener, bool active_user); 21090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual ~UserCard(); 21190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 21290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Called when the border should remain even in the non highlighted state. 21390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) void ForceBorderVisible(bool show); 21490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 21590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Overridden from views::View 21690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual void OnMouseEntered(const ui::MouseEvent& event) OVERRIDE; 21790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual void OnMouseExited(const ui::MouseEvent& event) OVERRIDE; 21890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 21990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Check if the item is hovered. 22090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) bool is_hovered_for_test() {return button_hovered_; } 22190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 22290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) private: 22390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Change the hover/active state of the "button" when the status changes. 22490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) void ShowActive(); 22590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 22690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // True if this is the active user. 22790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) bool is_active_user_; 22890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 22990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // True if button is hovered. 23090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) bool button_hovered_; 23190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 23290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // True if the border should be visible. 23390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) bool show_border_; 23490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 23590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(UserCard); 23690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}; 23790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 23890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class UserViewMouseWatcherHost : public views::MouseWatcherHost { 23990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)public: 24090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) explicit UserViewMouseWatcherHost(const gfx::Rect& screen_area) 24190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) : screen_area_(screen_area) {} 24290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual ~UserViewMouseWatcherHost() {} 24390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 24490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Implementation of MouseWatcherHost. 24590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual bool Contains(const gfx::Point& screen_point, 24690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) views::MouseWatcherHost::MouseEventType type) OVERRIDE { 24790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return screen_area_.Contains(screen_point); 24890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 24990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 25090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)private: 25190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) gfx::Rect screen_area_; 25290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 25390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(UserViewMouseWatcherHost); 25490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}; 25590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 25690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// The view of a user item. 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class UserView : public views::View, 25890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public views::ButtonListener, 25990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public views::MouseWatcherListener { 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 26190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) UserView(SystemTrayItem* owner, 26290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ash::user::LoginStatus login, 26390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) MultiProfileIndex index); 2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~UserView(); 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Overridden from MouseWatcherListener: 26790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual void MouseMovedOutOfHost() OVERRIDE; 26890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 26990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) TrayUser::TestState GetStateForTest() const; 27090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) gfx::Rect GetBoundsInScreenOfUserButtonForTest(); 27190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Overridden from views::View. 2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual gfx::Size GetPreferredSize() OVERRIDE; 275c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual int GetHeightForWidth(int width) OVERRIDE; 2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void Layout() OVERRIDE; 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Overridden from views::ButtonListener. 2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void ButtonPressed(views::Button* sender, 2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const ui::Event& event) OVERRIDE; 2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) void AddLogoutButton(user::LoginStatus login); 2834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) void AddUserCard(SystemTrayItem* owner, user::LoginStatus login); 2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 28590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Create a user icon representation for the user card. 2864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) views::View* CreateIconForUserCard(user::LoginStatus login); 28790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 28890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Create the additional user card content for the retail logged in mode. 28990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) void AddLoggedInRetailModeUserCardContent(); 29090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 29190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Create the additional user card content for the public mode. 29290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) void AddLoggedInPublicModeUserCardContent(SystemTrayItem* owner); 29390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 29490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Create the menu option to add another user. If |disabled| is set the user 29590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // cannot actively click on the item. 29690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) void ToggleAddUserMenuOption(); 29790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 29868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // Returns true when multi profile is supported. 29968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) bool SupportsMultiProfile(); 30068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 30190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) MultiProfileIndex multiprofile_index_; 30290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // The view of the user card. 30390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) views::View* user_card_view_; 30490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 305868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // This is the owner system tray item of this view. 306868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) SystemTrayItem* owner_; 307868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 30890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // True if |user_card_view_| is a |UserView| - otherwise it is only a 30990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // |views::View|. 31090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) bool is_user_card_; 3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) views::View* logout_button_; 3124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scoped_ptr<PopupMessage> popup_message_; 31390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) scoped_ptr<views::Widget> add_menu_option_; 31490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 31590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // True when the add user panel is visible but not activatable. 31690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) bool add_user_visible_but_disabled_; 31790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 31890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // The mouse watcher which takes care of out of window hover events. 31990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) scoped_ptr<views::MouseWatcher> mouse_watcher_; 3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(UserView); 3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 32490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// The menu item view which gets shown when the user clicks in multi profile 32590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// mode onto the user item. 32690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class AddUserView : public views::CustomButton, 32790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public views::ButtonListener { 32890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public: 32990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // The |owner| is the view for which this view gets created. The |listener| 33090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // will get notified when this item gets clicked. 33190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) AddUserView(UserCard* owner, views::ButtonListener* listener); 33290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual ~AddUserView(); 33390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 33490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Get the anchor view for a message. 33590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) views::View* anchor() { return anchor_; } 33690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 33790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Overridden from views::ButtonListener. 33890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual void ButtonPressed(views::Button* sender, 33990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const ui::Event& event) OVERRIDE; 34090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 34190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) private: 34290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Overridden from views::View. 34390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual gfx::Size GetPreferredSize() OVERRIDE; 34490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual int GetHeightForWidth(int width) OVERRIDE; 34590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual void Layout() OVERRIDE; 34690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 34790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Create the additional client content for this item. 34890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) void AddContent(); 34990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 35090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // This is the content we create and show. 35190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) views::View* add_user_; 35290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 35390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // This listener will get informed when someone clicks on this button. 35490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) views::ButtonListener* listener_; 35590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 35690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // This is the owner view of this item. 35790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) UserCard* owner_; 35890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 35990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // The anchor view for targetted bubble messages. 36090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) views::View* anchor_; 36190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 36290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(AddUserView); 36390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}; 36490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 36590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)RoundedImageView::RoundedImageView(int corner_radius, bool active_user) 3667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch : active_user_(active_user) { 3677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch for (int i = 0; i < 4; ++i) 3687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch corner_radius_[i] = corner_radius; 3697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)RoundedImageView::~RoundedImageView() {} 3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RoundedImageView::SetImage(const gfx::ImageSkia& img, 3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const gfx::Size& size) { 3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) image_ = img; 3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) image_size_ = size; 3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Try to get the best image quality for the avatar. 3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) resized_ = gfx::ImageSkiaOperations::CreateResizedImage(image_, 3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) skia::ImageOperations::RESIZE_BEST, size); 3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (GetWidget() && visible()) { 3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PreferredSizeChanged(); 3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SchedulePaint(); 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid RoundedImageView::SetCornerRadii(int top_left, 3887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch int top_right, 3897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch int bottom_right, 3907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch int bottom_left) { 3917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch corner_radius_[0] = top_left; 3927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch corner_radius_[1] = top_right; 3937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch corner_radius_[2] = bottom_right; 3947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch corner_radius_[3] = bottom_left; 3957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 3967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gfx::Size RoundedImageView::GetPreferredSize() { 3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return gfx::Size(image_size_.width() + GetInsets().width(), 3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) image_size_.height() + GetInsets().height()); 4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RoundedImageView::OnPaint(gfx::Canvas* canvas) { 4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) View::OnPaint(canvas); 4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect image_bounds(size()); 4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) image_bounds.ClampToCenteredSize(GetPreferredSize()); 4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) image_bounds.Inset(GetInsets()); 4077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const SkScalar kRadius[8] = { 4087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch SkIntToScalar(corner_radius_[0]), 4097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch SkIntToScalar(corner_radius_[0]), 4107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch SkIntToScalar(corner_radius_[1]), 4117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch SkIntToScalar(corner_radius_[1]), 4127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch SkIntToScalar(corner_radius_[2]), 4137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch SkIntToScalar(corner_radius_[2]), 4147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch SkIntToScalar(corner_radius_[3]), 4157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch SkIntToScalar(corner_radius_[3]) 4167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch }; 4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SkPath path; 4187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch path.addRoundRect(gfx::RectToSkRect(image_bounds), kRadius); 4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SkPaint paint; 4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) paint.setAntiAlias(true); 42190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) paint.setXfermodeMode(active_user_ ? SkXfermode::kSrcOver_Mode : 42290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SkXfermode::kLuminosity_Mode); 4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) canvas->DrawImageInPath(resized_, image_bounds.x(), image_bounds.y(), 4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) path, paint); 4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)PublicAccountUserDetails::PublicAccountUserDetails(SystemTrayItem* owner, 4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int used_width) 4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : learn_more_(NULL) { 4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const int inner_padding = 4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kTrayPopupPaddingHorizontal - kTrayPopupPaddingBetweenItems; 4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const bool rtl = base::i18n::IsRTL(); 4335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetBorder(views::Border::CreateEmptyBorder(kUserDetailsVerticalPadding, 4345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) rtl ? 0 : inner_padding, 4355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) kUserDetailsVerticalPadding, 4365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) rtl ? inner_padding : 0)); 4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Retrieve the user's display name and wrap it with markers. 43990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Note that since this is a public account it always has to be the primary 44090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // user. 44190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::string16 display_name = 4424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) Shell::GetInstance()->session_state_delegate()->GetUserDisplayName(0); 443a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::RemoveChars(display_name, kDisplayNameMark, &display_name); 4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) display_name = kDisplayNameMark[0] + display_name + kDisplayNameMark[0]; 4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Retrieve the domain managing the device and wrap it with markers. 4465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::string16 domain = base::UTF8ToUTF16( 4474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) Shell::GetInstance()->system_tray_delegate()->GetEnterpriseDomain()); 448a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::RemoveChars(domain, kDisplayNameMark, &domain); 4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::i18n::WrapStringWithLTRFormatting(&domain); 4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Retrieve the label text, inserting the display name and domain. 4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) text_ = l10n_util::GetStringFUTF16(IDS_ASH_STATUS_TRAY_PUBLIC_LABEL, 4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) display_name, domain); 4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) learn_more_ = new views::Link(l10n_util::GetStringUTF16(IDS_ASH_LEARN_MORE)); 4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) learn_more_->SetUnderline(false); 4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) learn_more_->set_listener(this); 4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddChildView(learn_more_); 4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CalculatePreferredSize(owner, used_width); 4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)PublicAccountUserDetails::~PublicAccountUserDetails() {} 4632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PublicAccountUserDetails::Layout() { 4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) lines_.clear(); 4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const gfx::Rect contents_area = GetContentsBounds(); 4672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (contents_area.IsEmpty()) 46890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return; 4692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Word-wrap the label text. 471f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const gfx::FontList font_list; 472c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<base::string16> lines; 473f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) gfx::ElideRectangleText(text_, font_list, contents_area.width(), 47458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) contents_area.height(), gfx::ELIDE_LONG_WORDS, 47558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) &lines); 4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Loop through the lines, creating a renderer for each. 4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Point position = contents_area.origin(); 47858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) gfx::Range display_name(gfx::Range::InvalidRange()); 479c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) for (std::vector<base::string16>::const_iterator it = lines.begin(); 4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) it != lines.end(); ++it) { 4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::RenderText* line = gfx::RenderText::CreateInstance(); 4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) line->SetDirectionalityMode(gfx::DIRECTIONALITY_FROM_UI); 4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) line->SetText(*it); 4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const gfx::Size size(contents_area.width(), line->GetStringSize().height()); 4852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) line->SetDisplayRect(gfx::Rect(position, size)); 4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) position.set_y(position.y() + size.height()); 4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Set the default text color for the line. 4892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) line->SetColor(kPublicAccountUserCardTextColor); 4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If a range of the line contains the user's display name, apply a custom 4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // text color to it. 4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (display_name.is_empty()) 4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) display_name.set_start(it->find(kDisplayNameMark)); 4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!display_name.is_empty()) { 4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) display_name.set_end( 4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) it->find(kDisplayNameMark, display_name.start() + 1)); 49858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) gfx::Range line_range(0, it->size()); 4992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) line->ApplyColor(kPublicAccountUserCardNameColor, 5002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) display_name.Intersect(line_range)); 5012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Update the range for the next line. 5022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (display_name.end() >= line_range.end()) 5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) display_name.set_start(0); 5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else 50558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) display_name = gfx::Range::InvalidRange(); 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) lines_.push_back(line); 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Position the link after the label text, separated by a space. If it does 5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // not fit onto the last line of the text, wrap the link onto its own line. 5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const gfx::Size last_line_size = lines_.back()->GetStringSize(); 5145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const int space_width = 5155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::GetStringWidth(base::ASCIIToUTF16(" "), font_list); 5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const gfx::Size link_size = learn_more_->GetPreferredSize(); 5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (contents_area.width() - last_line_size.width() >= 5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) space_width + link_size.width()) { 5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) position.set_x(position.x() + last_line_size.width() + space_width); 5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) position.set_y(position.y() - last_line_size.height()); 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) position.set_y(position.y() - learn_more_->GetInsets().top()); 5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect learn_more_bounds(position, link_size); 5242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) learn_more_bounds.Intersect(contents_area); 5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (base::i18n::IsRTL()) { 5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const gfx::Insets insets = GetInsets(); 5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) learn_more_bounds.Offset(insets.right() - insets.left(), 0); 5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) learn_more_->SetBoundsRect(learn_more_bounds); 5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gfx::Size PublicAccountUserDetails::GetPreferredSize() { 5332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return preferred_size_; 5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PublicAccountUserDetails::OnPaint(gfx::Canvas* canvas) { 5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (ScopedVector<gfx::RenderText>::const_iterator it = lines_.begin(); 5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) it != lines_.end(); ++it) { 5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (*it)->Draw(canvas); 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) views::View::OnPaint(canvas); 5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PublicAccountUserDetails::LinkClicked(views::Link* source, 5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int event_flags) { 5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK_EQ(source, learn_more_); 5474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) Shell::GetInstance()->system_tray_delegate()->ShowPublicAccountInfo(); 5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PublicAccountUserDetails::CalculatePreferredSize(SystemTrayItem* owner, 5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int used_width) { 552f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const gfx::FontList font_list; 5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const gfx::Size link_size = learn_more_->GetPreferredSize(); 5545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const int space_width = 5555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::GetStringWidth(base::ASCIIToUTF16(" "), font_list); 5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const gfx::Insets insets = GetInsets(); 5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) views::TrayBubbleView* bubble_view = 5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) owner->system_tray()->GetSystemBubble()->bubble_view(); 5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int min_width = std::max( 5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) link_size.width(), 5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bubble_view->GetPreferredSize().width() - (used_width + insets.width())); 5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int max_width = std::min( 563f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) gfx::GetStringWidth(text_, font_list) + space_width + link_size.width(), 5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bubble_view->GetMaximumSize().width() - (used_width + insets.width())); 5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Do a binary search for the minimum width that ensures no more than three 5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // lines are needed. The lower bound is the minimum of the current bubble 5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // width and the width of the link (as no wrapping is permitted inside the 5682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // link). The upper bound is the maximum of the largest allowed bubble width 5692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // and the sum of the label text and link widths when put on a single line. 570c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<base::string16> lines; 5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) while (min_width < max_width) { 5722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) lines.clear(); 5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const int width = (min_width + max_width) / 2; 574f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const bool too_narrow = 575f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) gfx::ElideRectangleText(text_, font_list, width, INT_MAX, 576f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) gfx::TRUNCATE_LONG_WORDS, &lines) != 0; 5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int line_count = lines.size(); 5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!too_narrow && line_count == 3 && 579f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) width - gfx::GetStringWidth(lines.back(), font_list) <= 580f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) space_width + link_size.width()) 5812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ++line_count; 5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (too_narrow || line_count > 3) 5832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) min_width = width + 1; 5842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else 5852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) max_width = width; 5862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Calculate the corresponding height and set the preferred size. 5892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) lines.clear(); 59058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) gfx::ElideRectangleText( 591f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) text_, font_list, min_width, INT_MAX, gfx::TRUNCATE_LONG_WORDS, &lines); 5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int line_count = lines.size(); 593f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (min_width - gfx::GetStringWidth(lines.back(), font_list) <= 594f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) space_width + link_size.width()) { 5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ++line_count; 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 597f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const int line_height = font_list.GetHeight(); 5982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const int link_extra_height = std::max( 5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) link_size.height() - learn_more_->GetInsets().top() - line_height, 0); 6002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) preferred_size_ = gfx::Size( 6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) min_width + insets.width(), 6022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) line_count * line_height + link_extra_height + insets.height()); 6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bubble_view->SetWidth(preferred_size_.width() + used_width); 6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 60790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)UserCard::UserCard(views::ButtonListener* listener, bool active_user) 60890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) : CustomButton(listener), 60990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) is_active_user_(active_user), 61090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) button_hovered_(false), 61190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) show_border_(false) { 61290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (is_active_user_) { 61390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) set_background( 61490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) views::Background::CreateSolidBackground(kBackgroundColor)); 61590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ShowActive(); 61690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 61790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 61890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 61990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)UserCard::~UserCard() {} 62090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 62190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void UserCard::ForceBorderVisible(bool show) { 62290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) show_border_ = show; 62390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ShowActive(); 62490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 62590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 62690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void UserCard::OnMouseEntered(const ui::MouseEvent& event) { 62790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (is_active_user_) { 62890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) button_hovered_ = true; 62990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) background()->SetNativeControlColor(kHoverBackgroundColor); 63090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ShowActive(); 63190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 63290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 63390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 63490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void UserCard::OnMouseExited(const ui::MouseEvent& event) { 63590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (is_active_user_) { 63690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) button_hovered_ = false; 63790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) background()->SetNativeControlColor(kBackgroundColor); 63890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ShowActive(); 63990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 64090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 64190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 64290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void UserCard::ShowActive() { 64390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) int width = button_hovered_ || show_border_ ? 1 : 0; 6445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetBorder(views::Border::CreateSolidSidedBorder( 6455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) width, width, width, 1, kBorderColor)); 64690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SchedulePaint(); 64790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 64890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 64990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)UserView::UserView(SystemTrayItem* owner, 6504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) user::LoginStatus login, 65190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) MultiProfileIndex index) 65290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) : multiprofile_index_(index), 65390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) user_card_view_(NULL), 654868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) owner_(owner), 65590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) is_user_card_(false), 6562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) logout_button_(NULL), 65790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) add_user_visible_but_disabled_(false) { 6584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) CHECK_NE(user::LOGGED_IN_NONE, login); 65990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (!index) { 66090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Only the logged in user will have a background. All other users will have 66190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // to allow the TrayPopupContainer highlighting the menu line. 66290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) set_background(views::Background::CreateSolidBackground( 6634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) login == user::LOGGED_IN_PUBLIC ? kPublicAccountBackgroundColor : 6644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) kBackgroundColor)); 66590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 6662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetLayoutManager(new views::BoxLayout(views::BoxLayout::kHorizontal, 0, 0, 6672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kTrayPopupPaddingBetweenItems)); 6682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The logout button must be added before the user card so that the user card 6692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // can correctly calculate the remaining available width. 67090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Note that only the current multiprofile user gets a button. 671d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (!multiprofile_index_) 672d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) AddLogoutButton(login); 6732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddUserCard(owner, login); 6742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)UserView::~UserView() {} 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 67890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void UserView::MouseMovedOutOfHost() { 67990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) popup_message_.reset(); 68090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) mouse_watcher_.reset(); 68190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) add_menu_option_.reset(); 68290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 68390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 68490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)TrayUser::TestState UserView::GetStateForTest() const { 68590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (add_menu_option_.get()) { 68690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return add_user_visible_but_disabled_ ? TrayUser::ACTIVE_BUT_DISABLED : 68790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) TrayUser::ACTIVE; 68890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 68990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 69090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (!is_user_card_) 69190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return TrayUser::SHOWN; 69290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 69390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return static_cast<UserCard*>(user_card_view_)->is_hovered_for_test() ? 69490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) TrayUser::HOVERED : TrayUser::SHOWN; 69590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 69690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 69790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)gfx::Rect UserView::GetBoundsInScreenOfUserButtonForTest() { 69890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DCHECK(user_card_view_); 69990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return user_card_view_->GetBoundsInScreen(); 70090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 70190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 7022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gfx::Size UserView::GetPreferredSize() { 7032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Size size = views::View::GetPreferredSize(); 70490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Only the active user panel will be forced to a certain height. 70590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (!multiprofile_index_) { 7062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size.set_height(std::max(size.height(), 7072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kTrayPopupItemHeight + GetInsets().height())); 7082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return size; 7102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 712c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)int UserView::GetHeightForWidth(int width) { 713c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return GetPreferredSize().height(); 714c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 715c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 7162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void UserView::Layout() { 7172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect contents_area(GetContentsBounds()); 71890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (user_card_view_ && logout_button_) { 7192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Give the logout button the space it requests. 7202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect logout_area = contents_area; 7212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) logout_area.ClampToCenteredSize(logout_button_->GetPreferredSize()); 7222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) logout_area.set_x(contents_area.right() - logout_area.width()); 7232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Give the remaining space to the user card. 7252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect user_card_area = contents_area; 72690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) int remaining_width = contents_area.width() - logout_area.width(); 72768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (SupportsMultiProfile()) { 72890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // In multiprofile case |user_card_view_| and |logout_button_| have to 72990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // have the same height. 73090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) int y = std::min(user_card_area.y(), logout_area.y()); 73190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) int height = std::max(user_card_area.height(), logout_area.height()); 73290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) logout_area.set_y(y); 73390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) logout_area.set_height(height); 73490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) user_card_area.set_y(y); 73590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) user_card_area.set_height(height); 73690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 73790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // In multiprofile mode we have also to increase the size of the card by 73890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // the size of the border to make it overlap with the logout button. 73990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) user_card_area.set_width(std::max(0, remaining_width + 1)); 74090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 74190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // To make the logout button symmetrical with the user card we also make 74290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // the button longer by the same size the hover area in front of the icon 74390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // got inset. 74490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) logout_area.set_width(logout_area.width() + 74590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) kTrayUserTileHoverBorderInset); 74690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } else { 74790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // In all other modes we have to make sure that there is enough spacing 74890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // between the two. 74990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) remaining_width -= kTrayPopupPaddingBetweenItems; 75090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 751eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch user_card_area.set_width(remaining_width); 75290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) user_card_view_->SetBoundsRect(user_card_area); 75390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) logout_button_->SetBoundsRect(logout_area); 75490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } else if (user_card_view_) { 75590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) user_card_view_->SetBoundsRect(contents_area); 7562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else if (logout_button_) { 7572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) logout_button_->SetBoundsRect(contents_area); 7582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void UserView::ButtonPressed(views::Button* sender, const ui::Event& event) { 762c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (sender == logout_button_) { 7635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Shell::GetInstance()->metrics()->RecordUserMetricsAction( 7645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ash::UMA_STATUS_AREA_SIGN_OUT); 7654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) Shell::GetInstance()->system_tray_delegate()->SignOut(); 76668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } else if (sender == user_card_view_ && SupportsMultiProfile()) { 76790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (!multiprofile_index_) { 76890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ToggleAddUserMenuOption(); 76990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } else { 7704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) SwitchUser(multiprofile_index_); 771868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Since the user list is about to change the system menu should get 772868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // closed. 773868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) owner_->system_tray()->CloseSystemBubble(); 77490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 77590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } else if (add_menu_option_.get() && 77690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) sender == add_menu_option_->GetContentsView()) { 77790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Let the user add another account to the session. 7784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) MultiProfileUMA::RecordSigninUser(MultiProfileUMA::SIGNIN_USER_BY_TRAY); 7794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) Shell::GetInstance()->system_tray_delegate()->ShowUserLogin(); 780a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) owner_->system_tray()->CloseSystemBubble(); 781c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else { 7822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED(); 783c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 7842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void UserView::AddLogoutButton(user::LoginStatus login) { 7874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const base::string16 title = user::GetLocalizedSignOutStringForStatus(login, 7884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) true); 7892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TrayPopupLabelButton* logout_button = new TrayPopupLabelButton(this, title); 7902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) logout_button->SetAccessibleName(title); 7912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) logout_button_ = logout_button; 7922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // In public account mode, the logout button border has a custom color. 7934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (login == user::LOGGED_IN_PUBLIC) { 7945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<TrayPopupLabelButtonBorder> border( 7955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) new TrayPopupLabelButtonBorder()); 7962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) border->SetPainter(false, views::Button::STATE_NORMAL, 7972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) views::Painter::CreateImageGridPainter( 7982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kPublicAccountLogoutButtonBorderImagesNormal)); 7992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) border->SetPainter(false, views::Button::STATE_HOVERED, 8002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) views::Painter::CreateImageGridPainter( 8012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kPublicAccountLogoutButtonBorderImagesHovered)); 8022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) border->SetPainter(false, views::Button::STATE_PRESSED, 8032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) views::Painter::CreateImageGridPainter( 8042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kPublicAccountLogoutButtonBorderImagesHovered)); 8055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) logout_button_->SetBorder(border.PassAs<views::Border>()); 8062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddChildView(logout_button_); 8082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void UserView::AddUserCard(SystemTrayItem* owner, user::LoginStatus login) { 81190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Add padding around the panel. 8125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetBorder(views::Border::CreateEmptyBorder(kUserCardVerticalPadding, 8135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) kTrayPopupPaddingHorizontal, 8145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) kUserCardVerticalPadding, 8155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) kTrayPopupPaddingHorizontal)); 8162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (SupportsMultiProfile() && login != user::LOGGED_IN_RETAIL_MODE) { 81890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) user_card_view_ = new UserCard(this, multiprofile_index_ == 0); 81990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) is_user_card_ = true; 82090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } else { 82190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) user_card_view_ = new views::View(); 82290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) is_user_card_ = false; 82390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 8242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 82590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) user_card_view_->SetLayoutManager(new views::BoxLayout( 82690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) views::BoxLayout::kHorizontal, 0, 0 , kTrayPopupPaddingBetweenItems)); 82790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) AddChildViewAt(user_card_view_, 0); 8282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (login == user::LOGGED_IN_RETAIL_MODE) { 83090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) AddLoggedInRetailModeUserCardContent(); 8312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 8322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 83390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 83490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // The entire user card should trigger hover (the inner items get disabled). 83590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) user_card_view_->SetEnabled(true); 83690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) user_card_view_->set_notify_enter_exit_on_child(true); 8372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (login == user::LOGGED_IN_PUBLIC) { 83990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) AddLoggedInPublicModeUserCardContent(owner); 8402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 8412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 84390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) views::View* icon = CreateIconForUserCard(login); 84490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) user_card_view_->AddChildView(icon); 84590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 84690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // To allow the border to start before the icon, reduce the size before and 84790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // add an inset to the icon to get the spacing. 84868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (multiprofile_index_ == 0 && SupportsMultiProfile()) { 8495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) icon->SetBorder(views::Border::CreateEmptyBorder( 85090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 0, kTrayUserTileHoverBorderInset, 0, 0)); 8515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetBorder(views::Border::CreateEmptyBorder( 85290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) kUserCardVerticalPadding, 85390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) kTrayPopupPaddingHorizontal - kTrayUserTileHoverBorderInset, 85490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) kUserCardVerticalPadding, 85590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) kTrayPopupPaddingHorizontal)); 85690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 8574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) SessionStateDelegate* delegate = 8584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) Shell::GetInstance()->session_state_delegate(); 85990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) views::Label* username = NULL; 86090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance(); 86190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (!multiprofile_index_) { 862eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::string16 user_name_string = 8634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) login == user::LOGGED_IN_GUEST ? 86490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) bundle.GetLocalizedString(IDS_ASH_STATUS_TRAY_GUEST_LABEL) : 865eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch delegate->GetUserDisplayName(multiprofile_index_); 866eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!user_name_string.empty()) { 867eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch username = new views::Label(user_name_string); 868eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch username->SetHorizontalAlignment(gfx::ALIGN_LEFT); 869eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 87090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 87190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 87290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) views::Label* additional = NULL; 8734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (login != user::LOGGED_IN_GUEST) { 874eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::string16 user_email_string = 8754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) login == user::LOGGED_IN_LOCALLY_MANAGED ? 876eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch bundle.GetLocalizedString( 877eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch IDS_ASH_STATUS_TRAY_LOCALLY_MANAGED_LABEL) : 8785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::UTF8ToUTF16(delegate->GetUserEmail(multiprofile_index_)); 879eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!user_email_string.empty()) { 880eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch additional = new views::Label(user_email_string); 881f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) additional->SetFontList( 882f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bundle.GetFontList(ui::ResourceBundle::SmallFont)); 883eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch additional->SetHorizontalAlignment(gfx::ALIGN_LEFT); 884eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 88590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 88690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 88790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Adjust text properties dependent on if it is an active or inactive user. 88890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (multiprofile_index_) { 88990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Fade the text of non active users to 50%. 89090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SkColor text_color = additional->enabled_color(); 89190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) text_color = SkColorSetA(text_color, SkColorGetA(text_color) / 2); 89290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (additional) 89390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) additional->SetDisabledColor(text_color); 89490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (username) 89590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) username->SetDisabledColor(text_color); 89690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 89790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 89890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (additional && username) { 89990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) views::View* details = new views::View; 90090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) details->SetLayoutManager(new views::BoxLayout( 90190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) views::BoxLayout::kVertical, 0, kUserDetailsVerticalPadding, 0)); 90290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) details->AddChildView(username); 90390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) details->AddChildView(additional); 90490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) user_card_view_->AddChildView(details); 90590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } else { 90690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (username) 90790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) user_card_view_->AddChildView(username); 90890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (additional) 90990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) user_card_view_->AddChildView(additional); 91090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 91190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 91290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 9134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)views::View* UserView::CreateIconForUserCard(user::LoginStatus login) { 91490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) RoundedImageView* icon = new RoundedImageView(kProfileRoundedCornerRadius, 91590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) multiprofile_index_ == 0); 91690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) icon->SetEnabled(false); 9174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (login == user::LOGGED_IN_GUEST) { 91890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) icon->SetImage(*ui::ResourceBundle::GetSharedInstance(). 91990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) GetImageNamed(IDR_AURA_UBER_TRAY_GUEST_ICON).ToImageSkia(), 92090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) gfx::Size(kUserIconSize, kUserIconSize)); 92190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } else { 922a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SessionStateDelegate* delegate = 923a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Shell::GetInstance()->session_state_delegate(); 924a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) content::BrowserContext* context = delegate->GetBrowserContextByIndex( 925a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) multiprofile_index_); 926a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) icon->SetImage(delegate->GetUserImage(context), 927a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) gfx::Size(kUserIconSize, kUserIconSize)); 92890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 92990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return icon; 93090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 9312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 93290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void UserView::AddLoggedInRetailModeUserCardContent() { 93390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) views::Label* details = new views::Label; 9342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance(); 93590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) details->SetText( 93690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) bundle.GetLocalizedString(IDS_ASH_STATUS_TRAY_KIOSK_LABEL)); 9375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) details->SetBorder(views::Border::CreateEmptyBorder(0, 4, 0, 1)); 93890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) details->SetHorizontalAlignment(gfx::ALIGN_LEFT); 93990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) user_card_view_->AddChildView(details); 94090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 94190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 94290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void UserView::AddLoggedInPublicModeUserCardContent(SystemTrayItem* owner) { 9434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) user_card_view_->AddChildView(CreateIconForUserCard(user::LOGGED_IN_PUBLIC)); 94490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) user_card_view_->AddChildView(new PublicAccountUserDetails( 94590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) owner, GetPreferredSize().width() + kTrayPopupPaddingBetweenItems)); 94690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 94790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 94890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void UserView::ToggleAddUserMenuOption() { 94990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (add_menu_option_.get()) { 95090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) popup_message_.reset(); 95190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) mouse_watcher_.reset(); 95290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) add_menu_option_.reset(); 95390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return; 95490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 955c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 95690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Note: We do not need to install a global event handler to delete this 95790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // item since it will destroyed automatically before the menu / user menu item 95890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // gets destroyed.. 95990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const SessionStateDelegate* session_state_delegate = 9604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) Shell::GetInstance()->session_state_delegate(); 96190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) add_user_visible_but_disabled_ = 96290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) session_state_delegate->NumberOfLoggedInUsers() >= 96390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) session_state_delegate->GetMaximumNumberOfLoggedInUsers(); 96490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) add_menu_option_.reset(new views::Widget); 96590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) views::Widget::InitParams params; 96690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) params.type = views::Widget::InitParams::TYPE_TOOLTIP; 96790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) params.keep_on_top = true; 96890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) params.context = this->GetWidget()->GetNativeWindow(); 96990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) params.accept_events = true; 97090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; 971eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch params.opacity = views::Widget::InitParams::TRANSLUCENT_WINDOW; 97290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) add_menu_option_->Init(params); 97390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) add_menu_option_->SetOpacity(0xFF); 97490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) add_menu_option_->GetNativeWindow()->set_owned_by_parent(false); 97590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SetShadowType(add_menu_option_->GetNativeView(), 976a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) wm::SHADOW_TYPE_NONE); 97790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 97890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Position it below our user card. 97990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) gfx::Rect bounds = user_card_view_->GetBoundsInScreen(); 98090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) bounds.set_y(bounds.y() + bounds.height()); 98190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) add_menu_option_->SetBounds(bounds); 98290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 98390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Show the content. 98490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) AddUserView* add_user_view = new AddUserView( 98590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) static_cast<UserCard*>(user_card_view_), this); 98690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) add_menu_option_->SetContentsView(add_user_view); 98790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) add_menu_option_->SetAlwaysOnTop(true); 98890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) add_menu_option_->Show(); 98990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (add_user_visible_but_disabled_) { 99090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance(); 99190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) popup_message_.reset(new PopupMessage( 99290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) bundle.GetLocalizedString(IDS_ASH_STATUS_TRAY_CAPTION_CANNOT_ADD_USER), 99390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) bundle.GetLocalizedString(IDS_ASH_STATUS_TRAY_MESSAGE_CANNOT_ADD_USER), 99490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) PopupMessage::ICON_WARNING, 99590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) add_user_view->anchor(), 99690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) views::BubbleBorder::TOP_LEFT, 99790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) gfx::Size(parent()->bounds().width() - kPopupMessageOffset, 0), 99890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 2 * kPopupMessageOffset)); 99990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 100090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Find the screen area which encloses both elements and sets then a mouse 100190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // watcher which will close the "menu". 100290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) gfx::Rect area = user_card_view_->GetBoundsInScreen(); 100390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) area.set_height(2 * area.height()); 100490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) mouse_watcher_.reset(new views::MouseWatcher( 100590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) new UserViewMouseWatcherHost(area), 100690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) this)); 100790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) mouse_watcher_->Start(); 100890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 1009c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 101068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)bool UserView::SupportsMultiProfile() { 10111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // We do not want to see any multi profile additions to a user view when the 10121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // log in screen is shown. 10131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return Shell::GetInstance()->delegate()->IsMultiProfilesEnabled() && 10141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) !Shell::GetInstance()->session_state_delegate()->IsUserSessionBlocked(); 101568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 101668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 101790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)AddUserView::AddUserView(UserCard* owner, views::ButtonListener* listener) 10185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : CustomButton(listener), 101990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) add_user_(NULL), 102090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) listener_(listener), 102190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) owner_(owner), 102290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) anchor_(NULL) { 102390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) AddContent(); 102490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) owner_->ForceBorderVisible(true); 102590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 1026c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 102790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)AddUserView::~AddUserView() { 102890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) owner_->ForceBorderVisible(false); 102990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 103090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 103190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)gfx::Size AddUserView::GetPreferredSize() { 103290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return owner_->bounds().size(); 103390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 103490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 103590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)int AddUserView::GetHeightForWidth(int width) { 103690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return owner_->bounds().size().height(); 103790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 103890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 103990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void AddUserView::Layout() { 104090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) gfx::Rect contents_area(GetContentsBounds()); 104190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) add_user_->SetBoundsRect(contents_area); 104290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 104390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 104490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void AddUserView::ButtonPressed(views::Button* sender, const ui::Event& event) { 104590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (add_user_ == sender) 104690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) listener_->ButtonPressed(this, event); 104790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) else 104890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NOTREACHED(); 104990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 105090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 105190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void AddUserView::AddContent() { 105290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) set_notify_enter_exit_on_child(true); 105390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 105490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const SessionStateDelegate* delegate = 10554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) Shell::GetInstance()->session_state_delegate(); 105690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) bool enable = delegate->NumberOfLoggedInUsers() < 105790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) delegate->GetMaximumNumberOfLoggedInUsers(); 105890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 105990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SetLayoutManager(new views::FillLayout()); 106090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) set_background(views::Background::CreateSolidBackground(kBackgroundColor)); 106190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 106290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Add padding around the panel. 10635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetBorder(views::Border::CreateSolidBorder(1, kBorderColor)); 106490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 106590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) add_user_ = new UserCard(this, enable); 10665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) add_user_->SetBorder(views::Border::CreateEmptyBorder( 106790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) kUserCardVerticalPadding, 10685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) kTrayPopupPaddingHorizontal - kTrayUserTileHoverBorderInset, 106990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) kUserCardVerticalPadding, 10705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) kTrayPopupPaddingHorizontal - kTrayUserTileHoverBorderInset)); 107190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 107290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) add_user_->SetLayoutManager(new views::BoxLayout( 107390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) views::BoxLayout::kHorizontal, 0, 0 , kTrayPopupPaddingBetweenItems)); 107490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) AddChildViewAt(add_user_, 0); 107590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 107690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Add the [+] icon which is also the anchor for messages. 107790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance(); 107890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) RoundedImageView* icon = new RoundedImageView(kProfileRoundedCornerRadius, 107990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) true); 108090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) anchor_ = icon; 108190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) icon->SetImage(*ui::ResourceBundle::GetSharedInstance(). 108290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) GetImageNamed(IDR_AURA_UBER_TRAY_ADD_MULTIPROFILE_USER).ToImageSkia(), 108390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) gfx::Size(kUserIconSize, kUserIconSize)); 108490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) add_user_->AddChildView(icon); 108590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 108690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Add the command text. 108790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) views::Label* command_label = new views::Label( 108890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) bundle.GetLocalizedString(IDS_ASH_STATUS_TRAY_SIGN_IN_ANOTHER_ACCOUNT)); 108990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) command_label->SetHorizontalAlignment(gfx::ALIGN_LEFT); 109090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) add_user_->AddChildView(command_label); 10912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace tray 10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 109590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)TrayUser::TrayUser(SystemTray* system_tray, MultiProfileIndex index) 10962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : SystemTrayItem(system_tray), 109790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) multiprofile_index_(index), 10982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) user_(NULL), 1099b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) layout_view_(NULL), 11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) avatar_(NULL), 1101f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) label_(NULL) { 11022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Shell::GetInstance()->system_tray_notifier()->AddUserObserver(this); 11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TrayUser::~TrayUser() { 11062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Shell::GetInstance()->system_tray_notifier()->RemoveUserObserver(this); 11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 110990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)TrayUser::TestState TrayUser::GetStateForTest() const { 111090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (!user_) 111190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return HIDDEN; 111290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return user_->GetStateForTest(); 111390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 111490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 1115a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)gfx::Size TrayUser::GetLayoutSizeForTest() const { 1116a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!layout_view_) { 1117a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return gfx::Size(0, 0); 1118a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } else { 1119a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return layout_view_->size(); 1120a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 11214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 11224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 112390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)gfx::Rect TrayUser::GetUserPanelBoundsInScreenForTest() const { 112490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DCHECK(user_); 112590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return user_->GetBoundsInScreenOfUserButtonForTest(); 112690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 112790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 1128a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void TrayUser::UpdateAfterLoginStatusChangeForTest(user::LoginStatus status) { 1129a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) UpdateAfterLoginStatusChange(status); 1130a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 1131a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)views::View* TrayUser::CreateTrayView(user::LoginStatus status) { 1133b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) CHECK(layout_view_ == NULL); 113490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 1135b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) layout_view_ = new views::View(); 1136b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) layout_view_->SetLayoutManager( 1137b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) new views::BoxLayout(views::BoxLayout::kHorizontal, 1138b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 0, 0, kUserLabelToIconPadding)); 11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateAfterLoginStatusChange(status); 1140b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) return layout_view_; 11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)views::View* TrayUser::CreateDefaultView(user::LoginStatus status) { 11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (status == user::LOGGED_IN_NONE) 11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 11461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) const SessionStateDelegate* session_state_delegate = 11471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) Shell::GetInstance()->session_state_delegate(); 11481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 11491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // If the screen is locked show only the currently active user. 11501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (multiprofile_index_ && session_state_delegate->IsUserSessionBlocked()) 11511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return NULL; 11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(user_ == NULL); 115490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 115590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) int logged_in_users = session_state_delegate->NumberOfLoggedInUsers(); 115690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 115790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Do not show more UserView's then there are logged in users. 115890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (multiprofile_index_ >= logged_in_users) 115990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return NULL; 116090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 116190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) user_ = new tray::UserView(this, status, multiprofile_index_); 11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return user_; 11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)views::View* TrayUser::CreateDetailedView(user::LoginStatus status) { 11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayUser::DestroyTrayView() { 1170b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) layout_view_ = NULL; 11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) avatar_ = NULL; 11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) label_ = NULL; 11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayUser::DestroyDefaultView() { 11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) user_ = NULL; 11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayUser::DestroyDetailedView() { 11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayUser::UpdateAfterLoginStatusChange(user::LoginStatus status) { 118390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Only the active user is represented in the tray. 118490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (!layout_view_) 118590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return; 1186a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (GetTrayIndex() > 0) 1187f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return; 1188b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) bool need_label = false; 1189b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) bool need_avatar = false; 11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (status) { 11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case user::LOGGED_IN_LOCKED: 11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case user::LOGGED_IN_USER: 11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case user::LOGGED_IN_OWNER: 11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case user::LOGGED_IN_PUBLIC: 1195b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) need_avatar = true; 1196b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) break; 11972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case user::LOGGED_IN_LOCALLY_MANAGED: 1198b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) need_avatar = true; 1199b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) need_label = true; 12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case user::LOGGED_IN_GUEST: 12023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) need_label = true; 12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 12042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case user::LOGGED_IN_RETAIL_MODE: 12052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case user::LOGGED_IN_KIOSK_APP: 12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case user::LOGGED_IN_NONE: 12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1209b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 1210b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) if ((need_avatar != (avatar_ != NULL)) || 1211b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) (need_label != (label_ != NULL))) { 1212b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) layout_view_->RemoveAllChildViews(true); 1213b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) if (need_label) { 1214b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) label_ = new views::Label; 1215b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) SetupLabelForTray(label_); 1216b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) layout_view_->AddChildView(label_); 1217b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } else { 1218b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) label_ = NULL; 1219b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 1220b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) if (need_avatar) { 1221a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) avatar_ = new tray::RoundedImageView(kProfileRoundedCornerRadius, true); 1222b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) layout_view_->AddChildView(avatar_); 1223b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } else { 1224b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) avatar_ = NULL; 1225b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 1226b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 1227b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 1228b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance(); 1229b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) if (status == user::LOGGED_IN_LOCALLY_MANAGED) { 1230b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) label_->SetText( 1231b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) bundle.GetLocalizedString(IDS_ASH_STATUS_TRAY_LOCALLY_MANAGED_LABEL)); 12323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } else if (status == user::LOGGED_IN_GUEST) { 12333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) label_->SetText(bundle.GetLocalizedString(IDS_ASH_STATUS_TRAY_GUEST_LABEL)); 1234b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 1235b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 12364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (avatar_ && switches::UseAlternateShelfLayout()) { 1237a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) avatar_->SetCornerRadii( 1238a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 0, kUserIconLargeCornerRadius, kUserIconLargeCornerRadius, 0); 12395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) avatar_->SetBorder(views::Border::NullBorder()); 12407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 1241ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch UpdateAvatarImage(status); 12423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 12433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Update layout after setting label_ and avatar_ with new login status. 12444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) UpdateLayoutOfItem(); 12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayUser::UpdateAfterShelfAlignmentChange(ShelfAlignment alignment) { 124890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Inactive users won't have a layout. 124990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (!layout_view_) 125090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return; 1251b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) if (alignment == SHELF_ALIGNMENT_BOTTOM || 1252b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) alignment == SHELF_ALIGNMENT_TOP) { 1253b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) if (avatar_) { 12544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (switches::UseAlternateShelfLayout()) { 1255a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) avatar_->SetBorder(views::Border::NullBorder()); 1256a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) avatar_->SetCornerRadii( 1257a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 0, kUserIconLargeCornerRadius, kUserIconLargeCornerRadius, 0); 12587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } else { 12595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) avatar_->SetBorder(views::Border::CreateEmptyBorder( 12605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 0, 12615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) kTrayImageItemHorizontalPaddingBottomAlignment + 2, 12625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 0, 12635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) kTrayImageItemHorizontalPaddingBottomAlignment)); 12647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1266b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) if (label_) { 1267a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // If label_ hasn't figured out its size yet, do that first. 1268a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (label_->GetContentsBounds().height() == 0) 1269a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) label_->SizeToPreferredSize(); 1270a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int height = label_->GetContentsBounds().height(); 1271a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int vertical_pad = (kTrayItemSize - height) / 2; 1272a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int remainder = height % 2; 12735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) label_->SetBorder(views::Border::CreateEmptyBorder( 1274a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) vertical_pad + remainder, 12755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) kTrayLabelItemHorizontalPaddingBottomAlignment, 1276a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) vertical_pad, 12775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) kTrayLabelItemHorizontalPaddingBottomAlignment)); 1278b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 1279b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) layout_view_->SetLayoutManager( 1280b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) new views::BoxLayout(views::BoxLayout::kHorizontal, 1281b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 0, 0, kUserLabelToIconPadding)); 1282b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } else { 12837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (avatar_) { 12844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (switches::UseAlternateShelfLayout()) { 1285a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) avatar_->SetBorder(views::Border::NullBorder()); 1286a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) avatar_->SetCornerRadii( 1287a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 0, 0, kUserIconLargeCornerRadius, kUserIconLargeCornerRadius); 12887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } else { 12897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch SetTrayImageItemBorder(avatar_, alignment); 12907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 12917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 1292b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) if (label_) { 12935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) label_->SetBorder(views::Border::CreateEmptyBorder( 1294d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) kTrayLabelItemVerticalPaddingVerticalAlignment, 12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kTrayLabelItemHorizontalPaddingBottomAlignment, 1296d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) kTrayLabelItemVerticalPaddingVerticalAlignment, 12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kTrayLabelItemHorizontalPaddingBottomAlignment)); 12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1299b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) layout_view_->SetLayoutManager( 1300b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) new views::BoxLayout(views::BoxLayout::kVertical, 1301b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 0, 0, kUserLabelToIconPadding)); 13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayUser::OnUserUpdate() { 1306ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch UpdateAvatarImage(Shell::GetInstance()->system_tray_delegate()-> 1307ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch GetUserLoginStatus()); 1308ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 1309ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 13104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void TrayUser::OnUserAddedToSession() { 13114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) SessionStateDelegate* session_state_delegate = 13124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) Shell::GetInstance()->session_state_delegate(); 13134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Only create views for user items which are logged in. 13144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (GetTrayIndex() >= session_state_delegate->NumberOfLoggedInUsers()) 13154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return; 13164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 13174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Enforce a layout change that newly added items become visible. 13184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) UpdateLayoutOfItem(); 13194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 13204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Update the user item. 13214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) UpdateAvatarImage( 13224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) Shell::GetInstance()->system_tray_delegate()->GetUserLoginStatus()); 13234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 13244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1325ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid TrayUser::UpdateAvatarImage(user::LoginStatus status) { 13264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) SessionStateDelegate* session_state_delegate = 13274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) Shell::GetInstance()->session_state_delegate(); 13284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (!avatar_ || 13294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) GetTrayIndex() >= session_state_delegate->NumberOfLoggedInUsers()) 1330ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return; 1331ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 13324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) int icon_size = switches::UseAlternateShelfLayout() ? 1333ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch kUserIconLargeSize : kUserIconSize; 1334ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 1335a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) content::BrowserContext* context = session_state_delegate-> 1336a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) GetBrowserContextByIndex(GetTrayIndex()); 1337a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) avatar_->SetImage(session_state_delegate->GetUserImage(context), 1338a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) gfx::Size(icon_size, icon_size)); 13394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 13404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Unit tests might come here with no images for some users. 13414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (avatar_->size().IsEmpty()) 13424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) avatar_->SetSize(gfx::Size(icon_size, icon_size)); 13434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 13444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 13454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)MultiProfileIndex TrayUser::GetTrayIndex() { 13464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) Shell* shell = Shell::GetInstance(); 13474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // If multi profile is not enabled we can use the normal index. 13484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (!shell->delegate()->IsMultiProfilesEnabled()) 13494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return multiprofile_index_; 13504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // In case of multi profile we need to mirror the indices since the system 13514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // tray items are in the reverse order then the menu items. 13524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return shell->session_state_delegate()->GetMaximumNumberOfLoggedInUsers() - 1353f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1 - multiprofile_index_; 13544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 13554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 13564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void TrayUser::UpdateLayoutOfItem() { 1357c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch RootWindowController* controller = GetRootWindowController( 1358c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch system_tray()->GetWidget()->GetNativeWindow()->GetRootWindow()); 13594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (controller && controller->shelf()) { 13604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) UpdateAfterShelfAlignmentChange( 13614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) controller->GetShelfLayoutManager()->GetAlignment()); 13624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace ash 1366