0

Consumer management enrollment signin screen change:

- Show Gaia signin page instead of account picker.
- Pre-fill owner email in Gaia signin page.
- Show only the enrollment message in Gaia screen right panel.
- Show only a cancel button (in addition to Shutdown) at the bottom.

BUG=chromium:353050
TEST=manually test the signin page.

Review URL: https://codereview.chromium.org/426153003

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@287143 0039d316-1c4b-4281-b951-d872f2087c98
This commit is contained in:
davidyu@chromium.org
2014-08-02 01:32:40 +00:00
parent f4ca216b3b
commit 12d5de95a6
10 changed files with 117 additions and 11 deletions

@@ -5053,6 +5053,9 @@ Battery full
<message name="IDS_LOGIN_CONNECTING_INDICATOR_TEXT" desc="A message to show telling the user that the device is attempting to re-connect to the network."> <message name="IDS_LOGIN_CONNECTING_INDICATOR_TEXT" desc="A message to show telling the user that the device is attempting to re-connect to the network.">
Connecting and verifying<ph name="ANIMATED_ELLIPSIS">$1<ex>...</ex></ph> Connecting and verifying<ph name="ANIMATED_ELLIPSIS">$1<ex>...</ex></ph>
</message> </message>
<message name="IDS_LOGIN_CONSUMER_MANAGEMENT_ENROLLMENT" desc="A message to show at the signin page when consumer management enrollment is in progress.">
The owner must sign in to complete enrollment with Google Device Manager.
</message>
<!-- Idle warning dialog --> <!-- Idle warning dialog -->
<message name="IDS_IDLE_WARNING_TITLE" desc="Title of the warning dialog shown when the user becomes idle and is about to get logged out."> <message name="IDS_IDLE_WARNING_TITLE" desc="Title of the warning dialog shown when the user becomes idle and is about to get logged out.">

@@ -26,4 +26,10 @@
i18n-content="cancel"></button> i18n-content="cancel"></button>
</button> </button>
</div> </div>
<div id="cancel-consumer-management-enrollment" class="header-bar-item"
hidden>
<button id="cancel-consumer-management-enrollment-button"
class="custom-appearance" i18n-content="cancel"></button>
</button>
</div>
</div> </div>

@@ -45,6 +45,9 @@ cr.define('login', function() {
this.handleSignoutClick_); this.handleSignoutClick_);
$('cancel-multiple-sign-in-button').addEventListener('click', $('cancel-multiple-sign-in-button').addEventListener('click',
this.handleCancelMultipleSignInClick_); this.handleCancelMultipleSignInClick_);
$('cancel-consumer-management-enrollment-button')
.addEventListener('click',
this.handleCancelConsumerManagementEnrollmentClick_);
if (Oobe.getInstance().displayType == DISPLAY_TYPE.LOGIN || if (Oobe.getInstance().displayType == DISPLAY_TYPE.LOGIN ||
Oobe.getInstance().displayType == DISPLAY_TYPE.OOBE) { Oobe.getInstance().displayType == DISPLAY_TYPE.OOBE) {
if (Oobe.getInstance().newKioskUI) if (Oobe.getInstance().newKioskUI)
@@ -153,6 +156,16 @@ cr.define('login', function() {
e.stopPropagation(); e.stopPropagation();
}, },
/**
* Cancel consumer management enrollment button handler.
*
* @private
*/
handleCancelConsumerManagementEnrollmentClick_: function(e) {
chrome.send('cancelConsumerManagementEnrollment');
e.stopPropagation();
},
/** /**
* If true then "Browse as Guest" button is shown. * If true then "Browse as Guest" button is shown.
* *
@@ -213,6 +226,8 @@ cr.define('login', function() {
(this.signinUIState_ == SIGNIN_UI_STATE.WRONG_HWID_WARNING); (this.signinUIState_ == SIGNIN_UI_STATE.WRONG_HWID_WARNING);
var isSamlPasswordConfirm = var isSamlPasswordConfirm =
(this.signinUIState_ == SIGNIN_UI_STATE.SAML_PASSWORD_CONFIRM); (this.signinUIState_ == SIGNIN_UI_STATE.SAML_PASSWORD_CONFIRM);
var isEnrollingConsumerManagement = (this.signinUIState_ ==
SIGNIN_UI_STATE.CONSUMER_MANAGEMENT_ENROLLMENT);
var isMultiProfilesUI = var isMultiProfilesUI =
(Oobe.getInstance().displayType == DISPLAY_TYPE.USER_ADDING); (Oobe.getInstance().displayType == DISPLAY_TYPE.USER_ADDING);
var isLockScreen = var isLockScreen =
@@ -237,6 +252,8 @@ cr.define('login', function() {
$('apps-header-bar-item').hidden = !this.hasApps_ || $('apps-header-bar-item').hidden = !this.hasApps_ ||
(!gaiaIsActive && !accountPickerIsActive); (!gaiaIsActive && !accountPickerIsActive);
$('cancel-multiple-sign-in-item').hidden = !isMultiProfilesUI; $('cancel-multiple-sign-in-item').hidden = !isMultiProfilesUI;
$('cancel-consumer-management-enrollment').hidden =
!isEnrollingConsumerManagement;
if (!Oobe.getInstance().newKioskUI) { if (!Oobe.getInstance().newKioskUI) {
if (!$('apps-header-bar-item').hidden) if (!$('apps-header-bar-item').hidden)

@@ -24,6 +24,7 @@
<div id="createSupervisedUserLinkPlaceholder"></div> <div id="createSupervisedUserLinkPlaceholder"></div>
<div id="createSupervisedUserNoManagerText" hidden></div> <div id="createSupervisedUserNoManagerText" hidden></div>
</div> </div>
<div id="consumerManagementEnrollment" class="signin-text"></div>
</div> </div>
</div> </div>
<div id="gaia-loading" class="step-loading"> <div id="gaia-loading" class="step-loading">

@@ -55,6 +55,13 @@ login.createScreen('GaiaSigninScreen', 'gaia-signin', function() {
*/ */
email: '', email: '',
/**
* Whether consumer management enrollment is in progress.
* @type {boolean}
* @private
*/
isEnrollingConsumerManagement_: false,
/** /**
* Timer id of pending load. * Timer id of pending load.
* @type {number} * @type {number}
@@ -211,7 +218,10 @@ login.createScreen('GaiaSigninScreen', 'gaia-signin', function() {
*/ */
onBeforeShow: function(data) { onBeforeShow: function(data) {
chrome.send('loginUIStateChanged', ['gaia-signin', true]); chrome.send('loginUIStateChanged', ['gaia-signin', true]);
$('login-header-bar').signinUIState = SIGNIN_UI_STATE.GAIA_SIGNIN; $('login-header-bar').signinUIState =
this.isEnrollingConsumerManagement_ ?
SIGNIN_UI_STATE.CONSUMER_MANAGEMENT_ENROLLMENT :
SIGNIN_UI_STATE.GAIA_SIGNIN;
// Ensure that GAIA signin (or loading UI) is actually visible. // Ensure that GAIA signin (or loading UI) is actually visible.
window.webkitRequestAnimationFrame(function() { window.webkitRequestAnimationFrame(function() {
@@ -308,14 +318,20 @@ login.createScreen('GaiaSigninScreen', 'gaia-signin', function() {
$('createSupervisedUserNoManagerText').textContent = $('createSupervisedUserNoManagerText').textContent =
data.supervisedUsersRestrictionReason; data.supervisedUsersRestrictionReason;
$('consumerManagementEnrollment').hidden =
!data.isEnrollingConsumerManagement;
this.isShowUsers_ = data.isShowUsers; this.isShowUsers_ = data.isShowUsers;
this.updateCancelButtonState(); this.updateCancelButtonState();
this.isEnrollingConsumerManagement_ = data.isEnrollingConsumerManagement;
// Sign-in right panel is hidden if all of its items are hidden. // Sign-in right panel is hidden if all of its items are hidden.
var noRightPanel = $('gaia-signin-reason').hidden && var noRightPanel = $('gaia-signin-reason').hidden &&
$('createAccount').hidden && $('createAccount').hidden &&
$('guestSignin').hidden && $('guestSignin').hidden &&
$('createSupervisedUserPane').hidden; $('createSupervisedUserPane').hidden &&
$('consumerManagementEnrollment').hidden;
this.classList.toggle('no-right-panel', noRightPanel); this.classList.toggle('no-right-panel', noRightPanel);
if (Oobe.getInstance().currentScreen === this) if (Oobe.getInstance().currentScreen === this)
Oobe.getInstance().updateScreenSize(this); Oobe.getInstance().updateScreenSize(this);
@@ -563,6 +579,8 @@ login.createScreen('GaiaSigninScreen', 'gaia-signin', function() {
'createSupervisedUser', 'createSupervisedUser',
'<a id="createSupervisedUserLink" class="signin-link" href="#">', '<a id="createSupervisedUserLink" class="signin-link" href="#">',
'</a>'); '</a>');
$('consumerManagementEnrollment').innerHTML = loadTimeData.getString(
'consumerManagementEnrollmentSigninMessage');
$('createAccountLink').addEventListener('click', function(e) { $('createAccountLink').addEventListener('click', function(e) {
chrome.send('createAccount'); chrome.send('createAccount');
e.preventDefault(); e.preventDefault();

@@ -36,7 +36,8 @@ namespace {
const char kJsScreenPath[] = "login.GaiaSigninScreen"; const char kJsScreenPath[] = "login.GaiaSigninScreen";
void UpdateAuthParams(base::DictionaryValue* params, bool has_users) { void UpdateAuthParams(base::DictionaryValue* params, bool has_users,
bool is_enrolling_consumer_management) {
CrosSettings* cros_settings = CrosSettings::Get(); CrosSettings* cros_settings = CrosSettings::Get();
bool allow_new_user = true; bool allow_new_user = true;
cros_settings->GetBoolean(kAccountsPrefAllowNewUser, &allow_new_user); cros_settings->GetBoolean(kAccountsPrefAllowNewUser, &allow_new_user);
@@ -73,7 +74,10 @@ void UpdateAuthParams(base::DictionaryValue* params, bool has_users) {
// Now check whether we're in multi-profiles user adding scenario and // Now check whether we're in multi-profiles user adding scenario and
// disable GAIA right panel features if that's the case. // disable GAIA right panel features if that's the case.
if (UserAddingScreen::Get()->IsRunning()) { // For consumer management enrollment, we also hide all right panel components
// and show only an enrollment message.
if (UserAddingScreen::Get()->IsRunning() ||
is_enrolling_consumer_management) {
params->SetBoolean("createAccount", false); params->SetBoolean("createAccount", false);
params->SetBoolean("guestSignin", false); params->SetBoolean("guestSignin", false);
params->SetBoolean("supervisedUsersEnabled", false); params->SetBoolean("supervisedUsersEnabled", false);
@@ -116,6 +120,7 @@ GaiaScreenHandler::GaiaScreenHandler(
focus_stolen_(false), focus_stolen_(false),
gaia_silent_load_(false), gaia_silent_load_(false),
using_saml_api_(false), using_saml_api_(false),
is_enrolling_consumer_management_(false),
test_expects_complete_login_(false), test_expects_complete_login_(false),
signin_screen_handler_(NULL), signin_screen_handler_(NULL),
weak_factory_(this) { weak_factory_(this) {
@@ -134,8 +139,11 @@ void GaiaScreenHandler::LoadGaia(const GaiaContext& context) {
params.SetBoolean("isShowUsers", context.show_users); params.SetBoolean("isShowUsers", context.show_users);
params.SetBoolean("useOffline", context.use_offline); params.SetBoolean("useOffline", context.use_offline);
params.SetString("email", context.email); params.SetString("email", context.email);
params.SetBoolean("isEnrollingConsumerManagement",
context.is_enrolling_consumer_management);
UpdateAuthParams(&params, context.has_users); UpdateAuthParams(&params, context.has_users,
context.is_enrolling_consumer_management);
if (!context.use_offline) { if (!context.use_offline) {
const std::string app_locale = g_browser_process->GetApplicationLocale(); const std::string app_locale = g_browser_process->GetApplicationLocale();
@@ -178,7 +186,8 @@ void GaiaScreenHandler::LoadGaia(const GaiaContext& context) {
void GaiaScreenHandler::UpdateGaia(const GaiaContext& context) { void GaiaScreenHandler::UpdateGaia(const GaiaContext& context) {
base::DictionaryValue params; base::DictionaryValue params;
UpdateAuthParams(&params, context.has_users); UpdateAuthParams(&params, context.has_users,
context.is_enrolling_consumer_management);
CallJS("updateAuthExtension", params); CallJS("updateAuthExtension", params);
} }
@@ -209,6 +218,8 @@ void GaiaScreenHandler::DeclareLocalizedValues(
IDS_CREATE_LOCALLY_MANAGED_USER_HTML); IDS_CREATE_LOCALLY_MANAGED_USER_HTML);
builder->Add("createSupervisedUserFeatureName", builder->Add("createSupervisedUserFeatureName",
IDS_CREATE_LOCALLY_MANAGED_USER_FEATURE_NAME); IDS_CREATE_LOCALLY_MANAGED_USER_FEATURE_NAME);
builder->Add("consumerManagementEnrollmentSigninMessage",
IDS_LOGIN_CONSUMER_MANAGEMENT_ENROLLMENT);
// Strings used by the SAML fatal error dialog. // Strings used by the SAML fatal error dialog.
builder->Add("fatalErrorMessageNoEmail", IDS_LOGIN_FATAL_ERROR_NO_EMAIL); builder->Add("fatalErrorMessageNoEmail", IDS_LOGIN_FATAL_ERROR_NO_EMAIL);
@@ -278,6 +289,14 @@ void GaiaScreenHandler::HandleCompleteAuthentication(
void GaiaScreenHandler::HandleCompleteLogin(const std::string& typed_email, void GaiaScreenHandler::HandleCompleteLogin(const std::string& typed_email,
const std::string& password, const std::string& password,
bool using_saml) { bool using_saml) {
std::string owner_email = UserManager::Get()->GetOwnerEmail();
if (is_enrolling_consumer_management_ && typed_email != owner_email) {
// Show Gaia signin page again since we only allow the owner to sign in.
populated_email_ = owner_email;
ShowGaia(is_enrolling_consumer_management_);
return;
}
if (!Delegate()) if (!Delegate())
return; return;
@@ -446,7 +465,8 @@ void GaiaScreenHandler::SetSAMLPrincipalsAPIUsed(bool api_used) {
UMA_HISTOGRAM_BOOLEAN("ChromeOS.SAML.APIUsed", api_used); UMA_HISTOGRAM_BOOLEAN("ChromeOS.SAML.APIUsed", api_used);
} }
void GaiaScreenHandler::ShowGaia() { void GaiaScreenHandler::ShowGaia(bool is_enrolling_consumer_management) {
is_enrolling_consumer_management_ = is_enrolling_consumer_management;
if (gaia_silent_load_ && populated_email_.empty()) { if (gaia_silent_load_ && populated_email_.empty()) {
dns_cleared_ = true; dns_cleared_ = true;
cookies_cleared_ = true; cookies_cleared_ = true;
@@ -523,6 +543,7 @@ void GaiaScreenHandler::LoadAuthExtension(bool force,
password_changed_for_.count(populated_email_); password_changed_for_.count(populated_email_);
context.use_offline = offline; context.use_offline = offline;
context.email = populated_email_; context.email = populated_email_;
context.is_enrolling_consumer_management = is_enrolling_consumer_management_;
if (Delegate()) { if (Delegate()) {
context.show_users = Delegate()->IsShowUsers(); context.show_users = Delegate()->IsShowUsers();
context.has_users = !Delegate()->GetUsers().empty(); context.has_users = !Delegate()->GetUsers().empty();

@@ -39,6 +39,9 @@ struct GaiaContext {
// Email of current user. // Email of current user.
std::string email; std::string email;
// Whether consumer management enrollment is in progress.
bool is_enrolling_consumer_management;
}; };
// A class that handles WebUI hooks in Gaia screen. // A class that handles WebUI hooks in Gaia screen.
@@ -116,7 +119,7 @@ class GaiaScreenHandler : public BaseScreenHandler {
// principals API was used during SAML login. // principals API was used during SAML login.
void SetSAMLPrincipalsAPIUsed(bool api_used); void SetSAMLPrincipalsAPIUsed(bool api_used);
void ShowGaia(); void ShowGaia(bool is_enrolling_consumer_management);
// Shows signin screen after dns cache and cookie cleanup operations finish. // Shows signin screen after dns cache and cookie cleanup operations finish.
void ShowGaiaScreenIfReady(); void ShowGaiaScreenIfReady();
@@ -178,6 +181,9 @@ class GaiaScreenHandler : public BaseScreenHandler {
// API was used. // API was used.
bool using_saml_api_; bool using_saml_api_;
// Whether consumer management enrollment is in progress.
bool is_enrolling_consumer_management_;
// Test credentials. // Test credentials.
std::string test_user_; std::string test_user_;
std::string test_pass_; std::string test_pass_;

@@ -8,6 +8,7 @@
#include "base/bind.h" #include "base/bind.h"
#include "base/bind_helpers.h" #include "base/bind_helpers.h"
#include "base/command_line.h"
#include "base/debug/trace_event.h" #include "base/debug/trace_event.h"
#include "base/location.h" #include "base/location.h"
#include "base/logging.h" #include "base/logging.h"
@@ -35,6 +36,7 @@
#include "chrome/browser/chromeos/login/ui/login_display_host_impl.h" #include "chrome/browser/chromeos/login/ui/login_display_host_impl.h"
#include "chrome/browser/chromeos/login/ui/webui_login_display.h" #include "chrome/browser/chromeos/login/ui/webui_login_display.h"
#include "chrome/browser/chromeos/login/users/multi_profile_user_controller.h" #include "chrome/browser/chromeos/login/users/multi_profile_user_controller.h"
#include "chrome/browser/chromeos/login/users/user_manager.h"
#include "chrome/browser/chromeos/login/users/wallpaper/wallpaper_manager.h" #include "chrome/browser/chromeos/login/users/wallpaper/wallpaper_manager.h"
#include "chrome/browser/chromeos/login/wizard_controller.h" #include "chrome/browser/chromeos/login/wizard_controller.h"
#include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h" #include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h"
@@ -52,6 +54,7 @@
#include "chrome/browser/ui/webui/chromeos/login/oobe_ui.h" #include "chrome/browser/ui/webui/chromeos/login/oobe_ui.h"
#include "chrome/common/pref_names.h" #include "chrome/common/pref_names.h"
#include "chrome/common/url_constants.h" #include "chrome/common/url_constants.h"
#include "chromeos/chromeos_switches.h"
#include "chromeos/dbus/dbus_thread_manager.h" #include "chromeos/dbus/dbus_thread_manager.h"
#include "chromeos/dbus/power_manager_client.h" #include "chromeos/dbus/power_manager_client.h"
#include "chromeos/ime/ime_keyboard.h" #include "chromeos/ime/ime_keyboard.h"
@@ -295,6 +298,13 @@ SigninScreenHandler::SigninScreenHandler(
chromeos::input_method::InputMethodManager::Get()->GetImeKeyboard(); chromeos::input_method::InputMethodManager::Get()->GetImeKeyboard();
if (keyboard) if (keyboard)
keyboard->AddObserver(this); keyboard->AddObserver(this);
CommandLine* command_line = CommandLine::ForCurrentProcess();
PrefService* prefs = g_browser_process->local_state();
is_enrolling_consumer_management_ =
command_line->HasSwitch(chromeos::switches::kEnableConsumerManagement) &&
prefs->GetBoolean(prefs::kConsumerManagementEnrollmentRequested);
} }
SigninScreenHandler::~SigninScreenHandler() { SigninScreenHandler::~SigninScreenHandler() {
@@ -418,7 +428,17 @@ void SigninScreenHandler::Show(const LoginScreenContext& context) {
// Just initialize internal fields from context and call ShowImpl(). // Just initialize internal fields from context and call ShowImpl().
oobe_ui_ = context.oobe_ui(); oobe_ui_ = context.oobe_ui();
gaia_screen_handler_->PopulateEmail(context.email());
std::string email;
if (is_enrolling_consumer_management_) {
// We don't check if the value of the owner email is trusted because it is
// only used to pre-fill the email field in Gaia sign-in page and a cached
// value is sufficient.
CrosSettings::Get()->GetString(kDeviceOwner, &email);
} else {
email = context.email();
}
gaia_screen_handler_->PopulateEmail(email);
ShowImpl(); ShowImpl();
} }
@@ -457,7 +477,7 @@ void SigninScreenHandler::ShowImpl() {
return; return;
} }
if (oobe_ui_) { if (oobe_ui_ || is_enrolling_consumer_management_) {
// Shows new user sign-in for OOBE. // Shows new user sign-in for OOBE.
OnShowAddUser(); OnShowAddUser();
} else { } else {
@@ -749,6 +769,8 @@ void SigninScreenHandler::RegisterMessages() {
&SigninScreenHandler::HandleRetrieveAuthenticatedUserEmail); &SigninScreenHandler::HandleRetrieveAuthenticatedUserEmail);
AddCallback("getPublicSessionKeyboardLayouts", AddCallback("getPublicSessionKeyboardLayouts",
&SigninScreenHandler::HandleGetPublicSessionKeyboardLayouts); &SigninScreenHandler::HandleGetPublicSessionKeyboardLayouts);
AddCallback("cancelConsumerManagementEnrollment",
&SigninScreenHandler::HandleCancelConsumerManagementEnrollment);
// This message is sent by the kiosk app menu, but is handled here // This message is sent by the kiosk app menu, but is handled here
@@ -1322,6 +1344,13 @@ void SigninScreenHandler::HandleLaunchKioskApp(const std::string& app_id,
delegate_->Login(context, specifics); delegate_->Login(context, specifics);
} }
void SigninScreenHandler::HandleCancelConsumerManagementEnrollment() {
PrefService* prefs = g_browser_process->local_state();
prefs->SetBoolean(prefs::kConsumerManagementEnrollmentRequested, false);
is_enrolling_consumer_management_ = false;
ShowImpl();
}
bool SigninScreenHandler::AllWhitelistedUsersPresent() { bool SigninScreenHandler::AllWhitelistedUsersPresent() {
CrosSettings* cros_settings = CrosSettings::Get(); CrosSettings* cros_settings = CrosSettings::Get();
bool allow_new_user = false; bool allow_new_user = false;
@@ -1427,7 +1456,7 @@ void SigninScreenHandler::ContinueKioskEnableFlow(
void SigninScreenHandler::OnShowAddUser() { void SigninScreenHandler::OnShowAddUser() {
is_account_picker_showing_first_time_ = false; is_account_picker_showing_first_time_ = false;
DCHECK(gaia_screen_handler_); DCHECK(gaia_screen_handler_);
gaia_screen_handler_->ShowGaia(); gaia_screen_handler_->ShowGaia(is_enrolling_consumer_management_);
} }
GaiaScreenHandler::FrameState SigninScreenHandler::FrameState() const { GaiaScreenHandler::FrameState SigninScreenHandler::FrameState() const {

@@ -359,6 +359,7 @@ class SigninScreenHandler
void HandleRetrieveAuthenticatedUserEmail(double attempt_token); void HandleRetrieveAuthenticatedUserEmail(double attempt_token);
void HandleGetPublicSessionKeyboardLayouts(const std::string& user_id, void HandleGetPublicSessionKeyboardLayouts(const std::string& user_id,
const std::string& locale); const std::string& locale);
void HandleCancelConsumerManagementEnrollment();
// Sends the list of keyboard layouts available for the currently selected // Sends the list of keyboard layouts available for the currently selected
// public session locale. // public session locale.
@@ -470,6 +471,9 @@ class SigninScreenHandler
// Helper that retrieves the authenticated user's e-mail address. // Helper that retrieves the authenticated user's e-mail address.
scoped_ptr<AuthenticatedUserEmailRetriever> email_retriever_; scoped_ptr<AuthenticatedUserEmailRetriever> email_retriever_;
// Whether consumer management enrollment is in progress.
bool is_enrolling_consumer_management_;
base::WeakPtrFactory<SigninScreenHandler> weak_factory_; base::WeakPtrFactory<SigninScreenHandler> weak_factory_;
DISALLOW_COPY_AND_ASSIGN(SigninScreenHandler); DISALLOW_COPY_AND_ASSIGN(SigninScreenHandler);

@@ -55,6 +55,7 @@
WRONG_HWID_WARNING: 3, WRONG_HWID_WARNING: 3,
SUPERVISED_USER_CREATION_FLOW: 4, SUPERVISED_USER_CREATION_FLOW: 4,
SAML_PASSWORD_CONFIRM: 5, SAML_PASSWORD_CONFIRM: 5,
CONSUMER_MANAGEMENT_ENROLLMENT: 6,
}; };
/* Possible UI states of the error screen. */ /* Possible UI states of the error screen. */