| // 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/ash/notifications/request_system_proxy_credentials_view.h" |
| |
| #include <string> |
| #include <string_view> |
| #include <utility> |
| |
| #include "base/functional/bind.h" |
| #include "base/functional/callback_helpers.h" |
| #include "base/i18n/number_formatting.h" |
| #include "base/strings/string_util.h" |
| #include "base/strings/utf_string_conversions.h" |
| #include "chrome/browser/notifications/passphrase_textfield.h" |
| #include "chrome/browser/ui/browser_dialogs.h" |
| #include "chrome/grit/generated_resources.h" |
| #include "components/vector_icons/vector_icons.h" |
| #include "ui/base/l10n/l10n_util.h" |
| #include "ui/base/metadata/metadata_impl_macros.h" |
| #include "ui/base/models/image_model.h" |
| #include "ui/base/mojom/dialog_button.mojom.h" |
| #include "ui/base/resource/resource_bundle.h" |
| #include "ui/color/color_id.h" |
| #include "ui/color/color_provider.h" |
| #include "ui/events/event.h" |
| #include "ui/gfx/color_palette.h" |
| #include "ui/gfx/paint_vector_icon.h" |
| #include "ui/views/accessibility/view_accessibility.h" |
| #include "ui/views/border.h" |
| #include "ui/views/controls/image_view.h" |
| #include "ui/views/controls/label.h" |
| #include "ui/views/controls/textfield/textfield.h" |
| #include "ui/views/layout/box_layout_view.h" |
| #include "ui/views/layout/flex_layout.h" |
| #include "ui/views/layout/layout_provider.h" |
| #include "ui/views/layout/table_layout_view.h" |
| #include "ui/views/view_class_properties.h" |
| #include "ui/views/widget/widget.h" |
| |
| namespace { |
| |
| class ErrorLabelView : public views::Label { |
| METADATA_HEADER(ErrorLabelView, views::Label) |
| |
| public: |
| explicit ErrorLabelView(bool show_error_label) |
| : Label(l10n_util::GetStringUTF16( |
| IDS_SYSTEM_PROXY_AUTH_DIALOG_ERROR_LABEL)) { |
| SetEnabled(true); |
| SetVisible(show_error_label); |
| } |
| ErrorLabelView(const ErrorLabelView&) = delete; |
| ErrorLabelView& operator=(const ErrorLabelView&) = delete; |
| ~ErrorLabelView() override = default; |
| |
| // views::View: |
| void OnThemeChanged() override { |
| Label::OnThemeChanged(); |
| SetEnabledColor(GetColorProvider()->GetColor(ui::kColorAlertHighSeverity)); |
| } |
| }; |
| |
| BEGIN_METADATA(ErrorLabelView) |
| END_METADATA |
| |
| } // namespace |
| |
| namespace ash { |
| |
| RequestSystemProxyCredentialsView::RequestSystemProxyCredentialsView( |
| const std::string& proxy_server, |
| bool show_error_label, |
| base::OnceClosure view_destruction_callback) |
| : window_title_( |
| l10n_util::GetStringUTF16(IDS_SYSTEM_PROXY_AUTH_DIALOG_TITLE)), |
| proxy_server_(proxy_server), |
| show_error_label_(show_error_label), |
| view_destruction_callback_(std::move(view_destruction_callback)) { |
| Init(); |
| } |
| |
| RequestSystemProxyCredentialsView::~RequestSystemProxyCredentialsView() { |
| std::move(view_destruction_callback_).Run(); |
| } |
| |
| views::View* RequestSystemProxyCredentialsView::GetInitiallyFocusedView() { |
| return username_textfield_; |
| } |
| |
| std::u16string RequestSystemProxyCredentialsView::GetWindowTitle() const { |
| return window_title_; |
| } |
| |
| bool RequestSystemProxyCredentialsView::ShouldShowCloseButton() const { |
| return false; |
| } |
| |
| const std::string& RequestSystemProxyCredentialsView::GetProxyServer() const { |
| return proxy_server_; |
| } |
| |
| std::u16string_view RequestSystemProxyCredentialsView::GetUsername() const { |
| return username_textfield_->GetText(); |
| } |
| |
| std::u16string_view RequestSystemProxyCredentialsView::GetPassword() const { |
| return password_textfield_->GetText(); |
| } |
| |
| void RequestSystemProxyCredentialsView::Init() { |
| const views::LayoutProvider* provider = views::LayoutProvider::Get(); |
| SetBorder(views::CreateEmptyBorder(provider->GetDialogInsetsForContentType( |
| views::DialogContentType::kText, views::DialogContentType::kText))); |
| SetButtonLabel( |
| ui::mojom::DialogButton::kOk, |
| l10n_util::GetStringUTF16(IDS_SYSTEM_PROXY_AUTH_DIALOG_OK_BUTTON)); |
| |
| SetLayoutManager(std::make_unique<views::FlexLayout>()) |
| ->SetOrientation(views::LayoutOrientation::kVertical); |
| |
| auto* info_label = AddChildView(std::make_unique<views::Label>( |
| l10n_util::GetStringFUTF16(IDS_SYSTEM_PROXY_AUTH_DIALOG_TEXT, |
| base::ASCIIToUTF16(GetProxyServer())))); |
| info_label->SetEnabled(true); |
| info_label->SetTextStyle(views::style::STYLE_PRIMARY); |
| info_label->SetProperty(views::kCrossAxisAlignmentKey, |
| views::LayoutAlignment::kStart); |
| |
| auto* info_label_privacy = AddChildView(std::make_unique<views::Label>( |
| l10n_util::GetStringUTF16(IDS_SYSTEM_PROXY_AUTH_DIALOG_PRIVACY_WARNING))); |
| info_label_privacy->SetEnabled(true); |
| info_label_privacy->SetTextStyle(views::style::STYLE_SECONDARY); |
| info_label_privacy->SetProperty(views::kCrossAxisAlignmentKey, |
| views::LayoutAlignment::kStart); |
| |
| auto* auth_container = |
| AddChildView(std::make_unique<views::TableLayoutView>()); |
| auth_container->AddColumn( |
| views::LayoutAlignment::kStart, views::LayoutAlignment::kStretch, |
| views::TableLayout::kFixedSize, |
| views::TableLayout::ColumnSize::kUsePreferred, 0, 0); |
| const int label_padding = |
| provider->GetDistanceMetric(views::DISTANCE_RELATED_LABEL_HORIZONTAL); |
| auth_container->AddPaddingColumn(views::TableLayout::kFixedSize, |
| label_padding); |
| auth_container->AddColumn( |
| views::LayoutAlignment::kStretch, views::LayoutAlignment::kStretch, 1.0f, |
| views::TableLayout::ColumnSize::kUsePreferred, 0, 0); |
| |
| const int unrelated_vertical_spacing = |
| provider->GetDistanceMetric(views::DISTANCE_UNRELATED_CONTROL_VERTICAL); |
| auth_container->AddPaddingRow(views::TableLayout::kFixedSize, |
| unrelated_vertical_spacing); |
| auth_container->AddRows(1, views::TableLayout::kFixedSize); |
| auto* username_label = auth_container->AddChildView( |
| std::make_unique<views::Label>(l10n_util::GetStringUTF16( |
| IDS_SYSTEM_PROXY_AUTH_DIALOG_USERNAME_LABEL))); |
| username_label->SetEnabled(true); |
| |
| username_textfield_ = |
| auth_container->AddChildView(std::make_unique<views::Textfield>()); |
| username_textfield_->SetEnabled(true); |
| username_textfield_->GetViewAccessibility().SetName(*username_label); |
| |
| const int related_vertical_spacing = |
| provider->GetDistanceMetric(views::DISTANCE_RELATED_CONTROL_VERTICAL); |
| auth_container->AddPaddingRow(views::TableLayout::kFixedSize, |
| related_vertical_spacing); |
| auth_container->AddRows(1, views::TableLayout::kFixedSize); |
| auto* password_label = auth_container->AddChildView( |
| std::make_unique<views::Label>(l10n_util::GetStringUTF16( |
| IDS_SYSTEM_PROXY_AUTH_DIALOG_PASSWORD_LABEL))); |
| password_label->SetEnabled(true); |
| password_textfield_ = auth_container->AddChildView( |
| std::make_unique<chromeos::PassphraseTextfield>()); |
| password_textfield_->SetEnabled(true); |
| password_textfield_->GetViewAccessibility().SetName(*password_label); |
| auth_container->AddPaddingRow(views::TableLayout::kFixedSize, |
| related_vertical_spacing); |
| |
| auto* error_container = |
| AddChildView(std::make_unique<views::BoxLayoutView>()); |
| error_container->SetBetweenChildSpacing(label_padding); |
| auto* error_icon = |
| error_container->AddChildView(std::make_unique<views::ImageView>()); |
| constexpr int kIconSize = 18; |
| error_icon->SetImage(ui::ImageModel::FromVectorIcon( |
| vector_icons::kInfoOutlineIcon, ui::kColorAlertHighSeverity, kIconSize)); |
| error_icon->SetImageSize(gfx::Size(kIconSize, kIconSize)); |
| error_icon->SetVisible(show_error_label_); |
| |
| error_label_ = error_container->AddChildView( |
| std::make_unique<ErrorLabelView>(show_error_label_)); |
| error_container->SetFlexForView(error_label_, 1); |
| } |
| |
| BEGIN_METADATA(RequestSystemProxyCredentialsView) |
| ADD_READONLY_PROPERTY_METADATA(std::string, ProxyServer) |
| ADD_READONLY_PROPERTY_METADATA(std::u16string_view, Username) |
| ADD_READONLY_PROPERTY_METADATA(std::u16string_view, Password) |
| END_METADATA |
| |
| } // namespace ash |