Commit 1d2aa0f1 authored by Sarah Hu's avatar Sarah Hu Committed by Commit Bot

Populate public session info in chrome.

1. Create mojo struct for the public session info.
2. Connect LoginDisplayViews with UserSelectionScreen and populate the
information in UserSelectionScreen then send it via LoadUsers mojo call.
3. Remove unused user data: initialKeyboardLayout and gaiaId



Bug: 732452
Change-Id: Id67b1b29f0f7fad853ad475557099af38a239fce
Reviewed-on: https://chromium-review.googlesource.com/907973Reviewed-by: default avatarTom Sepez <tsepez@chromium.org>
Reviewed-by: default avatarAchuith Bhandarkar <achuith@chromium.org>
Reviewed-by: default avatarXiyuan Xia <xiyuan@chromium.org>
Reviewed-by: default avatarJacob Dufault <jdufault@chromium.org>
Commit-Queue: Xiaoyin Hu <xiaoyinh@chromium.org>
Cr-Commit-Position: refs/heads/master@{#535908}
parent 3c6103ec
......@@ -1036,6 +1036,7 @@ component("ash") {
"//ash/wayland",
"//mash/public/interfaces",
"//mojo/common:common_base",
"//mojo/common:values_struct_traits",
"//services/ui/common:mus_common",
"//services/ui/public/cpp",
"//services/ui/public/cpp/input_devices",
......
......@@ -27,6 +27,7 @@
#include "ash/system/tray/system_tray_notifier.h"
#include "base/strings/string16.h"
#include "base/strings/utf_string_conversions.h"
#include "mojo/common/values_struct_traits.h"
#include "ui/accessibility/ax_node_data.h"
#include "ui/base/l10n/l10n_util.h"
#include "ui/display/display.h"
......
......@@ -16,6 +16,7 @@
#include "ash/login/ui/non_accessible_view.h"
#include "ash/shell.h"
#include "base/strings/utf_string_conversions.h"
#include "mojo/common/values_struct_traits.h"
#include "ui/base/ime/chromeos/ime_keyboard.h"
#include "ui/base/ime/chromeos/input_method_manager.h"
#include "ui/views/controls/button/md_text_button.h"
......
......@@ -20,6 +20,7 @@
#include "ash/system/user/rounded_image_view.h"
#include "base/memory/weak_ptr.h"
#include "base/strings/utf_string_conversions.h"
#include "mojo/common/values_struct_traits.h"
#include "ui/base/l10n/l10n_util.h"
#include "ui/compositor/layer_animation_sequence.h"
#include "ui/compositor/layer_animator.h"
......
......@@ -6,6 +6,7 @@ module ash.mojom;
import "ash/public/interfaces/user_info.mojom";
import "components/proximity_auth/public/interfaces/auth_type.mojom";
import "mojo/common/values.mojom";
import "mojo/public/mojom/base/string16.mojom";
// Supported multi-profile user behavior values.
......@@ -66,6 +67,23 @@ struct EasyUnlockIconOptions {
bool is_trial_run;
};
// Infomation about a public account user.
struct PublicAccountInfo {
// Optional, the domain name displayed in the login screen UI.
string? enterprise_domain;
// A list of available user locales.
mojo.common.mojom.ListValue available_locales;
// Default locale for this user.
string default_locale;
// Show the advanced expanded user view if there are at least two recommended
// locales. This will be the case in multilingual environments where users
// are likely to want to choose among locales.
bool show_advanced_view;
};
// Info about a user in login/lock screen.
struct LoginUserInfo {
// User's basic information including account id, email, avatar etc.
......@@ -91,4 +109,8 @@ struct LoginUserInfo {
// True if this user can be removed.
bool can_remove;
// Optional, contains the public account information if user type is
// PUBLIC_ACCOUNT.
PublicAccountInfo? public_account_info;
};
......@@ -56,7 +56,6 @@ namespace {
// User dictionary keys.
const char kKeyUsername[] = "username";
const char kKeyGaiaID[] = "gaiaId";
const char kKeyDisplayName[] = "displayName";
const char kKeyEmailAddress[] = "emailAddress";
const char kKeyEnterpriseDisplayDomain[] = "enterpriseDisplayDomain";
......@@ -75,7 +74,6 @@ const char kKeyInitialLocales[] = "initialLocales";
const char kKeyInitialLocale[] = "initialLocale";
const char kKeyInitialMultipleRecommendedLocales[] =
"initialMultipleRecommendedLocales";
const char kKeyInitialKeyboardLayout[] = "initialKeyboardLayout";
const char kKeyAllowFingerprint[] = "allowFingerprint";
// Max number of users to show.
......@@ -84,17 +82,29 @@ const size_t kMaxUsers = 18;
const int kPasswordClearTimeoutSec = 60;
void AddPublicSessionDetailsToUserDictionaryEntry(
base::DictionaryValue* user_dict,
const std::vector<std::string>* public_session_recommended_locales) {
// Returns true if we have enterprise domain information.
// |out_domain|: Output value of the enterprise domain.
bool GetEnterpriseDomain(std::string* out_domain) {
policy::BrowserPolicyConnectorChromeOS* policy_connector =
g_browser_process->platform_part()->browser_policy_connector_chromeos();
if (policy_connector->IsCloudManaged()) {
user_dict->SetString(kKeyEnterpriseDisplayDomain,
policy_connector->GetEnterpriseDisplayDomain());
*out_domain = policy_connector->GetEnterpriseDisplayDomain();
return true;
}
return false;
}
// Get locales information of public account user.
// Returns a list of available locales.
// |public_session_recommended_locales|: This can be nullptr if we don't have
// recommanded locales.
// |out_selected_locale|: Output value of the initially selected locale.
// |out_multiple_locales|: Output value indicates whether we have multiple
// recommended locales.
std::unique_ptr<base::ListValue> GetPublicSessionLocales(
const std::vector<std::string>* public_session_recommended_locales,
std::string* out_selected_locale,
bool* out_multiple_locales) {
std::vector<std::string> kEmptyRecommendedLocales;
const std::vector<std::string>& recommended_locales =
public_session_recommended_locales ? *public_session_recommended_locales
......@@ -107,10 +117,27 @@ void AddPublicSessionDetailsToUserDictionaryEntry(
// Select the the first recommended locale that is actually available or the
// current UI locale if none of them are available.
const std::string selected_locale =
*out_selected_locale =
FindMostRelevantLocale(recommended_locales, *available_locales.get(),
g_browser_process->GetApplicationLocale());
*out_multiple_locales = recommended_locales.size() >= 2;
return available_locales;
}
void AddPublicSessionDetailsToUserDictionaryEntry(
base::DictionaryValue* user_dict,
const std::vector<std::string>* public_session_recommended_locales) {
std::string domain;
if (GetEnterpriseDomain(&domain))
user_dict->SetString(kKeyEnterpriseDisplayDomain, domain);
std::string selected_locale;
bool has_multiple_locales;
std::unique_ptr<base::ListValue> available_locales =
GetPublicSessionLocales(public_session_recommended_locales,
&selected_locale, &has_multiple_locales);
// Set |kKeyInitialLocales| to the list of available locales.
user_dict->Set(kKeyInitialLocales, std::move(available_locales));
......@@ -123,12 +150,7 @@ void AddPublicSessionDetailsToUserDictionaryEntry(
// 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());
has_multiple_locales);
}
// Returns true if the fingerprint icon should be displayed for the given
......@@ -365,7 +387,6 @@ void UserSelectionScreen::FillUserDictionary(
user_dict->SetBoolean(kKeyAllowFingerprint, AllowFingerprintForUser(user));
FillMultiProfileUserPrefs(user, user_dict, is_signin_to_add);
FillKnownUserPrefs(user, user_dict);
if (is_public_session) {
AddPublicSessionDetailsToUserDictionaryEntry(
......@@ -373,15 +394,6 @@ void UserSelectionScreen::FillUserDictionary(
}
}
// static
void UserSelectionScreen::FillKnownUserPrefs(user_manager::User* user,
base::DictionaryValue* user_dict) {
std::string gaia_id;
if (user_manager::known_user::FindGaiaID(user->GetAccountId(), &gaia_id)) {
user_dict->SetString(kKeyGaiaID, gaia_id);
}
}
// static
void UserSelectionScreen::FillMultiProfileUserPrefs(
user_manager::User* user,
......@@ -446,6 +458,7 @@ void UserSelectionScreen::FillUserMojoStruct(
bool is_owner,
bool is_signin_to_add,
proximity_auth::mojom::AuthType auth_type,
const std::vector<std::string>* public_session_recommended_locales,
ash::mojom::LoginUserInfo* user_info) {
user_info->basic_user_info = ash::mojom::UserInfo::New();
user_info->basic_user_info->type = user->GetType();
......@@ -495,6 +508,24 @@ void UserSelectionScreen::FillUserMojoStruct(
GetMultiProfilePolicy(user, &user_info->is_multiprofile_allowed,
&user_info->multiprofile_policy);
}
// Fill public session data.
if (user->GetType() == user_manager::USER_TYPE_PUBLIC_ACCOUNT) {
user_info->public_account_info = ash::mojom::PublicAccountInfo::New();
std::string domain;
if (GetEnterpriseDomain(&domain))
user_info->public_account_info->enterprise_domain = domain;
std::string selected_locale;
bool has_multiple_locales;
std::unique_ptr<base::ListValue> available_locales =
GetPublicSessionLocales(public_session_recommended_locales,
&selected_locale, &has_multiple_locales);
user_info->public_account_info->available_locales =
std::move(available_locales);
user_info->public_account_info->default_locale = selected_locale;
user_info->public_account_info->show_advanced_view = has_multiple_locales;
}
}
void UserSelectionScreen::SetHandler(LoginDisplayWebUIHandler* handler) {
......@@ -758,7 +789,6 @@ UserSelectionScreen::UpdateAndReturnUserListForWebUI() {
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) {
const AccountId& account_id = (*it)->GetAccountId();
......@@ -777,7 +807,7 @@ UserSelectionScreen::UpdateAndReturnUserListForWebUI() {
const std::vector<std::string>* public_session_recommended_locales =
public_session_recommended_locales_.find(account_id) ==
public_session_recommended_locales_.end()
? &kEmptyRecommendedLocales
? nullptr
: &public_session_recommended_locales_[account_id];
FillUserDictionary(*it, is_owner, is_signin_to_add, initial_auth_type,
public_session_recommended_locales, user_dict.get());
......@@ -815,7 +845,13 @@ UserSelectionScreen::UpdateAndReturnUserListForMojo() {
ash::mojom::LoginUserInfoPtr login_user_info =
ash::mojom::LoginUserInfo::New();
const std::vector<std::string>* public_session_recommended_locales =
public_session_recommended_locales_.find(account_id) ==
public_session_recommended_locales_.end()
? nullptr
: &public_session_recommended_locales_[account_id];
FillUserMojoStruct(*it, is_owner, is_signin_to_add, initial_auth_type,
public_session_recommended_locales,
login_user_info.get());
login_user_info->can_remove = CanRemoveUser(single_user, *it);
user_info_list.push_back(std::move(login_user_info));
......
......@@ -105,10 +105,6 @@ class UserSelectionScreen
const std::vector<std::string>* public_session_recommended_locales,
base::DictionaryValue* user_dict);
// Fills |user_dict| with |user| known preferences.
static void FillKnownUserPrefs(user_manager::User* user,
base::DictionaryValue* user_dict);
// Fills |user_dict| with |user| multi-profile related preferences.
static void FillMultiProfileUserPrefs(user_manager::User* user,
base::DictionaryValue* user_dict,
......@@ -121,11 +117,13 @@ class UserSelectionScreen
// TODO: Public sesssions exist in login screen, but not lock screen.
// We will need public session locales in the future when we change login
// screen to view-based as well. See crbug.com/732452.
static void FillUserMojoStruct(const user_manager::User* user,
bool is_owner,
bool is_signin_to_add,
proximity_auth::mojom::AuthType auth_type,
ash::mojom::LoginUserInfo* user_info);
static void FillUserMojoStruct(
const user_manager::User* user,
bool is_owner,
bool is_signin_to_add,
proximity_auth::mojom::AuthType auth_type,
const std::vector<std::string>* public_session_recommended_locales,
ash::mojom::LoginUserInfo* user_info);
std::unique_ptr<base::ListValue> UpdateAndReturnUserListForWebUI();
std::vector<ash::mojom::LoginUserInfoPtr> UpdateAndReturnUserListForMojo();
......
......@@ -4,8 +4,10 @@
#include "chrome/browser/chromeos/login/ui/login_display_views.h"
#include "chrome/browser/chromeos/login/screens/chrome_user_selection_screen.h"
#include "chrome/browser/chromeos/login/screens/user_selection_screen.h"
#include "chrome/browser/chromeos/login/ui/login_display_host_views.h"
#include "chrome/browser/chromeos/login/user_selection_screen_proxy.h"
#include "chrome/browser/chromeos/settings/cros_settings.h"
#include "chrome/browser/ui/ash/login_screen_client.h"
#include "components/user_manager/known_user.h"
......@@ -13,23 +15,19 @@
namespace chromeos {
namespace {
// TODO(jdufault): Deduplicate this and
// user_selection_screen::GetOwnerAccountId().
AccountId GetOwnerAccountId() {
std::string owner_email;
chromeos::CrosSettings::Get()->GetString(chromeos::kDeviceOwner,
&owner_email);
const AccountId owner = user_manager::known_user::GetAccountId(
owner_email, std::string() /*id*/, AccountType::UNKNOWN);
return owner;
}
constexpr char kLoginDisplay[] = "login";
} // namespace
LoginDisplayViews::LoginDisplayViews(Delegate* delegate,
LoginDisplayHostViews* host)
: LoginDisplay(delegate), host_(host) {}
: LoginDisplay(delegate),
host_(host),
user_selection_screen_proxy_(
std::make_unique<UserSelectionScreenProxy>()),
user_selection_screen_(
std::make_unique<ChromeUserSelectionScreen>(kLoginDisplay)) {
user_selection_screen_->SetView(user_selection_screen_proxy_.get());
}
LoginDisplayViews::~LoginDisplayViews() = default;
......@@ -41,36 +39,15 @@ void LoginDisplayViews::Init(const user_manager::UserList& filtered_users,
bool show_new_user) {
host_->SetUsers(filtered_users);
// Convert |filtered_users| to mojo structures.
const AccountId owner_account = GetOwnerAccountId();
std::vector<ash::mojom::LoginUserInfoPtr> users;
for (user_manager::User* user : filtered_users) {
auto mojo_user = ash::mojom::LoginUserInfo::New();
const bool is_owner = user->GetAccountId() == owner_account;
const bool is_public_account =
user->GetType() == user_manager::USER_TYPE_PUBLIC_ACCOUNT;
const proximity_auth::mojom::AuthType initial_auth_type =
is_public_account
? proximity_auth::mojom::AuthType::EXPAND_THEN_USER_CLICK
: (chromeos::UserSelectionScreen::ShouldForceOnlineSignIn(user)
? proximity_auth::mojom::AuthType::ONLINE_SIGN_IN
: proximity_auth::mojom::AuthType::OFFLINE_PASSWORD);
chromeos::UserSelectionScreen::FillUserMojoStruct(
user, is_owner, false /*is_signin_to_add*/, initial_auth_type,
mojo_user.get());
users.push_back(std::move(mojo_user));
}
// Load the login screen.
auto* client = LoginScreenClient::Get();
client->SetDelegate(host_);
client->ShowLoginScreen(
base::BindOnce([](bool did_show) { CHECK(did_show); }));
client->LoadUsers(std::move(users), show_guest);
user_selection_screen_->Init(filtered_users);
client->LoadUsers(user_selection_screen_->UpdateAndReturnUserListForMojo(),
show_guest);
}
void LoginDisplayViews::OnPreferencesChanged() {
......
......@@ -5,12 +5,16 @@
#ifndef CHROME_BROWSER_CHROMEOS_LOGIN_UI_LOGIN_DISPLAY_VIEWS_H_
#define CHROME_BROWSER_CHROMEOS_LOGIN_UI_LOGIN_DISPLAY_VIEWS_H_
#include <memory>
#include "base/macros.h"
#include "chrome/browser/chromeos/login/ui/login_display.h"
namespace chromeos {
class LoginDisplayHostViews;
class UserSelectionScreen;
class UserSelectionScreenProxy;
// Interface used by UI-agnostic code to send messages to views-based login
// screen.
......@@ -39,6 +43,8 @@ class LoginDisplayViews : public LoginDisplay {
private:
LoginDisplayHostViews* const host_ = nullptr;
std::unique_ptr<UserSelectionScreenProxy> user_selection_screen_proxy_;
std::unique_ptr<UserSelectionScreen> user_selection_screen_;
DISALLOW_COPY_AND_ASSIGN(LoginDisplayViews);
};
......
......@@ -32,6 +32,12 @@ bool StructTraits<common::mojom::ListValueDataView,
return true;
}
std::unique_ptr<base::ListValue>
CloneTraits<std::unique_ptr<base::ListValue>, false>::Clone(
const std::unique_ptr<base::ListValue>& input) {
return input ? input->CreateDeepCopy() : nullptr;
}
bool StructTraits<common::mojom::DictionaryValueDataView,
std::unique_ptr<base::DictionaryValue>>::
Read(common::mojom::DictionaryValueDataView data,
......
......@@ -61,6 +61,12 @@ struct StructTraits<common::mojom::ListValueDataView,
std::unique_ptr<base::ListValue>* value);
};
template <>
struct CloneTraits<std::unique_ptr<base::ListValue>, false> {
static std::unique_ptr<base::ListValue> Clone(
const std::unique_ptr<base::ListValue>& input);
};
template <>
struct MapTraits<base::DictionaryValue> {
using Key = std::string;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment