Index: chrome/browser/chromeos/login/screens/user_selection_screen.cc |
diff --git a/chrome/browser/chromeos/login/screens/user_selection_screen.cc b/chrome/browser/chromeos/login/screens/user_selection_screen.cc |
index 76709cb9bc466bc4d74103adaaeb1f7f04246556..78a296e97b73fb6104c009fe8c1e343e09693f3b 100644 |
--- a/chrome/browser/chromeos/login/screens/user_selection_screen.cc |
+++ b/chrome/browser/chromeos/login/screens/user_selection_screen.cc |
@@ -42,6 +42,9 @@ const char kKeyInitialAuthType[] = "initialAuthType"; |
const char kKeyMultiProfilesAllowed[] = "isMultiProfilesAllowed"; |
const char kKeyMultiProfilesPolicy[] = "multiProfilesPolicy"; |
const char kKeyInitialLocales[] = "initialLocales"; |
+const char kKeyInitialLocale[] = "initialLocale"; |
+const char kKeyInitialMultipleRecommendedLocales[] = |
+ "initialMultipleRecommendedLocales"; |
const char kKeyInitialKeyboardLayout[] = "initialKeyboardLayout"; |
// Max number of users to show. |
@@ -50,6 +53,51 @@ const size_t kMaxUsers = 18; |
const int kPasswordClearTimeoutSec = 60; |
+void AddPublicSessionDetailsToUserDictionaryEntry( |
+ base::DictionaryValue* user_dict, |
+ const std::vector<std::string>* public_session_recommended_locales) { |
+ policy::BrowserPolicyConnectorChromeOS* policy_connector = |
+ g_browser_process->platform_part()->browser_policy_connector_chromeos(); |
+ |
+ if (policy_connector->IsEnterpriseManaged()) { |
+ user_dict->SetString(kKeyEnterpriseDomain, |
+ policy_connector->GetEnterpriseDomain()); |
+ } |
+ |
+ std::vector<std::string> kEmptyRecommendedLocales; |
+ const std::vector<std::string>* recommended_locales = |
+ public_session_recommended_locales ? |
+ public_session_recommended_locales : &kEmptyRecommendedLocales; |
+ |
+ // Set |kKeyInitialLocales| to the list of available locales. This list |
+ // consists of the recommended locales, followed by all others. |
+ user_dict->Set( |
+ kKeyInitialLocales, |
+ GetUILanguageList(recommended_locales, std::string()).release()); |
+ |
+ // Set |kKeyInitialLocale| to the initially selected locale. If the list of |
+ // recommended locales is not empty, select its first entry. Otherwise, |
+ // select the current UI locale. |
+ user_dict->SetString(kKeyInitialLocale, |
+ recommended_locales->empty() ? |
+ g_browser_process->GetApplicationLocale() : |
+ recommended_locales->front()); |
+ |
+ // Set |kKeyInitialMultipleRecommendedLocales| to indicate whether the list |
+ // of recommended locales contains at least two entries. This is used to |
+ // decide whether the public session pod expands to its basic form (for zero |
+ // or one recommended locales) or the advanced form (two or more recommended |
+ // locales). |
+ user_dict->SetBoolean(kKeyInitialMultipleRecommendedLocales, |
+ recommended_locales->size() >= 2); |
+ |
+ // Set |kKeyInitialKeyboardLayout| to the current keyboard layout. This |
+ // value will be used temporarily only because the UI immediately requests a |
+ // list of keyboard layouts suitable for the currently selected locale. |
+ user_dict->Set(kKeyInitialKeyboardLayout, |
+ GetCurrentKeyboardLayout().release()); |
+} |
+ |
} // namespace |
UserSelectionScreen::UserSelectionScreen() : handler_(NULL) { |
@@ -68,9 +116,10 @@ void UserSelectionScreen::FillUserDictionary( |
bool is_owner, |
bool is_signin_to_add, |
ScreenlockBridge::LockHandler::AuthType auth_type, |
+ const std::vector<std::string>* public_session_recommended_locales, |
base::DictionaryValue* user_dict) { |
const std::string& user_id = user->email(); |
- const bool is_public_account = |
+ const bool is_public_session = |
user->GetType() == user_manager::USER_TYPE_PUBLIC_ACCOUNT; |
const bool is_supervised_user = |
user->GetType() == user_manager::USER_TYPE_SUPERVISED; |
@@ -78,7 +127,7 @@ void UserSelectionScreen::FillUserDictionary( |
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(kKeyPublicAccount, is_public_session); |
user_dict->SetBoolean(kKeySupervisedUser, is_supervised_user); |
user_dict->SetInteger(kKeyInitialAuthType, auth_type); |
user_dict->SetBoolean(kKeySignedIn, user->is_logged_in()); |
@@ -106,24 +155,10 @@ void UserSelectionScreen::FillUserDictionary( |
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()); |
- } |
- |
- // TODO(bartfab): Initialize |most_relevant_languages| and |locale| based on |
- // policy. |
- const std::string locale = g_browser_process->GetApplicationLocale(); |
- std::vector<std::string> most_relevant_languages; |
- user_dict->Set( |
- kKeyInitialLocales, |
- GetUILanguageList(&most_relevant_languages, locale).release()); |
- user_dict->Set(kKeyInitialKeyboardLayout, |
- GetCurrentKeyboardLayout().release()); |
+ if (is_public_session) { |
+ AddPublicSessionDetailsToUserDictionaryEntry( |
+ user_dict, |
+ public_session_recommended_locales); |
} |
} |
@@ -277,6 +312,7 @@ void UserSelectionScreen::SendUserList() { |
user_auth_type_map_.clear(); |
+ const std::vector<std::string> kEmptyRecommendedLocales; |
for (user_manager::UserList::const_iterator it = users_to_send.begin(); |
it != users_to_send.end(); |
++it) { |
@@ -293,8 +329,17 @@ void UserSelectionScreen::SendUserList() { |
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); |
+ const std::vector<std::string>* public_session_recommended_locales = |
+ public_session_recommended_locales_.find(user_id) == |
+ public_session_recommended_locales_.end() ? |
+ &kEmptyRecommendedLocales : |
+ &public_session_recommended_locales_[user_id]; |
+ FillUserDictionary(*it, |
+ is_owner, |
+ is_signin_to_add, |
+ initial_auth_type, |
+ public_session_recommended_locales, |
+ 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. |