• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2013 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 "chrome/browser/notifications/login_state_notification_blocker_chromeos.h"
6 
7 #include "ash/root_window_controller.h"
8 #include "ash/shell.h"
9 #include "ash/system/system_notifier.h"
10 #include "ash/wm/window_properties.h"
11 #include "chrome/browser/chrome_notification_types.h"
12 #include "content/public/browser/notification_service.h"
13 #include "ui/aura/window.h"
14 #include "ui/aura/window_event_dispatcher.h"
15 #include "ui/message_center/message_center.h"
16 
LoginStateNotificationBlockerChromeOS(message_center::MessageCenter * message_center)17 LoginStateNotificationBlockerChromeOS::LoginStateNotificationBlockerChromeOS(
18     message_center::MessageCenter* message_center)
19     : NotificationBlocker(message_center),
20       locked_(false),
21       observing_(true) {
22   // This class is created in the ctor of NotificationUIManager which is created
23   // when a notification is created, so ash::Shell should be initialized.
24   ash::Shell::GetInstance()->AddShellObserver(this);
25 
26   // LoginState may not exist in some tests.
27   if (chromeos::LoginState::IsInitialized())
28     chromeos::LoginState::Get()->AddObserver(this);
29   chromeos::UserAddingScreen::Get()->AddObserver(this);
30 }
31 
32 LoginStateNotificationBlockerChromeOS::
~LoginStateNotificationBlockerChromeOS()33     ~LoginStateNotificationBlockerChromeOS() {
34   // In some tests, the notification blockers may be removed without calling
35   // OnAppTerminating().
36   if (chromeos::LoginState::IsInitialized())
37     chromeos::LoginState::Get()->RemoveObserver(this);
38   if (observing_) {
39     if (ash::Shell::HasInstance())
40       ash::Shell::GetInstance()->RemoveShellObserver(this);
41     chromeos::UserAddingScreen::Get()->RemoveObserver(this);
42   }
43 }
44 
ShouldShowNotificationAsPopup(const message_center::NotifierId & notifier_id) const45 bool LoginStateNotificationBlockerChromeOS::ShouldShowNotificationAsPopup(
46     const message_center::NotifierId& notifier_id) const {
47   if (ash::system_notifier::ShouldAlwaysShowPopups(notifier_id))
48     return true;
49 
50   if (locked_)
51     return false;
52 
53   if (chromeos::UserAddingScreen::Get()->IsRunning())
54     return false;
55 
56   if (chromeos::LoginState::IsInitialized())
57     return chromeos::LoginState::Get()->IsUserLoggedIn();
58 
59   return true;
60 }
61 
OnLockStateChanged(bool locked)62 void LoginStateNotificationBlockerChromeOS::OnLockStateChanged(bool locked) {
63   locked_ = locked;
64   NotifyBlockingStateChanged();
65 }
66 
OnAppTerminating()67 void LoginStateNotificationBlockerChromeOS::OnAppTerminating() {
68   ash::Shell::GetInstance()->RemoveShellObserver(this);
69   chromeos::UserAddingScreen::Get()->RemoveObserver(this);
70   observing_ = false;
71 }
72 
LoggedInStateChanged()73 void LoginStateNotificationBlockerChromeOS::LoggedInStateChanged() {
74   NotifyBlockingStateChanged();
75 }
76 
OnUserAddingStarted()77 void LoginStateNotificationBlockerChromeOS::OnUserAddingStarted() {
78   NotifyBlockingStateChanged();
79 }
80 
OnUserAddingFinished()81 void LoginStateNotificationBlockerChromeOS::OnUserAddingFinished() {
82   NotifyBlockingStateChanged();
83 }
84