Index: chrome/android/java/src/org/chromium/chrome/browser/payments/ui/PaymentRequestUI.java |
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/payments/ui/PaymentRequestUI.java b/chrome/android/java/src/org/chromium/chrome/browser/payments/ui/PaymentRequestUI.java |
index 56ae6daa373d0551fd51eb12c6f91b6ac6c88274..b38d06d433481a9aebd6490ee6de4c218dcb45dc 100644 |
--- a/chrome/android/java/src/org/chromium/chrome/browser/payments/ui/PaymentRequestUI.java |
+++ b/chrome/android/java/src/org/chromium/chrome/browser/payments/ui/PaymentRequestUI.java |
@@ -4,6 +4,8 @@ |
package org.chromium.chrome.browser.payments.ui; |
+import static org.chromium.chrome.browser.payments.ui.PaymentRequestSection.EDIT_BUTTON_GONE; |
+ |
import android.animation.Animator; |
import android.animation.AnimatorListenerAdapter; |
import android.animation.AnimatorSet; |
@@ -262,7 +264,7 @@ public class PaymentRequestUI implements DialogInterface.OnDismissListener, View |
private OptionSection mPaymentMethodSection; |
private List<SectionSeparator> mSectionSeparators; |
- private ViewGroup mSelectedSection; |
+ private PaymentRequestSection mSelectedSection; |
private boolean mIsShowingEditDialog; |
private boolean mIsProcessingPayClicked; |
private boolean mIsClientClosing; |
@@ -328,8 +330,7 @@ public class PaymentRequestUI implements DialogInterface.OnDismissListener, View |
} |
updateSection(TYPE_PAYMENT_METHODS, result.getPaymentMethods()); |
if (mShippingAddressSectionInformation.getSelectedItem() == null) { |
- mShippingAddressSection.setDisplayMode( |
- PaymentRequestSection.DISPLAY_MODE_FOCUSED); |
+ expand(mShippingAddressSection); |
} else { |
expand(null); |
} |
@@ -381,24 +382,26 @@ public class PaymentRequestUI implements DialogInterface.OnDismissListener, View |
String selectedShippingAddress = result.getSelectedShippingAddressLabel(); |
String selectedShippingName = result.getSelectedShippingAddressSublabel(); |
String selectedShippingOptionLabel = result.getSelectedShippingOptionLabel(); |
- if (selectedShippingAddress == null && selectedShippingOptionLabel == null) { |
- mShippingSummarySection.setSummaryText(mContext.getString( |
- R.string.payments_select_shipping_prompt), null); |
+ |
+ if (selectedShippingAddress == null || selectedShippingOptionLabel == null) { |
+ // Let the summary display a SELECT/ADD button for the first subsection |
+ // that needs it. |
+ mShippingSummarySection.setSummaryText(null, null); |
mShippingSummarySection.setSummaryProperties(null, false, null, false); |
+ |
+ PaymentRequestSection section = |
+ mShippingAddressSection.getEditButtonState() == EDIT_BUTTON_GONE |
+ ? mShippingOptionSection : mShippingAddressSection; |
+ mShippingSummarySection.setEditButtonState(section.getEditButtonState()); |
} else { |
// Show the shipping address and the name in the summary section. |
- mShippingSummarySection.setSummaryText(selectedShippingAddress == null |
- ? mContext.getString( |
- R.string.payments_select_shipping_address_prompt) |
- : selectedShippingAddress, selectedShippingName); |
+ mShippingSummarySection.setSummaryText( |
+ selectedShippingAddress, selectedShippingName); |
mShippingSummarySection.setSummaryProperties( |
TruncateAt.MIDDLE, true, null, true); |
// Indicate the shipping option below the address. |
- mShippingSummarySection.setExtraText(selectedShippingOptionLabel == null |
- ? mContext.getString( |
- R.string.payments_select_shipping_option_prompt) |
- : selectedShippingOptionLabel); |
+ mShippingSummarySection.setExtraText(selectedShippingOptionLabel); |
} |
} |
@@ -459,22 +462,21 @@ public class PaymentRequestUI implements DialogInterface.OnDismissListener, View |
mPaymentContainer = (ScrollView) mRequestView.findViewById(R.id.option_container); |
mPaymentContainerLayout = |
(LinearLayout) mRequestView.findViewById(R.id.payment_container_layout); |
- mOrderSummarySection = new LineItemBreakdownSection(activity, |
- activity.getString(R.string.payments_order_summary_label), this); |
- mShippingSummarySection = new ExtraTextSection(activity, |
- activity.getString(R.string.payments_shipping_summary_label), this); |
- mShippingAddressSection = new OptionSection(activity, |
- activity.getString(R.string.payments_shipping_address_label), |
- activity.getString(R.string.payments_select_shipping_address_prompt), this); |
- mShippingOptionSection = new OptionSection(activity, |
- activity.getString(R.string.payments_shipping_option_label), |
- activity.getString(R.string.payments_select_shipping_option_prompt), this); |
- mContactDetailsSection = new OptionSection(activity, |
- activity.getString(R.string.payments_contact_details_label), |
- activity.getString(R.string.payments_select_contact_details_prompt), this); |
- mPaymentMethodSection = new OptionSection(activity, |
- activity.getString(R.string.payments_method_of_payment_label), |
- activity.getString(R.string.payments_select_method_of_payment_prompt), this); |
+ mOrderSummarySection = new LineItemBreakdownSection( |
+ activity, activity.getString(R.string.payments_order_summary_label), this); |
+ mShippingSummarySection = new ExtraTextSection( |
+ activity, activity.getString(R.string.payments_shipping_summary_label), this); |
+ mShippingAddressSection = new OptionSection( |
+ activity, activity.getString(R.string.payments_shipping_address_label), this); |
+ mShippingOptionSection = new OptionSection( |
+ activity, activity.getString(R.string.payments_shipping_option_label), this); |
+ mContactDetailsSection = new OptionSection( |
+ activity, activity.getString(R.string.payments_contact_details_label), this); |
+ mPaymentMethodSection = new OptionSection( |
+ activity, activity.getString(R.string.payments_method_of_payment_label), this); |
+ |
+ // Some sections conditionally allow adding new options. |
+ mShippingOptionSection.setCanAddItems(false); |
mPaymentMethodSection.setCanAddItems(canAddCards); |
// Add the necessary sections to the layout. |
@@ -594,12 +596,13 @@ public class PaymentRequestUI implements DialogInterface.OnDismissListener, View |
mPaymentMethodSection.update(section); |
} |
mIsEditingPaymentItem = false; |
+ updateSectionButtons(); |
notifyReadyToClose(); |
updatePayButtonEnabled(); |
} |
@Override |
- public void onPaymentOptionChanged(final OptionSection section, PaymentOption option) { |
+ public void onPaymentOptionChanged(final PaymentRequestSection section, PaymentOption option) { |
@SelectionResult int result = SELECTION_RESULT_NONE; |
if (section == mShippingAddressSection |
&& mShippingAddressSectionInformation.getSelectedItem() != option) { |
@@ -621,9 +624,17 @@ public class PaymentRequestUI implements DialogInterface.OnDismissListener, View |
} |
@Override |
- public void onAddPaymentOption(OptionSection section) { |
+ public void onAddPaymentOption(PaymentRequestSection section) { |
assert section != mShippingOptionSection; |
+ // There's no way to add new shipping options, so users adding an option via the shipping |
+ // summary's button have to be adding an address. Expand the sheet when this happens so |
+ // that the shipping address section properly appears afterward. |
+ if (section == mShippingSummarySection) { |
+ expand(null); |
+ section = mShippingAddressSection; |
+ } |
+ |
@SelectionResult int result = SELECTION_RESULT_NONE; |
if (section == mShippingAddressSection) { |
result = mClient.onSectionAddOption(TYPE_SHIPPING_ADDRESSES, mUpdateSectionsCallback); |
@@ -636,12 +647,13 @@ public class PaymentRequestUI implements DialogInterface.OnDismissListener, View |
updateStateFromResult(section, result); |
} |
- void updateStateFromResult(OptionSection section, @SelectionResult int result) { |
+ void updateStateFromResult(PaymentRequestSection section, @SelectionResult int result) { |
mIsClientCheckingSelection = result == SELECTION_RESULT_ASYNCHRONOUS_VALIDATION; |
mIsEditingPaymentItem = result == SELECTION_RESULT_EDITOR_LAUNCH; |
if (mIsClientCheckingSelection) { |
- startSectionResizeAnimation(); |
+ mSelectedSection = section; |
+ updateSectionVisibility(); |
section.setDisplayMode(PaymentRequestSection.DISPLAY_MODE_CHECKING); |
} else { |
expand(null); |
@@ -651,7 +663,7 @@ public class PaymentRequestUI implements DialogInterface.OnDismissListener, View |
} |
@Override |
- public boolean isBoldLabelNeeded(OptionSection section) { |
+ public boolean isBoldLabelNeeded(PaymentRequestSection section) { |
return section == mShippingAddressSection; |
} |
@@ -680,6 +692,12 @@ public class PaymentRequestUI implements DialogInterface.OnDismissListener, View |
if (!isAcceptingUserInput()) return; |
+ // Users can only expand incomplete sections by clicking on their edit buttons. |
+ if (v instanceof PaymentRequestSection) { |
+ PaymentRequestSection section = (PaymentRequestSection) v; |
+ if (section.getEditButtonState() != EDIT_BUTTON_GONE) return; |
+ } |
+ |
if (v == mOrderSummarySection) { |
expand(mOrderSummarySection); |
} else if (v == mShippingSummarySection || v == mShippingAddressSection) { |
@@ -815,7 +833,7 @@ public class PaymentRequestUI implements DialogInterface.OnDismissListener, View |
&& !mIsClientCheckingSelection; |
} |
- private void expand(ViewGroup section) { |
+ private void expand(PaymentRequestSection section) { |
if (!mIsShowingEditDialog) { |
// Container now takes the full height of the screen, animating towards it. |
mRequestView.getLayoutParams().height = LayoutParams.MATCH_PARENT; |
@@ -850,6 +868,10 @@ public class PaymentRequestUI implements DialogInterface.OnDismissListener, View |
// Make the dialog take the whole screen. |
mDialog.getWindow().setLayout( |
ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); |
+ |
+ // Disable all but the first button. |
+ updateSectionButtons(); |
+ |
mIsShowingEditDialog = true; |
} |
@@ -891,25 +913,33 @@ public class PaymentRequestUI implements DialogInterface.OnDismissListener, View |
}; |
} |
- /** Update the display status of each expandable section. */ |
+ /** Update the display status of each expandable section in the full dialog. */ |
private void updateSectionVisibility() { |
startSectionResizeAnimation(); |
+ mOrderSummarySection.focusSection(mSelectedSection == mOrderSummarySection); |
+ mShippingAddressSection.focusSection(mSelectedSection == mShippingAddressSection); |
+ mShippingOptionSection.focusSection(mSelectedSection == mShippingOptionSection); |
+ mContactDetailsSection.focusSection(mSelectedSection == mContactDetailsSection); |
+ mPaymentMethodSection.focusSection(mSelectedSection == mPaymentMethodSection); |
+ updateSectionButtons(); |
+ } |
- mOrderSummarySection.setDisplayMode(mSelectedSection == mOrderSummarySection |
- ? PaymentRequestSection.DISPLAY_MODE_FOCUSED |
- : PaymentRequestSection.DISPLAY_MODE_EXPANDABLE); |
- mShippingAddressSection.setDisplayMode(mSelectedSection == mShippingAddressSection |
- ? PaymentRequestSection.DISPLAY_MODE_FOCUSED |
- : PaymentRequestSection.DISPLAY_MODE_EXPANDABLE); |
- mShippingOptionSection.setDisplayMode(mSelectedSection == mShippingOptionSection |
- ? PaymentRequestSection.DISPLAY_MODE_FOCUSED |
- : PaymentRequestSection.DISPLAY_MODE_EXPANDABLE); |
- mContactDetailsSection.setDisplayMode(mSelectedSection == mContactDetailsSection |
- ? PaymentRequestSection.DISPLAY_MODE_FOCUSED |
- : PaymentRequestSection.DISPLAY_MODE_EXPANDABLE); |
- mPaymentMethodSection.setDisplayMode(mSelectedSection == mPaymentMethodSection |
- ? PaymentRequestSection.DISPLAY_MODE_FOCUSED |
- : PaymentRequestSection.DISPLAY_MODE_EXPANDABLE); |
+ /** |
+ * Updates the enabled/disbled state of each section's edit button. |
+ * |
+ * Only the top-most button is enabled -- the others are disabled so the user is directed |
+ * through the form from top to bottom. |
+ */ |
+ private void updateSectionButtons() { |
+ boolean mayEnableButton = true; |
+ for (int i = 0; i < mPaymentContainerLayout.getChildCount(); i++) { |
+ View child = mPaymentContainerLayout.getChildAt(i); |
+ if (!(child instanceof PaymentRequestSection)) continue; |
+ |
+ PaymentRequestSection section = (PaymentRequestSection) child; |
+ section.setIsEditButtonEnabled(mayEnableButton); |
+ if (section.getEditButtonState() != EDIT_BUTTON_GONE) mayEnableButton = false; |
+ } |
} |
/** |
@@ -932,7 +962,7 @@ public class PaymentRequestUI implements DialogInterface.OnDismissListener, View |
} |
@Override |
- public String getAdditionalText(OptionSection section) { |
+ public String getAdditionalText(PaymentRequestSection section) { |
if (section == mShippingAddressSection) { |
int selectedItemIndex = mShippingAddressSectionInformation.getSelectedItemIndex(); |
boolean isNecessary = mClient.merchantNeedsShippingAddress() |
@@ -948,13 +978,23 @@ public class PaymentRequestUI implements DialogInterface.OnDismissListener, View |
} |
@Override |
- public boolean isAdditionalTextDisplayingWarning(OptionSection section) { |
+ public boolean isAdditionalTextDisplayingWarning(PaymentRequestSection section) { |
return section == mShippingAddressSection |
&& mShippingAddressSectionInformation != null |
&& mShippingAddressSectionInformation.getSelectedItemIndex() |
== SectionInformation.INVALID_SELECTION; |
} |
+ @Override |
+ public void onSectionClicked(PaymentRequestSection section) { |
+ if (section == mShippingSummarySection) { |
+ // Clicking the summary section focuses one of its subsections. |
+ section = mShippingAddressSection.getEditButtonState() == EDIT_BUTTON_GONE |
+ ? mShippingOptionSection : mShippingAddressSection; |
+ } |
+ expand(section); |
+ } |
+ |
/** |
* Animates the different sections of the dialog expanding and contracting into their final |
* positions. |
@@ -1138,7 +1178,7 @@ public class PaymentRequestUI implements DialogInterface.OnDismissListener, View |
} |
@VisibleForTesting |
- public ViewGroup getShippingSummarySectionForTest() { |
+ public PaymentRequestSection getShippingSummarySectionForTest() { |
return mShippingSummarySection; |
} |