Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(56)

Unified Diff: chrome/browser/ui/views/payments/profile_list_view_controller.cc

Issue 2855203002: [Payments] Display the shipping option error alongside the address (Closed)
Patch Set: android test fix Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/ui/views/payments/profile_list_view_controller.cc
diff --git a/chrome/browser/ui/views/payments/profile_list_view_controller.cc b/chrome/browser/ui/views/payments/profile_list_view_controller.cc
index bf552f5a6bdca0654d33a37459c7a41afca043d2..04e43037d75437d7f806577747acf30ee52a9050 100644
--- a/chrome/browser/ui/views/payments/profile_list_view_controller.cc
+++ b/chrome/browser/ui/views/payments/profile_list_view_controller.cc
@@ -4,6 +4,7 @@
#include "chrome/browser/ui/views/payments/profile_list_view_controller.h"
+#include "base/strings/utf_string_conversions.h"
#include "chrome/browser/ui/views/payments/payment_request_dialog_view.h"
#include "chrome/browser/ui/views/payments/payment_request_dialog_view_ids.h"
#include "chrome/browser/ui/views/payments/payment_request_row_view.h"
@@ -15,6 +16,9 @@
#include "components/payments/core/strings_util.h"
#include "components/strings/grit/components_strings.h"
#include "ui/base/l10n/l10n_util.h"
+#include "ui/gfx/paint_vector_icon.h"
+#include "ui/native_theme/native_theme.h"
+#include "ui/vector_icons/vector_icons.h"
#include "ui/views/controls/button/label_button.h"
#include "ui/views/controls/button/md_text_button.h"
#include "ui/views/controls/image_view.h"
@@ -75,12 +79,19 @@ class ProfileItem : public PaymentRequestItemList::Item {
}
}
- bool CanBeSelected() const override {
- return parent_view_->IsValidProfile(*profile_);
+ bool IsEnabled() override { return parent_view_->IsEnabled(profile_); }
+
+ bool CanBeSelected() override {
+ // In order to be selectable, a profile entry needs to be enabled, and the
+ // profile valid according to the controller. If either condition is false,
+ // PerformSelectionFallback() is called.
+ return IsEnabled() && parent_view_->IsValidProfile(*profile_);
}
void PerformSelectionFallback() override {
- parent_view_->ShowEditor(profile_);
+ // If enabled, the editor is opened to complete the invalid profile.
+ if (IsEnabled())
+ parent_view_->ShowEditor(profile_);
}
ProfileListViewController* parent_view_;
@@ -106,9 +117,16 @@ class ShippingProfileViewController : public ProfileListViewController {
// ProfileListViewController:
std::unique_ptr<views::View> GetLabel(
autofill::AutofillProfile* profile) override {
- return GetShippingAddressLabel(AddressStyleType::DETAILED,
- state()->GetApplicationLocale(), *profile,
- *spec(), *(state()->profile_comparator()));
+ if (!IsEnabled(profile)) {
+ // The error is not shown in the label itself on this screen, but the
+ // entry is disabled.
+ return GetShippingAddressLabelWithError(
+ AddressStyleType::DETAILED, state()->GetApplicationLocale(), *profile,
+ /*error=*/base::string16(), /*disabled_state=*/true);
+ }
+ return GetShippingAddressLabelWithMissingInfo(
+ AddressStyleType::DETAILED, state()->GetApplicationLocale(), *profile,
+ *(state()->profile_comparator()));
}
void SelectProfile(autofill::AutofillProfile* profile) override {
@@ -127,7 +145,10 @@ class ShippingProfileViewController : public ProfileListViewController {
}
autofill::AutofillProfile* GetSelectedProfile() override {
- return state()->selected_shipping_profile();
+ // If there are no errors with the currently selected profile, return it.
+ return spec()->selected_shipping_option_error().empty()
+ ? state()->selected_shipping_profile()
+ : nullptr;
}
bool IsValidProfile(const autofill::AutofillProfile& profile) override {
@@ -142,6 +163,42 @@ class ShippingProfileViewController : public ProfileListViewController {
return DialogViewID::SHIPPING_ADDRESS_SHEET_LIST_VIEW;
}
+ std::unique_ptr<views::View> CreateHeaderView() override {
+ if (spec()->selected_shipping_option_error().empty())
+ return nullptr;
+
+ std::unique_ptr<views::View> header_view = base::MakeUnique<views::View>();
+ // 8 pixels between the warning icon view and the text.
+ constexpr int kRowHorizontalSpacing = 8;
+ views::BoxLayout* layout = new views::BoxLayout(
+ views::BoxLayout::kHorizontal,
+ payments::kPaymentRequestRowHorizontalInsets, 0, kRowHorizontalSpacing);
+ layout->set_main_axis_alignment(
+ views::BoxLayout::MAIN_AXIS_ALIGNMENT_START);
+ layout->set_cross_axis_alignment(
+ views::BoxLayout::CROSS_AXIS_ALIGNMENT_STRETCH);
+ header_view->SetLayoutManager(layout);
+
+ std::unique_ptr<views::ImageView> warning_icon =
+ base::MakeUnique<views::ImageView>();
+ warning_icon->set_can_process_events_within_subtree(false);
+ warning_icon->SetImage(gfx::CreateVectorIcon(
+ ui::kWarningIcon, 16,
+ warning_icon->GetNativeTheme()->GetSystemColor(
+ ui::NativeTheme::kColorId_AlertSeverityHigh)));
+ header_view->AddChildView(warning_icon.release());
+
+ std::unique_ptr<views::Label> label = base::MakeUnique<views::Label>(
+ spec()->selected_shipping_option_error());
+ label->set_id(
+ static_cast<int>(DialogViewID::SHIPPING_ADDRESS_OPTION_ERROR));
+ label->SetEnabledColor(label->GetNativeTheme()->GetSystemColor(
+ ui::NativeTheme::kColorId_AlertSeverityHigh));
+ label->SetMultiLine(true);
+ header_view->AddChildView(label.release());
+ return header_view;
+ }
+
base::string16 GetSheetTitle() override {
return GetShippingAddressSectionString(spec()->shipping_type());
}
@@ -256,6 +313,21 @@ ProfileListViewController::ProfileListViewController(
ProfileListViewController::~ProfileListViewController() {}
+bool ProfileListViewController::IsEnabled(autofill::AutofillProfile* profile) {
+ // If selected_shipping_option_error() is not empty, it means the current
+ // selected_shipping_profile() is not supported by this merchant and should be
+ // shown in a disabled state. Therefore, |profile| is enabled in cases where
+ // (1) it's not the selected_shipping_profile
+ // OR
+ // (2) if it is, there is no shipping option error reported by the merchant.
+ return profile != state()->selected_shipping_profile() ||
+ spec()->selected_shipping_option_error().empty();
+}
+
+std::unique_ptr<views::View> ProfileListViewController::CreateHeaderView() {
+ return nullptr;
+}
+
void ProfileListViewController::PopulateList() {
autofill::AutofillProfile* selected_profile = GetSelectedProfile();
@@ -269,7 +341,15 @@ void ProfileListViewController::PopulateList() {
}
void ProfileListViewController::FillContentView(views::View* content_view) {
- content_view->SetLayoutManager(new views::FillLayout);
+ views::BoxLayout* layout =
+ new views::BoxLayout(views::BoxLayout::kVertical, 0, 0, 0);
+ layout->set_main_axis_alignment(views::BoxLayout::MAIN_AXIS_ALIGNMENT_START);
+ layout->set_cross_axis_alignment(
+ views::BoxLayout::CROSS_AXIS_ALIGNMENT_STRETCH);
+ content_view->SetLayoutManager(layout);
+ std::unique_ptr<views::View> header_view = CreateHeaderView();
+ if (header_view)
+ content_view->AddChildView(header_view.release());
std::unique_ptr<views::View> list_view = list_.CreateListView();
list_view->set_id(static_cast<int>(GetDialogViewId()));
content_view->AddChildView(list_view.release());

Powered by Google App Engine
This is Rietveld 408576698