Index: chrome/browser/signin/easy_unlock_service_signin_chromeos.cc |
diff --git a/chrome/browser/signin/easy_unlock_service_signin_chromeos.cc b/chrome/browser/signin/easy_unlock_service_signin_chromeos.cc |
index f4f45811a6c3dd51a98244387f4cf4ff1aaf9e2f..1afaf157575ee1ccea1638f61e1db278b018e493 100644 |
--- a/chrome/browser/signin/easy_unlock_service_signin_chromeos.cc |
+++ b/chrome/browser/signin/easy_unlock_service_signin_chromeos.cc |
@@ -6,7 +6,6 @@ |
#include "base/basictypes.h" |
#include "base/bind.h" |
-#include "base/command_line.h" |
#include "base/location.h" |
#include "base/logging.h" |
#include "base/stl_util.h" |
@@ -14,7 +13,6 @@ |
#include "base/time/time.h" |
#include "chrome/browser/chromeos/login/easy_unlock/easy_unlock_key_manager.h" |
#include "chrome/browser/chromeos/login/session/user_session_manager.h" |
-#include "chromeos/chromeos_switches.h" |
#include "chromeos/login/auth/user_context.h" |
namespace { |
@@ -93,11 +91,11 @@ EasyUnlockServiceSignin::UserData::~UserData() {} |
EasyUnlockServiceSignin::EasyUnlockServiceSignin(Profile* profile) |
: EasyUnlockService(profile), |
allow_cryptohome_backoff_(true), |
+ service_active_(false), |
weak_ptr_factory_(this) { |
} |
EasyUnlockServiceSignin::~EasyUnlockServiceSignin() { |
- STLDeleteContainerPairSecondPointers(user_data_.begin(), user_data_.end()); |
} |
EasyUnlockService::Type EasyUnlockServiceSignin::GetType() const { |
@@ -164,19 +162,72 @@ std::string EasyUnlockServiceSignin::GetChallenge() const { |
} |
void EasyUnlockServiceSignin::InitializeInternal() { |
+ if (chromeos::LoginState::Get()->IsUserLoggedIn()) |
+ return; |
+ |
+ service_active_ = true; |
+ |
+ chromeos::LoginState::Get()->AddObserver(this); |
+ ScreenlockBridge* screenlock_bridge = ScreenlockBridge::Get(); |
+ screenlock_bridge->AddObserver(this); |
+ if (!screenlock_bridge->focused_user_id().empty()) |
+ OnFocusedUserChanged(screenlock_bridge->focused_user_id()); |
+} |
+ |
+void EasyUnlockServiceSignin::ShutdownInternal() { |
+ if (!service_active_) |
+ return; |
+ service_active_ = false; |
+ |
+ weak_ptr_factory_.InvalidateWeakPtrs(); |
+ ScreenlockBridge::Get()->RemoveObserver(this); |
+ chromeos::LoginState::Get()->RemoveObserver(this); |
+ STLDeleteContainerPairSecondPointers(user_data_.begin(), user_data_.end()); |
+ user_data_.clear(); |
} |
bool EasyUnlockServiceSignin::IsAllowedInternal() { |
- return !user_id_.empty() && |
- FindLoadedDataForCurrentUser() && |
- CommandLine::ForCurrentProcess()->HasSwitch( |
- chromeos::switches::kEnableEasySignin); |
+ return service_active_ && |
+ !user_id_.empty() && |
+ !chromeos::LoginState::Get()->IsUserLoggedIn(); |
+} |
+ |
+void EasyUnlockServiceSignin::OnScreenDidLock() { |
+} |
+ |
+void EasyUnlockServiceSignin::OnScreenDidUnlock() { |
+} |
+ |
+void EasyUnlockServiceSignin::OnFocusedUserChanged(const std::string& user_id) { |
+ if (user_id_ == user_id) |
+ return; |
+ |
+ // Setting or clearing the user_id may changed |IsAllowed| value, so in these |
+ // cases update the app state. Otherwise, it's enough to notify the app the |
+ // user data has been updated. |
+ bool should_update_app_state = user_id_.empty() != user_id.empty(); |
+ user_id_ = user_id; |
+ |
+ ResetScreenlockStateHandler(); |
+ |
+ if (should_update_app_state) { |
+ UpdateAppState(); |
+ } else { |
+ NotifyUserUpdated(); |
+ } |
+ |
+ LoadCurrentUserDataIfNeeded(); |
+} |
+ |
+void EasyUnlockServiceSignin::LoggedInStateChanged() { |
+ if (!chromeos::LoginState::Get()->IsUserLoggedIn()) |
+ return; |
+ UnloadApp(); |
+ Shutdown(); |
} |
void EasyUnlockServiceSignin::LoadCurrentUserDataIfNeeded() { |
- if (user_id_.empty() || |
- !CommandLine::ForCurrentProcess()->HasSwitch( |
- chromeos::switches::kEnableEasySignin)) |
+ if (user_id_.empty() || !service_active_) |
return; |
std::map<std::string, UserData*>::iterator it = user_data_.find(user_id_); |
@@ -210,12 +261,18 @@ void EasyUnlockServiceSignin::OnUserDataLoaded( |
chromeos::EasyUnlockKeyManager::DeviceDataListToRemoteDeviceList( |
user_id, devices, &data->remote_devices_value); |
} |
+ |
+ // If the fetched data belongs to the currently focused user, notify the app |
+ // that it has to refresh it's user data. |
+ if (user_id == user_id_) |
+ NotifyUserUpdated(); |
} |
const EasyUnlockServiceSignin::UserData* |
EasyUnlockServiceSignin::FindLoadedDataForCurrentUser() const { |
if (user_id_.empty()) |
return NULL; |
+ |
std::map<std::string, UserData*>::const_iterator it = |
user_data_.find(user_id_); |
if (it == user_data_.end()) |