Index: trunk/src/chrome/browser/chromeos/login/screens/user_selection_screen.cc |
=================================================================== |
--- trunk/src/chrome/browser/chromeos/login/screens/user_selection_screen.cc (revision 275549) |
+++ trunk/src/chrome/browser/chromeos/login/screens/user_selection_screen.cc (working copy) |
@@ -4,144 +4,24 @@ |
#include "chrome/browser/chromeos/login/screens/user_selection_screen.h" |
-#include "ash/shell.h" |
#include "base/logging.h" |
-#include "base/prefs/pref_service.h" |
-#include "chrome/browser/browser_process.h" |
-#include "chrome/browser/chromeos/login/ui/login_display_host_impl.h" |
-#include "chrome/browser/chromeos/login/users/multi_profile_user_controller.h" |
-#include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h" |
-#include "chrome/browser/signin/screenlock_bridge.h" |
+#include "chrome/browser/chromeos/login/screens/screen_observer.h" |
#include "chrome/browser/ui/webui/chromeos/login/signin_screen_handler.h" |
-#include "chrome/common/pref_names.h" |
-#include "ui/wm/core/user_activity_detector.h" |
namespace chromeos { |
-namespace { |
- |
-// User dictionary keys. |
-const char kKeyUsername[] = "username"; |
-const char kKeyDisplayName[] = "displayName"; |
-const char kKeyEmailAddress[] = "emailAddress"; |
-const char kKeyEnterpriseDomain[] = "enterpriseDomain"; |
-const char kKeyPublicAccount[] = "publicAccount"; |
-const char kKeyLocallyManagedUser[] = "locallyManagedUser"; |
-const char kKeySignedIn[] = "signedIn"; |
-const char kKeyCanRemove[] = "canRemove"; |
-const char kKeyIsOwner[] = "isOwner"; |
-const char kKeyInitialAuthType[] = "initialAuthType"; |
-const char kKeyMultiProfilesAllowed[] = "isMultiProfilesAllowed"; |
-const char kKeyMultiProfilesPolicy[] = "multiProfilesPolicy"; |
- |
-// Max number of users to show. |
-const size_t kMaxUsers = 18; |
- |
-const int kPasswordClearTimeoutSec = 60; |
- |
-} // namespace |
- |
UserSelectionScreen::UserSelectionScreen() : handler_(NULL) { |
} |
UserSelectionScreen::~UserSelectionScreen() { |
- wm::UserActivityDetector* activity_detector = |
- ash::Shell::GetInstance()->user_activity_detector(); |
- if (activity_detector->HasObserver(this)) |
- activity_detector->RemoveObserver(this); |
} |
-// static |
-void UserSelectionScreen::FillUserDictionary( |
- User* user, |
- bool is_owner, |
- bool is_signin_to_add, |
- ScreenlockBridge::LockHandler::AuthType auth_type, |
- base::DictionaryValue* user_dict) { |
- const std::string& user_id = user->email(); |
- const bool is_public_account = |
- user->GetType() == User::USER_TYPE_PUBLIC_ACCOUNT; |
- const bool is_locally_managed_user = |
- user->GetType() == User::USER_TYPE_LOCALLY_MANAGED; |
- |
- user_dict->SetString(kKeyUsername, user_id); |
- user_dict->SetString(kKeyEmailAddress, user->display_email()); |
- user_dict->SetString(kKeyDisplayName, user->GetDisplayName()); |
- user_dict->SetBoolean(kKeyPublicAccount, is_public_account); |
- user_dict->SetBoolean(kKeyLocallyManagedUser, is_locally_managed_user); |
- user_dict->SetInteger(kKeyInitialAuthType, auth_type); |
- user_dict->SetBoolean(kKeySignedIn, user->is_logged_in()); |
- user_dict->SetBoolean(kKeyIsOwner, is_owner); |
- |
- // Fill in multi-profiles related fields. |
- if (is_signin_to_add) { |
- MultiProfileUserController* multi_profile_user_controller = |
- UserManager::Get()->GetMultiProfileUserController(); |
- std::string behavior = |
- multi_profile_user_controller->GetCachedValue(user_id); |
- user_dict->SetBoolean(kKeyMultiProfilesAllowed, |
- multi_profile_user_controller->IsUserAllowedInSession( |
- user_id) == MultiProfileUserController::ALLOWED); |
- user_dict->SetString(kKeyMultiProfilesPolicy, behavior); |
- } else { |
- user_dict->SetBoolean(kKeyMultiProfilesAllowed, true); |
- } |
- |
- if (is_public_account) { |
- policy::BrowserPolicyConnectorChromeOS* policy_connector = |
- g_browser_process->platform_part()->browser_policy_connector_chromeos(); |
- |
- if (policy_connector->IsEnterpriseManaged()) { |
- user_dict->SetString(kKeyEnterpriseDomain, |
- policy_connector->GetEnterpriseDomain()); |
- } |
- } |
-} |
- |
-// static |
-bool UserSelectionScreen::ShouldForceOnlineSignIn(const User* user) { |
- // Public sessions are always allowed to log in offline. |
- // Supervised user are allowed to log in offline if their OAuth token status |
- // is unknown or valid. |
- // For all other users, force online sign in if: |
- // * The flag to force online sign-in is set for the user. |
- // * The user's OAuth token is invalid. |
- // * The user's OAuth token status is unknown (except supervised users, |
- // see above). |
- if (user->is_logged_in()) |
- return false; |
- |
- const User::OAuthTokenStatus token_status = user->oauth_token_status(); |
- const bool is_locally_managed_user = |
- user->GetType() == User::USER_TYPE_LOCALLY_MANAGED; |
- const bool is_public_session = |
- user->GetType() == User::USER_TYPE_PUBLIC_ACCOUNT; |
- |
- if (is_locally_managed_user && |
- token_status == User::OAUTH_TOKEN_STATUS_UNKNOWN) { |
- return false; |
- } |
- |
- if (is_public_session) |
- return false; |
- |
- return user->force_online_signin() || |
- (token_status == User::OAUTH2_TOKEN_STATUS_INVALID) || |
- (token_status == User::OAUTH_TOKEN_STATUS_UNKNOWN); |
-} |
- |
void UserSelectionScreen::SetHandler(LoginDisplayWebUIHandler* handler) { |
handler_ = handler; |
} |
-void UserSelectionScreen::Init(const UserList& users, bool show_guest) { |
+void UserSelectionScreen::Init(const UserList& users) { |
users_ = users; |
- show_guest_ = show_guest; |
- |
- wm::UserActivityDetector* activity_detector = |
- ash::Shell::GetInstance()->user_activity_detector(); |
- if (!activity_detector->HasObserver(this)) |
- activity_detector->AddObserver(this); |
} |
void UserSelectionScreen::OnBeforeUserRemoved(const std::string& username) { |
@@ -171,102 +51,4 @@ |
return users_; |
} |
-void UserSelectionScreen::OnPasswordClearTimerExpired() { |
- if (handler_) |
- handler_->ClearUserPodPassword(); |
-} |
- |
-void UserSelectionScreen::OnUserActivity(const ui::Event* event) { |
- if (!password_clear_timer_.IsRunning()) { |
- password_clear_timer_.Start( |
- FROM_HERE, |
- base::TimeDelta::FromSeconds(kPasswordClearTimeoutSec), |
- this, |
- &UserSelectionScreen::OnPasswordClearTimerExpired); |
- } |
- password_clear_timer_.Reset(); |
-} |
- |
-void UserSelectionScreen::SendUserList(bool animated) { |
- base::ListValue users_list; |
- const UserList& users = GetUsers(); |
- |
- // TODO(nkostylev): Move to a separate method in UserManager. |
- // http://crbug.com/230852 |
- bool is_signin_to_add = LoginDisplayHostImpl::default_host() && |
- UserManager::Get()->IsUserLoggedIn(); |
- |
- user_auth_type_map_.clear(); |
- |
- bool single_user = users.size() == 1; |
- std::string owner; |
- chromeos::CrosSettings::Get()->GetString(chromeos::kDeviceOwner, &owner); |
- bool has_owner = owner.size() > 0; |
- size_t max_non_owner_users = has_owner ? kMaxUsers - 1 : kMaxUsers; |
- size_t non_owner_count = 0; |
- |
- policy::BrowserPolicyConnectorChromeOS* connector = |
- g_browser_process->platform_part()->browser_policy_connector_chromeos(); |
- |
- bool is_enterprise_managed = connector->IsEnterpriseManaged(); |
- |
- for (UserList::const_iterator it = users.begin(); it != users.end(); ++it) { |
- const std::string& user_id = (*it)->email(); |
- bool is_owner = (user_id == owner); |
- bool is_public_account = |
- ((*it)->GetType() == User::USER_TYPE_PUBLIC_ACCOUNT); |
- |
- if ((is_public_account && !is_signin_to_add) || is_owner || |
- (!is_public_account && non_owner_count < max_non_owner_users)) { |
- ScreenlockBridge::LockHandler::AuthType initial_auth_type = |
- ShouldForceOnlineSignIn(*it) |
- ? ScreenlockBridge::LockHandler::ONLINE_SIGN_IN |
- : ScreenlockBridge::LockHandler::OFFLINE_PASSWORD; |
- user_auth_type_map_[user_id] = initial_auth_type; |
- |
- base::DictionaryValue* user_dict = new base::DictionaryValue(); |
- FillUserDictionary( |
- *it, is_owner, is_signin_to_add, initial_auth_type, user_dict); |
- bool signed_in = (*it)->is_logged_in(); |
- // Single user check here is necessary because owner info might not be |
- // available when running into login screen on first boot. |
- // See http://crosbug.com/12723 |
- bool can_remove_user = |
- ((!single_user || is_enterprise_managed) && !user_id.empty() && |
- !is_owner && !is_public_account && !signed_in && !is_signin_to_add); |
- user_dict->SetBoolean(kKeyCanRemove, can_remove_user); |
- |
- if (!is_owner) |
- ++non_owner_count; |
- if (is_owner && users_list.GetSize() > kMaxUsers) { |
- // Owner is always in the list. |
- users_list.Insert(kMaxUsers - 1, user_dict); |
- while (users_list.GetSize() > kMaxUsers) |
- users_list.Remove(kMaxUsers, NULL); |
- } else if (users_list.GetSize() < kMaxUsers) { |
- users_list.Append(user_dict); |
- } |
- } |
- } |
- |
- handler_->LoadUsers(users_list, animated, show_guest_); |
-} |
- |
-void UserSelectionScreen::HandleGetUsers() { |
- SendUserList(false); |
-} |
- |
-void UserSelectionScreen::SetAuthType( |
- const std::string& username, |
- ScreenlockBridge::LockHandler::AuthType auth_type) { |
- user_auth_type_map_[username] = auth_type; |
-} |
- |
-ScreenlockBridge::LockHandler::AuthType UserSelectionScreen::GetAuthType( |
- const std::string& username) const { |
- if (user_auth_type_map_.find(username) == user_auth_type_map_.end()) |
- return ScreenlockBridge::LockHandler::OFFLINE_PASSWORD; |
- return user_auth_type_map_.find(username)->second; |
-} |
- |
} // namespace chromeos |