15f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// found in the LICENSE file.
4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
55f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "ash/system/chromeos/supervised/tray_supervised_user.h"
6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
71e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "ash/shell.h"
8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ash/system/chromeos/label_tray_view.h"
9424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "ash/system/system_notifier.h"
105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "ash/system/tray/system_tray_delegate.h"
11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ash/system/tray/system_tray_notifier.h"
1290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "ash/system/tray/tray_notification_view.h"
13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ash/system/user/login_status.h"
14a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "base/callback.h"
15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/logging.h"
16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "grit/ash_resources.h"
173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "ui/base/resource/resource_bundle.h"
18ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "ui/message_center/message_center.h"
19ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "ui/message_center/notification.h"
20ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "ui/message_center/notification_delegate.h"
21ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
22ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochusing message_center::Notification;
23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace ash {
2590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)const char TraySupervisedUser::kNotificationId[] =
27ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    "chrome://user/locally-managed";
28ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TraySupervisedUser::TraySupervisedUser(SystemTray* system_tray)
30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : SystemTrayItem(system_tray),
3190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      tray_view_(NULL),
321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      status_(ash::user::LOGGED_IN_NONE),
331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      is_user_supervised_(false) {
34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TraySupervisedUser::~TraySupervisedUser() {
37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void TraySupervisedUser::UpdateMessage() {
40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 message = Shell::GetInstance()->system_tray_delegate()->
415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      GetSupervisedUserMessage();
42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (tray_view_)
43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    tray_view_->SetMessage(message);
44f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (message_center::MessageCenter::Get()->FindVisibleNotificationById(
45f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      kNotificationId))
46ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    CreateOrUpdateNotification(message);
47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)views::View* TraySupervisedUser::CreateDefaultView(
50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    user::LoginStatus status) {
51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CHECK(tray_view_ == NULL);
521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SystemTrayDelegate* delegate = Shell::GetInstance()->system_tray_delegate();
531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!delegate->IsUserSupervised())
54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return NULL;
55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  tray_view_ = new LabelTrayView(this, IDR_AURA_UBER_TRAY_SUPERVISED_USER);
57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  UpdateMessage();
58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return tray_view_;
59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void TraySupervisedUser::DestroyDefaultView() {
62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  tray_view_ = NULL;
63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void TraySupervisedUser::OnViewClicked(views::View* sender) {
665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  Shell::GetInstance()->system_tray_delegate()->ShowSupervisedUserInfo();
67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void TraySupervisedUser::UpdateAfterLoginStatusChange(
7090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    user::LoginStatus status) {
711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SystemTrayDelegate* delegate = Shell::GetInstance()->system_tray_delegate();
721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bool is_user_supervised = delegate->IsUserSupervised();
741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (status == status_ && is_user_supervised == is_user_supervised_)
75eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return;
761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (is_user_supervised &&
78eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      status_ != ash::user::LOGGED_IN_LOCKED) {
795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    CreateOrUpdateNotification(delegate->GetSupervisedUserMessage());
80eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
81eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  status_ = status;
821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  is_user_supervised_ = is_user_supervised;
8390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
8490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void TraySupervisedUser::CreateOrUpdateNotification(
863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    const base::string16& new_message) {
873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance();
88a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  scoped_ptr<Notification> notification(
89a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      message_center::Notification::CreateSystemNotification(
90a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)          kNotificationId,
915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          base::string16() /* no title */,
92a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)          new_message,
935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          bundle.GetImageNamed(IDR_AURA_UBER_TRAY_SUPERVISED_USER),
945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          system_notifier::kNotifierSupervisedUser,
95a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)          base::Closure() /* null callback */));
963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  message_center::MessageCenter::Get()->AddNotification(notification.Pass());
973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
99c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}  // namespace ash
100