From f9e3db503777b04e3859b4dbb0905294d8bf4669 Mon Sep 17 00:00:00 2001 From: denizsubasi Date: Thu, 27 Jun 2019 10:13:28 +0300 Subject: [PATCH 1/2] migrated to androidx --- app/build.gradle | 12 ++++++------ .../creditcarddesign/sample/MainActivity.java | 2 +- build.gradle | 11 ++++++++++- creditcarddesign/build.gradle | 17 ++++++++--------- .../creditcarddesign/CardEditActivity.java | 4 ++-- .../creditcarddesign/CreditCardUtils.java | 2 +- .../creditcarddesign/CreditCardView.java | 3 +-- .../pager/CardFragmentAdapter.java | 6 +++--- .../pager/CreditCardFragment.java | 2 +- .../views/HeightWrappingViewPager.java | 2 +- .../src/main/res/layout/lyt_card_cvv.xml | 4 ++-- .../src/main/res/layout/lyt_card_expiry.xml | 4 ++-- .../main/res/layout/lyt_card_holder_name.xml | 4 ++-- .../src/main/res/layout/lyt_card_number.xml | 4 ++-- gradle.properties | 4 +++- gradle/wrapper/gradle-wrapper.properties | 4 ++-- 16 files changed, 47 insertions(+), 38 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 707a743..12cc796 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,14 +1,13 @@ apply plugin: 'com.android.application' android { - compileSdkVersion 25 - buildToolsVersion "25.0.1" + compileSdkVersion 28 defaultConfig { vectorDrawables.useSupportLibrary = true applicationId "com.cooltechworks.checkoutflow" - minSdkVersion 10 - targetSdkVersion 25 + minSdkVersion 15 + targetSdkVersion 28 versionCode 2 versionName "1.1" } @@ -21,6 +20,7 @@ android { } dependencies { - compile fileTree(include: ['*.jar'], dir: 'libs') - compile project(':creditcarddesign') + implementation fileTree(include: ['*.jar'], dir: 'libs') + implementation project(':creditcarddesign') + implementation 'androidx.appcompat:appcompat:1.0.2' } diff --git a/app/src/main/java/com/cooltechworks/creditcarddesign/sample/MainActivity.java b/app/src/main/java/com/cooltechworks/creditcarddesign/sample/MainActivity.java index 2ade401..31d3abd 100644 --- a/app/src/main/java/com/cooltechworks/creditcarddesign/sample/MainActivity.java +++ b/app/src/main/java/com/cooltechworks/creditcarddesign/sample/MainActivity.java @@ -1,7 +1,7 @@ package com.cooltechworks.creditcarddesign.sample; import android.content.Intent; -import android.support.v7.app.AppCompatActivity; +import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; diff --git a/build.gradle b/build.gradle index 66df64d..9e0b87c 100644 --- a/build.gradle +++ b/build.gradle @@ -3,9 +3,14 @@ buildscript { repositories { jcenter() + maven { + url 'https://maven.google.com/' + name 'Google' + } + google() } dependencies { - classpath 'com.android.tools.build:gradle:2.2.2' + classpath 'com.android.tools.build:gradle:3.4.1' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files @@ -18,6 +23,10 @@ allprojects { maven{ url "https://jitpack.io" } + maven { + url 'https://maven.google.com/' + name 'Google' + } } } diff --git a/creditcarddesign/build.gradle b/creditcarddesign/build.gradle index e70c8f3..542124a 100644 --- a/creditcarddesign/build.gradle +++ b/creditcarddesign/build.gradle @@ -2,12 +2,11 @@ apply plugin: 'com.android.library' android { - compileSdkVersion 25 - buildToolsVersion "25.0.1" + compileSdkVersion 28 defaultConfig { vectorDrawables.useSupportLibrary = true - minSdkVersion 10 - targetSdkVersion 25 + minSdkVersion 15 + targetSdkVersion 28 versionCode 1 versionName "1.0.3" } @@ -20,9 +19,9 @@ android { } dependencies { - final SUPPORT_VERSION = "25.0.1" - compile fileTree(dir: 'libs', include: ['*.jar']) - compile "com.android.support:appcompat-v7:$SUPPORT_VERSION" - compile "com.android.support:cardview-v7:$SUPPORT_VERSION" - compile 'com.github.ozodrukh:CircularReveal:1.0.5' + // final SUPPORT_VERSION = "28.0.0" + implementation fileTree(dir: 'libs', include: ['*.jar']) + implementation 'androidx.appcompat:appcompat:1.0.2' + implementation 'androidx.cardview:cardview:1.0.0' + implementation 'com.github.ozodrukh:CircularReveal:2.0.1' } diff --git a/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/CardEditActivity.java b/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/CardEditActivity.java index 3c90eb4..532ee6f 100644 --- a/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/CardEditActivity.java +++ b/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/CardEditActivity.java @@ -4,8 +4,8 @@ import android.content.Intent; import android.content.res.Configuration; import android.os.Bundle; -import android.support.v4.view.ViewPager; -import android.support.v7.app.AppCompatActivity; +import androidx.viewpager.widget.ViewPager; +import androidx.appcompat.app.AppCompatActivity; import android.view.View; import android.view.WindowManager; import android.view.inputmethod.InputMethodManager; diff --git a/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/CreditCardUtils.java b/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/CreditCardUtils.java index 030d991..1cead1a 100755 --- a/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/CreditCardUtils.java +++ b/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/CreditCardUtils.java @@ -1,6 +1,6 @@ package com.cooltechworks.creditcarddesign; -import android.support.annotation.NonNull; +import androidx.annotation.NonNull; import java.util.Calendar; import java.util.regex.Pattern; diff --git a/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/CreditCardView.java b/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/CreditCardView.java index ad4cb0a..e937092 100644 --- a/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/CreditCardView.java +++ b/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/CreditCardView.java @@ -15,7 +15,6 @@ import android.widget.ImageView; import android.widget.TextView; -import io.codetail.animation.SupportAnimator; import io.codetail.animation.ViewAnimationUtils; /** @@ -341,7 +340,7 @@ public void showAnimation(final View cardContainer, final View v, final int draw if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { - SupportAnimator animator = + Animator animator = ViewAnimationUtils.createCircularReveal(mRevealView, cx, cy, 0, radius); animator.setInterpolator(new AccelerateDecelerateInterpolator()); animator.setDuration(duration); diff --git a/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/pager/CardFragmentAdapter.java b/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/pager/CardFragmentAdapter.java index 2d41a13..a070c9f 100644 --- a/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/pager/CardFragmentAdapter.java +++ b/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/pager/CardFragmentAdapter.java @@ -2,9 +2,9 @@ import android.os.Bundle; import android.os.Parcelable; -import android.support.v4.app.Fragment; -import android.support.v4.app.FragmentManager; -import android.support.v4.app.FragmentStatePagerAdapter; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentStatePagerAdapter; /** * Created by sharish on 9/1/15. diff --git a/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/pager/CreditCardFragment.java b/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/pager/CreditCardFragment.java index 3bb43d2..67feed1 100644 --- a/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/pager/CreditCardFragment.java +++ b/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/pager/CreditCardFragment.java @@ -1,6 +1,6 @@ package com.cooltechworks.creditcarddesign.pager; -import android.support.v4.app.Fragment; +import androidx.fragment.app.Fragment; import android.text.TextWatcher; /** diff --git a/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/views/HeightWrappingViewPager.java b/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/views/HeightWrappingViewPager.java index ef4e6bb..090a745 100644 --- a/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/views/HeightWrappingViewPager.java +++ b/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/views/HeightWrappingViewPager.java @@ -1,7 +1,7 @@ package com.cooltechworks.creditcarddesign.views; import android.content.Context; -import android.support.v4.view.ViewPager; +import androidx.viewpager.widget.ViewPager; import android.util.AttributeSet; import android.view.View; diff --git a/creditcarddesign/src/main/res/layout/lyt_card_cvv.xml b/creditcarddesign/src/main/res/layout/lyt_card_cvv.xml index bb0e67d..e145597 100644 --- a/creditcarddesign/src/main/res/layout/lyt_card_cvv.xml +++ b/creditcarddesign/src/main/res/layout/lyt_card_cvv.xml @@ -7,7 +7,7 @@ android:orientation="vertical" android:padding="@dimen/padding_small"> - - + diff --git a/creditcarddesign/src/main/res/layout/lyt_card_expiry.xml b/creditcarddesign/src/main/res/layout/lyt_card_expiry.xml index 9212ba9..244bfe1 100644 --- a/creditcarddesign/src/main/res/layout/lyt_card_expiry.xml +++ b/creditcarddesign/src/main/res/layout/lyt_card_expiry.xml @@ -7,7 +7,7 @@ app:cardBackgroundColor="@android:color/white" android:padding="@dimen/padding_small"> - - + \ No newline at end of file diff --git a/creditcarddesign/src/main/res/layout/lyt_card_holder_name.xml b/creditcarddesign/src/main/res/layout/lyt_card_holder_name.xml index 7b52964..bea0fb1 100644 --- a/creditcarddesign/src/main/res/layout/lyt_card_holder_name.xml +++ b/creditcarddesign/src/main/res/layout/lyt_card_holder_name.xml @@ -6,7 +6,7 @@ android:orientation="vertical" android:padding="@dimen/padding_small"> - - + \ No newline at end of file diff --git a/creditcarddesign/src/main/res/layout/lyt_card_number.xml b/creditcarddesign/src/main/res/layout/lyt_card_number.xml index f27e74c..be63061 100644 --- a/creditcarddesign/src/main/res/layout/lyt_card_number.xml +++ b/creditcarddesign/src/main/res/layout/lyt_card_number.xml @@ -6,7 +6,7 @@ android:orientation="vertical" android:padding="@dimen/padding_small"> - - + \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index 1d3591c..915f0e6 100644 --- a/gradle.properties +++ b/gradle.properties @@ -15,4 +15,6 @@ # When configured, Gradle will run in incubating parallel mode. # This option should only be used with decoupled projects. More details, visit # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects -# org.gradle.parallel=true \ No newline at end of file +# org.gradle.parallel=true +android.enableJetifier=true +android.useAndroidX=true \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 04e285f..bed566b 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Mon Dec 28 10:00:20 PST 2015 +#Thu Jun 27 10:01:09 EET 2019 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-5.1.1-all.zip From 97c335ad7a163f2a1bc9f5358165a12e978bef45 Mon Sep 17 00:00:00 2001 From: denizsubasi Date: Thu, 27 Jun 2019 11:04:09 +0300 Subject: [PATCH 2/2] changed to Kotlin --- app/build.gradle | 9 + .../creditcarddesign/sample/MainActivity.java | 133 ------ .../creditcarddesign/sample/MainActivity.kt | 121 ++++++ build.gradle | 1 + creditcarddesign/build.gradle | 7 + .../creditcarddesign/CardEditActivity.java | 291 ------------- .../creditcarddesign/CardEditActivity.kt | 249 +++++++++++ .../creditcarddesign/CardSelector.java | 126 ------ .../creditcarddesign/CardSelector.kt | 64 +++ .../creditcarddesign/CreditCardUtils.java | 150 ------- .../creditcarddesign/CreditCardUtils.kt | 149 +++++++ .../creditcarddesign/CreditCardView.java | 386 ------------------ .../creditcarddesign/CreditCardView.kt | 353 ++++++++++++++++ .../creditcarddesign/FlipAnimator.java | 138 ------- .../creditcarddesign/FlipAnimator.kt | 116 ++++++ .../pager/CardCVVFragment.java | 77 ---- .../creditcarddesign/pager/CardCVVFragment.kt | 70 ++++ .../pager/CardExpiryFragment.java | 154 ------- .../pager/CardExpiryFragment.kt | 148 +++++++ .../pager/CardFragmentAdapter.java | 109 ----- .../pager/CardFragmentAdapter.kt | 101 +++++ .../pager/CardNameFragment.java | 63 --- .../pager/CardNameFragment.kt | 58 +++ .../pager/CardNumberFragment.java | 81 ---- .../pager/CardNumberFragment.kt | 76 ++++ .../pager/CreditCardFragment.java | 44 -- .../pager/CreditCardFragment.kt | 42 ++ .../pager/IActionListener.java | 7 - .../creditcarddesign/pager/IActionListener.kt | 7 + .../creditcarddesign/pager/IFocus.java | 8 - .../creditcarddesign/pager/IFocus.kt | 8 + .../creditcarddesign/utils/ViewUtils.kt | 20 + .../views/HeightWrappingViewPager.java | 25 -- .../views/HeightWrappingViewPager.kt | 20 + 34 files changed, 1619 insertions(+), 1792 deletions(-) delete mode 100644 app/src/main/java/com/cooltechworks/creditcarddesign/sample/MainActivity.java create mode 100644 app/src/main/java/com/cooltechworks/creditcarddesign/sample/MainActivity.kt delete mode 100644 creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/CardEditActivity.java create mode 100644 creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/CardEditActivity.kt delete mode 100644 creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/CardSelector.java create mode 100644 creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/CardSelector.kt delete mode 100755 creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/CreditCardUtils.java create mode 100755 creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/CreditCardUtils.kt delete mode 100644 creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/CreditCardView.java create mode 100644 creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/CreditCardView.kt delete mode 100644 creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/FlipAnimator.java create mode 100644 creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/FlipAnimator.kt delete mode 100644 creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/pager/CardCVVFragment.java create mode 100644 creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/pager/CardCVVFragment.kt delete mode 100755 creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/pager/CardExpiryFragment.java create mode 100755 creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/pager/CardExpiryFragment.kt delete mode 100644 creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/pager/CardFragmentAdapter.java create mode 100644 creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/pager/CardFragmentAdapter.kt delete mode 100644 creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/pager/CardNameFragment.java create mode 100644 creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/pager/CardNameFragment.kt delete mode 100644 creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/pager/CardNumberFragment.java create mode 100644 creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/pager/CardNumberFragment.kt delete mode 100644 creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/pager/CreditCardFragment.java create mode 100644 creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/pager/CreditCardFragment.kt delete mode 100644 creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/pager/IActionListener.java create mode 100644 creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/pager/IActionListener.kt delete mode 100644 creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/pager/IFocus.java create mode 100644 creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/pager/IFocus.kt create mode 100644 creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/utils/ViewUtils.kt delete mode 100644 creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/views/HeightWrappingViewPager.java create mode 100644 creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/views/HeightWrappingViewPager.kt diff --git a/app/build.gradle b/app/build.gradle index 12cc796..1b5a38f 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,5 +1,12 @@ apply plugin: 'com.android.application' +apply plugin: 'kotlin-android' + +apply plugin: 'kotlin-android-extensions' + +// apply plugin: 'kotlin-kapt' + + android { compileSdkVersion 28 @@ -23,4 +30,6 @@ dependencies { implementation fileTree(include: ['*.jar'], dir: 'libs') implementation project(':creditcarddesign') implementation 'androidx.appcompat:appcompat:1.0.2' + // implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.3.40' + } diff --git a/app/src/main/java/com/cooltechworks/creditcarddesign/sample/MainActivity.java b/app/src/main/java/com/cooltechworks/creditcarddesign/sample/MainActivity.java deleted file mode 100644 index 31d3abd..0000000 --- a/app/src/main/java/com/cooltechworks/creditcarddesign/sample/MainActivity.java +++ /dev/null @@ -1,133 +0,0 @@ -package com.cooltechworks.creditcarddesign.sample; - -import android.content.Intent; -import androidx.appcompat.app.AppCompatActivity; -import android.os.Bundle; -import android.view.View; -import android.widget.Button; -import android.widget.LinearLayout; - -import com.cooltechworks.checkoutflow.R; -import com.cooltechworks.creditcarddesign.CreditCardView; -import com.cooltechworks.creditcarddesign.CardEditActivity; -import com.cooltechworks.creditcarddesign.CreditCardUtils; - -/** - * Created by glarencezhao on 10/23/16. - */ - -public class MainActivity extends AppCompatActivity { - - private final int CREATE_NEW_CARD = 0; - - private LinearLayout cardContainer; - private Button addCardButton; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_main); - - initialize(); - listeners(); - } - - private void initialize() { - addCardButton = (Button) findViewById(R.id.add_card); - cardContainer = (LinearLayout) findViewById(R.id.card_container); -// getSupportActionBar().setTitle("Payment"); - populate(); - } - - private void populate() { - CreditCardView sampleCreditCardView = new CreditCardView(this); - - String name = "Glarence Zhao"; - String cvv = "420"; - String expiry = "01/18"; - String cardNumber = "4242424242424242"; - - sampleCreditCardView.setCVV(cvv); - sampleCreditCardView.setCardHolderName(name); - sampleCreditCardView.setCardExpiry(expiry); - sampleCreditCardView.setCardNumber(cardNumber); - - cardContainer.addView(sampleCreditCardView); - int index = cardContainer.getChildCount() - 1; - addCardListener(index, sampleCreditCardView); - } - - private void listeners() { - addCardButton.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - - Intent intent = new Intent(MainActivity.this, CardEditActivity.class); - startActivityForResult(intent, CREATE_NEW_CARD); - } - }); - } - - private void addCardListener(final int index, CreditCardView creditCardView) { - creditCardView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - - CreditCardView creditCardView = (CreditCardView) v; - String cardNumber = creditCardView.getCardNumber(); - String expiry = creditCardView.getExpiry(); - String cardHolderName = creditCardView.getCardHolderName(); - String cvv = creditCardView.getCVV(); - - Intent intent = new Intent(MainActivity.this, CardEditActivity.class); - intent.putExtra(CreditCardUtils.EXTRA_CARD_HOLDER_NAME, cardHolderName); - intent.putExtra(CreditCardUtils.EXTRA_CARD_NUMBER, cardNumber); - intent.putExtra(CreditCardUtils.EXTRA_CARD_EXPIRY, expiry); - intent.putExtra(CreditCardUtils.EXTRA_CARD_SHOW_CARD_SIDE, CreditCardUtils.CARD_SIDE_BACK); - intent.putExtra(CreditCardUtils.EXTRA_VALIDATE_EXPIRY_DATE, false); - - // start at the CVV activity to edit it as it is not being passed - intent.putExtra(CreditCardUtils.EXTRA_ENTRY_START_PAGE, CreditCardUtils.CARD_CVV_PAGE); - startActivityForResult(intent, index); - } - }); - } - - public void onActivityResult(int reqCode, int resultCode, Intent data) { - - if (resultCode == RESULT_OK) { -// Debug.printToast("Result Code is OK", getApplicationContext()); - - String name = data.getStringExtra(CreditCardUtils.EXTRA_CARD_HOLDER_NAME); - String cardNumber = data.getStringExtra(CreditCardUtils.EXTRA_CARD_NUMBER); - String expiry = data.getStringExtra(CreditCardUtils.EXTRA_CARD_EXPIRY); - String cvv = data.getStringExtra(CreditCardUtils.EXTRA_CARD_CVV); - - if (reqCode == CREATE_NEW_CARD) { - - CreditCardView creditCardView = new CreditCardView(this); - - creditCardView.setCVV(cvv); - creditCardView.setCardHolderName(name); - creditCardView.setCardExpiry(expiry); - creditCardView.setCardNumber(cardNumber); - - cardContainer.addView(creditCardView); - int index = cardContainer.getChildCount() - 1; - addCardListener(index, creditCardView); - - } else { - - CreditCardView creditCardView = (CreditCardView) cardContainer.getChildAt(reqCode); - - creditCardView.setCardExpiry(expiry); - creditCardView.setCardNumber(cardNumber); - creditCardView.setCardHolderName(name); - creditCardView.setCVV(cvv); - - } - } - - } - -} \ No newline at end of file diff --git a/app/src/main/java/com/cooltechworks/creditcarddesign/sample/MainActivity.kt b/app/src/main/java/com/cooltechworks/creditcarddesign/sample/MainActivity.kt new file mode 100644 index 0000000..f8be7fe --- /dev/null +++ b/app/src/main/java/com/cooltechworks/creditcarddesign/sample/MainActivity.kt @@ -0,0 +1,121 @@ +package com.cooltechworks.creditcarddesign.sample + +import android.app.Activity +import android.content.Intent +import android.os.Bundle +import android.view.View +import android.widget.Button +import android.widget.LinearLayout +import androidx.appcompat.app.AppCompatActivity +import com.cooltechworks.checkoutflow.R +import com.cooltechworks.creditcarddesign.CardEditActivity +import com.cooltechworks.creditcarddesign.CreditCardUtils +import com.cooltechworks.creditcarddesign.CreditCardView +import kotlinx.android.synthetic.main.activity_main.* + +/** + * Created by glarencezhao on 10/23/16. + */ + +class MainActivity : AppCompatActivity() { + + private val CREATE_NEW_CARD = 0 + + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_main) + + initialize() + listeners() + } + + private fun initialize() { + // getSupportActionBar().setTitle("Payment"); + populate() + } + + private fun populate() { + val sampleCreditCardView = CreditCardView(this) + + val name = "Glarence Zhao" + val cvv = "420" + val expiry = "01/18" + val cardNumber = "4242424242424242" + + sampleCreditCardView.cvv = cvv + sampleCreditCardView.cardHolderName = name + sampleCreditCardView.setCardExpiry(expiry) + sampleCreditCardView.cardNumber = cardNumber + + card_container.addView(sampleCreditCardView) + val index = card_container?.childCount ?: 1 - 1 + addCardListener(index, sampleCreditCardView) + } + + private fun listeners() { + add_card?.setOnClickListener { + val intent = Intent(this@MainActivity, CardEditActivity::class.java) + startActivityForResult(intent, CREATE_NEW_CARD) + } + } + + private fun addCardListener(index: Int, creditCardView: CreditCardView) { + creditCardView.setOnClickListener { v -> + val creditCardView = v as CreditCardView + val cardNumber = creditCardView.cardNumber + val expiry = creditCardView.expiry + val cardHolderName = creditCardView.cardHolderName + val cvv = creditCardView.cvv + + val intent = Intent(this@MainActivity, CardEditActivity::class.java) + intent.putExtra(CreditCardUtils.EXTRA_CARD_HOLDER_NAME, cardHolderName) + intent.putExtra(CreditCardUtils.EXTRA_CARD_NUMBER, cardNumber) + intent.putExtra(CreditCardUtils.EXTRA_CARD_EXPIRY, expiry) + intent.putExtra(CreditCardUtils.EXTRA_CARD_SHOW_CARD_SIDE, CreditCardUtils.CARD_SIDE_BACK) + intent.putExtra(CreditCardUtils.EXTRA_VALIDATE_EXPIRY_DATE, false) + + // start at the CVV activity to edit it as it is not being passed + intent.putExtra(CreditCardUtils.EXTRA_ENTRY_START_PAGE, CreditCardUtils.CARD_CVV_PAGE) + startActivityForResult(intent, index) + } + } + + public override fun onActivityResult(reqCode: Int, resultCode: Int, data: Intent?) { + + if (resultCode == Activity.RESULT_OK) { + // Debug.printToast("Result Code is OK", getApplicationContext()); + + val name = data?.getStringExtra(CreditCardUtils.EXTRA_CARD_HOLDER_NAME) + val cardNumber = data?.getStringExtra(CreditCardUtils.EXTRA_CARD_NUMBER) + val expiry = data?.getStringExtra(CreditCardUtils.EXTRA_CARD_EXPIRY) + val cvv = data?.getStringExtra(CreditCardUtils.EXTRA_CARD_CVV) + + if (reqCode == CREATE_NEW_CARD) { + + val creditCardView = CreditCardView(this) + + creditCardView.cvv = cvv + creditCardView.cardHolderName = name + creditCardView.setCardExpiry(expiry) + creditCardView.cardNumber = cardNumber + + card_container?.addView(creditCardView) + val index = card_container?.childCount ?: 1 - 1 + addCardListener(index, creditCardView) + + } else { + + val creditCardView = card_container?.getChildAt(reqCode) as CreditCardView + + creditCardView.setCardExpiry(expiry) + creditCardView.cardNumber = cardNumber + creditCardView.cardHolderName = name + creditCardView.cvv = cvv + + } + } + + } + +} \ No newline at end of file diff --git a/build.gradle b/build.gradle index 9e0b87c..004de55 100644 --- a/build.gradle +++ b/build.gradle @@ -11,6 +11,7 @@ buildscript { } dependencies { classpath 'com.android.tools.build:gradle:3.4.1' + classpath 'org.jetbrains.kotlin:kotlin-gradle-plugin:1.3.40' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files diff --git a/creditcarddesign/build.gradle b/creditcarddesign/build.gradle index 542124a..8e77afa 100644 --- a/creditcarddesign/build.gradle +++ b/creditcarddesign/build.gradle @@ -1,5 +1,11 @@ apply plugin: 'com.android.library' +apply plugin: 'kotlin-android' + +apply plugin: 'kotlin-android-extensions' + +// apply plugin: 'kotlin-kapt' + android { compileSdkVersion 28 @@ -24,4 +30,5 @@ dependencies { implementation 'androidx.appcompat:appcompat:1.0.2' implementation 'androidx.cardview:cardview:1.0.0' implementation 'com.github.ozodrukh:CircularReveal:2.0.1' + // implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.3.40' } diff --git a/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/CardEditActivity.java b/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/CardEditActivity.java deleted file mode 100644 index 532ee6f..0000000 --- a/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/CardEditActivity.java +++ /dev/null @@ -1,291 +0,0 @@ -package com.cooltechworks.creditcarddesign; - -import android.content.Context; -import android.content.Intent; -import android.content.res.Configuration; -import android.os.Bundle; -import androidx.viewpager.widget.ViewPager; -import androidx.appcompat.app.AppCompatActivity; -import android.view.View; -import android.view.WindowManager; -import android.view.inputmethod.InputMethodManager; -import android.widget.EditText; -import android.widget.RelativeLayout; -import android.widget.TextView; - -import com.cooltechworks.creditcarddesign.pager.CardFragmentAdapter; -import com.cooltechworks.creditcarddesign.pager.CardFragmentAdapter.ICardEntryCompleteListener; - -import static com.cooltechworks.creditcarddesign.CreditCardUtils.CARD_NAME_PAGE; -import static com.cooltechworks.creditcarddesign.CreditCardUtils.EXTRA_CARD_CVV; -import static com.cooltechworks.creditcarddesign.CreditCardUtils.EXTRA_CARD_EXPIRY; -import static com.cooltechworks.creditcarddesign.CreditCardUtils.EXTRA_CARD_HOLDER_NAME; -import static com.cooltechworks.creditcarddesign.CreditCardUtils.EXTRA_CARD_NUMBER; -import static com.cooltechworks.creditcarddesign.CreditCardUtils.EXTRA_ENTRY_START_PAGE; - - -public class CardEditActivity extends AppCompatActivity { - - - int mLastPageSelected = 0; - private CreditCardView mCreditCardView; - - private String mCardNumber; - private String mCVV; - private String mCardHolderName; - private String mExpiry; - private int mStartPage = 0; - private CardFragmentAdapter mCardAdapter; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_card_edit); - - findViewById(R.id.next).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - - ViewPager pager = (ViewPager) findViewById(R.id.card_field_container_pager); - - int max = pager.getAdapter().getCount(); - - if (pager.getCurrentItem() == max - 1) { - // if last card. - onDoneTapped(); - } else { - showNext(); - } - } - }); - findViewById(R.id.previous).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - showPrevious(); - } - }); - - setKeyboardVisibility(true); - mCreditCardView = (CreditCardView) findViewById(R.id.credit_card_view); - Bundle args = savedInstanceState != null ? savedInstanceState : getIntent().getExtras(); - - loadPager(args); - checkParams(args); - } - - private void checkParams(Bundle bundle) { - if (bundle == null) { - return; - } - mCardHolderName = bundle.getString(EXTRA_CARD_HOLDER_NAME); - mCVV = bundle.getString(EXTRA_CARD_CVV); - mExpiry = bundle.getString(EXTRA_CARD_EXPIRY); - mCardNumber = bundle.getString(EXTRA_CARD_NUMBER); - mStartPage = bundle.getInt(EXTRA_ENTRY_START_PAGE); - - final int maxCvvLength = CardSelector.selectCard(mCardNumber).getCvvLength(); - if (mCVV != null && mCVV.length() > maxCvvLength) { - mCVV = mCVV.substring(0, maxCvvLength); - } - - mCreditCardView.setCVV(mCVV); - mCreditCardView.setCardHolderName(mCardHolderName); - mCreditCardView.setCardExpiry(mExpiry); - mCreditCardView.setCardNumber(mCardNumber); - - if (mCardAdapter != null) { - mCreditCardView.post(new Runnable() { - @Override - public void run() { - mCardAdapter.setMaxCVV(maxCvvLength); - mCardAdapter.notifyDataSetChanged(); - }}); - } - - int cardSide = bundle.getInt(CreditCardUtils.EXTRA_CARD_SHOW_CARD_SIDE, CreditCardUtils.CARD_SIDE_FRONT); - if (cardSide == CreditCardUtils.CARD_SIDE_BACK) { - mCreditCardView.showBack(); - } - if (mStartPage > 0 && mStartPage <= CARD_NAME_PAGE) { - getViewPager().setCurrentItem(mStartPage); - } - } - - public void refreshNextButton() { - ViewPager pager = (ViewPager) findViewById(R.id.card_field_container_pager); - - int max = pager.getAdapter().getCount(); - - int text = R.string.next; - - if (pager.getCurrentItem() == max - 1) { - text = R.string.done; - } - - ((TextView) findViewById(R.id.next)).setText(text); - } - - ViewPager getViewPager() { - return (ViewPager) findViewById(R.id.card_field_container_pager); - } - - public void loadPager(Bundle bundle) { - ViewPager pager = getViewPager(); - pager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { - @Override - public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { - } - - @Override - public void onPageSelected(int position) { - - mCardAdapter.focus(position); - - if ((mCreditCardView.getCardType() != CreditCardUtils.CardType.AMEX_CARD) && (position == 2)) { - mCreditCardView.showBack(); - } else if (((position == 1) || (position == 3)) && (mLastPageSelected == 2) && (mCreditCardView.getCardType() != CreditCardUtils.CardType.AMEX_CARD)) { - mCreditCardView.showFront(); - } - - mLastPageSelected = position; - - refreshNextButton(); - - } - - @Override - public void onPageScrollStateChanged(int state) { - } - }); - pager.setOffscreenPageLimit(4); - - mCardAdapter = new CardFragmentAdapter(getSupportFragmentManager(), bundle); - mCardAdapter.setOnCardEntryCompleteListener(new ICardEntryCompleteListener() { - @Override - public void onCardEntryComplete(int currentIndex) { - showNext(); - } - - @Override - public void onCardEntryEdit(int currentIndex, String entryValue) { - switch (currentIndex) { - case 0: - mCardNumber = entryValue.replace(CreditCardUtils.SPACE_SEPERATOR, ""); - mCreditCardView.setCardNumber(mCardNumber); - if (mCardAdapter != null) { - mCardAdapter.setMaxCVV(CardSelector.selectCard(mCardNumber).getCvvLength()); - } - break; - case 1: - mExpiry = entryValue; - mCreditCardView.setCardExpiry(entryValue); - break; - case 2: - mCVV = entryValue; - mCreditCardView.setCVV(entryValue); - break; - case 3: - mCardHolderName = entryValue; - mCreditCardView.setCardHolderName(entryValue); - break; - } - } - }); - - pager.setAdapter(mCardAdapter); - } - - public void onSaveInstanceState(Bundle outState) { - outState.putString(EXTRA_CARD_CVV, mCVV); - outState.putString(EXTRA_CARD_HOLDER_NAME, mCardHolderName); - outState.putString(EXTRA_CARD_EXPIRY, mExpiry); - outState.putString(EXTRA_CARD_NUMBER, mCardNumber); - - super.onSaveInstanceState(outState); - } - - public void onRestoreInstanceState(Bundle inState) { - super.onRestoreInstanceState(inState); - checkParams(inState); - } - - - public void showPrevious() { - final ViewPager pager = (ViewPager) findViewById(R.id.card_field_container_pager); - int currentIndex = pager.getCurrentItem(); - - if (currentIndex == 0) { - setResult(RESULT_CANCELED); - finish(); - } - - if (currentIndex - 1 >= 0) { - pager.setCurrentItem(currentIndex - 1); - } - - refreshNextButton(); - } - - public void showNext() { - final ViewPager pager = (ViewPager) findViewById(R.id.card_field_container_pager); - CardFragmentAdapter adapter = (CardFragmentAdapter) pager.getAdapter(); - - int max = adapter.getCount(); - int currentIndex = pager.getCurrentItem(); - - if (currentIndex + 1 < max) { - - pager.setCurrentItem(currentIndex + 1); - } else { - // completed the card entry. - setKeyboardVisibility(false); - } - - refreshNextButton(); - } - - private void onDoneTapped() { - Intent intent = new Intent(); - - intent.putExtra(EXTRA_CARD_CVV, mCVV); - intent.putExtra(EXTRA_CARD_HOLDER_NAME, mCardHolderName); - intent.putExtra(EXTRA_CARD_EXPIRY, mExpiry); - intent.putExtra(EXTRA_CARD_NUMBER, mCardNumber); - - setResult(RESULT_OK, intent); - finish(); - } - - // from the link above - @Override - public void onConfigurationChanged(Configuration newConfig) { - super.onConfigurationChanged(newConfig); - - // Checks whether a hardware keyboard is available - if (newConfig.hardKeyboardHidden == Configuration.HARDKEYBOARDHIDDEN_NO) { - - RelativeLayout parent = (RelativeLayout) findViewById(R.id.parent); - RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) parent.getLayoutParams(); - layoutParams.addRule(RelativeLayout.CENTER_IN_PARENT, 0); - parent.setLayoutParams(layoutParams); - - } - } - - private void setKeyboardVisibility(boolean visible) { - final EditText editText = (EditText) findViewById(R.id.card_number_field); - - if (!visible) { - - InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); - imm.hideSoftInputFromWindow(editText.getWindowToken(), 0); - } else { - getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE); - } - } - - @Override - public void onBackPressed() { - this.finish(); - } -} diff --git a/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/CardEditActivity.kt b/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/CardEditActivity.kt new file mode 100644 index 0000000..d57e5f1 --- /dev/null +++ b/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/CardEditActivity.kt @@ -0,0 +1,249 @@ +package com.cooltechworks.creditcarddesign + +import android.app.Activity +import android.content.Intent +import android.content.res.Configuration +import android.os.Bundle +import android.view.View +import android.widget.RelativeLayout +import androidx.appcompat.app.AppCompatActivity +import androidx.viewpager.widget.ViewPager +import com.cooltechworks.creditcarddesign.CreditCardUtils.CARD_NAME_PAGE +import com.cooltechworks.creditcarddesign.CreditCardUtils.EXTRA_CARD_CVV +import com.cooltechworks.creditcarddesign.CreditCardUtils.EXTRA_CARD_EXPIRY +import com.cooltechworks.creditcarddesign.CreditCardUtils.EXTRA_CARD_HOLDER_NAME +import com.cooltechworks.creditcarddesign.CreditCardUtils.EXTRA_CARD_NUMBER +import com.cooltechworks.creditcarddesign.CreditCardUtils.EXTRA_ENTRY_START_PAGE +import com.cooltechworks.creditcarddesign.pager.CardFragmentAdapter +import com.cooltechworks.creditcarddesign.pager.CardFragmentAdapter.ICardEntryCompleteListener +import com.cooltechworks.creditcarddesign.utils.hideKeyboard +import com.cooltechworks.creditcarddesign.utils.showKeyboard +import kotlinx.android.synthetic.main.activity_card_edit.* + + +class CardEditActivity : AppCompatActivity() { + + + internal var mLastPageSelected = 0 + private var mCardNumber: String? = null + private var mCVV: String? = null + private var mCardHolderName: String? = null + private var mExpiry: String? = null + private var mStartPage = 0 + private var mCardAdapter: CardFragmentAdapter? = null + + internal val viewPager: ViewPager + get() = findViewById(R.id.card_field_container_pager) as ViewPager + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_card_edit) + + next.setOnClickListener { + val max = card_field_container_pager.adapter?.count + if (card_field_container_pager.currentItem == ((max ?: 1) - 1)) { + // if last card. + onDoneTapped() + } else { + showNext() + } + } + previous.setOnClickListener { showPrevious() } + + setKeyboardVisibility(true) + val args = savedInstanceState ?: intent.extras + + loadPager(args) + checkParams(args) + } + + private fun checkParams(bundle: Bundle?) { + if (bundle == null) { + return + } + mCardHolderName = bundle.getString(EXTRA_CARD_HOLDER_NAME) + mCVV = bundle.getString(EXTRA_CARD_CVV) + mExpiry = bundle.getString(EXTRA_CARD_EXPIRY) + mCardNumber = bundle.getString(EXTRA_CARD_NUMBER) + mStartPage = bundle.getInt(EXTRA_ENTRY_START_PAGE) + + val maxCvvLength = CardSelector.selectCard(mCardNumber).cvvLength + if (mCVV != null && mCVV?.length ?: 0 > maxCvvLength) { + mCVV = mCVV?.substring(0, maxCvvLength) + } + + credit_card_view?.cvv = mCVV + credit_card_view?.cardHolderName = mCardHolderName + credit_card_view?.setCardExpiry(mExpiry) + credit_card_view?.cardNumber = mCardNumber + + if (mCardAdapter != null) { + credit_card_view?.post { + mCardAdapter?.setMaxCVV(maxCvvLength) + mCardAdapter?.notifyDataSetChanged() + } + } + + val cardSide = bundle.getInt(CreditCardUtils.EXTRA_CARD_SHOW_CARD_SIDE, CreditCardUtils.CARD_SIDE_FRONT) + if (cardSide == CreditCardUtils.CARD_SIDE_BACK) { + credit_card_view?.showBack() + } + if (mStartPage > 0 && mStartPage <= CARD_NAME_PAGE) { + viewPager.currentItem = mStartPage + } + } + + fun refreshNextButton() { + val max = card_field_container_pager.adapter?.count + var text = R.string.next + if (card_field_container_pager.currentItem == ((max ?: 0) - 1)) { + text = R.string.done + } + + next?.setText(text) + } + + private fun loadPager(bundle: Bundle?) { + val pager = viewPager + pager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {} + + override fun onPageSelected(position: Int) { + + mCardAdapter?.focus(position) + + if (credit_card_view?.cardType != CreditCardUtils.CardType.AMEX_CARD && position == 2) { + credit_card_view?.showBack() + } else if ((position == 1 || position == 3) && mLastPageSelected == 2 && credit_card_view?.cardType != CreditCardUtils.CardType.AMEX_CARD) { + credit_card_view?.showFront() + } + + mLastPageSelected = position + + refreshNextButton() + + } + + override fun onPageScrollStateChanged(state: Int) {} + }) + pager.offscreenPageLimit = 4 + + mCardAdapter = CardFragmentAdapter(supportFragmentManager, bundle) + mCardAdapter?.setOnCardEntryCompleteListener(object : ICardEntryCompleteListener { + override fun onCardEntryComplete(currentIndex: Int) { + showNext() + } + + override fun onCardEntryEdit(currentIndex: Int, entryValue: String) { + when (currentIndex) { + 0 -> { + mCardNumber = entryValue.replace(CreditCardUtils.SPACE_SEPERATOR, "") + credit_card_view?.cardNumber = mCardNumber + if (mCardAdapter != null) { + mCardAdapter?.setMaxCVV(CardSelector.selectCard(mCardNumber).cvvLength) + } + } + 1 -> { + mExpiry = entryValue + credit_card_view?.setCardExpiry(entryValue) + } + 2 -> { + mCVV = entryValue + credit_card_view?.cvv = entryValue + } + 3 -> { + mCardHolderName = entryValue + credit_card_view?.cardHolderName = entryValue + } + } + } + }) + + pager.adapter = mCardAdapter + } + + public override fun onSaveInstanceState(outState: Bundle) { + outState.putString(EXTRA_CARD_CVV, mCVV) + outState.putString(EXTRA_CARD_HOLDER_NAME, mCardHolderName) + outState.putString(EXTRA_CARD_EXPIRY, mExpiry) + outState.putString(EXTRA_CARD_NUMBER, mCardNumber) + + super.onSaveInstanceState(outState) + } + + public override fun onRestoreInstanceState(inState: Bundle) { + super.onRestoreInstanceState(inState) + checkParams(inState) + } + + + fun showPrevious() { + val currentIndex = card_field_container_pager.currentItem + + if (currentIndex == 0) { + setResult(Activity.RESULT_CANCELED) + finish() + } + + if (currentIndex - 1 >= 0) { + card_field_container_pager.currentItem = currentIndex - 1 + } + + refreshNextButton() + } + + fun showNext() { + val adapter = card_field_container_pager.adapter as CardFragmentAdapter? + + val max = adapter?.count + val currentIndex = card_field_container_pager.currentItem + + if (currentIndex + 1 < max ?: 0) { + card_field_container_pager.currentItem = currentIndex + 1 + } else { + // completed the card entry. + setKeyboardVisibility(false) + } + + refreshNextButton() + } + + private fun onDoneTapped() { + val intent = Intent() + + intent.putExtra(EXTRA_CARD_CVV, mCVV) + intent.putExtra(EXTRA_CARD_HOLDER_NAME, mCardHolderName) + intent.putExtra(EXTRA_CARD_EXPIRY, mExpiry) + intent.putExtra(EXTRA_CARD_NUMBER, mCardNumber) + + setResult(Activity.RESULT_OK, intent) + finish() + } + + // from the link above + override fun onConfigurationChanged(newConfig: Configuration) { + super.onConfigurationChanged(newConfig) + + // Checks whether a hardware keyboard is available + if (newConfig.hardKeyboardHidden == Configuration.HARDKEYBOARDHIDDEN_NO) { + + val parent = findViewById(R.id.parent) as RelativeLayout + val layoutParams = parent.layoutParams as RelativeLayout.LayoutParams + layoutParams.addRule(RelativeLayout.CENTER_IN_PARENT, 0) + parent.layoutParams = layoutParams + + } + } + + private fun setKeyboardVisibility(visible: Boolean) { + if (!visible) { + next.hideKeyboard() + } else { + next.showKeyboard() + } + } + + override fun onBackPressed() { + this.finish() + } +} diff --git a/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/CardSelector.java b/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/CardSelector.java deleted file mode 100644 index 621569a..0000000 --- a/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/CardSelector.java +++ /dev/null @@ -1,126 +0,0 @@ -package com.cooltechworks.creditcarddesign; - -/** - * Created by Harish on 01/01/16. - */ -public class CardSelector { - - public static final CardSelector VISA = new CardSelector(R.drawable.card_color_round_rect_purple, R.drawable.chip, R.drawable.chip_inner, android.R.color.transparent, R.drawable.ic_billing_visa_logo, CardSelector.CVV_LENGHT_DEFAULT); - 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 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; - public static final int CVV_LENGHT_AMEX = 4; - - - private int mResCardId; - private int mResChipOuterId; - private int mResChipInnerId; - private int mResCenterImageId; - private int mResLogoId; - private int mCvvLength = CVV_LENGHT_DEFAULT; - - public CardSelector(int mDrawableCard, int mDrawableChipOuter, int mDrawableChipInner, int mDrawableCenterImage, int logoId, int cvvLength) { - this.mResCardId = mDrawableCard; - this.mResChipOuterId = mDrawableChipOuter; - this.mResChipInnerId = mDrawableChipInner; - this.mResCenterImageId = mDrawableCenterImage; - this.mResLogoId = logoId; - this.mCvvLength = cvvLength; - } - - public int getResCardId() { - return mResCardId; - } - - public void setResCardId(int mResCardId) { - this.mResCardId = mResCardId; - } - - public int getResChipOuterId() { - return mResChipOuterId; - } - - public void setResChipOuterId(int mResChipOuterId) { - this.mResChipOuterId = mResChipOuterId; - } - - public int getResChipInnerId() { - return mResChipInnerId; - } - - public void setResChipInnerId(int mResChipInnerId) { - this.mResChipInnerId = mResChipInnerId; - } - - public int getResCenterImageId() { - return mResCenterImageId; - } - - public void setResCenterImageId(int mResCenterImageId) { - this.mResCenterImageId = mResCenterImageId; - } - - public int getResLogoId() { - return mResLogoId; - } - - public void setResLogoId(int mResLogoId) { - this.mResLogoId = mResLogoId; - } - - public int getCvvLength() { - return mCvvLength; - } - - public void setCvvLength(int mCvvLength) { - this.mCvvLength = mCvvLength; - } - - public static CardSelector selectCardType(CreditCardUtils.CardType cardType) { - switch(cardType) { - case AMEX_CARD: - return AMEX; - case DISCOVER_CARD: - return DISCOVER; - case MASTER_CARD: - return MASTER; - case VISA_CARD: - return VISA; - default: - return DEFAULT; - } - } - - public static CardSelector selectCard(String cardNumber) { - if (cardNumber != null && cardNumber.length() >= 1) { - CreditCardUtils.CardType cardType = CreditCardUtils.selectCardType(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 hash = cardNumber.substring(0, 3).hashCode(); - - if (hash < 0) { - hash = hash * -1; - } - - int index = hash % drawables.length; - - int chipIndex = hash % 3; - int[] chipOuter = {R.drawable.chip, R.drawable.chip_yellow, android.R.color.transparent}; - int[] chipInner = {R.drawable.chip_inner, R.drawable.chip_yellow_inner, android.R.color.transparent}; - - selector.setResCardId(drawables[index]); - selector.setResChipOuterId(chipOuter[chipIndex]); - selector.setResChipInnerId(chipInner[chipIndex]); - - return selector; - } - } - - return DEFAULT; - } -} diff --git a/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/CardSelector.kt b/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/CardSelector.kt new file mode 100644 index 0000000..7f8a5f2 --- /dev/null +++ b/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/CardSelector.kt @@ -0,0 +1,64 @@ +package com.cooltechworks.creditcarddesign + +/** + * Created by Harish on 01/01/16. + */ +class CardSelector(var resCardId: Int, var resChipOuterId: Int, var resChipInnerId: Int, var resCenterImageId: Int, var resLogoId: Int, cvvLength: Int) { + var cvvLength = CVV_LENGHT_DEFAULT + + init { + this.cvvLength = cvvLength + } + + companion object { + + val VISA = CardSelector(R.drawable.card_color_round_rect_purple, R.drawable.chip, R.drawable.chip_inner, android.R.color.transparent, R.drawable.ic_billing_visa_logo, CardSelector.CVV_LENGHT_DEFAULT) + val MASTER = 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) + val AMEX = 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) + val DISCOVER = 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) + val DEFAULT = 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) + + val CVV_LENGHT_DEFAULT = 3 + val CVV_LENGHT_AMEX = 4 + + fun selectCardType(cardType: CreditCardUtils.CardType): CardSelector { + when (cardType) { + CreditCardUtils.CardType.AMEX_CARD -> return AMEX + CreditCardUtils.CardType.DISCOVER_CARD -> return DISCOVER + CreditCardUtils.CardType.MASTER_CARD -> return MASTER + CreditCardUtils.CardType.VISA_CARD -> return VISA + else -> return DEFAULT + } + } + + fun selectCard(cardNumber: String?): CardSelector { + if (cardNumber != null && cardNumber.length >= 1) { + val cardType = CreditCardUtils.selectCardType(cardNumber) + val selector = selectCardType(cardType) + + if (selector !== DEFAULT && cardNumber.length >= 3) { + val drawables = intArrayOf(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) + var hash = cardNumber.substring(0, 3).hashCode() + + if (hash < 0) { + hash = hash * -1 + } + + val index = hash % drawables.size + + val chipIndex = hash % 3 + val chipOuter = intArrayOf(R.drawable.chip, R.drawable.chip_yellow, android.R.color.transparent) + val chipInner = intArrayOf(R.drawable.chip_inner, R.drawable.chip_yellow_inner, android.R.color.transparent) + + selector.resCardId = drawables[index] + selector.resChipOuterId = chipOuter[chipIndex] + selector.resChipInnerId = chipInner[chipIndex] + + return selector + } + } + + return DEFAULT + } + } +} diff --git a/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/CreditCardUtils.java b/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/CreditCardUtils.java deleted file mode 100755 index 1cead1a..0000000 --- a/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/CreditCardUtils.java +++ /dev/null @@ -1,150 +0,0 @@ -package com.cooltechworks.creditcarddesign; - -import androidx.annotation.NonNull; - -import java.util.Calendar; -import java.util.regex.Pattern; - -/** - * Created by Harish on 03/01/16. - */ -public class CreditCardUtils { - public enum CardType { - UNKNOWN_CARD, AMEX_CARD, MASTER_CARD, VISA_CARD, DISCOVER_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_DISCOVER = "^6[0-9 ]*"; - - public static final int MAX_LENGTH_CARD_NUMBER = 16; - public static final int MAX_LENGTH_CARD_NUMBER_AMEX = 15; - - public static final String CARD_NUMBER_FORMAT = "XXXX XXXX XXXX XXXX"; - public static final String CARD_NUMBER_FORMAT_AMEX = "XXXX XXXXXX XXXXX"; - - public static final String EXTRA_CARD_NUMBER = "card_number"; - public static final String EXTRA_CARD_CVV = "card_cvv"; - public static final String EXTRA_CARD_EXPIRY = "card_expiry"; - public static final String EXTRA_CARD_HOLDER_NAME = "card_holder_name"; - public static final String EXTRA_CARD_SHOW_CARD_SIDE = "card_side"; - public static final String EXTRA_VALIDATE_EXPIRY_DATE = "expiry_date"; - public static final String EXTRA_ENTRY_START_PAGE = "start_page"; - - public static final int CARD_SIDE_FRONT = 1,CARD_SIDE_BACK=0; - - public static final int CARD_NUMBER_PAGE = 0, CARD_EXPIRY_PAGE = 1; - public static final int CARD_CVV_PAGE = 2, CARD_NAME_PAGE = 3; - - public static final String SPACE_SEPERATOR = " "; - public static final String SLASH_SEPERATOR = "/"; - public static final char CHAR_X = 'X'; - - public static String handleCardNumber(String inputCardNumber) { - - return handleCardNumber(inputCardNumber,SPACE_SEPERATOR); - } - - public static CardType selectCardType(String cardNumber) { - Pattern pCardType = Pattern.compile(PATTERN_VISA); - if(pCardType.matcher(cardNumber).matches()) - return CardType.VISA_CARD; - pCardType = Pattern.compile(PATTERN_MASTER); - if(pCardType.matcher(cardNumber).matches()) - return CardType.MASTER_CARD; - pCardType = Pattern.compile(PATTERN_AMEX); - if(pCardType.matcher(cardNumber).matches()) - return CardType.AMEX_CARD; - pCardType = Pattern.compile(PATTERN_DISCOVER); - if(pCardType.matcher(cardNumber).matches()) - return CardType.DISCOVER_CARD; - return CardType.UNKNOWN_CARD; - } - - public static int selectCardLength(CardType cardType) { - return cardType == CardType.AMEX_CARD ? MAX_LENGTH_CARD_NUMBER_AMEX : MAX_LENGTH_CARD_NUMBER; - } - - 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; - StringBuilder sbFormattedNumber = new StringBuilder(); - for(int iIdx = 0, jIdx = 0; (iIdx < format.length()) && (unformattedText.length() > jIdx); iIdx++) { - if(format.charAt(iIdx) == CHAR_X) - sbFormattedNumber.append(unformattedText.charAt(jIdx++)); - else - sbFormattedNumber.append(format.charAt(iIdx)); - } - - return sbFormattedNumber.toString(); - } - - 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; - StringBuilder sbFormattedNumber = new StringBuilder(); - for(int iIdx = 0, jIdx = 0; iIdx < format.length(); iIdx++) { - if((format.charAt(iIdx) == CHAR_X) && (unformattedText.length() > jIdx)) - sbFormattedNumber.append(unformattedText.charAt(jIdx++)); - else - sbFormattedNumber.append(format.charAt(iIdx)); - } - - return sbFormattedNumber.toString().replace(SPACE_SEPERATOR, SPACE_SEPERATOR + SPACE_SEPERATOR); - } - - public static String handleExpiration(String month, String year) { - - return handleExpiration(month+year); - } - - - public static String handleExpiration(@NonNull String dateYear) { - - String expiryString = dateYear.replace(SLASH_SEPERATOR, ""); - - String text; - if(expiryString.length() >= 2) { - String mm = expiryString.substring(0, 2); - String yy; - text = mm; - - try { - if (Integer.parseInt(mm) > 12) { - mm = "12"; // Cannot be more than 12. - } - } - catch (Exception e) { - mm = "01"; - } - - if(expiryString.length() >=4) { - yy = expiryString.substring(2,4); - - try{ - Integer.parseInt(yy); - }catch (Exception e) { - - Calendar calendar = Calendar.getInstance(); - int year = calendar.get(Calendar.YEAR); - yy = String.valueOf(year).substring(2); - } - - text = mm + SLASH_SEPERATOR + yy; - - } - else if(expiryString.length() > 2){ - yy = expiryString.substring(2); - text = mm + SLASH_SEPERATOR + yy; - } - } - else { - text = expiryString; - } - - return text; - } -} diff --git a/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/CreditCardUtils.kt b/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/CreditCardUtils.kt new file mode 100755 index 0000000..5172ba8 --- /dev/null +++ b/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/CreditCardUtils.kt @@ -0,0 +1,149 @@ +package com.cooltechworks.creditcarddesign + +import java.util.Calendar +import java.util.regex.Pattern + +/** + * Created by Harish on 03/01/16. + */ +public object CreditCardUtils { + + private val PATTERN_AMEX = "^3(4|7)[0-9 ]*" + private val PATTERN_VISA = "^4[0-9 ]*" + private val PATTERN_MASTER = "^5[0-9 ]*" + private val PATTERN_DISCOVER = "^6[0-9 ]*" + + val MAX_LENGTH_CARD_NUMBER = 16 + val MAX_LENGTH_CARD_NUMBER_AMEX = 15 + + val CARD_NUMBER_FORMAT = "XXXX XXXX XXXX XXXX" + val CARD_NUMBER_FORMAT_AMEX = "XXXX XXXXXX XXXXX" + + val EXTRA_CARD_NUMBER = "card_number" + val EXTRA_CARD_CVV = "card_cvv" + val EXTRA_CARD_EXPIRY = "card_expiry" + val EXTRA_CARD_HOLDER_NAME = "card_holder_name" + val EXTRA_CARD_SHOW_CARD_SIDE = "card_side" + val EXTRA_VALIDATE_EXPIRY_DATE = "expiry_date" + val EXTRA_ENTRY_START_PAGE = "start_page" + + val CARD_SIDE_FRONT = 1 + val CARD_SIDE_BACK = 0 + + val CARD_NUMBER_PAGE = 0 + val CARD_EXPIRY_PAGE = 1 + val CARD_CVV_PAGE = 2 + val CARD_NAME_PAGE = 3 + + val SPACE_SEPERATOR = " " + val SLASH_SEPERATOR = "/" + val CHAR_X = 'X' + + enum class CardType { + UNKNOWN_CARD, AMEX_CARD, MASTER_CARD, VISA_CARD, DISCOVER_CARD + } + + fun selectCardType(cardNumber: String): CardType { + var pCardType = Pattern.compile(PATTERN_VISA) + if (pCardType.matcher(cardNumber).matches()) + return CardType.VISA_CARD + pCardType = Pattern.compile(PATTERN_MASTER) + if (pCardType.matcher(cardNumber).matches()) + return CardType.MASTER_CARD + pCardType = Pattern.compile(PATTERN_AMEX) + if (pCardType.matcher(cardNumber).matches()) + return CardType.AMEX_CARD + pCardType = Pattern.compile(PATTERN_DISCOVER) + return if (pCardType.matcher(cardNumber).matches()) CardType.DISCOVER_CARD else CardType.UNKNOWN_CARD + } + + fun selectCardLength(cardType: CardType): Int { + return if (cardType == CardType.AMEX_CARD) MAX_LENGTH_CARD_NUMBER_AMEX else MAX_LENGTH_CARD_NUMBER + } + + @JvmOverloads + fun handleCardNumber(inputCardNumber: String, seperator: String = SPACE_SEPERATOR): String { + val unformattedText = inputCardNumber.replace(seperator, "") + val cardType = selectCardType(inputCardNumber) + val format = if (cardType == CardType.AMEX_CARD) CARD_NUMBER_FORMAT_AMEX else CARD_NUMBER_FORMAT + val sbFormattedNumber = StringBuilder() + var iIdx = 0 + var jIdx = 0 + while (iIdx < format.length && unformattedText.length > jIdx) { + if (format[iIdx] == CHAR_X) + sbFormattedNumber.append(unformattedText[jIdx++]) + else + sbFormattedNumber.append(format[iIdx]) + iIdx++ + } + + return sbFormattedNumber.toString() + } + + fun formatCardNumber(inputCardNumber: String, seperator: String): String { + val unformattedText = inputCardNumber.replace(seperator, "") + val cardType = selectCardType(inputCardNumber) + val format = if (cardType == CardType.AMEX_CARD) CARD_NUMBER_FORMAT_AMEX else CARD_NUMBER_FORMAT + val sbFormattedNumber = StringBuilder() + var iIdx = 0 + var jIdx = 0 + while (iIdx < format.length) { + if (format[iIdx] == CHAR_X && unformattedText.length > jIdx) + sbFormattedNumber.append(unformattedText[jIdx++]) + else + sbFormattedNumber.append(format[iIdx]) + iIdx++ + } + + return sbFormattedNumber.toString().replace(SPACE_SEPERATOR, SPACE_SEPERATOR + SPACE_SEPERATOR) + } + + fun handleExpiration(month: String, year: String): String { + + return handleExpiration(month + year) + } + + + fun handleExpiration(dateYear: String): String { + + val expiryString = dateYear.replace(SLASH_SEPERATOR, "") + + var text: String + if (expiryString.length >= 2) { + var mm = expiryString.substring(0, 2) + var yy: String + text = mm + + try { + if (Integer.parseInt(mm) > 12) { + mm = "12" // Cannot be more than 12. + } + } catch (e: Exception) { + mm = "01" + } + + if (expiryString.length >= 4) { + yy = expiryString.substring(2, 4) + + try { + Integer.parseInt(yy) + } catch (e: Exception) { + + val calendar = Calendar.getInstance() + val year = calendar.get(Calendar.YEAR) + yy = year.toString().substring(2) + } + + text = mm + SLASH_SEPERATOR + yy + + } else if (expiryString.length > 2) { + yy = expiryString.substring(2) + text = mm + SLASH_SEPERATOR + yy + } + } else { + text = expiryString + } + + return text + } +} diff --git a/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/CreditCardView.java b/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/CreditCardView.java deleted file mode 100644 index e937092..0000000 --- a/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/CreditCardView.java +++ /dev/null @@ -1,386 +0,0 @@ -package com.cooltechworks.creditcarddesign; - -import android.animation.Animator; -import android.animation.AnimatorListenerAdapter; -import android.content.Context; -import android.content.res.TypedArray; -import android.os.Build; -import android.os.Handler; -import android.util.AttributeSet; -import android.view.LayoutInflater; -import android.view.View; -import android.view.animation.AccelerateDecelerateInterpolator; -import android.view.animation.OvershootInterpolator; -import android.widget.FrameLayout; -import android.widget.ImageView; -import android.widget.TextView; - -import io.codetail.animation.ViewAnimationUtils; - -/** - * Created by Harish on 03/01/16. - */ -public class CreditCardView extends FrameLayout { - - private static final int TEXTVIEW_CARD_HOLDER_ID = R.id.front_card_holder_name; - private static final int TEXTVIEW_CARD_EXPIRY_ID = R.id.front_card_expiry; - private static final int TEXTVIEW_CARD_NUMBER_ID = R.id.front_card_number; - private static final int TEXTVIEW_CARD_CVV_ID = R.id.back_card_cvv; - private static final int TEXTVIEW_CARD_CVV_AMEX_ID = R.id.front_card_cvv; - private static final int FRONT_CARD_ID = R.id.front_card_container; - private static final int BACK_CARD_ID = R.id.back_card_container; - private static final int FRONT_CARD_OUTLINE_ID = R.id.front_card_outline; - private static final int BACK_CARD_OUTLINE_ID = R.id.back_card_outline; - - - private int mCurrentDrawable; - private String mRawCardNumber; - private ICustomCardSelector mSelectorLogic; - - private String mCardHolderName, mCVV, mExpiry; - - private CreditCardUtils.CardType mCardType; - - private boolean changeCardColor; - private boolean showCardAnimation; - - int mCardnameLen; - - public CreditCardView(Context context) { - super(context); - init(); - } - - public CreditCardView(Context context, AttributeSet attrs) { - super(context, attrs); - init(attrs); - } - - public CreditCardView(Context context, AttributeSet attrs, int defStyleAttr) { - super(context, attrs, defStyleAttr); - init(attrs); - } - - public String getCardHolderName() { - return mCardHolderName; - } - - public String getCVV() { - return mCVV; - } - - public String getExpiry() { - return mExpiry; - } - - public CreditCardUtils.CardType getCardType() { return mCardType; } - - interface ICustomCardSelector { - CardSelector getCardSelector(String cardNumber); - } - - private void init() { - - mCurrentDrawable = R.drawable.card_color_round_rect_default; - mRawCardNumber = ""; - mCardnameLen = getResources().getInteger(R.integer.card_name_len); - LayoutInflater inflater = (LayoutInflater) getContext() - .getSystemService(Context.LAYOUT_INFLATER_SERVICE); - inflater.inflate(R.layout.view_creditcard, this, true); - - } - - private void init(AttributeSet attrs) { - - init(); - - TypedArray a = getContext().obtainStyledAttributes(attrs, - R.styleable.creditcard, 0, 0); - - - String cardHolderName = a.getString(R.styleable.creditcard_card_holder_name); - String expiry = a.getString(R.styleable.creditcard_card_expiration); - String cardNumber = a.getString(R.styleable.creditcard_card_number); - - changeCardColor = a.getBoolean(R.styleable.creditcard_change_card_color, true); - showCardAnimation = a.getBoolean(R.styleable.creditcard_show_card_animation, true); - boolean showChipOnCard = a.getBoolean(R.styleable.creditcard_show_chip_on_card, true); - if(!showChipOnCard) { - View chipContainer = findViewById(R.id.chip_container); - if(chipContainer != null) { - chipContainer.setVisibility(View.INVISIBLE); - } - } - - int cvv = a.getInt(R.styleable.creditcard_cvv, 0); - int cardSide = a.getInt(R.styleable.creditcard_card_side,CreditCardUtils.CARD_SIDE_FRONT); - - setCardNumber(cardNumber); - setCVV(cvv); - setCardExpiry(expiry); - setCardHolderName(cardHolderName); - - if(cardSide == CreditCardUtils.CARD_SIDE_BACK) { - showBackImmediate(); - } - - paintCard(); - - a.recycle(); - - } - - - private void flip(final boolean ltr, boolean isImmediate) { - - View layoutContainer = findViewById(R.id.card_outline_container); - View frontView = findViewById(FRONT_CARD_OUTLINE_ID); - View backView = findViewById(BACK_CARD_OUTLINE_ID); - - final View frontContentView = findViewById(FRONT_CARD_ID); - final View backContentView = findViewById(BACK_CARD_ID); - View layoutContentContainer = findViewById(R.id.card_container); - - - if(isImmediate) { - frontContentView.setVisibility(ltr?VISIBLE:GONE); - backContentView.setVisibility(ltr?GONE:VISIBLE); - - } - else { - - int duration = 600; - - FlipAnimator flipAnimator = new FlipAnimator(frontView, backView, frontView.getWidth() / 2, backView.getHeight() / 2); - flipAnimator.setInterpolator(new OvershootInterpolator(0.5f)); - flipAnimator.setDuration(duration); - - if (ltr) { - flipAnimator.reverse(); - } - - flipAnimator.setTranslateDirection(FlipAnimator.DIRECTION_Z); - flipAnimator.setRotationDirection(FlipAnimator.DIRECTION_Y); - layoutContainer.startAnimation(flipAnimator); - - FlipAnimator flipAnimator1 = new FlipAnimator(frontContentView, backContentView, frontContentView.getWidth() / 2, backContentView.getHeight() / 2); - flipAnimator1.setInterpolator(new OvershootInterpolator(0.5f)); - flipAnimator1.setDuration(duration); - - if (ltr) { - flipAnimator1.reverse(); - } - - flipAnimator1.setTranslateDirection(FlipAnimator.DIRECTION_Z); - flipAnimator1.setRotationDirection(FlipAnimator.DIRECTION_Y); - - layoutContentContainer.startAnimation(flipAnimator1); - } - - } - - public void setCardNumber(String rawCardNumber) { - - - this.mRawCardNumber = rawCardNumber == null ? "" : rawCardNumber; - this.mCardType = CreditCardUtils.selectCardType(this.mRawCardNumber); - String cardNumber = CreditCardUtils.formatCardNumber(this.mRawCardNumber, CreditCardUtils.SPACE_SEPERATOR); - - ((TextView)findViewById(TEXTVIEW_CARD_NUMBER_ID)).setText(cardNumber); - ((TextView)findViewById(TEXTVIEW_CARD_CVV_AMEX_ID)).setVisibility(mCardType == CreditCardUtils.CardType.AMEX_CARD ? View.VISIBLE : View.GONE); - - if(this.mCardType != CreditCardUtils.CardType.UNKNOWN_CARD) { - this.post(new Runnable() { - @Override - public void run() { - revealCardAnimation(); - } - }); - } - else { - paintCard(); - } - - } - - public void setCVV(int cvvInt) { - - if(cvvInt == 0) { - setCVV(""); - } - else { - String cvv = String.valueOf(cvvInt); - setCVV(cvv); - } - - } - - public void showFront() { - flip(true,false); - } - - public void showFrontImmediate() { - flip(true,true); - } - - public void showBack() { - flip(false,false); - } - - public void showBackImmediate() { - flip(false,true); - } - - public void setCVV(String cvv) { - if(cvv == null) { - cvv = ""; - } - - this.mCVV = cvv; - ((TextView)findViewById(TEXTVIEW_CARD_CVV_ID)).setText(cvv); - ((TextView)findViewById(TEXTVIEW_CARD_CVV_AMEX_ID)).setText(cvv); - } - - public void setCardExpiry(String dateYear) { - - dateYear = dateYear == null ? "": CreditCardUtils.handleExpiration(dateYear); - - this.mExpiry = dateYear; - - ((TextView) findViewById(TEXTVIEW_CARD_EXPIRY_ID)).setText(dateYear); - - - } - - public void setCardHolderName(String cardHolderName) { - - cardHolderName = cardHolderName == null ? "" : cardHolderName; - if(cardHolderName.length() > mCardnameLen) { - cardHolderName = cardHolderName.substring(0,mCardnameLen); - } - - this.mCardHolderName = cardHolderName; - - ((TextView)findViewById(TEXTVIEW_CARD_HOLDER_ID)).setText(cardHolderName); - } - - public void paintCard() { - - CardSelector card = selectCard(); - - View cardContainer = findViewById(R.id.card_outline_container); - - View chipContainer = findViewById(R.id.chip_container); - View chipInner = findViewById(R.id.chip_inner_view); - - View cardBack = findViewById(BACK_CARD_OUTLINE_ID); - View cardFront = findViewById(FRONT_CARD_OUTLINE_ID); - - - chipContainer.setBackgroundResource(card.getResChipOuterId()); - chipInner.setBackgroundResource(card.getResChipInnerId()); - - ImageView frontLogoImageView = (ImageView) cardContainer.findViewById(R.id.logo_img); - frontLogoImageView.setImageResource(card.getResLogoId()); - - ImageView centerImageView = (ImageView) cardContainer.findViewById(R.id.logo_center_img); - centerImageView.setImageResource(card.getResCenterImageId()); - - - ImageView backLogoImageView = (ImageView) findViewById(BACK_CARD_ID).findViewById(R.id.logo_img); - backLogoImageView.setImageResource(card.getResLogoId()); - - if(changeCardColor) { - cardBack.setBackgroundResource(card.getResCardId()); - cardFront.setBackgroundResource(card.getResCardId()); - } - } - - - public void revealCardAnimation() { - - CardSelector card = selectCard(); - - View cardFront = findViewById(FRONT_CARD_OUTLINE_ID); - View cardContainer = findViewById(R.id.card_outline_container); - - paintCard(); - - if(showCardAnimation && changeCardColor) { - animateChange(cardContainer, cardFront, card.getResCardId()); - } - } - - public CardSelector selectCard() { - if(mSelectorLogic != null) { - return mSelectorLogic.getCardSelector(mRawCardNumber); - } - return CardSelector.selectCard(mRawCardNumber); - } - - public void animateChange(final View cardContainer, final View v, final int drawableId) { - showAnimation(cardContainer, v, drawableId); - } - - public void showAnimation(final View cardContainer, final View v, final int drawableId) { - - final View mRevealView = v; - mRevealView.setBackgroundResource(drawableId); - - if (mCurrentDrawable == drawableId) { - return; - } - - int duration = 1000; - int cx = mRevealView.getLeft(); - int cy = mRevealView.getTop(); - - int radius = Math.max(mRevealView.getWidth(), mRevealView.getHeight()) * 4; - - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { - - - Animator animator = - ViewAnimationUtils.createCircularReveal(mRevealView, cx, cy, 0, radius); - animator.setInterpolator(new AccelerateDecelerateInterpolator()); - animator.setDuration(duration); - - new Handler().postDelayed(new Runnable() { - @Override - public void run() { - cardContainer.setBackgroundResource(drawableId); - } - }, duration); - - mRevealView.setVisibility(View.VISIBLE); - animator.start(); - mCurrentDrawable = drawableId; - - } else { - Animator anim = android.view.ViewAnimationUtils.createCircularReveal(mRevealView, cx, cy, 0, radius); - mRevealView.setVisibility(View.VISIBLE); - anim.setDuration(duration); - anim.start(); - anim.addListener(new AnimatorListenerAdapter() { - @Override - public void onAnimationEnd(Animator animation) { - super.onAnimationEnd(animation); - - cardContainer.setBackgroundResource(drawableId); - } - }); - - mCurrentDrawable = drawableId; - } - } - - public void setSelectorLogic(ICustomCardSelector mSelectorLogic) { - this.mSelectorLogic = mSelectorLogic; - } - - public String getCardNumber() { - return mRawCardNumber; - } - - -} diff --git a/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/CreditCardView.kt b/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/CreditCardView.kt new file mode 100644 index 0000000..15ddf37 --- /dev/null +++ b/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/CreditCardView.kt @@ -0,0 +1,353 @@ +package com.cooltechworks.creditcarddesign + +import android.animation.Animator +import android.animation.AnimatorListenerAdapter +import android.content.Context +import android.os.Build +import android.os.Handler +import android.util.AttributeSet +import android.view.LayoutInflater +import android.view.View +import android.view.animation.AccelerateDecelerateInterpolator +import android.view.animation.OvershootInterpolator +import android.widget.FrameLayout +import android.widget.ImageView +import android.widget.TextView +import io.codetail.animation.ViewAnimationUtils + +/** + * Created by Harish on 03/01/16. + */ +class CreditCardView : FrameLayout { + + + private var mCurrentDrawable: Int = 0 + private var mRawCardNumber: String? = null + private var mSelectorLogic: ICustomCardSelector? = null + + var cardHolderName: String? = null + set(cardHolderName) { + var cardHolderName = cardHolderName + + cardHolderName = cardHolderName ?: "" + if (cardHolderName.length > mCardnameLen) { + cardHolderName = cardHolderName.substring(0, mCardnameLen) + } + + field = cardHolderName + + (findViewById(TEXTVIEW_CARD_HOLDER_ID) as TextView).text = cardHolderName + } + var cvv: String? = null + var expiry: String? = null + var cardType: CreditCardUtils.CardType? = null + private var changeCardColor: Boolean = false + private var showCardAnimation: Boolean = false + + internal var mCardnameLen: Int = 0 + + var cardNumber: String? + get() = mRawCardNumber + set(rawCardNumber) { + + + this.mRawCardNumber = rawCardNumber ?: "" + this.cardType = CreditCardUtils.selectCardType(this.mRawCardNumber!!) + val cardNumber = CreditCardUtils.formatCardNumber(this.mRawCardNumber!!, CreditCardUtils.SPACE_SEPERATOR) + + (findViewById(TEXTVIEW_CARD_NUMBER_ID) as TextView).text = cardNumber + (findViewById(TEXTVIEW_CARD_CVV_AMEX_ID) as TextView).visibility = if (cardType === CreditCardUtils.CardType.AMEX_CARD) View.VISIBLE else View.GONE + + if (this.cardType !== CreditCardUtils.CardType.UNKNOWN_CARD) { + this.post { revealCardAnimation() } + } else { + paintCard() + } + + } + + constructor(context: Context) : super(context) { + init() + } + + constructor(context: Context, attrs: AttributeSet) : super(context, attrs) { + init(attrs) + } + + constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) : super(context, attrs, defStyleAttr) { + init(attrs) + } + + interface ICustomCardSelector { + fun getCardSelector(cardNumber: String?): CardSelector + } + + private fun init() { + + mCurrentDrawable = R.drawable.card_color_round_rect_default + mRawCardNumber = "" + mCardnameLen = resources.getInteger(R.integer.card_name_len) + val inflater = context + .getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater + inflater.inflate(R.layout.view_creditcard, this, true) + + } + + private fun init(attrs: AttributeSet) { + + init() + + val a = context.obtainStyledAttributes(attrs, + R.styleable.creditcard, 0, 0) + + + var cardHolderName = a.getString(R.styleable.creditcard_card_holder_name) + val expiry = a.getString(R.styleable.creditcard_card_expiration) + var cardNumber = a.getString(R.styleable.creditcard_card_number) + + changeCardColor = a.getBoolean(R.styleable.creditcard_change_card_color, true) + showCardAnimation = a.getBoolean(R.styleable.creditcard_show_card_animation, true) + val showChipOnCard = a.getBoolean(R.styleable.creditcard_show_chip_on_card, true) + if (!showChipOnCard) { + val chipContainer = findViewById(R.id.chip_container) + if (chipContainer != null) { + chipContainer.visibility = View.INVISIBLE + } + } + + val cvv = a.getInt(R.styleable.creditcard_cvv, 0) + val cardSide = a.getInt(R.styleable.creditcard_card_side, CreditCardUtils.CARD_SIDE_FRONT) + + cardNumber = cardNumber + setCVV(cvv) + setCardExpiry(expiry) + cardHolderName = cardHolderName + + if (cardSide == CreditCardUtils.CARD_SIDE_BACK) { + showBackImmediate() + } + + paintCard() + + a.recycle() + + } + + + private fun flip(ltr: Boolean, isImmediate: Boolean) { + + val layoutContainer = findViewById(R.id.card_outline_container) + val frontView = findViewById(FRONT_CARD_OUTLINE_ID) + val backView = findViewById(BACK_CARD_OUTLINE_ID) + + val frontContentView = findViewById(FRONT_CARD_ID) + val backContentView = findViewById(BACK_CARD_ID) + val layoutContentContainer = findViewById(R.id.card_container) + + + if (isImmediate) { + frontContentView.visibility = if (ltr) View.VISIBLE else View.GONE + backContentView.visibility = if (ltr) View.GONE else View.VISIBLE + + } else { + + val duration = 600 + + val flipAnimator = FlipAnimator(frontView, backView, frontView.width / 2, backView.height / 2) + flipAnimator.interpolator = OvershootInterpolator(0.5f) + flipAnimator.duration = duration.toLong() + + if (ltr) { + flipAnimator.reverse() + } + + flipAnimator.translateDirection = FlipAnimator.DIRECTION_Z + flipAnimator.rotationDirection = FlipAnimator.DIRECTION_Y + layoutContainer.startAnimation(flipAnimator) + + val flipAnimator1 = FlipAnimator(frontContentView, backContentView, frontContentView.width / 2, backContentView.height / 2) + flipAnimator1.interpolator = OvershootInterpolator(0.5f) + flipAnimator1.duration = duration.toLong() + + if (ltr) { + flipAnimator1.reverse() + } + + flipAnimator1.translateDirection = FlipAnimator.DIRECTION_Z + flipAnimator1.rotationDirection = FlipAnimator.DIRECTION_Y + + layoutContentContainer.startAnimation(flipAnimator1) + } + + } + + fun setCVV(cvvInt: Int) { + + if (cvvInt == 0) { + setCVV("") + } else { + val cvv = cvvInt.toString() + setCVV(cvv) + } + + } + + fun showFront() { + flip(true, false) + } + + fun showFrontImmediate() { + flip(true, true) + } + + fun showBack() { + flip(false, false) + } + + fun showBackImmediate() { + flip(false, true) + } + + fun setCVV(cvv: String?) { + var cvv = cvv + if (cvv == null) { + cvv = "" + } + + this.cvv = cvv + (findViewById(TEXTVIEW_CARD_CVV_ID) as TextView).text = cvv + (findViewById(TEXTVIEW_CARD_CVV_AMEX_ID) as TextView).text = cvv + } + + fun setCardExpiry(dateYear: String?) { + var dateYear = dateYear + + dateYear = if (dateYear == null) "" else CreditCardUtils.handleExpiration(dateYear) + + this.expiry = dateYear + + (findViewById(TEXTVIEW_CARD_EXPIRY_ID) as TextView).text = dateYear + + + } + + fun paintCard() { + + val card = selectCard() + + val cardContainer = findViewById(R.id.card_outline_container) + + val chipContainer = findViewById(R.id.chip_container) + val chipInner = findViewById(R.id.chip_inner_view) + + val cardBack = findViewById(BACK_CARD_OUTLINE_ID) + val cardFront = findViewById(FRONT_CARD_OUTLINE_ID) + + + chipContainer.setBackgroundResource(card.resChipOuterId) + chipInner.setBackgroundResource(card.resChipInnerId) + + val frontLogoImageView = cardContainer.findViewById(R.id.logo_img) as ImageView + frontLogoImageView.setImageResource(card.resLogoId) + + val centerImageView = cardContainer.findViewById(R.id.logo_center_img) as ImageView + centerImageView.setImageResource(card.resCenterImageId) + + + val backLogoImageView = findViewById(BACK_CARD_ID).findViewById(R.id.logo_img) as ImageView + backLogoImageView.setImageResource(card.resLogoId) + + if (changeCardColor) { + cardBack.setBackgroundResource(card.resCardId) + cardFront.setBackgroundResource(card.resCardId) + } + } + + + fun revealCardAnimation() { + + val card = selectCard() + + val cardFront = findViewById(FRONT_CARD_OUTLINE_ID) + val cardContainer = findViewById(R.id.card_outline_container) + + paintCard() + + if (showCardAnimation && changeCardColor) { + animateChange(cardContainer, cardFront, card.resCardId) + } + } + + fun selectCard(): CardSelector { + return if (mSelectorLogic != null) { + mSelectorLogic!!.getCardSelector(mRawCardNumber) + } else CardSelector.selectCard(mRawCardNumber) + } + + fun animateChange(cardContainer: View, v: View, drawableId: Int) { + showAnimation(cardContainer, v, drawableId) + } + + fun showAnimation(cardContainer: View, v: View, drawableId: Int) { + + v.setBackgroundResource(drawableId) + + if (mCurrentDrawable == drawableId) { + return + } + + val duration = 1000 + val cx = v.left + val cy = v.top + + val radius = Math.max(v.width, v.height) * 4 + + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { + + + val animator = ViewAnimationUtils.createCircularReveal(v, cx, cy, 0f, radius.toFloat()) + animator.interpolator = AccelerateDecelerateInterpolator() + animator.duration = duration.toLong() + + Handler().postDelayed({ cardContainer.setBackgroundResource(drawableId) }, duration.toLong()) + + v.visibility = View.VISIBLE + animator.start() + mCurrentDrawable = drawableId + + } else { + val anim = android.view.ViewAnimationUtils.createCircularReveal(v, cx, cy, 0f, radius.toFloat()) + v.visibility = View.VISIBLE + anim.duration = duration.toLong() + anim.start() + anim.addListener(object : AnimatorListenerAdapter() { + override fun onAnimationEnd(animation: Animator) { + super.onAnimationEnd(animation) + + cardContainer.setBackgroundResource(drawableId) + } + }) + + mCurrentDrawable = drawableId + } + } + + fun setSelectorLogic(mSelectorLogic: ICustomCardSelector) { + this.mSelectorLogic = mSelectorLogic + } + + companion object { + + private val TEXTVIEW_CARD_HOLDER_ID = R.id.front_card_holder_name + private val TEXTVIEW_CARD_EXPIRY_ID = R.id.front_card_expiry + private val TEXTVIEW_CARD_NUMBER_ID = R.id.front_card_number + private val TEXTVIEW_CARD_CVV_ID = R.id.back_card_cvv + private val TEXTVIEW_CARD_CVV_AMEX_ID = R.id.front_card_cvv + private val FRONT_CARD_ID = R.id.front_card_container + private val BACK_CARD_ID = R.id.back_card_container + private val FRONT_CARD_OUTLINE_ID = R.id.front_card_outline + private val BACK_CARD_OUTLINE_ID = R.id.back_card_outline + } + + +} diff --git a/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/FlipAnimator.java b/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/FlipAnimator.java deleted file mode 100644 index 0a56474..0000000 --- a/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/FlipAnimator.java +++ /dev/null @@ -1,138 +0,0 @@ -package com.cooltechworks.creditcarddesign; - -import android.graphics.Camera; -import android.graphics.Matrix; -import android.view.View; -import android.view.animation.AccelerateDecelerateInterpolator; -import android.view.animation.Animation; -import android.view.animation.Transformation; - -public class FlipAnimator extends Animation { - - public static final int DIRECTION_X = 1, DIRECTION_Y = 2, DIRECTION_Z = 3; - private Camera camera; - - private View fromView; - - private View toView; - - private final float centerX; - - private final float centerY; - - private boolean forward = true; - - private boolean visibilitySwapped; - - private int rotationDirection = DIRECTION_X; - - private int translateDirection = DIRECTION_Z; - - /** - * Creates a 3D flip animation between two views. If forward is true, its - * assumed that view1 is "visible" and view2 is "gone" before the animation - * starts. At the end of the animation, view1 will be "gone" and view2 will - * be "visible". If forward is false, the reverse is assumed. - * - * @param fromView First view in the transition. - * @param toView Second view in the transition. - * @param centerX The center of the views in the x-axis. - * @param centerY The center of the views in the y-axis. - */ - public FlipAnimator(View fromView, View toView, int centerX, int centerY) { - this.fromView = fromView; - this.toView = toView; - this.centerX = centerX; - this.centerY = centerY; - - setDuration(500); - setFillAfter(true); - setInterpolator(new AccelerateDecelerateInterpolator()); - } - - public int getRotationDirection() { - return rotationDirection; - } - - public void setRotationDirection(int rotationDirection) { - this.rotationDirection = rotationDirection; - } - - public int getTranslateDirection() { - return translateDirection; - } - - public void setTranslateDirection(int translateDirection) { - this.translateDirection = translateDirection; - } - - public void reverse() { - forward = false; - View temp = toView; - toView = fromView; - fromView = temp; - } - - @Override - public void initialize(int width, int height, int parentWidth, int parentHeight) { - super.initialize(width, height, parentWidth, parentHeight); - camera = new Camera(); - } - - @Override - protected void applyTransformation(float interpolatedTime, Transformation t) { - // Angle around the y-axis of the rotation at the given time. It is - // calculated both in radians and in the equivalent degrees. - final double radians = Math.PI * interpolatedTime; - float degrees = (float) (180.0 * radians / Math.PI); - - // Once we reach the midpoint in the animation, we need to hide the - // source view and show the destination view. We also need to change - // the angle by 180 degrees so that the destination does not come in - // flipped around. This is the main problem with SDK sample, it does not - // do this. - if (interpolatedTime >= 0.5f) { - degrees -= 180.f; - - if (!visibilitySwapped) { - fromView.setVisibility(View.GONE); - toView.setVisibility(View.VISIBLE); - - visibilitySwapped = true; - } - } - - if (forward) - degrees = -degrees; - - final Matrix matrix = t.getMatrix(); - - camera.save(); - - if(translateDirection == DIRECTION_Z) { - camera.translate(0.0f, 0.0f, (float) (150.0 * Math.sin(radians))); - } - else if(translateDirection == DIRECTION_Y) { - camera.translate(0.0f, (float) (150.0 * Math.sin(radians)), 0.0f); - } - else { - camera.translate( (float) (150.0 * Math.sin(radians)), 0.0f, 0.0f); - } - - if(rotationDirection == DIRECTION_Z) { - camera.rotateZ(degrees); - } - else if(rotationDirection == DIRECTION_Y) { - camera.rotateY(degrees); - } - else { - camera.rotateX(degrees); - } - - camera.getMatrix(matrix); - camera.restore(); - - matrix.preTranslate(-centerX, -centerY); - matrix.postTranslate(centerX, centerY); - } -} \ No newline at end of file diff --git a/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/FlipAnimator.kt b/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/FlipAnimator.kt new file mode 100644 index 0000000..83f1715 --- /dev/null +++ b/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/FlipAnimator.kt @@ -0,0 +1,116 @@ +package com.cooltechworks.creditcarddesign + +import android.graphics.Camera +import android.graphics.Matrix +import android.view.View +import android.view.animation.AccelerateDecelerateInterpolator +import android.view.animation.Animation +import android.view.animation.Transformation + +class FlipAnimator +/** + * Creates a 3D flip animation between two views. If forward is true, its + * assumed that view1 is "visible" and view2 is "gone" before the animation + * starts. At the end of the animation, view1 will be "gone" and view2 will + * be "visible". If forward is false, the reverse is assumed. + * + * @param fromView First view in the transition. + * @param toView Second view in the transition. + * @param centerX The center of the views in the x-axis. + * @param centerY The center of the views in the y-axis. + */ +(private var fromView: View?, private var toView: View?, centerX: Int, centerY: Int) : Animation() { + private var camera: Camera? = null + + private val centerX: Float + + private val centerY: Float + + private var forward = true + + private var visibilitySwapped: Boolean = false + + var rotationDirection = DIRECTION_X + + var translateDirection = DIRECTION_Z + + init { + this.centerX = centerX.toFloat() + this.centerY = centerY.toFloat() + + duration = 500 + fillAfter = true + interpolator = AccelerateDecelerateInterpolator() + } + + fun reverse() { + forward = false + val temp = toView + toView = fromView + fromView = temp + } + + override fun initialize(width: Int, height: Int, parentWidth: Int, parentHeight: Int) { + super.initialize(width, height, parentWidth, parentHeight) + camera = Camera() + } + + override fun applyTransformation(interpolatedTime: Float, t: Transformation) { + // Angle around the y-axis of the rotation at the given time. It is + // calculated both in radians and in the equivalent degrees. + val radians = Math.PI * interpolatedTime + var degrees = (180.0 * radians / Math.PI).toFloat() + + // Once we reach the midpoint in the animation, we need to hide the + // source view and show the destination view. We also need to change + // the angle by 180 degrees so that the destination does not come in + // flipped around. This is the main problem with SDK sample, it does not + // do this. + if (interpolatedTime >= 0.5f) { + degrees -= 180f + + if (!visibilitySwapped) { + fromView!!.visibility = View.GONE + toView!!.visibility = View.VISIBLE + + visibilitySwapped = true + } + } + + if (forward) + degrees = -degrees + + val matrix = t.matrix + + camera!!.save() + + if (translateDirection == DIRECTION_Z) { + camera!!.translate(0.0f, 0.0f, (150.0 * Math.sin(radians)).toFloat()) + } else if (translateDirection == DIRECTION_Y) { + camera!!.translate(0.0f, (150.0 * Math.sin(radians)).toFloat(), 0.0f) + } else { + camera!!.translate((150.0 * Math.sin(radians)).toFloat(), 0.0f, 0.0f) + } + + if (rotationDirection == DIRECTION_Z) { + camera!!.rotateZ(degrees) + } else if (rotationDirection == DIRECTION_Y) { + camera!!.rotateY(degrees) + } else { + camera!!.rotateX(degrees) + } + + camera!!.getMatrix(matrix) + camera!!.restore() + + matrix.preTranslate(-centerX, -centerY) + matrix.postTranslate(centerX, centerY) + } + + companion object { + + val DIRECTION_X = 1 + val DIRECTION_Y = 2 + val DIRECTION_Z = 3 + } +} \ No newline at end of file diff --git a/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/pager/CardCVVFragment.java b/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/pager/CardCVVFragment.java deleted file mode 100644 index 9ac6a6e..0000000 --- a/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/pager/CardCVVFragment.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.cooltechworks.creditcarddesign.pager; - -import android.os.Bundle; -import android.text.Editable; -import android.text.InputFilter; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.EditText; - -import com.cooltechworks.creditcarddesign.CardSelector; -import com.cooltechworks.creditcarddesign.R; - -import static com.cooltechworks.creditcarddesign.CreditCardUtils.EXTRA_CARD_CVV; -import static com.cooltechworks.creditcarddesign.CreditCardUtils.EXTRA_CARD_EXPIRY; - -/** - * Created by sharish on 9/1/15. - */ -public class CardCVVFragment extends CreditCardFragment { - - private EditText mCardCVVView; - private int mMaxCVV = CardSelector.CVV_LENGHT_DEFAULT; - - public CardCVVFragment() { - } - - public View onCreateView(LayoutInflater inflater, ViewGroup group, Bundle state) { - View v = inflater.inflate(R.layout.lyt_card_cvv, group, false); - mCardCVVView = (EditText) v.findViewById(R.id.card_cvv); - - String cvv = null; - if (getArguments() != null && getArguments().containsKey(EXTRA_CARD_CVV)) { - cvv = getArguments().getString(EXTRA_CARD_CVV); - } - - if (cvv == null) { - cvv = ""; - } - - mCardCVVView.setText(cvv); - mCardCVVView.addTextChangedListener(this); - - return v; - } - - @Override - public void afterTextChanged(Editable s) { - onEdit(s.toString()); - if (s.length() == mMaxCVV) { - onComplete(); - } - } - - @Override - public void focus() { - if (isAdded()) { - mCardCVVView.selectAll(); - } - } - - public void setMaxCVV(int maxCVVLength) { - if (mCardCVVView != null && (mCardCVVView.getText().toString().length() > maxCVVLength)) { - mCardCVVView.setText(mCardCVVView.getText().toString().substring(0, maxCVVLength)); - } - - InputFilter[] FilterArray = new InputFilter[1]; - FilterArray[0] = new InputFilter.LengthFilter(maxCVVLength); - mCardCVVView.setFilters(FilterArray); - mMaxCVV = maxCVVLength; - String hintCVV = ""; - for (int i = 0; i < maxCVVLength; i++) { - hintCVV += "X"; - } - mCardCVVView.setHint(hintCVV); - } -} diff --git a/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/pager/CardCVVFragment.kt b/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/pager/CardCVVFragment.kt new file mode 100644 index 0000000..06701ef --- /dev/null +++ b/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/pager/CardCVVFragment.kt @@ -0,0 +1,70 @@ +package com.cooltechworks.creditcarddesign.pager + +import android.os.Bundle +import android.text.Editable +import android.text.InputFilter +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.EditText + +import com.cooltechworks.creditcarddesign.CardSelector +import com.cooltechworks.creditcarddesign.R + +import com.cooltechworks.creditcarddesign.CreditCardUtils.EXTRA_CARD_CVV +import kotlinx.android.synthetic.main.lyt_card_cvv.* + +/** + * Created by sharish on 9/1/15. + */ +class CardCVVFragment : CreditCardFragment() { + + private var mMaxCVV = CardSelector.CVV_LENGHT_DEFAULT + + override fun onCreateView(inflater: LayoutInflater, group: ViewGroup?, state: Bundle?): View? { + val v = inflater.inflate(R.layout.lyt_card_cvv, group, false) + + var cvv: String? = null + if (arguments != null && arguments?.containsKey(EXTRA_CARD_CVV) ?: false) { + cvv = arguments?.getString(EXTRA_CARD_CVV) + } + + if (cvv == null) { + cvv = "" + } + + card_cvv?.setText(cvv) + card_cvv?.addTextChangedListener(this) + + return v + } + + override fun afterTextChanged(s: Editable) { + onEdit(s.toString()) + if (s.length == mMaxCVV) { + onComplete() + } + } + + override fun focus() { + if (isAdded) { + card_cvv?.selectAll() + } + } + + fun setMaxCVV(maxCVVLength: Int) { + if (card_cvv != null && card_cvv?.text.toString().length > maxCVVLength) { + card_cvv?.setText(card_cvv?.text.toString().substring(0, maxCVVLength)) + } + + val FilterArray = arrayOfNulls(1) + FilterArray[0] = InputFilter.LengthFilter(maxCVVLength) + card_cvv?.filters = FilterArray + mMaxCVV = maxCVVLength + var hintCVV = "" + for (i in 0 until maxCVVLength) { + hintCVV += "X" + } + card_cvv?.hint = hintCVV + } +} diff --git a/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/pager/CardExpiryFragment.java b/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/pager/CardExpiryFragment.java deleted file mode 100755 index 619cd35..0000000 --- a/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/pager/CardExpiryFragment.java +++ /dev/null @@ -1,154 +0,0 @@ -package com.cooltechworks.creditcarddesign.pager; - -import android.os.Bundle; -import android.text.Editable; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.EditText; -import com.cooltechworks.creditcarddesign.CreditCardUtils; -import com.cooltechworks.creditcarddesign.R; - -import java.util.Calendar; - -import static com.cooltechworks.creditcarddesign.CreditCardUtils.EXTRA_CARD_EXPIRY; -import static com.cooltechworks.creditcarddesign.CreditCardUtils.EXTRA_VALIDATE_EXPIRY_DATE; - -/** - * Created by sharish on 9/1/15. - */ -public class CardExpiryFragment extends CreditCardFragment { - - EditText cardExpiryView; - - private boolean mValidateCard = true; - - public CardExpiryFragment() { - - } - - public View onCreateView(LayoutInflater inflater, ViewGroup group, Bundle state) { - - View v = inflater.inflate(R.layout.lyt_card_expiry, group, false); - cardExpiryView = (EditText) v.findViewById(R.id.card_expiry); - - String expiry = ""; - - Bundle args = getArguments(); - - if(args != null) { - - if(args.containsKey(EXTRA_CARD_EXPIRY)) { - expiry = getArguments().getString(EXTRA_CARD_EXPIRY); - } - - mValidateCard = args.getBoolean(EXTRA_VALIDATE_EXPIRY_DATE, true); - } - - if(expiry == null) { - expiry = ""; - } - - cardExpiryView.setText(expiry); - - cardExpiryView.addTextChangedListener(this); - - return v; - } - - @Override - public void afterTextChanged(Editable s) { - - String text = s.toString().replace(CreditCardUtils.SLASH_SEPERATOR, ""); - - String month, year=""; - if(text.length() >= 2) { - month = text.substring(0, 2); - - if(text.length() > 2) { - year = text.substring(2); - } - - if(mValidateCard) { - int mm = Integer.parseInt(month); - - if (mm <= 0 || mm >= 13) { - cardExpiryView.setError(getString(R.string.error_invalid_month)); - return; - } - - if (text.length() >= 4) { - - int yy = Integer.parseInt(year); - - final Calendar calendar = Calendar.getInstance(); - int currentYear = calendar.get(Calendar.YEAR); - int currentMonth = calendar.get(Calendar.MONTH) + 1; - - int millenium = (currentYear / 1000) * 1000; - - - if (yy + millenium < currentYear) { - cardExpiryView.setError(getString(R.string.error_card_expired)); - return; - } else if (yy + millenium == currentYear && mm < currentMonth) { - cardExpiryView.setError(getString(R.string.error_card_expired)); - return; - } - } - } - - } - else { - month = text; - } - - int previousLength = cardExpiryView.getText().length(); - int cursorPosition = cardExpiryView.getSelectionEnd(); - - text = CreditCardUtils.handleExpiration(month,year); - - cardExpiryView.removeTextChangedListener(this); - cardExpiryView.setText(text); - cardExpiryView.setSelection(text.length()); - cardExpiryView.addTextChangedListener(this); - - int modifiedLength = text.length(); - - if(modifiedLength <= previousLength && cursorPosition < modifiedLength) { - cardExpiryView.setSelection(cursorPosition); - } - - onEdit(text); - - if(text.length() == 5) { - onComplete(); - } - - } - - - @Override - public void focus() { - - if(isAdded()) { - cardExpiryView.selectAll(); - } - } - - - public void onSaveInstanceState(Bundle outState) { - - outState.putBoolean(EXTRA_VALIDATE_EXPIRY_DATE, mValidateCard); - super.onSaveInstanceState(outState); - } - - public void onActivityCreated(Bundle instate) { - - if(instate != null) { - mValidateCard = instate.getBoolean(EXTRA_VALIDATE_EXPIRY_DATE, mValidateCard); - } - - super.onActivityCreated(instate); - } -} diff --git a/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/pager/CardExpiryFragment.kt b/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/pager/CardExpiryFragment.kt new file mode 100755 index 0000000..083f638 --- /dev/null +++ b/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/pager/CardExpiryFragment.kt @@ -0,0 +1,148 @@ +package com.cooltechworks.creditcarddesign.pager + +import android.os.Bundle +import android.text.Editable +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.EditText +import com.cooltechworks.creditcarddesign.CreditCardUtils +import com.cooltechworks.creditcarddesign.R + +import java.util.Calendar + +import com.cooltechworks.creditcarddesign.CreditCardUtils.EXTRA_CARD_EXPIRY +import com.cooltechworks.creditcarddesign.CreditCardUtils.EXTRA_VALIDATE_EXPIRY_DATE + +/** + * Created by sharish on 9/1/15. + */ +class CardExpiryFragment : CreditCardFragment() { + + lateinit var cardExpiryView: EditText + + private var mValidateCard = true + + override fun onCreateView(inflater: LayoutInflater, group: ViewGroup?, state: Bundle?): View? { + + val v = inflater.inflate(R.layout.lyt_card_expiry, group, false) + cardExpiryView = v.findViewById(R.id.card_expiry) as EditText + + var expiry: String? = "" + + val args = arguments + + if (args != null) { + + if (args.containsKey(EXTRA_CARD_EXPIRY)) { + expiry = arguments!!.getString(EXTRA_CARD_EXPIRY) + } + + mValidateCard = args.getBoolean(EXTRA_VALIDATE_EXPIRY_DATE, true) + } + + if (expiry == null) { + expiry = "" + } + + cardExpiryView.setText(expiry) + + cardExpiryView.addTextChangedListener(this) + + return v + } + + override fun afterTextChanged(s: Editable) { + + var text = s.toString().replace(CreditCardUtils.SLASH_SEPERATOR, "") + + val month: String + var year = "" + if (text.length >= 2) { + month = text.substring(0, 2) + + if (text.length > 2) { + year = text.substring(2) + } + + if (mValidateCard) { + val mm = Integer.parseInt(month) + + if (mm <= 0 || mm >= 13) { + cardExpiryView.error = getString(R.string.error_invalid_month) + return + } + + if (text.length >= 4) { + + val yy = Integer.parseInt(year) + + val calendar = Calendar.getInstance() + val currentYear = calendar.get(Calendar.YEAR) + val currentMonth = calendar.get(Calendar.MONTH) + 1 + + val millenium = currentYear / 1000 * 1000 + + + if (yy + millenium < currentYear) { + cardExpiryView.error = getString(R.string.error_card_expired) + return + } else if (yy + millenium == currentYear && mm < currentMonth) { + cardExpiryView.error = getString(R.string.error_card_expired) + return + } + } + } + + } else { + month = text + } + + val previousLength = cardExpiryView.text.length + val cursorPosition = cardExpiryView.selectionEnd + + text = CreditCardUtils.handleExpiration(month, year) + + cardExpiryView.removeTextChangedListener(this) + cardExpiryView.setText(text) + cardExpiryView.setSelection(text.length) + cardExpiryView.addTextChangedListener(this) + + val modifiedLength = text.length + + if (modifiedLength <= previousLength && cursorPosition < modifiedLength) { + cardExpiryView.setSelection(cursorPosition) + } + + onEdit(text) + + if (text.length == 5) { + onComplete() + } + + } + + + override fun focus() { + + if (isAdded) { + cardExpiryView.selectAll() + } + } + + + override fun onSaveInstanceState(outState: Bundle) { + + outState.putBoolean(EXTRA_VALIDATE_EXPIRY_DATE, mValidateCard) + super.onSaveInstanceState(outState) + } + + override fun onActivityCreated(instate: Bundle?) { + + if (instate != null) { + mValidateCard = instate.getBoolean(EXTRA_VALIDATE_EXPIRY_DATE, mValidateCard) + } + + super.onActivityCreated(instate) + } +} diff --git a/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/pager/CardFragmentAdapter.java b/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/pager/CardFragmentAdapter.java deleted file mode 100644 index a070c9f..0000000 --- a/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/pager/CardFragmentAdapter.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.cooltechworks.creditcarddesign.pager; - -import android.os.Bundle; -import android.os.Parcelable; -import androidx.fragment.app.Fragment; -import androidx.fragment.app.FragmentManager; -import androidx.fragment.app.FragmentStatePagerAdapter; - -/** - * Created by sharish on 9/1/15. - */ -public class CardFragmentAdapter extends FragmentStatePagerAdapter implements IActionListener { - - public void focus(int position) { - ((IFocus) getItem(position)).focus(); - } - - public interface ICardEntryCompleteListener { - void onCardEntryComplete(int currentIndex); - - void onCardEntryEdit(int currentIndex, String entryValue); - } - - private final CardNumberFragment mCardNumberFragment; - private final CardExpiryFragment mCardExpiryFragment; - private final CardCVVFragment mCardCVVFragment; - private final CardNameFragment mCardNameFragment; - - private ICardEntryCompleteListener mCardEntryCompleteListener; - - public CardFragmentAdapter(FragmentManager fm, Bundle args) { - super(fm); - - mCardCVVFragment = new CardCVVFragment(); - mCardCVVFragment.setArguments(args); - - mCardNameFragment = new CardNameFragment(); - mCardNameFragment.setArguments(args); - - mCardNumberFragment = new CardNumberFragment(); - mCardNumberFragment.setArguments(args); - - mCardExpiryFragment = new CardExpiryFragment(); - mCardExpiryFragment.setArguments(args); - - mCardNameFragment.setActionListener(this); - mCardNumberFragment.setActionListener(this); - mCardExpiryFragment.setActionListener(this); - mCardCVVFragment.setActionListener(this); - } - - public void setOnCardEntryCompleteListener(ICardEntryCompleteListener listener) { - this.mCardEntryCompleteListener = listener; - } - - @Override - public Fragment getItem(int position) { - return new Fragment[]{mCardNumberFragment, mCardExpiryFragment, mCardCVVFragment, mCardNameFragment}[position]; - } - - @Override - public int getCount() { - return 4; - } - - - @Override - public void onActionComplete(CreditCardFragment fragment) { - int index = getIndex(fragment); - if (index >= 0 && mCardEntryCompleteListener != null) { - mCardEntryCompleteListener.onCardEntryComplete(index); - } - } - - public int getIndex(CreditCardFragment fragment) { - int index = -1; - if (fragment == mCardNumberFragment) { - index = 0; - } else if (fragment == mCardExpiryFragment) { - index = 1; - } else if (fragment == mCardCVVFragment) { - index = 2; - } else if (fragment == mCardNameFragment) { - index = 3; - } - - return index; - } - - public void setMaxCVV(int maxCVV) { - if (mCardCVVFragment != null) { - mCardCVVFragment.setMaxCVV(maxCVV); - } - } - - @Override - public void onEdit(CreditCardFragment fragment, String edit) { - int index = getIndex(fragment); - - if (index >= 0 && mCardEntryCompleteListener != null) { - mCardEntryCompleteListener.onCardEntryEdit(index, edit); - } - } - - @Override - public void restoreState(Parcelable parcelable, ClassLoader classLoader) { - //do nothing here! no call to super.restoreState(parcelable, classLoader); - } -} diff --git a/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/pager/CardFragmentAdapter.kt b/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/pager/CardFragmentAdapter.kt new file mode 100644 index 0000000..2270944 --- /dev/null +++ b/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/pager/CardFragmentAdapter.kt @@ -0,0 +1,101 @@ +package com.cooltechworks.creditcarddesign.pager + +import android.os.Bundle +import android.os.Parcelable +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentStatePagerAdapter + +/** + * Created by sharish on 9/1/15. + */ +class CardFragmentAdapter(fm: FragmentManager, args: Bundle?) : FragmentStatePagerAdapter(fm), IActionListener { + + private val mCardNumberFragment: CardNumberFragment + private val mCardExpiryFragment: CardExpiryFragment + private val mCardCVVFragment: CardCVVFragment + private val mCardNameFragment: CardNameFragment + + private var mCardEntryCompleteListener: ICardEntryCompleteListener? = null + + fun focus(position: Int) { + (getItem(position) as IFocus).focus() + } + + interface ICardEntryCompleteListener { + fun onCardEntryComplete(currentIndex: Int) + + fun onCardEntryEdit(currentIndex: Int, entryValue: String) + } + + init { + + mCardCVVFragment = CardCVVFragment() + mCardCVVFragment.arguments = args + + mCardNameFragment = CardNameFragment() + mCardNameFragment.arguments = args + + mCardNumberFragment = CardNumberFragment() + mCardNumberFragment.arguments = args + + mCardExpiryFragment = CardExpiryFragment() + mCardExpiryFragment.arguments = args + + mCardNameFragment.setActionListener(this) + mCardNumberFragment.setActionListener(this) + mCardExpiryFragment.setActionListener(this) + mCardCVVFragment.setActionListener(this) + } + + fun setOnCardEntryCompleteListener(listener: ICardEntryCompleteListener) { + this.mCardEntryCompleteListener = listener + } + + override fun getItem(position: Int): Fragment { + return arrayOf(mCardNumberFragment, mCardExpiryFragment, mCardCVVFragment, mCardNameFragment)[position] + } + + override fun getCount(): Int { + return 4 + } + + + override fun onActionComplete(fragment: CreditCardFragment) { + val index = getIndex(fragment) + if (index >= 0 && mCardEntryCompleteListener != null) { + mCardEntryCompleteListener!!.onCardEntryComplete(index) + } + } + + fun getIndex(fragment: CreditCardFragment): Int { + var index = -1 + if (fragment === mCardNumberFragment) { + index = 0 + } else if (fragment === mCardExpiryFragment) { + index = 1 + } else if (fragment === mCardCVVFragment) { + index = 2 + } else if (fragment === mCardNameFragment) { + index = 3 + } + + return index + } + + fun setMaxCVV(maxCVV: Int) { + mCardCVVFragment.setMaxCVV(maxCVV) + } + + override fun onEdit(fragment: CreditCardFragment, edit: String) { + val index = getIndex(fragment) + + if (index >= 0 && mCardEntryCompleteListener != null) { + mCardEntryCompleteListener!!.onCardEntryEdit(index, edit) + } + } + + override fun restoreState(parcelable: Parcelable?, classLoader: ClassLoader?) { + //do nothing here! no call to super.restoreState(parcelable, classLoader); + } +} diff --git a/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/pager/CardNameFragment.java b/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/pager/CardNameFragment.java deleted file mode 100644 index c4e976e..0000000 --- a/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/pager/CardNameFragment.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.cooltechworks.creditcarddesign.pager; - -import android.os.Bundle; -import android.text.Editable; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.EditText; - -import com.cooltechworks.creditcarddesign.R; - -import static com.cooltechworks.creditcarddesign.CreditCardUtils.EXTRA_CARD_CVV; -import static com.cooltechworks.creditcarddesign.CreditCardUtils.EXTRA_CARD_HOLDER_NAME; -/** - * Created by sharish on 9/1/15. - */ -public class CardNameFragment extends CreditCardFragment { - - - private EditText mCardNameView; - - public CardNameFragment() { - - } - - public View onCreateView(LayoutInflater inflater, ViewGroup group, Bundle state) { - - View v = inflater.inflate(R.layout.lyt_card_holder_name, group,false); - mCardNameView = (EditText) v.findViewById(R.id.card_name); - - String name = ""; - if(getArguments() != null && getArguments().containsKey(EXTRA_CARD_HOLDER_NAME)) { - name = getArguments().getString(EXTRA_CARD_HOLDER_NAME); - } - - - if(name == null) { - name = ""; - } - - mCardNameView.setText(name); - mCardNameView.addTextChangedListener(this); - - return v; - } - - @Override - public void afterTextChanged(Editable s) { - - onEdit(s.toString()); - if(s.length() == getResources().getInteger(R.integer.card_name_len)) { - onComplete(); - } - } - - @Override - public void focus() { - - if(isAdded()) { - mCardNameView.selectAll(); - } - } -} diff --git a/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/pager/CardNameFragment.kt b/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/pager/CardNameFragment.kt new file mode 100644 index 0000000..164e0f3 --- /dev/null +++ b/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/pager/CardNameFragment.kt @@ -0,0 +1,58 @@ +package com.cooltechworks.creditcarddesign.pager + +import android.os.Bundle +import android.text.Editable +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.EditText + +import com.cooltechworks.creditcarddesign.R + +import com.cooltechworks.creditcarddesign.CreditCardUtils.EXTRA_CARD_CVV +import com.cooltechworks.creditcarddesign.CreditCardUtils.EXTRA_CARD_HOLDER_NAME + +/** + * Created by sharish on 9/1/15. + */ +class CardNameFragment : CreditCardFragment() { + + + private var mCardNameView: EditText? = null + + override fun onCreateView(inflater: LayoutInflater, group: ViewGroup?, state: Bundle?): View? { + + val v = inflater.inflate(R.layout.lyt_card_holder_name, group, false) + mCardNameView = v.findViewById(R.id.card_name) as EditText + + var name: String? = "" + if (arguments != null && arguments?.containsKey(EXTRA_CARD_HOLDER_NAME) ?: false) { + name = arguments!!.getString(EXTRA_CARD_HOLDER_NAME) + } + + + if (name == null) { + name = "" + } + + mCardNameView!!.setText(name) + mCardNameView!!.addTextChangedListener(this) + + return v + } + + override fun afterTextChanged(s: Editable) { + + onEdit(s.toString()) + if (s.length == resources.getInteger(R.integer.card_name_len)) { + onComplete() + } + } + + override fun focus() { + + if (isAdded) { + mCardNameView!!.selectAll() + } + } +} diff --git a/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/pager/CardNumberFragment.java b/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/pager/CardNumberFragment.java deleted file mode 100644 index a70e9d7..0000000 --- a/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/pager/CardNumberFragment.java +++ /dev/null @@ -1,81 +0,0 @@ -package com.cooltechworks.creditcarddesign.pager; - -import android.os.Bundle; -import android.text.Editable; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.EditText; - -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; - -/** - * Created by sharish on 9/1/15. - */ -public class CardNumberFragment extends CreditCardFragment { - - EditText mCardNumberView; - - public CardNumberFragment() { - } - - public View onCreateView(LayoutInflater inflater, ViewGroup group, Bundle state) { - View v = inflater.inflate(R.layout.lyt_card_number, group, false); - mCardNumberView = (EditText) v.findViewById(R.id.card_number_field); - - String number = ""; - - if (getArguments() != null && getArguments().containsKey(EXTRA_CARD_NUMBER)) { - number = getArguments().getString(EXTRA_CARD_NUMBER); - } - - if (number == null) { - number = ""; - } - - mCardNumberView.setText(number); - mCardNumberView.addTextChangedListener(this); - - return v; - } - - - @Override - public void afterTextChanged(Editable s) { - int cursorPosition = mCardNumberView.getSelectionEnd(); - int previousLength = mCardNumberView.getText().length(); - - String cardNumber = CreditCardUtils.handleCardNumber(s.toString()); - int modifiedLength = cardNumber.length(); - - mCardNumberView.removeTextChangedListener(this); - 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(); - mCardNumberView.setSelection(cardNumber.length() > maxLengthWithSpaces ? maxLengthWithSpaces : cardNumber.length()); - mCardNumberView.addTextChangedListener(this); - - if (modifiedLength <= previousLength && cursorPosition < modifiedLength) { - mCardNumberView.setSelection(cursorPosition); - } - - onEdit(cardNumber); - - if (rawCardNumber.length() == CreditCardUtils.selectCardLength(cardType)) { - onComplete(); - } - } - - @Override - public void focus() { - if (isAdded()) { - mCardNumberView.selectAll(); - } - } -} diff --git a/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/pager/CardNumberFragment.kt b/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/pager/CardNumberFragment.kt new file mode 100644 index 0000000..57e3dff --- /dev/null +++ b/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/pager/CardNumberFragment.kt @@ -0,0 +1,76 @@ +package com.cooltechworks.creditcarddesign.pager + +import android.os.Bundle +import android.text.Editable +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.EditText + +import com.cooltechworks.creditcarddesign.CreditCardUtils +import com.cooltechworks.creditcarddesign.R + +import com.cooltechworks.creditcarddesign.CreditCardUtils.CARD_NUMBER_FORMAT +import com.cooltechworks.creditcarddesign.CreditCardUtils.CARD_NUMBER_FORMAT_AMEX +import com.cooltechworks.creditcarddesign.CreditCardUtils.EXTRA_CARD_NUMBER + +/** + * Created by sharish on 9/1/15. + */ +class CardNumberFragment : CreditCardFragment() { + + lateinit var mCardNumberView: EditText + + override fun onCreateView(inflater: LayoutInflater, group: ViewGroup?, state: Bundle?): View? { + val v = inflater.inflate(R.layout.lyt_card_number, group, false) + mCardNumberView = v.findViewById(R.id.card_number_field) as EditText + + var number: String? = "" + + if (arguments != null && arguments?.containsKey(EXTRA_CARD_NUMBER) ?: false) { + number = arguments?.getString(EXTRA_CARD_NUMBER) + } + + if (number == null) { + number = "" + } + + mCardNumberView.setText(number) + mCardNumberView.addTextChangedListener(this) + + return v + } + + + override fun afterTextChanged(s: Editable) { + val cursorPosition = mCardNumberView.selectionEnd + val previousLength = mCardNumberView.text.length + + val cardNumber = CreditCardUtils.handleCardNumber(s.toString()) + val modifiedLength = cardNumber.length + + mCardNumberView.removeTextChangedListener(this) + mCardNumberView.setText(cardNumber) + val rawCardNumber = cardNumber.replace(CreditCardUtils.SPACE_SEPERATOR, "") + val cardType = CreditCardUtils.selectCardType(rawCardNumber) + val maxLengthWithSpaces = (if (cardType == CreditCardUtils.CardType.AMEX_CARD) CARD_NUMBER_FORMAT_AMEX else CARD_NUMBER_FORMAT).length + mCardNumberView.setSelection(if (cardNumber.length > maxLengthWithSpaces) maxLengthWithSpaces else cardNumber.length) + mCardNumberView.addTextChangedListener(this) + + if (modifiedLength <= previousLength && cursorPosition < modifiedLength) { + mCardNumberView.setSelection(cursorPosition) + } + + onEdit(cardNumber) + + if (rawCardNumber.length == CreditCardUtils.selectCardLength(cardType)) { + onComplete() + } + } + + override fun focus() { + if (isAdded) { + mCardNumberView.selectAll() + } + } +} diff --git a/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/pager/CreditCardFragment.java b/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/pager/CreditCardFragment.java deleted file mode 100644 index 67feed1..0000000 --- a/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/pager/CreditCardFragment.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.cooltechworks.creditcarddesign.pager; - -import androidx.fragment.app.Fragment; -import android.text.TextWatcher; - -/** - * Created by sharish on 9/1/15. - */ -public abstract class CreditCardFragment extends Fragment implements TextWatcher, IFocus { - - protected IActionListener mActionListener; - - public void setActionListener(IActionListener listener) { - mActionListener = listener; - } - - @Override - public void beforeTextChanged(CharSequence s, int start, int count, int after) { - - } - - @Override - public void onTextChanged(CharSequence s, int start, int before, int count) { - - } - - - public void onEdit(String edit) { - - if(mActionListener != null) { - mActionListener.onEdit(this,edit); - } - - } - - public void onComplete() { - - if(mActionListener != null) { - mActionListener.onActionComplete(this); - } - - } - -} diff --git a/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/pager/CreditCardFragment.kt b/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/pager/CreditCardFragment.kt new file mode 100644 index 0000000..77e5b47 --- /dev/null +++ b/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/pager/CreditCardFragment.kt @@ -0,0 +1,42 @@ +package com.cooltechworks.creditcarddesign.pager + +import androidx.fragment.app.Fragment +import android.text.TextWatcher + +/** + * Created by sharish on 9/1/15. + */ +abstract class CreditCardFragment : Fragment(), TextWatcher, IFocus { + + protected var mActionListener: IActionListener? = null + + fun setActionListener(listener: IActionListener) { + mActionListener = listener + } + + override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) { + + } + + override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) { + + } + + + fun onEdit(edit: String) { + + if (mActionListener != null) { + mActionListener!!.onEdit(this, edit) + } + + } + + fun onComplete() { + + if (mActionListener != null) { + mActionListener!!.onActionComplete(this) + } + + } + +} diff --git a/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/pager/IActionListener.java b/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/pager/IActionListener.java deleted file mode 100644 index ef4dbea..0000000 --- a/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/pager/IActionListener.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.cooltechworks.creditcarddesign.pager; - -public interface IActionListener { - public void onActionComplete(CreditCardFragment fragment); - public void onEdit(CreditCardFragment fragment, String edit); - - } \ No newline at end of file diff --git a/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/pager/IActionListener.kt b/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/pager/IActionListener.kt new file mode 100644 index 0000000..79841b4 --- /dev/null +++ b/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/pager/IActionListener.kt @@ -0,0 +1,7 @@ +package com.cooltechworks.creditcarddesign.pager + +interface IActionListener { + fun onActionComplete(fragment: CreditCardFragment) + fun onEdit(fragment: CreditCardFragment, edit: String) + +} \ No newline at end of file diff --git a/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/pager/IFocus.java b/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/pager/IFocus.java deleted file mode 100644 index 12382f6..0000000 --- a/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/pager/IFocus.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.cooltechworks.creditcarddesign.pager; - -/** - * Created by Harish on 17/01/16. - */ -public interface IFocus { - void focus(); -} diff --git a/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/pager/IFocus.kt b/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/pager/IFocus.kt new file mode 100644 index 0000000..7547bee --- /dev/null +++ b/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/pager/IFocus.kt @@ -0,0 +1,8 @@ +package com.cooltechworks.creditcarddesign.pager + +/** + * Created by Harish on 17/01/16. + */ +interface IFocus { + fun focus() +} diff --git a/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/utils/ViewUtils.kt b/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/utils/ViewUtils.kt new file mode 100644 index 0000000..668cc28 --- /dev/null +++ b/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/utils/ViewUtils.kt @@ -0,0 +1,20 @@ +package com.cooltechworks.creditcarddesign.utils + +import android.content.Context +import android.view.View +import android.view.inputmethod.InputMethodManager + +fun View.showKeyboard() { + this.post { + requestFocus() + val imm = + context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager + imm.showSoftInput(this, InputMethodManager.SHOW_IMPLICIT) + } +} + +fun View.hideKeyboard() { + val inputMethodManager = + context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager + inputMethodManager.hideSoftInputFromWindow(windowToken, 0) +} \ No newline at end of file diff --git a/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/views/HeightWrappingViewPager.java b/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/views/HeightWrappingViewPager.java deleted file mode 100644 index 090a745..0000000 --- a/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/views/HeightWrappingViewPager.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.cooltechworks.creditcarddesign.views; - -import android.content.Context; -import androidx.viewpager.widget.ViewPager; -import android.util.AttributeSet; -import android.view.View; - -public class HeightWrappingViewPager extends ViewPager { - - public HeightWrappingViewPager(Context context) { - super(context); - } - - public HeightWrappingViewPager(Context context, AttributeSet attrs) { - super(context, attrs); - } - - @Override - protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - super.onMeasure(widthMeasureSpec, heightMeasureSpec); - View firstChild = getChildAt(0); - firstChild.measure(widthMeasureSpec, heightMeasureSpec); - super.onMeasure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(firstChild.getMeasuredHeight(), MeasureSpec.EXACTLY)); - } -} \ No newline at end of file diff --git a/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/views/HeightWrappingViewPager.kt b/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/views/HeightWrappingViewPager.kt new file mode 100644 index 0000000..6ca12d4 --- /dev/null +++ b/creditcarddesign/src/main/java/com/cooltechworks/creditcarddesign/views/HeightWrappingViewPager.kt @@ -0,0 +1,20 @@ +package com.cooltechworks.creditcarddesign.views + +import android.content.Context +import androidx.viewpager.widget.ViewPager +import android.util.AttributeSet +import android.view.View + +class HeightWrappingViewPager : ViewPager { + + constructor(context: Context) : super(context) {} + + constructor(context: Context, attrs: AttributeSet) : super(context, attrs) {} + + override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { + super.onMeasure(widthMeasureSpec, heightMeasureSpec) + val firstChild = getChildAt(0) + firstChild.measure(widthMeasureSpec, heightMeasureSpec) + super.onMeasure(widthMeasureSpec, View.MeasureSpec.makeMeasureSpec(firstChild.measuredHeight, View.MeasureSpec.EXACTLY)) + } +} \ No newline at end of file