blob: 889a7a91dbf7b9f339ee2ed7614e8f94a07e92cf [file] [log] [blame]
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/ui/webui/settings/chromeos/people_section.h"
#include "ash/components/account_manager/account_manager_factory.h"
#include "ash/constants/ash_features.h"
#include "ash/constants/ash_pref_names.h"
#include "base/bind.h"
#include "base/i18n/number_formatting.h"
#include "base/metrics/histogram_functions.h"
#include "base/no_destructor.h"
#include "base/strings/strcat.h"
#include "base/strings/string_number_conversions.h"
#include "base/strings/utf_string_conversions.h"
#include "chrome/browser/account_manager_facade_factory.h"
#include "chrome/browser/ash/account_manager/account_manager_util.h"
#include "chrome/browser/ash/login/quick_unlock/quick_unlock_utils.h"
#include "chrome/browser/ash/profiles/profile_helper.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/browser_process_platform_part.h"
#include "chrome/browser/policy/profile_policy_connector.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/supervised_user/supervised_user_service.h"
#include "chrome/browser/ui/ui_features.h"
#include "chrome/browser/ui/webui/chromeos/sync/os_sync_handler.h"
#include "chrome/browser/ui/webui/settings/chromeos/account_manager_handler.h"
#include "chrome/browser/ui/webui/settings/chromeos/fingerprint_handler.h"
#include "chrome/browser/ui/webui/settings/chromeos/os_settings_features_util.h"
#include "chrome/browser/ui/webui/settings/chromeos/parental_controls_handler.h"
#include "chrome/browser/ui/webui/settings/chromeos/quick_unlock_handler.h"
#include "chrome/browser/ui/webui/settings/chromeos/search/search_tag_registry.h"
#include "chrome/browser/ui/webui/settings/people_handler.h"
#include "chrome/browser/ui/webui/settings/profile_info_handler.h"
#include "chrome/browser/ui/webui/settings/shared_settings_localized_strings_provider.h"
#include "chrome/browser/ui/webui/webui_util.h"
#include "chrome/common/pref_names.h"
#include "chrome/common/url_constants.h"
#include "chrome/common/webui_url_constants.h"
#include "chrome/grit/chromium_strings.h"
#include "chrome/grit/generated_resources.h"
#include "components/account_manager_core/account_manager_facade.h"
#include "components/account_manager_core/pref_names.h"
#include "components/google/core/common/google_util.h"
#include "components/omnibox/common/omnibox_features.h"
#include "components/prefs/pref_service.h"
#include "components/sync/driver/sync_service.h"
#include "components/sync/driver/sync_user_settings.h"
#include "components/user_manager/user.h"
#include "components/user_manager/user_manager.h"
#include "content/public/browser/web_ui.h"
#include "content/public/browser/web_ui_data_source.h"
#include "services/network/public/mojom/content_security_policy.mojom.h"
#include "ui/base/l10n/l10n_util.h"
#include "ui/base/webui/web_ui_util.h"
#include "ui/chromeos/devicetype_utils.h"
#include "ui/chromeos/resources/grit/ui_chromeos_resources.h"
namespace chromeos {
namespace settings {
namespace {
using ::ash::IsAccountManagerAvailable;
const std::vector<SearchConcept>& GetPeopleSearchConcepts() {
static const base::NoDestructor<std::vector<SearchConcept>> tags([] {
std::vector<SearchConcept> all_tags({
{IDS_OS_SETTINGS_TAG_PEOPLE_ACCOUNTS,
mojom::kMyAccountsSubpagePath,
mojom::SearchResultIcon::kAvatar,
mojom::SearchResultDefaultRank::kMedium,
mojom::SearchResultType::kSubpage,
{.subpage = mojom::Subpage::kMyAccounts}},
});
if (chromeos::features::IsAccountManagementFlowsV2Enabled()) {
all_tags.insert(all_tags.end(),
{{IDS_OS_SETTINGS_TAG_PEOPLE_V2,
mojom::kPeopleSectionPath,
mojom::SearchResultIcon::kAvatar,
mojom::SearchResultDefaultRank::kMedium,
mojom::SearchResultType::kSection,
{.section = mojom::Section::kPeople}},
{IDS_OS_SETTINGS_TAG_PEOPLE_ACCOUNTS_ADD_V2,
mojom::kMyAccountsSubpagePath,
mojom::SearchResultIcon::kAvatar,
mojom::SearchResultDefaultRank::kMedium,
mojom::SearchResultType::kSetting,
{.setting = mojom::Setting::kAddAccount}}});
} else {
all_tags.insert(
all_tags.end(),
{
{IDS_OS_SETTINGS_TAG_PEOPLE,
mojom::kPeopleSectionPath,
mojom::SearchResultIcon::kAvatar,
mojom::SearchResultDefaultRank::kMedium,
mojom::SearchResultType::kSection,
{.section = mojom::Section::kPeople}},
{IDS_OS_SETTINGS_TAG_PEOPLE_ACCOUNTS_ADD,
mojom::kMyAccountsSubpagePath,
mojom::SearchResultIcon::kAvatar,
mojom::SearchResultDefaultRank::kMedium,
mojom::SearchResultType::kSetting,
{.setting = mojom::Setting::kAddAccount}},
{IDS_OS_SETTINGS_TAG_USERNAMES_AND_PHOTOS,
mojom::kManageOtherPeopleSubpagePath,
mojom::SearchResultIcon::kAvatar,
mojom::SearchResultDefaultRank::kMedium,
mojom::SearchResultType::kSetting,
{.setting = mojom::Setting::kShowUsernamesAndPhotosAtSignIn},
{IDS_OS_SETTINGS_TAG_USERNAMES_AND_PHOTOS_ALT1,
IDS_OS_SETTINGS_TAG_USERNAMES_AND_PHOTOS_ALT2,
SearchConcept::kAltTagEnd}},
{IDS_OS_SETTINGS_TAG_RESTRICT_SIGN_IN_REMOVE,
mojom::kManageOtherPeopleSubpagePath,
mojom::SearchResultIcon::kAvatar,
mojom::SearchResultDefaultRank::kMedium,
mojom::SearchResultType::kSetting,
{.setting = mojom::Setting::kRemoveFromUserAllowlist}},
{IDS_OS_SETTINGS_TAG_GUEST_BROWSING,
mojom::kManageOtherPeopleSubpagePath,
mojom::SearchResultIcon::kAvatar,
mojom::SearchResultDefaultRank::kMedium,
mojom::SearchResultType::kSetting,
{.setting = mojom::Setting::kGuestBrowsing}},
{IDS_OS_SETTINGS_TAG_RESTRICT_SIGN_IN,
mojom::kManageOtherPeopleSubpagePath,
mojom::SearchResultIcon::kAvatar,
mojom::SearchResultDefaultRank::kMedium,
mojom::SearchResultType::kSetting,
{.setting = mojom::Setting::kRestrictSignIn},
{IDS_OS_SETTINGS_TAG_RESTRICT_SIGN_IN_ALT1,
SearchConcept::kAltTagEnd}},
{IDS_OS_SETTINGS_TAG_RESTRICT_SIGN_IN_ADD,
mojom::kManageOtherPeopleSubpagePath,
mojom::SearchResultIcon::kAvatar,
mojom::SearchResultDefaultRank::kMedium,
mojom::SearchResultType::kSetting,
{.setting = mojom::Setting::kAddToUserAllowlist}},
{IDS_OS_SETTINGS_TAG_LOCK_SCREEN_PIN_OR_PASSWORD,
mojom::kSecurityAndSignInSubpagePath,
mojom::SearchResultIcon::kLock,
mojom::SearchResultDefaultRank::kMedium,
mojom::SearchResultType::kSetting,
{.setting = mojom::Setting::kChangeAuthPin},
{IDS_OS_SETTINGS_TAG_LOCK_SCREEN_PIN_OR_PASSWORD_ALT1,
SearchConcept::kAltTagEnd}},
{IDS_OS_SETTINGS_TAG_LOCK_SCREEN_WHEN_WAKING,
mojom::kSecurityAndSignInSubpagePath,
mojom::SearchResultIcon::kLock,
mojom::SearchResultDefaultRank::kMedium,
mojom::SearchResultType::kSetting,
{.setting = mojom::Setting::kLockScreen},
{IDS_OS_SETTINGS_TAG_LOCK_SCREEN_WHEN_WAKING_ALT1,
SearchConcept::kAltTagEnd}},
{IDS_OS_SETTINGS_TAG_LOCK_SCREEN,
mojom::kSecurityAndSignInSubpagePath,
mojom::SearchResultIcon::kLock,
mojom::SearchResultDefaultRank::kMedium,
mojom::SearchResultType::kSubpage,
{.subpage = mojom::Subpage::kSecurityAndSignIn}},
});
}
return all_tags;
}());
return *tags;
}
const std::vector<SearchConcept>& GetRemoveAccountSearchConcepts() {
static const base::NoDestructor<std::vector<SearchConcept>> tags({
{IDS_OS_SETTINGS_TAG_PEOPLE_ACCOUNTS_REMOVE,
mojom::kMyAccountsSubpagePath,
mojom::SearchResultIcon::kAvatar,
mojom::SearchResultDefaultRank::kMedium,
mojom::SearchResultType::kSetting,
{.setting = mojom::Setting::kRemoveAccount}},
});
return *tags;
}
const std::vector<SearchConcept>& GetNonSplitSyncSearchConcepts() {
static const base::NoDestructor<std::vector<SearchConcept>> tags({
{IDS_OS_SETTINGS_TAG_SYNC_AND_GOOGLE_SERVICES,
mojom::kSyncDeprecatedSubpagePath,
mojom::SearchResultIcon::kSync,
mojom::SearchResultDefaultRank::kMedium,
mojom::SearchResultType::kSubpage,
{.subpage = mojom::Subpage::kSyncDeprecated}},
{IDS_OS_SETTINGS_TAG_SYNC_MANAGEMENT,
mojom::kSyncDeprecatedAdvancedSubpagePath,
mojom::SearchResultIcon::kSync,
mojom::SearchResultDefaultRank::kMedium,
mojom::SearchResultType::kSubpage,
{.subpage = mojom::Subpage::kSyncDeprecatedAdvanced}},
{IDS_OS_SETTINGS_TAG_SYNC_ENCRYPTION_OPTIONS,
mojom::kSyncDeprecatedSubpagePath,
mojom::SearchResultIcon::kSync,
mojom::SearchResultDefaultRank::kMedium,
mojom::SearchResultType::kSetting,
{.setting = mojom::Setting::kNonSplitSyncEncryptionOptions},
{IDS_OS_SETTINGS_TAG_SYNC_ENCRYPTION_OPTIONS_ALT1,
SearchConcept::kAltTagEnd}},
{IDS_OS_SETTINGS_TAG_AUTOCOMPLETE_SEARCHES_AND_URLS,
mojom::kSyncDeprecatedSubpagePath,
mojom::SearchResultIcon::kSync,
mojom::SearchResultDefaultRank::kMedium,
mojom::SearchResultType::kSetting,
{.setting = mojom::Setting::kAutocompleteSearchesAndUrls}},
{IDS_OS_SETTINGS_TAG_MAKE_SEARCHES_AND_BROWSER_BETTER,
mojom::kSyncDeprecatedSubpagePath,
mojom::SearchResultIcon::kSync,
mojom::SearchResultDefaultRank::kMedium,
mojom::SearchResultType::kSetting,
{.setting = mojom::Setting::kMakeSearchesAndBrowsingBetter}},
{IDS_OS_SETTINGS_TAG_GOOGLE_DRIVE_SEARCH_SUGGESTIONS,
mojom::kSyncDeprecatedSubpagePath,
mojom::SearchResultIcon::kSync,
mojom::SearchResultDefaultRank::kMedium,
mojom::SearchResultType::kSetting,
{.setting = mojom::Setting::kGoogleDriveSearchSuggestions}},
});
return *tags;
}
const std::vector<SearchConcept>& GetSplitSyncSearchConcepts() {
static const base::NoDestructor<std::vector<SearchConcept>> tags({
{IDS_OS_SETTINGS_TAG_SYNC,
mojom::kSyncSubpagePath,
mojom::SearchResultIcon::kSync,
mojom::SearchResultDefaultRank::kMedium,
mojom::SearchResultType::kSubpage,
{.subpage = mojom::Subpage::kSync}},
});
return *tags;
}
const std::vector<SearchConcept>& GetSplitSyncOnSearchConcepts() {
static const base::NoDestructor<std::vector<SearchConcept>> tags({
{IDS_OS_SETTINGS_TAG_SYNC_TURN_OFF,
mojom::kSyncSubpagePath,
mojom::SearchResultIcon::kSync,
mojom::SearchResultDefaultRank::kMedium,
mojom::SearchResultType::kSetting,
{.setting = mojom::Setting::kSplitSyncOnOff},
{IDS_OS_SETTINGS_TAG_SYNC_TURN_OFF_ALT1, SearchConcept::kAltTagEnd}},
});
return *tags;
}
const std::vector<SearchConcept>& GetSplitSyncOffSearchConcepts() {
static const base::NoDestructor<std::vector<SearchConcept>> tags({
{IDS_OS_SETTINGS_TAG_SYNC_TURN_ON,
mojom::kSyncSubpagePath,
mojom::SearchResultIcon::kSync,
mojom::SearchResultDefaultRank::kMedium,
mojom::SearchResultType::kSetting,
{.setting = mojom::Setting::kSplitSyncOnOff},
{IDS_OS_SETTINGS_TAG_SYNC_TURN_ON_ALT1, SearchConcept::kAltTagEnd}},
});
return *tags;
}
const std::vector<SearchConcept>& GetFingerprintSearchConcepts() {
static const base::NoDestructor<std::vector<SearchConcept>> tags({
{IDS_OS_SETTINGS_TAG_FINGERPRINT_ADD,
mojom::kFingerprintSubpagePath,
mojom::SearchResultIcon::kFingerprint,
mojom::SearchResultDefaultRank::kMedium,
mojom::SearchResultType::kSetting,
{.setting = mojom::Setting::kAddFingerprint}},
{IDS_OS_SETTINGS_TAG_FINGERPRINT,
mojom::kFingerprintSubpagePath,
mojom::SearchResultIcon::kFingerprint,
mojom::SearchResultDefaultRank::kMedium,
mojom::SearchResultType::kSubpage,
{.subpage = mojom::Subpage::kFingerprint}},
});
return *tags;
}
const std::vector<SearchConcept>& GetRemoveFingerprintSearchConcepts() {
static const base::NoDestructor<std::vector<SearchConcept>> tags({
{IDS_OS_SETTINGS_TAG_FINGERPRINT_REMOVE,
mojom::kFingerprintSubpagePath,
mojom::SearchResultIcon::kFingerprint,
mojom::SearchResultDefaultRank::kMedium,
mojom::SearchResultType::kSetting,
{.setting = mojom::Setting::kRemoveFingerprint}},
});
return *tags;
}
const std::vector<SearchConcept>& GetParentalSearchConcepts() {
static const base::NoDestructor<std::vector<SearchConcept>> tags({
{IDS_OS_SETTINGS_TAG_PARENTAL_CONTROLS,
mojom::kPeopleSectionPath,
mojom::SearchResultIcon::kAvatar,
mojom::SearchResultDefaultRank::kMedium,
mojom::SearchResultType::kSetting,
{.setting = mojom::Setting::kSetUpParentalControls},
{IDS_OS_SETTINGS_TAG_PARENTAL_CONTROLS_ALT1,
IDS_OS_SETTINGS_TAG_PARENTAL_CONTROLS_ALT2, SearchConcept::kAltTagEnd}},
});
return *tags;
}
void AddAccountManagerPageStrings(content::WebUIDataSource* html_source,
Profile* profile) {
static constexpr webui::LocalizedString kLocalizedStrings[] = {
{"accountManagerChildFirstMessage",
IDS_SETTINGS_ACCOUNT_MANAGER_CHILD_FIRST_MESSAGE},
{"accountManagerChildSecondMessage",
IDS_SETTINGS_ACCOUNT_MANAGER_CHILD_SECOND_MESSAGE},
{"accountManagerPrimaryAccountTooltip",
IDS_SETTINGS_ACCOUNT_MANAGER_PRIMARY_ACCOUNT_TOOLTIP},
{"accountManagerEducationAccountLabel",
IDS_SETTINGS_ACCOUNT_MANAGER_EDUCATION_ACCOUNT},
{"removeAccountLabel", IDS_SETTINGS_ACCOUNT_MANAGER_REMOVE_ACCOUNT_LABEL},
{"addSchoolAccountLabel",
IDS_SETTINGS_ACCOUNT_MANAGER_ADD_SCHOOL_ACCOUNT_LABEL},
{"accountManagerSecondaryAccountsDisabledChildText",
IDS_SETTINGS_ACCOUNT_MANAGER_SECONDARY_ACCOUNTS_DISABLED_CHILD_TEXT},
{"accountManagerSignedOutAccountName",
IDS_SETTINGS_ACCOUNT_MANAGER_SIGNED_OUT_ACCOUNT_PLACEHOLDER},
{"accountManagerUnmigratedAccountName",
IDS_SETTINGS_ACCOUNT_MANAGER_UNMIGRATED_ACCOUNT_PLACEHOLDER},
{"accountManagerMigrationLabel",
IDS_SETTINGS_ACCOUNT_MANAGER_MIGRATION_LABEL},
{"accountManagerReauthenticationLabel",
IDS_SETTINGS_ACCOUNT_MANAGER_REAUTHENTICATION_LABEL},
{"accountManagerMigrationTooltip",
IDS_SETTINGS_ACCOUNT_MANAGER_MIGRATION_TOOLTIP},
{"accountManagerReauthenticationTooltip",
IDS_SETTINGS_ACCOUNT_MANAGER_REAUTHENTICATION_TOOLTIP},
{"accountManagerMoreActionsTooltip",
IDS_SETTINGS_ACCOUNT_MANAGER_MORE_ACTIONS_TOOLTIP},
{"accountManagerManagedLabel",
IDS_SETTINGS_ACCOUNT_MANAGER_MANAGEMENT_STATUS_MANAGED_ACCOUNT},
{"accountManagerUnmanagedLabel",
IDS_SETTINGS_ACCOUNT_MANAGER_MANAGEMENT_STATUS_UNMANAGED_ACCOUNT},
{"accountListDescription", IDS_SETTINGS_ACCOUNT_MANAGER_LIST_DESCRIPTION},
};
html_source->AddLocalizedStrings(kLocalizedStrings);
user_manager::User* user = ProfileHelper::Get()->GetUserByProfile(profile);
DCHECK(user);
html_source->AddString(
"accountListChildDescription",
l10n_util::GetStringFUTF16(
IDS_SETTINGS_ACCOUNT_MANAGER_LIST_CHILD_DESCRIPTION,
base::UTF8ToUTF16(user->GetDisplayEmail())));
html_source->AddString("accountManagerLearnMoreUrl",
chrome::kAccountManagerLearnMoreURL);
html_source->AddLocalizedString(
"accountManagerManagementDescription",
profile->IsChild() ? IDS_SETTINGS_ACCOUNT_MANAGER_MANAGEMENT_STATUS_CHILD
: IDS_SETTINGS_ACCOUNT_MANAGER_MANAGEMENT_STATUS);
html_source->AddString("accountManagerChromeUIManagementURL",
base::UTF8ToUTF16(chrome::kChromeUIManagementURL));
if (chromeos::features::IsAccountManagementFlowsV2Enabled()) {
static constexpr webui::LocalizedString kLocalizedStringsV2[] = {
{"addAccountLabel", IDS_SETTINGS_ACCOUNT_MANAGER_ADD_ACCOUNT_LABEL_V2},
{"accountListHeader", IDS_SETTINGS_ACCOUNT_MANAGER_LIST_HEADER_V2},
{"accountListHeaderChild",
IDS_SETTINGS_ACCOUNT_MANAGER_LIST_HEADER_CHILD},
{"accountManagerDescription",
IDS_SETTINGS_ACCOUNT_MANAGER_DESCRIPTION_V2},
{"accountManagerChildDescription",
IDS_SETTINGS_ACCOUNT_MANAGER_CHILD_DESCRIPTION_V2},
{"accountManagerSecondaryAccountsDisabledText",
IDS_SETTINGS_ACCOUNT_MANAGER_SECONDARY_ACCOUNTS_DISABLED_TEXT_V2},
};
html_source->AddLocalizedStrings(kLocalizedStringsV2);
} else {
static constexpr webui::LocalizedString kLocalizedStringsV1[] = {
{"accountManagerDescription", IDS_SETTINGS_ACCOUNT_MANAGER_DESCRIPTION},
{"accountManagerChildDescription",
IDS_SETTINGS_ACCOUNT_MANAGER_CHILD_DESCRIPTION},
{"addAccountLabel", IDS_SETTINGS_ACCOUNT_MANAGER_ADD_ACCOUNT_LABEL},
{"accountListHeader", IDS_SETTINGS_ACCOUNT_MANAGER_LIST_HEADER},
{"accountManagerSecondaryAccountsDisabledText",
IDS_SETTINGS_ACCOUNT_MANAGER_SECONDARY_ACCOUNTS_DISABLED_TEXT},
};
html_source->AddLocalizedStrings(kLocalizedStringsV1);
}
}
void AddLockScreenPageStrings(content::WebUIDataSource* html_source,
PrefService* pref_service) {
static constexpr webui::LocalizedString kLocalizedStrings[] = {
{"lockScreenNotificationTitle",
IDS_ASH_SETTINGS_LOCK_SCREEN_NOTIFICATION_TITLE},
{"lockScreenNotificationHideSensitive",
IDS_ASH_SETTINGS_LOCK_SCREEN_NOTIFICATION_HIDE_SENSITIVE},
{"enableScreenlock", IDS_SETTINGS_PEOPLE_ENABLE_SCREENLOCK},
{"lockScreenNotificationShow",
IDS_ASH_SETTINGS_LOCK_SCREEN_NOTIFICATION_SHOW},
{"lockScreenPinOrPassword",
IDS_SETTINGS_PEOPLE_LOCK_SCREEN_PIN_OR_PASSWORD},
{"lockScreenPinAutoSubmit",
IDS_SETTINGS_PEOPLE_LOCK_SCREEN_PIN_AUTOSUBMIT},
{"lockScreenSetupFingerprintButton",
IDS_SETTINGS_PEOPLE_LOCK_SCREEN_FINGERPRINT_SETUP_BUTTON},
{"lockScreenNotificationHide",
IDS_ASH_SETTINGS_LOCK_SCREEN_NOTIFICATION_HIDE},
{"lockScreenEditFingerprints",
IDS_SETTINGS_PEOPLE_LOCK_SCREEN_EDIT_FINGERPRINTS},
{"lockScreenPasswordOnly", IDS_SETTINGS_PEOPLE_LOCK_SCREEN_PASSWORD_ONLY},
{"lockScreenChangePinButton",
IDS_SETTINGS_PEOPLE_LOCK_SCREEN_CHANGE_PIN_BUTTON},
{"lockScreenEditFingerprintsDescription",
IDS_SETTINGS_PEOPLE_LOCK_SCREEN_EDIT_FINGERPRINTS_DESCRIPTION},
{"lockScreenNone", IDS_SETTINGS_PEOPLE_LOCK_SCREEN_NONE},
{"lockScreenFingerprintNewName",
IDS_SETTINGS_PEOPLE_LOCK_SCREEN_NEW_FINGERPRINT_DEFAULT_NAME},
{"lockScreenDeleteFingerprintLabel",
IDS_SETTINGS_PEOPLE_LOCK_SCREEN_DELETE_FINGERPRINT_ARIA_LABEL},
{"lockScreenOptionsLock", IDS_SETTINGS_PEOPLE_LOCK_SCREEN_OPTIONS_LOCK},
{"lockScreenOptionsLoginLock",
IDS_SETTINGS_PEOPLE_LOCK_SCREEN_OPTIONS_LOGIN_LOCK},
{"lockScreenSetupPinButton",
IDS_SETTINGS_PEOPLE_LOCK_SCREEN_SETUP_PIN_BUTTON},
{"lockScreenTitleLock", IDS_SETTINGS_PEOPLE_LOCK_SCREEN_TITLE_LOCK},
{"passwordPromptEnterPasswordLock",
IDS_SETTINGS_PEOPLE_PASSWORD_PROMPT_ENTER_PASSWORD_LOCK},
{"pinAutoSubmitPrompt",
IDS_SETTINGS_PEOPLE_LOCK_SCREEN_PIN_AUTOSUBMIT_PROMPT},
{"pinAutoSubmitLongPinError",
IDS_SETTINGS_PEOPLE_LOCK_SCREEN_PIN_AUTOSUBMIT_ERROR_PIN_TOO_LONG},
{"pinAutoSubmitPinIncorrect",
IDS_SETTINGS_PEOPLE_LOCK_SCREEN_PIN_AUTOSUBMIT_ERROR_PIN_INCORRECT},
{"passwordPromptEnterPasswordLoginLock",
IDS_SETTINGS_PEOPLE_PASSWORD_PROMPT_ENTER_PASSWORD_LOGIN_LOCK},
};
html_source->AddLocalizedStrings(kLocalizedStrings);
html_source->AddBoolean("quickUnlockEnabled",
chromeos::quick_unlock::IsPinEnabled());
html_source->AddBoolean("quickUnlockPinAutosubmitFeatureEnabled",
chromeos::features::IsPinAutosubmitFeatureEnabled());
html_source->AddBoolean(
"quickUnlockDisabledByPolicy",
chromeos::quick_unlock::IsPinDisabledByPolicy(pref_service));
html_source->AddBoolean("lockScreenNotificationsEnabled",
ash::features::IsLockScreenNotificationsEnabled());
html_source->AddBoolean(
"lockScreenHideSensitiveNotificationsSupported",
ash::features::IsLockScreenHideSensitiveNotificationsSupported());
html_source->AddString("lockScreenFingerprintNotice",
l10n_util::GetStringFUTF16(
IDS_SETTINGS_PEOPLE_LOCK_SCREEN_FINGERPRINT_NOTICE,
ui::GetChromeOSDeviceName()));
html_source->AddString("fingerprintLearnMoreLink",
chrome::kFingerprintLearnMoreURL);
if (chromeos::features::IsAccountManagementFlowsV2Enabled()) {
html_source->AddLocalizedString(
"lockScreenTitleLoginLock",
IDS_SETTINGS_PEOPLE_LOCK_SCREEN_TITLE_LOGIN_LOCK_V2);
} else {
html_source->AddLocalizedString(
"lockScreenTitleLoginLock",
IDS_SETTINGS_PEOPLE_LOCK_SCREEN_TITLE_LOGIN_LOCK);
}
}
void AddFingerprintListStrings(content::WebUIDataSource* html_source) {
static constexpr webui::LocalizedString kLocalizedStrings[] = {
{"lockScreenAddFingerprint",
IDS_SETTINGS_PEOPLE_LOCK_SCREEN_ADD_FINGERPRINT_BUTTON},
{"lockScreenRegisteredFingerprints",
IDS_SETTINGS_PEOPLE_LOCK_SCREEN_REGISTERED_FINGERPRINTS_LABEL},
{"lockScreenFingerprintWarning",
IDS_SETTINGS_PEOPLE_LOCK_SCREEN_FINGERPRINT_LESS_SECURE},
};
html_source->AddLocalizedStrings(kLocalizedStrings);
}
void AddFingerprintResources(content::WebUIDataSource* html_source,
bool are_fingerprint_settings_allowed) {
html_source->AddBoolean("fingerprintUnlockEnabled",
are_fingerprint_settings_allowed);
if (are_fingerprint_settings_allowed) {
chromeos::quick_unlock::AddFingerprintResources(html_source);
}
int instruction_id, aria_label_id;
bool aria_label_includes_device = false;
using FingerprintLocation = chromeos::quick_unlock::FingerprintLocation;
switch (chromeos::quick_unlock::GetFingerprintLocation()) {
case FingerprintLocation::TABLET_POWER_BUTTON:
instruction_id =
IDS_SETTINGS_ADD_FINGERPRINT_DIALOG_INSTRUCTION_LOCATE_SCANNER_POWER_BUTTON;
aria_label_id =
IDS_SETTINGS_ADD_FINGERPRINT_DIALOG_INSTRUCTION_LOCATE_SCANNER_POWER_BUTTON_ARIA_LABEL;
break;
case FingerprintLocation::KEYBOARD_BOTTOM_LEFT:
instruction_id =
IDS_SETTINGS_ADD_FINGERPRINT_DIALOG_INSTRUCTION_LOCATE_SCANNER_KEYBOARD;
aria_label_id =
IDS_SETTINGS_ADD_FINGERPRINT_DIALOG_INSTRUCTION_LOCATE_SCANNER_KEYBOARD_BOTTOM_LEFT_ARIA_LABEL;
break;
case FingerprintLocation::KEYBOARD_BOTTOM_RIGHT:
instruction_id =
IDS_SETTINGS_ADD_FINGERPRINT_DIALOG_INSTRUCTION_LOCATE_SCANNER_KEYBOARD;
aria_label_id =
IDS_SETTINGS_ADD_FINGERPRINT_DIALOG_INSTRUCTION_LOCATE_SCANNER_KEYBOARD_BOTTOM_RIGHT_ARIA_LABEL;
break;
case FingerprintLocation::KEYBOARD_TOP_RIGHT:
instruction_id =
IDS_SETTINGS_ADD_FINGERPRINT_DIALOG_INSTRUCTION_LOCATE_SCANNER_KEYBOARD;
aria_label_id =
IDS_SETTINGS_ADD_FINGERPRINT_DIALOG_INSTRUCTION_LOCATE_SCANNER_KEYBOARD_TOP_RIGHT_ARIA_LABEL;
break;
case quick_unlock::FingerprintLocation::RIGHT_SIDE:
instruction_id =
IDS_SETTINGS_ADD_FINGERPRINT_DIALOG_INSTRUCTION_LOCATE_SCANNER_KEYBOARD;
aria_label_id =
IDS_SETTINGS_ADD_FINGERPRINT_DIALOG_INSTRUCTION_LOCATE_SCANNER_RIGHT_SIDE_ARIA_LABEL;
aria_label_includes_device = true;
break;
case quick_unlock::FingerprintLocation::LEFT_SIDE:
instruction_id =
IDS_SETTINGS_ADD_FINGERPRINT_DIALOG_INSTRUCTION_LOCATE_SCANNER_KEYBOARD;
aria_label_id =
IDS_SETTINGS_ADD_FINGERPRINT_DIALOG_INSTRUCTION_LOCATE_SCANNER_LEFT_SIDE_ARIA_LABEL;
aria_label_includes_device = true;
break;
case FingerprintLocation::UNKNOWN:
instruction_id =
IDS_SETTINGS_ADD_FINGERPRINT_DIALOG_INSTRUCTION_LOCATE_SCANNER_KEYBOARD;
aria_label_id =
IDS_SETTINGS_ADD_FINGERPRINT_DIALOG_INSTRUCTION_LOCATE_SCANNER_KEYBOARD;
break;
}
html_source->AddLocalizedString(
"configureFingerprintInstructionLocateScannerStep", instruction_id);
if (aria_label_includes_device) {
html_source->AddString(
"configureFingerprintScannerStepAriaLabel",
l10n_util::GetStringFUTF16(aria_label_id, ui::GetChromeOSDeviceName()));
} else {
html_source->AddLocalizedString("configureFingerprintScannerStepAriaLabel",
aria_label_id);
}
}
void AddSetupFingerprintDialogStrings(content::WebUIDataSource* html_source) {
static constexpr webui::LocalizedString kLocalizedStrings[] = {
{"configureFingerprintTitle", IDS_SETTINGS_ADD_FINGERPRINT_DIALOG_TITLE},
{"configureFingerprintAddAnotherButton",
IDS_SETTINGS_ADD_FINGERPRINT_DIALOG_ADD_ANOTHER_BUTTON},
{"configureFingerprintInstructionReadyStep",
IDS_SETTINGS_ADD_FINGERPRINT_DIALOG_INSTRUCTION_READY},
{"configureFingerprintLiftFinger",
IDS_SETTINGS_ADD_FINGERPRINT_DIALOG_LIFT_FINGER},
{"configureFingerprintTryAgain",
IDS_SETTINGS_ADD_FINGERPRINT_DIALOG_TRY_AGAIN},
{"configureFingerprintImmobile",
IDS_SETTINGS_ADD_FINGERPRINT_DIALOG_FINGER_IMMOBILE},
};
html_source->AddLocalizedStrings(kLocalizedStrings);
}
void AddSetupPinDialogStrings(content::WebUIDataSource* html_source) {
static constexpr webui::LocalizedString kLocalizedStrings[] = {
{"configurePinChoosePinTitle",
IDS_SETTINGS_PEOPLE_CONFIGURE_PIN_CHOOSE_PIN_TITLE},
{"configurePinConfirmPinTitle",
IDS_SETTINGS_PEOPLE_CONFIGURE_PIN_CONFIRM_PIN_TITLE},
{"invalidPin", IDS_SETTINGS_PEOPLE_PIN_PROMPT_INVALID_PIN},
{"configurePinMismatched", IDS_SETTINGS_PEOPLE_CONFIGURE_PIN_MISMATCHED},
{"configurePinTooShort", IDS_SETTINGS_PEOPLE_CONFIGURE_PIN_TOO_SHORT},
{"configurePinTooLong", IDS_SETTINGS_PEOPLE_CONFIGURE_PIN_TOO_LONG},
{"configurePinWeakPin", IDS_SETTINGS_PEOPLE_CONFIGURE_PIN_WEAK_PIN},
{"internalError", IDS_SETTINGS_PEOPLE_CONFIGURE_PIN_INTERNAL_ERROR},
{"pinKeyboardPlaceholderPin", IDS_PIN_KEYBOARD_HINT_TEXT_PIN},
{"pinKeyboardPlaceholderPinPassword",
IDS_PIN_KEYBOARD_HINT_TEXT_PIN_PASSWORD},
{"pinKeyboardDeleteAccessibleName",
IDS_PIN_KEYBOARD_DELETE_ACCESSIBLE_NAME},
};
html_source->AddLocalizedStrings(kLocalizedStrings);
// Format numbers to be used on the pin keyboard.
for (int j = 0; j <= 9; j++) {
html_source->AddString("pinKeyboard" + base::NumberToString(j),
base::FormatNumber(int64_t{j}));
}
}
void AddSyncControlsStrings(content::WebUIDataSource* html_source) {
static constexpr webui::LocalizedString kLocalizedStrings[] = {
{"syncEverythingCheckboxLabel",
IDS_SETTINGS_SYNC_EVERYTHING_CHECKBOX_LABEL},
{"wallpaperCheckboxLabel", IDS_OS_SETTINGS_WALLPAPER_CHECKBOX_LABEL},
{"osSyncTurnOff", IDS_OS_SETTINGS_SYNC_TURN_OFF},
{"osSyncSettingsCheckboxLabel",
IDS_OS_SETTINGS_SYNC_SETTINGS_CHECKBOX_LABEL},
{"osSyncWifiConfigurationsCheckboxLabel",
IDS_OS_SETTINGS_WIFI_CONFIGURATIONS_CHECKBOX_LABEL},
{"osSyncAppsCheckboxLabel", IDS_OS_SETTINGS_SYNC_APPS_CHECKBOX_LABEL},
{"osSyncTurnOn", IDS_OS_SETTINGS_SYNC_TURN_ON},
{"osSyncFeatureLabel", IDS_OS_SETTINGS_SYNC_FEATURE_LABEL},
};
html_source->AddLocalizedStrings(kLocalizedStrings);
html_source->AddBoolean("splitSettingsSyncEnabled",
chromeos::features::IsSplitSettingsSyncEnabled());
html_source->AddBoolean("useBrowserSyncConsent",
chromeos::features::ShouldUseBrowserSyncConsent());
html_source->AddString(
"browserSettingsSyncSetupUrl",
base::StrCat({chrome::kChromeUISettingsURL, chrome::kSyncSetupSubPage}));
}
void AddUsersStrings(content::WebUIDataSource* html_source) {
static constexpr webui::LocalizedString kLocalizedStrings[] = {
{"usersModifiedByOwnerLabel", IDS_SETTINGS_USERS_MODIFIED_BY_OWNER_LABEL},
{"guestBrowsingLabel", IDS_SETTINGS_USERS_GUEST_BROWSING_LABEL},
{"settingsManagedLabel", IDS_SETTINGS_USERS_MANAGED_LABEL},
{"showOnSigninLabel", IDS_SETTINGS_USERS_SHOW_ON_SIGNIN_LABEL},
{"restrictSigninLabel", IDS_SETTINGS_USERS_RESTRICT_SIGNIN_LABEL},
{"deviceOwnerLabel", IDS_SETTINGS_USERS_DEVICE_OWNER_LABEL},
{"removeUserTooltip", IDS_SETTINGS_USERS_REMOVE_USER_TOOLTIP},
{"addUsers", IDS_SETTINGS_USERS_ADD_USERS},
{"addUsersEmail", IDS_SETTINGS_USERS_ADD_USERS_EMAIL},
{"userExistsError", IDS_SETTINGS_USER_EXISTS_ERROR},
};
html_source->AddLocalizedStrings(kLocalizedStrings);
}
void AddParentalControlStrings(content::WebUIDataSource* html_source,
bool are_parental_control_settings_allowed,
SupervisedUserService* supervised_user_service) {
static constexpr webui::LocalizedString kLocalizedStrings[] = {
{"parentalControlsPageTitle", IDS_SETTINGS_PARENTAL_CONTROLS_PAGE_TITLE},
{"parentalControlsPageSetUpLabel",
IDS_SETTINGS_PARENTAL_CONTROLS_PAGE_SET_UP_LABEL},
{"parentalControlsPageViewSettingsLabel",
IDS_SETTINGS_PARENTAL_CONTROLS_PAGE_VIEW_SETTINGS_LABEL},
{"parentalControlsPageConnectToInternetLabel",
IDS_SETTINGS_PARENTAL_CONTROLS_PAGE_CONNECT_TO_INTERNET_LABEL},
{"parentalControlsSetUpButtonLabel",
IDS_SETTINGS_PARENTAL_CONTROLS_SET_UP_BUTTON_LABEL},
{"parentalControlsSetUpButtonRole",
IDS_SETTINGS_PARENTAL_CONTROLS_SET_UP_BUTTON_ROLE},
};
html_source->AddLocalizedStrings(kLocalizedStrings);
html_source->AddBoolean("showParentalControls",
are_parental_control_settings_allowed);
bool is_child = user_manager::UserManager::Get()->IsLoggedInAsChildUser();
html_source->AddBoolean("isChild", is_child);
std::u16string tooltip;
if (is_child) {
std::string custodian = supervised_user_service->GetCustodianName();
std::string second_custodian =
supervised_user_service->GetSecondCustodianName();
std::u16string child_managed_tooltip;
if (second_custodian.empty()) {
child_managed_tooltip = l10n_util::GetStringFUTF16(
IDS_SETTINGS_ACCOUNT_MANAGER_CHILD_MANAGED_BY_ONE_PARENT_TOOLTIP,
base::UTF8ToUTF16(custodian));
} else {
child_managed_tooltip = l10n_util::GetStringFUTF16(
IDS_SETTINGS_ACCOUNT_MANAGER_CHILD_MANAGED_BY_TWO_PARENTS_TOOLTIP,
base::UTF8ToUTF16(custodian), base::UTF8ToUTF16(second_custodian));
}
tooltip = child_managed_tooltip;
}
html_source->AddString("accountManagerPrimaryAccountChildManagedTooltip",
tooltip);
}
bool IsSameAccount(const ::account_manager::AccountKey& account_key,
const AccountId& account_id) {
switch (account_key.account_type) {
case account_manager::AccountType::kGaia:
return account_id.GetAccountType() == AccountType::GOOGLE &&
account_id.GetGaiaId() == account_key.id;
case account_manager::AccountType::kActiveDirectory:
return account_id.GetAccountType() == AccountType::ACTIVE_DIRECTORY &&
account_id.GetObjGuid() == account_key.id;
}
}
} // namespace
PeopleSection::PeopleSection(
Profile* profile,
SearchTagRegistry* search_tag_registry,
syncer::SyncService* sync_service,
SupervisedUserService* supervised_user_service,
signin::IdentityManager* identity_manager,
PrefService* pref_service)
: OsSettingsSection(profile, search_tag_registry),
sync_service_(sync_service),
supervised_user_service_(supervised_user_service),
identity_manager_(identity_manager),
pref_service_(pref_service) {
// No search tags are registered if in guest mode.
if (features::IsGuestModeActive())
return;
SearchTagRegistry::ScopedTagUpdater updater = registry()->StartUpdate();
updater.AddSearchTags(GetPeopleSearchConcepts());
// TODO(jamescook): Sort out how account management is split between Chrome
// OS and browser settings.
if (IsAccountManagerAvailable(profile)) {
// Some Account Manager search tags are added/removed dynamically.
auto* factory =
g_browser_process->platform_part()->GetAccountManagerFactory();
account_manager_ = factory->GetAccountManager(profile->GetPath().value());
DCHECK(account_manager_);
account_manager_facade_ =
::GetAccountManagerFacade(profile->GetPath().value());
DCHECK(account_manager_facade_);
account_manager_facade_observation_.Observe(account_manager_facade_);
FetchAccounts();
}
if (chromeos::features::IsSplitSettingsSyncEnabled()) {
if (sync_service_) {
updater.AddSearchTags(GetSplitSyncSearchConcepts());
// Sync search tags are added/removed dynamically.
sync_service_->AddObserver(this);
OnStateChanged(sync_service_);
}
} else {
updater.AddSearchTags(GetNonSplitSyncSearchConcepts());
}
// Parental control search tags are added if necessary and do not update
// dynamically during a user session.
if (features::ShouldShowParentalControlSettings(profile))
updater.AddSearchTags(GetParentalSearchConcepts());
// Fingerprint search tags are added if necessary. Remove fingerprint search
// tags update dynamically during a user session.
if (AreFingerprintSettingsAllowed() &&
!chromeos::features::IsAccountManagementFlowsV2Enabled()) {
updater.AddSearchTags(GetFingerprintSearchConcepts());
fingerprint_pref_change_registrar_.Init(pref_service_);
fingerprint_pref_change_registrar_.Add(
::prefs::kQuickUnlockFingerprintRecord,
base::BindRepeating(&PeopleSection::UpdateRemoveFingerprintSearchTags,
base::Unretained(this)));
UpdateRemoveFingerprintSearchTags();
}
}
PeopleSection::~PeopleSection() {
if (chromeos::features::IsSplitSettingsSyncEnabled() && sync_service_)
sync_service_->RemoveObserver(this);
}
void PeopleSection::AddLoadTimeData(content::WebUIDataSource* html_source) {
static constexpr webui::LocalizedString kLocalizedStrings[] = {
{"osPeoplePageTitle", IDS_OS_SETTINGS_PEOPLE},
{"accountManagerSubMenuLabel",
IDS_SETTINGS_ACCOUNT_MANAGER_SUBMENU_LABEL},
{"accountManagerPageTitle", IDS_SETTINGS_ACCOUNT_MANAGER_PAGE_TITLE},
{"accountManagerPageTitle", IDS_SETTINGS_ACCOUNT_MANAGER_PAGE_TITLE},
{"lockScreenFingerprintTitle",
IDS_SETTINGS_PEOPLE_LOCK_SCREEN_FINGERPRINT_SUBPAGE_TITLE},
{"manageOtherPeople", IDS_SETTINGS_PEOPLE_MANAGE_OTHER_PEOPLE},
{"osSyncPageTitle", IDS_OS_SETTINGS_SYNC_PAGE_TITLE},
{"syncAndNonPersonalizedServices",
IDS_SETTINGS_SYNC_SYNC_AND_NON_PERSONALIZED_SERVICES},
{"syncDisconnectConfirm", IDS_SETTINGS_SYNC_DISCONNECT_CONFIRM},
};
html_source->AddLocalizedStrings(kLocalizedStrings);
user_manager::User* user = ProfileHelper::Get()->GetUserByProfile(profile());
DCHECK(user);
if (chromeos::features::IsAccountManagementFlowsV2Enabled()) {
html_source->AddLocalizedString("osPeoplePageTitle",
IDS_OS_SETTINGS_PEOPLE_V2);
// This string is not used if the flag is disabled.
html_source->AddString("osProfileName", l10n_util::GetStringFUTF16(
IDS_OS_SETTINGS_PROFILE_NAME,
user->GetGivenName()));
html_source->AddString(
"accountManagerPageTitle",
l10n_util::GetStringFUTF16(IDS_SETTINGS_ACCOUNT_MANAGER_PAGE_TITLE_V2,
user->GetGivenName()));
} else {
static constexpr webui::LocalizedString kAccountManagerStrings[] = {
{"osPeoplePageTitle", IDS_OS_SETTINGS_PEOPLE},
{"accountManagerPageTitle", IDS_SETTINGS_ACCOUNT_MANAGER_PAGE_TITLE},
};
html_source->AddLocalizedStrings(kAccountManagerStrings);
}
// Toggles the Chrome OS Account Manager submenu in the People section.
html_source->AddBoolean("isAccountManagerEnabled",
account_manager_facade_ != nullptr);
html_source->AddBoolean(
"isAccountManagementFlowsV2Enabled",
chromeos::features::IsAccountManagementFlowsV2Enabled());
html_source->AddBoolean(
"isDeviceAccountManaged",
user->IsActiveDirectoryUser() ||
profile()->GetProfilePolicyConnector()->IsManaged());
if (chromeos::features::ShouldUseBrowserSyncConsent()) {
static constexpr webui::LocalizedString kTurnOffStrings[] = {
{"syncDisconnect", IDS_SETTINGS_PEOPLE_SYNC_TURN_OFF},
{"syncDisconnectTitle",
IDS_SETTINGS_TURN_OFF_SYNC_AND_SIGN_OUT_DIALOG_TITLE},
};
html_source->AddLocalizedStrings(kTurnOffStrings);
} else {
static constexpr webui::LocalizedString kSignOutStrings[] = {
{"syncDisconnect", IDS_SETTINGS_PEOPLE_SIGN_OUT},
{"syncDisconnectTitle", IDS_SETTINGS_SYNC_DISCONNECT_TITLE},
};
html_source->AddLocalizedStrings(kSignOutStrings);
}
std::string sync_dashboard_url =
google_util::AppendGoogleLocaleParam(
GURL(chrome::kSyncGoogleDashboardURL),
g_browser_process->GetApplicationLocale())
.spec();
html_source->AddString(
"syncDisconnectExplanation",
l10n_util::GetStringFUTF8(IDS_SETTINGS_SYNC_DISCONNECT_EXPLANATION,
base::ASCIIToUTF16(sync_dashboard_url)));
html_source->AddBoolean(
"secondaryGoogleAccountSigninAllowed",
pref_service_->GetBoolean(
::account_manager::prefs::kSecondaryGoogleAccountSigninAllowed));
html_source->AddBoolean(
"driveSuggestAvailable",
base::FeatureList::IsEnabled(omnibox::kDocumentProvider));
AddAccountManagerPageStrings(html_source, profile());
AddLockScreenPageStrings(html_source, profile()->GetPrefs());
AddFingerprintListStrings(html_source);
AddFingerprintResources(html_source, AreFingerprintSettingsAllowed());
AddSetupFingerprintDialogStrings(html_source);
AddSetupPinDialogStrings(html_source);
AddSyncControlsStrings(html_source);
AddUsersStrings(html_source);
AddParentalControlStrings(
html_source, features::ShouldShowParentalControlSettings(profile()),
supervised_user_service_);
::settings::AddSyncControlsStrings(html_source);
::settings::AddSyncAccountControlStrings(html_source);
::settings::AddPasswordPromptDialogStrings(html_source);
::settings::AddSyncPageStrings(html_source);
}
void PeopleSection::AddHandlers(content::WebUI* web_ui) {
web_ui->AddMessageHandler(
std::make_unique<::settings::PeopleHandler>(profile()));
web_ui->AddMessageHandler(
std::make_unique<::settings::ProfileInfoHandler>(profile()));
if (account_manager_facade_) {
web_ui->AddMessageHandler(
std::make_unique<chromeos::settings::AccountManagerUIHandler>(
account_manager_, account_manager_facade_, identity_manager_));
}
if (chromeos::features::IsSplitSettingsSyncEnabled())
web_ui->AddMessageHandler(std::make_unique<OSSyncHandler>(profile()));
web_ui->AddMessageHandler(
std::make_unique<chromeos::settings::QuickUnlockHandler>(profile(),
pref_service_));
web_ui->AddMessageHandler(
std::make_unique<chromeos::settings::FingerprintHandler>(profile()));
if (!profile()->IsGuestSession() &&
features::ShouldShowParentalControlSettings(profile())) {
web_ui->AddMessageHandler(
std::make_unique<chromeos::settings::ParentalControlsHandler>(
profile()));
}
}
int PeopleSection::GetSectionNameMessageId() const {
return IDS_OS_SETTINGS_PEOPLE;
}
mojom::Section PeopleSection::GetSection() const {
return mojom::Section::kPeople;
}
mojom::SearchResultIcon PeopleSection::GetSectionIcon() const {
return mojom::SearchResultIcon::kAvatar;
}
std::string PeopleSection::GetSectionPath() const {
return mojom::kPeopleSectionPath;
}
bool PeopleSection::LogMetric(mojom::Setting setting,
base::Value& value) const {
switch (setting) {
case mojom::Setting::kAddAccount:
base::UmaHistogramCounts1000("ChromeOS.Settings.People.AddAccountCount",
value.GetInt());
return true;
default:
return false;
}
}
void PeopleSection::RegisterHierarchy(HierarchyGenerator* generator) const {
generator->RegisterTopLevelSetting(mojom::Setting::kSetUpParentalControls);
// My accounts.
generator->RegisterTopLevelSubpage(
IDS_SETTINGS_ACCOUNT_MANAGER_PAGE_TITLE, mojom::Subpage::kMyAccounts,
mojom::SearchResultIcon::kAvatar, mojom::SearchResultDefaultRank::kMedium,
mojom::kMyAccountsSubpagePath);
static constexpr mojom::Setting kMyAccountsSettings[] = {
mojom::Setting::kAddAccount,
mojom::Setting::kRemoveAccount,
};
RegisterNestedSettingBulk(mojom::Subpage::kMyAccounts, kMyAccountsSettings,
generator);
// Combined browser/OS sync.
generator->RegisterTopLevelSubpage(
IDS_SETTINGS_SYNC_SYNC_AND_NON_PERSONALIZED_SERVICES,
mojom::Subpage::kSyncDeprecated, mojom::SearchResultIcon::kSync,
mojom::SearchResultDefaultRank::kMedium,
mojom::kSyncDeprecatedSubpagePath);
static constexpr mojom::Setting kSyncDeprecatedSettings[] = {
mojom::Setting::kNonSplitSyncEncryptionOptions,
mojom::Setting::kAutocompleteSearchesAndUrls,
mojom::Setting::kMakeSearchesAndBrowsingBetter,
mojom::Setting::kGoogleDriveSearchSuggestions,
};
RegisterNestedSettingBulk(mojom::Subpage::kSyncDeprecated,
kSyncDeprecatedSettings, generator);
generator->RegisterNestedSubpage(
IDS_SETTINGS_SYNC_ADVANCED_PAGE_TITLE,
mojom::Subpage::kSyncDeprecatedAdvanced, mojom::Subpage::kSyncDeprecated,
mojom::SearchResultIcon::kSync, mojom::SearchResultDefaultRank::kMedium,
mojom::kSyncDeprecatedAdvancedSubpagePath);
// OS sync.
generator->RegisterTopLevelSubpage(
IDS_OS_SETTINGS_SYNC_PAGE_TITLE, mojom::Subpage::kSync,
mojom::SearchResultIcon::kSync, mojom::SearchResultDefaultRank::kMedium,
mojom::kSyncSubpagePath);
generator->RegisterNestedSetting(mojom::Setting::kSplitSyncOnOff,
mojom::Subpage::kSync);
// Security and sign-in.
generator->RegisterTopLevelSubpage(
IDS_SETTINGS_PEOPLE_LOCK_SCREEN_TITLE_LOGIN_LOCK,
mojom::Subpage::kSecurityAndSignIn, mojom::SearchResultIcon::kLock,
mojom::SearchResultDefaultRank::kMedium,
mojom::kSecurityAndSignInSubpagePath);
static constexpr mojom::Setting kSecurityAndSignInSettings[] = {
mojom::Setting::kLockScreen,
mojom::Setting::kChangeAuthPin,
};
RegisterNestedSettingBulk(mojom::Subpage::kSecurityAndSignIn,
kSecurityAndSignInSettings, generator);
// Fingerprint.
generator->RegisterNestedSubpage(
IDS_SETTINGS_PEOPLE_LOCK_SCREEN_FINGERPRINT_SUBPAGE_TITLE,
mojom::Subpage::kFingerprint, mojom::Subpage::kSecurityAndSignIn,
mojom::SearchResultIcon::kFingerprint,
mojom::SearchResultDefaultRank::kMedium, mojom::kFingerprintSubpagePath);
static constexpr mojom::Setting kFingerprintSettings[] = {
mojom::Setting::kAddFingerprint,
mojom::Setting::kRemoveFingerprint,
};
RegisterNestedSettingBulk(mojom::Subpage::kFingerprint, kFingerprintSettings,
generator);
// Manage other people.
generator->RegisterTopLevelSubpage(IDS_SETTINGS_PEOPLE_MANAGE_OTHER_PEOPLE,
mojom::Subpage::kManageOtherPeople,
mojom::SearchResultIcon::kAvatar,
mojom::SearchResultDefaultRank::kMedium,
mojom::kManageOtherPeopleSubpagePath);
static constexpr mojom::Setting kManageOtherPeopleSettings[] = {
mojom::Setting::kGuestBrowsing,
mojom::Setting::kShowUsernamesAndPhotosAtSignIn,
mojom::Setting::kRestrictSignIn,
mojom::Setting::kAddToUserAllowlist,
mojom::Setting::kRemoveFromUserAllowlist,
};
RegisterNestedSettingBulk(mojom::Subpage::kManageOtherPeople,
kManageOtherPeopleSettings, generator);
}
void PeopleSection::FetchAccounts() {
account_manager_facade_->GetAccounts(
base::BindOnce(&PeopleSection::UpdateAccountManagerSearchTags,
weak_factory_.GetWeakPtr()));
}
void PeopleSection::OnAccountUpserted(
const ::account_manager::Account& account) {
FetchAccounts();
}
void PeopleSection::OnAccountRemoved(
const ::account_manager::Account& account) {
FetchAccounts();
}
void PeopleSection::UpdateAccountManagerSearchTags(
const std::vector<::account_manager::Account>& accounts) {
DCHECK(IsAccountManagerAvailable(profile()));
// Start with no Account Manager search tags.
SearchTagRegistry::ScopedTagUpdater updater = registry()->StartUpdate();
updater.RemoveSearchTags(GetRemoveAccountSearchConcepts());
user_manager::User* user = ProfileHelper::Get()->GetUserByProfile(profile());
DCHECK(user);
for (const ::account_manager::Account& account : accounts) {
if (IsSameAccount(account.key, user->GetAccountId()))
continue;
// If a non-device account exists, add the "Remove Account" search tag.
updater.AddSearchTags(GetRemoveAccountSearchConcepts());
return;
}
}
void PeopleSection::OnStateChanged(syncer::SyncService* sync_service) {
DCHECK(chromeos::features::IsSplitSettingsSyncEnabled());
DCHECK_EQ(sync_service, sync_service_);
SearchTagRegistry::ScopedTagUpdater updater = registry()->StartUpdate();
if (sync_service_->IsEngineInitialized() &&
sync_service_->GetUserSettings()->IsOsSyncFeatureEnabled()) {
updater.AddSearchTags(GetSplitSyncOnSearchConcepts());
updater.RemoveSearchTags(GetSplitSyncOffSearchConcepts());
} else {
updater.RemoveSearchTags(GetSplitSyncOnSearchConcepts());
updater.AddSearchTags(GetSplitSyncOffSearchConcepts());
}
}
bool PeopleSection::AreFingerprintSettingsAllowed() {
return chromeos::quick_unlock::IsFingerprintEnabled(profile());
}
void PeopleSection::UpdateRemoveFingerprintSearchTags() {
SearchTagRegistry::ScopedTagUpdater updater = registry()->StartUpdate();
updater.RemoveSearchTags(GetRemoveFingerprintSearchConcepts());
// "Remove fingerprint" search tag should exist only when 1 or more
// fingerprints are registered.
int registered_fingerprint_count =
pref_service_->GetInteger(::prefs::kQuickUnlockFingerprintRecord);
if (registered_fingerprint_count > 0) {
updater.AddSearchTags(GetRemoveFingerprintSearchConcepts());
}
}
} // namespace settings
} // namespace chromeos