@Test public void getCardNumber_whenValidCard_returnsCardNumberWithoutSpaces() { mCardNumberEditText.setText(VALID_VISA_WITH_SPACES); assertEquals(VALID_VISA_NO_SPACES, mCardNumberEditText.getCardNumber()); mCardNumberEditText.setText(VALID_AMEX_WITH_SPACES); assertEquals(VALID_AMEX_NO_SPACES, mCardNumberEditText.getCardNumber()); mCardNumberEditText.setText(VALID_DINERS_CLUB_WITH_SPACES); assertEquals(VALID_DINERS_CLUB_NO_SPACES, mCardNumberEditText.getCardNumber()); }
@Test public void setText_whenTextChangesFromValidToInvalid_changesCardValidState() { mCardNumberEditText.setText(VALID_VISA_WITH_SPACES); // Simply setting the value interacts with this mock once -- that is tested elsewhere reset(mCardNumberCompleteListener); String mutable = mCardNumberEditText.getText().toString(); // Removing a single character should make this invalid mutable = mutable.substring(0, 18); mCardNumberEditText.setText(mutable); assertFalse(mCardNumberEditText.isCardNumberValid()); verifyZeroInteractions(mCardNumberCompleteListener); }
/** * Clear all text fields in the CardInputWidget. */ public void clear() { if (mCardNumberEditText.hasFocus() || mExpiryDateEditText.hasFocus() || mCvcNumberEditText.hasFocus() || this.hasFocus()) { mCardNumberEditText.requestFocus(); } mCvcNumberEditText.setText(""); mExpiryDateEditText.setText(""); mCardNumberEditText.setText(""); }
/** * Set the card number. Method does not change text field focus. * * @param cardNumber card number to be set */ public void setCardNumber(String cardNumber) { mCardNumberEditText.setText(cardNumber); setCardNumberIsViewed(!mCardNumberEditText.isCardNumberValid()); }
/** * Checks whether the current card number is valid */ public boolean validateCardNumber() { boolean cardNumberIsValid = CardUtils.isValidCardNumber(mCardNumberEditText.getCardNumber()); mCardNumberEditText.setShouldShowError(!cardNumberIsValid); return cardNumberIsValid; }
@Override public void onInitializeAccessibilityNodeInfo(@NonNull AccessibilityNodeInfo info) { super.onInitializeAccessibilityNodeInfo(info); String accLabel = getResources().getString( R.string.acc_label_card_number_node, getText()); info.setText(accLabel); }
mErrorColorInt = mCardNumberEditText.getDefaultErrorColorInt(); mTintColorInt = mCardNumberEditText.getHintTextColors().getDefaultColor(); if (attrs != null) { TypedArray a = getContext().getTheme().obtainStyledAttributes( mCardNumberEditText.setHint(mCardHintText); mCardNumberEditText.setErrorColor(mErrorColorInt); mExpiryDateEditText.setErrorColor(mErrorColorInt); mCvcNumberEditText.setErrorColor(mErrorColorInt); mCardNumberEditText.setOnFocusChangeListener(new OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { mCardNumberEditText.setCardNumberCompleteListener( new CardNumberEditText.CardNumberCompleteListener() { @Override mCardNumberEditText.setCardBrandChangeListener( new CardNumberEditText.CardBrandChangeListener() { @Override mCardNumberEditText.requestFocus();
/** * Set the card number. Method does not change text field focus. * * @param cardNumber card number to be set */ public void setCardNumber(@Nullable String cardNumber) { mCardNumberEditText.setText(cardNumber); }
@Test public void finishTypingCommonLengthCardNumber_whenInvalidCard_setsErrorValue() { String almostThere = VALID_VISA_WITH_SPACES.substring(0, 18); mCardNumberEditText.setText(almostThere); // This makes the number officially invalid mCardNumberEditText.append("3"); assertTrue(mCardNumberEditText.getShouldShowError()); }
@Test public void addDiscoverPrefix_callsBrandListener() { for (String prefix : Card.PREFIXES_DISCOVER) { clearInvocations(mCardBrandChangeListener); mCardNumberEditText.append(prefix); verify(mCardBrandChangeListener, times(1)).onCardBrandChanged(Card.DISCOVER); mCardNumberEditText.setText(""); } }
@Before public void setup() { MockitoAnnotations.initMocks(this); ActivityController<CardInputTestActivity> activityController = Robolectric.buildActivity(CardInputTestActivity.class).create().start(); mCardNumberEditText = activityController.get().getCardNumberEditText(); mCardNumberEditText.setText(""); mCardNumberEditText.setCardNumberCompleteListener(mCardNumberCompleteListener); mCardNumberEditText.setCardBrandChangeListener(mCardBrandChangeListener); }
@Test public void deleteWhenEmpty_fromExpiry_shiftsToCardNumber() { mCardMultilineWidget.setCardInputListener(mFullCardListener); mNoZipCardMultilineWidget.setCardInputListener(mNoZipCardListener); String deleteOneCharacterString = VALID_VISA_WITH_SPACES .substring(0, VALID_VISA_WITH_SPACES.length() - 1); mFullGroup.cardNumberEditText.setText(VALID_VISA_WITH_SPACES); reset(mFullCardListener); assertTrue(mFullGroup.expiryDateEditText.hasFocus()); ViewTestUtils.sendDeleteKeyEvent(mFullGroup.expiryDateEditText); verify(mFullCardListener, times(1)).onFocusChange(FOCUS_CARD); assertTrue(mFullGroup.cardNumberEditText.hasFocus()); assertEquals(deleteOneCharacterString, mFullGroup.cardNumberEditText.getText().toString()); mNoZipGroup.cardNumberEditText.setText(VALID_VISA_WITH_SPACES); reset(mNoZipCardListener); assertTrue(mNoZipGroup.expiryDateEditText.hasFocus()); ViewTestUtils.sendDeleteKeyEvent(mNoZipGroup.expiryDateEditText); verify(mNoZipCardListener, times(1)).onFocusChange(FOCUS_CARD); assertTrue(mNoZipGroup.cardNumberEditText.hasFocus()); assertEquals(deleteOneCharacterString, mNoZipGroup.cardNumberEditText.getText().toString()); }
int cursorPosition = updateSelectionIndex( formattedNumber.length(), latestChangeStart, setText(formattedNumber); setSelection(cursorPosition); mIgnoreChanges = false;
mCvcEditText = findViewById(R.id.et_add_source_cvc_ml); mPostalCodeEditText = findViewById(R.id.et_add_source_postal_ml); mTintColorInt = mCardNumberEditText.getHintTextColors().getDefaultColor(); initDeleteEmptyListeners(); mCardNumberEditText.setCardBrandChangeListener( new CardNumberEditText.CardBrandChangeListener() { @Override mCardNumberEditText.setCardNumberCompleteListener( new CardNumberEditText.CardNumberCompleteListener() { @Override mCardNumberEditText.updateLengthFilter(); updateBrand(Card.UNKNOWN); setEnabled(true);
@Test public void updateSelectionIndex_whenVisa_increasesIndexWhenGoingPastTheSpaces() { // Directly setting card brand as a testing hack (annotated in source) mCardNumberEditText.mCardBrand = Card.VISA; // Adding 1 character, starting at position 4, with a final string length 6 assertEquals(6, mCardNumberEditText.updateSelectionIndex(6, 4, 1)); assertEquals(6, mCardNumberEditText.updateSelectionIndex(8, 4, 1)); assertEquals(11, mCardNumberEditText.updateSelectionIndex(11, 9, 1)); assertEquals(16, mCardNumberEditText.updateSelectionIndex(16, 14, 1)); }
@Test public void onDeleteFromExpiryDate_whenNotEmpty_doesNotShiftFocusOrDeleteDigit() { mCardNumberEditText.setText(VALID_AMEX_WITH_SPACES); assertTrue(mExpiryEditText.hasFocus()); mExpiryEditText.append("1"); ViewTestUtils.sendDeleteKeyEvent(mExpiryEditText); assertTrue(mExpiryEditText.hasFocus()); assertEquals(VALID_AMEX_WITH_SPACES, mCardNumberEditText.getText().toString()); }
@Test public void onDeleteFromExpiryDate_whenEmpty_shiftsFocusToCardNumberAndDeletesDigit() { mCardInputWidget.setCardInputListener(mCardInputListener); mCardNumberEditText.setText(VALID_VISA_WITH_SPACES); assertTrue(mExpiryEditText.hasFocus()); // The above functionality is tested elsewhere, so we reset this listener. reset(mCardInputListener); ViewTestUtils.sendDeleteKeyEvent(mExpiryEditText); verify(mCardInputListener, times(1)).onFocusChange(FOCUS_CARD); assertEquals(R.id.et_expiry_date, mOnGlobalFocusChangeListener.getOldFocusId()); assertEquals(R.id.et_card_number, mOnGlobalFocusChangeListener.getNewFocusId()); String subString = VALID_VISA_WITH_SPACES.substring(0, VALID_VISA_WITH_SPACES.length() - 1); assertEquals(subString, mCardNumberEditText.getText().toString()); assertEquals(subString.length(), mCardNumberEditText.getSelectionStart()); }
@Test public void setCardNumber_withIncompleteNumber_doesNotValidateCard() { mCardInputWidget.setCardNumber("123456"); assertFalse(mCardNumberEditText.isCardNumberValid()); assertTrue(mCardNumberEditText.hasFocus()); }
@Test public void finishTypingInvalidCardNumber_whenFollowedByDelete_setsErrorBackToFalse() { String notQuiteValid = VALID_VISA_WITH_SPACES.substring(0, 18) + "3"; mCardNumberEditText.setText(notQuiteValid); assertTrue(mCardNumberEditText.getShouldShowError()); // Now that we're in an error state, back up by one ViewTestUtils.sendDeleteKeyEvent(mCardNumberEditText); assertFalse(mCardNumberEditText.getShouldShowError()); }
@Override public void afterTextChanged(Editable s) { if (s.length() == mLengthMax) { boolean before = mIsCardNumberValid; mIsCardNumberValid = CardUtils.isValidCardNumber(s.toString()); setShouldShowError(!mIsCardNumberValid); if (!before && mIsCardNumberValid && mCardNumberCompleteListener != null) { mCardNumberCompleteListener.onCardNumberComplete(); } } else { mIsCardNumberValid = getText() != null && CardUtils.isValidCardNumber(getText().toString()); // Don't show errors if we aren't full-length. setShouldShowError(false); } } });