Index: chrome/android/java/src/org/chromium/chrome/browser/autofill/CardUnmaskPrompt.java |
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/CardUnmaskPrompt.java b/chrome/android/java/src/org/chromium/chrome/browser/autofill/CardUnmaskPrompt.java |
index 581dc1c21efafa81e16e6580c763c699d8bcdcf6..b56fcbd9755f7aa7a8d504e2ca24b939d40175c1 100644 |
--- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/CardUnmaskPrompt.java |
+++ b/chrome/android/java/src/org/chromium/chrome/browser/autofill/CardUnmaskPrompt.java |
@@ -46,15 +46,17 @@ public class CardUnmaskPrompt |
implements DialogInterface.OnDismissListener, TextWatcher, OnClickListener { |
private final CardUnmaskPromptDelegate mDelegate; |
private final AlertDialog mDialog; |
- private final boolean mShouldRequestExpirationDate; |
+ private boolean mShouldRequestExpirationDate; |
private final int mThisYear; |
private final View mMainView; |
+ private final TextView mInstructions; |
private final TextView mNoRetryErrorMessage; |
private final EditText mCardUnmaskInput; |
private final EditText mMonthInput; |
private final EditText mYearInput; |
private final View mExpirationContainer; |
+ private final TextView mNewCardLink; |
private final TextView mErrorMessage; |
private final CheckBox mStoreLocallyCheckbox; |
private final ImageView mStoreLocallyTooltipIcon; |
@@ -75,6 +77,7 @@ public class CardUnmaskPrompt |
/** |
* Returns whether |userResponse| represents a valid value. |
+ * @param userResponse A CVC entered by the user. |
*/ |
boolean checkUserInputValidity(String userResponse); |
@@ -87,6 +90,12 @@ public class CardUnmaskPrompt |
* @param shouldStoreLocally The state of the "Save locally?" checkbox at the time. |
*/ |
void onUserInput(String cvc, String month, String year, boolean shouldStoreLocally); |
+ |
+ /** |
+ * Called when the "New card?" link has been clicked. |
+ * The controller will call update() in response. |
+ */ |
+ void onNewCardLinkClicked(); |
} |
public CardUnmaskPrompt(Context context, CardUnmaskPromptDelegate delegate, String title, |
@@ -96,7 +105,8 @@ public class CardUnmaskPrompt |
LayoutInflater inflater = LayoutInflater.from(context); |
View v = inflater.inflate(R.layout.autofill_card_unmask_prompt, null); |
- ((TextView) v.findViewById(R.id.instructions)).setText(instructions); |
+ mInstructions = (TextView) v.findViewById(R.id.instructions); |
+ mInstructions.setText(instructions); |
mMainView = v; |
mNoRetryErrorMessage = (TextView) v.findViewById(R.id.no_retry_error_message); |
@@ -104,6 +114,8 @@ public class CardUnmaskPrompt |
mMonthInput = (EditText) v.findViewById(R.id.expiration_month); |
mYearInput = (EditText) v.findViewById(R.id.expiration_year); |
mExpirationContainer = v.findViewById(R.id.expiration_container); |
+ mNewCardLink = (TextView) v.findViewById(R.id.new_card_link); |
+ mNewCardLink.setOnClickListener(this); |
mErrorMessage = (TextView) v.findViewById(R.id.error_message); |
mStoreLocallyCheckbox = (CheckBox) v.findViewById(R.id.store_locally_checkbox); |
mStoreLocallyCheckbox.setChecked(canStoreLocally && defaultToStoringLocally); |
@@ -131,10 +143,7 @@ public class CardUnmaskPrompt |
public void show() { |
mDialog.show(); |
- if (mShouldRequestExpirationDate) { |
- mExpirationContainer.setVisibility(View.VISIBLE); |
- mCardUnmaskInput.setEms(3); |
- } |
+ showExpirationDateInputsInputs(); |
// Override the View.OnClickListener so that pressing the positive button doesn't dismiss |
// the dialog. |
@@ -157,10 +166,14 @@ public class CardUnmaskPrompt |
setInitialFocus(); |
} |
}); |
- if (mShouldRequestExpirationDate) { |
- mMonthInput.addTextChangedListener(this); |
- mYearInput.addTextChangedListener(this); |
- } |
+ } |
+ |
+ public void update(String title, String instructions, boolean shouldRequestExpirationDate) { |
+ assert mDialog.isShowing(); |
+ mDialog.setTitle(title); |
+ mInstructions.setText(instructions); |
+ mShouldRequestExpirationDate = shouldRequestExpirationDate; |
+ showExpirationDateInputsInputs(); |
} |
public void dismiss() { |
@@ -183,6 +196,8 @@ public class CardUnmaskPrompt |
setInputError(errorMessage); |
setInputsEnabled(true); |
setInitialFocus(); |
+ |
+ if (!mShouldRequestExpirationDate) mNewCardLink.setVisibility(View.VISIBLE); |
} else { |
setInputError(null); |
setNoRetryError(errorMessage); |
@@ -220,7 +235,26 @@ public class CardUnmaskPrompt |
@Override |
public void onClick(View v) { |
- assert v == mStoreLocallyTooltipIcon; |
+ if (v == mStoreLocallyTooltipIcon) { |
+ onTooltipIconClicked(); |
+ } else { |
+ assert v == mNewCardLink; |
+ onNewCardLinkClicked(); |
+ } |
+ } |
+ |
+ private void showExpirationDateInputsInputs() { |
+ if (!mShouldRequestExpirationDate || mExpirationContainer.getVisibility() == View.VISIBLE) { |
+ return; |
+ } |
+ |
+ mExpirationContainer.setVisibility(View.VISIBLE); |
+ mCardUnmaskInput.setEms(3); |
+ mMonthInput.addTextChangedListener(this); |
+ mYearInput.addTextChangedListener(this); |
+ } |
+ |
+ private void onTooltipIconClicked() { |
// Don't show the popup if there's already one showing (or one has been dismissed |
// recently). This prevents a tap on the (?) from hiding and then immediately re-showing |
// the popup. |
@@ -268,6 +302,15 @@ public class CardUnmaskPrompt |
text.announceForAccessibility(text.getText()); |
} |
+ private void onNewCardLinkClicked() { |
+ mDelegate.onNewCardLinkClicked(); |
+ assert mShouldRequestExpirationDate; |
+ mNewCardLink.setVisibility(View.GONE); |
+ mCardUnmaskInput.setText(null); |
+ setInputError(null); |
+ mMonthInput.requestFocus(); |
+ } |
+ |
private void setInitialFocus() { |
InputMethodManager imm = (InputMethodManager) mDialog.getContext().getSystemService( |
Context.INPUT_METHOD_SERVICE); |