Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ public class CardSelector {
public static final CardSelector MASTER = new CardSelector(R.drawable.card_color_round_rect_pink, R.drawable.chip_yellow, R.drawable.chip_yellow_inner, android.R.color.transparent, R.drawable.ic_billing_mastercard_logo, CardSelector.CVV_LENGHT_DEFAULT);
public static final CardSelector AMEX = new CardSelector(R.drawable.card_color_round_rect_green, android.R.color.transparent, android.R.color.transparent, R.drawable.img_amex_center_face, R.drawable.ic_billing_amex_logo1, CardSelector.CVV_LENGHT_AMEX);
public static final CardSelector DISCOVER = new CardSelector(R.drawable.card_color_round_rect_brown, android.R.color.transparent, android.R.color.transparent, android.R.color.transparent, R.drawable.ic_billing_discover_logo, CardSelector.CVV_LENGHT_DEFAULT);
public static final CardSelector DINERS = new CardSelector(R.drawable.card_color_round_rect_grey, R.drawable.chip, R.drawable.chip_inner, android.R.color.transparent, R.drawable.ic_billing_diners_logo, CardSelector.CVV_LENGHT_DEFAULT);
public static final CardSelector DEFAULT = new CardSelector(R.drawable.card_color_round_rect_default, R.drawable.chip, R.drawable.chip_inner, android.R.color.transparent, android.R.color.transparent, CardSelector.CVV_LENGHT_DEFAULT);

public static final int CVV_LENGHT_DEFAULT = 3;
Expand Down Expand Up @@ -89,6 +90,10 @@ public static CardSelector selectCardType(CreditCardUtils.CardType cardType) {
return MASTER;
case VISA_CARD:
return VISA;
case DINERS_14_CARD:
return DINERS;
case DINERS_16_CARD:
return DINERS;
default:
return DEFAULT;
}
Expand All @@ -100,7 +105,8 @@ public static CardSelector selectCard(String cardNumber) {
CardSelector selector = selectCardType(cardType);

if ((selector != DEFAULT) && (cardNumber.length() >= 3)) {
int[] drawables = {R.drawable.card_color_round_rect_brown, R.drawable.card_color_round_rect_green, R.drawable.card_color_round_rect_pink, R.drawable.card_color_round_rect_purple, R.drawable.card_color_round_rect_blue};
int[] drawables = {R.drawable.card_color_round_rect_brown, R.drawable.card_color_round_rect_green, R.drawable.card_color_round_rect_pink,
R.drawable.card_color_round_rect_purple, R.drawable.card_color_round_rect_blue, R.drawable.card_color_round_rect_grey};
int hash = cardNumber.substring(0, 3).hashCode();

if (hash < 0) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,19 +10,24 @@
*/
public class CreditCardUtils {
public enum CardType {
UNKNOWN_CARD, AMEX_CARD, MASTER_CARD, VISA_CARD, DISCOVER_CARD
UNKNOWN_CARD, AMEX_CARD, MASTER_CARD, VISA_CARD, DISCOVER_CARD, DINERS_14_CARD, DINERS_16_CARD
}

private static final String PATTERN_AMEX = "^3(4|7)[0-9 ]*";
private static final String PATTERN_VISA = "^4[0-9 ]*";
private static final String PATTERN_MASTER = "^5[0-9 ]*";
private static final String PATTERN_MASTER = "^[52][0-9]*$";
private static final String PATTERN_DISCOVER = "^6[0-9 ]*";
private static final String PATTERN_DINERS_14 = "^3(0[0-5]|[6])[0-9]*$";
private static final String PATTERN_DINERS_16 = "^3[89][0-9]*$";

public static final int MAX_LENGTH_CARD_NUMBER = 16;
public static final int MAX_LENGTH_CARD_NUMBER_AMEX = 15;
private static final int MAX_LENGTH_CARD_NUMBER = 16;
private static final int MAX_LENGTH_CARD_NUMBER_AMEX = 15;
private static final int MAX_LENGTH_CARD_NUMBER_DINERS_14 = 14;

public static final String CARD_NUMBER_FORMAT = "XXXX XXXX XXXX XXXX";
public static final String CARD_NUMBER_FORMAT_AMEX = "XXXX XXXXXX XXXXX";
private static final String CARD_NUMBER_FORMAT = "XXXX XXXX XXXX XXXX";
private static final String CARD_NUMBER_FORMAT_AMEX = "XXXX XXXXXX XXXXX";
private static final String CARD_NUMBER_FORMAT_DINERS_14 = "XXXXX XXXX XXXXX";
private static final String CARD_NUMBER_FORMAT_DINERS_16 = "XXXXX XXXX XXXXXXX";

public static final String EXTRA_CARD_NUMBER = "card_number";
public static final String EXTRA_CARD_CVV = "card_cvv";
Expand All @@ -42,7 +47,6 @@ public enum CardType {
public static final char CHAR_X = 'X';

public static String handleCardNumber(String inputCardNumber) {

return handleCardNumber(inputCardNumber,SPACE_SEPERATOR);
}

Expand All @@ -56,20 +60,46 @@ public static CardType selectCardType(String cardNumber) {
pCardType = Pattern.compile(PATTERN_AMEX);
if(pCardType.matcher(cardNumber).matches())
return CardType.AMEX_CARD;
pCardType = Pattern.compile(PATTERN_DINERS_14);
if(pCardType.matcher(cardNumber).matches())
return CardType.DINERS_14_CARD;
pCardType = Pattern.compile(PATTERN_DINERS_16);
if(pCardType.matcher(cardNumber).matches())
return CardType.DINERS_16_CARD;
pCardType = Pattern.compile(PATTERN_DISCOVER);
if(pCardType.matcher(cardNumber).matches())
return CardType.DISCOVER_CARD;
return CardType.UNKNOWN_CARD;
}

public static int selectCardLength(CardType cardType) {
return cardType == CardType.AMEX_CARD ? MAX_LENGTH_CARD_NUMBER_AMEX : MAX_LENGTH_CARD_NUMBER;
switch (cardType) {
case AMEX_CARD:
return MAX_LENGTH_CARD_NUMBER_AMEX;
case DINERS_14_CARD:
return MAX_LENGTH_CARD_NUMBER_DINERS_14;
default:
return MAX_LENGTH_CARD_NUMBER;
}
}

public static String getCardFormat(CardType cardType) {
switch (cardType) {
case AMEX_CARD:
return CARD_NUMBER_FORMAT_AMEX;
case DINERS_14_CARD:
return CARD_NUMBER_FORMAT_DINERS_14;
case DINERS_16_CARD:
return CARD_NUMBER_FORMAT_DINERS_16;
default:
return CARD_NUMBER_FORMAT;
}
}

public static String handleCardNumber(String inputCardNumber, String seperator) {
String unformattedText = inputCardNumber.replace(seperator, "");
CardType cardType = selectCardType(inputCardNumber);
String format = (cardType == CardType.AMEX_CARD) ? CARD_NUMBER_FORMAT_AMEX : CARD_NUMBER_FORMAT;
String format = getCardFormat(cardType);
StringBuilder sbFormattedNumber = new StringBuilder();
for(int iIdx = 0, jIdx = 0; (iIdx < format.length()) && (unformattedText.length() > jIdx); iIdx++) {
if(format.charAt(iIdx) == CHAR_X)
Expand All @@ -84,7 +114,7 @@ public static String handleCardNumber(String inputCardNumber, String seperator)
public static String formatCardNumber(String inputCardNumber, String seperator) {
String unformattedText = inputCardNumber.replace(seperator, "");
CardType cardType = selectCardType(inputCardNumber);
String format = (cardType == CardType.AMEX_CARD) ? CARD_NUMBER_FORMAT_AMEX : CARD_NUMBER_FORMAT;
String format = getCardFormat(cardType);
StringBuilder sbFormattedNumber = new StringBuilder();
for(int iIdx = 0, jIdx = 0; iIdx < format.length(); iIdx++) {
if((format.charAt(iIdx) == CHAR_X) && (unformattedText.length() > jIdx))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,6 @@
import com.cooltechworks.creditcarddesign.CreditCardUtils;
import com.cooltechworks.creditcarddesign.R;

import static com.cooltechworks.creditcarddesign.CreditCardUtils.CARD_NUMBER_FORMAT;
import static com.cooltechworks.creditcarddesign.CreditCardUtils.CARD_NUMBER_FORMAT_AMEX;
import static com.cooltechworks.creditcarddesign.CreditCardUtils.EXTRA_CARD_NUMBER;

/**
Expand Down Expand Up @@ -57,7 +55,7 @@ public void afterTextChanged(Editable s) {
mCardNumberView.setText(cardNumber);
String rawCardNumber = cardNumber.replace(CreditCardUtils.SPACE_SEPERATOR, "");
CreditCardUtils.CardType cardType = CreditCardUtils.selectCardType(rawCardNumber);
int maxLengthWithSpaces = ((cardType == CreditCardUtils.CardType.AMEX_CARD) ? CARD_NUMBER_FORMAT_AMEX : CARD_NUMBER_FORMAT).length();
int maxLengthWithSpaces = CreditCardUtils.getCardFormat(cardType).length();
mCardNumberView.setSelection(cardNumber.length() > maxLengthWithSpaces ? maxLengthWithSpaces : cardNumber.length());
mCardNumberView.addTextChangedListener(this);

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">

<corners android:radius="6dp" />

<gradient
android:startColor="@color/grey_color"
android:endColor="@color/grey_color_gradient"
android:angle="270"/>

</shape>
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
3 changes: 2 additions & 1 deletion creditcarddesign/src/main/res/values/colors.xml
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,8 @@
<color name="brown_color">#800000</color>
<color name="brown_color_gradient">#A52A2A</color>


<color name="grey_color">#D4D4D4</color>
<color name="grey_color_gradient">#D4CCD4</color>


</resources>