/* Ċ The ĠMIT ĠLicense Ċ Ċ Copyright Ġ( c ) Ġ 2 0 1 1 - ĠStripe , ĠInc . Ġ( https :// stripe . com ) Ċ Ċ Permission Ġis Ġhereby Ġgranted , Ġfree Ġof Ġcharge , Ġto Ġany Ġperson Ġobtaining Ġa Ġcopy Ċ of Ġthis Ġsoftware Ġand Ġassociated Ġdocumentation Ġfiles Ġ( the Ġ" Software "), Ġto Ġdeal Ċ in Ġthe ĠSoftware Ġwithout Ġrestriction , Ġincluding Ġwithout Ġlimitation Ġthe Ġrights Ċ to Ġuse , Ġcopy , Ġmodify , Ġmerge , Ġpublish , Ġdistribute , Ġsublicense , Ġand / or Ġsell Ċ copies Ġof Ġthe ĠSoftware , Ġand Ġto Ġpermit Ġpersons Ġto Ġwhom Ġthe ĠSoftware Ġis Ċ furnished Ġto Ġdo Ġso , Ġsubject Ġto Ġthe Ġfollowing Ġconditions : Ċ Ċ The Ġabove Ġcopyright Ġnotice Ġand Ġthis Ġpermission Ġnotice Ġshall Ġbe Ġincluded Ġin Ċ all Ġcopies Ġor Ġsubstantial Ġportions Ġof Ġthe ĠSoftware . Ċ Ċ THE ĠSOFTWARE ĠIS ĠPROVIDED Ġ" AS ĠIS ", ĠWITHOUT ĠWARRANTY ĠOF ĠANY ĠKIND , ĠEXPRESS ĠOR Ċ IMPLIED , ĠINCLUDING ĠBUT ĠNOT ĠLIMITED ĠTO ĠTHE ĠWARRANTIES ĠOF ĠMERCHANTABILITY , Ċ FITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE ĠAND ĠNONINFRINGEMENT . ĠIN ĠNO ĠEVENT ĠSHALL ĠTHE Ċ AUTHORS ĠOR ĠCOPYRIGHT ĠHOLDERS ĠBE ĠLIABLE ĠFOR ĠANY ĠCLAIM , ĠDAMAGES ĠOR ĠOTHER Ċ LIABILITY , ĠWHETHER ĠIN ĠAN ĠACTION ĠOF ĠCONTRACT , ĠTORT ĠOR ĠOTHERWISE , ĠARISING ĠFROM , Ċ OUT ĠOF ĠOR ĠIN ĠCONNECTION ĠWITH ĠTHE ĠSOFTWARE ĠOR ĠTHE ĠUSE ĠOR ĠOTHER ĠDEALINGS ĠIN Ċ THE ĠSOFTWARE . Ċ */ Ċ Ċ package Ġcom . get bounc er . card scan . base . util Ċ Ċ import Ġandroidx . annotation . Drawable Res Ċ import Ġcom . get bounc er . card scan . base . R Ċ import Ġjava . io . Serializable Ċ import Ġjava . util .* Ċ Ċ enum Ġclass ĠCard Network ( val ĠdisplayName : ĠString ) Ġ: ĠSerializable Ġ{ ĊĠĠĠ ĠAM ERIC AN _ EXPRESS ( displayName Ġ= Ġ" American ĠExpress "), ĊĠĠĠ ĠDIS COVER ( displayName Ġ= Ġ" Discover "), ĊĠĠĠ ĠJ CB ( displayName Ġ= Ġ" J CB "), ĊĠĠĠ ĠD IN ERS _ CL UB ( displayName Ġ= Ġ" Din ers ĠClub "), ĊĠĠĠ ĠV ISA ( displayName Ġ= Ġ" Vis a "), ĊĠĠĠ ĠMASTER CARD ( displayName Ġ= Ġ" Master Card "), ĊĠĠĠ ĠUNION PAY ( displayName Ġ= Ġ" Union Pay "), ĊĠĠĠ ĠUNKNOWN ( displayName Ġ= Ġ" Unknown ") Ċ } Ċ Ċ object ĠCredit Card Utils Ġ{ ĊĠĠĠ Ġprivate Ġconst Ġval ĠLEN GTH _ COMMON _ CARD Ġ= Ġ 1 6 ĊĠĠĠ Ġprivate Ġconst Ġval ĠLEN GTH _ AM ERIC AN _ EXPRESS Ġ= Ġ 1 5 ĊĊĠĠĠ Ġprivate Ġconst Ġval ĠC VC _ LENGTH _ AM ERIC AN _ EXPRESS : ĠInt Ġ= Ġ 4 ĊĠĠĠ Ġprivate Ġconst Ġval ĠC VC _ LENGTH _ COMMON : ĠInt Ġ= Ġ 3 ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠBased Ġon Ġ[ Issuer Ġidentification Ġnumber Ġtable ]( http :// en . wikipedia . org / wiki / Bank _ card _ number # Issuer _ identification _ number _. 2 8 I IN . 2 9 ) ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval ĠPREFIX ES _ AM ERIC AN _ EXPRESS : ĠArray < String > Ġ= ĠarrayOf (" 3 4 ", Ġ" 3 7 ") ĊĠĠĠ Ġprivate Ġval ĠPREFIX ES _ DIS COVER : ĠArray < String > Ġ= ĠarrayOf (" 6 0 ", Ġ" 6 4 ", Ġ" 6 5 ") ĊĠĠĠ Ġprivate Ġval ĠPREFIX ES _ J CB : ĠArray < String > Ġ= ĠarrayOf (" 3 5 ") ĊĠĠĠ Ġprivate Ġval ĠPREFIX ES _ D IN ERS _ CL UB : ĠArray < String > Ġ= ĠarrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" 3 0 0 ", Ġ" 3 0 1 ", Ġ" 3 0 2 ", Ġ" 3 0 3 ", Ġ" 3 0 4 ", Ġ" 3 0 5 ", Ġ" 3 0 9 ", Ġ" 3 6 ", Ġ" 3 8 ", Ġ" 3 9 " ĊĠĠĠ Ġ) ĊĠĠĠ Ġprivate Ġval ĠPREFIX ES _ VIS A : ĠArray < String > Ġ= ĠarrayOf (" 4 ") ĊĠĠĠ Ġprivate Ġval ĠPREFIX ES _ MASTER CARD : ĠArray < String > Ġ= ĠarrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" 2 2 2 1 ", Ġ" 2 2 2 2 ", Ġ" 2 2 2 3 ", Ġ" 2 2 2 4 ", Ġ" 2 2 2 5 ", Ġ" 2 2 2 6 ", Ġ" 2 2 2 7 ", Ġ" 2 2 2 8 ", Ġ" 2 2 2 9 ", Ġ" 2 2 3 ", Ġ" 2 2 4 ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" 2 2 5 ", Ġ" 2 2 6 ", Ġ" 2 2 7 ", Ġ" 2 2 8 ", Ġ" 2 2 9 ", Ġ" 2 3 ", Ġ" 2 4 ", Ġ" 2 5 ", Ġ" 2 6 ", Ġ" 2 7 0 ", Ġ" 2 7 1 ", Ġ" 2 7 2 0 ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" 5 0 ", Ġ" 5 1 ", Ġ" 5 2 ", Ġ" 5 3 ", Ġ" 5 4 ", Ġ" 5 5 ", Ġ" 6 7 " ĊĠĠĠ Ġ) ĊĠĠĠ Ġprivate Ġval ĠPREFIX ES _ UNION PAY : ĠArray < String > Ġ= ĠarrayOf (" 6 2 ") ĊĊĠĠĠ Ġprivate Ġconst Ġval ĠLEN GTH _ D IN ERS _ CL UB Ġ= Ġ 1 4 ĊĊĠĠĠ Ġprivate Ġval ĠNET WORK _ RESOURCE _ MAP Ġ= Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCard Network . AM ERIC AN _ EXPRESS Ġto ĠR . drawable . bounc er _ card _ ame x , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCard Network . D IN ERS _ CL UB Ġto ĠR . drawable . bounc er _ card _ din ers , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCard Network . DIS COVER Ġto ĠR . drawable . bounc er _ card _ discover , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCard Network . J CB Ġto ĠR . drawable . bounc er _ card _ j cb , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCard Network . MASTER CARD Ġto ĠR . drawable . bounc er _ card _ master card , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCard Network . VIS A Ġto ĠR . drawable . bounc er _ card _ visa , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCard Network . UNION PAY Ġto ĠR . drawable . bounc er _ card _ union pay , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCard Network . UNKNOWN Ġto ĠR . drawable . bounc er _ card _ unknown ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġa Ġ[ Card Network ] Ġcorresponding Ġto Ġa Ġpartial Ġcard Ġnumber , Ġor Ġ[ Card Network . UNKNOWN ] Ġif ĊĠĠĠĠ Ġ* Ġthe Ġcard Ġnetwork Ġcan 't Ġbe Ġdetermined Ġfrom Ġthe Ġinput Ġvalue . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġcard Number Ġa Ġcredit Ġcard Ġnumber Ġor Ġpartial Ġcard Ġnumber ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġ[ Card Network ] Ġcorresponding Ġto Ġthat Ġnumber , ĊĠĠĠĠ Ġ* Ġor Ġ[ Card Network . UNKNOWN ] Ġif Ġit Ġcan 't Ġbe Ġdetermined ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġfun Ġdetermine Card Network ( card Number : ĠString ?): ĠCard Network Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdetermine Card Network ( card Number , Ġtrue ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠChecks Ġthe Ġinput Ġstring Ġto Ġsee Ġwhether Ġor Ġnot Ġit Ġis Ġa Ġvalid Ġcard Ġnumber , Ġpossibly Ġwith ĊĠĠĠĠ Ġ* Ġgroup ings Ġseparated Ġby Ġspaces Ġor Ġhy ph ens . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġcard Number Ġa ĠString Ġthat Ġmay Ġor Ġmay Ġnot Ġrepresent Ġa Ġvalid Ġcard Ġnumber ĊĠĠĠĠ Ġ* Ġ@ return Ġ` true ` Ġif Ġand Ġonly Ġif Ġthe Ġinput Ġvalue Ġis Ġa Ġvalid Ġcard Ġnumber ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġfun ĠisValid Card Number ( card Number : ĠString ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnormalized Number Ġ= Ġremove Spaces And Hy ph ens ( card Number ) ĊĠĠĠĠĠĠĠ Ġreturn ĠisValid Lu hn Number ( normalized Number ) Ġ&& ĠisValid Card Length ( normalized Number ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠChecks Ġthe Ġinput Ġstring Ġto Ġsee Ġwhether Ġor Ġnot Ġit Ġis Ġa Ġvalid ĠLu hn Ġnumber . ĠThis Ġis Ġbased Ġon Ġan ĊĠĠĠĠ Ġ* Ġexample Ġfrom Ġw ikipedia : Ġhttps :// en . wikipedia . org / wiki / Lu hn _ algorithm # Java ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġcard Number Ġa ĠString Ġthat Ġmay Ġor Ġmay Ġnot Ġrepresent Ġa Ġvalid ĠLu hn Ġnumber ĊĠĠĠĠ Ġ* Ġ@ return Ġ` true ` Ġif Ġand Ġonly Ġif Ġthe Ġinput Ġvalue Ġis Ġa Ġvalid ĠLu hn Ġnumber ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun ĠisValid Lu hn Number ( card Number : ĠString ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( card Number . isNull OrEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvar Ġis Odd Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġvar Ġsum Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( index Ġin Ġcard Number . length Ġ- Ġ 1 Ġdown To Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġc Ġ= Ġcard Number [ index ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! Character . is Digit ( c )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġdigit Integer Ġ= ĠCharacter . get Numeric Value ( c ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Odd Ġ= Ġ! is Odd ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Odd ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdigit Integer Ġ*= Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( digit Integer Ġ> Ġ 9 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdigit Integer Ġ-= Ġ 9 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġsum Ġ+= Ġdigit Integer ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġsum Ġ% Ġ 1 0 Ġ== Ġ 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠChecks Ġthe ĠBank ĠIdent ification ĠNumber Ġto Ġsee Ġif Ġit Ġbelongs Ġto Ġa Ġknown Ġnetwork . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġbin Ġa ĠString Ġthat Ġmay Ġor Ġmay Ġnot Ġrepresent Ġa Ġvalid ĠBIN ĊĠĠĠĠ Ġ* Ġ@ return Ġ` true ` Ġif Ġand Ġonly Ġif Ġthe Ġinput Ġvalid Ġis Ġa Ġvalid ĠBIN ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġfun ĠisValid Bin ( bin : ĠString ?): ĠBoolean Ġ= Ġdetermine Card Network ( bin ) Ġ!= ĠCard Network . UNKNOWN ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠChecks Ġto Ġsee Ġwhether Ġthe Ġinput Ġnumber Ġis Ġof Ġthe Ġcorrect Ġlength , Ġafter Ġdetermining Ġits ĊĠĠĠĠ Ġ* Ġnetwork . ĠThis Ġfunction Ġdoes Ġnot Ġperform Ġa ĠLu hn Ġcheck . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġcard Number Ġthe Ġcard Ġnumber Ġwith Ġno Ġspaces Ġor Ġdas hes ĊĠĠĠĠ Ġ* Ġ@ return Ġ` true ` Ġif Ġthe Ġcard Ġnumber Ġis Ġof Ġknown Ġtype Ġand Ġthe Ġcorrect Ġlength ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun ĠisValid Card Length ( card Number : ĠString ?): ĠBoolean Ġ= ĊĠĠĠĠĠĠĠ Ġcard Number Ġ!= Ġnull Ġ&& ĠisValid Card Length ( card Number , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdetermine Card Network ( card Number , Ġfalse )) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠChecks Ġto Ġsee Ġwhether Ġthe Ġinput Ġnumber Ġis Ġof Ġthe Ġcorrect Ġlength , Ġgiven Ġthe Ġassumed Ġnetwork Ġof ĊĠĠĠĠ Ġ* Ġthe Ġcard . ĠThis Ġfunction Ġdoes Ġnot Ġperform Ġa ĠLu hn Ġcheck . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġcard Number Ġthe Ġcard Ġnumber Ġwith Ġno Ġspaces Ġor Ġdas hes ĊĠĠĠĠ Ġ* Ġ@ param Ġcard Network Ġa Ġ[ Card Network ] Ġused Ġto Ġget Ġthe Ġcorrect Ġsize ĊĠĠĠĠ Ġ* Ġ@ return Ġ` true ` Ġif Ġthe Ġcard Ġnumber Ġis Ġthe Ġcorrect Ġlength Ġfor Ġthe Ġassumed Ġnetwork ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun ĠisValid Card Length ( card Number : ĠString ?, Ġcard Network : ĠCard Network ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( card Number Ġ== Ġnull Ġ|| ĠCard Network . UNKNOWN Ġ== Ġcard Network ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġlength Ġ= Ġcard Number . length ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( card Network ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCard Network . AM ERIC AN _ EXPRESS Ġ-> Ġlength Ġ== ĠLEN GTH _ AM ERIC AN _ EXPRESS ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCard Network . D IN ERS _ CL UB Ġ-> Ġlength Ġ== ĠLEN GTH _ D IN ERS _ CL UB ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġlength Ġ== ĠLEN GTH _ COMMON _ CARD ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdetermine Card Network ( card Number : ĠString ?, Ġshould Normalize : ĠBoolean ): ĠCard Network Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( card Number . isNull Or Blank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠCard Network . UNKNOWN ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġnormalized Card Number Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( should Normalize ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremove Spaces And Hy ph ens ( card Number ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcard Number ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhas Any Prefix ( normalized Card Number , Ġ* PREFIX ES _ AM ERIC AN _ EXPRESS ) Ġ-> ĠCard Network . AM ERIC AN _ EXPRESS ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhas Any Prefix ( normalized Card Number , Ġ* PREFIX ES _ DIS COVER ) Ġ-> ĠCard Network . DIS COVER ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhas Any Prefix ( normalized Card Number , Ġ* PREFIX ES _ J CB ) Ġ-> ĠCard Network . J CB ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhas Any Prefix ( normalized Card Number , Ġ* PREFIX ES _ D IN ERS _ CL UB ) Ġ-> ĠCard Network . D IN ERS _ CL UB ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhas Any Prefix ( normalized Card Number , Ġ* PREFIX ES _ VIS A ) Ġ-> ĠCard Network . VIS A ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhas Any Prefix ( normalized Card Number , Ġ* PREFIX ES _ MASTER CARD ) Ġ-> ĠCard Network . MASTER CARD ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhas Any Prefix ( normalized Card Number , Ġ* PREFIX ES _ UNION PAY ) Ġ-> ĠCard Network . UNION PAY ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠCard Network . UNKNOWN ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠChecks Ġwhether Ġor Ġnot Ġthe Ġ[ cv c ] Ġis Ġvalid . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġc vc : ĠThe ĠC VC Ġto Ġvalidate ĊĠĠĠĠ Ġ* Ġ@ return Ġ` true ` Ġif Ġvalid , Ġ` false ` Ġotherwise ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġfun ĠisValid CV C ( cv c : ĠString ?, Ġnetwork : ĠCard Network ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( cv c . isNull OrEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġc vc Value Ġ= Ġc vc . trim () ĊĠĠĠĠĠĠĠ Ġval Ġvalid Length Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnetwork Ġ== Ġnull Ġ&& Ġc vc Value . length Ġ>= Ġ 3 Ġ&& Ġc vc Value . length Ġ<= Ġ 4 Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCard Network . AM ERIC AN _ EXPRESS Ġ== Ġnetwork Ġ&& Ġc vc Value . length Ġ== ĠC VC _ LENGTH _ AM ERIC AN _ EXPRESS Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc vc Value . length Ġ== ĠC VC _ LENGTH _ COMMON ĊĊĠĠĠĠĠĠĠ Ġreturn Ġis Whole Positive Number ( cv c Value ) Ġ&& Ġvalid Length ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠChecks Ġwhether Ġor Ġnot Ġthe Ġ[ exp Day ], Ġ[ exp Month ], Ġand Ġ[ exp Year ] Ġfields Ġrepresent Ġa Ġvalid Ġexpiry Ġdate . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġ` true ` Ġif Ġvalid , Ġ` false ` Ġotherwise ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġfun ĠisValid Expiry Date ( exp Day : ĠString ?, Ġexp Month : ĠString ?, Ġexp Year : ĠString ?): ĠBoolean Ġ= ĊĠĠĠĠĠĠĠ ĠisValid Expiry Date ( as Integer ( exp Day ), Ġas Integer ( exp Month ), Ġas Integer ( exp Year ), ĠCalendar . getInstance ()) ĊĊĠĠĠ Ġprivate Ġfun ĠisValid Expiry Date ( ĊĠĠĠĠĠĠĠ Ġexpiry Day : ĠInt ?, ĊĠĠĠĠĠĠĠ Ġexpiry Month : ĠInt ?, ĊĠĠĠĠĠĠĠ Ġexpiry Year : ĠInt ?, ĊĠĠĠĠĠĠĠ Ġnow : ĠCalendar ĊĠĠĠ Ġ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( expiry Day Ġ!= Ġnull Ġ&& Ġ! isValid Exp Day ( expiry Day , Ġexpiry Month , Ġexpiry Year )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( expiry Month Ġ== Ġnull Ġ|| Ġ! isValid Exp Month ( expiry Month )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( expiry Year Ġ== Ġnull Ġ|| Ġ! isValid Exp Year ( expiry Year , Ġnow )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ! has Month Passed ( expiry Year , Ġexpiry Month , Ġnow ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGet Ġthe Ġresource ĠID Ġof Ġthe Ġicon Ġfor Ġthis Ġcard 's Ġnetwork . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġ@ Drawable Res ĊĠĠĠ Ġfun Ġget Network Icon ( network : ĠCard Network ?): ĠInt Ġ= ĊĠĠĠĠĠĠĠ ĠNET WORK _ RESOURCE _ MAP [ network ] Ġ?: ĠR . drawable . bounc er _ card _ unknown ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠFormat Ġthe Ġcard Ġnumber Ġfor Ġdisplay . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġfun Ġformat Number For Display ( number : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( number . length Ġ== ĠLEN GTH _ COMMON _ CARD ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġformat Common For Display ( number ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( number . length Ġ== ĠLEN GTH _ AM ERIC AN _ EXPRESS ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġformat American Express For Display ( number ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġnumber ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġfun Ġformat Network For Display ( network : ĠCard Network ): ĠString Ġ= Ġnetwork . displayName ĊĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġfun Ġformat Expiry For Display ( exp Day : ĠString ?, Ġexp Month : ĠString ?, Ġexp Year : ĠString ?): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( exp Month Ġ== Ġnull Ġ|| Ġexp Year Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġday Ġ= Ġif Ġ( exp Day Ġ!= Ġnull ) Ġ"$ exp Day /" Ġelse Ġ"" ĊĠĠĠĠĠĠĠ Ġval Ġmonth Ġ= Ġif Ġ( exp Month . length Ġ== Ġ 1 ) Ġ" 0 $ exp Month " Ġelse Ġexp Month ĊĠĠĠĠĠĠĠ Ġval Ġyear Ġ= Ġif Ġ( exp Year . length Ġ== Ġ 4 ) Ġexp Year . substring ( 2 ) Ġelse Ġexp Year ĊĊĠĠĠĠĠĠĠ Ġreturn Ġ"$ day $ month /$ year " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġformat Common For Display ( number : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠStringBuilder () ĊĠĠĠĠĠĠĠ Ġfor Ġ( idx Ġin Ġnumber . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( idx Ġ== Ġ 4 Ġ|| Ġidx Ġ== Ġ 8 Ġ|| Ġidx Ġ== Ġ 1 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . append (" Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . append ( number [ idx ]) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġresult . toString () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġformat American Express For Display ( number : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠStringBuilder () ĊĠĠĠĠĠĠĠ Ġfor Ġ( idx Ġin Ġnumber . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( idx Ġ== Ġ 4 Ġ|| Ġidx Ġ== Ġ 1 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . append (" Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . append ( number [ idx ]) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġresult . toString () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠChecks Ġwhether Ġor Ġnot Ġthe Ġ[ exp Day ] Ġfield Ġis Ġvalid Ġgiven Ġthe Ġ[ exp Month ] Ġand Ġ[ exp Year ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġ` true ` Ġif Ġvalid , Ġ` false ` Ġotherwise . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun ĠisValid Exp Day ( exp Day : ĠInt ?, Ġexp Month : ĠInt ?, Ġexp Year : ĠInt ?): ĠBoolean Ġ= Ġwhen ( exp Month ) Ġ{ ĊĠĠĠĠĠĠĠ Ġnull Ġ-> Ġfalse ĊĠĠĠĠĠĠĠĠ 2 Ġ-> Ġif Ġ( is Le ap Year ( exp Year )) Ġexp Day Ġin Ġ 1 .. 2 9 Ġelse Ġexp Day Ġin Ġ 1 .. 2 8 ĊĠĠĠĠĠĠĠĠ 4 , Ġ 6 , Ġ 9 , Ġ 1 1 Ġ-> Ġexp Day Ġin Ġ 1 .. 3 0 ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġexp Day Ġin Ġ 1 .. 3 1 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDetermine Ġif Ġa Ġyear Ġis Ġa Ġle ap Ġyear . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġ` true ` Ġif Ġa Ġle ap Ġyear , Ġ` false ` Ġotherwise . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġis Le ap Year ( year : ĠInt ?): ĠBoolean Ġ= Ġyear Ġ!= Ġnull Ġ&& Ġyear Ġ% Ġ 4 Ġ== Ġ 0 Ġ&& Ġ( year Ġ% Ġ 1 0 0 Ġ!= Ġ 0 Ġ|| Ġyear Ġ% Ġ 4 0 0 Ġ== Ġ 0 ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠChecks Ġwhether Ġor Ġnot Ġthe Ġ[ exp Month ] Ġfield Ġis Ġvalid . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġ` true ` Ġif Ġvalid , Ġ` false ` Ġotherwise . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun ĠisValid Exp Month ( exp Month : ĠInt ?): ĠBoolean Ġ= Ġexp Month ?. let Ġ{ Ġit Ġin Ġ 1 .. 1 2 Ġ} Ġ== Ġtrue ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠChecks Ġwhether Ġor Ġnot Ġthe Ġ[ exp Year ] Ġfield Ġis Ġvalid . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġ` true ` Ġif Ġvalid , Ġ` false ` Ġotherwise . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun ĠisValid Exp Year ( exp Year : ĠInt ?, Ġnow : ĠCalendar ): ĠBoolean Ġ= ĊĠĠĠĠĠĠĠ Ġexp Year ?. let Ġ{ Ġ! has Year Passed ( it , Ġnow ) Ġ} Ġ== Ġtrue ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDetermines Ġwhether Ġthe Ġinput Ġyear - month Ġpair Ġhas Ġpassed . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġyear Ġthe Ġinput Ġyear , Ġas Ġa Ġtwo Ġor Ġfour - digit Ġinteger ĊĠĠĠĠ Ġ* Ġ@ param Ġmonth Ġthe Ġinput Ġmonth ĊĠĠĠĠ Ġ* Ġ@ param Ġnow Ġthe Ġcurrent Ġtime ĊĠĠĠĠ Ġ* Ġ@ return Ġ` true ` Ġif Ġthe Ġinput Ġtime Ġhas Ġpassed Ġthe Ġspecified Ġcurrent Ġtime , ĊĠĠĠĠ Ġ* Ġ` false ` Ġotherwise . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġhas Month Passed ( year : ĠInt , Ġmonth : ĠInt , Ġnow : ĠCalendar ): ĠBoolean Ġ= ĊĠĠĠĠĠĠĠ Ġif Ġ( has Year Passed ( year , Ġnow )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠExp ires Ġat Ġend Ġof Ġspecified Ġmonth , ĠCalendar Ġmonth Ġstarts Ġat Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnormalize Year ( year , Ġnow ) Ġ== Ġnow . get ( Calendar . YEAR ) Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmonth Ġ< Ġnow . get ( Calendar . MONTH ) Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDetermines Ġwhether Ġor Ġnot Ġthe Ġinput Ġyear Ġhas Ġalready Ġpassed . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġyear Ġthe Ġinput Ġyear , Ġas Ġa Ġtwo Ġor Ġfour - digit Ġinteger ĊĠĠĠĠ Ġ* Ġ@ param Ġnow , Ġthe Ġcurrent Ġtime ĊĠĠĠĠ Ġ* Ġ@ return Ġ` true ` Ġif Ġthe Ġinput Ġyear Ġhas Ġpassed Ġthe Ġyear Ġof Ġthe Ġspecified Ġcurrent Ġtime ĊĠĠĠĠ Ġ* Ġ` false ` Ġotherwise . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġhas Year Passed ( year : ĠInt , Ġnow : ĠCalendar ): ĠBoolean Ġ= ĊĠĠĠĠĠĠĠ Ġnormalize Year ( year , Ġnow ) Ġ< Ġnow . get ( Calendar . YEAR ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠNormalize Ġyears Ġto Ġfour Ġdigits . ĠIf Ġthe Ġyear Ġis Ġonly Ġtwo Ġdigits , Ġappend Ġthe Ġcurrent Ġcent ury ĊĠĠĠĠ Ġ* Ġto Ġthe Ġbeginning Ġof Ġthe Ġyear . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġnormalize Year ( year : ĠInt , Ġnow : ĠCalendar ): ĠInt Ġ= ĊĠĠĠĠĠĠĠ Ġif Ġ( year Ġin Ġ 0 .. 9 9 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Year Ġ= Ġnow . get ( Calendar . YEAR ). toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprefix Ġ= Ġcurrent Year . substring ( 0 , Ġcurrent Year . length Ġ- Ġ 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠString . format ( Locale . US , Ġ"% s % 0 2 d ", Ġprefix , Ġyear ). toInt () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġyear ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠConverts Ġa Ġcard Ġnumber Ġthat Ġmay Ġhave Ġspaces Ġbetween Ġthe Ġnumbers Ġinto Ġone Ġwithout Ġany Ġspaces . ĊĠĠĠĠ Ġ* ĠNote : Ġmethod Ġdoes Ġnot Ġcheck Ġthat Ġall Ġcharacters Ġare Ġdigits Ġor Ġspaces . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġcard Number With Spaces Ġa Ġcard Ġnumber , Ġfor Ġinstance Ġ" 4 2 4 2 Ġ 4 2 4 2 Ġ 4 2 4 2 Ġ 4 2 4 2 " ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġinput Ġnumber Ġminus Ġany Ġspaces , Ġfor Ġinstance Ġ" 4 2 4 2 4 2 4 2 4 2 4 2 4 2 4 2 ". ĊĠĠĠĠ Ġ* ĠReturns Ġ` null ` Ġif Ġthe Ġinput Ġwas Ġ` null ` Ġor Ġall Ġspaces . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġremove Spaces And Hy ph ens ( card Number With Spaces : ĠString ?): ĠString ? Ġ= ĊĠĠĠĠĠĠĠ Ġcard Number With Spaces . take Unless Ġ{ Ġit . isNull Or Blank () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . replace ("\\ s |- ". to Regex (), Ġ"") ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCheck Ġto Ġsee Ġif Ġthe Ġinput Ġnumber Ġhas Ġany Ġof Ġthe Ġgiven Ġprefixes . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġnumber Ġthe Ġnumber Ġto Ġtest ĊĠĠĠĠ Ġ* Ġ@ param Ġprefixes Ġthe Ġprefixes Ġto Ġtest Ġagainst ĊĠĠĠĠ Ġ* Ġ@ return Ġ` true ` Ġif Ġnumber Ġbegins Ġwith Ġany Ġof Ġthe Ġinput Ġprefixes ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġhas Any Prefix ( number : ĠString ?, Ġvar arg Ġprefixes : ĠString ): ĠBoolean Ġ= ĊĠĠĠĠĠĠĠ Ġprefixes . any Ġ{ Ġnumber ?. startsWith ( it ) Ġ== Ġtrue Ġ} ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCheck Ġto Ġsee Ġwhether Ġthe Ġinput Ġstring Ġis Ġa Ġwhole , Ġpositive Ġnumber . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġvalue Ġthe Ġinput Ġstring Ġto Ġtest ĊĠĠĠĠ Ġ* Ġ@ return Ġ` true ` Ġif Ġthe Ġinput Ġvalue Ġconsists Ġentirely Ġof Ġintegers ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġis Whole Positive Number ( value : ĠString ?): ĠBoolean Ġ= ĊĠĠĠĠĠĠĠ Ġvalue Ġ!= Ġnull Ġ&& Ġis Digits Only ( value ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġwhether Ġthe Ġgiven ĠCharSequence Ġcontains Ġonly Ġdigits . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġis Digits Only ( str : ĠCharSequence ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġi Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġwhile Ġ( i Ġ< Ġstr . length ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcp Ġ= ĠCharacter . code Point At ( str , Ġi ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! Character . is Digit ( cp )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġi Ġ+= ĠCharacter . char Count ( cp ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġas Integer ( str : ĠString ?): ĠInt ? Ġ= ĊĠĠĠĠĠĠĠ Ġif Ġ( str Ġ!= Ġnull Ġ&& Ġis Digits Only ( str )) Ġstr . toInt () Ġelse Ġnull Ċ }