[go: nahoru, domu]

blob: 9fe8a9cb3a8e7cb2dd33294510ae0b381e022d1c [file] [log] [blame]
bartfab@chromium.org7b3f91ee2014-03-06 11:41:401// Copyright 2014 The Chromium Authors. All rights reserved.
bartfab@chromium.orgc80357d2013-08-14 11:54:422// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
James Cooka35a1e22017-04-08 02:33:085#include "ash/system/session/logout_button_tray.h"
bartfab@chromium.orgc80357d2013-08-14 11:54:426
Mitsuru Oshima04b54d02017-10-09 14:22:457#include <memory>
8
James Cookdc041122017-08-01 14:03:229#include "ash/public/cpp/ash_pref_names.h"
taptede3880da2017-05-16 05:35:1710#include "ash/public/cpp/ash_typography.h"
estade1b92771b2017-01-10 04:51:2011#include "ash/resources/vector_icons/vector_icons.h"
Xiyuan Xiae7b19542019-05-06 23:05:1812#include "ash/session/session_controller_impl.h"
James Cook840177e2017-05-25 02:20:0113#include "ash/shelf/shelf.h"
sky79fa34712017-03-20 23:46:4714#include "ash/shell.h"
minchbee2e312019-08-15 21:52:4015#include "ash/style/ash_color_provider.h"
James Cooka35a1e22017-04-08 02:33:0816#include "ash/system/session/logout_confirmation_controller.h"
mohsene6704a02017-04-20 06:30:2017#include "ash/system/status_area_widget.h"
James Cookb0bf8e82017-04-09 17:01:4418#include "ash/system/tray/tray_constants.h"
mohsene6704a02017-04-20 06:30:2019#include "ash/system/tray/tray_container.h"
James Cookb0bf8e82017-04-09 17:01:4420#include "ash/system/user/login_status.h"
Sebastien Marchand6d0558fd2019-01-25 16:49:3721#include "base/bind.h"
Wenzhao Zangb06aeea2018-11-28 01:43:3522#include "base/metrics/user_metrics.h"
James Cookdc041122017-08-01 14:03:2223#include "components/prefs/pref_change_registrar.h"
24#include "components/prefs/pref_registry_simple.h"
25#include "components/prefs/pref_service.h"
mohsene6704a02017-04-20 06:30:2026#include "ui/accessibility/ax_node_data.h"
estadeab413582016-08-03 16:37:0727#include "ui/gfx/color_palette.h"
yukishiino@chromium.orgc3d71b642014-02-05 08:39:4728#include "ui/gfx/geometry/size.h"
estade71ec8bb2016-08-09 00:00:4729#include "ui/gfx/paint_vector_icon.h"
estadeab413582016-08-03 16:37:0730#include "ui/views/controls/button/md_text_button.h"
mohsene6704a02017-04-20 06:30:2031#include "ui/views/layout/fill_layout.h"
bartfab@chromium.orgc80357d2013-08-14 11:54:4232
33namespace ash {
bartfab@chromium.orgc80357d2013-08-14 11:54:4234
Tim Song23378f32019-11-21 06:07:0735LogoutButtonTray::LogoutButtonTray(Shelf* shelf) : TrayBackgroundView(shelf) {
James Cookdc041122017-08-01 14:03:2236 DCHECK(shelf);
Sam McNallyf4dab612017-08-16 03:06:3337 Shell::Get()->session_controller()->AddObserver(this);
yiyixee16fc42017-01-10 05:49:2938
Yeol Parkca316072019-05-22 01:47:0239 auto button = views::MdTextButton::Create(this, base::string16(),
40 CONTEXT_LAUNCHER_BUTTON);
41 button->SetProminent(true);
Peter Kasting440758b2019-11-26 03:19:5242 button->SetBgColorOverride(AshColorProvider::Get()->GetBaseLayerColor(
43 AshColorProvider::BaseLayerType::kRed,
44 AshColorProvider::AshColorMode::kDark));
mohsene6704a02017-04-20 06:30:2045
Tim Song23378f32019-11-21 06:07:0746 button_ = tray_container()->AddChildView(std::move(button));
bartfab@chromium.orgc80357d2013-08-14 11:54:4247}
48
49LogoutButtonTray::~LogoutButtonTray() {
Sam McNallyf4dab612017-08-16 03:06:3350 Shell::Get()->session_controller()->RemoveObserver(this);
James Cookdc041122017-08-01 14:03:2251}
52
53// static
54void LogoutButtonTray::RegisterProfilePrefs(PrefRegistrySimple* registry) {
James Cook277f6432019-10-18 22:39:3355 registry->RegisterBooleanPref(prefs::kShowLogoutButtonInTray, false);
56 registry->RegisterIntegerPref(prefs::kLogoutDialogDurationMs, 20000);
bartfab@chromium.orgc80357d2013-08-14 11:54:4257}
58
Manu Cornet26988c52020-02-27 21:40:1659void LogoutButtonTray::UpdateLayout() {
Tim Song23378f32019-11-21 06:07:0760 // We must first update the button so that its container can lay it out
mohsene6704a02017-04-20 06:30:2061 // correctly.
62 UpdateButtonTextAndImage();
Manu Cornet26988c52020-02-27 21:40:1663 tray_container()->UpdateLayout();
Tim Song23378f32019-11-21 06:07:0764}
65
66void LogoutButtonTray::UpdateBackground() {
67 // The logout button does not have a background.
bartfab@chromium.orgc80357d2013-08-14 11:54:4268}
69
bartfab@chromium.orgc80357d2013-08-14 11:54:4270void LogoutButtonTray::ButtonPressed(views::Button* sender,
71 const ui::Event& event) {
mohsene6704a02017-04-20 06:30:2072 DCHECK_EQ(button_, sender);
bruthiga80489912016-10-27 23:20:4873
bartfab@chromium.org7b3f91ee2014-03-06 11:41:4074 if (dialog_duration_ <= base::TimeDelta()) {
Wenzhao Zangb06aeea2018-11-28 01:43:3575 if (Shell::Get()->session_controller()->IsDemoSession())
76 base::RecordAction(base::UserMetricsAction("DemoMode.ExitFromShelf"));
bartfab@chromium.org7b3f91ee2014-03-06 11:41:4077 // Sign out immediately if |dialog_duration_| is non-positive.
Steven Bennetts40ab7f72017-10-04 23:32:2778 Shell::Get()->session_controller()->RequestSignOut();
sky79fa34712017-03-20 23:46:4779 } else if (Shell::Get()->logout_confirmation_controller()) {
80 Shell::Get()->logout_confirmation_controller()->ConfirmLogout(
Wenzhao Zangb06aeea2018-11-28 01:43:3581 base::TimeTicks::Now() + dialog_duration_,
82 LogoutConfirmationController::Source::kShelfExitButton);
bartfab@chromium.org7b3f91ee2014-03-06 11:41:4083 }
bartfab@chromium.orgc80357d2013-08-14 11:54:4284}
85
James Cookdc041122017-08-01 14:03:2286void LogoutButtonTray::OnActiveUserPrefServiceChanged(PrefService* prefs) {
87 pref_change_registrar_.reset();
Mitsuru Oshima04b54d02017-10-09 14:22:4588 pref_change_registrar_ = std::make_unique<PrefChangeRegistrar>();
James Cookdc041122017-08-01 14:03:2289 pref_change_registrar_->Init(prefs);
90 pref_change_registrar_->Add(
91 prefs::kShowLogoutButtonInTray,
Qiang Xudadd3ad62018-03-07 17:22:4592 base::BindRepeating(&LogoutButtonTray::UpdateShowLogoutButtonInTray,
93 base::Unretained(this)));
James Cookdc041122017-08-01 14:03:2294 pref_change_registrar_->Add(
95 prefs::kLogoutDialogDurationMs,
Qiang Xudadd3ad62018-03-07 17:22:4596 base::BindRepeating(&LogoutButtonTray::UpdateLogoutDialogDuration,
97 base::Unretained(this)));
James Cookdc041122017-08-01 14:03:2298
99 // Read the initial values.
100 UpdateShowLogoutButtonInTray();
101 UpdateLogoutDialogDuration();
102}
103
Andrew Lee9b38f102019-05-20 23:21:29104const char* LogoutButtonTray::GetClassName() const {
105 return "LogoutButtonTray";
106}
107
James Cookdc041122017-08-01 14:03:22108void LogoutButtonTray::UpdateShowLogoutButtonInTray() {
109 show_logout_button_in_tray_ = pref_change_registrar_->prefs()->GetBoolean(
110 prefs::kShowLogoutButtonInTray);
bruthiga80489912016-10-27 23:20:48111 UpdateVisibility();
112}
113
James Cookdc041122017-08-01 14:03:22114void LogoutButtonTray::UpdateLogoutDialogDuration() {
115 const int duration_ms = pref_change_registrar_->prefs()->GetInteger(
116 prefs::kLogoutDialogDurationMs);
117 dialog_duration_ = base::TimeDelta::FromMilliseconds(duration_ms);
bruthiga80489912016-10-27 23:20:48118}
119
Manu Cornet3e74a3c2020-02-24 22:43:17120void LogoutButtonTray::UpdateAfterLoginStatusChange() {
mohsene6704a02017-04-20 06:30:20121 UpdateButtonTextAndImage();
bartfab@chromium.orgc80357d2013-08-14 11:54:42122}
123
Tim Song23378f32019-11-21 06:07:07124void LogoutButtonTray::ClickedOutsideBubble() {}
125
126void LogoutButtonTray::HideBubbleWithView(const TrayBubbleView* bubble_view) {}
127
128base::string16 LogoutButtonTray::GetAccessibleNameForTray() {
129 return button_->GetText();
130}
131
Toni Barzice4627b852020-06-04 02:22:49132void LogoutButtonTray::HandleLocaleChange() {
133 UpdateButtonTextAndImage();
134}
135
yilkal4ae1c6152019-06-28 21:37:53136void LogoutButtonTray::UpdateVisibility() {
Tim Song23378f32019-11-21 06:07:07137 LoginStatus login_status = shelf()->GetStatusAreaWidget()->login_status();
138 SetVisiblePreferred(show_logout_button_in_tray_ &&
139 login_status != LoginStatus::NOT_LOGGED_IN &&
140 login_status != LoginStatus::LOCKED);
yilkal4ae1c6152019-06-28 21:37:53141}
142
mohsene6704a02017-04-20 06:30:20143void LogoutButtonTray::UpdateButtonTextAndImage() {
Tim Song23378f32019-11-21 06:07:07144 LoginStatus login_status = shelf()->GetStatusAreaWidget()->login_status();
estade71ec8bb2016-08-09 00:00:47145 const base::string16 title =
146 user::GetLocalizedSignOutStringForStatus(login_status, false);
Tim Song23378f32019-11-21 06:07:07147 if (shelf()->IsHorizontalAlignment()) {
estade71ec8bb2016-08-09 00:00:47148 button_->SetText(title);
mohsene6704a02017-04-20 06:30:20149 button_->SetImage(views::Button::STATE_NORMAL, gfx::ImageSkia());
estade3cc64b832017-02-08 02:29:42150 button_->SetMinSize(gfx::Size(0, kTrayItemSize));
estade71ec8bb2016-08-09 00:00:47151 } else {
152 button_->SetText(base::string16());
153 button_->SetAccessibleName(title);
minchbee2e312019-08-15 21:52:40154 button_->SetImage(views::Button::STATE_NORMAL,
155 gfx::CreateVectorIcon(
156 kShelfLogoutIcon,
157 AshColorProvider::Get()->GetContentLayerColor(
158 AshColorProvider::ContentLayerType::kIconPrimary,
159 AshColorProvider::AshColorMode::kDark)));
estade3cc64b832017-02-08 02:29:42160 button_->SetMinSize(gfx::Size(kTrayItemSize, kTrayItemSize));
estade71ec8bb2016-08-09 00:00:47161 }
162 UpdateVisibility();
163}
164
bartfab@chromium.orgc80357d2013-08-14 11:54:42165} // namespace ash