Skip to content

Commit f2e7b14

Browse files
authored
Merge pull request #19 from emmanuelkehinde/exp-date
Allow users enter their card expiry date easily; provide better UX
2 parents 7369426 + 31d543b commit f2e7b14

File tree

2 files changed

+67
-26
lines changed

2 files changed

+67
-26
lines changed

raveandroid/src/main/java/com/flutterwave/raveandroid/card/CardFragment.java

Lines changed: 65 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
import android.support.v7.widget.LinearLayoutManager;
1717
import android.support.v7.widget.RecyclerView;
1818
import android.support.v7.widget.SwitchCompat;
19+
import android.text.Editable;
20+
import android.text.TextWatcher;
1921
import android.text.util.Linkify;
2022
import android.text.util.Linkify.TransformFilter;
2123
import android.util.Log;
@@ -45,6 +47,9 @@
4547
import com.flutterwave.raveandroid.responses.ChargeResponse;
4648
import com.flutterwave.raveandroid.responses.RequeryResponse;
4749

50+
import java.text.ParseException;
51+
import java.text.SimpleDateFormat;
52+
import java.util.Calendar;
4853
import java.util.List;
4954
import java.util.regex.Matcher;
5055
import java.util.regex.Pattern;
@@ -161,29 +166,7 @@ public void onClick(View v) {
161166
}
162167
});
163168

164-
cardExpiryTv.setOnClickListener(new View.OnClickListener() {
165-
@Override
166-
public void onClick(View v) {
167-
ExpirationPickerBuilder epb = new ExpirationPickerBuilder()
168-
.setFragmentManager(getActivity().getSupportFragmentManager())
169-
.setStyleResId(R.style.BetterPickersDialogFragment)
170-
.setMinYear(2000);
171-
epb.show();
172-
173-
epb.addExpirationPickerDialogHandler(new ExpirationPickerDialogFragment.ExpirationPickerDialogHandler() {
174-
@Override
175-
public void onDialogExpirationSet(int reference, int year, int monthOfYear) {
176-
String month = String.valueOf(monthOfYear);
177-
if (month.length() != 2) {
178-
month = "0" + month;
179-
}
180-
181-
String year_str = String.valueOf(year).substring(2, 4);
182-
cardExpiryTv.setText(month + "/" + year_str);
183-
}
184-
});
185-
}
186-
});
169+
cardExpiryTv.addTextChangedListener(new ExpiryWatcher());
187170

188171

189172
payButton.setOnClickListener(this);
@@ -851,4 +834,63 @@ public void onPageFinished(WebView view, String url) {
851834
}
852835
}
853836

837+
private class ExpiryWatcher implements TextWatcher {
838+
839+
private final Calendar calendar;
840+
private final SimpleDateFormat simpleDateFormat;
841+
private String lastInput = "";
842+
843+
public ExpiryWatcher() {
844+
calendar = Calendar.getInstance();
845+
simpleDateFormat = new SimpleDateFormat("MM/yy");
846+
}
847+
848+
@Override
849+
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
850+
851+
}
852+
853+
@Override
854+
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
855+
856+
}
857+
858+
@Override
859+
public void afterTextChanged(Editable editable) {
860+
String input = editable.toString();
861+
862+
try {
863+
calendar.setTime(simpleDateFormat.parse(input));
864+
} catch (ParseException e) {
865+
if (editable.length() == 2 && !lastInput.endsWith("/")) {
866+
int month = Integer.parseInt(input);
867+
if (month <= 12) {
868+
cardExpiryTv.setText(cardExpiryTv.getText().toString() + "/");
869+
cardExpiryTv.setSelection(cardExpiryTv.getText().toString().length());
870+
} else {
871+
cardExpiryTv.setText("12");
872+
cardExpiryTv.setSelection(cardExpiryTv.getText().toString().length());
873+
}
874+
} else if (editable.length() == 2 && lastInput.endsWith("/")) {
875+
int month = Integer.parseInt(input);
876+
if (month <= 12) {
877+
cardExpiryTv.setText(cardExpiryTv.getText().toString().substring(0,1));
878+
cardExpiryTv.setSelection(cardExpiryTv.getText().toString().length());
879+
} else {
880+
cardExpiryTv.setText("12");
881+
cardExpiryTv.setSelection(cardExpiryTv.getText().toString().length());
882+
}
883+
} else if (editable.length() == 1) {
884+
int month = Integer.parseInt(input);
885+
if (month > 1) {
886+
cardExpiryTv.setText("0" + cardExpiryTv.getText().toString() + "/");
887+
cardExpiryTv.setSelection(cardExpiryTv.getText().toString().length());
888+
}
889+
}
890+
891+
lastInput = cardExpiryTv.getText().toString();
892+
}
893+
}
894+
}
895+
854896
}

raveandroid/src/main/res/layout/fragment_card.xml

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -95,10 +95,9 @@
9595
android:hint="@string/expiration"
9696
android:paddingRight="50dp"
9797
android:paddingEnd="50dp"
98-
android:focusableInTouchMode="false"
99-
android:clickable="true"
10098
android:id="@+id/rave_cardExpiryTv"
101-
android:inputType="date"
99+
android:inputType="number"
100+
android:maxLength="5"
102101
android:layout_below="@+id/rave_card1"
103102
android:layout_marginBottom="10dp"
104103
/>

0 commit comments

Comments
 (0)