diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..0498542
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,34 @@
+/*.jks
+.gradle
+.DS_Store
+
+# generated files
+build/
+app/build
+
+# Local configuration file (sdk path, etc)
+local.properties
+
+# Eclipse project files
+.classpath
+.project
+
+# Proguard folder generated by Eclipse
+proguard/
+
+# Intellij project files
+*.iml
+*.ipr
+*.iws
+.idea/
+
+# Gradle wrapper
+/gradle
+/gradlew
+/gradlew.bat
+gradle.properties
+
+app/src/androidTest/
+app/src/test/
+/app/google-services.json
+/captures/
\ No newline at end of file
diff --git a/app/.gitignore b/app/.gitignore
new file mode 100644
index 0000000..796b96d
--- /dev/null
+++ b/app/.gitignore
@@ -0,0 +1 @@
+/build
diff --git a/app/build.gradle b/app/build.gradle
new file mode 100644
index 0000000..1a46102
--- /dev/null
+++ b/app/build.gradle
@@ -0,0 +1,45 @@
+apply plugin: 'com.android.application'
+
+android {
+ compileSdkVersion 25
+ buildToolsVersion "25.0.2"
+
+ dexOptions {
+ javaMaxHeapSize "2g"
+ }
+
+ dataBinding {
+ enabled = true
+ }
+
+ defaultConfig {
+ applicationId "ru.adonixis.submitcreditcardflow"
+ minSdkVersion 16
+ targetSdkVersion 25
+ versionCode 1
+ versionName "1.0"
+ vectorDrawables.useSupportLibrary = true
+ }
+
+ buildTypes {
+ release {
+ minifyEnabled true
+ shrinkResources true
+ zipAlignEnabled true
+ proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
+ }
+
+ debug {
+ minifyEnabled false
+ debuggable true
+ proguardFiles getDefaultProguardFile('proguard-android.txt')
+ }
+ }
+}
+
+dependencies {
+ compile 'com.android.support:appcompat-v7:25.0.1'
+ compile 'com.android.support:cardview-v7:25.0.1'
+ compile 'com.android.support:design:25.0.1'
+ compile 'com.android.support.constraint:constraint-layout:1.0.0-beta4'
+}
diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro
new file mode 100644
index 0000000..b9abb35
--- /dev/null
+++ b/app/proguard-rules.pro
@@ -0,0 +1,25 @@
+# Add project specific ProGuard rules here.
+# By default, the flags in this file are appended to flags specified
+# in H:\Android\sdk/tools/proguard/proguard-android.txt
+# You can edit the include path and order by changing the proguardFiles
+# directive in build.gradle.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# Add any project specific keep options here:
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..c7d8b8d
--- /dev/null
+++ b/app/src/main/AndroidManifest.xml
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/assets/fonts/PTM55FT.ttf b/app/src/main/assets/fonts/PTM55FT.ttf
new file mode 100644
index 0000000..f580123
Binary files /dev/null and b/app/src/main/assets/fonts/PTM55FT.ttf differ
diff --git a/app/src/main/java/ru/adonixis/submitcreditcardflow/Card.java b/app/src/main/java/ru/adonixis/submitcreditcardflow/Card.java
new file mode 100644
index 0000000..2e7a4ae
--- /dev/null
+++ b/app/src/main/java/ru/adonixis/submitcreditcardflow/Card.java
@@ -0,0 +1,60 @@
+package ru.adonixis.submitcreditcardflow;
+
+public class Card {
+
+ private String cardNumber;
+ private String expiredDate;
+ private String cardHolder;
+ private String cvvCode;
+
+ public Card() {
+ }
+
+ public Card(String cardNumber, String expiredDate, String cardHolder, String cvvCode) {
+ this.cardNumber = cardNumber;
+ this.expiredDate = expiredDate;
+ this.cardHolder = cardHolder;
+ this.cvvCode = cvvCode;
+ }
+
+ public String getCardNumber() {
+ return cardNumber;
+ }
+
+ public void setCardNumber(String cardNumber) {
+ this.cardNumber = cardNumber;
+ }
+
+ public String getExpiredDate() {
+ return expiredDate;
+ }
+
+ public void setExpiredDate(String expiredDate) {
+ this.expiredDate = expiredDate;
+ }
+
+ public String getCardHolder() {
+ return cardHolder;
+ }
+
+ public void setCardHolder(String cardHolder) {
+ this.cardHolder = cardHolder;
+ }
+
+ public String getCvvCode() {
+ return cvvCode;
+ }
+
+ public void setCvvCode(String cvvCode) {
+ this.cvvCode = cvvCode;
+ }
+
+ @Override
+ public String toString() {
+ return "Card info:\r\n" +
+ "Card number = " + cardNumber + "\r\n" +
+ "Expired date = " + expiredDate + "\r\n" +
+ "Card holder = " + cardHolder + "\r\n" +
+ "CVV code = " + cvvCode;
+ }
+}
diff --git a/app/src/main/java/ru/adonixis/submitcreditcardflow/PTMonoTextView.java b/app/src/main/java/ru/adonixis/submitcreditcardflow/PTMonoTextView.java
new file mode 100644
index 0000000..4740354
--- /dev/null
+++ b/app/src/main/java/ru/adonixis/submitcreditcardflow/PTMonoTextView.java
@@ -0,0 +1,29 @@
+package ru.adonixis.submitcreditcardflow;
+
+import android.content.Context;
+import android.graphics.Typeface;
+import android.support.v7.widget.AppCompatTextView;
+import android.util.AttributeSet;
+
+public class PTMonoTextView extends AppCompatTextView {
+
+ public PTMonoTextView(Context context) {
+ super(context);
+ applyCustomFont(context);
+ }
+
+ public PTMonoTextView(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ applyCustomFont(context);
+ }
+
+ public PTMonoTextView(Context context, AttributeSet attrs, int defStyle) {
+ super(context, attrs, defStyle);
+ applyCustomFont(context);
+ }
+
+ private void applyCustomFont(Context context) {
+ Typeface typeface = Typeface.createFromAsset(context.getAssets(), "fonts/PTM55FT.ttf");
+ setTypeface(typeface);
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/ru/adonixis/submitcreditcardflow/SubmitCreditCardActivity.java b/app/src/main/java/ru/adonixis/submitcreditcardflow/SubmitCreditCardActivity.java
new file mode 100644
index 0000000..0fb49d0
--- /dev/null
+++ b/app/src/main/java/ru/adonixis/submitcreditcardflow/SubmitCreditCardActivity.java
@@ -0,0 +1,412 @@
+package ru.adonixis.submitcreditcardflow;
+
+import android.animation.Animator;
+import android.animation.AnimatorInflater;
+import android.animation.AnimatorSet;
+import android.animation.ObjectAnimator;
+import android.content.Context;
+import android.content.res.Resources;
+import android.databinding.DataBindingUtil;
+import android.graphics.Point;
+import android.os.Bundle;
+import android.os.Handler;
+import android.support.v4.view.PagerAdapter;
+import android.support.v4.view.ViewPager;
+import android.support.v7.app.AppCompatActivity;
+import android.text.Editable;
+import android.text.TextWatcher;
+import android.util.DisplayMetrics;
+import android.view.Display;
+import android.view.KeyEvent;
+import android.view.Menu;
+import android.view.MenuItem;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.WindowManager;
+import android.view.animation.DecelerateInterpolator;
+import android.view.inputmethod.EditorInfo;
+import android.view.inputmethod.InputMethodManager;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import ru.adonixis.submitcreditcardflow.databinding.ActivitySubmitCreditCardBinding;
+
+public class SubmitCreditCardActivity extends AppCompatActivity {
+
+ private boolean showingGray = true;
+ private AnimatorSet inSet;
+ private AnimatorSet outSet;
+ private ActivitySubmitCreditCardBinding activitySubmitCreditCardBinding;
+ private Card card;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ activitySubmitCreditCardBinding = DataBindingUtil.setContentView(this, R.layout.activity_submit_credit_card);
+ card = new Card();
+
+ setSupportActionBar(activitySubmitCreditCardBinding.toolbar);
+
+ View.OnClickListener onHelpClickListener = new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ Toast.makeText(SubmitCreditCardActivity.this, "The CVV Number (\"Card Verification Value\") is a 3 or 4 digit number on your credit and debit cards", Toast.LENGTH_LONG).show();
+ }
+ };
+
+ activitySubmitCreditCardBinding.iconHelpGray.setOnClickListener(onHelpClickListener);
+ activitySubmitCreditCardBinding.iconHelpBlue.setOnClickListener(onHelpClickListener);
+
+ activitySubmitCreditCardBinding.inputEditCardNumber.addTextChangedListener(new TextWatcher() {
+
+ private boolean lock;
+
+ @Override
+ public void beforeTextChanged(CharSequence s, int start, int count, int after) {
+ }
+
+ @Override
+ public void onTextChanged(CharSequence s, int start, int before, int count) {
+ if (s.length() != 0) {
+ flipToBlue();
+ }
+ }
+
+ @Override
+ public void afterTextChanged(Editable s) {
+ if (lock || s.length() > 16) {
+ return;
+ }
+ lock = true;
+ for (int i = 4; i < s.length(); i += 5) {
+ if (s.toString().charAt(i) != ' ') {
+ s.insert(i, " ");
+ }
+ }
+ lock = false;
+ }
+ });
+
+ activitySubmitCreditCardBinding.inputEditExpiredDate.addTextChangedListener(new TextWatcher() {
+
+ private boolean lock;
+
+ @Override
+ public void beforeTextChanged(CharSequence s, int start, int count, int after) {
+ }
+
+ @Override
+ public void onTextChanged(CharSequence s, int start, int before, int count) {
+
+ }
+
+ @Override
+ public void afterTextChanged(Editable s) {
+ if (lock || s.length() > 4) {
+ return;
+ }
+ lock = true;
+ if (s.length() > 2 && s.toString().charAt(2) != '/') {
+ s.insert(2, "/");
+ }
+ lock = false;
+ }
+ });
+
+ Display display = getWindowManager().getDefaultDisplay();
+ Point size = new Point();
+ display.getSize(size);
+ int width = size.x;
+ int height = size.y;
+
+ PagerAdapter adapter = new MyPagerAdapter();
+ activitySubmitCreditCardBinding.viewPager.setAdapter(adapter);
+ activitySubmitCreditCardBinding.viewPager.setClipToPadding(false);
+ activitySubmitCreditCardBinding.viewPager.setPadding(width / 4, 0, width / 4, 0);
+ activitySubmitCreditCardBinding.viewPager.setPageMargin(width / 14);
+ activitySubmitCreditCardBinding.viewPager.setPagingEnabled(false);
+ activitySubmitCreditCardBinding.viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
+ @Override
+ public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
+ }
+
+ @Override
+ public void onPageSelected(int position) {
+ switch (position) {
+ case 0:
+ updateProgressBar(25);
+ activitySubmitCreditCardBinding.inputEditCardNumber.setFocusableInTouchMode(true);
+ activitySubmitCreditCardBinding.inputEditExpiredDate.setFocusable(false);
+ activitySubmitCreditCardBinding.inputEditCardHolder.setFocusable(false);
+ activitySubmitCreditCardBinding.inputEditCvvCode.setFocusable(false);
+ activitySubmitCreditCardBinding.inputEditCardNumber.requestFocus();
+ return;
+ case 1:
+ updateProgressBar(50);
+ activitySubmitCreditCardBinding.inputEditCardNumber.setFocusable(false);
+ activitySubmitCreditCardBinding.inputEditExpiredDate.setFocusableInTouchMode(true);
+ activitySubmitCreditCardBinding.inputEditCardHolder.setFocusable(false);
+ activitySubmitCreditCardBinding.inputEditCvvCode.setFocusable(false);
+ activitySubmitCreditCardBinding.inputEditExpiredDate.requestFocus();
+ return;
+ case 2:
+ updateProgressBar(75);
+ activitySubmitCreditCardBinding.inputEditCardNumber.setFocusable(false);
+ activitySubmitCreditCardBinding.inputEditExpiredDate.setFocusable(false);
+ activitySubmitCreditCardBinding.inputEditCardHolder.setFocusableInTouchMode(true);
+ activitySubmitCreditCardBinding.inputEditCvvCode.setFocusable(false);
+ activitySubmitCreditCardBinding.inputEditCardHolder.requestFocus();
+ return;
+ case 3:
+ updateProgressBar(100);
+ activitySubmitCreditCardBinding.inputEditCardNumber.setFocusable(false);
+ activitySubmitCreditCardBinding.inputEditExpiredDate.setFocusable(false);
+ activitySubmitCreditCardBinding.inputEditCardHolder.setFocusable(false);
+ activitySubmitCreditCardBinding.inputEditCvvCode.setFocusableInTouchMode(true);
+ activitySubmitCreditCardBinding.inputEditCvvCode.requestFocus();
+ return;
+ case 4:
+ activitySubmitCreditCardBinding.inputEditCardNumber.setFocusable(false);
+ activitySubmitCreditCardBinding.inputEditExpiredDate.setFocusable(false);
+ activitySubmitCreditCardBinding.inputEditCardHolder.setFocusable(false);
+ activitySubmitCreditCardBinding.inputEditCvvCode.setFocusable(false);
+ return;
+ }
+ }
+
+ @Override
+ public void onPageScrollStateChanged(int state) {
+ }
+ });
+
+ TextView.OnEditorActionListener onEditorActionListener = new TextView.OnEditorActionListener() {
+ @Override
+ public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
+ boolean handled = false;
+ if (actionId == EditorInfo.IME_ACTION_NEXT) {
+ activitySubmitCreditCardBinding.viewPager.setCurrentItem(activitySubmitCreditCardBinding.viewPager.getCurrentItem() + 1);
+ handled = true;
+ }
+ if (actionId == EditorInfo.IME_ACTION_DONE) {
+ submit();
+ handled = true;
+ }
+ return handled;
+ }
+ };
+
+ activitySubmitCreditCardBinding.inputEditCardNumber.setOnEditorActionListener(onEditorActionListener);
+ activitySubmitCreditCardBinding.inputEditExpiredDate.setOnEditorActionListener(onEditorActionListener);
+ activitySubmitCreditCardBinding.inputEditCardHolder.setOnEditorActionListener(onEditorActionListener);
+ activitySubmitCreditCardBinding.inputEditCvvCode.setOnEditorActionListener(onEditorActionListener);
+
+ activitySubmitCreditCardBinding.inputEditCardNumber.requestFocus();
+
+ inSet = (AnimatorSet) AnimatorInflater.loadAnimator(this, R.animator.card_flip_in);
+ outSet = (AnimatorSet) AnimatorInflater.loadAnimator(this, R.animator.card_flip_out);
+ }
+
+ private class MyPagerAdapter extends PagerAdapter {
+
+ @Override
+ public Object instantiateItem(ViewGroup container, int position) {
+ int resId = 0;
+ switch (position) {
+ case 0:
+ resId = R.id.input_layout_card_number;
+ break;
+ case 1:
+ resId = R.id.input_layout_expired_date;
+ break;
+ case 2:
+ resId = R.id.input_layout_card_holder;
+ break;
+ case 3:
+ resId = R.id.input_layout_cvv_code;
+ break;
+ case 4:
+ resId = R.id.space;
+ break;
+
+ }
+ return findViewById(resId);
+ }
+
+
+ @Override
+ public void destroyItem(ViewGroup container, int position, Object object) {
+ }
+
+
+ @Override
+ public int getCount() {
+ return 5;
+ }
+
+ @Override
+ public boolean isViewFromObject(View view, Object object) {
+ return view == object;
+ }
+ }
+
+ private void hideKeyboard(View view) {
+ InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
+ imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
+ }
+
+ private void showKeyboard(View view) {
+ InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
+ imm.showSoftInput(view, 0);
+ }
+
+ private void updateProgressBar(int progress) {
+ ObjectAnimator animation = ObjectAnimator.ofInt(activitySubmitCreditCardBinding.progressHorizontal, "progress", progress);
+ animation.setDuration(300);
+ animation.setInterpolator(new DecelerateInterpolator());
+ animation.start();
+ }
+
+ private void submit() {
+ activitySubmitCreditCardBinding.viewPager.setCurrentItem(4);
+ card.setCardNumber(activitySubmitCreditCardBinding.inputEditCardNumber.getText().toString());
+ card.setExpiredDate(activitySubmitCreditCardBinding.inputEditExpiredDate.getText().toString());
+ card.setCardHolder(activitySubmitCreditCardBinding.inputEditCardHolder.getText().toString());
+ card.setCvvCode(activitySubmitCreditCardBinding.inputEditCvvCode.getText().toString());
+ Toast.makeText(SubmitCreditCardActivity.this, card.toString(), Toast.LENGTH_LONG).show();
+
+ new Handler().postDelayed(new Runnable() {
+ @Override
+ public void run() {
+ activitySubmitCreditCardBinding.inputLayoutCvvCode.setVisibility(View.INVISIBLE);
+ getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING);
+ activitySubmitCreditCardBinding.labelSecureSubmission.setVisibility(View.VISIBLE);
+ hideKeyboard(activitySubmitCreditCardBinding.inputEditCvvCode);
+ activitySubmitCreditCardBinding.progressCircle.setVisibility(View.VISIBLE);
+ }
+ }, 300);
+ }
+
+ private void reset() {
+ getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
+
+ activitySubmitCreditCardBinding.inputLayoutCvvCode.setVisibility(View.VISIBLE);
+ activitySubmitCreditCardBinding.progressCircle.setVisibility(View.GONE);
+ activitySubmitCreditCardBinding.labelSecureSubmission.setVisibility(View.GONE);
+ flipToGray();
+ activitySubmitCreditCardBinding.viewPager.setCurrentItem(0);
+ activitySubmitCreditCardBinding.inputEditCardNumber.setText("");
+ activitySubmitCreditCardBinding.inputEditExpiredDate.setText("");
+ activitySubmitCreditCardBinding.inputEditCardHolder.setText("");
+ activitySubmitCreditCardBinding.inputEditCvvCode.setText("");
+ activitySubmitCreditCardBinding.inputEditCardNumber.requestFocus();
+ showKeyboard(activitySubmitCreditCardBinding.inputEditCardNumber);
+ }
+
+ private void flipToGray() {
+ if (!showingGray && !outSet.isRunning() && !inSet.isRunning()) {
+ showingGray = true;
+
+ activitySubmitCreditCardBinding.cardBlue.setCardElevation(0);
+ activitySubmitCreditCardBinding.cardGray.setCardElevation(0);
+
+ outSet.setTarget(activitySubmitCreditCardBinding.cardBlue);
+ outSet.start();
+
+ inSet.setTarget(activitySubmitCreditCardBinding.cardGray);
+ inSet.addListener(new Animator.AnimatorListener() {
+ @Override
+ public void onAnimationStart(Animator animation) {
+
+ }
+
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ activitySubmitCreditCardBinding.cardGray.setCardElevation(convertDpToPixel(12, SubmitCreditCardActivity.this));
+ }
+
+ @Override
+ public void onAnimationCancel(Animator animation) {
+
+ }
+
+ @Override
+ public void onAnimationRepeat(Animator animation) {
+
+ }
+ });
+ inSet.start();
+ }
+ }
+
+ private void flipToBlue() {
+ if (showingGray && !outSet.isRunning() && !inSet.isRunning()) {
+ showingGray = false;
+
+ activitySubmitCreditCardBinding.cardGray.setCardElevation(0);
+ activitySubmitCreditCardBinding.cardBlue.setCardElevation(0);
+
+ outSet.setTarget(activitySubmitCreditCardBinding.cardGray);
+ outSet.start();
+
+ inSet.setTarget(activitySubmitCreditCardBinding.cardBlue);
+ inSet.addListener(new Animator.AnimatorListener() {
+ @Override
+ public void onAnimationStart(Animator animation) {
+
+ }
+
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ activitySubmitCreditCardBinding.cardBlue.setCardElevation(convertDpToPixel(12, SubmitCreditCardActivity.this));
+ }
+
+ @Override
+ public void onAnimationCancel(Animator animation) {
+
+ }
+
+ @Override
+ public void onAnimationRepeat(Animator animation) {
+
+ }
+ });
+ inSet.start();
+ }
+ }
+
+ public static float convertDpToPixel(float dp, Context context){
+ Resources resources = context.getResources();
+ DisplayMetrics metrics = resources.getDisplayMetrics();
+ float px = dp * ((float)metrics.densityDpi / DisplayMetrics.DENSITY_DEFAULT);
+ return px;
+ }
+
+ public static float convertPixelsToDp(float px, Context context){
+ Resources resources = context.getResources();
+ DisplayMetrics metrics = resources.getDisplayMetrics();
+ float dp = px / ((float)metrics.densityDpi / DisplayMetrics.DENSITY_DEFAULT);
+ return dp;
+ }
+
+ @Override
+ public boolean onCreateOptionsMenu(Menu menu) {
+ super.onCreateOptionsMenu(menu);
+ getMenuInflater().inflate(R.menu.menu_main, menu);
+ return true;
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ switch (item.getItemId()) {
+ case R.id.action_reset:
+ reset();
+ return true;
+ case android.R.id.home:
+ finish();
+ return true;
+ }
+ return super.onOptionsItemSelected(item);
+ }
+
+}
diff --git a/app/src/main/java/ru/adonixis/submitcreditcardflow/WrapContentHeightViewPager.java b/app/src/main/java/ru/adonixis/submitcreditcardflow/WrapContentHeightViewPager.java
new file mode 100644
index 0000000..d674de6
--- /dev/null
+++ b/app/src/main/java/ru/adonixis/submitcreditcardflow/WrapContentHeightViewPager.java
@@ -0,0 +1,60 @@
+package ru.adonixis.submitcreditcardflow;
+
+import android.content.Context;
+import android.support.v4.view.ViewPager;
+import android.util.AttributeSet;
+import android.view.MotionEvent;
+import android.view.View;
+
+public class WrapContentHeightViewPager extends ViewPager {
+
+ private boolean enabled;
+
+ public WrapContentHeightViewPager(Context context) {
+ super(context);
+ this.enabled = true;
+ }
+
+ public WrapContentHeightViewPager(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ this.enabled = true;
+ }
+
+ @Override
+ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+ int height = 0;
+ for (int i = 0; i < getChildCount(); i++) {
+ View child = getChildAt(i);
+ child.measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
+ int h = child.getMeasuredHeight();
+ if (h > height) height = h;
+ }
+
+ heightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY);
+
+ super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+ }
+
+
+ @Override
+ public boolean onTouchEvent(MotionEvent event) {
+ if (this.enabled) {
+ return super.onTouchEvent(event);
+ }
+
+ return false;
+ }
+
+ @Override
+ public boolean onInterceptTouchEvent(MotionEvent event) {
+ if (this.enabled) {
+ return super.onInterceptTouchEvent(event);
+ }
+
+ return false;
+ }
+
+ public void setPagingEnabled(boolean enabled) {
+ this.enabled = enabled;
+ }
+}
diff --git a/app/src/main/res/animator/card_flip_in.xml b/app/src/main/res/animator/card_flip_in.xml
new file mode 100644
index 0000000..4491a0a
--- /dev/null
+++ b/app/src/main/res/animator/card_flip_in.xml
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/animator/card_flip_out.xml b/app/src/main/res/animator/card_flip_out.xml
new file mode 100644
index 0000000..7e99d81
--- /dev/null
+++ b/app/src/main/res/animator/card_flip_out.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/blue_gradient.xml b/app/src/main/res/drawable/blue_gradient.xml
new file mode 100644
index 0000000..3c226fb
--- /dev/null
+++ b/app/src/main/res/drawable/blue_gradient.xml
@@ -0,0 +1,10 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_close_gray_24dp.xml b/app/src/main/res/drawable/ic_close_gray_24dp.xml
new file mode 100644
index 0000000..ce3f0b3
--- /dev/null
+++ b/app/src/main/res/drawable/ic_close_gray_24dp.xml
@@ -0,0 +1,10 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_help_translucent_24dp.xml b/app/src/main/res/drawable/ic_help_translucent_24dp.xml
new file mode 100644
index 0000000..95533a2
--- /dev/null
+++ b/app/src/main/res/drawable/ic_help_translucent_24dp.xml
@@ -0,0 +1,10 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_lock_translucent_24dp.xml b/app/src/main/res/drawable/ic_lock_translucent_24dp.xml
new file mode 100644
index 0000000..ec159b4
--- /dev/null
+++ b/app/src/main/res/drawable/ic_lock_translucent_24dp.xml
@@ -0,0 +1,10 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_reset_blue_24dp.xml b/app/src/main/res/drawable/ic_reset_blue_24dp.xml
new file mode 100644
index 0000000..04f9d72
--- /dev/null
+++ b/app/src/main/res/drawable/ic_reset_blue_24dp.xml
@@ -0,0 +1,12 @@
+
+
+
diff --git a/app/src/main/res/layout/activity_submit_credit_card.xml b/app/src/main/res/layout/activity_submit_credit_card.xml
new file mode 100644
index 0000000..e8903fc
--- /dev/null
+++ b/app/src/main/res/layout/activity_submit_credit_card.xml
@@ -0,0 +1,422 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/menu/menu_main.xml b/app/src/main/res/menu/menu_main.xml
new file mode 100644
index 0000000..163c3f4
--- /dev/null
+++ b/app/src/main/res/menu/menu_main.xml
@@ -0,0 +1,14 @@
+
\ No newline at end of file
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.png b/app/src/main/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000..f52b592
Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.png b/app/src/main/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000..1ed7f9d
Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/app/src/main/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000..70ff675
Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000..849bcd1
Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000..f1df75e
Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/app/src/main/res/values-v21/styles.xml b/app/src/main/res/values-v21/styles.xml
new file mode 100644
index 0000000..df44af6
--- /dev/null
+++ b/app/src/main/res/values-v21/styles.xml
@@ -0,0 +1,8 @@
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-v23/styles.xml b/app/src/main/res/values-v23/styles.xml
new file mode 100644
index 0000000..9ce5808
--- /dev/null
+++ b/app/src/main/res/values-v23/styles.xml
@@ -0,0 +1,10 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml
new file mode 100644
index 0000000..8c3313c
--- /dev/null
+++ b/app/src/main/res/values/colors.xml
@@ -0,0 +1,10 @@
+
+
+ #F0F5F5
+ #80FFFFFF
+ #243037
+
+ #59AAFF
+ #2C7DE3
+ #1C6AC9
+
\ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
new file mode 100644
index 0000000..cd00958
--- /dev/null
+++ b/app/src/main/res/values/strings.xml
@@ -0,0 +1,17 @@
+
+ Submit Credit Card
+
+ Reset
+
+ XXXX XXXX XXXX XXXX
+ MM/YY
+ CARD HOLDER
+ CVV CODE
+
+ 16-DIGIT CARD NUMBER
+ EXPIRED DATE
+ CARD HOLDER
+ CVV CODE
+
+ Secure Submission
+
diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml
new file mode 100644
index 0000000..b47fb97
--- /dev/null
+++ b/app/src/main/res/values/styles.xml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/build.gradle b/build.gradle
new file mode 100644
index 0000000..153ce1b
--- /dev/null
+++ b/build.gradle
@@ -0,0 +1,23 @@
+// Top-level build file where you can add configuration options common to all sub-projects/modules.
+
+buildscript {
+ repositories {
+ jcenter()
+ }
+ dependencies {
+ classpath 'com.android.tools.build:gradle:2.3.0-beta3'
+
+ // NOTE: Do not place your application dependencies here; they belong
+ // in the individual module build.gradle files
+ }
+}
+
+allprojects {
+ repositories {
+ jcenter()
+ }
+}
+
+task clean(type: Delete) {
+ delete rootProject.buildDir
+}
diff --git a/settings.gradle b/settings.gradle
new file mode 100644
index 0000000..e7b4def
--- /dev/null
+++ b/settings.gradle
@@ -0,0 +1 @@
+include ':app'