Skip to content

Commit 02aefbe

Browse files
committed
Merge pull request #7 from dbachelder/develop
several new features/enhancements
2 parents 73cabbf + 72c6763 commit 02aefbe

File tree

16 files changed

+204
-157
lines changed

16 files changed

+204
-157
lines changed

CreditCardEntry/build.gradle

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ buildscript {
33
mavenCentral()
44
}
55
dependencies {
6-
classpath 'com.android.tools.build:gradle:1.1.0'
6+
classpath 'com.android.tools.build:gradle:1.1.3'
77
}
88
}
99
apply plugin: 'com.android.library'
@@ -35,5 +35,5 @@ android {
3535
}
3636

3737
dependencies {
38-
compile 'com.android.support:support-v4:22.0.0'
38+
compile 'com.android.support:support-v4:22.1.0'
3939
}

CreditCardEntry/res/values/attrs.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,7 @@
44
<attr name="include_zip" format="boolean"/>
55
<attr name="include_helper" format="boolean"/>
66
<attr name="helper_text_color" format="color"/>
7+
<attr name="card_number_hint" format="string"/>
8+
<attr name="input_background" format="reference"/>
79
</declare-styleable>
810
</resources>

CreditCardEntry/src/com/devmarvel/creditcardentry/fields/CreditCardText.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,7 @@ public CreditCardText(Context context, AttributeSet attrs, int defStyle) {
3434
@Override
3535
void init() {
3636
super.init();
37-
setGravity(Gravity.LEFT);
38-
setHint("1234 5678 9012 3456");
37+
setGravity(Gravity.LEFT | Gravity.CENTER_VERTICAL);
3938
}
4039

4140
/* TextWatcher Implementation Methods */

CreditCardEntry/src/com/devmarvel/creditcardentry/internal/CreditCardEntry.java

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -123,8 +123,8 @@ public void onClick(View v) {
123123

124124
@Override
125125
public void onCardTypeChange(CardType type) {
126-
cardImage.setImageResource(CreditCardUtil.cardImageForCardType(type, false));
127-
backCardImage.setImageResource(CreditCardUtil.cardImageForCardType(type, true));
126+
cardImage.setImageResource(type.frontResource);
127+
backCardImage.setImageResource(type.backResource);
128128
updateCardImage(false);
129129
}
130130

@@ -177,10 +177,22 @@ public void run() {
177177
}, 1000);
178178
}
179179

180+
public void setCardNumberHint(String hint) {
181+
creditCardText.setHint(hint);
182+
}
183+
180184
public void setCardImageView(ImageView image) {
181185
cardImage = image;
182186
}
183187

188+
@Override
189+
public void setOnFocusChangeListener(OnFocusChangeListener l) {
190+
creditCardText.setOnFocusChangeListener(l);
191+
expDateText.setOnFocusChangeListener(l);
192+
securityCodeText.setOnFocusChangeListener(l);
193+
zipCodeText.setOnFocusChangeListener(l);
194+
}
195+
184196
private void updateCardImage(boolean back) {
185197
if (showingBack != back) {
186198
flipCardImage();
@@ -190,8 +202,7 @@ private void updateCardImage(boolean back) {
190202
}
191203

192204
private void flipCardImage() {
193-
FlipAnimator animator = new FlipAnimator(cardImage, backCardImage,
194-
backCardImage.getWidth() / 2, backCardImage.getHeight() / 2);
205+
FlipAnimator animator = new FlipAnimator(cardImage, backCardImage);
195206
if (cardImage.getVisibility() == View.GONE) {
196207
animator.reverse();
197208
}

CreditCardEntry/src/com/devmarvel/creditcardentry/internal/CreditCardUtil.java

Lines changed: 6 additions & 93 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
import android.annotation.SuppressLint;
44

5-
import com.devmarvel.creditcardentry.R;
65
import com.devmarvel.creditcardentry.library.CardType;
76

87
import java.text.ParseException;
@@ -20,19 +19,6 @@
2019
public class CreditCardUtil {
2120
public static final int CC_LEN_FOR_TYPE = 4; // number of characters to determine length
2221

23-
// See: http://www.regular-expressions.info/creditcard.html
24-
private static final String REGX_VISA = "^4[0-9]{15}?"; // VISA 16
25-
private static final String REGX_MC = "^5[1-5][0-9]{14}$"; // MC 16
26-
private static final String REGX_AMEX = "^3[47][0-9]{13}$"; // AMEX 15
27-
private static final String REGX_DISCOVER = "^6(?:011|5[0-9]{2})[0-9]{12}$"; // Discover 16
28-
private static final String REGX_DINERS_CLUB = "^3(?:0[0-5]|[68][0-9])[0-9]{11}$"; // DinersClub 14
29-
30-
private static final String REGX_VISA_TYPE = "^4[0-9]{3}?"; // VISA 16
31-
private static final String REGX_MC_TYPE = "^5[1-5][0-9]{2}$"; // MC 16
32-
private static final String REGX_AMEX_REG_TYPE = "^3[47][0-9]{2}$"; // AMEX 15
33-
private static final String REGX_DISCOVER_TYPE = "^6(?:011|5[0-9]{2})$"; // Discover 16
34-
private static final String REGX_DINERS_CLUB_TYPE = "^3(?:0[0-5]|[68][0-9])[0-9]$"; // DinersClub
35-
3622
private static String cleanNumber(String number) {
3723
return number.replaceAll("\\s", "");
3824
}
@@ -43,28 +29,9 @@ public static CardType findCardType(String number) {
4329
return CardType.INVALID;
4430
}
4531

46-
String reg = null;
47-
4832
for (CardType type : CardType.values()) {
49-
switch (type) {
50-
case AMEX:
51-
reg = REGX_AMEX_REG_TYPE;
52-
break;
53-
case DISCOVER:
54-
reg = REGX_DISCOVER_TYPE;
55-
break;
56-
case MASTERCARD:
57-
reg = REGX_MC_TYPE;
58-
break;
59-
case VISA:
60-
reg = REGX_VISA_TYPE;
61-
break;
62-
default:
63-
break;
64-
}
65-
66-
if (reg != null) {
67-
Pattern pattern = Pattern.compile(reg);
33+
if (type.typeRegex != null) {
34+
Pattern pattern = Pattern.compile(type.typeRegex);
6835
Matcher matcher = pattern.matcher(number.substring(0,
6936
CC_LEN_FOR_TYPE));
7037

@@ -79,28 +46,10 @@ public static CardType findCardType(String number) {
7946

8047
public static boolean isValidNumber(String number) {
8148
String cleaned = cleanNumber(number);
49+
CardType cardType = findCardType(cleaned);
50+
if(cardType == null || cardType.fullRegex == null) return false;
8251

83-
String reg;
84-
85-
switch (findCardType(cleaned)) {
86-
case AMEX:
87-
reg = REGX_AMEX;
88-
break;
89-
case DISCOVER:
90-
reg = REGX_DISCOVER;
91-
break;
92-
case MASTERCARD:
93-
reg = REGX_MC;
94-
break;
95-
case VISA:
96-
reg = REGX_VISA;
97-
break;
98-
case INVALID:
99-
default:
100-
return false;
101-
}
102-
103-
Pattern pattern = Pattern.compile(reg);
52+
Pattern pattern = Pattern.compile(cardType.fullRegex);
10453
Matcher matcher = pattern.matcher(cleaned);
10554

10655
return matcher.matches() && validateCardNumber(cleaned);
@@ -133,7 +82,7 @@ public static String formatForViewing(String enteredNumber, CardType type) {
13382
if (len <= CC_LEN_FOR_TYPE)
13483
return cleaned;
13584

136-
ArrayList<String> gaps = new ArrayList<>();
85+
ArrayList<String> gaps = new ArrayList<String>();
13786

13887
int segmentLengths[] = { 0, 0, 0 };
13988

@@ -274,40 +223,4 @@ public static int securityCodeValid(CardType type) {
274223
return 3;
275224
}
276225
}
277-
278-
public static int cardImageForCardType(CardType type, boolean back) {
279-
switch (type) {
280-
case AMEX:
281-
if (back) {
282-
return R.drawable.amex_back;
283-
} else {
284-
return R.drawable.amex;
285-
}
286-
case DISCOVER:
287-
if (back) {
288-
return R.drawable.cc_back;
289-
} else {
290-
return R.drawable.discover;
291-
}
292-
case MASTERCARD:
293-
if (back) {
294-
return R.drawable.cc_back;
295-
} else {
296-
return R.drawable.master_card;
297-
}
298-
case VISA:
299-
if (back) {
300-
return R.drawable.cc_back;
301-
} else {
302-
return R.drawable.visa;
303-
}
304-
default:
305-
if (back) {
306-
return R.drawable.cc_back;
307-
} else {
308-
return R.drawable.unknown_cc;
309-
}
310-
}
311-
}
312-
313226
}

CreditCardEntry/src/com/devmarvel/creditcardentry/internal/FlipAnimator.java

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,11 +37,15 @@ class FlipAnimator extends Animation {
3737
* @param centerY
3838
* The center of the views in the y-axis.
3939
*/
40-
public FlipAnimator(View fromView, View toView, int centerX, int centerY) {
40+
public FlipAnimator(View fromView, View toView) {
4141
this.fromView = fromView;
4242
this.toView = toView;
43-
this.centerX = centerX;
44-
this.centerY = centerY;
43+
View v = toView;
44+
if(fromView.getVisibility() == View.VISIBLE) {
45+
v = fromView;
46+
}
47+
this.centerX = v.getWidth() / 2;
48+
this.centerY = v.getHeight() / 2;
4549

4650
setDuration(500);
4751
setFillAfter(true);
@@ -64,6 +68,7 @@ public void initialize(int width, int height, int parentWidth,
6468

6569
@Override
6670
protected void applyTransformation(float interpolatedTime, Transformation t) {
71+
System.out.println("interpolatedTime = " + interpolatedTime);
6772
// Angle around the y-axis of the rotation at the given time. It is
6873
// calculated both in radians and in the equivalent degrees.
6974
final double radians = Math.PI * interpolatedTime;

CreditCardEntry/src/com/devmarvel/creditcardentry/library/CardType.java

Lines changed: 41 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,54 @@
11
package com.devmarvel.creditcardentry.library;
22

3+
import android.support.annotation.DrawableRes;
4+
5+
import com.devmarvel.creditcardentry.R;
6+
7+
class CardRegex {
8+
// See: http://www.regular-expressions.info/creditcard.html
9+
static final String REGX_VISA = "^4[0-9]{15}?"; // VISA 16
10+
static final String REGX_MC = "^5[1-5][0-9]{14}$"; // MC 16
11+
static final String REGX_AMEX = "^3[47][0-9]{13}$"; // AMEX 15
12+
static final String REGX_DISCOVER = "^6(?:011|5[0-9]{2})[0-9]{12}$"; // Discover 16
13+
static final String REGX_DINERS_CLUB = "^3(?:0[0-5]|[68][0-9])[0-9]{11}$"; // DinersClub 14
14+
15+
static final String REGX_VISA_TYPE = "^4[0-9]{3}?"; // VISA 16
16+
static final String REGX_MC_TYPE = "^5[1-5][0-9]{2}$"; // MC 16
17+
static final String REGX_AMEX_TYPE = "^3[47][0-9]{2}$"; // AMEX 15
18+
static final String REGX_DISCOVER_TYPE = "^6(?:011|5[0-9]{2})$"; // Discover 16
19+
static final String REGX_DINERS_CLUB_TYPE = "^3(?:0[0-5]|[68][0-9])[0-9]$"; // DinersClub
20+
}
21+
322
/**
423
* represents the type of card the user used
524
*/
625
public enum CardType {
7-
VISA("VISA"), MASTERCARD("MasterCard"), AMEX("American Express"), DISCOVER("Discover"), INVALID("Unknown");
26+
VISA( "VISA", R.drawable.visa, CardRegex.REGX_VISA, CardRegex.REGX_VISA_TYPE),
27+
MASTERCARD( "MasterCard", R.drawable.master_card, CardRegex.REGX_MC, CardRegex.REGX_MC_TYPE),
28+
AMEX( "American Express", R.drawable.amex, CardRegex.REGX_AMEX, CardRegex.REGX_AMEX_TYPE),
29+
DISCOVER( "Discover", R.drawable.discover, CardRegex.REGX_DISCOVER, CardRegex.REGX_DISCOVER_TYPE),
30+
INVALID( "Unknown", R.drawable.unknown_cc, null, null);
831

32+
/** name for humans */
933
public final String name;
1034

11-
CardType(String name) {
35+
/** regex that matches the entire card number */
36+
public final String fullRegex;
37+
38+
/** regex that will match when there is enough of the card to determine type */
39+
public final String typeRegex;
40+
41+
/** drawable for the front of the card */
42+
public final int frontResource;
43+
44+
/** drawable for the back of the card */
45+
public final int backResource = R.drawable.cc_back;
46+
47+
CardType(String name, @DrawableRes int imageResource, String fullRegex, String typeRegex) {
1248
this.name = name;
49+
this.frontResource = imageResource;
50+
this.fullRegex = fullRegex;
51+
this.typeRegex = typeRegex;
1352
}
1453

1554
@Override

0 commit comments

Comments
 (0)