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

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

Issue 2814173002: [Web Payments] Prettify the payment sheet rows in some states. (Closed)
Patch Set: Rebase Created 3 years, 8 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/payment_sheet_view_controller.cc
diff --git a/chrome/browser/ui/views/payments/payment_sheet_view_controller.cc b/chrome/browser/ui/views/payments/payment_sheet_view_controller.cc
index ef5295bd0b6b3bf073a4877a647c644aca49cbd2..5d390b8528ce48833f3195d11c0b0f4924ea30dc 100644
--- a/chrome/browser/ui/views/payments/payment_sheet_view_controller.cc
+++ b/chrome/browser/ui/views/payments/payment_sheet_view_controller.cc
@@ -87,24 +87,16 @@ int ComputeWidestNameColumnViewWidth() {
return widest_column_width;
}
-// Creates a clickable row to be displayed in the Payment Sheet. It contains
-// a section name and some content, followed by a chevron as a clickability
-// affordance. Both, either, or none of |content_view| and |extra_content_view|
-// may be present, the difference between the two being that content is pinned
-// to the left and extra_content is pinned to the right.
-// The row also displays a light gray horizontal ruler on its lower boundary.
-// The name column has a fixed width equal to |name_column_width|.
-// +----------------------------+
-// | Name | Content | Extra | > |
-// +~~~~~~~~~~~~~~~~~~~~~~~~~~~~+ <-- ruler
std::unique_ptr<views::Button> CreatePaymentSheetRow(
views::ButtonListener* listener,
const base::string16& section_name,
std::unique_ptr<views::View> content_view,
std::unique_ptr<views::View> extra_content_view,
+ std::unique_ptr<views::View> trailing_button,
+ bool clickable,
int name_column_width) {
std::unique_ptr<PaymentRequestRowView> row =
- base::MakeUnique<PaymentRequestRowView>(listener);
+ base::MakeUnique<PaymentRequestRowView>(listener, clickable);
views::GridLayout* layout = new views::GridLayout(row.get());
// The rows have extra inset compared to the header so that their right edge
@@ -135,7 +127,7 @@ std::unique_ptr<views::Button> CreatePaymentSheetRow(
0, views::GridLayout::USE_PREF, 0, 0);
columns->AddPaddingColumn(0, kPaddingColumnsWidth);
- // A column for the chevron.
+ // A column for the trailing_button.
columns->AddColumn(views::GridLayout::TRAILING, views::GridLayout::CENTER,
0, views::GridLayout::USE_PREF, 0, 0);
@@ -157,14 +149,68 @@ std::unique_ptr<views::Button> CreatePaymentSheetRow(
layout->SkipColumns(1);
}
- views::ImageView* chevron = new views::ImageView();
+ layout->AddView(trailing_button.release());
+
+ return std::move(row);
+}
+
+// Creates a row with a button in place of the chevron.
+// +------------------------------------------+
+// | Name | truncated_content | button_string |
+// +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+
+std::unique_ptr<views::Button> CreatePaymentSheetRowWithButton(
+ views::ButtonListener* listener,
+ const base::string16& section_name,
+ const base::string16& truncated_content,
+ const base::string16& button_string,
+ int button_tag,
+ int button_id,
+ int name_column_width) {
+ std::unique_ptr<views::Button> button(
+ views::MdTextButton::CreateSecondaryUiBlueButton(listener,
+ button_string));
+ button->set_tag(button_tag);
+ button->set_id(button_id);
+ std::unique_ptr<views::Label> content_view =
+ base::MakeUnique<views::Label>(truncated_content);
+ return CreatePaymentSheetRow(listener, section_name, std::move(content_view),
+ nullptr, std::move(button),
+ /*clickable=*/false, name_column_width);
+}
+
+// Creates a clickable row to be displayed in the Payment Sheet. It contains
+// a section name and some content, followed by a chevron as a clickability
+// affordance. Both, either, or none of |content_view| and |extra_content_view|
+// may be present, the difference between the two being that content is pinned
+// to the left and extra_content is pinned to the right.
+// The row also displays a light gray horizontal ruler on its lower boundary.
+// The name column has a fixed width equal to |name_column_width|.
+// +----------------------------+
+// | Name | Content | Extra | > |
+// +~~~~~~~~~~~~~~~~~~~~~~~~~~~~+ <-- ruler
+std::unique_ptr<views::Button> CreatePaymentSheetRowWithChevron(
+ views::ButtonListener* listener,
+ const base::string16& section_name,
+ std::unique_ptr<views::View> content_view,
+ std::unique_ptr<views::View> extra_content_view,
+ int section_tag,
+ int section_id,
+ int name_column_width) {
+ std::unique_ptr<views::ImageView> chevron =
+ base::MakeUnique<views::ImageView>();
chevron->set_can_process_events_within_subtree(false);
+ std::unique_ptr<views::Label> label =
+ base::MakeUnique<views::Label>(section_name);
chevron->SetImage(gfx::CreateVectorIcon(
views::kSubmenuArrowIcon,
- color_utils::DeriveDefaultIconColor(name_label->enabled_color())));
- layout->AddView(chevron);
-
- return std::move(row);
+ color_utils::DeriveDefaultIconColor(label->enabled_color())));
+ std::unique_ptr<views::Button> section =
+ CreatePaymentSheetRow(listener, section_name, std::move(content_view),
+ std::move(extra_content_view), std::move(chevron),
+ /*clickable=*/true, name_column_width);
+ section->set_tag(section_tag);
+ section->set_id(section_id);
+ return section;
}
// Creates a GridLayout object to be used in the Order Summary section's list of
@@ -422,15 +468,14 @@ PaymentSheetViewController::CreatePaymentSheetSummaryRow() {
item_summaries->SetLayoutManager(item_summaries_layout.release());
item_amounts->SetLayoutManager(item_amounts_layout.release());
- std::unique_ptr<views::Button> section = CreatePaymentSheetRow(
+ std::unique_ptr<views::Button> section = CreatePaymentSheetRowWithChevron(
this,
l10n_util::GetStringUTF16(IDS_PAYMENT_REQUEST_ORDER_SUMMARY_SECTION_NAME),
std::move(item_summaries), std::move(item_amounts),
+ static_cast<int>(
+ PaymentSheetViewControllerTags::SHOW_ORDER_SUMMARY_BUTTON),
+ static_cast<int>(DialogViewID::PAYMENT_SHEET_SUMMARY_SECTION),
widest_name_column_view_width_);
- section->set_tag(static_cast<int>(
- PaymentSheetViewControllerTags::SHOW_ORDER_SUMMARY_BUTTON));
- section->set_id(
- static_cast<int>(DialogViewID::PAYMENT_SHEET_SUMMARY_SECTION));
return section;
}
@@ -457,19 +502,35 @@ PaymentSheetViewController::CreateShippingSectionContent() {
// | 1800MYPOTUS |
// +----------------------------------------------+
std::unique_ptr<views::Button> PaymentSheetViewController::CreateShippingRow() {
- std::unique_ptr<views::Button> section = CreatePaymentSheetRow(
- this, GetShippingAddressSectionString(spec()->shipping_type()),
- CreateShippingSectionContent(), std::unique_ptr<views::View>(nullptr),
- widest_name_column_view_width_);
- section->set_tag(
- static_cast<int>(PaymentSheetViewControllerTags::SHOW_SHIPPING_BUTTON));
- section->set_id(
- static_cast<int>(DialogViewID::PAYMENT_SHEET_SHIPPING_ADDRESS_SECTION));
+ std::unique_ptr<views::Button> section;
+ if (state()->selected_shipping_profile()) {
+ section = CreatePaymentSheetRowWithChevron(
+ this, GetShippingAddressSectionString(spec()->shipping_type()),
+ CreateShippingSectionContent(), nullptr,
+ static_cast<int>(PaymentSheetViewControllerTags::SHOW_SHIPPING_BUTTON),
+ static_cast<int>(DialogViewID::PAYMENT_SHEET_SHIPPING_ADDRESS_SECTION),
+ widest_name_column_view_width_);
+ } else {
+ base::string16 button_string = state()->shipping_profiles().size()
+ ? l10n_util::GetStringUTF16(IDS_CHOOSE)
+ : l10n_util::GetStringUTF16(IDS_ADD);
+
+ section = CreatePaymentSheetRowWithButton(
+ this, GetShippingAddressSectionString(spec()->shipping_type()),
+ base::ASCIIToUTF16(""), button_string,
+ static_cast<int>(PaymentSheetViewControllerTags::SHOW_SHIPPING_BUTTON),
+ static_cast<int>(
+ DialogViewID::PAYMENT_SHEET_SHIPPING_ADDRESS_SECTION_BUTTON),
+ widest_name_column_view_width_);
+ }
+
return section;
}
// Creates the Payment Method row, which contains a "Payment" label, the user's
// masked Credit Card details, the icon for the selected card, and a chevron.
+// If no option is selected or none is available, the Chevron and icon are
+// replaced with a button
// +----------------------------------------------+
// | Payment Visa ****0000 |
// | John Smith | VISA | > |
@@ -481,6 +542,7 @@ PaymentSheetViewController::CreatePaymentMethodRow() {
std::unique_ptr<views::View> content_view;
std::unique_ptr<views::ImageView> card_icon_view;
+ std::unique_ptr<views::Button> section;
if (selected_instrument) {
content_view = base::MakeUnique<views::View>();
@@ -498,19 +560,33 @@ PaymentSheetViewController::CreatePaymentMethodRow() {
card_icon_view = CreateInstrumentIconView(
selected_instrument->icon_resource_id(), selected_instrument->label());
card_icon_view->SetImageSize(gfx::Size(32, 20));
+
+ section = CreatePaymentSheetRowWithChevron(
+ this,
+ l10n_util::GetStringUTF16(
+ IDS_PAYMENT_REQUEST_PAYMENT_METHOD_SECTION_NAME),
+ std::move(content_view), std::move(card_icon_view),
+ static_cast<int>(
+ PaymentSheetViewControllerTags::SHOW_PAYMENT_METHOD_BUTTON),
+ static_cast<int>(DialogViewID::PAYMENT_SHEET_PAYMENT_METHOD_SECTION),
+ widest_name_column_view_width_);
+ } else {
+ base::string16 button_string = state()->available_instruments().size()
+ ? l10n_util::GetStringUTF16(IDS_CHOOSE)
+ : l10n_util::GetStringUTF16(IDS_ADD);
+
+ section = CreatePaymentSheetRowWithButton(
+ this,
+ l10n_util::GetStringUTF16(
+ IDS_PAYMENT_REQUEST_PAYMENT_METHOD_SECTION_NAME),
+ base::ASCIIToUTF16(""), button_string,
+ static_cast<int>(
+ PaymentSheetViewControllerTags::SHOW_PAYMENT_METHOD_BUTTON),
+ static_cast<int>(
+ DialogViewID::PAYMENT_SHEET_PAYMENT_METHOD_SECTION_BUTTON),
+ widest_name_column_view_width_);
}
- std::unique_ptr<views::Button> section = CreatePaymentSheetRow(
- this,
- l10n_util::GetStringUTF16(
- IDS_PAYMENT_REQUEST_PAYMENT_METHOD_SECTION_NAME),
- std::move(content_view),
- std::move(card_icon_view),
- widest_name_column_view_width_);
- section->set_tag(static_cast<int>(
- PaymentSheetViewControllerTags::SHOW_PAYMENT_METHOD_BUTTON));
- section->set_id(
- static_cast<int>(DialogViewID::PAYMENT_SHEET_PAYMENT_METHOD_SECTION));
return section;
}
@@ -532,15 +608,34 @@ PaymentSheetViewController::CreateContactInfoSectionContent() {
// +----------------------------------------------+
std::unique_ptr<views::Button>
PaymentSheetViewController::CreateContactInfoRow() {
- std::unique_ptr<views::Button> section = CreatePaymentSheetRow(
- this,
- l10n_util::GetStringUTF16(IDS_PAYMENT_REQUEST_CONTACT_INFO_SECTION_NAME),
- CreateContactInfoSectionContent(), std::unique_ptr<views::View>(nullptr),
- widest_name_column_view_width_);
- section->set_tag(static_cast<int>(
- PaymentSheetViewControllerTags::SHOW_CONTACT_INFO_BUTTON));
- section->set_id(
- static_cast<int>(DialogViewID::PAYMENT_SHEET_CONTACT_INFO_SECTION));
+ std::unique_ptr<views::Button> section;
+ if (state()->selected_contact_profile()) {
+ section = CreatePaymentSheetRowWithChevron(
+ this,
+ l10n_util::GetStringUTF16(
+ IDS_PAYMENT_REQUEST_CONTACT_INFO_SECTION_NAME),
+ CreateContactInfoSectionContent(), nullptr,
+ static_cast<int>(
+ PaymentSheetViewControllerTags::SHOW_CONTACT_INFO_BUTTON),
+ static_cast<int>(DialogViewID::PAYMENT_SHEET_CONTACT_INFO_SECTION),
+ widest_name_column_view_width_);
+ } else {
+ base::string16 button_string = state()->contact_profiles().size()
+ ? l10n_util::GetStringUTF16(IDS_CHOOSE)
+ : l10n_util::GetStringUTF16(IDS_ADD);
+
+ section = CreatePaymentSheetRowWithButton(
+ this,
+ l10n_util::GetStringUTF16(
+ IDS_PAYMENT_REQUEST_CONTACT_INFO_SECTION_NAME),
+ base::ASCIIToUTF16(""), button_string,
+ static_cast<int>(
+ PaymentSheetViewControllerTags::SHOW_CONTACT_INFO_BUTTON),
+ static_cast<int>(
+ DialogViewID::PAYMENT_SHEET_CONTACT_INFO_SECTION_BUTTON),
+ widest_name_column_view_width_);
+ }
+
return section;
}
@@ -548,30 +643,46 @@ std::unique_ptr<views::Button>
PaymentSheetViewController::CreateShippingOptionRow() {
mojom::PaymentShippingOption* selected_option =
spec()->selected_shipping_option();
- if (!selected_option &&
- current_update_reason_ !=
- PaymentRequestSpec::UpdateReason::SHIPPING_OPTION) {
- return nullptr;
+ // The shipping option section displays the currently selected option if there
+ // is one. It's not possible to select an option without selecting an address
+ // first.
+ std::unique_ptr<views::Button> section;
+ if (state()->selected_shipping_profile()) {
+ if (spec()->details().shipping_options.empty()) {
+ // TODO(anthonyvd): Display placeholder if there's no available shipping
+ // option.
+ return nullptr;
+ }
+
+ std::unique_ptr<views::View> option_row_content =
+ current_update_reason_ ==
+ PaymentRequestSpec::UpdateReason::SHIPPING_OPTION
+ ? CreateCheckingSpinnerView()
+ : CreateShippingOptionLabel(
+ selected_option, selected_option
+ ? spec()->GetFormattedCurrencyAmount(
+ selected_option->amount->value)
+ : base::ASCIIToUTF16(""));
+ section = CreatePaymentSheetRowWithChevron(
+ this, GetShippingOptionSectionString(spec()->shipping_type()),
+ std::move(option_row_content), nullptr,
+ static_cast<int>(
+ PaymentSheetViewControllerTags::SHOW_SHIPPING_OPTION_BUTTON),
+ static_cast<int>(DialogViewID::PAYMENT_SHEET_SHIPPING_OPTION_SECTION),
+ widest_name_column_view_width_);
+ } else {
+ // TODO(anthonyvd): This should be a disabled row with a disabled button and
+ // some text to indicate that an address must be selected first.
+ section = CreatePaymentSheetRowWithButton(
+ this, GetShippingOptionSectionString(spec()->shipping_type()),
+ base::ASCIIToUTF16(""), l10n_util::GetStringUTF16(IDS_CHOOSE),
+ static_cast<int>(
+ PaymentSheetViewControllerTags::SHOW_SHIPPING_OPTION_BUTTON),
+ static_cast<int>(
+ DialogViewID::PAYMENT_SHEET_SHIPPING_OPTION_SECTION_BUTTON),
+ widest_name_column_view_width_);
}
- std::unique_ptr<views::View> option_row_content =
- current_update_reason_ ==
- PaymentRequestSpec::UpdateReason::SHIPPING_OPTION
- ? CreateCheckingSpinnerView()
- : CreateShippingOptionLabel(selected_option,
- selected_option
- ? spec()->GetFormattedCurrencyAmount(
- selected_option->amount->value)
- : base::ASCIIToUTF16(""));
-
- std::unique_ptr<views::Button> section = CreatePaymentSheetRow(
- this, GetShippingOptionSectionString(spec()->shipping_type()),
- std::move(option_row_content), std::unique_ptr<views::View>(nullptr),
- widest_name_column_view_width_);
- section->set_tag(static_cast<int>(
- PaymentSheetViewControllerTags::SHOW_SHIPPING_OPTION_BUTTON));
- section->set_id(
- static_cast<int>(DialogViewID::PAYMENT_SHEET_SHIPPING_OPTION_SECTION));
return section;
}

Powered by Google App Engine
This is Rietveld 408576698