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 @@ + + + + + + + + + +