Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(397)

Side by Side Diff: ash/system/user/tray_user.cc

Issue 2125373002: mash: Migrate ash/system/user to ash/common. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Sync and rebase. Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "ash/system/user/tray_user.h"
6
7 #include "ash/common/ash_switches.h"
8 #include "ash/common/session/session_state_delegate.h"
9 #include "ash/common/shelf/wm_shelf_util.h"
10 #include "ash/common/system/tray/system_tray_delegate.h"
11 #include "ash/common/system/tray/system_tray_notifier.h"
12 #include "ash/common/system/tray/tray_constants.h"
13 #include "ash/common/system/tray/tray_item_view.h"
14 #include "ash/common/system/tray/tray_utils.h"
15 #include "ash/common/system/user/rounded_image_view.h"
16 #include "ash/common/wm_shell.h"
17 #include "ash/system/tray/system_tray.h"
18 #include "ash/system/user/user_view.h"
19 #include "base/logging.h"
20 #include "base/strings/string16.h"
21 #include "components/signin/core/account_id/account_id.h"
22 #include "components/user_manager/user_info.h"
23 #include "grit/ash_strings.h"
24 #include "ui/base/l10n/l10n_util.h"
25 #include "ui/gfx/image/image.h"
26 #include "ui/views/border.h"
27 #include "ui/views/controls/label.h"
28 #include "ui/views/layout/box_layout.h"
29 #include "ui/views/view.h"
30 #include "ui/views/widget/widget.h"
31
32 namespace {
33
34 const int kUserLabelToIconPadding = 5;
35
36 } // namespace
37
38 namespace ash {
39
40 TrayUser::TrayUser(SystemTray* system_tray, UserIndex index)
41 : SystemTrayItem(system_tray),
42 user_index_(index),
43 user_(nullptr),
44 layout_view_(nullptr),
45 avatar_(nullptr),
46 label_(nullptr) {
47 WmShell::Get()->system_tray_notifier()->AddUserObserver(this);
48 }
49
50 TrayUser::~TrayUser() {
51 WmShell::Get()->system_tray_notifier()->RemoveUserObserver(this);
52 }
53
54 TrayUser::TestState TrayUser::GetStateForTest() const {
55 if (!user_)
56 return HIDDEN;
57 return user_->GetStateForTest();
58 }
59
60 gfx::Size TrayUser::GetLayoutSizeForTest() const {
61 if (!layout_view_) {
62 return gfx::Size(0, 0);
63 } else {
64 return layout_view_->size();
65 }
66 }
67
68 gfx::Rect TrayUser::GetUserPanelBoundsInScreenForTest() const {
69 DCHECK(user_);
70 return user_->GetBoundsInScreenOfUserButtonForTest();
71 }
72
73 void TrayUser::UpdateAfterLoginStatusChangeForTest(LoginStatus status) {
74 UpdateAfterLoginStatusChange(status);
75 }
76
77 views::View* TrayUser::CreateTrayView(LoginStatus status) {
78 CHECK(layout_view_ == nullptr);
79
80 layout_view_ = new views::View;
81 layout_view_->SetLayoutManager(new views::BoxLayout(
82 views::BoxLayout::kHorizontal, 0, 0, kUserLabelToIconPadding));
83 UpdateAfterLoginStatusChange(status);
84 return layout_view_;
85 }
86
87 views::View* TrayUser::CreateDefaultView(LoginStatus status) {
88 if (status == LoginStatus::NOT_LOGGED_IN)
89 return nullptr;
90 const SessionStateDelegate* session_state_delegate =
91 WmShell::Get()->GetSessionStateDelegate();
92
93 // If the screen is locked or a system modal dialog box is shown, show only
94 // the currently active user.
95 if (user_index_ && (session_state_delegate->IsUserSessionBlocked() ||
96 WmShell::Get()->IsSystemModalWindowOpen()))
97 return nullptr;
98
99 CHECK(user_ == nullptr);
100
101 int logged_in_users = session_state_delegate->NumberOfLoggedInUsers();
102
103 // Do not show more UserView's then there are logged in users.
104 if (user_index_ >= logged_in_users)
105 return nullptr;
106
107 user_ = new tray::UserView(this, status, user_index_);
108 return user_;
109 }
110
111 void TrayUser::DestroyTrayView() {
112 layout_view_ = nullptr;
113 avatar_ = nullptr;
114 label_ = nullptr;
115 }
116
117 void TrayUser::DestroyDefaultView() {
118 user_ = nullptr;
119 }
120
121 void TrayUser::UpdateAfterLoginStatusChange(LoginStatus status) {
122 // Only the active user is represented in the tray.
123 if (!layout_view_)
124 return;
125 if (user_index_ > 0)
126 return;
127 bool need_label = false;
128 bool need_avatar = false;
129 SystemTrayDelegate* delegate = WmShell::Get()->system_tray_delegate();
130 if (delegate->IsUserSupervised())
131 need_label = true;
132 switch (status) {
133 case LoginStatus::LOCKED:
134 case LoginStatus::USER:
135 case LoginStatus::OWNER:
136 case LoginStatus::PUBLIC:
137 need_avatar = true;
138 break;
139 case LoginStatus::SUPERVISED:
140 need_avatar = true;
141 need_label = true;
142 break;
143 case LoginStatus::GUEST:
144 need_label = true;
145 break;
146 case LoginStatus::KIOSK_APP:
147 case LoginStatus::NOT_LOGGED_IN:
148 break;
149 }
150
151 if ((need_avatar != (avatar_ != nullptr)) ||
152 (need_label != (label_ != nullptr))) {
153 layout_view_->RemoveAllChildViews(true);
154 if (need_label) {
155 label_ = new views::Label;
156 SetupLabelForTray(label_);
157 layout_view_->AddChildView(label_);
158 } else {
159 label_ = nullptr;
160 }
161 if (need_avatar) {
162 avatar_ = new tray::RoundedImageView(kTrayRoundedBorderRadius, true);
163 layout_view_->AddChildView(avatar_);
164 } else {
165 avatar_ = nullptr;
166 }
167 }
168
169 if (delegate->IsUserSupervised()) {
170 label_->SetText(
171 l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_SUPERVISED_LABEL));
172 } else if (status == LoginStatus::GUEST) {
173 label_->SetText(l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_GUEST_LABEL));
174 }
175
176 if (avatar_) {
177 avatar_->SetCornerRadii(0, kTrayRoundedBorderRadius,
178 kTrayRoundedBorderRadius, 0);
179 avatar_->SetBorder(views::Border::NullBorder());
180 }
181 UpdateAvatarImage(status);
182
183 // Update layout after setting label_ and avatar_ with new login status.
184 UpdateLayoutOfItem();
185 }
186
187 void TrayUser::UpdateAfterShelfAlignmentChange(ShelfAlignment alignment) {
188 // Inactive users won't have a layout.
189 if (!layout_view_)
190 return;
191 if (IsHorizontalAlignment(alignment)) {
192 if (avatar_) {
193 avatar_->SetBorder(views::Border::NullBorder());
194 avatar_->SetCornerRadii(0, kTrayRoundedBorderRadius,
195 kTrayRoundedBorderRadius, 0);
196 }
197 if (label_) {
198 // If label_ hasn't figured out its size yet, do that first.
199 if (label_->GetContentsBounds().height() == 0)
200 label_->SizeToPreferredSize();
201 int height = label_->GetContentsBounds().height();
202 int vertical_pad = (kTrayItemSize - height) / 2;
203 int remainder = height % 2;
204 label_->SetBorder(views::Border::CreateEmptyBorder(
205 vertical_pad + remainder,
206 kTrayLabelItemHorizontalPaddingBottomAlignment, vertical_pad,
207 kTrayLabelItemHorizontalPaddingBottomAlignment));
208 }
209 layout_view_->SetLayoutManager(new views::BoxLayout(
210 views::BoxLayout::kHorizontal, 0, 0, kUserLabelToIconPadding));
211 } else {
212 if (avatar_) {
213 avatar_->SetBorder(views::Border::NullBorder());
214 avatar_->SetCornerRadii(0, 0, kTrayRoundedBorderRadius,
215 kTrayRoundedBorderRadius);
216 }
217 if (label_) {
218 label_->SetBorder(views::Border::CreateEmptyBorder(
219 kTrayLabelItemVerticalPaddingVerticalAlignment,
220 kTrayLabelItemHorizontalPaddingBottomAlignment,
221 kTrayLabelItemVerticalPaddingVerticalAlignment,
222 kTrayLabelItemHorizontalPaddingBottomAlignment));
223 }
224 layout_view_->SetLayoutManager(new views::BoxLayout(
225 views::BoxLayout::kVertical, 0, 0, kUserLabelToIconPadding));
226 }
227 }
228
229 void TrayUser::OnUserUpdate() {
230 UpdateAvatarImage(
231 WmShell::Get()->system_tray_delegate()->GetUserLoginStatus());
232 }
233
234 void TrayUser::OnUserAddedToSession() {
235 SessionStateDelegate* session_state_delegate =
236 WmShell::Get()->GetSessionStateDelegate();
237 // Only create views for user items which are logged in.
238 if (user_index_ >= session_state_delegate->NumberOfLoggedInUsers())
239 return;
240
241 // Enforce a layout change that newly added items become visible.
242 UpdateLayoutOfItem();
243
244 // Update the user item.
245 UpdateAvatarImage(
246 WmShell::Get()->system_tray_delegate()->GetUserLoginStatus());
247 }
248
249 void TrayUser::UpdateAvatarImage(LoginStatus status) {
250 SessionStateDelegate* session_state_delegate =
251 WmShell::Get()->GetSessionStateDelegate();
252 if (!avatar_ ||
253 user_index_ >= session_state_delegate->NumberOfLoggedInUsers())
254 return;
255
256 const user_manager::UserInfo* user_info =
257 session_state_delegate->GetUserInfo(user_index_);
258 CHECK(user_info);
259 avatar_->SetImage(user_info->GetImage(),
260 gfx::Size(kTrayItemSize, kTrayItemSize));
261
262 // Unit tests might come here with no images for some users.
263 if (avatar_->size().IsEmpty())
264 avatar_->SetSize(gfx::Size(kTrayItemSize, kTrayItemSize));
265 }
266
267 void TrayUser::UpdateLayoutOfItem() {
268 UpdateAfterShelfAlignmentChange(system_tray()->shelf_alignment());
269 }
270
271 } // namespace ash
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698