diff --git a/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/CardSelector.java b/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/CardSelector.java index 621569a..15be79c 100644 --- a/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/CardSelector.java +++ b/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/CardSelector.java @@ -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; @@ -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; } @@ -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) { diff --git a/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/CreditCardUtils.java b/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/CreditCardUtils.java index 030d991..f5ad430 100755 --- a/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/CreditCardUtils.java +++ b/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/CreditCardUtils.java @@ -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"; @@ -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); } @@ -56,6 +60,12 @@ 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; @@ -63,13 +73,33 @@ public static CardType selectCardType(String cardNumber) { } 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) @@ -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)) diff --git a/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/pager/CardNumberFragment.java b/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/pager/CardNumberFragment.java index a70e9d7..a9c1121 100644 --- a/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/pager/CardNumberFragment.java +++ b/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/pager/CardNumberFragment.java @@ -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; /** @@ -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); diff --git a/creditcarddesign/src/main/res/drawable/card_color_round_rect_grey.xml b/creditcarddesign/src/main/res/drawable/card_color_round_rect_grey.xml new file mode 100644 index 0000000..1a3a9c3 --- /dev/null +++ b/creditcarddesign/src/main/res/drawable/card_color_round_rect_grey.xml @@ -0,0 +1,12 @@ + + + + + + + + \ No newline at end of file diff --git a/creditcarddesign/src/main/res/drawable/ic_billing_diners_logo.png b/creditcarddesign/src/main/res/drawable/ic_billing_diners_logo.png new file mode 100644 index 0000000..f84baf5 Binary files /dev/null and b/creditcarddesign/src/main/res/drawable/ic_billing_diners_logo.png differ diff --git a/creditcarddesign/src/main/res/values/colors.xml b/creditcarddesign/src/main/res/values/colors.xml index b3da404..ea0b83b 100644 --- a/creditcarddesign/src/main/res/values/colors.xml +++ b/creditcarddesign/src/main/res/values/colors.xml @@ -25,7 +25,8 @@ #800000 #A52A2A - + #D4D4D4 + #D4CCD4 \ No newline at end of file