diff --git a/app/src/main/java/com/verygoodsecurity/demoapp/activity_case/VGSCollectActivity.kt b/app/src/main/java/com/verygoodsecurity/demoapp/activity_case/VGSCollectActivity.kt index 9825686fd..9ff33da9f 100644 --- a/app/src/main/java/com/verygoodsecurity/demoapp/activity_case/VGSCollectActivity.kt +++ b/app/src/main/java/com/verygoodsecurity/demoapp/activity_case/VGSCollectActivity.kt @@ -22,9 +22,13 @@ import com.verygoodsecurity.vgscollect.core.model.network.VGSRequest import com.verygoodsecurity.vgscollect.core.model.network.VGSResponse import com.verygoodsecurity.vgscollect.core.model.state.FieldState import com.verygoodsecurity.vgscollect.core.storage.OnFieldStateChangeListener +import com.verygoodsecurity.vgscollect.view.card.BrandParams import com.verygoodsecurity.vgscollect.view.card.CardType +import com.verygoodsecurity.vgscollect.view.card.ChecksumAlgorithm +import com.verygoodsecurity.vgscollect.view.card.CustomCardBrand import com.verygoodsecurity.vgscollect.view.card.formatter.CardMaskAdapter import com.verygoodsecurity.vgscollect.view.card.icon.CardIconAdapter +import com.verygoodsecurity.vgscollect.view.card.validation.payment.PersonNameRule import kotlinx.android.synthetic.main.activity_collect_demo.* class VGSCollectActivity: AppCompatActivity(), VgsCollectResponseListener, View.OnClickListener { @@ -76,6 +80,14 @@ class VGSCollectActivity: AppCompatActivity(), VgsCollectResponseListener, View. } private fun setupCardHolderField() { + val rule : PersonNameRule = PersonNameRule.ValidationBuilder() +// .setRegex("^([a-zA-Z]{2,}\\s[a-zA-z]{1,})\$") + .setAllowableMinLength(3) + .setAllowableMaxLength(7) + .build() + + cardHolderField.addRule(rule) + vgsForm.bindView(cardHolderField) cardHolderField?.setOnFieldStateChangeListener(object : OnFieldStateChangeListener { override fun onStateChange(state: FieldState) { @@ -104,6 +116,8 @@ class VGSCollectActivity: AppCompatActivity(), VgsCollectResponseListener, View. } private fun setupCardNumberField() { + addCustomBrands() + vgsForm.bindView(cardNumberField) cardNumberField.setCardIconAdapter(object : CardIconAdapter(this) { @@ -143,6 +157,37 @@ class VGSCollectActivity: AppCompatActivity(), VgsCollectResponseListener, View. }) } + private fun addCustomBrands() { + val params = BrandParams( + "### ### ### ###", + ChecksumAlgorithm.LUHN, + arrayOf(4, 10, 12), + arrayOf(3, 5) + ) + val newBrand = CustomCardBrand( + "^777", + "NEW BRAND", + R.drawable.ic_cards, + params + ) + cardNumberField.addCardBrand(newBrand) + + + val params2 = BrandParams( + "### ### ### ###", + ChecksumAlgorithm.LUHN, + arrayOf(18), + arrayOf(4) + ) + val newBrand2 = CustomCardBrand( + "^878", + "VGS Brand", + CardType.MAESTRO.resId, + params2 + ) + cardNumberField.addCardBrand(newBrand2) + } + private fun retrieveSettings() { val bndl = intent?.extras diff --git a/app/src/main/res/layout/activity_collect_demo.xml b/app/src/main/res/layout/activity_collect_demo.xml index b7f5e5a5b..850694329 100644 --- a/app/src/main/res/layout/activity_collect_demo.xml +++ b/app/src/main/res/layout/activity_collect_demo.xml @@ -139,8 +139,6 @@ app:fieldName="card_data.cardNumber" style="@style/AppTheme.PaymentField" app:numberDivider="-" - app:enableValidation="false" - app:isRequired="false" app:fontFamily="@font/robotomono_light" android:nextFocusDown="@+id/cardHolderField" app:imeOptions="actionNext" @@ -172,7 +170,7 @@ app:imeOptions="actionNext" app:fontFamily="@font/robotomono_light" app:fieldName="card_data.personal_data.cardHolder" - app:text="John Galt"/> + app:text="John Galt I"/> diff --git a/docs/allclasses-frame.html b/docs/allclasses-frame.html index d2cb77acb..b8cd8c377 100644 --- a/docs/allclasses-frame.html +++ b/docs/allclasses-frame.html @@ -2,10 +2,10 @@ - + All Classes - + @@ -16,12 +16,15 @@

All Classes

  • BaseTransmitActivity
  • BaseTransmitActivity.Companion
  • BooleanExtensionKt
  • +
  • BrandParams
  • CardIconAdapter
  • CardMaskAdapter
  • CardNumberFormatter
  • CardNumberFormatter.Companion
  • CardType
  • CardVerificationCodeEditText
  • +
  • ChecksumAlgorithm
  • +
  • CompositeValidator
  • CustomCardBrand
  • DatePickerMode
  • Environment
  • @@ -47,6 +50,8 @@

    All Classes

  • NumberExtensionKt
  • OnFieldStateChangeListener
  • PersonNameEditText
  • +
  • PersonNameRule
  • +
  • PersonNameRule.ValidationBuilder
  • SavedState.Companion
  • TextInputFieldLayout
  • UriExtensionKt
  • diff --git a/docs/allclasses-noframe.html b/docs/allclasses-noframe.html index 965ea1fd9..39e06279b 100644 --- a/docs/allclasses-noframe.html +++ b/docs/allclasses-noframe.html @@ -2,10 +2,10 @@ - + All Classes - + @@ -16,12 +16,15 @@

    All Classes

  • BaseTransmitActivity
  • BaseTransmitActivity.Companion
  • BooleanExtensionKt
  • +
  • BrandParams
  • CardIconAdapter
  • CardMaskAdapter
  • CardNumberFormatter
  • CardNumberFormatter.Companion
  • CardType
  • CardVerificationCodeEditText
  • +
  • ChecksumAlgorithm
  • +
  • CompositeValidator
  • CustomCardBrand
  • DatePickerMode
  • Environment
  • @@ -47,6 +50,8 @@

    All Classes

  • NumberExtensionKt
  • OnFieldStateChangeListener
  • PersonNameEditText
  • +
  • PersonNameRule
  • +
  • PersonNameRule.ValidationBuilder
  • SavedState.Companion
  • TextInputFieldLayout
  • UriExtensionKt
  • diff --git a/docs/com/verygoodsecurity/vgscollect/app/BaseTransmitActivity.Companion.html b/docs/com/verygoodsecurity/vgscollect/app/BaseTransmitActivity.Companion.html index ee43858ae..ae83fa011 100644 --- a/docs/com/verygoodsecurity/vgscollect/app/BaseTransmitActivity.Companion.html +++ b/docs/com/verygoodsecurity/vgscollect/app/BaseTransmitActivity.Companion.html @@ -2,10 +2,10 @@ - + BaseTransmitActivity.Companion - + diff --git a/docs/com/verygoodsecurity/vgscollect/app/BaseTransmitActivity.html b/docs/com/verygoodsecurity/vgscollect/app/BaseTransmitActivity.html index 96a351d79..95d7f4aac 100644 --- a/docs/com/verygoodsecurity/vgscollect/app/BaseTransmitActivity.html +++ b/docs/com/verygoodsecurity/vgscollect/app/BaseTransmitActivity.html @@ -2,10 +2,10 @@ - + BaseTransmitActivity - + diff --git a/docs/com/verygoodsecurity/vgscollect/app/package-frame.html b/docs/com/verygoodsecurity/vgscollect/app/package-frame.html index edf9329d0..327760323 100644 --- a/docs/com/verygoodsecurity/vgscollect/app/package-frame.html +++ b/docs/com/verygoodsecurity/vgscollect/app/package-frame.html @@ -2,10 +2,10 @@ - + com.verygoodsecurity.vgscollect.app - + diff --git a/docs/com/verygoodsecurity/vgscollect/app/package-summary.html b/docs/com/verygoodsecurity/vgscollect/app/package-summary.html index 03596a5b5..03007aee5 100644 --- a/docs/com/verygoodsecurity/vgscollect/app/package-summary.html +++ b/docs/com/verygoodsecurity/vgscollect/app/package-summary.html @@ -2,10 +2,10 @@ - + com.verygoodsecurity.vgscollect.app - + diff --git a/docs/com/verygoodsecurity/vgscollect/app/package-tree.html b/docs/com/verygoodsecurity/vgscollect/app/package-tree.html index 8d8b20749..5a868629e 100644 --- a/docs/com/verygoodsecurity/vgscollect/app/package-tree.html +++ b/docs/com/verygoodsecurity/vgscollect/app/package-tree.html @@ -2,10 +2,10 @@ - + com.verygoodsecurity.vgscollect.app Class Hierarchy - + diff --git a/docs/com/verygoodsecurity/vgscollect/core/Environment.html b/docs/com/verygoodsecurity/vgscollect/core/Environment.html index 3dbded085..46068ae4d 100644 --- a/docs/com/verygoodsecurity/vgscollect/core/Environment.html +++ b/docs/com/verygoodsecurity/vgscollect/core/Environment.html @@ -2,10 +2,10 @@ - + Environment - + diff --git a/docs/com/verygoodsecurity/vgscollect/core/HTTPMethod.html b/docs/com/verygoodsecurity/vgscollect/core/HTTPMethod.html index 2de324086..f02698d4a 100644 --- a/docs/com/verygoodsecurity/vgscollect/core/HTTPMethod.html +++ b/docs/com/verygoodsecurity/vgscollect/core/HTTPMethod.html @@ -2,10 +2,10 @@ - + HTTPMethod - + diff --git a/docs/com/verygoodsecurity/vgscollect/core/VGSCollect.html b/docs/com/verygoodsecurity/vgscollect/core/VGSCollect.html index 593d66301..6489a72b4 100644 --- a/docs/com/verygoodsecurity/vgscollect/core/VGSCollect.html +++ b/docs/com/verygoodsecurity/vgscollect/core/VGSCollect.html @@ -2,10 +2,10 @@ - + VGSCollect - + diff --git a/docs/com/verygoodsecurity/vgscollect/core/VgsCollectResponseListener.html b/docs/com/verygoodsecurity/vgscollect/core/VgsCollectResponseListener.html index 5de501da2..f2eafb532 100644 --- a/docs/com/verygoodsecurity/vgscollect/core/VgsCollectResponseListener.html +++ b/docs/com/verygoodsecurity/vgscollect/core/VgsCollectResponseListener.html @@ -2,10 +2,10 @@ - + VgsCollectResponseListener - + diff --git a/docs/com/verygoodsecurity/vgscollect/core/model/network/VGSError.html b/docs/com/verygoodsecurity/vgscollect/core/model/network/VGSError.html index ba18ba1b0..8a2df6e3d 100644 --- a/docs/com/verygoodsecurity/vgscollect/core/model/network/VGSError.html +++ b/docs/com/verygoodsecurity/vgscollect/core/model/network/VGSError.html @@ -2,10 +2,10 @@ - + VGSError - + diff --git a/docs/com/verygoodsecurity/vgscollect/core/model/network/VGSRequest.VGSRequestBuilder.html b/docs/com/verygoodsecurity/vgscollect/core/model/network/VGSRequest.VGSRequestBuilder.html index 90792e3cf..2f68d918d 100644 --- a/docs/com/verygoodsecurity/vgscollect/core/model/network/VGSRequest.VGSRequestBuilder.html +++ b/docs/com/verygoodsecurity/vgscollect/core/model/network/VGSRequest.VGSRequestBuilder.html @@ -2,10 +2,10 @@ - + VGSRequest.VGSRequestBuilder - + diff --git a/docs/com/verygoodsecurity/vgscollect/core/model/network/VGSRequest.html b/docs/com/verygoodsecurity/vgscollect/core/model/network/VGSRequest.html index 182fc17d4..b2ec1142e 100644 --- a/docs/com/verygoodsecurity/vgscollect/core/model/network/VGSRequest.html +++ b/docs/com/verygoodsecurity/vgscollect/core/model/network/VGSRequest.html @@ -2,10 +2,10 @@ - + VGSRequest - + diff --git a/docs/com/verygoodsecurity/vgscollect/core/model/network/VGSResponse.ErrorResponse.html b/docs/com/verygoodsecurity/vgscollect/core/model/network/VGSResponse.ErrorResponse.html index e9566a22d..cc5781a73 100644 --- a/docs/com/verygoodsecurity/vgscollect/core/model/network/VGSResponse.ErrorResponse.html +++ b/docs/com/verygoodsecurity/vgscollect/core/model/network/VGSResponse.ErrorResponse.html @@ -2,10 +2,10 @@ - + VGSResponse.ErrorResponse - + diff --git a/docs/com/verygoodsecurity/vgscollect/core/model/network/VGSResponse.SuccessResponse.html b/docs/com/verygoodsecurity/vgscollect/core/model/network/VGSResponse.SuccessResponse.html index 989b16767..a9bbd3ed5 100644 --- a/docs/com/verygoodsecurity/vgscollect/core/model/network/VGSResponse.SuccessResponse.html +++ b/docs/com/verygoodsecurity/vgscollect/core/model/network/VGSResponse.SuccessResponse.html @@ -2,10 +2,10 @@ - + VGSResponse.SuccessResponse - + diff --git a/docs/com/verygoodsecurity/vgscollect/core/model/network/VGSResponse.html b/docs/com/verygoodsecurity/vgscollect/core/model/network/VGSResponse.html index 78797e35e..0a11c9448 100644 --- a/docs/com/verygoodsecurity/vgscollect/core/model/network/VGSResponse.html +++ b/docs/com/verygoodsecurity/vgscollect/core/model/network/VGSResponse.html @@ -2,10 +2,10 @@ - + VGSResponse - + diff --git a/docs/com/verygoodsecurity/vgscollect/core/model/network/package-frame.html b/docs/com/verygoodsecurity/vgscollect/core/model/network/package-frame.html index ed009a782..a71cab6a4 100644 --- a/docs/com/verygoodsecurity/vgscollect/core/model/network/package-frame.html +++ b/docs/com/verygoodsecurity/vgscollect/core/model/network/package-frame.html @@ -2,10 +2,10 @@ - + com.verygoodsecurity.vgscollect.core.model.network - + diff --git a/docs/com/verygoodsecurity/vgscollect/core/model/network/package-summary.html b/docs/com/verygoodsecurity/vgscollect/core/model/network/package-summary.html index 7b1cc0f37..c17c963e1 100644 --- a/docs/com/verygoodsecurity/vgscollect/core/model/network/package-summary.html +++ b/docs/com/verygoodsecurity/vgscollect/core/model/network/package-summary.html @@ -2,10 +2,10 @@ - + com.verygoodsecurity.vgscollect.core.model.network - + diff --git a/docs/com/verygoodsecurity/vgscollect/core/model/network/package-tree.html b/docs/com/verygoodsecurity/vgscollect/core/model/network/package-tree.html index ca9266935..51bef9962 100644 --- a/docs/com/verygoodsecurity/vgscollect/core/model/network/package-tree.html +++ b/docs/com/verygoodsecurity/vgscollect/core/model/network/package-tree.html @@ -2,10 +2,10 @@ - + com.verygoodsecurity.vgscollect.core.model.network Class Hierarchy - + diff --git a/docs/com/verygoodsecurity/vgscollect/core/model/state/FieldContentKt.html b/docs/com/verygoodsecurity/vgscollect/core/model/state/FieldContentKt.html index b80aa1686..e19140f8d 100644 --- a/docs/com/verygoodsecurity/vgscollect/core/model/state/FieldContentKt.html +++ b/docs/com/verygoodsecurity/vgscollect/core/model/state/FieldContentKt.html @@ -2,10 +2,10 @@ - + FieldContentKt - + diff --git a/docs/com/verygoodsecurity/vgscollect/core/model/state/FieldState.CVCState.html b/docs/com/verygoodsecurity/vgscollect/core/model/state/FieldState.CVCState.html index 821c3bfaf..d5a5c1410 100644 --- a/docs/com/verygoodsecurity/vgscollect/core/model/state/FieldState.CVCState.html +++ b/docs/com/verygoodsecurity/vgscollect/core/model/state/FieldState.CVCState.html @@ -2,10 +2,10 @@ - + FieldState.CVCState - + diff --git a/docs/com/verygoodsecurity/vgscollect/core/model/state/FieldState.CardExpirationDateState.html b/docs/com/verygoodsecurity/vgscollect/core/model/state/FieldState.CardExpirationDateState.html index a4f34ef94..3b92ee468 100644 --- a/docs/com/verygoodsecurity/vgscollect/core/model/state/FieldState.CardExpirationDateState.html +++ b/docs/com/verygoodsecurity/vgscollect/core/model/state/FieldState.CardExpirationDateState.html @@ -2,10 +2,10 @@ - + FieldState.CardExpirationDateState - + diff --git a/docs/com/verygoodsecurity/vgscollect/core/model/state/FieldState.CardHolderNameState.html b/docs/com/verygoodsecurity/vgscollect/core/model/state/FieldState.CardHolderNameState.html index 5b1e45ef7..951947ced 100644 --- a/docs/com/verygoodsecurity/vgscollect/core/model/state/FieldState.CardHolderNameState.html +++ b/docs/com/verygoodsecurity/vgscollect/core/model/state/FieldState.CardHolderNameState.html @@ -2,10 +2,10 @@ - + FieldState.CardHolderNameState - + diff --git a/docs/com/verygoodsecurity/vgscollect/core/model/state/FieldState.CardNumberState.html b/docs/com/verygoodsecurity/vgscollect/core/model/state/FieldState.CardNumberState.html index 9387dde2f..69a284b25 100644 --- a/docs/com/verygoodsecurity/vgscollect/core/model/state/FieldState.CardNumberState.html +++ b/docs/com/verygoodsecurity/vgscollect/core/model/state/FieldState.CardNumberState.html @@ -2,10 +2,10 @@ - + FieldState.CardNumberState - + diff --git a/docs/com/verygoodsecurity/vgscollect/core/model/state/FieldState.InfoState.html b/docs/com/verygoodsecurity/vgscollect/core/model/state/FieldState.InfoState.html index cca867913..d3082ffaf 100644 --- a/docs/com/verygoodsecurity/vgscollect/core/model/state/FieldState.InfoState.html +++ b/docs/com/verygoodsecurity/vgscollect/core/model/state/FieldState.InfoState.html @@ -2,10 +2,10 @@ - + FieldState.InfoState - + diff --git a/docs/com/verygoodsecurity/vgscollect/core/model/state/FieldState.html b/docs/com/verygoodsecurity/vgscollect/core/model/state/FieldState.html index 80d2eb265..8e924f3a7 100644 --- a/docs/com/verygoodsecurity/vgscollect/core/model/state/FieldState.html +++ b/docs/com/verygoodsecurity/vgscollect/core/model/state/FieldState.html @@ -2,10 +2,10 @@ - + FieldState - + diff --git a/docs/com/verygoodsecurity/vgscollect/core/model/state/FileState.html b/docs/com/verygoodsecurity/vgscollect/core/model/state/FileState.html index bb17e5ec0..4b6daacd3 100644 --- a/docs/com/verygoodsecurity/vgscollect/core/model/state/FileState.html +++ b/docs/com/verygoodsecurity/vgscollect/core/model/state/FileState.html @@ -2,10 +2,10 @@ - + FileState - + diff --git a/docs/com/verygoodsecurity/vgscollect/core/model/state/VGSFieldStateKt.html b/docs/com/verygoodsecurity/vgscollect/core/model/state/VGSFieldStateKt.html index 9f139c6c7..be12f1060 100644 --- a/docs/com/verygoodsecurity/vgscollect/core/model/state/VGSFieldStateKt.html +++ b/docs/com/verygoodsecurity/vgscollect/core/model/state/VGSFieldStateKt.html @@ -2,10 +2,10 @@ - + VGSFieldStateKt - + diff --git a/docs/com/verygoodsecurity/vgscollect/core/model/state/package-frame.html b/docs/com/verygoodsecurity/vgscollect/core/model/state/package-frame.html index e3f2c7374..4be3074e0 100644 --- a/docs/com/verygoodsecurity/vgscollect/core/model/state/package-frame.html +++ b/docs/com/verygoodsecurity/vgscollect/core/model/state/package-frame.html @@ -2,10 +2,10 @@ - + com.verygoodsecurity.vgscollect.core.model.state - + diff --git a/docs/com/verygoodsecurity/vgscollect/core/model/state/package-summary.html b/docs/com/verygoodsecurity/vgscollect/core/model/state/package-summary.html index 4d150a180..be304585a 100644 --- a/docs/com/verygoodsecurity/vgscollect/core/model/state/package-summary.html +++ b/docs/com/verygoodsecurity/vgscollect/core/model/state/package-summary.html @@ -2,10 +2,10 @@ - + com.verygoodsecurity.vgscollect.core.model.state - + diff --git a/docs/com/verygoodsecurity/vgscollect/core/model/state/package-tree.html b/docs/com/verygoodsecurity/vgscollect/core/model/state/package-tree.html index 4dae8126f..8f7fca293 100644 --- a/docs/com/verygoodsecurity/vgscollect/core/model/state/package-tree.html +++ b/docs/com/verygoodsecurity/vgscollect/core/model/state/package-tree.html @@ -2,10 +2,10 @@ - + com.verygoodsecurity.vgscollect.core.model.state Class Hierarchy - + diff --git a/docs/com/verygoodsecurity/vgscollect/core/package-frame.html b/docs/com/verygoodsecurity/vgscollect/core/package-frame.html index 6bc7ba27c..582c0c534 100644 --- a/docs/com/verygoodsecurity/vgscollect/core/package-frame.html +++ b/docs/com/verygoodsecurity/vgscollect/core/package-frame.html @@ -2,10 +2,10 @@ - + com.verygoodsecurity.vgscollect.core - + diff --git a/docs/com/verygoodsecurity/vgscollect/core/package-summary.html b/docs/com/verygoodsecurity/vgscollect/core/package-summary.html index 73aefe0e0..618751653 100644 --- a/docs/com/verygoodsecurity/vgscollect/core/package-summary.html +++ b/docs/com/verygoodsecurity/vgscollect/core/package-summary.html @@ -2,10 +2,10 @@ - + com.verygoodsecurity.vgscollect.core - + diff --git a/docs/com/verygoodsecurity/vgscollect/core/package-tree.html b/docs/com/verygoodsecurity/vgscollect/core/package-tree.html index 31166f5bb..1283a22da 100644 --- a/docs/com/verygoodsecurity/vgscollect/core/package-tree.html +++ b/docs/com/verygoodsecurity/vgscollect/core/package-tree.html @@ -2,10 +2,10 @@ - + com.verygoodsecurity.vgscollect.core Class Hierarchy - + diff --git a/docs/com/verygoodsecurity/vgscollect/core/storage/OnFieldStateChangeListener.html b/docs/com/verygoodsecurity/vgscollect/core/storage/OnFieldStateChangeListener.html index 059f7104d..eddac7793 100644 --- a/docs/com/verygoodsecurity/vgscollect/core/storage/OnFieldStateChangeListener.html +++ b/docs/com/verygoodsecurity/vgscollect/core/storage/OnFieldStateChangeListener.html @@ -2,10 +2,10 @@ - + OnFieldStateChangeListener - + diff --git a/docs/com/verygoodsecurity/vgscollect/core/storage/content/file/VGSFileProvider.html b/docs/com/verygoodsecurity/vgscollect/core/storage/content/file/VGSFileProvider.html index 44ec06c60..a5230290f 100644 --- a/docs/com/verygoodsecurity/vgscollect/core/storage/content/file/VGSFileProvider.html +++ b/docs/com/verygoodsecurity/vgscollect/core/storage/content/file/VGSFileProvider.html @@ -2,10 +2,10 @@ - + VGSFileProvider - + diff --git a/docs/com/verygoodsecurity/vgscollect/core/storage/content/file/package-frame.html b/docs/com/verygoodsecurity/vgscollect/core/storage/content/file/package-frame.html index 4e19bc77c..d1ff8836e 100644 --- a/docs/com/verygoodsecurity/vgscollect/core/storage/content/file/package-frame.html +++ b/docs/com/verygoodsecurity/vgscollect/core/storage/content/file/package-frame.html @@ -2,10 +2,10 @@ - + com.verygoodsecurity.vgscollect.core.storage.content.file - + diff --git a/docs/com/verygoodsecurity/vgscollect/core/storage/content/file/package-summary.html b/docs/com/verygoodsecurity/vgscollect/core/storage/content/file/package-summary.html index 3a75e2fea..e03a783d7 100644 --- a/docs/com/verygoodsecurity/vgscollect/core/storage/content/file/package-summary.html +++ b/docs/com/verygoodsecurity/vgscollect/core/storage/content/file/package-summary.html @@ -2,10 +2,10 @@ - + com.verygoodsecurity.vgscollect.core.storage.content.file - + diff --git a/docs/com/verygoodsecurity/vgscollect/core/storage/content/file/package-tree.html b/docs/com/verygoodsecurity/vgscollect/core/storage/content/file/package-tree.html index f23223932..4899f8cf3 100644 --- a/docs/com/verygoodsecurity/vgscollect/core/storage/content/file/package-tree.html +++ b/docs/com/verygoodsecurity/vgscollect/core/storage/content/file/package-tree.html @@ -2,10 +2,10 @@ - + com.verygoodsecurity.vgscollect.core.storage.content.file Class Hierarchy - + diff --git a/docs/com/verygoodsecurity/vgscollect/core/storage/package-frame.html b/docs/com/verygoodsecurity/vgscollect/core/storage/package-frame.html index 104c9072c..97c4f121c 100644 --- a/docs/com/verygoodsecurity/vgscollect/core/storage/package-frame.html +++ b/docs/com/verygoodsecurity/vgscollect/core/storage/package-frame.html @@ -2,10 +2,10 @@ - + com.verygoodsecurity.vgscollect.core.storage - + diff --git a/docs/com/verygoodsecurity/vgscollect/core/storage/package-summary.html b/docs/com/verygoodsecurity/vgscollect/core/storage/package-summary.html index b71008511..931cbb1d0 100644 --- a/docs/com/verygoodsecurity/vgscollect/core/storage/package-summary.html +++ b/docs/com/verygoodsecurity/vgscollect/core/storage/package-summary.html @@ -2,10 +2,10 @@ - + com.verygoodsecurity.vgscollect.core.storage - + diff --git a/docs/com/verygoodsecurity/vgscollect/core/storage/package-tree.html b/docs/com/verygoodsecurity/vgscollect/core/storage/package-tree.html index 217f6ad29..11e5f0ba5 100644 --- a/docs/com/verygoodsecurity/vgscollect/core/storage/package-tree.html +++ b/docs/com/verygoodsecurity/vgscollect/core/storage/package-tree.html @@ -2,10 +2,10 @@ - + com.verygoodsecurity.vgscollect.core.storage Class Hierarchy - + diff --git a/docs/com/verygoodsecurity/vgscollect/util/BooleanExtensionKt.html b/docs/com/verygoodsecurity/vgscollect/util/BooleanExtensionKt.html index 98aa6f463..a9e8bf69c 100644 --- a/docs/com/verygoodsecurity/vgscollect/util/BooleanExtensionKt.html +++ b/docs/com/verygoodsecurity/vgscollect/util/BooleanExtensionKt.html @@ -2,10 +2,10 @@ - + BooleanExtensionKt - + diff --git a/docs/com/verygoodsecurity/vgscollect/util/MapToJsonExtensionKt.html b/docs/com/verygoodsecurity/vgscollect/util/MapToJsonExtensionKt.html index 294e309d9..6e7bde7cf 100644 --- a/docs/com/verygoodsecurity/vgscollect/util/MapToJsonExtensionKt.html +++ b/docs/com/verygoodsecurity/vgscollect/util/MapToJsonExtensionKt.html @@ -2,10 +2,10 @@ - + MapToJsonExtensionKt - + diff --git a/docs/com/verygoodsecurity/vgscollect/util/MutableCollectionExtensionKt.html b/docs/com/verygoodsecurity/vgscollect/util/MutableCollectionExtensionKt.html index 049e87818..7c2d81ee1 100644 --- a/docs/com/verygoodsecurity/vgscollect/util/MutableCollectionExtensionKt.html +++ b/docs/com/verygoodsecurity/vgscollect/util/MutableCollectionExtensionKt.html @@ -2,10 +2,10 @@ - + MutableCollectionExtensionKt - + diff --git a/docs/com/verygoodsecurity/vgscollect/util/MutableMapExtensionKt.html b/docs/com/verygoodsecurity/vgscollect/util/MutableMapExtensionKt.html index c3d3b4bd8..9bd3899dd 100644 --- a/docs/com/verygoodsecurity/vgscollect/util/MutableMapExtensionKt.html +++ b/docs/com/verygoodsecurity/vgscollect/util/MutableMapExtensionKt.html @@ -2,10 +2,10 @@ - + MutableMapExtensionKt - + diff --git a/docs/com/verygoodsecurity/vgscollect/util/NumberExtensionKt.html b/docs/com/verygoodsecurity/vgscollect/util/NumberExtensionKt.html index 293934816..c0bd9b585 100644 --- a/docs/com/verygoodsecurity/vgscollect/util/NumberExtensionKt.html +++ b/docs/com/verygoodsecurity/vgscollect/util/NumberExtensionKt.html @@ -2,10 +2,10 @@ - + NumberExtensionKt - + diff --git a/docs/com/verygoodsecurity/vgscollect/util/UriExtensionKt.html b/docs/com/verygoodsecurity/vgscollect/util/UriExtensionKt.html index 0473fdeaf..af617ae89 100644 --- a/docs/com/verygoodsecurity/vgscollect/util/UriExtensionKt.html +++ b/docs/com/verygoodsecurity/vgscollect/util/UriExtensionKt.html @@ -2,10 +2,10 @@ - + UriExtensionKt - + diff --git a/docs/com/verygoodsecurity/vgscollect/util/package-frame.html b/docs/com/verygoodsecurity/vgscollect/util/package-frame.html index a089c4138..ff63f4012 100644 --- a/docs/com/verygoodsecurity/vgscollect/util/package-frame.html +++ b/docs/com/verygoodsecurity/vgscollect/util/package-frame.html @@ -2,10 +2,10 @@ - + com.verygoodsecurity.vgscollect.util - + diff --git a/docs/com/verygoodsecurity/vgscollect/util/package-summary.html b/docs/com/verygoodsecurity/vgscollect/util/package-summary.html index 0373e47da..95c8b4e2d 100644 --- a/docs/com/verygoodsecurity/vgscollect/util/package-summary.html +++ b/docs/com/verygoodsecurity/vgscollect/util/package-summary.html @@ -2,10 +2,10 @@ - + com.verygoodsecurity.vgscollect.util - + diff --git a/docs/com/verygoodsecurity/vgscollect/util/package-tree.html b/docs/com/verygoodsecurity/vgscollect/util/package-tree.html index c18a2550f..3faefb485 100644 --- a/docs/com/verygoodsecurity/vgscollect/util/package-tree.html +++ b/docs/com/verygoodsecurity/vgscollect/util/package-tree.html @@ -2,10 +2,10 @@ - + com.verygoodsecurity.vgscollect.util Class Hierarchy - + @@ -81,9 +81,9 @@

    Class Hierarchy

    diff --git a/docs/com/verygoodsecurity/vgscollect/view/InputFieldView.OnEditorActionListener.html b/docs/com/verygoodsecurity/vgscollect/view/InputFieldView.OnEditorActionListener.html index 805f80a34..f2294084e 100644 --- a/docs/com/verygoodsecurity/vgscollect/view/InputFieldView.OnEditorActionListener.html +++ b/docs/com/verygoodsecurity/vgscollect/view/InputFieldView.OnEditorActionListener.html @@ -2,10 +2,10 @@ - + InputFieldView.OnEditorActionListener - + diff --git a/docs/com/verygoodsecurity/vgscollect/view/InputFieldView.SavedState.html b/docs/com/verygoodsecurity/vgscollect/view/InputFieldView.SavedState.html index b88a3a404..a09349cbc 100644 --- a/docs/com/verygoodsecurity/vgscollect/view/InputFieldView.SavedState.html +++ b/docs/com/verygoodsecurity/vgscollect/view/InputFieldView.SavedState.html @@ -2,10 +2,10 @@ - + InputFieldView.SavedState - + diff --git a/docs/com/verygoodsecurity/vgscollect/view/InputFieldView.html b/docs/com/verygoodsecurity/vgscollect/view/InputFieldView.html index 2afd8136a..b0adc4992 100644 --- a/docs/com/verygoodsecurity/vgscollect/view/InputFieldView.html +++ b/docs/com/verygoodsecurity/vgscollect/view/InputFieldView.html @@ -2,10 +2,10 @@ - + InputFieldView - + @@ -83,7 +83,12 @@ + + + + + @@ -1435,18 +1440,68 @@

    setCardBrandMaskAdapter

  • getCardNumberState

    @Nullable
    -public com.verygoodsecurity.vgscollect.core.model.state.FieldState.CardNumberState getCardNumberState()
    +protected com.verygoodsecurity.vgscollect.core.model.state.FieldState.CardNumberState getCardNumberState() +
  • + + + + + + + + + + + + + + + + + - diff --git a/docs/com/verygoodsecurity/vgscollect/view/SavedState.Companion.html b/docs/com/verygoodsecurity/vgscollect/view/SavedState.Companion.html index b92206128..156b25739 100644 --- a/docs/com/verygoodsecurity/vgscollect/view/SavedState.Companion.html +++ b/docs/com/verygoodsecurity/vgscollect/view/SavedState.Companion.html @@ -2,10 +2,10 @@ - + SavedState.Companion - + diff --git a/docs/com/verygoodsecurity/vgscollect/view/card/CardType.html b/docs/com/verygoodsecurity/vgscollect/view/card/CardType.html index 2fbfb4a71..914870584 100644 --- a/docs/com/verygoodsecurity/vgscollect/view/card/CardType.html +++ b/docs/com/verygoodsecurity/vgscollect/view/card/CardType.html @@ -2,14 +2,15 @@ - + CardType - + + @@ -49,8 +50,8 @@ @@ -211,13 +235,13 @@

    CardVerificationCodeEditText

  • Nested | 
  • Field | 
  • Constr | 
  • -
  • Method
  • +
  • Method
  • diff --git a/docs/com/verygoodsecurity/vgscollect/widget/ExpirationDateEditText.OnDatePickerVisibilityChangeListener.html b/docs/com/verygoodsecurity/vgscollect/widget/ExpirationDateEditText.OnDatePickerVisibilityChangeListener.html index 8c4825fdf..32d3a82ec 100644 --- a/docs/com/verygoodsecurity/vgscollect/widget/ExpirationDateEditText.OnDatePickerVisibilityChangeListener.html +++ b/docs/com/verygoodsecurity/vgscollect/widget/ExpirationDateEditText.OnDatePickerVisibilityChangeListener.html @@ -2,10 +2,10 @@ - + ExpirationDateEditText.OnDatePickerVisibilityChangeListener - + diff --git a/docs/com/verygoodsecurity/vgscollect/widget/ExpirationDateEditText.html b/docs/com/verygoodsecurity/vgscollect/widget/ExpirationDateEditText.html index ccd5881aa..caec90593 100644 --- a/docs/com/verygoodsecurity/vgscollect/widget/ExpirationDateEditText.html +++ b/docs/com/verygoodsecurity/vgscollect/widget/ExpirationDateEditText.html @@ -2,10 +2,10 @@ - + ExpirationDateEditText - + @@ -14,6 +14,7 @@ + @@ -271,7 +272,7 @@

    showDatePickerDialog

    - diff --git a/docs/com/verygoodsecurity/vgscollect/widget/PersonNameEditText.html b/docs/com/verygoodsecurity/vgscollect/widget/PersonNameEditText.html index ea2ea90c4..77bccef46 100644 --- a/docs/com/verygoodsecurity/vgscollect/widget/PersonNameEditText.html +++ b/docs/com/verygoodsecurity/vgscollect/widget/PersonNameEditText.html @@ -2,11 +2,13 @@ - + PersonNameEditText - + + + @@ -72,13 +74,13 @@
  • Nested | 
  • Field | 
  • Constr | 
  • -
  • Method
  • +
  • Method
  • @@ -158,6 +160,40 @@

    PersonNameEditText

    + +
    @@ -211,13 +247,13 @@

    PersonNameEditText

  • Nested | 
  • Field | 
  • Constr | 
  • -
  • Method
  • +
  • Method
  • diff --git a/docs/com/verygoodsecurity/vgscollect/widget/VGSCardNumberEditText.html b/docs/com/verygoodsecurity/vgscollect/widget/VGSCardNumberEditText.html index 2e16765aa..e739db690 100644 --- a/docs/com/verygoodsecurity/vgscollect/widget/VGSCardNumberEditText.html +++ b/docs/com/verygoodsecurity/vgscollect/widget/VGSCardNumberEditText.html @@ -2,10 +2,10 @@ - + VGSCardNumberEditText - + diff --git a/docs/com/verygoodsecurity/vgscollect/widget/VGSEditText.html b/docs/com/verygoodsecurity/vgscollect/widget/VGSEditText.html index a5fa21545..ff3acaa36 100644 --- a/docs/com/verygoodsecurity/vgscollect/widget/VGSEditText.html +++ b/docs/com/verygoodsecurity/vgscollect/widget/VGSEditText.html @@ -2,12 +2,13 @@ - + VGSEditText - + + @@ -172,7 +173,7 @@

    Method Detail

    - diff --git a/docs/com/verygoodsecurity/vgscollect/widget/VGSTextInputLayout.Companion.html b/docs/com/verygoodsecurity/vgscollect/widget/VGSTextInputLayout.Companion.html index 864bea428..d22b3c5f6 100644 --- a/docs/com/verygoodsecurity/vgscollect/widget/VGSTextInputLayout.Companion.html +++ b/docs/com/verygoodsecurity/vgscollect/widget/VGSTextInputLayout.Companion.html @@ -2,10 +2,10 @@ - + VGSTextInputLayout.Companion - + diff --git a/docs/com/verygoodsecurity/vgscollect/widget/VGSTextInputLayout.html b/docs/com/verygoodsecurity/vgscollect/widget/VGSTextInputLayout.html index 093b49abd..d990a92e2 100644 --- a/docs/com/verygoodsecurity/vgscollect/widget/VGSTextInputLayout.html +++ b/docs/com/verygoodsecurity/vgscollect/widget/VGSTextInputLayout.html @@ -2,10 +2,10 @@ - + VGSTextInputLayout - + diff --git a/docs/com/verygoodsecurity/vgscollect/widget/package-frame.html b/docs/com/verygoodsecurity/vgscollect/widget/package-frame.html index 09e8eca86..043d27206 100644 --- a/docs/com/verygoodsecurity/vgscollect/widget/package-frame.html +++ b/docs/com/verygoodsecurity/vgscollect/widget/package-frame.html @@ -2,10 +2,10 @@ - + com.verygoodsecurity.vgscollect.widget - + diff --git a/docs/com/verygoodsecurity/vgscollect/widget/package-summary.html b/docs/com/verygoodsecurity/vgscollect/widget/package-summary.html index d12824956..1500d9083 100644 --- a/docs/com/verygoodsecurity/vgscollect/widget/package-summary.html +++ b/docs/com/verygoodsecurity/vgscollect/widget/package-summary.html @@ -2,10 +2,10 @@ - + com.verygoodsecurity.vgscollect.widget - + diff --git a/docs/com/verygoodsecurity/vgscollect/widget/package-tree.html b/docs/com/verygoodsecurity/vgscollect/widget/package-tree.html index b36267003..27e981341 100644 --- a/docs/com/verygoodsecurity/vgscollect/widget/package-tree.html +++ b/docs/com/verygoodsecurity/vgscollect/widget/package-tree.html @@ -2,10 +2,10 @@ - + com.verygoodsecurity.vgscollect.widget Class Hierarchy - + diff --git a/docs/constant-values.html b/docs/constant-values.html index 2378e204a..32f9ad654 100644 --- a/docs/constant-values.html +++ b/docs/constant-values.html @@ -2,10 +2,10 @@ - + Constant Field Values - + diff --git a/docs/deprecated-list.html b/docs/deprecated-list.html index 72e549645..15d8381de 100644 --- a/docs/deprecated-list.html +++ b/docs/deprecated-list.html @@ -2,10 +2,10 @@ - + Deprecated List - + diff --git a/docs/help-doc.html b/docs/help-doc.html index 9f5403f5c..7274af6e1 100644 --- a/docs/help-doc.html +++ b/docs/help-doc.html @@ -2,10 +2,10 @@ - + API Help - + diff --git a/docs/index-all.html b/docs/index-all.html index 0f8baa926..43c12f38c 100644 --- a/docs/index-all.html +++ b/docs/index-all.html @@ -2,10 +2,10 @@ - + Index - + @@ -90,6 +90,12 @@

    A

    Adds a listener to the list of those whose methods are called whenever the VGSCollect receive response from Server.
    +
    addRule(validator) - Method in class com.verygoodsecurity.vgscollect.view.card.validation.CompositeValidator
    +
     
    +
    addRule(rule) - Method in class com.verygoodsecurity.vgscollect.widget.PersonNameEditText
    +
    +
    Adds a behaviour rule for the field.
    +
    addView(child) - Method in class com.verygoodsecurity.vgscollect.view.InputFieldView
     
    addView(child, params) - Method in class com.verygoodsecurity.vgscollect.view.InputFieldView
    @@ -120,6 +126,8 @@

    A

    Deprecated. 
    +
    applyValidationRule(rule) - Method in class com.verygoodsecurity.vgscollect.view.InputFieldView
    +
     
    asyncSubmit(path, method) - Method in class com.verygoodsecurity.vgscollect.core.VGSCollect
    This method executes and send data on VGS Server.
    @@ -165,10 +173,20 @@

    B

     
    BooleanExtensionKt() - Constructor for class com.verygoodsecurity.vgscollect.util.BooleanExtensionKt
     
    +
    BrandParams - Class in com.verygoodsecurity.vgscollect.view.card
    +
     
    +
    BrandParams(mask, algorithm, rangeNumber, rangeCVV) - Constructor for class com.verygoodsecurity.vgscollect.view.card.BrandParams
    +
     
    +
    BrandParams() - Constructor for class com.verygoodsecurity.vgscollect.view.card.BrandParams
    +
     
    build() - Method in class com.verygoodsecurity.vgscollect.core.model.network.VGSRequest.VGSRequestBuilder
    Creates a VGSRequest with the arguments supplied to this.
    +
    build() - Method in class com.verygoodsecurity.vgscollect.view.card.validation.payment.PersonNameRule.ValidationBuilder
    +
    +
    Creates a rule.
    +
    @@ -226,11 +244,15 @@

    C

     
    CardVerificationCodeEditText(context) - Constructor for class com.verygoodsecurity.vgscollect.widget.CardVerificationCodeEditText
     
    +
    ChecksumAlgorithm - Enum in com.verygoodsecurity.vgscollect.view.card
    +
     
    clearFocus() - Method in class com.verygoodsecurity.vgscollect.view.InputFieldView
    Called when this view wants to give up focus. If focus is cleared onFocusChanged(boolean, int, android.graphics.Rect) is called.
    +
    clearRules() - Method in class com.verygoodsecurity.vgscollect.view.card.validation.CompositeValidator
    +
     
    com.verygoodsecurity.vgscollect.app - package com.verygoodsecurity.vgscollect.app
     
    com.verygoodsecurity.vgscollect.core - package com.verygoodsecurity.vgscollect.core
    @@ -253,6 +275,10 @@

    C

     
    com.verygoodsecurity.vgscollect.view.card.icon - package com.verygoodsecurity.vgscollect.view.card.icon
     
    +
    com.verygoodsecurity.vgscollect.view.card.validation - package com.verygoodsecurity.vgscollect.view.card.validation
    +
     
    +
    com.verygoodsecurity.vgscollect.view.card.validation.payment - package com.verygoodsecurity.vgscollect.view.card.validation.payment
    +
     
    com.verygoodsecurity.vgscollect.view.date - package com.verygoodsecurity.vgscollect.view.date
     
    com.verygoodsecurity.vgscollect.view.material - package com.verygoodsecurity.vgscollect.view.material
    @@ -275,6 +301,8 @@

    C

    The size of a file which it takes up on your device
    +
    component1() - Method in class com.verygoodsecurity.vgscollect.view.card.BrandParams
    +
     
    component1() - Method in class com.verygoodsecurity.vgscollect.view.card.CustomCardBrand
    The regex rules for detection card brand.
    @@ -287,6 +315,8 @@

    C

    The name of the file
    +
    component2() - Method in class com.verygoodsecurity.vgscollect.view.card.BrandParams
    +
     
    component2() - Method in class com.verygoodsecurity.vgscollect.view.card.CustomCardBrand
    The name of current card brand.
    @@ -299,6 +329,8 @@

    C

    The MIME type ot the file
    +
    component3() - Method in class com.verygoodsecurity.vgscollect.view.card.BrandParams
    +
     
    component3() - Method in class com.verygoodsecurity.vgscollect.view.card.CustomCardBrand
    The drawable resource represents credit card logo.
    @@ -311,6 +343,8 @@

    C

    The text to be used for data transfer to VGS proxy.
    +
    component4() - Method in class com.verygoodsecurity.vgscollect.view.card.BrandParams
    +
     
    component4() - Method in class com.verygoodsecurity.vgscollect.view.card.CustomCardBrand
     
    component5() - Method in class com.verygoodsecurity.vgscollect.core.model.network.VGSRequest
    @@ -321,6 +355,10 @@

    C

    contains true if need to skip files.
    +
    CompositeValidator - Class in com.verygoodsecurity.vgscollect.view.card.validation
    +
     
    +
    CompositeValidator() - Constructor for class com.verygoodsecurity.vgscollect.view.card.validation.CompositeValidator
    +
     
    copy(method, path, customHeader, customData, fieldsIgnore, fileIgnore) - Method in class com.verygoodsecurity.vgscollect.core.model.network.VGSRequest
    Class to collect data before submit.
    @@ -329,11 +367,17 @@

    C

    The base class definition for a file presentation state.
    -
    copy(regex, cardBrandName, drawableResId, mask) - Method in class com.verygoodsecurity.vgscollect.view.card.CustomCardBrand
    +
    copy(mask, algorithm, rangeNumber, rangeCVV) - Method in class com.verygoodsecurity.vgscollect.view.card.BrandParams
    +
     
    +
    copy(regex, cardBrandName, drawableResId, params) - Method in class com.verygoodsecurity.vgscollect.view.card.CustomCardBrand
    The data class definition for represent custom card brand. It may be useful to add new brands in addition to already defined brands or override existing ones.
    +
    copy(regex, length) - Method in class com.verygoodsecurity.vgscollect.view.card.validation.payment.PersonNameRule
    +
    +
    This rule provides a simplified mechanism to improve default behavior of field which include person name.
    +
    CREATOR - Static variable in class com.verygoodsecurity.vgscollect.view.InputFieldView.SavedState
     
    CustomCardBrand - Class in com.verygoodsecurity.vgscollect.view.card
    @@ -341,7 +385,7 @@

    C

    The data class definition for represent custom card brand. It may be useful to add new brands in addition to already defined brands or override existing ones.
    -
    CustomCardBrand(regex, cardBrandName, drawableResId, mask) - Constructor for class com.verygoodsecurity.vgscollect.view.card.CustomCardBrand
    +
    CustomCardBrand(regex, cardBrandName, drawableResId, params) - Constructor for class com.verygoodsecurity.vgscollect.view.card.CustomCardBrand
    The data class definition for represent custom card brand. It may be useful to add new brands in addition to already defined brands or override existing ones.
    @@ -408,11 +452,15 @@

    E

    equals(other) - Method in class com.verygoodsecurity.vgscollect.core.model.state.FileState
     
    +
    equals(other) - Method in class com.verygoodsecurity.vgscollect.view.card.BrandParams
    +
     
    equals(p) - Method in class com.verygoodsecurity.vgscollect.view.card.CustomCardBrand
    The data class definition for represent custom card brand. It may be useful to add new brands in addition to already defined brands or override existing ones.
    +
    equals(other) - Method in class com.verygoodsecurity.vgscollect.view.card.validation.payment.PersonNameRule
    +
     
    ErrorResponse(localizeMessage, errorCode) - Constructor for class com.verygoodsecurity.vgscollect.core.model.network.VGSResponse.ErrorResponse
    The class definition for an error response state.
    @@ -498,6 +546,10 @@

    F

    G

    +
    getAlgorithm() - Method in class com.verygoodsecurity.vgscollect.view.card.BrandParams
    +
     
    +
    getAlgorithm() - Method in enum com.verygoodsecurity.vgscollect.view.card.CardType
    +
     
    getAllStates() - Method in class com.verygoodsecurity.vgscollect.core.VGSCollect
    Returns the states of all fields bound before to VGSCollect.
    @@ -518,6 +570,8 @@

    G

    The name of current card brand.
    +
    getCardHolderName() - Method in class com.verygoodsecurity.vgscollect.view.InputFieldView
    +
     
    getCardIconGravity() - Method in class com.verygoodsecurity.vgscollect.view.InputFieldView
     
    getCardNumberState() - Method in class com.verygoodsecurity.vgscollect.view.InputFieldView
    @@ -544,6 +598,8 @@

    G

    The headers to save for request.
    +
    getCVCState() - Method in class com.verygoodsecurity.vgscollect.view.InputFieldView
    +
     
    getDateMode() - Method in class com.verygoodsecurity.vgscollect.view.InputFieldView
     
    getDatePattern() - Method in class com.verygoodsecurity.vgscollect.view.InputFieldView
    @@ -587,6 +643,8 @@

    G

    The response code from server.
    +
    getExpirationDate() - Method in class com.verygoodsecurity.vgscollect.view.InputFieldView
    +
     
    getFieldName() - Method in class com.verygoodsecurity.vgscollect.core.model.state.FieldState
    The text to be used for data transfer to VGS proxy. @@ -651,6 +709,8 @@

    G

    Get the type of the Input Method Editor (IME).
    +
    getInfoState() - Method in class com.verygoodsecurity.vgscollect.view.InputFieldView
    +
     
    getInputType() - Method in class com.verygoodsecurity.vgscollect.view.InputFieldView
    Get the type of the editable content.
    @@ -663,9 +723,9 @@

    G

    The message of the error.
    -
    getMask() - Method in enum com.verygoodsecurity.vgscollect.view.card.CardType
    +
    getMask() - Method in class com.verygoodsecurity.vgscollect.view.card.BrandParams
     
    -
    getMask() - Method in class com.verygoodsecurity.vgscollect.view.card.CustomCardBrand
    +
    getMask() - Method in enum com.verygoodsecurity.vgscollect.view.card.CardType
     
    getMask(cardType, name, bin, mask) - Method in class com.verygoodsecurity.vgscollect.view.card.formatter.CardMaskAdapter
    @@ -674,6 +734,8 @@

    G

    getMask() - Method in class com.verygoodsecurity.vgscollect.view.card.formatter.CardNumberFormatter
     
    +
    getMask() - Method in interface com.verygoodsecurity.vgscollect.view.card.formatter.Formatter
    +
     
    getMaskLength() - Method in class com.verygoodsecurity.vgscollect.view.card.formatter.CardNumberFormatter
     
    getMessageResId() - Method in enum com.verygoodsecurity.vgscollect.core.model.network.VGSError
    @@ -759,14 +821,20 @@

    G

    Returns the top padding of this view.
    +
    getParams() - Method in class com.verygoodsecurity.vgscollect.view.card.CustomCardBrand
    +
     
    getPath() - Method in class com.verygoodsecurity.vgscollect.core.model.network.VGSRequest
    path for a request
    +
    getRangeCVV() - Method in class com.verygoodsecurity.vgscollect.view.card.BrandParams
    +
     
    getRangeCVV() - Method in enum com.verygoodsecurity.vgscollect.view.card.CardType
    The length of the card
    +
    getRangeNumber() - Method in class com.verygoodsecurity.vgscollect.view.card.BrandParams
    +
     
    getRangeNumber() - Method in enum com.verygoodsecurity.vgscollect.view.card.CardType
    The length of the card
    @@ -803,10 +871,26 @@

    G

    The size of a file which it takes up on your device
    +
    getState() - Method in class com.verygoodsecurity.vgscollect.widget.CardVerificationCodeEditText
    +
    +
    It return current state of the field.
    +
    +
    getState() - Method in class com.verygoodsecurity.vgscollect.widget.ExpirationDateEditText
    +
    +
    It return current state of the field.
    +
    +
    getState() - Method in class com.verygoodsecurity.vgscollect.widget.PersonNameEditText
    +
    +
    It return current state of the field.
    +
    getState() - Method in class com.verygoodsecurity.vgscollect.widget.VGSCardNumberEditText
    It return current state of the field.
    +
    getState() - Method in class com.verygoodsecurity.vgscollect.widget.VGSEditText
    +
    +
    It return current state of the field.
    +
    getSuccessCode() - Method in class com.verygoodsecurity.vgscollect.core.model.network.VGSResponse.SuccessResponse
    The response code from server.
    @@ -835,11 +919,15 @@

    H

    hashCode() - Method in class com.verygoodsecurity.vgscollect.core.model.state.FileState
     
    +
    hashCode() - Method in class com.verygoodsecurity.vgscollect.view.card.BrandParams
    +
     
    hashCode() - Method in class com.verygoodsecurity.vgscollect.view.card.CustomCardBrand
    The data class definition for represent custom card brand. It may be useful to add new brands in addition to already defined brands or override existing ones.
    +
    hashCode() - Method in class com.verygoodsecurity.vgscollect.view.card.validation.payment.PersonNameRule
    +
     
    HTTPMethod - Enum in com.verygoodsecurity.vgscollect.core
    The set of common methods for HTTP.
    @@ -902,6 +990,8 @@

    I

    The state is true if the content inside the input field is valid.
    +
    isValid(content) - Method in class com.verygoodsecurity.vgscollect.view.card.validation.CompositeValidator
    +
     
    @@ -1022,6 +1112,18 @@

    P

     
    PersonNameEditText(context) - Constructor for class com.verygoodsecurity.vgscollect.widget.PersonNameEditText
     
    +
    PersonNameRule - Class in com.verygoodsecurity.vgscollect.view.card.validation.payment
    +
    +
    This rule provides a simplified mechanism to improve default behavior of field which include person name.
    +
    +
    PersonNameRule(regex, length) - Constructor for class com.verygoodsecurity.vgscollect.view.card.validation.payment.PersonNameRule
    +
    +
    This rule provides a simplified mechanism to improve default behavior of field which include person name.
    +
    +
    PersonNameRule.ValidationBuilder - Class in com.verygoodsecurity.vgscollect.view.card.validation.payment
    +
    +
    This class provides an API for set up rules for validation person name.
    +
    processItem(rootMap, rootValue, keyList) - Static method in class com.verygoodsecurity.vgscollect.util.MutableMapExtensionKt
     
    processItemAsMap(rootMap, rootValue, keyList) - Static method in class com.verygoodsecurity.vgscollect.util.MutableMapExtensionKt
    @@ -1064,6 +1166,14 @@

    S

     
    SavedState.Companion - Class in com.verygoodsecurity.vgscollect.view
     
    +
    setAllowableMaxLength(length) - Method in class com.verygoodsecurity.vgscollect.view.card.validation.payment.PersonNameRule.ValidationBuilder
    +
    +
    Configure maximum length of the name which will support.
    +
    +
    setAllowableMinLength(length) - Method in class com.verygoodsecurity.vgscollect.view.card.validation.payment.PersonNameRule.ValidationBuilder
    +
    +
    Configure minimum length of the name which will support.
    +
    setAutofillHints(autofillHints) - Method in class com.verygoodsecurity.vgscollect.view.InputFieldView
     
    setAutofillId(id) - Method in class com.verygoodsecurity.vgscollect.view.InputFieldView
    @@ -1440,6 +1550,10 @@

    S

    Set the path using for a request to the server.
    +
    setRegex(regex) - Method in class com.verygoodsecurity.vgscollect.view.card.validation.payment.PersonNameRule.ValidationBuilder
    +
    +
    Configure Regex for validation input.
    +
    setRequired$module(p) - Method in class com.verygoodsecurity.vgscollect.core.model.state.FieldState
    The state is true if the input field may be skipped for submitting.
    @@ -1591,11 +1705,17 @@

    T

    The base class definition for a file presentation state.
    +
    toString() - Method in class com.verygoodsecurity.vgscollect.view.card.BrandParams
    +
     
    toString() - Method in class com.verygoodsecurity.vgscollect.view.card.CustomCardBrand
    The data class definition for represent custom card brand. It may be useful to add new brands in addition to already defined brands or override existing ones.
    +
    toString() - Method in class com.verygoodsecurity.vgscollect.view.card.validation.payment.PersonNameRule
    +
    +
    This rule provides a simplified mechanism to improve default behavior of field which include person name.
    +
    @@ -1612,6 +1732,10 @@

    U

    V

    +
    ValidationBuilder() - Constructor for class com.verygoodsecurity.vgscollect.view.card.validation.payment.PersonNameRule.ValidationBuilder
    +
    +
    This class provides an API for set up rules for validation person name.
    +
    VGSCardNumberEditText - Class in com.verygoodsecurity.vgscollect.widget
    A user interface element that displays text to the user in card number format.
    diff --git a/docs/index.html b/docs/index.html index d3b89879d..644363415 100644 --- a/docs/index.html +++ b/docs/index.html @@ -2,7 +2,7 @@ - + Generated Documentation (Untitled) @@ -26,6 +26,8 @@

    Packages

  • com.verygoodsecurity.vgscollect.view.card
  • com.verygoodsecurity.vgscollect.view.card.formatter
  • com.verygoodsecurity.vgscollect.view.card.icon
  • +
  • com.verygoodsecurity.vgscollect.view.card.validation
  • +
  • com.verygoodsecurity.vgscollect.view.card.validation.payment
  • com.verygoodsecurity.vgscollect.view.date
  • com.verygoodsecurity.vgscollect.view.material
  • com.verygoodsecurity.vgscollect.widget
  • diff --git a/docs/overview-summary.html b/docs/overview-summary.html index 2ac1a1abb..dec14cf2a 100644 --- a/docs/overview-summary.html +++ b/docs/overview-summary.html @@ -2,10 +2,10 @@ - + Overview - + @@ -123,6 +123,14 @@   +com.verygoodsecurity.vgscollect.view.card.validation +  + + +com.verygoodsecurity.vgscollect.view.card.validation.payment +  + + com.verygoodsecurity.vgscollect.view.date   diff --git a/docs/overview-tree.html b/docs/overview-tree.html index f6405eb26..0f0cb1642 100644 --- a/docs/overview-tree.html +++ b/docs/overview-tree.html @@ -2,10 +2,10 @@ - + Class Hierarchy - + @@ -84,6 +84,8 @@

    Hierarchy For All Packages

  • com.verygoodsecurity.vgscollect.view.card,
  • com.verygoodsecurity.vgscollect.view.card.formatter,
  • com.verygoodsecurity.vgscollect.view.card.icon,
  • +
  • com.verygoodsecurity.vgscollect.view.card.validation,
  • +
  • com.verygoodsecurity.vgscollect.view.card.validation.payment,
  • com.verygoodsecurity.vgscollect.view.date,
  • com.verygoodsecurity.vgscollect.view.material,
  • com.verygoodsecurity.vgscollect.widget
  • @@ -117,6 +119,7 @@

    Class Hierarchy

  • com.verygoodsecurity.vgscollect.widget.VGSTextInputLayout.Companion
  • com.verygoodsecurity.vgscollect.view.card.formatter.CardNumberFormatter.Companion
  • +
  • com.verygoodsecurity.vgscollect.view.card.BrandParams
  • com.verygoodsecurity.vgscollect.view.card.formatter.CardNumberFormatter (implements com.verygoodsecurity.vgscollect.view.card.formatter.Formatter)
  • com.verygoodsecurity.vgscollect.view.InputFieldView diff --git a/docs/package-list b/docs/package-list index 1783a0e72..a3c7f4c83 100644 --- a/docs/package-list +++ b/docs/package-list @@ -9,6 +9,8 @@ com.verygoodsecurity.vgscollect.view com.verygoodsecurity.vgscollect.view.card com.verygoodsecurity.vgscollect.view.card.formatter com.verygoodsecurity.vgscollect.view.card.icon +com.verygoodsecurity.vgscollect.view.card.validation +com.verygoodsecurity.vgscollect.view.card.validation.payment com.verygoodsecurity.vgscollect.view.date com.verygoodsecurity.vgscollect.view.material com.verygoodsecurity.vgscollect.widget diff --git a/vgscollect/gradle.properties b/vgscollect/gradle.properties index 9ed09a9c8..55c5bb528 100644 --- a/vgscollect/gradle.properties +++ b/vgscollect/gradle.properties @@ -3,5 +3,5 @@ POM_DESCRIPTION=VGS Collect - is a product suite that allows customers to collec POM_BINTRAY_NAME=vgscollect POM_ARTIFACT_ID=vgscollect POM_PACKAGING=aar -POM_VERSION=1.1.15 -CODE_VERSION=1115 \ No newline at end of file +POM_VERSION=1.1.16 +CODE_VERSION=1116 \ No newline at end of file diff --git a/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/core/model/state/FieldContent.kt b/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/core/model/state/FieldContent.kt index d867a9e82..db6ae1d58 100644 --- a/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/core/model/state/FieldContent.kt +++ b/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/core/model/state/FieldContent.kt @@ -14,6 +14,8 @@ sealed class FieldContent { class CardNumberContent:FieldContent() { var rawData:String? = null var cardtype: CardType = CardType.NONE + var numberRange: Array = CardType.NONE.rangeNumber + var rangeCVV: Array = CardType.NONE.rangeCVV var iconResId:Int? = 0 internal set var cardBrandName:String? = null @@ -42,7 +44,7 @@ sealed class FieldContent { /** @suppress */ internal fun FieldContent.CreditCardExpDateContent.handleOutputFormat(selectedDate: Calendar, fieldDateFormat: SimpleDateFormat?, fieldDateOutPutFormat: SimpleDateFormat?) { if(fieldDateFormat != null && fieldDateFormat.toPattern() == fieldDateOutPutFormat?.toPattern()) { - data = fieldDateFormat?.format(selectedDate.time) + data = fieldDateFormat.format(selectedDate.time) rawData = data } else { data = fieldDateFormat?.format(selectedDate.time) @@ -50,10 +52,6 @@ internal fun FieldContent.CreditCardExpDateContent.handleOutputFormat(selectedDa } } -/** @suppress */ -internal fun FieldContent.CardNumberContent.CVCMaxLength() = cardtype.rangeCVV.last() -internal fun FieldContent.CardNumberContent.CVCMinLength() = cardtype.rangeCVV[0] - /** @suppress */ internal fun FieldContent.CardNumberContent.parseCardBin():String { return data?.run { @@ -70,12 +68,18 @@ internal fun FieldContent.CardNumberContent.parseCardBin():String { internal fun FieldContent.CardNumberContent.parseCardLast4Digits():String { return data?.run { val numberSTR = data!!.replace("\\D".toRegex(), "") - if(numberSTR.length > 10) { + if(cardtype == CardType.NONE) { + if(numberSTR.length > 12) { + val start = numberSTR.length - 4 + val end = numberSTR.length + numberSTR.substring(start, end) + } else { + "" + } + } else { val start = numberSTR.length - 4 val end = numberSTR.length - numberSTR.substring(start, end) - } else { - "" + return numberSTR.substring(start, end) } }?:"" } diff --git a/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/core/model/state/VGSFieldState.kt b/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/core/model/state/VGSFieldState.kt index a187ba85d..705acdf1a 100644 --- a/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/core/model/state/VGSFieldState.kt +++ b/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/core/model/state/VGSFieldState.kt @@ -36,7 +36,7 @@ internal fun VGSFieldState.mapToFieldState():FieldState { val content = (content as? FieldContent.CardNumberContent) if(isValid) { state.bin = content?.parseCardBin() - state.last = content?.parseRawCardLastDigits() + state.last = content?.parseCardLast4Digits() } state.number = content?.parseCardNumber() state.cardBrand = content?.cardBrandName?:"" diff --git a/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/core/storage/Notifier.kt b/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/core/storage/Notifier.kt index 157690157..dc6954c66 100644 --- a/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/core/storage/Notifier.kt +++ b/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/core/storage/Notifier.kt @@ -29,19 +29,13 @@ internal class Notifier: DependencyDispatcher, FieldDependencyObserver { } private fun notifyRelatedFields(state: VGSFieldState, onDependencyDetected: (FieldType, Dependency) -> Unit) { - val range = Pair(getMinCVCLength(state), getMaxCVCLength(state)) - val dependency = Dependency(DependencyType.RANGE, range) when { - state.isCardNumberType() -> onDependencyDetected(FieldType.CVC, dependency) + state.isCardNumberType() -> { + val r:Array = (state.content as? FieldContent.CardNumberContent)?.rangeCVV?.sortedArray()?: arrayOf(3,4) + val dependency = Dependency(DependencyType.RANGE, r) + onDependencyDetected(FieldType.CVC, dependency) + } } } - - private fun getMinCVCLength(state: VGSFieldState):Int { - return (state.content as? FieldContent.CardNumberContent)?.CVCMinLength()?:3 - } - - private fun getMaxCVCLength(state: VGSFieldState):Int { - return (state.content as? FieldContent.CardNumberContent)?.CVCMaxLength()?:4 - } } \ No newline at end of file diff --git a/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/InputFieldView.kt b/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/InputFieldView.kt index 5424b9858..9b6074f81 100644 --- a/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/InputFieldView.kt +++ b/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/InputFieldView.kt @@ -29,6 +29,7 @@ import com.verygoodsecurity.vgscollect.view.card.CustomCardBrand import com.verygoodsecurity.vgscollect.view.card.FieldType import com.verygoodsecurity.vgscollect.view.card.formatter.CardMaskAdapter import com.verygoodsecurity.vgscollect.view.card.icon.CardIconAdapter +import com.verygoodsecurity.vgscollect.view.card.validation.payment.PersonNameRule import com.verygoodsecurity.vgscollect.view.date.DatePickerMode import com.verygoodsecurity.vgscollect.view.material.TextInputFieldLayout import com.verygoodsecurity.vgscollect.widget.ExpirationDateEditText @@ -1073,4 +1074,10 @@ abstract class InputFieldView @JvmOverloads constructor( fun enableValidation(isEnabled:Boolean) { inputField.enableValidation = isEnabled } + + protected fun applyValidationRule(rule: PersonNameRule) { + if(fieldType == FieldType.CARD_HOLDER_NAME) { + (inputField as? PersonNameInputField)?.applyValidationRule(rule) + } + } } \ No newline at end of file diff --git a/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/BrandParams.kt b/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/BrandParams.kt new file mode 100644 index 000000000..aabeb9336 --- /dev/null +++ b/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/BrandParams.kt @@ -0,0 +1,31 @@ +package com.verygoodsecurity.vgscollect.view.card + +data class BrandParams( + val mask:String = "#### #### #### #### ###", + val algorithm:ChecksumAlgorithm = ChecksumAlgorithm.NONE, + val rangeNumber:Array = CardType.NONE.rangeNumber, + val rangeCVV:Array = CardType.NONE.rangeCVV +) { + + override fun equals(other: Any?): Boolean { + if (this === other) return true + if (javaClass != other?.javaClass) return false + + other as BrandParams + + if (mask != other.mask) return false + if (algorithm != other.algorithm) return false + if (!rangeNumber.contentEquals(other.rangeNumber)) return false + if (!rangeCVV.contentEquals(other.rangeCVV)) return false + + return true + } + + override fun hashCode(): Int { + var result = mask.hashCode() + result = 31 * result + algorithm.hashCode() + result = 31 * result + rangeNumber.contentHashCode() + result = 31 * result + rangeCVV.contentHashCode() + return result + } +} \ No newline at end of file diff --git a/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/CardType.kt b/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/CardType.kt index a94ebb631..f9eb60625 100644 --- a/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/CardType.kt +++ b/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/CardType.kt @@ -15,99 +15,105 @@ import com.verygoodsecurity.vgscollect.R enum class CardType(val regex:String, val resId:Int, val mask:String, + val algorithm: ChecksumAlgorithm, val rangeNumber:Array, val rangeCVV:Array) { - /** Validation of this card brand includes the Luhn algorithm. */ ELO( "^(4011(78|79)|43(1274|8935)|45(1416|7393|763(1|2))|50(4175|6699|67[0-7][0-9]|9000)|627780|63(6297|6368)|650(03([^4])|04([0-9])|05(0|1)|4(0[5-9]|3[0-9]|8[5-9]|9[0-9])|5([0-2][0-9]|3[0-8])|9([2-6][0-9]|7[0-8])|541|700|720|901)|651652|655000|655021)", R.drawable.ic_elo_dark, "#### #### #### ####", + ChecksumAlgorithm.LUHN, arrayOf(16), arrayOf(3) ), - /** Validation of this card brand includes the Luhn algorithm. */ + VISA_ELECTRON( "^4(026|17500|405|508|844|91[37])", R.drawable.ic_visa_electron_dark, "#### #### #### ####", + ChecksumAlgorithm.LUHN, arrayOf(16), arrayOf(3) ), - /** Validation of this card brand includes the Luhn algorithm. */ + MAESTRO( "^(5018|5020|5038|6304|6390[0-9]{2}|67[0-9]{4})", R.drawable.ic_maestro_dark, "#### #### #### ####", + ChecksumAlgorithm.LUHN, (13..19).toList().toTypedArray(), arrayOf(3) ), - /** Validation of this card brand includes the Luhn algorithm. */ + FORBRUGSFORENINGEN( "^600", R.drawable.ic_forbrugsforeningen_dark, "#### #### #### ####", + ChecksumAlgorithm.LUHN, arrayOf(16), arrayOf(3) ), - /** Validation of this card brand includes the Luhn algorithm. */ + DANKORT( "^5019", R.drawable.ic_dankort_dark, "#### #### #### ####", + ChecksumAlgorithm.LUHN, arrayOf(16), arrayOf(3) ), - /** Validation of this card brand includes the Luhn algorithm. */ VISA( "^4", R.drawable.ic_visa_dark, "#### #### #### #### ###", + ChecksumAlgorithm.LUHN, arrayOf(13,16,19), arrayOf(3) ), - /** Validation of this card brand includes the Luhn algorithm. */ MASTERCARD( "^(5[1-5]|677189)|^(222[1-9]|2[3-6]\\d{2,}|27[0-1]\\d|2720)([0-9]{2,})", R.drawable.ic_mastercard_dark, "#### #### #### ####", + ChecksumAlgorithm.LUHN, arrayOf(16), arrayOf(3) ), - /** Validation of this card brand includes the Luhn algorithm. */ AMERICAN_EXPRESS( "^3[47]", R.drawable.ic_amex_lite, "#### ###### #####", + ChecksumAlgorithm.LUHN, arrayOf(15), arrayOf(4) ), - /** Validation of this card brand includes the Luhn algorithm. */ + HIPERCARD( "^(384100|384140|384160|606282|637095|637568|60(?!11))", R.drawable.ic_hipercard_dark, "#### #### #### #### ###", + ChecksumAlgorithm.LUHN, (14..19).toList().toTypedArray(), arrayOf(3) ), - /** Validation of this card brand includes the Luhn algorithm. */ DINCLUB( "^3(?:[689]|(?:0[059]+))", R.drawable.ic_diners_dark, "#### ###### ######", + ChecksumAlgorithm.LUHN, arrayOf(14, 16), arrayOf(3) ), - /** Validation of this card brand includes the Luhn algorithm. */ DISCOVER( "^(6011|65|64[4-9]|622)", R.drawable.ic_discover_light, "#### #### #### ####", + ChecksumAlgorithm.LUHN, arrayOf(16), arrayOf(3) ), @@ -115,15 +121,16 @@ enum class CardType(val regex:String, "^(62)", R.drawable.ic_union_pay, "#### #### #### #### ###", + ChecksumAlgorithm.NONE, (16..19).toList().toTypedArray(), arrayOf(3) ), - /** Validation of this card brand includes the Luhn algorithm. */ JCB( "^35", R.drawable.ic_jcb_light, "#### #### #### #### ###", + ChecksumAlgorithm.LUHN, (16..19).toList().toTypedArray(), arrayOf(3) ), @@ -132,7 +139,8 @@ enum class CardType(val regex:String, "^\$a", R.drawable.ic_card_front_preview_dark, "#### #### #### #### ###", - (7..19).toList().toTypedArray(), + ChecksumAlgorithm.NONE, + (13..19).toList().toTypedArray(), arrayOf(3,4) ); } \ No newline at end of file diff --git a/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/ChecksumAlgorithm.kt b/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/ChecksumAlgorithm.kt new file mode 100644 index 000000000..4bc0c9954 --- /dev/null +++ b/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/ChecksumAlgorithm.kt @@ -0,0 +1,6 @@ +package com.verygoodsecurity.vgscollect.view.card + +enum class ChecksumAlgorithm { + LUHN, + NONE +} \ No newline at end of file diff --git a/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/CustomCardBrand.kt b/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/CustomCardBrand.kt index ef85bde78..2406abc90 100644 --- a/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/CustomCardBrand.kt +++ b/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/CustomCardBrand.kt @@ -17,5 +17,6 @@ data class CustomCardBrand( /** The drawable resource represents credit card logo. */ val drawableResId:Int = 0, - val mask:String = "#### #### #### #### ###" + + val params:BrandParams = BrandParams() ) \ No newline at end of file diff --git a/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/BaseInputConnection.kt b/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/conection/BaseInputConnection.kt similarity index 83% rename from vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/BaseInputConnection.kt rename to vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/conection/BaseInputConnection.kt index 9da36979b..c3bd773be 100644 --- a/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/BaseInputConnection.kt +++ b/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/conection/BaseInputConnection.kt @@ -1,9 +1,10 @@ -package com.verygoodsecurity.vgscollect.view.card +package com.verygoodsecurity.vgscollect.view.card.conection import com.verygoodsecurity.vgscollect.core.OnVgsViewStateChangeListener import com.verygoodsecurity.vgscollect.core.model.state.VGSFieldState -internal abstract class BaseInputConnection: InputRunnable { +internal abstract class BaseInputConnection: + InputRunnable { private var stateListeners = mutableListOf() protected fun addNewListener(listener: OnVgsViewStateChangeListener) { diff --git a/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/InputCardCVCConnection.kt b/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/conection/InputCardCVCConnection.kt similarity index 96% rename from vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/InputCardCVCConnection.kt rename to vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/conection/InputCardCVCConnection.kt index 1d143fd6e..b1972ac37 100644 --- a/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/InputCardCVCConnection.kt +++ b/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/conection/InputCardCVCConnection.kt @@ -1,4 +1,4 @@ -package com.verygoodsecurity.vgscollect.view.card +package com.verygoodsecurity.vgscollect.view.card.conection import com.verygoodsecurity.vgscollect.core.OnVgsViewStateChangeListener import com.verygoodsecurity.vgscollect.core.model.state.VGSFieldState diff --git a/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/InputCardExpDateConnection.kt b/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/conection/InputCardExpDateConnection.kt similarity index 96% rename from vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/InputCardExpDateConnection.kt rename to vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/conection/InputCardExpDateConnection.kt index 7b8cd82e9..41373c970 100644 --- a/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/InputCardExpDateConnection.kt +++ b/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/conection/InputCardExpDateConnection.kt @@ -1,4 +1,4 @@ -package com.verygoodsecurity.vgscollect.view.card +package com.verygoodsecurity.vgscollect.view.card.conection import com.verygoodsecurity.vgscollect.core.OnVgsViewStateChangeListener import com.verygoodsecurity.vgscollect.core.model.state.VGSFieldState diff --git a/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/InputCardHolderConnection.kt b/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/conection/InputCardHolderConnection.kt similarity index 96% rename from vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/InputCardHolderConnection.kt rename to vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/conection/InputCardHolderConnection.kt index f6b242c98..67598f91c 100644 --- a/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/InputCardHolderConnection.kt +++ b/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/conection/InputCardHolderConnection.kt @@ -1,4 +1,4 @@ -package com.verygoodsecurity.vgscollect.view.card +package com.verygoodsecurity.vgscollect.view.card.conection import com.verygoodsecurity.vgscollect.core.OnVgsViewStateChangeListener import com.verygoodsecurity.vgscollect.core.model.state.VGSFieldState diff --git a/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/InputCardNumberConnection.kt b/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/conection/InputCardNumberConnection.kt similarity index 66% rename from vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/InputCardNumberConnection.kt rename to vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/conection/InputCardNumberConnection.kt index f56872f62..0b5e26d61 100644 --- a/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/InputCardNumberConnection.kt +++ b/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/conection/InputCardNumberConnection.kt @@ -1,8 +1,9 @@ -package com.verygoodsecurity.vgscollect.view.card +package com.verygoodsecurity.vgscollect.view.card.conection import com.verygoodsecurity.vgscollect.core.OnVgsViewStateChangeListener import com.verygoodsecurity.vgscollect.core.model.state.FieldContent import com.verygoodsecurity.vgscollect.core.model.state.VGSFieldState +import com.verygoodsecurity.vgscollect.view.card.ChecksumAlgorithm import com.verygoodsecurity.vgscollect.view.card.filter.CardBrandPreview import com.verygoodsecurity.vgscollect.view.card.filter.VGSCardFilter import com.verygoodsecurity.vgscollect.view.card.validation.MuttableValidator @@ -17,23 +18,6 @@ internal class InputCardNumberConnection( private val divider:String? = null ): BaseInputConnection() { private val cardFilters = mutableListOf() - private val brandLuhnValidations by lazy { - val set = HashMap() - set[CardType.ELO] = EloDelegate() - set[CardType.DANKORT] = DankortDelegate() - set[CardType.FORBRUGSFORENINGEN] = ForbrugsforeningenDelegate() - set[CardType.HIPERCARD] = HipercardDelegate() - set[CardType.MAESTRO] = MaestroDelegate() - set[CardType.VISA] = VisaDelegate() - set[CardType.VISA_ELECTRON] = VisaElectronDelegate() - set[CardType.MASTERCARD] = MastercardDelegate() - set[CardType.AMERICAN_EXPRESS] = AmexDelegate() - set[CardType.DINCLUB] = DinersClubDelegate() - set[CardType.DISCOVER] = DiscoverDelegate() - set[CardType.JCB] = JcbDelegate() - - set - } private var output = VGSFieldState() @@ -61,18 +45,23 @@ internal class InputCardNumberConnection( } override fun run() { - val card = runFilters() - mapValue(card) - - IcardBrand?.onCardBrandPreview(card) + val brand = detectBrand() + mapValue(brand) - applyNewRule(card.regex) + IcardBrand?.onCardBrandPreview(brand) - output.isValid = isRequiredValid() && isContentValid(card) + validate(brand) notifyAllListeners(id, output) } + private fun validate(brand: CardBrandPreview) { + val isRequiredRuleValid = isRequiredValid() + val isContentRuleValid = isContentValid(brand) + + output.isValid = isRequiredRuleValid && isContentRuleValid + } + private fun isRequiredValid():Boolean { return output.isRequired && !output.content?.data.isNullOrEmpty() || !output.isRequired } @@ -91,17 +80,34 @@ internal class InputCardNumberConnection( ): Boolean { val rawStr = output.content?.data?.replace(divider ?: " ", "") ?: "" val isStrValid = validator?.isValid(rawStr) ?: false - val isLuhnValid: Boolean = brandLuhnValidations[card.cardType]?.isValid(rawStr) ?: true + val isLuhnValid: Boolean = validateCheckSum(card.algorithm, rawStr) - val isLengthAppropriate = checkLength(card.cardType, rawStr.length) + val isLengthAppropriate = checkLength(card.numberLength, rawStr.length) return isLuhnValid && isStrValid && isLengthAppropriate } + private fun validateCheckSum( + algorithm: ChecksumAlgorithm, + cardNumber: String + ):Boolean { + return if(algorithm == ChecksumAlgorithm.LUHN) { + CardBrandDelegate().isValid(cardNumber) + } else { + false // in the future will depends on RULE params + } +// val isLuhnValid: Boolean = brandLuhnValidations[card.cardType]?.isValid(rawStr) ?: true + } + private fun mapValue(item: CardBrandPreview) { - val card = (output.content as? FieldContent.CardNumberContent) - card?.cardtype = item.cardType - card?.cardBrandName = item.name - card?.iconResId = item.resId + applyNewRule(item.regex) + + with(output.content as? FieldContent.CardNumberContent) { + this?.cardtype = item.cardType + this?.cardBrandName = item.name + this?.iconResId = item.resId + this?.numberRange = item.numberLength + this?.rangeCVV = item.cvcLength + } } private fun applyNewRule(regex: String?) { @@ -112,7 +118,7 @@ internal class InputCardNumberConnection( } } - private fun runFilters(): CardBrandPreview { + private fun detectBrand(): CardBrandPreview { for(i in cardFilters.indices) { val filter = cardFilters[i] val brand = filter.detect(output.content?.data) @@ -124,10 +130,10 @@ internal class InputCardNumberConnection( } private fun checkLength( - cardtype: CardType, + rangeNumber: Array, length: Int? ): Boolean { - return cardtype.rangeNumber.contains(length) + return rangeNumber.contains(length) } internal interface IDrawCardBrand { diff --git a/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/InputInfoConnection.kt b/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/conection/InputInfoConnection.kt similarity index 96% rename from vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/InputInfoConnection.kt rename to vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/conection/InputInfoConnection.kt index f33fb208a..44a155178 100644 --- a/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/InputInfoConnection.kt +++ b/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/conection/InputInfoConnection.kt @@ -1,4 +1,4 @@ -package com.verygoodsecurity.vgscollect.view.card +package com.verygoodsecurity.vgscollect.view.card.conection import com.verygoodsecurity.vgscollect.core.OnVgsViewStateChangeListener import com.verygoodsecurity.vgscollect.core.model.state.VGSFieldState diff --git a/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/InputRunnable.kt b/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/conection/InputRunnable.kt similarity index 87% rename from vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/InputRunnable.kt rename to vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/conection/InputRunnable.kt index 7939c9d86..a6f56d65d 100644 --- a/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/InputRunnable.kt +++ b/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/conection/InputRunnable.kt @@ -1,4 +1,4 @@ -package com.verygoodsecurity.vgscollect.view.card +package com.verygoodsecurity.vgscollect.view.card.conection import com.verygoodsecurity.vgscollect.core.OnVgsViewStateChangeListener import com.verygoodsecurity.vgscollect.core.model.state.VGSFieldState diff --git a/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/filter/CardBrandFilter.kt b/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/filter/CardBrandFilter.kt index 6d1e1fe16..a77a0029a 100644 --- a/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/filter/CardBrandFilter.kt +++ b/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/filter/CardBrandFilter.kt @@ -28,10 +28,14 @@ class CardBrandFilter( val value = userCustomCardBrands[i] val m = Pattern.compile(value.regex).matcher(preparedStr) while (m.find()) { - return CardBrandPreview(regex = value.regex, + return CardBrandPreview( + regex = value.regex, name = value.cardBrandName, resId = value.drawableResId, - currentMask = value.mask) + currentMask = value.params.mask, + algorithm = value.params.algorithm, + numberLength = value.params.rangeNumber, + cvcLength = value.params.rangeCVV) } } diff --git a/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/filter/CardBrandPreview.kt b/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/filter/CardBrandPreview.kt index 69d7542ac..c0af1dba1 100644 --- a/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/filter/CardBrandPreview.kt +++ b/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/filter/CardBrandPreview.kt @@ -1,6 +1,7 @@ package com.verygoodsecurity.vgscollect.view.card.filter import com.verygoodsecurity.vgscollect.view.card.CardType +import com.verygoodsecurity.vgscollect.view.card.ChecksumAlgorithm /** @suppress */ data class CardBrandPreview( @@ -9,5 +10,38 @@ data class CardBrandPreview( val name:String? = CardType.NONE.name, val resId:Int = CardType.NONE.resId, var currentMask:String = CardType.NONE.mask, - var hasLuhn:Boolean = false -) \ No newline at end of file + var algorithm: ChecksumAlgorithm = ChecksumAlgorithm.NONE, + var numberLength: Array = CardType.NONE.rangeNumber, + var cvcLength: Array = CardType.NONE.rangeCVV +) { + override fun equals(other: Any?): Boolean { + if (this === other) return true + if (javaClass != other?.javaClass) return false + + other as CardBrandPreview + + if (cardType != other.cardType) return false + if (regex != other.regex) return false + if (name != other.name) return false + if (resId != other.resId) return false + if (currentMask != other.currentMask) return false + if (algorithm != other.algorithm) return false + if (!numberLength.contentEquals(other.numberLength)) return false + if (!cvcLength.contentEquals(other.cvcLength)) return false + + return true + } + + override fun hashCode(): Int { + var result = cardType.hashCode() + result = 31 * result + regex.hashCode() + result = 31 * result + (name?.hashCode() ?: 0) + result = 31 * result + resId + result = 31 * result + currentMask.hashCode() + result = 31 * result + algorithm.hashCode() + result = 31 * result + numberLength.contentHashCode() + result = 31 * result + cvcLength.contentHashCode() + return result + } + +} \ No newline at end of file diff --git a/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/filter/DefaultCardBrandFilter.kt b/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/filter/DefaultCardBrandFilter.kt index f90a53ef5..8b7a07c4e 100644 --- a/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/filter/DefaultCardBrandFilter.kt +++ b/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/filter/DefaultCardBrandFilter.kt @@ -21,10 +21,13 @@ class DefaultCardBrandFilter( val m = Pattern.compile(value.regex).matcher(preparedStr) while (m.find()) { return CardBrandPreview(value, - value.regex, - value.name, - value.resId, - value.mask) + value.regex, + value.name, + value.resId, + value.mask, + value.algorithm, + value.rangeNumber, + value.rangeCVV) } } diff --git a/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/formatter/CardNumberFormatter.kt b/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/formatter/CardNumberFormatter.kt index 51fed86af..4124bdd76 100644 --- a/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/formatter/CardNumberFormatter.kt +++ b/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/formatter/CardNumberFormatter.kt @@ -70,8 +70,7 @@ class CardNumberFormatter: TextWatcher, Formatter { runtimeData = builder.toString() } - @VisibleForTesting - fun getMask():String = mask + override fun getMask():String = mask @VisibleForTesting fun getMaskLength():Int = maxLength diff --git a/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/formatter/Formatter.kt b/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/formatter/Formatter.kt index 34ef3c456..345b738c7 100644 --- a/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/formatter/Formatter.kt +++ b/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/formatter/Formatter.kt @@ -2,4 +2,5 @@ package com.verygoodsecurity.vgscollect.view.card.formatter interface Formatter { fun setMask(mask:String) + fun getMask():String } \ No newline at end of file diff --git a/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/validation/CardCVCCodeValidator.kt b/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/validation/CardCVCCodeValidator.kt index e8dc6be31..2614cb6a2 100644 --- a/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/validation/CardCVCCodeValidator.kt +++ b/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/validation/CardCVCCodeValidator.kt @@ -2,10 +2,10 @@ package com.verygoodsecurity.vgscollect.view.card.validation /** @suppress */ class CardCVCCodeValidator( - private val length:Int = 3 + private val cvcLength:Array = arrayOf(3,4) ):VGSValidator { override fun isValid(content: String?): Boolean { val data:Int? = content?.trim()?.toIntOrNull() - return data != null && content.length >= length + return data != null && cvcLength.contains(content.length) } } \ No newline at end of file diff --git a/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/validation/CardHolderValidator.kt b/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/validation/CardHolderValidator.kt deleted file mode 100644 index 18fc37945..000000000 --- a/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/validation/CardHolderValidator.kt +++ /dev/null @@ -1,14 +0,0 @@ -package com.verygoodsecurity.vgscollect.view.card.validation - -import java.util.regex.Pattern - -/** @suppress */ -class CardHolderValidator:VGSValidator { - private val m = Pattern.compile("^[a-zA-Z0-9 ,'.-]+\$") //only symbols - "^[\\p{L}\\s'.-]+\$" - - override fun isValid(content: String?): Boolean { - val str = content?.trim() - return !str.isNullOrEmpty() && - m.matcher(str).matches() - } -} \ No newline at end of file diff --git a/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/validation/CompositeValidator.kt b/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/validation/CompositeValidator.kt new file mode 100644 index 000000000..7e45b7004 --- /dev/null +++ b/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/validation/CompositeValidator.kt @@ -0,0 +1,25 @@ +package com.verygoodsecurity.vgscollect.view.card.validation + +class CompositeValidator : MutableValidator { + private val validators = mutableListOf() + + override fun clearRules() { + validators.clear() + } + + override fun addRule(validator: VGSValidator) { + validators.add(validator) + } + + override fun isValid(content: String?): Boolean { + return if(validators.isEmpty()) { + false + } else { + var isValid = true + for (validator in validators) { + isValid = isValid && validator.isValid(content) + } + isValid + } + } +} \ No newline at end of file diff --git a/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/validation/MutableValidator.kt b/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/validation/MutableValidator.kt new file mode 100644 index 000000000..397178b9d --- /dev/null +++ b/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/validation/MutableValidator.kt @@ -0,0 +1,7 @@ +package com.verygoodsecurity.vgscollect.view.card.validation + +/** @suppress */ +interface MutableValidator:VGSValidator { + fun clearRules() + fun addRule(validator: VGSValidator) +} \ No newline at end of file diff --git a/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/validation/RegexValidator.kt b/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/validation/RegexValidator.kt new file mode 100644 index 000000000..5309d1ce5 --- /dev/null +++ b/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/validation/RegexValidator.kt @@ -0,0 +1,29 @@ +package com.verygoodsecurity.vgscollect.view.card.validation + +import java.util.regex.Pattern + +/** @suppress */ +class RegexValidator( + regex:String? = null +):VGSValidator { + private var m:Pattern? = null + + init { + if(!regex.isNullOrEmpty()) { + m = Pattern.compile(regex) + } + } + + override fun isValid(content: String?): Boolean { + return m?.run { + val str = content?.trim() + val s = !str.isNullOrEmpty() && + m!!.matcher(str).matches() + s + }?:true + } + + internal fun setRegex(regex:String) { + m = Pattern.compile(regex) + } +} \ No newline at end of file diff --git a/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/validation/card/brand/AmexDelegate.kt b/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/validation/card/brand/CardBrandDelegate.kt similarity index 78% rename from vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/validation/card/brand/AmexDelegate.kt rename to vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/validation/card/brand/CardBrandDelegate.kt index 4b8506c50..5116e15f7 100644 --- a/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/validation/card/brand/AmexDelegate.kt +++ b/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/validation/card/brand/CardBrandDelegate.kt @@ -3,8 +3,8 @@ package com.verygoodsecurity.vgscollect.view.card.validation.card.brand import com.verygoodsecurity.vgscollect.view.card.validation.VGSValidator /** @suppress */ -class AmexDelegate : VGSValidator by DefaultCardValidator("^3[47][0-9]{13}\$") { +class CardBrandDelegate : VGSValidator by DefaultCardValidator() { override fun isValid(content: String?): Boolean { return !content.isNullOrEmpty() && isLuhnCheckSumValid(content) } -} +} \ No newline at end of file diff --git a/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/validation/card/brand/DankortDelegate.kt b/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/validation/card/brand/DankortDelegate.kt deleted file mode 100644 index 7c342ed31..000000000 --- a/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/validation/card/brand/DankortDelegate.kt +++ /dev/null @@ -1,11 +0,0 @@ -package com.verygoodsecurity.vgscollect.view.card.validation.card.brand - -import com.verygoodsecurity.vgscollect.view.card.CardType -import com.verygoodsecurity.vgscollect.view.card.validation.VGSValidator - -/** @suppress */ -class DankortDelegate : VGSValidator by DefaultCardValidator(CardType.DANKORT.regex) { - override fun isValid(content: String?): Boolean { - return !content.isNullOrEmpty() && isLuhnCheckSumValid(content) - } -} \ No newline at end of file diff --git a/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/validation/card/brand/DinersClubDelegate.kt b/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/validation/card/brand/DinersClubDelegate.kt deleted file mode 100644 index da29cb571..000000000 --- a/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/validation/card/brand/DinersClubDelegate.kt +++ /dev/null @@ -1,11 +0,0 @@ -package com.verygoodsecurity.vgscollect.view.card.validation.card.brand - -import com.verygoodsecurity.vgscollect.view.card.CardType -import com.verygoodsecurity.vgscollect.view.card.validation.VGSValidator - -/** @suppress */ -class DinersClubDelegate : VGSValidator by DefaultCardValidator(CardType.DINCLUB.regex) { - override fun isValid(content: String?): Boolean { - return !content.isNullOrEmpty() && isLuhnCheckSumValid(content) - } -} \ No newline at end of file diff --git a/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/validation/card/brand/DiscoverDelegate.kt b/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/validation/card/brand/DiscoverDelegate.kt deleted file mode 100644 index 90d10007b..000000000 --- a/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/validation/card/brand/DiscoverDelegate.kt +++ /dev/null @@ -1,10 +0,0 @@ -package com.verygoodsecurity.vgscollect.view.card.validation.card.brand - -import com.verygoodsecurity.vgscollect.view.card.validation.VGSValidator - -/** @suppress */ -class DiscoverDelegate : VGSValidator by DefaultCardValidator("^6(?:011|5[0-9]{2})[0-9]{12}\$") { - override fun isValid(content: String?): Boolean { - return !content.isNullOrEmpty() && isLuhnCheckSumValid(content) - } -} \ No newline at end of file diff --git a/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/validation/card/brand/EloDelegate.kt b/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/validation/card/brand/EloDelegate.kt deleted file mode 100644 index c260c8e03..000000000 --- a/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/validation/card/brand/EloDelegate.kt +++ /dev/null @@ -1,11 +0,0 @@ -package com.verygoodsecurity.vgscollect.view.card.validation.card.brand - -import com.verygoodsecurity.vgscollect.view.card.CardType -import com.verygoodsecurity.vgscollect.view.card.validation.VGSValidator - -/** @suppress */ -class EloDelegate : VGSValidator by DefaultCardValidator(CardType.ELO.regex) { - override fun isValid(content: String?): Boolean { - return !content.isNullOrEmpty() && isLuhnCheckSumValid(content) - } -} \ No newline at end of file diff --git a/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/validation/card/brand/ForbrugsforeningenDelegate.kt b/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/validation/card/brand/ForbrugsforeningenDelegate.kt deleted file mode 100644 index 92076a850..000000000 --- a/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/validation/card/brand/ForbrugsforeningenDelegate.kt +++ /dev/null @@ -1,11 +0,0 @@ -package com.verygoodsecurity.vgscollect.view.card.validation.card.brand - -import com.verygoodsecurity.vgscollect.view.card.CardType -import com.verygoodsecurity.vgscollect.view.card.validation.VGSValidator - -/** @suppress */ -class ForbrugsforeningenDelegate : VGSValidator by DefaultCardValidator(CardType.FORBRUGSFORENINGEN.regex) { - override fun isValid(content: String?): Boolean { - return !content.isNullOrEmpty() && isLuhnCheckSumValid(content) - } -} \ No newline at end of file diff --git a/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/validation/card/brand/HipercardDelegate.kt b/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/validation/card/brand/HipercardDelegate.kt deleted file mode 100644 index edccd290c..000000000 --- a/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/validation/card/brand/HipercardDelegate.kt +++ /dev/null @@ -1,11 +0,0 @@ -package com.verygoodsecurity.vgscollect.view.card.validation.card.brand - -import com.verygoodsecurity.vgscollect.view.card.CardType -import com.verygoodsecurity.vgscollect.view.card.validation.VGSValidator - -/** @suppress */ -class HipercardDelegate : VGSValidator by DefaultCardValidator(CardType.HIPERCARD.regex) { - override fun isValid(content: String?): Boolean { - return !content.isNullOrEmpty() && isLuhnCheckSumValid(content) - } -} \ No newline at end of file diff --git a/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/validation/card/brand/JcbDelegate.kt b/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/validation/card/brand/JcbDelegate.kt deleted file mode 100644 index 724c8309c..000000000 --- a/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/validation/card/brand/JcbDelegate.kt +++ /dev/null @@ -1,10 +0,0 @@ -package com.verygoodsecurity.vgscollect.view.card.validation.card.brand - -import com.verygoodsecurity.vgscollect.view.card.validation.VGSValidator - -/** @suppress */ -class JcbDelegate : VGSValidator by DefaultCardValidator("^(?:2131|1800|35\\d{3})\\d{11,14}\$") { - override fun isValid(content: String?): Boolean { - return !content.isNullOrEmpty() && isLuhnCheckSumValid(content) - } -} \ No newline at end of file diff --git a/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/validation/card/brand/MaestroDelegate.kt b/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/validation/card/brand/MaestroDelegate.kt deleted file mode 100644 index df8a4f189..000000000 --- a/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/validation/card/brand/MaestroDelegate.kt +++ /dev/null @@ -1,11 +0,0 @@ -package com.verygoodsecurity.vgscollect.view.card.validation.card.brand - -import com.verygoodsecurity.vgscollect.view.card.CardType -import com.verygoodsecurity.vgscollect.view.card.validation.VGSValidator - -/** @suppress */ -class MaestroDelegate : VGSValidator by DefaultCardValidator(CardType.MAESTRO.regex) { - override fun isValid(content: String?): Boolean { - return !content.isNullOrEmpty() && isLuhnCheckSumValid(content) - } -} \ No newline at end of file diff --git a/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/validation/card/brand/MastercardDelegate.kt b/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/validation/card/brand/MastercardDelegate.kt deleted file mode 100644 index 5f8f3f91c..000000000 --- a/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/validation/card/brand/MastercardDelegate.kt +++ /dev/null @@ -1,10 +0,0 @@ -package com.verygoodsecurity.vgscollect.view.card.validation.card.brand - -import com.verygoodsecurity.vgscollect.view.card.validation.VGSValidator - -/** @suppress */ -class MastercardDelegate : VGSValidator by DefaultCardValidator("^(?:5[1-5][0-9]{2}|222[1-9]|22[3-9][0-9]|2[3-6][0-9]{2}|27[01][0-9]|2720)[0-9]{12}\$") { - override fun isValid(content: String?): Boolean { - return !content.isNullOrEmpty() && isLuhnCheckSumValid(content) - } -} diff --git a/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/validation/card/brand/VisaDelegate.kt b/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/validation/card/brand/VisaDelegate.kt deleted file mode 100644 index c87beb4f5..000000000 --- a/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/validation/card/brand/VisaDelegate.kt +++ /dev/null @@ -1,10 +0,0 @@ -package com.verygoodsecurity.vgscollect.view.card.validation.card.brand - -import com.verygoodsecurity.vgscollect.view.card.validation.VGSValidator - -/** @suppress */ -class VisaDelegate : VGSValidator by DefaultCardValidator("^4[0-9]{12}((?:[0-9]{3})?|(?:[0-9]{6})?)\$") { - override fun isValid(content: String?): Boolean { - return !content.isNullOrEmpty() && isLuhnCheckSumValid(content) - } -} \ No newline at end of file diff --git a/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/validation/card/brand/VisaElectronDelegate.kt b/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/validation/card/brand/VisaElectronDelegate.kt deleted file mode 100644 index 2294f42c5..000000000 --- a/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/validation/card/brand/VisaElectronDelegate.kt +++ /dev/null @@ -1,10 +0,0 @@ -package com.verygoodsecurity.vgscollect.view.card.validation.card.brand - -import com.verygoodsecurity.vgscollect.view.card.validation.VGSValidator - -/** @suppress */ -class VisaElectronDelegate : VGSValidator by DefaultCardValidator("^4(026|17500|405|508|844|91[37])") { - override fun isValid(content: String?): Boolean { - return !content.isNullOrEmpty() && isLuhnCheckSumValid(content) - } -} \ No newline at end of file diff --git a/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/validation/payment/LengthValidator.kt b/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/validation/payment/LengthValidator.kt new file mode 100644 index 000000000..ccb21becb --- /dev/null +++ b/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/validation/payment/LengthValidator.kt @@ -0,0 +1,12 @@ +package com.verygoodsecurity.vgscollect.view.card.validation.payment + +import com.verygoodsecurity.vgscollect.view.card.validation.VGSValidator + +/** @suppress */ +class LengthValidator( + private val length: Array +) : VGSValidator { + override fun isValid(content: String?): Boolean { + return !content.isNullOrEmpty() && length.contains(content.length) + } +} \ No newline at end of file diff --git a/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/validation/payment/PersonNameRule.kt b/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/validation/payment/PersonNameRule.kt new file mode 100644 index 000000000..7b7da4209 --- /dev/null +++ b/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/card/validation/payment/PersonNameRule.kt @@ -0,0 +1,91 @@ +package com.verygoodsecurity.vgscollect.view.card.validation.payment + +/** + * This rule provides a simplified mechanism to improve default behavior of field which include person name. + */ +data class PersonNameRule( + internal val regex: String?, + internal val length:Array? +) { + + /** + * This class provides an API for set up rules for validation person name. + */ + class ValidationBuilder { + + /** The Regex for validation input. */ + private var regex: String? = null + + /** The minimum length of the person name which will support. */ + private var minLength = -1 + + /** The maximum length of the person name which will support. */ + private var maxLength = -1 + + /** Configure Regex for validation input. */ + fun setRegex(regex: String): ValidationBuilder { + this.regex = regex + return this + } + + /** Configure minimum length of the name which will support. */ + fun setAllowableMinLength(length:Int): ValidationBuilder { + if(maxLength == -1) { + maxLength = 256 + } + minLength = if(length > maxLength) { + maxLength + } else { + length + } + return this + } + + /** Configure maximum length of the name which will support. */ + fun setAllowableMaxLength(length:Int): ValidationBuilder { + if(minLength == -1) { + minLength = 1 + } + if(length < minLength) { + minLength = length + } + maxLength = length + return this + } + + /** Creates a rule. */ + fun build(): PersonNameRule { + val range = if(minLength != -1 && maxLength != -1) { + (minLength..maxLength).toList().toTypedArray() + } else { + null + } + + return PersonNameRule( + regex, + range + ) + } + } + + override fun equals(other: Any?): Boolean { + if (this === other) return true + if (javaClass != other?.javaClass) return false + + other as PersonNameRule + + if (regex != other.regex) return false + if (length != null) { + if (other.length == null) return false + if (!length.contentEquals(other.length)) return false + } else if (other.length != null) return false + + return true + } + + override fun hashCode(): Int { + var result = regex?.hashCode() ?: 0 + result = 31 * result + (length?.contentHashCode() ?: 0) + return result + } +} \ No newline at end of file diff --git a/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/internal/BaseInputField.kt b/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/internal/BaseInputField.kt index 2bfe30def..fc703481c 100644 --- a/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/internal/BaseInputField.kt +++ b/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/internal/BaseInputField.kt @@ -22,7 +22,7 @@ import com.verygoodsecurity.vgscollect.core.storage.DependencyType import com.verygoodsecurity.vgscollect.core.storage.OnFieldStateChangeListener import com.verygoodsecurity.vgscollect.view.InputFieldView import com.verygoodsecurity.vgscollect.view.card.FieldType -import com.verygoodsecurity.vgscollect.view.card.InputRunnable +import com.verygoodsecurity.vgscollect.view.card.conection.InputRunnable /** @suppress */ internal abstract class BaseInputField(context: Context) : TextInputEditText(context), diff --git a/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/internal/CVCInputField.kt b/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/internal/CVCInputField.kt index cef55bdf9..16e16b2b5 100644 --- a/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/internal/CVCInputField.kt +++ b/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/internal/CVCInputField.kt @@ -10,7 +10,7 @@ import com.verygoodsecurity.vgscollect.core.model.state.Dependency import com.verygoodsecurity.vgscollect.core.model.state.FieldContent import com.verygoodsecurity.vgscollect.core.storage.DependencyType import com.verygoodsecurity.vgscollect.view.card.FieldType -import com.verygoodsecurity.vgscollect.view.card.InputCardCVCConnection +import com.verygoodsecurity.vgscollect.view.card.conection.InputCardCVCConnection import com.verygoodsecurity.vgscollect.view.card.text.CVCValidateFilter import com.verygoodsecurity.vgscollect.view.card.validation.CardCVCCodeValidator @@ -18,10 +18,15 @@ import com.verygoodsecurity.vgscollect.view.card.validation.CardCVCCodeValidator internal class CVCInputField(context: Context): BaseInputField(context) { override var fieldType: FieldType = FieldType.CVC + private var cvcLength:Array = arrayOf(3,4) override fun applyFieldType() { - val validator = CardCVCCodeValidator(minCodeLimit) - inputConnection = InputCardCVCConnection(id, validator) + val validator = CardCVCCodeValidator(cvcLength) + inputConnection = + InputCardCVCConnection( + id, + validator + ) val str = text.toString() val stateContent = FieldContent.InfoContent().apply { @@ -67,20 +72,16 @@ internal class CVCInputField(context: Context): BaseInputField(context) { } } - private var maxCodeLimit:Int = 4 - private var minCodeLimit:Int = 3 override fun dispatchDependencySetting(dependency: Dependency) { if(dependency.dependencyType == DependencyType.RANGE) { - val range = dependency.value as Pair - - if(maxCodeLimit != range.second || minCodeLimit != range.first) { - minCodeLimit = range.first - maxCodeLimit = range.second - val filterLength = InputFilter.LengthFilter(maxCodeLimit) + val cvcLength = dependency.value as Array + if(!this.cvcLength.contentEquals(cvcLength)) { + this.cvcLength = cvcLength + val filterLength = InputFilter.LengthFilter(cvcLength.last()) filters = arrayOf(CVCValidateFilter(), filterLength) (inputConnection as? InputCardCVCConnection)?.runtimeValidator = - CardCVCCodeValidator(minCodeLimit) + CardCVCCodeValidator(this.cvcLength) text = text } diff --git a/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/internal/CardInputField.kt b/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/internal/CardInputField.kt index 84de5936c..cbc67bc61 100644 --- a/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/internal/CardInputField.kt +++ b/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/internal/CardInputField.kt @@ -14,6 +14,7 @@ import com.verygoodsecurity.vgscollect.util.Logger import com.verygoodsecurity.vgscollect.util.isNumeric import com.verygoodsecurity.vgscollect.view.InputFieldView import com.verygoodsecurity.vgscollect.view.card.* +import com.verygoodsecurity.vgscollect.view.card.conection.InputCardNumberConnection import com.verygoodsecurity.vgscollect.view.card.filter.CardBrandFilter import com.verygoodsecurity.vgscollect.view.card.filter.CardBrandPreview import com.verygoodsecurity.vgscollect.view.card.filter.DefaultCardBrandFilter @@ -53,7 +54,13 @@ internal class CardInputField(context: Context): BaseInputField(context), InputC override fun applyFieldType() { val validator = CardNumberValidator(divider) - inputConnection = InputCardNumberConnection(id, validator, this, divider) + inputConnection = + InputCardNumberConnection( + id, + validator, + this, + divider + ) val defFilter = DefaultCardBrandFilter(CardType.values(), divider) inputConnection!!.addFilter(defFilter) @@ -242,7 +249,7 @@ internal class CardInputField(context: Context): BaseInputField(context), InputC cardNumberMask = with(cardNumberMask) { this.replace(Regex(MASK_REGEX), divider) } - if(!text.isNullOrEmpty() && !cardNumberMask.contains(divider)) { + if(!text.isNullOrEmpty() && cardNumberFormatter?.getMask() != cardNumberMask) { cardNumberFormatter?.setMask(cardNumberMask) refreshInput() } diff --git a/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/internal/DateInputField.kt b/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/internal/DateInputField.kt index c763dc28a..03f577d6c 100644 --- a/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/internal/DateInputField.kt +++ b/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/internal/DateInputField.kt @@ -13,7 +13,7 @@ import android.widget.DatePicker import com.verygoodsecurity.vgscollect.core.model.state.FieldContent import com.verygoodsecurity.vgscollect.core.model.state.handleOutputFormat import com.verygoodsecurity.vgscollect.view.card.FieldType -import com.verygoodsecurity.vgscollect.view.card.InputCardExpDateConnection +import com.verygoodsecurity.vgscollect.view.card.conection.InputCardExpDateConnection import com.verygoodsecurity.vgscollect.view.card.text.ExpirationDateTextWatcher import com.verygoodsecurity.vgscollect.view.date.DatePickerBuilder import com.verygoodsecurity.vgscollect.view.date.DatePickerMode @@ -68,7 +68,11 @@ internal class DateInputField(context: Context): BaseInputField(context), View.O override fun applyFieldType() { val timeGapsValidator = TimeGapsValidator(datePattern, minDate, maxDate) - inputConnection = InputCardExpDateConnection(id, timeGapsValidator) + inputConnection = + InputCardExpDateConnection( + id, + timeGapsValidator + ) val stateContent = FieldContent.CreditCardExpDateContent().apply { if(!text.isNullOrEmpty() && handleInputMode(text.toString())) { diff --git a/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/internal/InfoInputField.kt b/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/internal/InfoInputField.kt index 3ff1c4876..08979973e 100644 --- a/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/internal/InfoInputField.kt +++ b/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/internal/InfoInputField.kt @@ -4,7 +4,7 @@ import android.content.Context import android.text.InputType import com.verygoodsecurity.vgscollect.core.model.state.FieldContent import com.verygoodsecurity.vgscollect.view.card.FieldType -import com.verygoodsecurity.vgscollect.view.card.InputInfoConnection +import com.verygoodsecurity.vgscollect.view.card.conection.InputInfoConnection import com.verygoodsecurity.vgscollect.view.card.validation.InfoValidator /** @suppress */ @@ -14,7 +14,11 @@ internal class InfoInputField(context: Context): BaseInputField(context) { override fun applyFieldType() { val validator = InfoValidator() - inputConnection = InputInfoConnection(id, validator) + inputConnection = + InputInfoConnection( + id, + validator + ) val str = text.toString() val stateContent = FieldContent.InfoContent().apply { diff --git a/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/internal/InputField.kt b/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/internal/InputField.kt index dac126632..671adbc77 100644 --- a/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/internal/InputField.kt +++ b/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/internal/InputField.kt @@ -13,6 +13,11 @@ import com.verygoodsecurity.vgscollect.core.model.state.FieldContent import com.verygoodsecurity.vgscollect.core.storage.DependencyType import com.verygoodsecurity.vgscollect.view.InputFieldView import com.verygoodsecurity.vgscollect.view.card.* +import com.verygoodsecurity.vgscollect.view.card.conection.InputCardCVCConnection +import com.verygoodsecurity.vgscollect.view.card.conection.InputCardExpDateConnection +import com.verygoodsecurity.vgscollect.view.card.conection.InputCardHolderConnection +import com.verygoodsecurity.vgscollect.view.card.conection.InputCardNumberConnection +import com.verygoodsecurity.vgscollect.view.card.conection.InputInfoConnection import com.verygoodsecurity.vgscollect.view.card.filter.CardBrandFilter import com.verygoodsecurity.vgscollect.view.card.filter.CardBrandPreview import com.verygoodsecurity.vgscollect.view.card.filter.DefaultCardBrandFilter @@ -104,7 +109,11 @@ internal class InputField(context: Context): BaseInputField(context), private fun applyInfoFieldType() { validator = InfoValidator() - inputConnection = InputInfoConnection(id, validator) + inputConnection = + InputInfoConnection( + id, + validator + ) val str = text.toString() val stateContent = FieldContent.InfoContent().apply { @@ -122,7 +131,11 @@ internal class InputField(context: Context): BaseInputField(context), private fun applyCardExpDateFieldType() { validator = CardExpDateValidator() - inputConnection = InputCardExpDateConnection(id, validator as CardExpDateValidator) + inputConnection = + InputCardExpDateConnection( + id, + validator as CardExpDateValidator + ) val str = text.toString() val stateContent = FieldContent.InfoContent().apply { @@ -140,8 +153,12 @@ internal class InputField(context: Context): BaseInputField(context), } private fun applyCardHolderFieldType() { - validator = CardHolderValidator() - inputConnection = InputCardHolderConnection(id, validator) + validator = RegexValidator("^[a-zA-Z0-9 ,'.-]+\$") + inputConnection = + InputCardHolderConnection( + id, + validator + ) val str = text.toString() val stateContent = FieldContent.InfoContent().apply { @@ -160,7 +177,11 @@ internal class InputField(context: Context): BaseInputField(context), private fun applyCardCVCFieldType() { validator = CardCVCCodeValidator() - inputConnection = InputCardCVCConnection(id, validator) + inputConnection = + InputCardCVCConnection( + id, + validator + ) val str = text.toString() val stateContent = FieldContent.InfoContent().apply { @@ -183,7 +204,13 @@ internal class InputField(context: Context): BaseInputField(context), validator = CardNumberValidator(divider) - inputConnection = InputCardNumberConnection(id, validator, this, divider) + inputConnection = + InputCardNumberConnection( + id, + validator, + this, + divider + ) val defFilter = DefaultCardBrandFilter(CardType.values(), divider) inputConnection!!.addFilter(defFilter) @@ -217,10 +244,10 @@ internal class InputField(context: Context): BaseInputField(context), } private fun manageLengthDependency(dependency: Dependency) { - val value = dependency.value as Pair - val filterLength = InputFilter.LengthFilter(value.second) + val cvcLength = dependency.value as Array + val filterLength = InputFilter.LengthFilter(cvcLength.last()) filters = arrayOf(CVCValidateFilter(), filterLength) - (inputConnection as? InputCardCVCConnection)?.runtimeValidator = CardCVCCodeValidator(value.first) + (inputConnection as? InputCardCVCConnection)?.runtimeValidator = CardCVCCodeValidator(cvcLength) text = text } diff --git a/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/internal/PersonNameInputField.kt b/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/internal/PersonNameInputField.kt index d0941385c..0394e2ebc 100644 --- a/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/internal/PersonNameInputField.kt +++ b/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/view/internal/PersonNameInputField.kt @@ -5,19 +5,33 @@ import android.os.Build import android.text.InputFilter import android.text.InputType import android.view.View +import com.verygoodsecurity.vgscollect.R import com.verygoodsecurity.vgscollect.core.model.state.FieldContent import com.verygoodsecurity.vgscollect.view.card.FieldType -import com.verygoodsecurity.vgscollect.view.card.InputCardHolderConnection -import com.verygoodsecurity.vgscollect.view.card.validation.CardHolderValidator +import com.verygoodsecurity.vgscollect.view.card.conection.InputCardHolderConnection +import com.verygoodsecurity.vgscollect.view.card.validation.RegexValidator +import com.verygoodsecurity.vgscollect.view.card.validation.CompositeValidator +import com.verygoodsecurity.vgscollect.view.card.validation.MutableValidator +import com.verygoodsecurity.vgscollect.view.card.validation.payment.LengthValidator +import com.verygoodsecurity.vgscollect.view.card.validation.payment.PersonNameRule /** @suppress */ internal class PersonNameInputField(context: Context): BaseInputField(context) { + private val validator : MutableValidator by lazy { + val v = CompositeValidator() + v.addRule(RegexValidator(context.getString(R.string.validation_regex_person))) + v + } + override var fieldType: FieldType = FieldType.CARD_HOLDER_NAME override fun applyFieldType() { - val validator = CardHolderValidator() - inputConnection = InputCardHolderConnection(id, validator) + inputConnection = + InputCardHolderConnection( + id, + validator + ) val str = text.toString() val stateContent = FieldContent.InfoContent().apply { @@ -50,4 +64,15 @@ internal class PersonNameInputField(context: Context): BaseInputField(context) { } } + internal fun applyValidationRule(rule: PersonNameRule) { + validator.clearRules() + rule.length?.let { + validator.addRule(LengthValidator(it)) + } + + rule.regex?.let { + validator.addRule(RegexValidator(it)) + } + } + } \ No newline at end of file diff --git a/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/widget/PersonNameEditText.kt b/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/widget/PersonNameEditText.kt index 5e655ec5f..f298fa4e6 100644 --- a/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/widget/PersonNameEditText.kt +++ b/vgscollect/src/main/java/com/verygoodsecurity/vgscollect/widget/PersonNameEditText.kt @@ -9,6 +9,7 @@ import com.verygoodsecurity.vgscollect.core.model.state.FieldState import com.verygoodsecurity.vgscollect.R import com.verygoodsecurity.vgscollect.view.InputFieldView import com.verygoodsecurity.vgscollect.view.card.FieldType +import com.verygoodsecurity.vgscollect.view.card.validation.payment.PersonNameRule class PersonNameEditText @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0 @@ -76,4 +77,11 @@ class PersonNameEditText @JvmOverloads constructor( fun getState(): FieldState.CardHolderNameState? { return getCardHolderName() } + + /** + * Adds a behaviour rule for the field. + */ + fun addRule(rule: PersonNameRule) { + applyValidationRule(rule) + } } \ No newline at end of file diff --git a/vgscollect/src/main/res/values/strings.xml b/vgscollect/src/main/res/values/strings.xml index 15a0f98f2..0981fc1b5 100644 --- a/vgscollect/src/main/res/values/strings.xml +++ b/vgscollect/src/main/res/values/strings.xml @@ -13,4 +13,5 @@ Divider for card number can\'t a digit. (%1$s) 0123456789 + ^[a-zA-Z0-9 ,\'.-]+$ diff --git a/vgscollect/src/test/java/com/verygoodsecurity/vgscollect/VGSFieldStateTest.kt b/vgscollect/src/test/java/com/verygoodsecurity/vgscollect/VGSFieldStateTest.kt index 8633e3766..a8d6dbf91 100644 --- a/vgscollect/src/test/java/com/verygoodsecurity/vgscollect/VGSFieldStateTest.kt +++ b/vgscollect/src/test/java/com/verygoodsecurity/vgscollect/VGSFieldStateTest.kt @@ -128,7 +128,7 @@ class VGSFieldStateTest { val c = (newState as FieldState.CardNumberState) - assertTrue(c.last == "5") + assertTrue(c.last == "2345") } @Test diff --git a/vgscollect/src/test/java/com/verygoodsecurity/vgscollect/card/CustomBrandTest.kt b/vgscollect/src/test/java/com/verygoodsecurity/vgscollect/card/CustomBrandTest.kt index c6ceadf8a..848ce2bd4 100644 --- a/vgscollect/src/test/java/com/verygoodsecurity/vgscollect/card/CustomBrandTest.kt +++ b/vgscollect/src/test/java/com/verygoodsecurity/vgscollect/card/CustomBrandTest.kt @@ -1,25 +1,52 @@ package com.verygoodsecurity.vgscollect.card import com.verygoodsecurity.vgscollect.R +import com.verygoodsecurity.vgscollect.view.card.BrandParams +import com.verygoodsecurity.vgscollect.view.card.ChecksumAlgorithm import com.verygoodsecurity.vgscollect.view.card.CustomCardBrand -import org.junit.Assert +import org.junit.Assert.assertArrayEquals +import org.junit.Assert.assertEquals import org.junit.Test class CustomBrandTest { + @Test + fun test_custom_brand_params_full() { + val mask = "### ### ### #####" + val alg = ChecksumAlgorithm.LUHN + val rangeNumber = arrayOf(14,16,19) + val rangeCVC = arrayOf(3,5) + + val params = BrandParams(mask, alg, rangeNumber, rangeCVC) + + assertEquals(alg, params.algorithm) + assertEquals(mask, params.mask) + assertArrayEquals(rangeNumber, params.rangeNumber) + assertArrayEquals(rangeCVC, params.rangeCVV) + } + @Test fun test_custom_brand_full() { + val mask = "### ### ### #####" + val alg = ChecksumAlgorithm.LUHN + val rangeNumber = arrayOf(14,16,19) + val rangeCVC = arrayOf(3,5) + val params = BrandParams(mask, alg, rangeNumber, rangeCVC) + val regex = "^12333" val name = "VG_Search" val resId = R.drawable.ic_card_front_preview_dark - val mask = "### ### ### #####" - val brand = CustomCardBrand(regex, name, resId, mask) + val brand = CustomCardBrand(regex, name, resId, params) - Assert.assertEquals(regex, brand.regex) - Assert.assertEquals(name, brand.cardBrandName) - Assert.assertEquals(mask, brand.mask) - Assert.assertEquals(resId, brand.drawableResId) + assertEquals(regex, brand.regex) + assertEquals(name, brand.cardBrandName) + assertEquals(resId, brand.drawableResId) + + assertEquals(alg, brand.params.algorithm) + assertEquals(mask, brand.params.mask) + assertArrayEquals(rangeNumber, brand.params.rangeNumber) + assertArrayEquals(rangeCVC, brand.params.rangeCVV) } @Test @@ -29,10 +56,10 @@ class CustomBrandTest { val brand = CustomCardBrand(regex, name) - Assert.assertEquals(regex, brand.regex) - Assert.assertEquals(name, brand.cardBrandName) - Assert.assertEquals("#### #### #### #### ###", brand.mask) - Assert.assertEquals(0, brand.drawableResId) + assertEquals(regex, brand.regex) + assertEquals(name, brand.cardBrandName) + assertEquals("#### #### #### #### ###", brand.params.mask) + assertEquals(0, brand.drawableResId) } @Test @@ -41,12 +68,11 @@ class CustomBrandTest { val name = "VG_Search" val mask = "### ### ### #####" - val brand = CustomCardBrand(regex, name, mask = mask) + val brand = CustomCardBrand(regex, name) - Assert.assertEquals(regex, brand.regex) - Assert.assertEquals(name, brand.cardBrandName) - Assert.assertEquals(mask, brand.mask) - Assert.assertEquals(0, brand.drawableResId) + assertEquals(regex, brand.regex) + assertEquals(name, brand.cardBrandName) + assertEquals(0, brand.drawableResId) } @Test @@ -57,9 +83,9 @@ class CustomBrandTest { val brand = CustomCardBrand(regex, name, resId) - Assert.assertEquals(regex, brand.regex) - Assert.assertEquals(name, brand.cardBrandName) - Assert.assertEquals("#### #### #### #### ###", brand.mask) - Assert.assertEquals(resId, brand.drawableResId) + assertEquals(regex, brand.regex) + assertEquals(name, brand.cardBrandName) + assertEquals("#### #### #### #### ###", brand.params.mask) + assertEquals(resId, brand.drawableResId) } } \ No newline at end of file diff --git a/vgscollect/src/test/java/com/verygoodsecurity/vgscollect/card/connection/InputCardCVCConnectionTest.kt b/vgscollect/src/test/java/com/verygoodsecurity/vgscollect/card/connection/InputCardCVCConnectionTest.kt index ca450b4ec..c7c8407d7 100644 --- a/vgscollect/src/test/java/com/verygoodsecurity/vgscollect/card/connection/InputCardCVCConnectionTest.kt +++ b/vgscollect/src/test/java/com/verygoodsecurity/vgscollect/card/connection/InputCardCVCConnectionTest.kt @@ -3,8 +3,8 @@ package com.verygoodsecurity.vgscollect.card.connection import com.verygoodsecurity.vgscollect.core.OnVgsViewStateChangeListener import com.verygoodsecurity.vgscollect.core.model.state.FieldContent import com.verygoodsecurity.vgscollect.core.model.state.VGSFieldState -import com.verygoodsecurity.vgscollect.view.card.InputCardCVCConnection -import com.verygoodsecurity.vgscollect.view.card.InputRunnable +import com.verygoodsecurity.vgscollect.view.card.conection.InputCardCVCConnection +import com.verygoodsecurity.vgscollect.view.card.conection.InputRunnable import com.verygoodsecurity.vgscollect.view.card.validation.VGSValidator import org.junit.Test import org.mockito.Mockito @@ -14,7 +14,10 @@ class InputCardCVCConnectionTest { val connection: InputRunnable by lazy { val client = mock(VGSValidator::class.java) doReturn(true).`when`(client).isValid(anyString()) - InputCardCVCConnection(0, client) + InputCardCVCConnection( + 0, + client + ) } @Test diff --git a/vgscollect/src/test/java/com/verygoodsecurity/vgscollect/card/connection/InputCardExpDateConnectionTest.kt b/vgscollect/src/test/java/com/verygoodsecurity/vgscollect/card/connection/InputCardExpDateConnectionTest.kt index 558845f44..f9a9a4090 100644 --- a/vgscollect/src/test/java/com/verygoodsecurity/vgscollect/card/connection/InputCardExpDateConnectionTest.kt +++ b/vgscollect/src/test/java/com/verygoodsecurity/vgscollect/card/connection/InputCardExpDateConnectionTest.kt @@ -3,8 +3,8 @@ package com.verygoodsecurity.vgscollect.card.connection import com.verygoodsecurity.vgscollect.core.OnVgsViewStateChangeListener import com.verygoodsecurity.vgscollect.core.model.state.FieldContent import com.verygoodsecurity.vgscollect.core.model.state.VGSFieldState -import com.verygoodsecurity.vgscollect.view.card.InputCardExpDateConnection -import com.verygoodsecurity.vgscollect.view.card.InputRunnable +import com.verygoodsecurity.vgscollect.view.card.conection.InputCardExpDateConnection +import com.verygoodsecurity.vgscollect.view.card.conection.InputRunnable import com.verygoodsecurity.vgscollect.view.card.validation.VGSValidator import org.junit.Assert.assertTrue import org.junit.Test @@ -15,7 +15,10 @@ class InputCardExpDateConnectionTest { val connection: InputRunnable by lazy { val client = Mockito.mock(VGSValidator::class.java) Mockito.doReturn(true).`when`(client).isValid(Mockito.anyString()) - InputCardExpDateConnection(0, client) + InputCardExpDateConnection( + 0, + client + ) } @Test diff --git a/vgscollect/src/test/java/com/verygoodsecurity/vgscollect/card/connection/InputCardHolderConnectionTest.kt b/vgscollect/src/test/java/com/verygoodsecurity/vgscollect/card/connection/InputCardHolderConnectionTest.kt index 2d7be4e77..343c62b9d 100644 --- a/vgscollect/src/test/java/com/verygoodsecurity/vgscollect/card/connection/InputCardHolderConnectionTest.kt +++ b/vgscollect/src/test/java/com/verygoodsecurity/vgscollect/card/connection/InputCardHolderConnectionTest.kt @@ -3,8 +3,8 @@ package com.verygoodsecurity.vgscollect.card.connection import com.verygoodsecurity.vgscollect.core.OnVgsViewStateChangeListener import com.verygoodsecurity.vgscollect.core.model.state.FieldContent import com.verygoodsecurity.vgscollect.core.model.state.VGSFieldState -import com.verygoodsecurity.vgscollect.view.card.InputCardHolderConnection -import com.verygoodsecurity.vgscollect.view.card.InputRunnable +import com.verygoodsecurity.vgscollect.view.card.conection.InputCardHolderConnection +import com.verygoodsecurity.vgscollect.view.card.conection.InputRunnable import com.verygoodsecurity.vgscollect.view.card.validation.VGSValidator import org.junit.Test import org.mockito.ArgumentMatchers.anyInt @@ -14,7 +14,10 @@ class InputCardHolderConnectionTest { val connection: InputRunnable by lazy { val client = Mockito.mock(VGSValidator::class.java) Mockito.doReturn(true).`when`(client).isValid(Mockito.anyString()) - InputCardHolderConnection(0, client) + InputCardHolderConnection( + 0, + client + ) } @Test diff --git a/vgscollect/src/test/java/com/verygoodsecurity/vgscollect/card/connection/InputCardNumberConnectionTest.kt b/vgscollect/src/test/java/com/verygoodsecurity/vgscollect/card/connection/InputCardNumberConnectionTest.kt index ac25ae717..40db1b75d 100644 --- a/vgscollect/src/test/java/com/verygoodsecurity/vgscollect/card/connection/InputCardNumberConnectionTest.kt +++ b/vgscollect/src/test/java/com/verygoodsecurity/vgscollect/card/connection/InputCardNumberConnectionTest.kt @@ -4,8 +4,8 @@ import com.verygoodsecurity.vgscollect.R import com.verygoodsecurity.vgscollect.core.OnVgsViewStateChangeListener import com.verygoodsecurity.vgscollect.core.model.state.FieldContent import com.verygoodsecurity.vgscollect.core.model.state.VGSFieldState -import com.verygoodsecurity.vgscollect.view.card.InputCardNumberConnection -import com.verygoodsecurity.vgscollect.view.card.InputRunnable +import com.verygoodsecurity.vgscollect.view.card.conection.InputCardNumberConnection +import com.verygoodsecurity.vgscollect.view.card.conection.InputRunnable import com.verygoodsecurity.vgscollect.view.card.filter.CardBrandPreview import com.verygoodsecurity.vgscollect.view.card.validation.VGSValidator import com.verygoodsecurity.vgscollect.view.card.CardType @@ -30,7 +30,13 @@ class InputCardNumberConnectionTest { val client = getValidator() iCardBrand = getCardBrandPreviewListener() - connection = InputCardNumberConnection(0, client, iCardBrand, divider) + connection = + InputCardNumberConnection( + 0, + client, + iCardBrand, + divider + ) setupFilter(connection, divider) setupListener(connection) @@ -39,7 +45,11 @@ class InputCardNumberConnectionTest { @Test fun test_connection() { val client = getValidator() - val connection: InputRunnable = InputCardNumberConnection(0, client) + val connection: InputRunnable = + InputCardNumberConnection( + 0, + client + ) setupFilter(connection, null) setupListener(connection) @@ -59,7 +69,12 @@ class InputCardNumberConnectionTest { val divider = "-" val client = getValidator() - val connection: InputRunnable = InputCardNumberConnection(0, client, divider = divider) + val connection: InputRunnable = + InputCardNumberConnection( + 0, + client, + divider = divider + ) setupFilter(connection, divider) setupListener(connection) @@ -85,7 +100,15 @@ class InputCardNumberConnectionTest { connection.run() - Mockito.verify(iCardBrand).onCardBrandPreview(CardBrandPreview(CardType.VISA, CardType.VISA.regex, CardType.VISA.name, CardType.VISA.resId)) + val c = CardBrandPreview(CardType.VISA, + CardType.VISA.regex, + CardType.VISA.name, + CardType.VISA.resId, + CardType.VISA.mask, + CardType.VISA.algorithm, + CardType.VISA.rangeNumber, + CardType.VISA.rangeCVV) + Mockito.verify(iCardBrand).onCardBrandPreview(c) } @Test @@ -113,12 +136,12 @@ class InputCardNumberConnectionTest { @Test fun test_custom_filter() { - val customBrand = CustomCardBrand("^777", "VGS", drawableResId = R.drawable.ic_jcb_light) + val customBrand = CustomCardBrand("^777", "VGS", R.drawable.ic_jcb_light) val preview = CardBrandPreview(CardType.NONE, customBrand.regex, customBrand.cardBrandName, customBrand.drawableResId, - customBrand.mask) + customBrand.params.mask) val filter = mock(MutableCardFilter::class.java) Mockito.doReturn(preview).`when`(filter).detect(any()) @@ -137,7 +160,7 @@ class InputCardNumberConnectionTest { Mockito.verify(stateListener).emit(0, state) } - private fun getCardBrandPreviewListener():InputCardNumberConnection.IDrawCardBrand { + private fun getCardBrandPreviewListener(): InputCardNumberConnection.IDrawCardBrand { return mock(InputCardNumberConnection.IDrawCardBrand::class.java) } diff --git a/vgscollect/src/test/java/com/verygoodsecurity/vgscollect/card/filter/CardBrandFilterTest.kt b/vgscollect/src/test/java/com/verygoodsecurity/vgscollect/card/filter/CardBrandFilterTest.kt index d37d97c0b..a6e034b9a 100644 --- a/vgscollect/src/test/java/com/verygoodsecurity/vgscollect/card/filter/CardBrandFilterTest.kt +++ b/vgscollect/src/test/java/com/verygoodsecurity/vgscollect/card/filter/CardBrandFilterTest.kt @@ -1,6 +1,7 @@ package com.verygoodsecurity.vgscollect.card.filter import com.verygoodsecurity.vgscollect.R +import com.verygoodsecurity.vgscollect.view.card.BrandParams import com.verygoodsecurity.vgscollect.view.card.CardType import com.verygoodsecurity.vgscollect.view.card.CustomCardBrand import com.verygoodsecurity.vgscollect.view.card.filter.CardBrandFilter @@ -48,9 +49,11 @@ class CardBrandFilterTest { val regex = "^12333" val name = "VG_Search" val resId = R.drawable.ic_card_front_preview_dark + val mask = "### ### ### #####" + val params = BrandParams(mask) - val c1 = CustomCardBrand(regex, name, resId, mask) + val c1 = CustomCardBrand(regex, name, resId, params) filter.add(c1) @@ -85,9 +88,11 @@ class CardBrandFilterTest { val regex = "^12333" val name = "VG_Search" val resId = R.drawable.ic_card_front_preview_dark + val mask = "### ### ### #####" + val params = BrandParams(mask) - val c1 = CustomCardBrand(regex, name, resId, mask) + val c1 = CustomCardBrand(regex, name, resId, params) filter.add(c1) diff --git a/vgscollect/src/test/java/com/verygoodsecurity/vgscollect/card/validator/CardHolderValidatorTest.kt b/vgscollect/src/test/java/com/verygoodsecurity/vgscollect/card/validator/CardHolderValidatorTest.kt index 54986d255..ba3b1260d 100644 --- a/vgscollect/src/test/java/com/verygoodsecurity/vgscollect/card/validator/CardHolderValidatorTest.kt +++ b/vgscollect/src/test/java/com/verygoodsecurity/vgscollect/card/validator/CardHolderValidatorTest.kt @@ -1,12 +1,18 @@ package com.verygoodsecurity.vgscollect.card.validator -import com.verygoodsecurity.vgscollect.view.card.validation.CardHolderValidator +import com.verygoodsecurity.vgscollect.view.card.validation.RegexValidator import org.junit.Assert.assertFalse import org.junit.Assert.assertTrue +import org.junit.Before import org.junit.Test class CardHolderValidatorTest { - private val validator = CardHolderValidator() + private lateinit var validator:RegexValidator + + @Before + fun setupValidator() { + validator = RegexValidator("^[a-zA-Z0-9 ,'.-]+\$") + } @Test fun name_with_special_symbols() { @@ -21,6 +27,30 @@ class CardHolderValidatorTest { @Test fun name_dafault() { assertTrue(validator.isValid("abra cadabra")) + assertTrue(validator.isValid("abra cadab ra")) + } + + @Test + fun test_custom_regex() { + validator.setRegex("^([a-zA-Z]{2,}\\s[a-zA-z]{1,})\$") + + assertFalse(validator.isValid("abra")) + assertTrue(validator.isValid("abra cadabra")) + assertFalse(validator.isValid("abra cadab ra")) + assertFalse(validator.isValid("qq aa$")) + } + + @Test + fun testEmptyValidator() { + val validator = RegexValidator() + + assertTrue(validator.isValid("")) + assertTrue(validator.isValid(null)) + assertTrue(validator.isValid("abra")) + assertTrue(validator.isValid("abra cadabra")) + assertTrue(validator.isValid("abra cadab ra")) + assertTrue(validator.isValid("qq aa$")) + assertTrue(validator.isValid("( * 2q aa$")) } } \ No newline at end of file diff --git a/vgscollect/src/test/java/com/verygoodsecurity/vgscollect/card/validator/LengthValidatorTest.kt b/vgscollect/src/test/java/com/verygoodsecurity/vgscollect/card/validator/LengthValidatorTest.kt new file mode 100644 index 000000000..50bd26437 --- /dev/null +++ b/vgscollect/src/test/java/com/verygoodsecurity/vgscollect/card/validator/LengthValidatorTest.kt @@ -0,0 +1,38 @@ +package com.verygoodsecurity.vgscollect.card.validator + +import com.verygoodsecurity.vgscollect.view.card.validation.payment.LengthValidator +import org.junit.Assert.assertFalse +import org.junit.Assert.assertTrue +import org.junit.Before +import org.junit.Test + +class LengthValidatorTest { + private lateinit var validator: LengthValidator + + @Before + fun setupValidator() { + val array = (7..12).toMutableList().toTypedArray() + validator = LengthValidator(array) + } + + @Test + fun test_less() { + assertFalse(validator.isValid("123abc")) + assertFalse(validator.isValid("val")) + } + + @Test + fun test_valid() { + assertTrue(validator.isValid("123 890 t")) + assertTrue(validator.isValid("123 890 te")) + assertTrue(validator.isValid("123 890 tes")) + assertTrue(validator.isValid("123 890 test")) + } + + @Test + fun test_more() { + assertFalse(validator.isValid("123 890 test tes")) + assertFalse(validator.isValid("123 890 test test")) + } + +} \ No newline at end of file diff --git a/vgscollect/src/test/java/com/verygoodsecurity/vgscollect/card/validator/luhn/AmexDelegateTest.kt b/vgscollect/src/test/java/com/verygoodsecurity/vgscollect/card/validator/luhn/AmexDelegateTest.kt index 8ab221c70..5b1931fb6 100644 --- a/vgscollect/src/test/java/com/verygoodsecurity/vgscollect/card/validator/luhn/AmexDelegateTest.kt +++ b/vgscollect/src/test/java/com/verygoodsecurity/vgscollect/card/validator/luhn/AmexDelegateTest.kt @@ -1,14 +1,14 @@ package com.verygoodsecurity.vgscollect.card.validator.luhn -import com.verygoodsecurity.vgscollect.view.card.validation.card.brand.AmexDelegate +import com.verygoodsecurity.vgscollect.view.card.validation.card.brand.CardBrandDelegate import org.junit.Assert.assertTrue import org.junit.Test -class AmexDelegateTest { +class CardBrandDelegateTest { @Test fun detectAmex1() { - val amex = AmexDelegate() + val amex = CardBrandDelegate() val state = amex.isValid("370000000000002") @@ -17,7 +17,7 @@ class AmexDelegateTest { @Test fun detectAmex2() { - val amex = AmexDelegate() + val amex = CardBrandDelegate() val state = amex.isValid("378282246310005") @@ -26,7 +26,7 @@ class AmexDelegateTest { @Test fun detectAmex3() { - val amex = AmexDelegate() + val amex = CardBrandDelegate() val state = amex.isValid("371449635398431") @@ -35,7 +35,7 @@ class AmexDelegateTest { @Test fun detectAmex4() { - val amex = AmexDelegate() + val amex = CardBrandDelegate() val state = amex.isValid("378734493671000") @@ -44,7 +44,7 @@ class AmexDelegateTest { @Test fun detectAmex5() { - val amex = AmexDelegate() + val amex = CardBrandDelegate() val state = amex.isValid("374111111111111") @@ -53,7 +53,7 @@ class AmexDelegateTest { @Test fun detectAmex6() { - val amex = AmexDelegate() + val amex = CardBrandDelegate() val state = amex.isValid("373953192351004") @@ -62,7 +62,7 @@ class AmexDelegateTest { @Test fun detectAmex7() { - val amex = AmexDelegate() + val amex = CardBrandDelegate() val state = amex.isValid("346018484777573") @@ -71,7 +71,7 @@ class AmexDelegateTest { @Test fun detectAmex8() { - val amex = AmexDelegate() + val amex = CardBrandDelegate() val state = amex.isValid("374101000000608") @@ -80,7 +80,7 @@ class AmexDelegateTest { @Test fun detectAmex9() { - val amex = AmexDelegate() + val amex = CardBrandDelegate() val state = amex.isValid("376525000000010") @@ -89,7 +89,7 @@ class AmexDelegateTest { @Test fun detectAmex10() { - val amex = AmexDelegate() + val amex = CardBrandDelegate() val state = amex.isValid("375425000000907") @@ -98,7 +98,7 @@ class AmexDelegateTest { @Test fun detectAmex11() { - val amex = AmexDelegate() + val amex = CardBrandDelegate() val state = amex.isValid("343452000000306") @@ -107,7 +107,7 @@ class AmexDelegateTest { @Test fun detectAmex12() { - val amex = AmexDelegate() + val amex = CardBrandDelegate() val state = amex.isValid("372349000000852") diff --git a/vgscollect/src/test/java/com/verygoodsecurity/vgscollect/card/validator/luhn/DankoftDelegateTest.kt b/vgscollect/src/test/java/com/verygoodsecurity/vgscollect/card/validator/luhn/DankoftDelegateTest.kt index 57041a3ab..dae4a7797 100644 --- a/vgscollect/src/test/java/com/verygoodsecurity/vgscollect/card/validator/luhn/DankoftDelegateTest.kt +++ b/vgscollect/src/test/java/com/verygoodsecurity/vgscollect/card/validator/luhn/DankoftDelegateTest.kt @@ -1,6 +1,6 @@ package com.verygoodsecurity.vgscollect.card.validator.luhn -import com.verygoodsecurity.vgscollect.view.card.validation.card.brand.DankortDelegate +import com.verygoodsecurity.vgscollect.view.card.validation.card.brand.CardBrandDelegate import org.junit.Assert import org.junit.Test @@ -8,7 +8,7 @@ class DankoftDelegateTest { @Test fun detectDankoft1() { - val dank = DankortDelegate() + val dank = CardBrandDelegate() val state = dank.isValid("5019717010103742") @@ -17,7 +17,7 @@ class DankoftDelegateTest { @Test fun detectDankoft2() { - val dank = DankortDelegate() + val dank = CardBrandDelegate() val state = dank.isValid("4444444444444000") @@ -26,7 +26,7 @@ class DankoftDelegateTest { @Test fun detectDankoft3() { - val dank = DankortDelegate() + val dank = CardBrandDelegate() val state = dank.isValid("5019555544445555") @@ -35,7 +35,7 @@ class DankoftDelegateTest { @Test fun detectDankoft4() { - val dank = DankortDelegate() + val dank = CardBrandDelegate() val state = dank.isValid("4571740000000002") @@ -44,7 +44,7 @@ class DankoftDelegateTest { @Test fun detectDankoft5() { - val dank = DankortDelegate() + val dank = CardBrandDelegate() val state = dank.isValid("5019200000000004") @@ -53,7 +53,7 @@ class DankoftDelegateTest { @Test fun detectDankoft6() { - val dank = DankortDelegate() + val dank = CardBrandDelegate() val state = dank.isValid("50194500000005") diff --git a/vgscollect/src/test/java/com/verygoodsecurity/vgscollect/card/validator/luhn/DinersClubDelegateTest.kt b/vgscollect/src/test/java/com/verygoodsecurity/vgscollect/card/validator/luhn/DinersClubDelegateTest.kt index 077aa6de9..e9797e6ee 100644 --- a/vgscollect/src/test/java/com/verygoodsecurity/vgscollect/card/validator/luhn/DinersClubDelegateTest.kt +++ b/vgscollect/src/test/java/com/verygoodsecurity/vgscollect/card/validator/luhn/DinersClubDelegateTest.kt @@ -1,6 +1,6 @@ package com.verygoodsecurity.vgscollect.card.validator.luhn -import com.verygoodsecurity.vgscollect.view.card.validation.card.brand.DinersClubDelegate +import com.verygoodsecurity.vgscollect.view.card.validation.card.brand.CardBrandDelegate import org.junit.Assert.assertTrue import org.junit.Test @@ -8,7 +8,7 @@ class DinersClubDelegateTest { @Test fun detectDinersClub_1() { - val dinClub = DinersClubDelegate() + val dinClub = CardBrandDelegate() val state = dinClub.isValid("30569309025904") @@ -17,7 +17,7 @@ class DinersClubDelegateTest { @Test fun detectDinersClub_2() { - val dinClub = DinersClubDelegate() + val dinClub = CardBrandDelegate() val state = dinClub.isValid("38520000023237") @@ -26,7 +26,7 @@ class DinersClubDelegateTest { @Test fun detectDinersClub_3() { - val dinClub = DinersClubDelegate() + val dinClub = CardBrandDelegate() val state = dinClub.isValid("38000000000006") @@ -35,7 +35,7 @@ class DinersClubDelegateTest { @Test fun detectDinersClub_4() { - val dinClub = DinersClubDelegate() + val dinClub = CardBrandDelegate() val state = dinClub.isValid("36256000000725") @@ -44,7 +44,7 @@ class DinersClubDelegateTest { @Test fun detectDinersClub_5() { - val dinClub = DinersClubDelegate() + val dinClub = CardBrandDelegate() val state = dinClub.isValid("36256000000998") @@ -53,7 +53,7 @@ class DinersClubDelegateTest { @Test fun detectDinersClub_6() { - val dinClub = DinersClubDelegate() + val dinClub = CardBrandDelegate() val state = dinClub.isValid("36256000000634") @@ -62,7 +62,7 @@ class DinersClubDelegateTest { @Test fun detectDinersClub_7() { - val dinClub = DinersClubDelegate() + val dinClub = CardBrandDelegate() val state = dinClub.isValid("38865000000705") @@ -71,7 +71,7 @@ class DinersClubDelegateTest { @Test fun detectDinersClub_8() { - val dinClub = DinersClubDelegate() + val dinClub = CardBrandDelegate() val state = dinClub.isValid("30450000000985") @@ -80,7 +80,7 @@ class DinersClubDelegateTest { @Test fun detectDinersClub_9() { - val dinClub = DinersClubDelegate() + val dinClub = CardBrandDelegate() val state = dinClub.isValid("36700102000000") @@ -89,7 +89,7 @@ class DinersClubDelegateTest { @Test fun detectDinersClub_10() { - val dinClub = DinersClubDelegate() + val dinClub = CardBrandDelegate() val state = dinClub.isValid("36148900647913") diff --git a/vgscollect/src/test/java/com/verygoodsecurity/vgscollect/card/validator/luhn/DiscoverDelegateTest.kt b/vgscollect/src/test/java/com/verygoodsecurity/vgscollect/card/validator/luhn/DiscoverDelegateTest.kt index 613415dc9..0b92ddf5d 100644 --- a/vgscollect/src/test/java/com/verygoodsecurity/vgscollect/card/validator/luhn/DiscoverDelegateTest.kt +++ b/vgscollect/src/test/java/com/verygoodsecurity/vgscollect/card/validator/luhn/DiscoverDelegateTest.kt @@ -1,6 +1,6 @@ package com.verygoodsecurity.vgscollect.card.validator.luhn -import com.verygoodsecurity.vgscollect.view.card.validation.card.brand.DiscoverDelegate +import com.verygoodsecurity.vgscollect.view.card.validation.card.brand.CardBrandDelegate import org.junit.Assert.assertTrue import org.junit.Test @@ -8,7 +8,7 @@ class DiscoverDelegateTest { @Test fun detectDiscover1() { - val discover = DiscoverDelegate() + val discover = CardBrandDelegate() val state = discover.isValid("6011000000000004") @@ -17,7 +17,7 @@ class DiscoverDelegateTest { @Test fun detectDiscover2() { - val discover = DiscoverDelegate() + val discover = CardBrandDelegate() val state = discover.isValid("6011111111111117") @@ -26,7 +26,7 @@ class DiscoverDelegateTest { @Test fun detectDiscover3() { - val discover = DiscoverDelegate() + val discover = CardBrandDelegate() val state = discover.isValid("6011000990139424") @@ -35,7 +35,7 @@ class DiscoverDelegateTest { @Test fun detectDiscover4() { - val discover = DiscoverDelegate() + val discover = CardBrandDelegate() val state = discover.isValid("6011000400000000") @@ -44,7 +44,7 @@ class DiscoverDelegateTest { @Test fun detectDiscover5() { - val discover = DiscoverDelegate() + val discover = CardBrandDelegate() val state = discover.isValid("6011000000000087") @@ -53,7 +53,7 @@ class DiscoverDelegateTest { @Test fun detectDiscover6() { - val discover = DiscoverDelegate() + val discover = CardBrandDelegate() val state = discover.isValid("6011000000001010") @@ -62,7 +62,7 @@ class DiscoverDelegateTest { @Test fun detectDiscover7() { - val discover = DiscoverDelegate() + val discover = CardBrandDelegate() val state = discover.isValid("6011000000001028") @@ -71,7 +71,7 @@ class DiscoverDelegateTest { @Test fun detectDiscover8() { - val discover = DiscoverDelegate() + val discover = CardBrandDelegate() val state = discover.isValid("6011000000001036") @@ -80,7 +80,7 @@ class DiscoverDelegateTest { @Test fun detectDiscover9() { - val discover = DiscoverDelegate() + val discover = CardBrandDelegate() val state = discover.isValid("6011000000002000") @@ -89,7 +89,7 @@ class DiscoverDelegateTest { @Test fun detectDiscover10() { - val discover = DiscoverDelegate() + val discover = CardBrandDelegate() val state = discover.isValid("6011000000000012") diff --git a/vgscollect/src/test/java/com/verygoodsecurity/vgscollect/card/validator/luhn/EloDelegateTest.kt b/vgscollect/src/test/java/com/verygoodsecurity/vgscollect/card/validator/luhn/EloDelegateTest.kt index ac68191a1..7cb4d26d1 100644 --- a/vgscollect/src/test/java/com/verygoodsecurity/vgscollect/card/validator/luhn/EloDelegateTest.kt +++ b/vgscollect/src/test/java/com/verygoodsecurity/vgscollect/card/validator/luhn/EloDelegateTest.kt @@ -1,6 +1,6 @@ package com.verygoodsecurity.vgscollect.card.validator.luhn -import com.verygoodsecurity.vgscollect.view.card.validation.card.brand.EloDelegate +import com.verygoodsecurity.vgscollect.view.card.validation.card.brand.CardBrandDelegate import org.junit.Assert import org.junit.Test @@ -8,7 +8,7 @@ class EloDelegateTest { @Test fun detectElo1() { - val elo = EloDelegate() + val elo = CardBrandDelegate() val state = elo.isValid("5066991111111118") @@ -17,7 +17,7 @@ class EloDelegateTest { @Test fun detectElo2() { - val elo = EloDelegate() + val elo = CardBrandDelegate() val state = elo.isValid("6362970000457013") @@ -26,7 +26,7 @@ class EloDelegateTest { @Test fun detectElo3() { - val elo = EloDelegate() + val elo = CardBrandDelegate() val state = elo.isValid("5067310000000010") @@ -35,7 +35,7 @@ class EloDelegateTest { @Test fun detectElo4() { - val elo = EloDelegate() + val elo = CardBrandDelegate() val state = elo.isValid("5067312520593847") diff --git a/vgscollect/src/test/java/com/verygoodsecurity/vgscollect/card/validator/luhn/ForbrugsforeningenDelegateTest.kt b/vgscollect/src/test/java/com/verygoodsecurity/vgscollect/card/validator/luhn/ForbrugsforeningenDelegateTest.kt index d0ed7428e..2ec422c08 100644 --- a/vgscollect/src/test/java/com/verygoodsecurity/vgscollect/card/validator/luhn/ForbrugsforeningenDelegateTest.kt +++ b/vgscollect/src/test/java/com/verygoodsecurity/vgscollect/card/validator/luhn/ForbrugsforeningenDelegateTest.kt @@ -1,6 +1,6 @@ package com.verygoodsecurity.vgscollect.card.validator.luhn -import com.verygoodsecurity.vgscollect.view.card.validation.card.brand.ForbrugsforeningenDelegate +import com.verygoodsecurity.vgscollect.view.card.validation.card.brand.CardBrandDelegate import org.junit.Assert import org.junit.Test @@ -8,7 +8,7 @@ class ForbrugsforeningenDelegateTest { @Test fun detectForbrugsforeningen1() { - val forb = ForbrugsforeningenDelegate() + val forb = CardBrandDelegate() val state = forb.isValid("6007220000000004") diff --git a/vgscollect/src/test/java/com/verygoodsecurity/vgscollect/card/validator/luhn/HipercardDelegateTest.kt b/vgscollect/src/test/java/com/verygoodsecurity/vgscollect/card/validator/luhn/HipercardDelegateTest.kt index 1feb8f3a6..3aad39893 100644 --- a/vgscollect/src/test/java/com/verygoodsecurity/vgscollect/card/validator/luhn/HipercardDelegateTest.kt +++ b/vgscollect/src/test/java/com/verygoodsecurity/vgscollect/card/validator/luhn/HipercardDelegateTest.kt @@ -1,6 +1,6 @@ package com.verygoodsecurity.vgscollect.card.validator.luhn -import com.verygoodsecurity.vgscollect.view.card.validation.card.brand.HipercardDelegate +import com.verygoodsecurity.vgscollect.view.card.validation.card.brand.CardBrandDelegate import org.junit.Assert import org.junit.Test @@ -8,7 +8,7 @@ class HipercardDelegateTest { @Test fun detectHipercard1() { - val hipercard = HipercardDelegate() + val hipercard = CardBrandDelegate() val state = hipercard.isValid("6062828888666688") @@ -17,7 +17,7 @@ class HipercardDelegateTest { @Test fun detectHipercard2() { - val hipercard = HipercardDelegate() + val hipercard = CardBrandDelegate() val state = hipercard.isValid("6062826786276634") @@ -26,7 +26,7 @@ class HipercardDelegateTest { @Test fun detectHipercard3() { - val hipercard = HipercardDelegate() + val hipercard = CardBrandDelegate() val state = hipercard.isValid("6062826786276634") @@ -35,7 +35,7 @@ class HipercardDelegateTest { @Test fun detectHipercard4() { - val hipercard = HipercardDelegate() + val hipercard = CardBrandDelegate() val state = hipercard.isValid("6062828888666688") diff --git a/vgscollect/src/test/java/com/verygoodsecurity/vgscollect/card/validator/luhn/JCBDelegateTest.kt b/vgscollect/src/test/java/com/verygoodsecurity/vgscollect/card/validator/luhn/JCBDelegateTest.kt index e9c74d16c..f0c9d8306 100644 --- a/vgscollect/src/test/java/com/verygoodsecurity/vgscollect/card/validator/luhn/JCBDelegateTest.kt +++ b/vgscollect/src/test/java/com/verygoodsecurity/vgscollect/card/validator/luhn/JCBDelegateTest.kt @@ -1,6 +1,6 @@ package com.verygoodsecurity.vgscollect.card.validator.luhn -import com.verygoodsecurity.vgscollect.view.card.validation.card.brand.JcbDelegate +import com.verygoodsecurity.vgscollect.view.card.validation.card.brand.CardBrandDelegate import org.junit.Assert.assertTrue import org.junit.Test @@ -8,7 +8,7 @@ class JCBDelegateTest { @Test fun detectJcb1() { - val jcb16 = JcbDelegate() + val jcb16 = CardBrandDelegate() val state = jcb16.isValid("3088000000000017") @@ -17,7 +17,7 @@ class JCBDelegateTest { @Test fun detectJcb2() { - val jcb16 = JcbDelegate() + val jcb16 = CardBrandDelegate() val state = jcb16.isValid("3530111333300000") @@ -26,7 +26,7 @@ class JCBDelegateTest { @Test fun detectJcb3() { - val jcb16 = JcbDelegate() + val jcb16 = CardBrandDelegate() val state = jcb16.isValid("3566002020360505") @@ -35,7 +35,7 @@ class JCBDelegateTest { @Test fun detectJcb4() { - val jcb16 = JcbDelegate() + val jcb16 = CardBrandDelegate() val state = jcb16.isValid("356600202036050013") @@ -44,7 +44,7 @@ class JCBDelegateTest { @Test fun detectJcb5() { - val jcb16 = JcbDelegate() + val jcb16 = CardBrandDelegate() val state = jcb16.isValid("3566111111111113") @@ -53,7 +53,7 @@ class JCBDelegateTest { @Test fun detectJcb6() { - val jcb16 = JcbDelegate() + val jcb16 = CardBrandDelegate() val state = jcb16.isValid("3566000000000000") @@ -62,7 +62,7 @@ class JCBDelegateTest { @Test fun detectJcb7() { - val jcb16 = JcbDelegate() + val jcb16 = CardBrandDelegate() val state = jcb16.isValid("3566000000001016") @@ -71,7 +71,7 @@ class JCBDelegateTest { @Test fun detectJcb8() { - val jcb16 = JcbDelegate() + val jcb16 = CardBrandDelegate() val state = jcb16.isValid("3566000000001024") @@ -80,7 +80,7 @@ class JCBDelegateTest { @Test fun detectJcb9() { - val jcb16 = JcbDelegate() + val jcb16 = CardBrandDelegate() val state = jcb16.isValid("3566000000001032") @@ -89,7 +89,7 @@ class JCBDelegateTest { @Test fun detectJcb10() { - val jcb16 = JcbDelegate() + val jcb16 = CardBrandDelegate() val state = jcb16.isValid("3566000000002006") @@ -98,7 +98,7 @@ class JCBDelegateTest { @Test fun detectJcb11() { - val jcb16 = JcbDelegate() + val jcb16 = CardBrandDelegate() val state = jcb16.isValid("3569990000000009") @@ -107,7 +107,7 @@ class JCBDelegateTest { @Test fun detectJcb12() { - val jcb16 = JcbDelegate() + val jcb16 = CardBrandDelegate() val state = jcb16.isValid("3528000700000000") diff --git a/vgscollect/src/test/java/com/verygoodsecurity/vgscollect/card/validator/luhn/MaestroDelegateTest.kt b/vgscollect/src/test/java/com/verygoodsecurity/vgscollect/card/validator/luhn/MaestroDelegateTest.kt index 6bd330e3f..ccba81547 100644 --- a/vgscollect/src/test/java/com/verygoodsecurity/vgscollect/card/validator/luhn/MaestroDelegateTest.kt +++ b/vgscollect/src/test/java/com/verygoodsecurity/vgscollect/card/validator/luhn/MaestroDelegateTest.kt @@ -1,6 +1,6 @@ package com.verygoodsecurity.vgscollect.card.validator.luhn -import com.verygoodsecurity.vgscollect.view.card.validation.card.brand.MaestroDelegate +import com.verygoodsecurity.vgscollect.view.card.validation.card.brand.CardBrandDelegate import org.junit.Assert import org.junit.Test @@ -8,7 +8,7 @@ class MaestroDelegateTest { @Test fun detectMaestro1() { - val maestro = MaestroDelegate() + val maestro = CardBrandDelegate() val state = maestro.isValid("6771798021000008") @@ -17,7 +17,7 @@ class MaestroDelegateTest { @Test fun detectMaestro2() { - val maestro = MaestroDelegate() + val maestro = CardBrandDelegate() val state = maestro.isValid("5000550000000029") @@ -26,7 +26,7 @@ class MaestroDelegateTest { @Test fun detectMaestro3() { - val maestro = MaestroDelegate() + val maestro = CardBrandDelegate() val state = maestro.isValid("6771830999991239") @@ -35,7 +35,7 @@ class MaestroDelegateTest { @Test fun detectMaestro4() { - val maestro = MaestroDelegate() + val maestro = CardBrandDelegate() val state = maestro.isValid("6771830000000000006") @@ -44,7 +44,7 @@ class MaestroDelegateTest { @Test fun detectMaestro5() { - val maestro = MaestroDelegate() + val maestro = CardBrandDelegate() val state = maestro.isValid("6759649826438453") @@ -53,7 +53,7 @@ class MaestroDelegateTest { @Test fun detectMaestro6() { - val maestro = MaestroDelegate() + val maestro = CardBrandDelegate() val state = maestro.isValid("6759000000000000005") @@ -62,7 +62,7 @@ class MaestroDelegateTest { @Test fun detectMaestro7() { - val maestro = MaestroDelegate() + val maestro = CardBrandDelegate() val state = maestro.isValid("6799990100000000019") @@ -71,7 +71,7 @@ class MaestroDelegateTest { @Test fun detectMaestro8() { - val maestro = MaestroDelegate() + val maestro = CardBrandDelegate() val state = maestro.isValid("5001630000000002") @@ -80,7 +80,7 @@ class MaestroDelegateTest { @Test fun detectMaestro9() { - val maestro = MaestroDelegate() + val maestro = CardBrandDelegate() val state = maestro.isValid("5016590000000001") @@ -89,7 +89,7 @@ class MaestroDelegateTest { @Test fun detectMaestro10() { - val maestro = MaestroDelegate() + val maestro = CardBrandDelegate() val state = maestro.isValid("5020620000000000") @@ -98,7 +98,7 @@ class MaestroDelegateTest { @Test fun detectMaestro11() { - val maestro = MaestroDelegate() + val maestro = CardBrandDelegate() val state = maestro.isValid("5612370000000006") diff --git a/vgscollect/src/test/java/com/verygoodsecurity/vgscollect/card/validator/luhn/MastercardDelegateTest.kt b/vgscollect/src/test/java/com/verygoodsecurity/vgscollect/card/validator/luhn/MastercardDelegateTest.kt index 1c9d88424..984265c18 100644 --- a/vgscollect/src/test/java/com/verygoodsecurity/vgscollect/card/validator/luhn/MastercardDelegateTest.kt +++ b/vgscollect/src/test/java/com/verygoodsecurity/vgscollect/card/validator/luhn/MastercardDelegateTest.kt @@ -1,6 +1,6 @@ package com.verygoodsecurity.vgscollect.card.validator.luhn -import com.verygoodsecurity.vgscollect.view.card.validation.card.brand.MastercardDelegate +import com.verygoodsecurity.vgscollect.view.card.validation.card.brand.CardBrandDelegate import org.junit.Assert.assertFalse import org.junit.Assert.assertTrue import org.junit.Test @@ -9,7 +9,7 @@ class MastercardDelegateTest { @Test fun detectMastercard1() { - val mastercard16 = MastercardDelegate() + val mastercard16 = CardBrandDelegate() val state = mastercard16.isValid("5555555555554444") @@ -18,7 +18,7 @@ class MastercardDelegateTest { @Test fun detectMastercard2() { - val mastercard16 = MastercardDelegate() + val mastercard16 = CardBrandDelegate() val state = mastercard16.isValid("5454545454545454") @@ -27,7 +27,7 @@ class MastercardDelegateTest { @Test fun detectMastercard3() { - val mastercard16 = MastercardDelegate() + val mastercard16 = CardBrandDelegate() val state = mastercard16.isValid("5105105105105100") @@ -36,7 +36,7 @@ class MastercardDelegateTest { @Test fun detectMastercard4() { - val mastercard16 = MastercardDelegate() + val mastercard16 = CardBrandDelegate() val state = mastercard16.isValid("5399999999999999") @@ -45,7 +45,7 @@ class MastercardDelegateTest { @Test fun detectMastercard5() { - val mastercard16 = MastercardDelegate() + val mastercard16 = CardBrandDelegate() val state = mastercard16.isValid("5232569007637831") @@ -54,7 +54,7 @@ class MastercardDelegateTest { @Test fun detectMastercard6() { - val mastercard16 = MastercardDelegate() + val mastercard16 = CardBrandDelegate() val state = mastercard16.isValid("5556011778787485") @@ -63,7 +63,7 @@ class MastercardDelegateTest { @Test fun detectMastercard7() { - val mastercard16 = MastercardDelegate() + val mastercard16 = CardBrandDelegate() val state = mastercard16.isValid("2720992593319364") @@ -72,7 +72,7 @@ class MastercardDelegateTest { @Test fun detectMastercard8() { - val mastercard16 = MastercardDelegate() + val mastercard16 = CardBrandDelegate() val state = mastercard16.isValid("2222420000001113") @@ -81,7 +81,7 @@ class MastercardDelegateTest { @Test fun detectMastercard9() { - val mastercard16 = MastercardDelegate() + val mastercard16 = CardBrandDelegate() val state = mastercard16.isValid("2222630000001125") @@ -90,7 +90,7 @@ class MastercardDelegateTest { @Test fun detectMastercard10() { - val mastercard16 = MastercardDelegate() + val mastercard16 = CardBrandDelegate() val state = mastercard16.isValid("5420923878724339") @@ -99,7 +99,7 @@ class MastercardDelegateTest { @Test fun detectMastercard11() { - val mastercard16 = MastercardDelegate() + val mastercard16 = CardBrandDelegate() val state = mastercard16.isValid("5185540810000019") @@ -108,7 +108,7 @@ class MastercardDelegateTest { @Test fun detectMastercard12() { - val mastercard16 = MastercardDelegate() + val mastercard16 = CardBrandDelegate() val state = mastercard16.isValid("5111010030175156") @@ -117,7 +117,7 @@ class MastercardDelegateTest { @Test fun detectMastercard13() { - val mastercard16 = MastercardDelegate() + val mastercard16 = CardBrandDelegate() val state = mastercard16.isValid("5200828282828210") @@ -126,7 +126,7 @@ class MastercardDelegateTest { @Test fun detectMastercard14() { - val mastercard16 = MastercardDelegate() + val mastercard16 = CardBrandDelegate() val state = mastercard16.isValid("5204230080000017") @@ -135,7 +135,7 @@ class MastercardDelegateTest { @Test fun detectMastercard15() { - val mastercard16 = MastercardDelegate() + val mastercard16 = CardBrandDelegate() val state = mastercard16.isValid("5555555555555000") @@ -144,7 +144,7 @@ class MastercardDelegateTest { @Test fun detectMastercard16() { - val mastercard16 = MastercardDelegate() + val mastercard16 = CardBrandDelegate() val state = mastercard16.isValid("5425230000004415") @@ -153,7 +153,7 @@ class MastercardDelegateTest { @Test fun detectMastercard17() { - val mastercard16 = MastercardDelegate() + val mastercard16 = CardBrandDelegate() val state = mastercard16.isValid("5114610000004778") @@ -162,7 +162,7 @@ class MastercardDelegateTest { @Test fun detectMastercard18() { - val mastercard16 = MastercardDelegate() + val mastercard16 = CardBrandDelegate() val state = mastercard16.isValid("5114630000009791") @@ -171,7 +171,7 @@ class MastercardDelegateTest { @Test fun detectMastercard19() { - val mastercard16 = MastercardDelegate() + val mastercard16 = CardBrandDelegate() val state = mastercard16.isValid("5121220000006921") @@ -180,7 +180,7 @@ class MastercardDelegateTest { @Test fun detectMastercard20() { - val mastercard16 = MastercardDelegate() + val mastercard16 = CardBrandDelegate() val state = mastercard16.isValid("5135020000005871") @@ -189,7 +189,7 @@ class MastercardDelegateTest { @Test fun detectMastercard21() { - val mastercard16 = MastercardDelegate() + val mastercard16 = CardBrandDelegate() val state = mastercard16.isValid("5100000000000131") @@ -198,7 +198,7 @@ class MastercardDelegateTest { @Test fun detectMastercard22() { - val mastercard16 = MastercardDelegate() + val mastercard16 = CardBrandDelegate() val state = mastercard16.isValid("5301250070000050") @@ -207,7 +207,7 @@ class MastercardDelegateTest { @Test fun detectMastercard23() { - val mastercard16 = MastercardDelegate() + val mastercard16 = CardBrandDelegate() val state = mastercard16.isValid("5454609899026213") @@ -216,7 +216,7 @@ class MastercardDelegateTest { @Test fun detectMastercard24() { - val mastercard16 = MastercardDelegate() + val mastercard16 = CardBrandDelegate() val state = mastercard16.isValid("5123456789012346") @@ -225,7 +225,7 @@ class MastercardDelegateTest { @Test fun detectMastercard25() { - val mastercard16 = MastercardDelegate() + val mastercard16 = CardBrandDelegate() val state = mastercard16.isValid("5133333333333338") @@ -234,7 +234,7 @@ class MastercardDelegateTest { @Test fun detectMastercard26() { - val mastercard16 = MastercardDelegate() + val mastercard16 = CardBrandDelegate() val state = mastercard16.isValid("5111111111111118") @@ -243,7 +243,7 @@ class MastercardDelegateTest { @Test fun detectMastercard27() { - val mastercard16 = MastercardDelegate() + val mastercard16 = CardBrandDelegate() val state = mastercard16.isValid("2223000000000023") @@ -252,7 +252,7 @@ class MastercardDelegateTest { @Test fun detectMastercard28() { - val mastercard16 = MastercardDelegate() + val mastercard16 = CardBrandDelegate() val state = mastercard16.isValid("5413000000000000") @@ -261,7 +261,7 @@ class MastercardDelegateTest { @Test fun detectMastercard29() { - val mastercard16 = MastercardDelegate() + val mastercard16 = CardBrandDelegate() val state = mastercard16.isValid("5404000000000068") @@ -270,7 +270,7 @@ class MastercardDelegateTest { @Test fun detectMastercard30() { - val mastercard16 = MastercardDelegate() + val mastercard16 = CardBrandDelegate() val state = mastercard16.isValid("5404000000000084") @@ -279,7 +279,7 @@ class MastercardDelegateTest { @Test fun detectMastercard31() { - val mastercard16 = MastercardDelegate() + val mastercard16 = CardBrandDelegate() val state = mastercard16.isValid("5404000000000043") @@ -288,7 +288,7 @@ class MastercardDelegateTest { @Test fun detectMastercard32() { - val mastercard16 = MastercardDelegate() + val mastercard16 = CardBrandDelegate() val state = mastercard16.isValid("5496198584584769") diff --git a/vgscollect/src/test/java/com/verygoodsecurity/vgscollect/card/validator/luhn/VisaDelegateTest.kt b/vgscollect/src/test/java/com/verygoodsecurity/vgscollect/card/validator/luhn/VisaDelegateTest.kt index b1461599b..ca8a4d006 100644 --- a/vgscollect/src/test/java/com/verygoodsecurity/vgscollect/card/validator/luhn/VisaDelegateTest.kt +++ b/vgscollect/src/test/java/com/verygoodsecurity/vgscollect/card/validator/luhn/VisaDelegateTest.kt @@ -1,6 +1,6 @@ package com.verygoodsecurity.vgscollect.card.validator.luhn -import com.verygoodsecurity.vgscollect.view.card.validation.card.brand.VisaDelegate +import com.verygoodsecurity.vgscollect.view.card.validation.card.brand.CardBrandDelegate import org.junit.Assert import org.junit.Test @@ -8,7 +8,7 @@ class VisaDelegateTest { @Test fun detectVisa1() { - val visa13 = VisaDelegate() + val visa13 = CardBrandDelegate() val state = visa13.isValid("4111111111111111") Assert.assertTrue(state) @@ -16,7 +16,7 @@ class VisaDelegateTest { @Test fun detectVisa2() { - val visa13 = VisaDelegate() + val visa13 = CardBrandDelegate() val state = visa13.isValid("4007000000027") Assert.assertTrue(state) @@ -24,7 +24,7 @@ class VisaDelegateTest { @Test fun detectVisa3() { - val visa13 = VisaDelegate() + val visa13 = CardBrandDelegate() val state = visa13.isValid("4012888818888") Assert.assertTrue(state) @@ -32,7 +32,7 @@ class VisaDelegateTest { @Test fun detectVisa4() { - val visa13 = VisaDelegate() + val visa13 = CardBrandDelegate() val state = visa13.isValid("4005519200000004") Assert.assertTrue(state) @@ -40,7 +40,7 @@ class VisaDelegateTest { @Test fun detectVisa5() { - val visa13 = VisaDelegate() + val visa13 = CardBrandDelegate() val state = visa13.isValid("4009348888881881") Assert.assertTrue(state) @@ -48,7 +48,7 @@ class VisaDelegateTest { @Test fun detectVisa6() { - val visa13 = VisaDelegate() + val visa13 = CardBrandDelegate() val state = visa13.isValid("4012000033330026") Assert.assertTrue(state) @@ -56,7 +56,7 @@ class VisaDelegateTest { @Test fun detectVisa7() { - val visa13 = VisaDelegate() + val visa13 = CardBrandDelegate() val state = visa13.isValid("4012000077777777") Assert.assertTrue(state) @@ -64,7 +64,7 @@ class VisaDelegateTest { @Test fun detectVisa8() { - val visa13 = VisaDelegate() + val visa13 = CardBrandDelegate() val state = visa13.isValid("4012888888881881") Assert.assertTrue(state) @@ -72,7 +72,7 @@ class VisaDelegateTest { @Test fun detectVisa9() { - val visa13 = VisaDelegate() + val visa13 = CardBrandDelegate() val state = visa13.isValid("4217651111111119") Assert.assertTrue(state) @@ -80,7 +80,7 @@ class VisaDelegateTest { @Test fun detectVisa10() { - val visa13 = VisaDelegate() + val visa13 = CardBrandDelegate() val state = visa13.isValid("4500600000000061") Assert.assertTrue(state) @@ -88,7 +88,7 @@ class VisaDelegateTest { @Test fun detectVisa11() { - val visa13 = VisaDelegate() + val visa13 = CardBrandDelegate() val state = visa13.isValid("4444333322221111") Assert.assertTrue(state) @@ -96,7 +96,7 @@ class VisaDelegateTest { @Test fun detectVisa12() { - val visa13 = VisaDelegate() + val visa13 = CardBrandDelegate() val state = visa13.isValid("4119862760338320") Assert.assertTrue(state) @@ -104,7 +104,7 @@ class VisaDelegateTest { @Test fun detectVisa13() { - val visa13 = VisaDelegate() + val visa13 = CardBrandDelegate() val state = visa13.isValid("4012001038443335") Assert.assertTrue(state) @@ -112,7 +112,7 @@ class VisaDelegateTest { @Test fun detectVisa14() { - val visa13 = VisaDelegate() + val visa13 = CardBrandDelegate() val state = visa13.isValid("4149011500000147") Assert.assertTrue(state) @@ -120,7 +120,7 @@ class VisaDelegateTest { @Test fun detectVisa15() { - val visa13 = VisaDelegate() + val visa13 = CardBrandDelegate() val state = visa13.isValid("4000007000000031") Assert.assertTrue(state) @@ -128,7 +128,7 @@ class VisaDelegateTest { @Test fun detectVisa16() { - val visa13 = VisaDelegate() + val visa13 = CardBrandDelegate() val state = visa13.isValid("4462030000000000") Assert.assertTrue(state) @@ -136,7 +136,7 @@ class VisaDelegateTest { @Test fun detectVisa17() { - val visa13 = VisaDelegate() + val visa13 = CardBrandDelegate() val state = visa13.isValid("4200000000000000") Assert.assertTrue(state) @@ -144,7 +144,7 @@ class VisaDelegateTest { @Test fun detectVisa18() { - val visa13 = VisaDelegate() + val visa13 = CardBrandDelegate() val state = visa13.isValid("4711100000000000") Assert.assertTrue(state) @@ -152,7 +152,7 @@ class VisaDelegateTest { @Test fun detectVisa19() { - val visa13 = VisaDelegate() + val visa13 = CardBrandDelegate() val state = visa13.isValid("4012001037461114") Assert.assertTrue(state) @@ -160,7 +160,7 @@ class VisaDelegateTest { @Test fun detectVisa20() { - val visa13 = VisaDelegate() + val visa13 = CardBrandDelegate() val state = visa13.isValid("4012001036853337") Assert.assertTrue(state) @@ -168,7 +168,7 @@ class VisaDelegateTest { @Test fun detectVisa21() { - val visa13 = VisaDelegate() + val visa13 = CardBrandDelegate() val state = visa13.isValid("4012001037484447") Assert.assertTrue(state) @@ -176,7 +176,7 @@ class VisaDelegateTest { @Test fun detectVisa22() { - val visa13 = VisaDelegate() + val visa13 = CardBrandDelegate() val state = visa13.isValid("4012001036273338") Assert.assertTrue(state) @@ -184,7 +184,7 @@ class VisaDelegateTest { @Test fun detectVisa23() { - val visa13 = VisaDelegate() + val visa13 = CardBrandDelegate() val state = visa13.isValid("4263970000005262") Assert.assertTrue(state) @@ -192,7 +192,7 @@ class VisaDelegateTest { @Test fun detectVisa24() { - val visa13 = VisaDelegate() + val visa13 = CardBrandDelegate() val state = visa13.isValid("4484070000000000") Assert.assertTrue(state) @@ -200,7 +200,7 @@ class VisaDelegateTest { @Test fun detectVisa25() { - val visa13 = VisaDelegate() + val visa13 = CardBrandDelegate() val state = visa13.isValid("4917610000000000003") Assert.assertTrue(state) @@ -208,7 +208,7 @@ class VisaDelegateTest { @Test fun detectVisa26() { - val visa13 = VisaDelegate() + val visa13 = CardBrandDelegate() val state = visa13.isValid("4911830000000") Assert.assertTrue(state) @@ -216,7 +216,7 @@ class VisaDelegateTest { @Test fun detectVisa27() { - val visa13 = VisaDelegate() + val visa13 = CardBrandDelegate() val state = visa13.isValid("4917610000000000") Assert.assertTrue(state) @@ -224,7 +224,7 @@ class VisaDelegateTest { @Test fun detectVisa28() { - val visa13 = VisaDelegate() + val visa13 = CardBrandDelegate() val state = visa13.isValid("4003830171874018") Assert.assertTrue(state) @@ -232,7 +232,7 @@ class VisaDelegateTest { @Test fun detectVisa29() { - val visa13 = VisaDelegate() + val visa13 = CardBrandDelegate() val state = visa13.isValid("4012001036983332") Assert.assertTrue(state) @@ -240,7 +240,7 @@ class VisaDelegateTest { @Test fun detectVisa30() { - val visa13 = VisaDelegate() + val visa13 = CardBrandDelegate() val state = visa13.isValid("4012001038488884") Assert.assertTrue(state) diff --git a/vgscollect/src/test/java/com/verygoodsecurity/vgscollect/card/validator/luhn/VisaElectronDelegateTest.kt b/vgscollect/src/test/java/com/verygoodsecurity/vgscollect/card/validator/luhn/VisaElectronDelegateTest.kt index 8cedd8004..75a340e87 100644 --- a/vgscollect/src/test/java/com/verygoodsecurity/vgscollect/card/validator/luhn/VisaElectronDelegateTest.kt +++ b/vgscollect/src/test/java/com/verygoodsecurity/vgscollect/card/validator/luhn/VisaElectronDelegateTest.kt @@ -1,6 +1,6 @@ package com.verygoodsecurity.vgscollect.card.validator.luhn -import com.verygoodsecurity.vgscollect.view.card.validation.card.brand.VisaElectronDelegate +import com.verygoodsecurity.vgscollect.view.card.validation.card.brand.CardBrandDelegate import org.junit.Assert.assertTrue import org.junit.Test @@ -8,7 +8,7 @@ class VisaElectronDelegateTest { @Test fun detectVisa1() { - val visa13 = VisaElectronDelegate() + val visa13 = CardBrandDelegate() val state = visa13.isValid("4917300000000008") assertTrue(state) @@ -16,7 +16,7 @@ class VisaElectronDelegateTest { @Test fun detectVisa2() { - val visa13 = VisaElectronDelegate() + val visa13 = CardBrandDelegate() val state = visa13.isValid("4917300800000000") assertTrue(state) @@ -24,7 +24,7 @@ class VisaElectronDelegateTest { @Test fun detectVisa3() { - val visa13 = VisaElectronDelegate() + val visa13 = CardBrandDelegate() val state = visa13.isValid("3333333333333000") assertTrue(state) diff --git a/vgscollect/src/test/java/com/verygoodsecurity/vgscollect/storage/NotifierTest.kt b/vgscollect/src/test/java/com/verygoodsecurity/vgscollect/storage/NotifierTest.kt index 974927b99..1d4f47e4b 100644 --- a/vgscollect/src/test/java/com/verygoodsecurity/vgscollect/storage/NotifierTest.kt +++ b/vgscollect/src/test/java/com/verygoodsecurity/vgscollect/storage/NotifierTest.kt @@ -9,10 +9,17 @@ import com.verygoodsecurity.vgscollect.core.storage.Notifier import com.verygoodsecurity.vgscollect.view.InputFieldView import com.verygoodsecurity.vgscollect.view.card.CardType import com.verygoodsecurity.vgscollect.view.card.FieldType +import org.hamcrest.Matchers +import org.junit.Assert +import org.junit.Assert.assertArrayEquals +import org.junit.Assert.assertEquals import org.junit.Test +import org.mockito.ArgumentCaptor import org.mockito.Mockito import org.mockito.Mockito.mock import org.mockito.Mockito.spy +import org.mockito.hamcrest.MockitoHamcrest + class NotifierTest { @@ -44,6 +51,7 @@ class NotifierTest { Mockito.verify(listener).dispatchDependencySetting(testDependency) } + @Test fun test_cvc_3_length_detect_after_set_State() { val notifier = spy(Notifier()) @@ -51,7 +59,16 @@ class NotifierTest { val state = createMASTERCARD() notifier.onRefreshState(state) - Mockito.verify(notifier).onDependencyDetected(FieldType.CVC, Dependency(DependencyType.RANGE, Pair(3,3))) + val argument_1: ArgumentCaptor = ArgumentCaptor.forClass(FieldType::class.java) + val argument_2: ArgumentCaptor = ArgumentCaptor.forClass(Dependency::class.java) + Mockito.verify(notifier).onDependencyDetected(capture(argument_1), capture(argument_2)) + + assertEquals(FieldType.CVC, argument_1.value) + + assertEquals(DependencyType.RANGE, argument_2.value.dependencyType) + + val cvcRange = (argument_2.value.value as Array) + assertArrayEquals(CardType.MASTERCARD.rangeCVV, cvcRange) } @Test @@ -61,7 +78,16 @@ class NotifierTest { val state = createAmEx() notifier.onRefreshState(state) - Mockito.verify(notifier).onDependencyDetected(FieldType.CVC, Dependency(DependencyType.RANGE, Pair(4,4))) + val argument_1: ArgumentCaptor = ArgumentCaptor.forClass(FieldType::class.java) + val argument_2: ArgumentCaptor = ArgumentCaptor.forClass(Dependency::class.java) + Mockito.verify(notifier).onDependencyDetected(capture(argument_1), capture(argument_2)) + + assertEquals(FieldType.CVC, argument_1.value) + + assertEquals(DependencyType.RANGE, argument_2.value.dependencyType) + + val cvcRange = (argument_2.value.value as Array) + assertArrayEquals(CardType.AMERICAN_EXPRESS.rangeCVV, cvcRange) } @Test @@ -86,6 +112,7 @@ class NotifierTest { val state = VGSFieldState(isFocusable = false, type = FieldType.CARD_NUMBER ) val content = FieldContent.CardNumberContent() content.cardtype = CardType.AMERICAN_EXPRESS + content.rangeCVV = CardType.AMERICAN_EXPRESS.rangeCVV state.content = content return state @@ -95,8 +122,12 @@ class NotifierTest { val state = VGSFieldState(isFocusable = false, type = FieldType.CARD_NUMBER ) val content = FieldContent.CardNumberContent() content.cardtype = CardType.MASTERCARD + content.rangeCVV = CardType.MASTERCARD.rangeCVV state.content = content return state } + + private fun capture(argumentCaptor: ArgumentCaptor): T = argumentCaptor.capture() + } \ No newline at end of file