Commit 863b9140 authored by bcwhite@chromium.org's avatar bcwhite@chromium.org

Add Profile metric counting to new User Manager.

BUG=305652

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

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@247979 0039d316-1c4b-4281-b951-d872f2087c98
parent 4ce73611
......@@ -112,7 +112,9 @@ bool AvatarMenu::CompareItems(const Item* item1, const Item* item2) {
base::i18n::ToLower(item2->name)) < 0;
}
void AvatarMenu::SwitchToProfile(size_t index, bool always_create) {
void AvatarMenu::SwitchToProfile(size_t index,
bool always_create,
ProfileMetrics::ProfileOpen metric) {
DCHECK(profiles::IsMultipleProfilesEnabled() ||
index == GetActiveProfileIndex());
const Item& item = GetItemAt(index);
......@@ -133,8 +135,8 @@ void AvatarMenu::SwitchToProfile(size_t index, bool always_create) {
desktop_type = browser_->host_desktop_type();
profiles::SwitchToProfile(path, desktop_type, always_create,
profiles::ProfileSwitchingDoneCallback());
ProfileMetrics::LogProfileSwitchUser(ProfileMetrics::SWITCH_PROFILE_ICON);
profiles::ProfileSwitchingDoneCallback(),
metric);
}
void AvatarMenu::AddNewProfile(ProfileMetrics::ProfileAdd type) {
......
......@@ -94,7 +94,9 @@ class AvatarMenu : public content::NotificationObserver {
// Opens a Browser with the specified profile in response to the user
// selecting an item. If |always_create| is true then a new window is created
// even if a window for that profile already exists.
void SwitchToProfile(size_t index, bool always_create);
void SwitchToProfile(size_t index,
bool always_create,
ProfileMetrics::ProfileOpen metric);
// Creates a new profile.
void AddNewProfile(ProfileMetrics::ProfileAdd type);
......
......@@ -116,16 +116,19 @@ IN_PROC_BROWSER_TEST_F(ProfileListDesktopBrowserTest, SwitchToProfile) {
EXPECT_EQ(path_profile1, browser_list->get(0)->profile()->GetPath());
// Open a browser window for the first profile.
menu->SwitchToProfile(cache.GetIndexOfProfileWithPath(path_profile1), false);
menu->SwitchToProfile(cache.GetIndexOfProfileWithPath(path_profile1),
false, ProfileMetrics::SWITCH_PROFILE_ICON);
EXPECT_EQ(1U, browser_list->size());
EXPECT_EQ(path_profile1, browser_list->get(0)->profile()->GetPath());
// Open a browser window for the second profile.
menu->SwitchToProfile(cache.GetIndexOfProfileWithPath(path_profile2), false);
menu->SwitchToProfile(cache.GetIndexOfProfileWithPath(path_profile2),
false, ProfileMetrics::SWITCH_PROFILE_ICON);
EXPECT_EQ(2U, browser_list->size());
// Switch to the first profile without opening a new window.
menu->SwitchToProfile(cache.GetIndexOfProfileWithPath(path_profile1), false);
menu->SwitchToProfile(cache.GetIndexOfProfileWithPath(path_profile1),
false, ProfileMetrics::SWITCH_PROFILE_ICON);
EXPECT_EQ(2U, browser_list->size());
EXPECT_EQ(path_profile1, browser_list->get(0)->profile()->GetPath());
EXPECT_EQ(path_profile2, browser_list->get(1)->profile()->GetPath());
......
......@@ -278,21 +278,24 @@ IN_PROC_BROWSER_TEST_F(ProfileManagerBrowserTest,
// Open a browser window for the first profile.
profiles::SwitchToProfile(path_profile1, desktop_type, false,
kOnProfileSwitchDoNothing);
kOnProfileSwitchDoNothing,
ProfileMetrics::SWITCH_PROFILE_ICON);
EXPECT_EQ(chrome::GetTotalBrowserCount(), 1U);
EXPECT_EQ(1U, browser_list->size());
EXPECT_EQ(path_profile1, browser_list->get(0)->profile()->GetPath());
// Open a browser window for the second profile.
profiles::SwitchToProfile(path_profile2, desktop_type, false,
kOnProfileSwitchDoNothing);
kOnProfileSwitchDoNothing,
ProfileMetrics::SWITCH_PROFILE_ICON);
EXPECT_EQ(chrome::GetTotalBrowserCount(), 2U);
EXPECT_EQ(2U, browser_list->size());
EXPECT_EQ(path_profile2, browser_list->get(1)->profile()->GetPath());
// Switch to the first profile without opening a new window.
profiles::SwitchToProfile(path_profile1, desktop_type, false,
kOnProfileSwitchDoNothing);
kOnProfileSwitchDoNothing,
ProfileMetrics::SWITCH_PROFILE_ICON);
EXPECT_EQ(chrome::GetTotalBrowserCount(), 2U);
EXPECT_EQ(2U, browser_list->size());
......@@ -338,14 +341,16 @@ IN_PROC_BROWSER_TEST_F(ProfileManagerBrowserTest, EphemeralProfile) {
// Open a browser window for the second profile.
profiles::SwitchToProfile(path_profile2, desktop_type, false,
kOnProfileSwitchDoNothing);
kOnProfileSwitchDoNothing,
ProfileMetrics::SWITCH_PROFILE_ICON);
EXPECT_EQ(2U, chrome::GetTotalBrowserCount());
EXPECT_EQ(2U, browser_list->size());
EXPECT_EQ(path_profile2, browser_list->get(1)->profile()->GetPath());
// Create a second window for the ephemeral profile.
profiles::SwitchToProfile(path_profile2, desktop_type, true,
kOnProfileSwitchDoNothing);
kOnProfileSwitchDoNothing,
ProfileMetrics::SWITCH_PROFILE_ICON);
EXPECT_EQ(3U, chrome::GetTotalBrowserCount());
EXPECT_EQ(3U, browser_list->size());
......
......@@ -268,6 +268,11 @@ void ProfileMetrics::LogProfileSyncInfo(ProfileSync metric) {
NUM_PROFILE_SYNC_METRICS);
}
void ProfileMetrics::LogProfileAuthResult(ProfileAuth metric) {
UMA_HISTOGRAM_ENUMERATION("Profile.AuthResult", metric,
NUM_PROFILE_AUTH_METRICS);
}
void ProfileMetrics::LogProfileLaunch(Profile* profile) {
base::FilePath profile_path = profile->GetPath();
UMA_HISTOGRAM_ENUMERATION("Profile.LaunchBrowser",
......
......@@ -24,6 +24,7 @@ class ProfileMetrics {
ADD_NEW_USER_ICON = 0, // User adds new user from icon menu
ADD_NEW_USER_MENU, // User adds new user from menu bar
ADD_NEW_USER_DIALOG, // User adds new user from create-profile dialog
ADD_NEW_USER_MANAGER, // User adds new user from User Manager
NUM_PROFILE_ADD_METRICS
};
......@@ -34,6 +35,10 @@ class ProfileMetrics {
SWITCH_PROFILE_ICON, // User switches profiles from icon menu
SWITCH_PROFILE_MENU, // User switches profiles from menu bar
SWITCH_PROFILE_DOCK, // User switches profiles from dock (Mac-only)
OPEN_USER_MANAGER, // User opens the User Manager
SWITCH_PROFILE_MANAGER, // User switches profiles from the User Manager
SWITCH_PROFILE_UNLOCK, // User switches to lockd profile via User Manager
SWITCH_PROFILE_GUEST, // User switches to guest profile
NUM_PROFILE_OPEN_METRICS
};
......@@ -62,11 +67,19 @@ class ProfileMetrics {
};
enum ProfileGaia {
GAIA_OPT_IN = 0, // User changed to GAIA photo as avatar
GAIA_OPT_OUT, // User changed to not use GAIA photo as avatar
GAIA_OPT_IN = 0, // User changed to GAIA photo as avatar
GAIA_OPT_OUT, // User changed to not use GAIA photo as avatar
NUM_PROFILE_GAIA_METRICS
};
enum ProfileAuth {
AUTH_UNNECESSARY, // Profile was not locked
AUTH_LOCAL, // Profile was authenticated locally
AUTH_ONLINE, // Profile was authenticated on-line
AUTH_FAILED, // Profile failed authentication
NUM_PROFILE_AUTH_METRICS
};
static void UpdateReportedProfilesStatistics(ProfileManager* manager);
static void LogNumberOfProfiles(ProfileManager* manager);
......@@ -77,6 +90,7 @@ class ProfileMetrics {
static void LogProfileSwitchGaia(ProfileGaia metric);
static void LogProfileSwitchUser(ProfileOpen metric);
static void LogProfileSyncInfo(ProfileSync metric);
static void LogProfileAuthResult(ProfileAuth metric);
// These functions should only be called on the UI thread because they hook
// into g_browser_process through a helper function.
......
......@@ -123,11 +123,11 @@ void FindOrCreateNewWindowForProfile(
#endif // defined(OS_IOS)
}
void SwitchToProfile(
const base::FilePath& path,
chrome::HostDesktopType desktop_type,
bool always_create,
ProfileSwitchingDoneCallback callback) {
void SwitchToProfile(const base::FilePath& path,
chrome::HostDesktopType desktop_type,
bool always_create,
ProfileSwitchingDoneCallback callback,
ProfileMetrics::ProfileOpen metric) {
g_browser_process->profile_manager()->CreateProfileAsync(
path,
base::Bind(&OpenBrowserWindowForProfile,
......@@ -138,6 +138,7 @@ void SwitchToProfile(
base::string16(),
base::string16(),
std::string());
ProfileMetrics::LogProfileSwitchUser(metric);
}
void SwitchToGuestProfile(chrome::HostDesktopType desktop_type,
......@@ -152,10 +153,12 @@ void SwitchToGuestProfile(chrome::HostDesktopType desktop_type,
base::string16(),
base::string16(),
std::string());
ProfileMetrics::LogProfileSwitchUser(ProfileMetrics::SWITCH_PROFILE_GUEST);
}
void CreateAndSwitchToNewProfile(chrome::HostDesktopType desktop_type,
ProfileSwitchingDoneCallback callback) {
ProfileSwitchingDoneCallback callback,
ProfileMetrics::ProfileAdd metric) {
ProfileManager::CreateMultiProfileAsync(
base::string16(),
base::string16(),
......@@ -165,6 +168,7 @@ void CreateAndSwitchToNewProfile(chrome::HostDesktopType desktop_type,
true,
desktop_type),
std::string());
ProfileMetrics::LogProfileAddNewUser(metric);
}
void CloseGuestProfileWindows() {
......
......@@ -6,6 +6,7 @@
#define CHROME_BROWSER_PROFILES_PROFILE_WINDOW_H_
#include "base/callback_forward.h"
#include "chrome/browser/profiles/profile_metrics.h"
#include "chrome/browser/ui/host_desktop.h"
#include "chrome/browser/ui/startup/startup_types.h"
......@@ -35,11 +36,11 @@ void FindOrCreateNewWindowForProfile(
// even if a window for that profile already exists. When the browser is
// opened, |callback| will be run if it isn't null.
void SwitchToProfile(
const base::FilePath& path,
chrome::HostDesktopType desktop_type,
bool always_create,
ProfileSwitchingDoneCallback callback);
void SwitchToProfile(const base::FilePath& path,
chrome::HostDesktopType desktop_type,
bool always_create,
ProfileSwitchingDoneCallback callback,
ProfileMetrics::ProfileOpen metric);
// Opens a Browser for the guest profile and runs |callback| if it isn't null.
void SwitchToGuestProfile(chrome::HostDesktopType desktop_type,
......@@ -49,7 +50,8 @@ void SwitchToGuestProfile(chrome::HostDesktopType desktop_type,
// opens a new browser window for the profile once it is ready. When the browser
// is opened, |callback| will be run if it isn't null.
void CreateAndSwitchToNewProfile(chrome::HostDesktopType desktop_type,
ProfileSwitchingDoneCallback callback);
ProfileSwitchingDoneCallback callback,
ProfileMetrics::ProfileAdd metric);
// Closes all browser windows that belong to the guest profile.
void CloseGuestProfileWindows();
......
......@@ -11,6 +11,7 @@
#include "chrome/browser/profiles/avatar_menu.h"
#include "chrome/browser/profiles/profile_info_cache.h"
#include "chrome/browser/profiles/profile_manager.h"
#include "chrome/browser/profiles/profile_metrics.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/browser_window.h"
#import "chrome/browser/ui/cocoa/info_bubble_view.h"
......@@ -92,7 +93,8 @@ const CGFloat kManagedUserSpacing = 26.0;
// Check the event flags to see if a new window should be crated.
bool always_create = ui::WindowOpenDispositionFromNSEvent(
[NSApp currentEvent]) == NEW_WINDOW;
menu_->SwitchToProfile([sender menuIndex], always_create);
menu_->SwitchToProfile([sender menuIndex], always_create,
ProfileMetrics::SWITCH_PROFILE_ICON);
}
- (IBAction)editProfile:(id)sender {
......
......@@ -15,6 +15,7 @@
#include "chrome/browser/profiles/profile_info_cache.h"
#include "chrome/browser/profiles/profile_info_util.h"
#include "chrome/browser/profiles/profile_manager.h"
#include "chrome/browser/profiles/profile_metrics.h"
#include "chrome/browser/profiles/profile_window.h"
#include "chrome/browser/profiles/profiles_state.h"
#include "chrome/browser/signin/mutable_profile_oauth2_token_service.h"
......@@ -481,14 +482,16 @@ class ActiveProfileObserverBridge : public AvatarMenuObserver,
- (IBAction)addNewProfile:(id)sender {
profiles::CreateAndSwitchToNewProfile(
browser_->host_desktop_type(),
profiles::ProfileSwitchingDoneCallback());
profiles::ProfileSwitchingDoneCallback(),
ProfileMetrics::ADD_NEW_USER_ICON);
}
- (IBAction)switchToProfile:(id)sender {
// Check the event flags to see if a new window should be created.
bool always_create = ui::WindowOpenDispositionFromNSEvent(
[NSApp currentEvent]) == NEW_WINDOW;
avatarMenu_->SwitchToProfile([sender tag], always_create);
avatarMenu_->SwitchToProfile([sender tag], always_create,
ProfileMetrics::SWITCH_PROFILE_ICON);
}
- (IBAction)showUserManager:(id)sender {
......
......@@ -83,15 +83,15 @@ class Observer : public chrome::BrowserListObserver,
}
- (IBAction)switchToProfileFromMenu:(id)sender {
menu_->SwitchToProfile([sender tag], false);
ProfileMetrics::LogProfileSwitchUser(ProfileMetrics::SWITCH_PROFILE_MENU);
menu_->SwitchToProfile([sender tag], false,
ProfileMetrics::SWITCH_PROFILE_MENU);
}
- (IBAction)switchToProfileFromDock:(id)sender {
// Explicitly bring to the foreground when taking action from the dock.
[NSApp activateIgnoringOtherApps:YES];
menu_->SwitchToProfile([sender tag], false);
ProfileMetrics::LogProfileSwitchUser(ProfileMetrics::SWITCH_PROFILE_DOCK);
menu_->SwitchToProfile([sender tag], false,
ProfileMetrics::SWITCH_PROFILE_DOCK);
}
- (IBAction)editProfile:(id)sender {
......
......@@ -668,7 +668,8 @@ void AvatarMenuBubbleView::ButtonPressed(views::Button* sender,
// Clicking on the active profile shouldn't do anything.
if (!item_view->item().active) {
avatar_menu_->SwitchToProfile(
i, ui::DispositionFromEventFlags(event.flags()) == NEW_WINDOW);
i, ui::DispositionFromEventFlags(event.flags()) == NEW_WINDOW,
ProfileMetrics::SWITCH_PROFILE_ICON);
}
break;
}
......
......@@ -536,7 +536,8 @@ void ProfileChooserView::ButtonPressed(views::Button* sender,
} else if (sender == add_user_button_) {
profiles::CreateAndSwitchToNewProfile(
browser_->host_desktop_type(),
profiles::ProfileSwitchingDoneCallback());
profiles::ProfileSwitchingDoneCallback(),
ProfileMetrics::ADD_NEW_USER_ICON);
} else if (sender == add_account_button_) {
ShowView(GAIA_ADD_ACCOUNT_VIEW, avatar_menu_.get());
} else if (sender == current_profile_photo_->change_photo_button()) {
......@@ -548,7 +549,8 @@ void ProfileChooserView::ButtonPressed(views::Button* sender,
DCHECK(match != open_other_profile_indexes_map_.end());
avatar_menu_->SwitchToProfile(
match->second,
ui::DispositionFromEventFlags(event.flags()) == NEW_WINDOW);
ui::DispositionFromEventFlags(event.flags()) == NEW_WINDOW,
ProfileMetrics::SWITCH_PROFILE_ICON);
}
}
......
......@@ -8,6 +8,7 @@
#include "chrome/browser/browser_process.h"
#include "chrome/browser/lifetime/application_lifetime.h"
#include "chrome/browser/profiles/profile_manager.h"
#include "chrome/browser/profiles/profile_metrics.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/browser_dialogs.h"
#include "chrome/browser/ui/browser_window.h"
......@@ -71,6 +72,7 @@ void UserManagerView::Show(const base::FilePath& profile_path_to_focus) {
// Prevent the browser process from shutting down while this window is open.
chrome::StartKeepAlive();
ProfileMetrics::LogProfileSwitchUser(ProfileMetrics::OPEN_USER_MANAGER);
if (instance_) {
// If there's a user manager window open already, just activate it.
instance_->GetWidget()->Activate();
......
......@@ -8,7 +8,6 @@
#include "base/value_conversions.h"
#include "base/values.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/profiles/avatar_menu.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/profiles/profile_info_cache.h"
#include "chrome/browser/profiles/profile_info_cache_observer.h"
......@@ -186,7 +185,8 @@ void UserManagerScreenHandler::HandleInitialize(const base::ListValue* args) {
void UserManagerScreenHandler::HandleAddUser(const base::ListValue* args) {
profiles::CreateAndSwitchToNewProfile(desktop_type_,
base::Bind(&chrome::HideUserManager));
base::Bind(&chrome::HideUserManager),
ProfileMetrics::ADD_NEW_USER_MANAGER);
}
void UserManagerScreenHandler::HandleAuthenticatedLaunchUser(
......@@ -234,7 +234,7 @@ void UserManagerScreenHandler::HandleAuthenticatedLaunchUser(
return;
}
ReportAuthenticationResult(true);
ReportAuthenticationResult(true, ProfileMetrics::AUTH_LOCAL);
}
void UserManagerScreenHandler::HandleRemoveUser(const base::ListValue* args) {
......@@ -258,11 +258,13 @@ void UserManagerScreenHandler::HandleRemoveUser(const base::ListValue* args) {
g_browser_process->profile_manager()->ScheduleProfileForDeletion(
profile_path,
base::Bind(&OpenNewWindowForProfile, desktop_type_));
ProfileMetrics::LogProfileDeleteUser(ProfileMetrics::PROFILE_DELETED);
}
void UserManagerScreenHandler::HandleLaunchGuest(const base::ListValue* args) {
profiles::SwitchToGuestProfile(desktop_type_,
base::Bind(&chrome::HideUserManager));
ProfileMetrics::LogProfileSwitchUser(ProfileMetrics::SWITCH_PROFILE_GUEST);
}
void UserManagerScreenHandler::HandleLaunchUser(const base::ListValue* args) {
......@@ -292,22 +294,26 @@ void UserManagerScreenHandler::HandleLaunchUser(const base::ListValue* args) {
// not needing authentication. If it is, just ignore the "launch" request.
if (info_cache.ProfileIsSigninRequiredAtIndex(profile_index))
return;
ProfileMetrics::LogProfileAuthResult(ProfileMetrics::AUTH_UNNECESSARY);
base::FilePath path = info_cache.GetPathOfProfileAtIndex(profile_index);
profiles::SwitchToProfile(
path, desktop_type_, true, base::Bind(&chrome::HideUserManager));
profiles::SwitchToProfile(path,
desktop_type_,
true,
base::Bind(&chrome::HideUserManager),
ProfileMetrics::SWITCH_PROFILE_MANAGER);
}
void UserManagerScreenHandler::OnClientLoginSuccess(
const ClientLoginResult& result) {
chrome::SetLocalAuthCredentials(authenticating_profile_index_,
password_attempt_);
ReportAuthenticationResult(true);
ReportAuthenticationResult(true, ProfileMetrics::AUTH_ONLINE);
}
void UserManagerScreenHandler::OnClientLoginFailure(
const GoogleServiceAuthError& error) {
ReportAuthenticationResult(false);
ReportAuthenticationResult(false, ProfileMetrics::AUTH_FAILED);
}
void UserManagerScreenHandler::RegisterMessages() {
......@@ -441,7 +447,9 @@ void UserManagerScreenHandler::SendUserList() {
users_list, base::FundamentalValue(false), base::FundamentalValue(true));
}
void UserManagerScreenHandler::ReportAuthenticationResult(bool success) {
void UserManagerScreenHandler::ReportAuthenticationResult(
bool success,
ProfileMetrics::ProfileAuth auth) {
if (success) {
ProfileInfoCache& info_cache =
g_browser_process->profile_manager()->GetProfileInfoCache();
......@@ -450,7 +458,8 @@ void UserManagerScreenHandler::ReportAuthenticationResult(bool success) {
base::FilePath path = info_cache.GetPathOfProfileAtIndex(
authenticating_profile_index_);
profiles::SwitchToProfile(path, desktop_type_, true,
base::Bind(&chrome::HideUserManager));
base::Bind(&chrome::HideUserManager),
ProfileMetrics::SWITCH_PROFILE_UNLOCK);
} else {
web_ui()->CallJavascriptFunction(
"cr.ui.Oobe.showSignInError",
......@@ -461,5 +470,6 @@ void UserManagerScreenHandler::ReportAuthenticationResult(bool success) {
base::FundamentalValue(0));
}
ProfileMetrics::LogProfileAuthResult(auth);
password_attempt_.clear();
}
......@@ -7,6 +7,7 @@
#include "base/compiler_specific.h"
#include "base/memory/scoped_ptr.h"
#include "chrome/browser/profiles/profile_metrics.h"
#include "chrome/browser/ui/host_desktop.h"
#include "content/public/browser/web_ui_message_handler.h"
#include "google_apis/gaia/gaia_auth_consumer.h"
......@@ -51,7 +52,8 @@ class UserManagerScreenHandler : public content::WebUIMessageHandler,
void SendUserList();
// Pass success/failure information back to the web page.
void ReportAuthenticationResult(bool success);
void ReportAuthenticationResult(bool success,
ProfileMetrics::ProfileAuth metric);
// Observes the ProfileInfoCache and gets notified when a profile has been
// modified, so that the displayed user pods can be updated.
......
......@@ -15314,6 +15314,13 @@ other types of suffix sets.
<summary>The number of installed apps when a profile is opened.</summary>
</histogram>
<histogram name="Profile.AuthResult" enum="ProfileAuth">
<summary>
Counts of authorization results when trying to open a locked profile from
the User Manager.
</summary>
</histogram>
<histogram name="Profile.Avatar" enum="ProfileAvatar">
<summary>The frequency of selection of each avatar.</summary>
</histogram>
......@@ -29516,6 +29523,14 @@ other types of suffix sets.
<int value="0" label="Add new user from icon menu"/>
<int value="1" label="Add new user from title bar menu"/>
<int value="2" label="Add new user from settings dialog"/>
<int value="3" label="Add new user from the User Manager"/>
</enum>
<enum name="ProfileAuth" type="int">
<int value="0" label="Authentication was unnecessary (profile not locked)"/>
<int value="1" label="Authentication performed using local credentials"/>
<int value="2" label="Authentication performed on-line"/>
<int value="3" label="Authentication failed"/>
</enum>
<enum name="ProfileAvatar" type="int">
......@@ -29609,9 +29624,13 @@ other types of suffix sets.
<enum name="ProfileOpenMethod" type="int">
<int value="0" label="Opened the avatar bubble menu from NTP"/>
<int value="1" label="Opened the avatar bubble menu from icon"/>
<int value="2" label="Switch profile from icon menu"/>
<int value="3" label="Switch profile from title bar menu"/>
<int value="4" label="Switch profile from Mac OS X Dock menu"/>
<int value="2" label="Switch to profile from icon menu"/>
<int value="3" label="Switch to profile from title bar menu"/>
<int value="4" label="Switch to profile from Mac OS X Dock menu"/>
<int value="5" label="Opened the User Manager"/>
<int value="6" label="Switch to profile via User Manager"/>
<int value="7" label="Switch to locked profile via User Manager"/>
<int value="8" label="Switch to Guest profile"/>
</enum>
<enum name="ProfileSync" type="int">
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