[go: nahoru, domu]

blob: 5865ec3850968bce7082341eaaa03540bad4f35b [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"
yukishiino@chromium.orgc3d71b642014-02-05 08:39:4727#include "ui/gfx/geometry/size.h"
estade71ec8bb2016-08-09 00:00:4728#include "ui/gfx/paint_vector_icon.h"
estadeab413582016-08-03 16:37:0729#include "ui/views/controls/button/md_text_button.h"
mohsene6704a02017-04-20 06:30:2030#include "ui/views/layout/fill_layout.h"
bartfab@chromium.orgc80357d2013-08-14 11:54:4231
32namespace ash {
bartfab@chromium.orgc80357d2013-08-14 11:54:4233
Tim Song23378f32019-11-21 06:07:0734LogoutButtonTray::LogoutButtonTray(Shelf* shelf) : TrayBackgroundView(shelf) {
James Cookdc041122017-08-01 14:03:2235 DCHECK(shelf);
Sam McNallyf4dab612017-08-16 03:06:3336 Shell::Get()->session_controller()->AddObserver(this);
yiyixee16fc42017-01-10 05:49:2937
minch72c46102020-11-16 21:48:4138 button_ =
39 tray_container()->AddChildView(std::make_unique<views::MdTextButton>(
40 base::BindRepeating(&LogoutButtonTray::ButtonPressed,
41 base::Unretained(this)),
Jan Wilken Dörrie85285b02021-03-11 23:38:4742 std::u16string(), CONTEXT_LAUNCHER_BUTTON));
minch72c46102020-11-16 21:48:4143 button_->SetProminent(true);
bartfab@chromium.orgc80357d2013-08-14 11:54:4244}
45
46LogoutButtonTray::~LogoutButtonTray() {
Sam McNallyf4dab612017-08-16 03:06:3347 Shell::Get()->session_controller()->RemoveObserver(this);
James Cookdc041122017-08-01 14:03:2248}
49
50// static
51void LogoutButtonTray::RegisterProfilePrefs(PrefRegistrySimple* registry) {
James Cook277f6432019-10-18 22:39:3352 registry->RegisterBooleanPref(prefs::kShowLogoutButtonInTray, false);
53 registry->RegisterIntegerPref(prefs::kLogoutDialogDurationMs, 20000);
bartfab@chromium.orgc80357d2013-08-14 11:54:4254}
55
Manu Cornet26988c52020-02-27 21:40:1656void LogoutButtonTray::UpdateLayout() {
Tim Song23378f32019-11-21 06:07:0757 // We must first update the button so that its container can lay it out
mohsene6704a02017-04-20 06:30:2058 // correctly.
59 UpdateButtonTextAndImage();
Manu Cornet26988c52020-02-27 21:40:1660 tray_container()->UpdateLayout();
Tim Song23378f32019-11-21 06:07:0761}
62
63void LogoutButtonTray::UpdateBackground() {
64 // The logout button does not have a background.
bartfab@chromium.orgc80357d2013-08-14 11:54:4265}
66
James Cookdc041122017-08-01 14:03:2267void LogoutButtonTray::OnActiveUserPrefServiceChanged(PrefService* prefs) {
68 pref_change_registrar_.reset();
Mitsuru Oshima04b54d02017-10-09 14:22:4569 pref_change_registrar_ = std::make_unique<PrefChangeRegistrar>();
James Cookdc041122017-08-01 14:03:2270 pref_change_registrar_->Init(prefs);
71 pref_change_registrar_->Add(
72 prefs::kShowLogoutButtonInTray,
Qiang Xudadd3ad62018-03-07 17:22:4573 base::BindRepeating(&LogoutButtonTray::UpdateShowLogoutButtonInTray,
74 base::Unretained(this)));
James Cookdc041122017-08-01 14:03:2275 pref_change_registrar_->Add(
76 prefs::kLogoutDialogDurationMs,
Qiang Xudadd3ad62018-03-07 17:22:4577 base::BindRepeating(&LogoutButtonTray::UpdateLogoutDialogDuration,
78 base::Unretained(this)));
James Cookdc041122017-08-01 14:03:2279
80 // Read the initial values.
81 UpdateShowLogoutButtonInTray();
82 UpdateLogoutDialogDuration();
83}
84
Andrew Lee9b38f102019-05-20 23:21:2985const char* LogoutButtonTray::GetClassName() const {
86 return "LogoutButtonTray";
87}
88
minch72c46102020-11-16 21:48:4189void LogoutButtonTray::OnThemeChanged() {
90 TrayBackgroundView::OnThemeChanged();
91 button_->SetBgColorOverride(AshColorProvider::Get()->GetControlsLayerColor(
92 AshColorProvider::ControlsLayerType::kControlBackgroundColorAlert));
93}
94
James Cookdc041122017-08-01 14:03:2295void LogoutButtonTray::UpdateShowLogoutButtonInTray() {
96 show_logout_button_in_tray_ = pref_change_registrar_->prefs()->GetBoolean(
97 prefs::kShowLogoutButtonInTray);
bruthiga80489912016-10-27 23:20:4898 UpdateVisibility();
99}
100
James Cookdc041122017-08-01 14:03:22101void LogoutButtonTray::UpdateLogoutDialogDuration() {
102 const int duration_ms = pref_change_registrar_->prefs()->GetInteger(
103 prefs::kLogoutDialogDurationMs);
104 dialog_duration_ = base::TimeDelta::FromMilliseconds(duration_ms);
bruthiga80489912016-10-27 23:20:48105}
106
Manu Cornet3e74a3c2020-02-24 22:43:17107void LogoutButtonTray::UpdateAfterLoginStatusChange() {
mohsene6704a02017-04-20 06:30:20108 UpdateButtonTextAndImage();
bartfab@chromium.orgc80357d2013-08-14 11:54:42109}
110
Tim Song23378f32019-11-21 06:07:07111void LogoutButtonTray::ClickedOutsideBubble() {}
112
113void LogoutButtonTray::HideBubbleWithView(const TrayBubbleView* bubble_view) {}
114
Jan Wilken Dörrie85285b02021-03-11 23:38:47115std::u16string LogoutButtonTray::GetAccessibleNameForTray() {
Tim Song23378f32019-11-21 06:07:07116 return button_->GetText();
117}
118
Toni Barzice4627b852020-06-04 02:22:49119void LogoutButtonTray::HandleLocaleChange() {
120 UpdateButtonTextAndImage();
121}
122
yilkal4ae1c6152019-06-28 21:37:53123void LogoutButtonTray::UpdateVisibility() {
Tim Song23378f32019-11-21 06:07:07124 LoginStatus login_status = shelf()->GetStatusAreaWidget()->login_status();
125 SetVisiblePreferred(show_logout_button_in_tray_ &&
126 login_status != LoginStatus::NOT_LOGGED_IN &&
127 login_status != LoginStatus::LOCKED);
yilkal4ae1c6152019-06-28 21:37:53128}
129
mohsene6704a02017-04-20 06:30:20130void LogoutButtonTray::UpdateButtonTextAndImage() {
Tim Song23378f32019-11-21 06:07:07131 LoginStatus login_status = shelf()->GetStatusAreaWidget()->login_status();
Jan Wilken Dörrie85285b02021-03-11 23:38:47132 const std::u16string title =
estade71ec8bb2016-08-09 00:00:47133 user::GetLocalizedSignOutStringForStatus(login_status, false);
Tim Song23378f32019-11-21 06:07:07134 if (shelf()->IsHorizontalAlignment()) {
estade71ec8bb2016-08-09 00:00:47135 button_->SetText(title);
mohsene6704a02017-04-20 06:30:20136 button_->SetImage(views::Button::STATE_NORMAL, gfx::ImageSkia());
estade3cc64b832017-02-08 02:29:42137 button_->SetMinSize(gfx::Size(0, kTrayItemSize));
estade71ec8bb2016-08-09 00:00:47138 } else {
Jan Wilken Dörrie85285b02021-03-11 23:38:47139 button_->SetText(std::u16string());
estade71ec8bb2016-08-09 00:00:47140 button_->SetAccessibleName(title);
Xiaoqian Daif1252082020-06-16 23:13:36141 button_->SetImage(
142 views::Button::STATE_NORMAL,
143 gfx::CreateVectorIcon(
144 kShelfLogoutIcon,
145 AshColorProvider::Get()->GetContentLayerColor(
minch5847c6f2020-09-08 01:13:17146 AshColorProvider::ContentLayerType::kIconColorPrimary)));
estade3cc64b832017-02-08 02:29:42147 button_->SetMinSize(gfx::Size(kTrayItemSize, kTrayItemSize));
estade71ec8bb2016-08-09 00:00:47148 }
149 UpdateVisibility();
150}
151
Peter Kasting256b9472020-10-31 03:50:53152void LogoutButtonTray::ButtonPressed() {
153 if (dialog_duration_ <= base::TimeDelta()) {
154 if (Shell::Get()->session_controller()->IsDemoSession())
155 base::RecordAction(base::UserMetricsAction("DemoMode.ExitFromShelf"));
156 // Sign out immediately if |dialog_duration_| is non-positive.
157 Shell::Get()->session_controller()->RequestSignOut();
158 } else if (Shell::Get()->logout_confirmation_controller()) {
159 Shell::Get()->logout_confirmation_controller()->ConfirmLogout(
160 base::TimeTicks::Now() + dialog_duration_,
161 LogoutConfirmationController::Source::kShelfExitButton);
162 }
163}
164
bartfab@chromium.orgc80357d2013-08-14 11:54:42165} // namespace ash