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
3 // found in the LICENSE file.
5 #include "ash/system/chromeos/supervised/tray_supervised_user.h"
8 #include "ash/system/chromeos/label_tray_view.h"
9 #include "ash/system/system_notifier.h"
10 #include "ash/system/tray/system_tray_delegate.h"
11 #include "ash/system/tray/system_tray_notifier.h"
12 #include "ash/system/tray/tray_notification_view.h"
13 #include "ash/system/user/login_status.h"
14 #include "base/callback.h"
15 #include "base/logging.h"
16 #include "grit/ash_resources.h"
17 #include "ui/base/resource/resource_bundle.h"
18 #include "ui/message_center/message_center.h"
19 #include "ui/message_center/notification.h"
20 #include "ui/message_center/notification_delegate.h"
22 using message_center::Notification
;
26 const char TraySupervisedUser::kNotificationId
[] =
27 "chrome://user/locally-managed";
29 TraySupervisedUser::TraySupervisedUser(SystemTray
* system_tray
)
30 : SystemTrayItem(system_tray
),
32 status_(ash::user::LOGGED_IN_NONE
),
33 is_user_supervised_(false) {
34 Shell::GetInstance()->system_tray_delegate()->
35 AddCustodianInfoTrayObserver(this);
38 TraySupervisedUser::~TraySupervisedUser() {
39 // We need the check as on shell destruction delegate is destroyed first.
40 SystemTrayDelegate
* system_tray_delegate
=
41 Shell::GetInstance()->system_tray_delegate();
42 if (system_tray_delegate
)
43 system_tray_delegate
->RemoveCustodianInfoTrayObserver(this);
46 void TraySupervisedUser::UpdateMessage() {
47 base::string16 message
= Shell::GetInstance()->system_tray_delegate()->
48 GetSupervisedUserMessage();
50 tray_view_
->SetMessage(message
);
51 if (message_center::MessageCenter::Get()->FindVisibleNotificationById(
53 CreateOrUpdateNotification(message
);
56 views::View
* TraySupervisedUser::CreateDefaultView(
57 user::LoginStatus status
) {
58 CHECK(tray_view_
== NULL
);
59 SystemTrayDelegate
* delegate
= Shell::GetInstance()->system_tray_delegate();
60 if (!delegate
->IsUserSupervised())
63 tray_view_
= new LabelTrayView(this, GetSupervisedUserIconId());
68 void TraySupervisedUser::DestroyDefaultView() {
72 void TraySupervisedUser::OnViewClicked(views::View
* sender
) {
73 Shell::GetInstance()->system_tray_delegate()->ShowSupervisedUserInfo();
76 void TraySupervisedUser::UpdateAfterLoginStatusChange(
77 user::LoginStatus status
) {
78 SystemTrayDelegate
* delegate
= Shell::GetInstance()->system_tray_delegate();
80 bool is_user_supervised
= delegate
->IsUserSupervised();
81 if (status
== status_
&& is_user_supervised
== is_user_supervised_
)
84 if (is_user_supervised
&&
85 !delegate
->IsUserChild() &&
86 status_
!= ash::user::LOGGED_IN_LOCKED
&&
87 !delegate
->GetSupervisedUserManager().empty())
88 CreateOrUpdateSupervisedWarningNotification();
91 is_user_supervised_
= is_user_supervised
;
94 void TraySupervisedUser::CreateOrUpdateNotification(
95 const base::string16
& new_message
) {
96 ui::ResourceBundle
& bundle
= ui::ResourceBundle::GetSharedInstance();
97 scoped_ptr
<Notification
> notification(
98 message_center::Notification::CreateSystemNotification(
99 kNotificationId
, base::string16() /* no title */, new_message
,
100 bundle
.GetImageNamed(GetSupervisedUserIconId()),
101 system_notifier::kNotifierSupervisedUser
,
102 base::Closure() /* null callback */));
103 message_center::MessageCenter::Get()->AddNotification(notification
.Pass());
106 void TraySupervisedUser::CreateOrUpdateSupervisedWarningNotification() {
107 SystemTrayDelegate
* delegate
= Shell::GetInstance()->system_tray_delegate();
108 CreateOrUpdateNotification(delegate
->GetSupervisedUserMessage());
111 void TraySupervisedUser::OnCustodianInfoChanged() {
112 SystemTrayDelegate
* delegate
= Shell::GetInstance()->system_tray_delegate();
113 std::string manager_name
= delegate
->GetSupervisedUserManager();
114 if (!manager_name
.empty()) {
115 if (!delegate
->IsUserChild() &&
116 !message_center::MessageCenter::Get()->FindVisibleNotificationById(
118 CreateOrUpdateSupervisedWarningNotification();
124 int TraySupervisedUser::GetSupervisedUserIconId() const {
125 SystemTrayDelegate
* delegate
= Shell::GetInstance()->system_tray_delegate();
127 // Not intended to be used for non-supervised users.
128 CHECK(delegate
->IsUserSupervised());
130 if (delegate
->IsUserChild())
131 return IDR_AURA_UBER_TRAY_CHILD_USER
;
132 return IDR_AURA_UBER_TRAY_SUPERVISED_USER
;