Index: chrome/browser/ui/ash/session_state_delegate_chromeos.cc |
diff --git a/chrome/browser/ui/ash/session_state_delegate_chromeos.cc b/chrome/browser/ui/ash/session_state_delegate_chromeos.cc |
index 2341781f58215f13df01b9658a63e56a04f33597..c71f5c5c005669c434fc230e9dd3965184ccac59 100644 |
--- a/chrome/browser/ui/ash/session_state_delegate_chromeos.cc |
+++ b/chrome/browser/ui/ash/session_state_delegate_chromeos.cc |
@@ -9,6 +9,7 @@ |
#include "base/command_line.h" |
#include "base/logging.h" |
#include "base/prefs/pref_service.h" |
+#include "chrome/browser/chrome_notification_types.h" |
#include "chrome/browser/chromeos/login/screen_locker.h" |
#include "chrome/browser/chromeos/login/user.h" |
#include "chrome/browser/chromeos/login/user_adding_screen.h" |
@@ -20,13 +21,31 @@ |
#include "chromeos/chromeos_switches.h" |
#include "chromeos/dbus/dbus_thread_manager.h" |
#include "chromeos/dbus/session_manager_client.h" |
+#include "chromeos/login/login_state.h" |
+#include "content/public/browser/notification_details.h" |
+#include "content/public/browser/notification_service.h" |
+#include "content/public/browser/notification_source.h" |
#include "google_apis/gaia/gaia_auth_util.h" |
-SessionStateDelegateChromeos::SessionStateDelegateChromeos() { |
+SessionStateDelegateChromeos::SessionStateDelegateChromeos() |
+ : session_state_(STATE_UNKNOWN) { |
Daniel Erat
2014/04/10 16:30:32
it'd be better to have a separate "initialized" me
Nikita (slow)
2014/04/10 17:22:51
Done.
|
+ chromeos::LoginState::Get()->AddObserver(this); |
+ chromeos::DBusThreadManager::Get()-> |
+ GetSessionManagerClient()->AddObserver(this); |
chromeos::UserManager::Get()->AddSessionStateObserver(this); |
+ chromeos::UserAddingScreen::Get()->AddObserver(this); |
+ notification_registrar_.Add(this, |
+ chrome::NOTIFICATION_SCREEN_LOCK_STATE_CHANGED, |
+ content::NotificationService::AllSources()); |
+ LoggedInStateChanged(); |
} |
SessionStateDelegateChromeos::~SessionStateDelegateChromeos() { |
+ chromeos::LoginState::Get()->RemoveObserver(this); |
+ chromeos::DBusThreadManager::Get()-> |
+ GetSessionManagerClient()->RemoveObserver(this); |
+ chromeos::UserManager::Get()->RemoveSessionStateObserver(this); |
+ chromeos::UserAddingScreen::Get()->RemoveObserver(this); |
} |
content::BrowserContext* SessionStateDelegateChromeos::GetBrowserContextByIndex( |
@@ -111,6 +130,11 @@ bool SessionStateDelegateChromeos::IsUserSessionBlocked() const { |
chromeos::UserAddingScreen::Get()->IsRunning(); |
} |
+ash::SessionStateDelegate::SessionState |
+SessionStateDelegateChromeos::GetSessionState() const { |
+ return session_state_; |
+} |
+ |
const base::string16 SessionStateDelegateChromeos::GetUserDisplayName( |
ash::MultiProfileIndex index) const { |
DCHECK_LT(index, NumberOfLoggedInUsers()); |
@@ -208,8 +232,24 @@ void SessionStateDelegateChromeos::RemoveSessionStateObserver( |
session_state_observer_list_.RemoveObserver(observer); |
} |
+void SessionStateDelegateChromeos::LoggedInStateChanged() { |
+ if (chromeos::LoginState::Get()->IsUserLoggedIn()) |
+ SetSessionState(STATE_SESSION); |
Daniel Erat
2014/04/10 16:30:32
nit:
SetSessionState(chromeos::LoginState::Get(
Nikita (slow)
2014/04/10 17:22:51
Done.
|
+ else |
+ SetSessionState(STATE_LOGIN_PRIMARY); |
+} |
+ |
+void SessionStateDelegateChromeos::ScreenIsLocked() { |
+ SetSessionState(STATE_LOCK); |
+} |
+ |
+void SessionStateDelegateChromeos::ScreenIsUnlocked() { |
+ SetSessionState(STATE_SESSION); |
+} |
+ |
void SessionStateDelegateChromeos::ActiveUserChanged( |
const chromeos::User* active_user) { |
+ SetSessionState(STATE_SESSION); |
Daniel Erat
2014/04/10 16:30:32
why is this necessary? shouldn't LoggedInStateChan
Nikita (slow)
2014/04/10 17:22:51
Done.
Nikita (slow)
2014/04/10 17:22:51
Done.
|
FOR_EACH_OBSERVER(ash::SessionStateObserver, |
session_state_observer_list_, |
ActiveUserChanged(active_user->email())); |
@@ -217,7 +257,47 @@ void SessionStateDelegateChromeos::ActiveUserChanged( |
void SessionStateDelegateChromeos::UserAddedToSession( |
const chromeos::User* added_user) { |
+ SetSessionState(STATE_SESSION); |
Daniel Erat
2014/04/10 16:30:32
why is this necessary? shouldn't OnUserAddingFinis
Nikita (slow)
2014/04/10 17:22:51
Done.
|
FOR_EACH_OBSERVER(ash::SessionStateObserver, |
session_state_observer_list_, |
UserAddedToSession(added_user->email())); |
} |
+ |
+void SessionStateDelegateChromeos::OnUserAddingStarted() { |
+ SetSessionState(STATE_LOGIN_SECONDARY); |
+} |
+ |
+void SessionStateDelegateChromeos::OnUserAddingFinished() { |
+ SetSessionState(STATE_SESSION); |
+} |
+ |
+void SessionStateDelegateChromeos::Observe( |
+ int type, |
+ const content::NotificationSource& source, |
+ const content::NotificationDetails& details) { |
+ switch (type) { |
+ case chrome::NOTIFICATION_SCREEN_LOCK_STATE_CHANGED: { |
Daniel Erat
2014/04/10 16:30:32
this seems ugly. do we really need to watch for bo
Nikita (slow)
2014/04/10 17:22:51
Turns out ScreenLockerTest only creates ScreenLock
|
+ bool locked = *content::Details<bool>(details).ptr(); |
+ SetSessionState(locked ? STATE_LOCK : STATE_SESSION); |
+ break; |
+ } |
+ default: { |
+ NOTREACHED() << "Unknown notification type"; |
+ break; |
+ } |
+ } |
+} |
+ |
+void SessionStateDelegateChromeos::SetSessionState(SessionState new_state) { |
+ if (session_state_ == new_state) |
+ return; |
+ |
+ session_state_ = new_state; |
+ NotifySessionStateChanged(); |
+} |
+ |
+void SessionStateDelegateChromeos::NotifySessionStateChanged() { |
+ FOR_EACH_OBSERVER(ash::SessionStateObserver, |
+ session_state_observer_list_, |
+ SessionStateChanged(session_state_)); |
+} |