blob: 98f12ef6d1302f77fe42c8b705400a136923a190 [file] [log] [blame]
// Copyright 2020 The Chromium Authors
// 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/ash/files_section.h"
#include "ash/constants/ash_features.h"
#include "base/functional/callback_helpers.h"
#include "base/no_destructor.h"
#include "base/strings/utf_string_conversions.h"
#include "chrome/browser/ash/drive/file_system_util.h"
#include "chrome/browser/ash/profiles/profile_helper.h"
#include "chrome/browser/ui/webui/ash/cloud_upload/cloud_upload_dialog.h"
#include "chrome/browser/ui/webui/ash/smb_shares/smb_handler.h"
#include "chrome/browser/ui/webui/ash/smb_shares/smb_shares_localized_strings_provider.h"
#include "chrome/browser/ui/webui/settings/ash/search/search_tag_registry.h"
#include "chrome/browser/ui/webui/webui_util.h"
#include "chrome/common/url_constants.h"
#include "chrome/grit/generated_resources.h"
#include "components/user_manager/user.h"
#include "content/public/browser/web_ui_data_source.h"
#include "ui/base/l10n/l10n_util.h"
#include "ui/base/webui/web_ui_util.h"
namespace ash::settings {
namespace mojom {
using ::chromeos::settings::mojom::kFilesSectionPath;
using ::chromeos::settings::mojom::kGoogleDriveSubpagePath;
using ::chromeos::settings::mojom::kNetworkFileSharesSubpagePath;
using ::chromeos::settings::mojom::kOfficeFilesSubpagePath;
using ::chromeos::settings::mojom::Section;
using ::chromeos::settings::mojom::Setting;
using ::chromeos::settings::mojom::Subpage;
} // namespace mojom
namespace {
const std::vector<SearchConcept>& GetFilesSearchConcepts() {
static const base::NoDestructor<std::vector<SearchConcept>> tags({
{IDS_OS_SETTINGS_TAG_FILES,
mojom::kFilesSectionPath,
mojom::SearchResultIcon::kFolder,
mojom::SearchResultDefaultRank::kMedium,
mojom::SearchResultType::kSection,
{.section = mojom::Section::kFiles}},
{IDS_OS_SETTINGS_TAG_FILES_DISCONNECT_GOOGLE_DRIVE,
mojom::kFilesSectionPath,
mojom::SearchResultIcon::kDrive,
mojom::SearchResultDefaultRank::kMedium,
mojom::SearchResultType::kSetting,
{.setting = mojom::Setting::kGoogleDriveConnection}},
{IDS_OS_SETTINGS_TAG_FILES_NETWORK_FILE_SHARES,
mojom::kNetworkFileSharesSubpagePath,
mojom::SearchResultIcon::kFolder,
mojom::SearchResultDefaultRank::kMedium,
mojom::SearchResultType::kSubpage,
{.subpage = mojom::Subpage::kNetworkFileShares},
{IDS_OS_SETTINGS_TAG_FILES_NETWORK_FILE_SHARES_ALT1,
SearchConcept::kAltTagEnd}},
});
return *tags;
}
const std::vector<SearchConcept>& GetFilesOfficeSearchConcepts() {
static const base::NoDestructor<std::vector<SearchConcept>> tags(
{{IDS_OS_SETTINGS_TAG_FILES_OFFICE,
mojom::kOfficeFilesSubpagePath,
mojom::SearchResultIcon::kFolder,
mojom::SearchResultDefaultRank::kMedium,
mojom::SearchResultType::kSubpage,
{.subpage = mojom::Subpage::kOfficeFiles}}});
return *tags;
}
const std::vector<SearchConcept>& GetFilesGoogleDriveSearchConcepts() {
static const base::NoDestructor<std::vector<SearchConcept>> tags(
{{IDS_OS_SETTINGS_TAG_FILES_GOOGLE_DRIVE,
mojom::kGoogleDriveSubpagePath,
mojom::SearchResultIcon::kDrive,
mojom::SearchResultDefaultRank::kMedium,
mojom::SearchResultType::kSubpage,
{.subpage = mojom::Subpage::kGoogleDrive}}});
return *tags;
}
} // namespace
FilesSection::FilesSection(Profile* profile,
SearchTagRegistry* search_tag_registry)
: OsSettingsSection(profile, search_tag_registry) {
SearchTagRegistry::ScopedTagUpdater updater = registry()->StartUpdate();
updater.AddSearchTags(GetFilesSearchConcepts());
if (cloud_upload::IsEligibleAndEnabledUploadOfficeToCloud(profile)) {
updater.AddSearchTags(GetFilesOfficeSearchConcepts());
}
if (drive::util::IsDriveFsBulkPinningEnabled(profile)) {
updater.AddSearchTags(GetFilesGoogleDriveSearchConcepts());
}
}
FilesSection::~FilesSection() = default;
void FilesSection::AddLoadTimeData(content::WebUIDataSource* html_source) {
static constexpr webui::LocalizedString kLocalizedStrings[] = {
{"disconnectGoogleDriveAccount", IDS_SETTINGS_DISCONNECT_GOOGLE_DRIVE},
{"googleDriveLabel", IDS_SETTINGS_GOOGLE_DRIVE},
{"googleDriveEnabledLabel", IDS_SETTINGS_GOOGLE_DRIVE_ENABLED},
{"googleDriveDisabledLabel", IDS_SETTINGS_GOOGLE_DRIVE_DISABLED},
{"googleDriveDisconnectLabel", IDS_SETTINGS_GOOGLE_DRIVE_DISCONNECT},
{"googleDriveConnectLabel", IDS_SETTINGS_GOOGLE_DRIVE_CONNECT},
{"googleDriveOfflineTitle", IDS_SETTINGS_GOOGLE_DRIVE_OFFLINE_TITLE},
{"googleDriveOfflineSubtitle",
IDS_SETTINGS_GOOGLE_DRIVE_OFFLINE_SUBTITLE},
{"googleDriveOfflineStorageTitle",
IDS_SETTINGS_GOOGLE_DRIVE_OFFLINE_STORAGE_TITLE},
{"googleDriveOfflineSpaceSubtitle",
IDS_SETTINGS_GOOGLE_DRIVE_OFFLINE_STORAGE_REQUIRED_SUBTITLE},
{"googleDriveOfflineClearCalculatingSubtitle",
IDS_SETTINGS_GOOGLE_DRIVE_OFFLINE_CLEAR_CALCULATING_SUBTITLE},
{"googleDriveOfflineClearErrorSubtitle",
IDS_SETTINGS_GOOGLE_DRIVE_OFFLINE_CLEAR_ERROR_SUBTITLE},
{"googleDriveOfflineClearAction",
IDS_SETTINGS_GOOGLE_DRIVE_OFFLINE_CLEAR_ACTION},
{"googleDriveOfflineClearDialogTitle",
IDS_SETTINGS_GOOGLE_DRIVE_OFFLINE_CLEAR_DIALOG_TITLE},
{"googleDriveOfflineClearDialogBody",
IDS_SETTINGS_GOOGLE_DRIVE_OFFLINE_CLEAR_DIALOG_BODY},
{"googleDriveTurnOffLabel",
IDS_SETTINGS_GOOGLE_DRIVE_TURN_OFF_BUTTON_LABEL},
{"googleDriveTurnOffTitle",
IDS_SETTINGS_GOOGLE_DRIVE_TURN_OFF_TITLE_TEXT},
{"googleDriveNotEnoughSpaceTitle",
IDS_SETTINGS_GOOGLE_DRIVE_BULK_PINNING_NOT_ENOUGH_SPACE_TITLE_TEXT},
{"googleDriveNotEnoughSpaceBody",
IDS_SETTINGS_GOOGLE_DRIVE_BULK_PINNING_NOT_ENOUGH_SPACE_BODY_TEXT},
{"googleDriveUnexpectedErrorTitle",
IDS_SETTINGS_GOOGLE_DRIVE_BULK_PINNING_UNEXPECTED_ERROR_TITLE_TEXT},
{"googleDriveUnexpectedErrorBody",
IDS_SETTINGS_GOOGLE_DRIVE_BULK_PINNING_UNEXPECTED_ERROR_BODY_TEXT},
{"googleDriveTurnOffBody", IDS_SETTINGS_GOOGLE_DRIVE_TURN_OFF_BODY_TEXT},
{"filesPageTitle", IDS_OS_SETTINGS_FILES},
{"smbSharesTitle", IDS_SETTINGS_DOWNLOADS_SMB_SHARES},
{"smbSharesLearnMoreLabel",
IDS_SETTINGS_DOWNLOADS_SMB_SHARES_LEARN_MORE_LABEL},
{"addSmbShare", IDS_SETTINGS_DOWNLOADS_SMB_SHARES_ADD_SHARE},
{"smbShareAddedSuccessfulMessage",
IDS_SETTINGS_DOWNLOADS_SHARE_ADDED_SUCCESS_MESSAGE},
{"smbShareAddedErrorMessage",
IDS_SETTINGS_DOWNLOADS_SHARE_ADDED_ERROR_MESSAGE},
{"smbShareAddedAuthFailedMessage",
IDS_SETTINGS_DOWNLOADS_SHARE_ADDED_AUTH_FAILED_MESSAGE},
{"smbShareAddedNotFoundMessage",
IDS_SETTINGS_DOWNLOADS_SHARE_ADDED_NOT_FOUND_MESSAGE},
{"smbShareAddedUnsupportedDeviceMessage",
IDS_SETTINGS_DOWNLOADS_SHARE_ADDED_UNSUPPORTED_DEVICE_MESSAGE},
{"smbShareAddedMountExistsMessage",
IDS_SETTINGS_DOWNLOADS_SHARE_ADDED_MOUNT_EXISTS_MESSAGE},
{"smbShareAddedTooManyMountsMessage",
IDS_SETTINGS_DOWNLOADS_SHARE_ADDED_TOO_MANY_MOUNTS_MESSAGE},
{"smbShareAddedInvalidURLMessage",
IDS_SETTINGS_DOWNLOADS_SHARE_ADDED_MOUNT_INVALID_URL_MESSAGE},
{"smbShareAddedInvalidSSOURLMessage",
IDS_SETTINGS_DOWNLOADS_SHARE_ADDED_MOUNT_INVALID_SSO_URL_MESSAGE},
{"oneDriveLabel", IDS_SETTINGS_ONE_DRIVE_LABEL},
{"oneDriveSignedInAs", IDS_SETTINGS_ONE_DRIVE_SIGNED_IN_AS},
{"oneDriveDisconnected", IDS_SETTINGS_ONE_DRIVE_DISCONNECTED},
{"officeLabel", IDS_SETTINGS_OFFICE_LABEL},
{"officeSublabel", IDS_SETTINGS_OFFICE_SUBLABEL},
{"officeSubpageTitle", IDS_SETTINGS_OFFICE_SUBPAGE_TITLE},
{"alwaysMoveToDrivePreferenceLabel",
IDS_SETTINGS_ALWAYS_MOVE_OFFICE_TO_DRIVE_PREFERENCE_LABEL},
{"alwaysMoveToOneDrivePreferenceLabel",
IDS_SETTINGS_ALWAYS_MOVE_OFFICE_TO_ONEDRIVE_PREFERENCE_LABEL},
};
html_source->AddLocalizedStrings(kLocalizedStrings);
smb_dialog::AddLocalizedStrings(html_source);
html_source->AddString("smbSharesLearnMoreURL",
GetHelpUrlWithBoard(chrome::kSmbSharesLearnMoreURL));
html_source->AddBoolean(
"showOfficeSettings",
cloud_upload::IsEligibleAndEnabledUploadOfficeToCloud(profile()));
const user_manager::User* user =
ProfileHelper::Get()->GetUserByProfile(profile());
html_source->AddBoolean("isActiveDirectoryUser",
user && user->IsActiveDirectoryUser());
if (user && user->GetAccountId().is_valid()) {
html_source->AddString(
"googleDriveSignedInAs",
l10n_util::GetStringFUTF16(
IDS_SETTINGS_GOOGLE_DRIVE_SIGNED_IN_AS,
base::ASCIIToUTF16(user->GetAccountId().GetUserEmail())));
html_source->AddString(
"googleDriveDisconnectedFrom",
l10n_util::GetStringFUTF16(
IDS_SETTINGS_GOOGLE_DRIVE_DISCONNECTED_FROM,
base::ASCIIToUTF16(user->GetAccountId().GetUserEmail())));
}
html_source->AddBoolean("enableDriveFsBulkPinning",
drive::util::IsDriveFsBulkPinningEnabled(profile()));
}
void FilesSection::AddHandlers(content::WebUI* web_ui) {
web_ui->AddMessageHandler(
std::make_unique<smb_dialog::SmbHandler>(profile(), base::DoNothing()));
}
int FilesSection::GetSectionNameMessageId() const {
return IDS_OS_SETTINGS_FILES;
}
mojom::Section FilesSection::GetSection() const {
return mojom::Section::kFiles;
}
mojom::SearchResultIcon FilesSection::GetSectionIcon() const {
return mojom::SearchResultIcon::kFolder;
}
std::string FilesSection::GetSectionPath() const {
return mojom::kFilesSectionPath;
}
bool FilesSection::LogMetric(mojom::Setting setting, base::Value& value) const {
// Unimplemented.
return false;
}
void FilesSection::RegisterHierarchy(HierarchyGenerator* generator) const {
generator->RegisterTopLevelSetting(mojom::Setting::kGoogleDriveConnection);
// Network file shares.
generator->RegisterTopLevelSubpage(
IDS_SETTINGS_DOWNLOADS_SMB_SHARES, mojom::Subpage::kNetworkFileShares,
mojom::SearchResultIcon::kFolder, mojom::SearchResultDefaultRank::kMedium,
mojom::kNetworkFileSharesSubpagePath);
// Office.
// TODO(b:264314789): Correct string (not smb).
generator->RegisterTopLevelSubpage(
IDS_SETTINGS_DOWNLOADS_SMB_SHARES, mojom::Subpage::kOfficeFiles,
mojom::SearchResultIcon::kFolder, mojom::SearchResultDefaultRank::kMedium,
mojom::kNetworkFileSharesSubpagePath);
generator->RegisterTopLevelSubpage(
IDS_SETTINGS_GOOGLE_DRIVE, mojom::Subpage::kGoogleDrive,
mojom::SearchResultIcon::kFolder, mojom::SearchResultDefaultRank::kMedium,
mojom::kGoogleDriveSubpagePath);
}
} // namespace ash::settings