• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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.
4 
5 #include "ash/system/chromeos/supervised/tray_supervised_user.h"
6 
7 #include "ash/shell.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"
21 
22 using message_center::Notification;
23 
24 namespace ash {
25 
26 const char TraySupervisedUser::kNotificationId[] =
27     "chrome://user/locally-managed";
28 
TraySupervisedUser(SystemTray * system_tray)29 TraySupervisedUser::TraySupervisedUser(SystemTray* system_tray)
30     : SystemTrayItem(system_tray),
31       tray_view_(NULL),
32       status_(ash::user::LOGGED_IN_NONE),
33       is_user_supervised_(false) {
34 }
35 
~TraySupervisedUser()36 TraySupervisedUser::~TraySupervisedUser() {
37 }
38 
UpdateMessage()39 void TraySupervisedUser::UpdateMessage() {
40   base::string16 message = Shell::GetInstance()->system_tray_delegate()->
41       GetSupervisedUserMessage();
42   if (tray_view_)
43     tray_view_->SetMessage(message);
44   if (message_center::MessageCenter::Get()->FindVisibleNotificationById(
45       kNotificationId))
46     CreateOrUpdateNotification(message);
47 }
48 
CreateDefaultView(user::LoginStatus status)49 views::View* TraySupervisedUser::CreateDefaultView(
50     user::LoginStatus status) {
51   CHECK(tray_view_ == NULL);
52   SystemTrayDelegate* delegate = Shell::GetInstance()->system_tray_delegate();
53   if (!delegate->IsUserSupervised())
54     return NULL;
55 
56   tray_view_ = new LabelTrayView(this, IDR_AURA_UBER_TRAY_SUPERVISED_USER);
57   UpdateMessage();
58   return tray_view_;
59 }
60 
DestroyDefaultView()61 void TraySupervisedUser::DestroyDefaultView() {
62   tray_view_ = NULL;
63 }
64 
OnViewClicked(views::View * sender)65 void TraySupervisedUser::OnViewClicked(views::View* sender) {
66   Shell::GetInstance()->system_tray_delegate()->ShowSupervisedUserInfo();
67 }
68 
UpdateAfterLoginStatusChange(user::LoginStatus status)69 void TraySupervisedUser::UpdateAfterLoginStatusChange(
70     user::LoginStatus status) {
71   SystemTrayDelegate* delegate = Shell::GetInstance()->system_tray_delegate();
72 
73   bool is_user_supervised = delegate->IsUserSupervised();
74   if (status == status_ && is_user_supervised == is_user_supervised_)
75     return;
76 
77   if (is_user_supervised &&
78       status_ != ash::user::LOGGED_IN_LOCKED) {
79     CreateOrUpdateNotification(delegate->GetSupervisedUserMessage());
80   }
81   status_ = status;
82   is_user_supervised_ = is_user_supervised;
83 }
84 
CreateOrUpdateNotification(const base::string16 & new_message)85 void TraySupervisedUser::CreateOrUpdateNotification(
86     const base::string16& new_message) {
87   ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance();
88   scoped_ptr<Notification> notification(
89       message_center::Notification::CreateSystemNotification(
90           kNotificationId,
91           base::string16() /* no title */,
92           new_message,
93           bundle.GetImageNamed(IDR_AURA_UBER_TRAY_SUPERVISED_USER),
94           system_notifier::kNotifierSupervisedUser,
95           base::Closure() /* null callback */));
96   message_center::MessageCenter::Get()->AddNotification(notification.Pass());
97 }
98 
99 }  // namespace ash
100