| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "ash/system/user/user_view.h" | 5 #include "ash/system/user/user_view.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <utility> | 8 #include <utility> |
| 9 | 9 |
| 10 #include "ash/multi_profile_uma.h" | 10 #include "ash/multi_profile_uma.h" |
| (...skipping 19 matching lines...) Expand all Loading... |
| 30 #include "ash/wm_window.h" | 30 #include "ash/wm_window.h" |
| 31 #include "base/memory/ptr_util.h" | 31 #include "base/memory/ptr_util.h" |
| 32 #include "components/signin/core/account_id/account_id.h" | 32 #include "components/signin/core/account_id/account_id.h" |
| 33 #include "components/user_manager/user_info.h" | 33 #include "components/user_manager/user_info.h" |
| 34 #include "ui/base/l10n/l10n_util.h" | 34 #include "ui/base/l10n/l10n_util.h" |
| 35 #include "ui/base/resource/resource_bundle.h" | 35 #include "ui/base/resource/resource_bundle.h" |
| 36 #include "ui/gfx/canvas.h" | 36 #include "ui/gfx/canvas.h" |
| 37 #include "ui/gfx/color_utils.h" | 37 #include "ui/gfx/color_utils.h" |
| 38 #include "ui/gfx/geometry/insets.h" | 38 #include "ui/gfx/geometry/insets.h" |
| 39 #include "ui/gfx/paint_vector_icon.h" | 39 #include "ui/gfx/paint_vector_icon.h" |
| 40 #include "ui/native_theme/native_theme.h" | |
| 41 #include "ui/views/controls/button/label_button.h" | 40 #include "ui/views/controls/button/label_button.h" |
| 42 #include "ui/views/controls/label.h" | 41 #include "ui/views/controls/label.h" |
| 43 #include "ui/views/controls/separator.h" | 42 #include "ui/views/controls/separator.h" |
| 44 #include "ui/views/layout/fill_layout.h" | 43 #include "ui/views/layout/fill_layout.h" |
| 45 #include "ui/views/painter.h" | 44 #include "ui/views/painter.h" |
| 46 | 45 |
| 47 namespace ash { | 46 namespace ash { |
| 48 namespace tray { | 47 namespace tray { |
| 49 | 48 |
| 50 namespace { | 49 namespace { |
| (...skipping 16 matching lines...) Expand all Loading... |
| 67 controller->SwitchActiveUser( | 66 controller->SwitchActiveUser( |
| 68 controller->GetUserSession(user_index)->account_id); | 67 controller->GetUserSession(user_index)->account_id); |
| 69 } | 68 } |
| 70 | 69 |
| 71 bool IsMultiProfileSupportedAndUserActive() { | 70 bool IsMultiProfileSupportedAndUserActive() { |
| 72 return Shell::Get()->shell_delegate()->IsMultiProfilesEnabled() && | 71 return Shell::Get()->shell_delegate()->IsMultiProfilesEnabled() && |
| 73 !Shell::Get()->session_controller()->IsUserSessionBlocked(); | 72 !Shell::Get()->session_controller()->IsUserSessionBlocked(); |
| 74 } | 73 } |
| 75 | 74 |
| 76 // Creates the view shown in the user switcher popup ("AddUserMenuOption"). | 75 // Creates the view shown in the user switcher popup ("AddUserMenuOption"). |
| 77 views::View* CreateAddUserView(AddUserSessionPolicy policy) { | 76 views::View* CreateAddUserView(AddUserSessionPolicy policy, |
| 77 views::ButtonListener* listener) { |
| 78 auto* view = new views::View; | 78 auto* view = new views::View; |
| 79 const int icon_padding = (kMenuButtonSize - kMenuIconSize) / 2; | 79 const int icon_padding = (kMenuButtonSize - kMenuIconSize) / 2; |
| 80 auto* layout = | 80 auto* layout = |
| 81 new views::BoxLayout(views::BoxLayout::kHorizontal, 0, 0, | 81 new views::BoxLayout(views::BoxLayout::kHorizontal, 0, 0, |
| 82 kTrayPopupLabelHorizontalPadding + icon_padding); | 82 kTrayPopupLabelHorizontalPadding + icon_padding); |
| 83 layout->set_minimum_cross_axis_size(kTrayPopupItemMinHeight); | 83 layout->set_minimum_cross_axis_size(kTrayPopupItemMinHeight); |
| 84 view->SetLayoutManager(layout); | 84 view->SetLayoutManager(layout); |
| 85 view->set_background(views::Background::CreateThemedSolidBackground( | 85 view->set_background( |
| 86 view, ui::NativeTheme::kColorId_BubbleBackground)); | 86 views::Background::CreateSolidBackground(kBackgroundColor)); |
| 87 | 87 |
| 88 int message_id = 0; | 88 int message_id = 0; |
| 89 switch (policy) { | 89 switch (policy) { |
| 90 case AddUserSessionPolicy::ALLOWED: { | 90 case AddUserSessionPolicy::ALLOWED: { |
| 91 message_id = IDS_ASH_STATUS_TRAY_SIGN_IN_ANOTHER_ACCOUNT; | 91 message_id = IDS_ASH_STATUS_TRAY_SIGN_IN_ANOTHER_ACCOUNT; |
| 92 | 92 |
| 93 auto* icon = new views::ImageView(); | 93 auto* icon = new views::ImageView(); |
| 94 icon->SetImage( | 94 icon->SetImage( |
| 95 gfx::CreateVectorIcon(kSystemMenuNewUserIcon, kMenuIconColor)); | 95 gfx::CreateVectorIcon(kSystemMenuNewUserIcon, kMenuIconColor)); |
| 96 view->AddChildView(icon); | 96 view->AddChildView(icon); |
| (...skipping 20 matching lines...) Expand all Loading... |
| 117 if (policy != AddUserSessionPolicy::ALLOWED) { | 117 if (policy != AddUserSessionPolicy::ALLOWED) { |
| 118 label_style.set_font_style(TrayPopupItemStyle::FontStyle::CAPTION); | 118 label_style.set_font_style(TrayPopupItemStyle::FontStyle::CAPTION); |
| 119 label_style.set_color_style(TrayPopupItemStyle::ColorStyle::INACTIVE); | 119 label_style.set_color_style(TrayPopupItemStyle::ColorStyle::INACTIVE); |
| 120 vertical_padding += kMenuSeparatorVerticalPadding; | 120 vertical_padding += kMenuSeparatorVerticalPadding; |
| 121 } | 121 } |
| 122 label_style.SetupLabel(command_label); | 122 label_style.SetupLabel(command_label); |
| 123 view->AddChildView(command_label); | 123 view->AddChildView(command_label); |
| 124 view->SetBorder(views::CreateEmptyBorder(vertical_padding, icon_padding, | 124 view->SetBorder(views::CreateEmptyBorder(vertical_padding, icon_padding, |
| 125 vertical_padding, | 125 vertical_padding, |
| 126 kTrayPopupLabelHorizontalPadding)); | 126 kTrayPopupLabelHorizontalPadding)); |
| 127 if (policy == AddUserSessionPolicy::ALLOWED) { |
| 128 auto* button = |
| 129 new ButtonFromView(view, listener, TrayPopupInkDropStyle::INSET_BOUNDS); |
| 130 button->SetAccessibleName( |
| 131 l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_SIGN_IN_ANOTHER_ACCOUNT)); |
| 132 return button; |
| 133 } |
| 127 | 134 |
| 128 return view; | 135 return view; |
| 129 } | 136 } |
| 130 | 137 |
| 131 class UserViewMouseWatcherHost : public views::MouseWatcherHost { | 138 class UserViewMouseWatcherHost : public views::MouseWatcherHost { |
| 132 public: | 139 public: |
| 133 explicit UserViewMouseWatcherHost(const gfx::Rect& screen_area) | 140 explicit UserViewMouseWatcherHost(const gfx::Rect& screen_area) |
| 134 : screen_area_(screen_area) {} | 141 : screen_area_(screen_area) {} |
| 135 ~UserViewMouseWatcherHost() override {} | 142 ~UserViewMouseWatcherHost() override {} |
| 136 | 143 |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 214 auto* layout = new views::BoxLayout(views::BoxLayout::kHorizontal, 0, 0, 0); | 221 auto* layout = new views::BoxLayout(views::BoxLayout::kHorizontal, 0, 0, 0); |
| 215 SetLayoutManager(layout); | 222 SetLayoutManager(layout); |
| 216 layout->set_cross_axis_alignment( | 223 layout->set_cross_axis_alignment( |
| 217 views::BoxLayout::CROSS_AXIS_ALIGNMENT_CENTER); | 224 views::BoxLayout::CROSS_AXIS_ALIGNMENT_CENTER); |
| 218 layout->SetFlexForView(user_card_container_, 1); | 225 layout->SetFlexForView(user_card_container_, 1); |
| 219 | 226 |
| 220 SetBorder(base::MakeUnique<ActiveUserBorder>()); | 227 SetBorder(base::MakeUnique<ActiveUserBorder>()); |
| 221 } | 228 } |
| 222 | 229 |
| 223 UserView::~UserView() { | 230 UserView::~UserView() { |
| 224 HideUserDropdownWidget(); | 231 RemoveAddUserMenuOption(); |
| 225 } | 232 } |
| 226 | 233 |
| 227 TrayUser::TestState UserView::GetStateForTest() const { | 234 TrayUser::TestState UserView::GetStateForTest() const { |
| 228 if (user_dropdown_widget_) | 235 if (add_menu_option_) |
| 229 return add_user_enabled_ ? TrayUser::ACTIVE : TrayUser::ACTIVE_BUT_DISABLED; | 236 return add_user_enabled_ ? TrayUser::ACTIVE : TrayUser::ACTIVE_BUT_DISABLED; |
| 230 | 237 |
| 231 // If the container is the user card view itself, there's no ButtonFromView | 238 // If the container is the user card view itself, there's no ButtonFromView |
| 232 // wrapping it. | 239 // wrapping it. |
| 233 if (user_card_container_ == user_card_view_) | 240 if (user_card_container_ == user_card_view_) |
| 234 return TrayUser::SHOWN; | 241 return TrayUser::SHOWN; |
| 235 | 242 |
| 236 return static_cast<ButtonFromView*>(user_card_container_) | 243 return static_cast<ButtonFromView*>(user_card_container_) |
| 237 ->is_hovered_for_test() | 244 ->is_hovered_for_test() |
| 238 ? TrayUser::HOVERED | 245 ? TrayUser::HOVERED |
| 239 : TrayUser::SHOWN; | 246 : TrayUser::SHOWN; |
| 240 } | 247 } |
| 241 | 248 |
| 242 gfx::Rect UserView::GetBoundsInScreenOfUserButtonForTest() { | 249 gfx::Rect UserView::GetBoundsInScreenOfUserButtonForTest() { |
| 243 return user_card_container_->GetBoundsInScreen(); | 250 return user_card_container_->GetBoundsInScreen(); |
| 244 } | 251 } |
| 245 | 252 |
| 246 int UserView::GetHeightForWidth(int width) const { | 253 int UserView::GetHeightForWidth(int width) const { |
| 247 return GetPreferredSize().height(); | 254 return GetPreferredSize().height(); |
| 248 } | 255 } |
| 249 | 256 |
| 250 void UserView::ButtonPressed(views::Button* sender, const ui::Event& event) { | 257 void UserView::ButtonPressed(views::Button* sender, const ui::Event& event) { |
| 251 if (sender == logout_button_) { | 258 if (sender == logout_button_) { |
| 252 ShellPort::Get()->RecordUserMetricsAction(UMA_STATUS_AREA_SIGN_OUT); | 259 ShellPort::Get()->RecordUserMetricsAction(UMA_STATUS_AREA_SIGN_OUT); |
| 253 HideUserDropdownWidget(); | 260 RemoveAddUserMenuOption(); |
| 254 Shell::Get()->system_tray_controller()->SignOut(); | 261 Shell::Get()->system_tray_controller()->SignOut(); |
| 255 } else if (sender == user_card_container_ && | 262 } else if (sender == user_card_container_ && |
| 256 IsMultiProfileSupportedAndUserActive()) { | 263 IsMultiProfileSupportedAndUserActive()) { |
| 257 ToggleUserDropdownWidget(); | 264 ToggleAddUserMenuOption(); |
| 258 } else if (user_dropdown_widget_ && | 265 } else if (add_menu_option_ && |
| 259 sender->GetWidget() == user_dropdown_widget_.get()) { | 266 sender->GetWidget() == add_menu_option_.get()) { |
| 260 DCHECK_EQ(Shell::Get()->session_controller()->NumberOfLoggedInUsers(), | 267 DCHECK_EQ(Shell::Get()->session_controller()->NumberOfLoggedInUsers(), |
| 261 sender->parent()->child_count() - 1); | 268 sender->parent()->child_count() - 1); |
| 262 const int index_in_add_menu = sender->parent()->GetIndexOf(sender); | 269 const int index_in_add_menu = sender->parent()->GetIndexOf(sender); |
| 263 // The last item is the "sign in another user" row. | 270 // The last item is the "sign in another user" row. |
| 264 if (index_in_add_menu == sender->parent()->child_count() - 1) { | 271 if (index_in_add_menu == sender->parent()->child_count() - 1) { |
| 265 MultiProfileUMA::RecordSigninUser(MultiProfileUMA::SIGNIN_USER_BY_TRAY); | 272 MultiProfileUMA::RecordSigninUser(MultiProfileUMA::SIGNIN_USER_BY_TRAY); |
| 266 Shell::Get()->system_tray_delegate()->ShowUserLogin(); | 273 Shell::Get()->system_tray_delegate()->ShowUserLogin(); |
| 267 } else { | 274 } else { |
| 268 const int user_index = index_in_add_menu; | 275 const int user_index = index_in_add_menu; |
| 269 SwitchUser(user_index); | 276 SwitchUser(user_index); |
| 270 } | 277 } |
| 271 HideUserDropdownWidget(); | 278 RemoveAddUserMenuOption(); |
| 272 owner_->system_tray()->CloseSystemBubble(); | 279 owner_->system_tray()->CloseSystemBubble(); |
| 273 } else { | 280 } else { |
| 274 NOTREACHED(); | 281 NOTREACHED(); |
| 275 } | 282 } |
| 276 } | 283 } |
| 277 | 284 |
| 278 void UserView::OnWillChangeFocus(View* focused_before, View* focused_now) { | 285 void UserView::OnWillChangeFocus(View* focused_before, View* focused_now) { |
| 279 if (focused_now) | 286 if (focused_now) |
| 280 HideUserDropdownWidget(); | 287 RemoveAddUserMenuOption(); |
| 281 } | 288 } |
| 282 | 289 |
| 283 void UserView::OnDidChangeFocus(View* focused_before, View* focused_now) { | 290 void UserView::OnDidChangeFocus(View* focused_before, View* focused_now) { |
| 284 // Nothing to do here. | 291 // Nothing to do here. |
| 285 } | 292 } |
| 286 | 293 |
| 287 void UserView::AddLogoutButton(LoginStatus login) { | 294 void UserView::AddLogoutButton(LoginStatus login) { |
| 288 AddChildView(TrayPopupUtils::CreateVerticalSeparator()); | 295 AddChildView(TrayPopupUtils::CreateVerticalSeparator()); |
| 289 logout_button_ = TrayPopupUtils::CreateTrayPopupBorderlessButton( | 296 logout_button_ = TrayPopupUtils::CreateTrayPopupBorderlessButton( |
| 290 this, user::GetLocalizedSignOutStringForStatus(login, true)); | 297 this, user::GetLocalizedSignOutStringForStatus(login, true)); |
| 291 AddChildView(logout_button_); | 298 AddChildView(logout_button_); |
| 292 } | 299 } |
| 293 | 300 |
| 294 void UserView::AddUserCard(LoginStatus login) { | 301 void UserView::AddUserCard(LoginStatus login) { |
| 295 DCHECK(!user_card_container_); | 302 DCHECK(!user_card_container_); |
| 296 DCHECK(!user_card_view_); | 303 DCHECK(!user_card_view_); |
| 297 user_card_view_ = new UserCardView(login, 0); | 304 user_card_view_ = new UserCardView(login, 0); |
| 298 // The entry is clickable when no system modal dialog is open and the multi | 305 // The entry is clickable when no system modal dialog is open and the multi |
| 299 // profile option is active. | 306 // profile option is active. |
| 300 if (!ShellPort::Get()->IsSystemModalWindowOpen() && | 307 if (!ShellPort::Get()->IsSystemModalWindowOpen() && |
| 301 IsMultiProfileSupportedAndUserActive()) { | 308 IsMultiProfileSupportedAndUserActive()) { |
| 302 user_card_container_ = new ButtonFromView( | 309 user_card_container_ = new ButtonFromView( |
| 303 user_card_view_, this, TrayPopupInkDropStyle::INSET_BOUNDS); | 310 user_card_view_, this, TrayPopupInkDropStyle::INSET_BOUNDS); |
| 304 } else { | 311 } else { |
| 305 user_card_container_ = user_card_view_; | 312 user_card_container_ = user_card_view_; |
| 306 } | 313 } |
| 307 AddChildViewAt(user_card_container_, 0); | 314 AddChildViewAt(user_card_container_, 0); |
| 308 } | 315 } |
| 309 | 316 |
| 310 void UserView::ToggleUserDropdownWidget() { | 317 void UserView::ToggleAddUserMenuOption() { |
| 311 if (user_dropdown_widget_) { | 318 if (add_menu_option_) { |
| 312 HideUserDropdownWidget(); | 319 RemoveAddUserMenuOption(); |
| 313 return; | 320 return; |
| 314 } | 321 } |
| 315 | 322 |
| 316 // Note: We do not need to install a global event handler to delete this | 323 // Note: We do not need to install a global event handler to delete this |
| 317 // item since it will destroyed automatically before the menu / user menu item | 324 // item since it will destroyed automatically before the menu / user menu item |
| 318 // gets destroyed.. | 325 // gets destroyed.. |
| 319 user_dropdown_widget_.reset(new views::Widget); | 326 add_menu_option_.reset(new views::Widget); |
| 320 views::Widget::InitParams params; | 327 views::Widget::InitParams params; |
| 321 params.type = views::Widget::InitParams::TYPE_MENU; | 328 params.type = views::Widget::InitParams::TYPE_MENU; |
| 322 params.keep_on_top = true; | 329 params.keep_on_top = true; |
| 323 params.accept_events = true; | 330 params.accept_events = true; |
| 324 params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; | 331 params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; |
| 325 params.opacity = views::Widget::InitParams::TRANSLUCENT_WINDOW; | 332 params.opacity = views::Widget::InitParams::TRANSLUCENT_WINDOW; |
| 326 params.name = "AddUserMenuOption"; | 333 params.name = "AddUserMenuOption"; |
| 327 WmWindow::Get(GetWidget()->GetNativeWindow()) | 334 WmWindow::Get(GetWidget()->GetNativeWindow()) |
| 328 ->GetRootWindowController() | 335 ->GetRootWindowController() |
| 329 ->ConfigureWidgetInitParamsForContainer( | 336 ->ConfigureWidgetInitParamsForContainer( |
| 330 user_dropdown_widget_.get(), | 337 add_menu_option_.get(), kShellWindowId_DragImageAndTooltipContainer, |
| 331 kShellWindowId_DragImageAndTooltipContainer, ¶ms); | 338 ¶ms); |
| 332 user_dropdown_widget_->Init(params); | 339 add_menu_option_->Init(params); |
| 333 | 340 |
| 334 const SessionController* const session_controller = | 341 const SessionController* const session_controller = |
| 335 Shell::Get()->session_controller(); | 342 Shell::Get()->session_controller(); |
| 336 const AddUserSessionPolicy add_user_policy = | 343 const AddUserSessionPolicy add_user_policy = |
| 337 session_controller->GetAddUserPolicy(); | 344 session_controller->GetAddUserPolicy(); |
| 338 add_user_enabled_ = add_user_policy == AddUserSessionPolicy::ALLOWED; | 345 add_user_enabled_ = add_user_policy == AddUserSessionPolicy::ALLOWED; |
| 339 | 346 |
| 340 // Position the widget on top of the user card view (which is still in the | 347 // Position the widget on top of the user card view (which is still in the |
| 341 // system menu). The top half of the widget will be transparent to allow | 348 // system menu). The top half of the widget will be transparent to allow |
| 342 // the active user to show through. | 349 // the active user to show through. |
| 343 gfx::Rect bounds = user_card_container_->GetBoundsInScreen(); | 350 gfx::Rect bounds = user_card_container_->GetBoundsInScreen(); |
| 344 bounds.set_width(bounds.width() + kSeparatorWidth); | 351 bounds.set_width(bounds.width() + kSeparatorWidth); |
| 345 int row_height = bounds.height(); | 352 int row_height = bounds.height(); |
| 346 | 353 |
| 347 views::View* container = new UserDropdownWidgetContents( | 354 views::View* container = new UserDropdownWidgetContents( |
| 348 base::Bind(&UserView::HideUserDropdownWidget, base::Unretained(this))); | 355 base::Bind(&UserView::RemoveAddUserMenuOption, base::Unretained(this))); |
| 349 views::View* add_user_view = CreateAddUserView(add_user_policy); | |
| 350 const SkColor bg_color = add_user_view->background()->get_color(); | |
| 351 container->SetBorder(views::CreatePaddedBorder( | 356 container->SetBorder(views::CreatePaddedBorder( |
| 352 views::CreateSolidSidedBorder(0, 0, 0, kSeparatorWidth, bg_color), | 357 views::CreateSolidSidedBorder(0, 0, 0, kSeparatorWidth, kBackgroundColor), |
| 353 gfx::Insets(row_height, 0, 0, 0))); | 358 gfx::Insets(row_height, 0, 0, 0))); |
| 354 | |
| 355 // Create the contents aside from the empty window through which the active | |
| 356 // user is seen. | |
| 357 views::View* user_dropdown_padding = new views::View(); | 359 views::View* user_dropdown_padding = new views::View(); |
| 358 user_dropdown_padding->SetBorder(views::CreateSolidSidedBorder( | 360 user_dropdown_padding->SetBorder(views::CreateSolidSidedBorder( |
| 359 kMenuSeparatorVerticalPadding - kSeparatorWidth, 0, 0, 0, bg_color)); | 361 kMenuSeparatorVerticalPadding - kSeparatorWidth, 0, 0, 0, |
| 362 kBackgroundColor)); |
| 360 user_dropdown_padding->SetLayoutManager( | 363 user_dropdown_padding->SetLayoutManager( |
| 361 new views::BoxLayout(views::BoxLayout::kVertical, 0, 0, 0)); | 364 new views::BoxLayout(views::BoxLayout::kVertical, 0, 0, 0)); |
| 362 views::Separator* separator = new views::Separator(); | 365 views::Separator* separator = new views::Separator(); |
| 363 separator->SetPreferredHeight(kSeparatorWidth); | 366 separator->SetPreferredHeight(kSeparatorWidth); |
| 364 separator->SetColor( | 367 separator->SetColor(color_utils::GetResultingPaintColor(kMenuSeparatorColor, |
| 365 color_utils::GetResultingPaintColor(kMenuSeparatorColor, bg_color)); | 368 kBackgroundColor)); |
| 366 const int separator_horizontal_padding = | 369 const int separator_horizontal_padding = |
| 367 (kTrayPopupItemMinStartWidth - kTrayItemSize) / 2; | 370 (kTrayPopupItemMinStartWidth - kTrayItemSize) / 2; |
| 368 separator->SetBorder( | 371 separator->SetBorder(views::CreateSolidSidedBorder( |
| 369 views::CreateSolidSidedBorder(0, separator_horizontal_padding, 0, | 372 0, separator_horizontal_padding, 0, separator_horizontal_padding, |
| 370 separator_horizontal_padding, bg_color)); | 373 kBackgroundColor)); |
| 371 user_dropdown_padding->AddChildView(separator); | 374 user_dropdown_padding->AddChildView(separator); |
| 372 | 375 |
| 373 // Add other logged in users. | |
| 374 for (int i = 1; i < session_controller->NumberOfLoggedInUsers(); ++i) { | 376 for (int i = 1; i < session_controller->NumberOfLoggedInUsers(); ++i) { |
| 375 user_dropdown_padding->AddChildView( | 377 user_dropdown_padding->AddChildView( |
| 376 new ButtonFromView(new UserCardView(LoginStatus::USER, i), this, | 378 new ButtonFromView(new UserCardView(LoginStatus::USER, i), this, |
| 377 TrayPopupInkDropStyle::INSET_BOUNDS)); | 379 TrayPopupInkDropStyle::INSET_BOUNDS)); |
| 378 } | 380 } |
| 379 | 381 |
| 380 // Add the "add user" option or the "can't add another user" message. | 382 user_dropdown_padding->AddChildView(CreateAddUserView(add_user_policy, this)); |
| 381 if (add_user_enabled_) { | |
| 382 auto* button = new ButtonFromView(add_user_view, this, | |
| 383 TrayPopupInkDropStyle::INSET_BOUNDS); | |
| 384 button->SetAccessibleName( | |
| 385 l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_SIGN_IN_ANOTHER_ACCOUNT)); | |
| 386 user_dropdown_padding->AddChildView(button); | |
| 387 } else { | |
| 388 user_dropdown_padding->AddChildView(add_user_view); | |
| 389 } | |
| 390 | |
| 391 container->AddChildView(user_dropdown_padding); | 383 container->AddChildView(user_dropdown_padding); |
| 392 container->SetLayoutManager(new views::FillLayout()); | 384 container->SetLayoutManager(new views::FillLayout()); |
| 393 user_dropdown_widget_->SetContentsView(container); | 385 add_menu_option_->SetContentsView(container); |
| 394 | 386 |
| 395 bounds.set_height(container->GetPreferredSize().height()); | 387 bounds.set_height(container->GetPreferredSize().height()); |
| 396 user_dropdown_widget_->SetBounds(bounds); | 388 add_menu_option_->SetBounds(bounds); |
| 397 | 389 |
| 398 // Suppress the appearance of the collective capture icon while the dropdown | 390 // Suppress the appearance of the collective capture icon while the dropdown |
| 399 // is open (the icon will appear in the specific user rows). | 391 // is open (the icon will appear in the specific user rows). |
| 400 user_card_view_->SetSuppressCaptureIcon(true); | 392 user_card_view_->SetSuppressCaptureIcon(true); |
| 401 | 393 |
| 402 // Show the content. | 394 // Show the content. |
| 403 user_dropdown_widget_->SetAlwaysOnTop(true); | 395 add_menu_option_->SetAlwaysOnTop(true); |
| 404 user_dropdown_widget_->Show(); | 396 add_menu_option_->Show(); |
| 405 | 397 |
| 406 // Install a listener to focus changes so that we can remove the card when | 398 // Install a listener to focus changes so that we can remove the card when |
| 407 // the focus gets changed. When called through the destruction of the bubble, | 399 // the focus gets changed. When called through the destruction of the bubble, |
| 408 // the FocusManager cannot be determined anymore and we remember it here. | 400 // the FocusManager cannot be determined anymore and we remember it here. |
| 409 focus_manager_ = user_card_container_->GetFocusManager(); | 401 focus_manager_ = user_card_container_->GetFocusManager(); |
| 410 focus_manager_->AddFocusChangeListener(this); | 402 focus_manager_->AddFocusChangeListener(this); |
| 411 } | 403 } |
| 412 | 404 |
| 413 void UserView::HideUserDropdownWidget() { | 405 void UserView::RemoveAddUserMenuOption() { |
| 414 if (!user_dropdown_widget_) | 406 if (!add_menu_option_) |
| 415 return; | 407 return; |
| 416 focus_manager_->RemoveFocusChangeListener(this); | 408 focus_manager_->RemoveFocusChangeListener(this); |
| 417 focus_manager_ = nullptr; | 409 focus_manager_ = nullptr; |
| 418 if (user_card_container_->GetFocusManager()) | 410 if (user_card_container_->GetFocusManager()) |
| 419 user_card_container_->GetFocusManager()->ClearFocus(); | 411 user_card_container_->GetFocusManager()->ClearFocus(); |
| 420 user_card_view_->SetSuppressCaptureIcon(false); | 412 user_card_view_->SetSuppressCaptureIcon(false); |
| 421 user_dropdown_widget_.reset(); | 413 add_menu_option_.reset(); |
| 422 } | 414 } |
| 423 | 415 |
| 424 } // namespace tray | 416 } // namespace tray |
| 425 } // namespace ash | 417 } // namespace ash |
| OLD | NEW |