Home | History | Annotate | Download | only in notifications
      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 
     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::
     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 
     45 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 
     62 void LoginStateNotificationBlockerChromeOS::OnLockStateChanged(bool locked) {
     63   locked_ = locked;
     64   NotifyBlockingStateChanged();
     65 }
     66 
     67 void LoginStateNotificationBlockerChromeOS::OnAppTerminating() {
     68   ash::Shell::GetInstance()->RemoveShellObserver(this);
     69   chromeos::UserAddingScreen::Get()->RemoveObserver(this);
     70   observing_ = false;
     71 }
     72 
     73 void LoginStateNotificationBlockerChromeOS::LoggedInStateChanged() {
     74   NotifyBlockingStateChanged();
     75 }
     76 
     77 void LoginStateNotificationBlockerChromeOS::OnUserAddingStarted() {
     78   NotifyBlockingStateChanged();
     79 }
     80 
     81 void LoginStateNotificationBlockerChromeOS::OnUserAddingFinished() {
     82   NotifyBlockingStateChanged();
     83 }
     84