package Ġcom . se am les sp ay . ui . view Ċ Ċ import Ġandroidx . annotation . Int Range Ċ import Ġandroidx . annotation . Size Ċ import Ġandroidx . annotation . Visible ForTesting Ċ import Ġjava . util . Calendar Ċ Ċ internal Ġobject ĠDate Utils Ġ{ ĊĊĠĠĠ Ġprivate Ġconst Ġval ĠMAX _ VALID _ YEAR Ġ= Ġ 9 9 8 0 ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠChecks Ġto Ġsee Ġif Ġthe Ġstring Ġinput Ġrepresents Ġa Ġvalid Ġmonth . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġmonth String Ġuser Ġinput Ġrepresenting Ġthe Ġmonth ĊĠĠĠĠ Ġ* Ġ@ return Ġ` true ` Ġif Ġthe Ġstring Ġis Ġa Ġnumber Ġbetween Ġ" 0 1 " Ġand Ġ" 1 2 " Ġinclusive , ĊĠĠĠĠ Ġ* Ġ` false ` Ġotherwise ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġfun ĠisValid Month ( month String : ĠString ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmonth String ?. toInt () Ġin Ġ 1 .. 1 2 ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( num Ex : ĠNumber FormatException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSepar ates Ġraw Ġstring Ġinput Ġof Ġthe Ġformat ĠMM YY Ġinto Ġa Ġ" month " Ġgroup Ġand Ġa Ġ" year " Ġgroup . ĊĠĠĠĠ Ġ* ĠEither Ġor Ġboth Ġof Ġthese Ġmay Ġbe Ġincomplete . ĠThis Ġmethod Ġdoes Ġnot Ġcheck Ġto Ġsee Ġif Ġthe Ġinput ĊĠĠĠĠ Ġ* Ġis Ġvalid . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġexpiry Input Ġup Ġto Ġfour Ġcharacters Ġof Ġuser Ġinput ĊĠĠĠĠ Ġ* Ġ@ return Ġa Ġlength - 2 Ġarray Ġcontaining Ġthe Ġfirst Ġtwo Ġcharacters Ġin Ġthe Ġ 0 Ġindex , Ġand Ġthe Ġlast ĊĠĠĠĠ Ġ* Ġtwo Ġcharacters Ġin Ġthe Ġ 1 Ġindex . Ġ" 1 2 3 " Ġgets Ġsplit Ġinto Ġ{" 1 2 " Ġ, Ġ" 3 "}, Ġand Ġ" 1 " Ġbecomes Ġ{" 1 ", Ġ"" }. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Size ( 2 ) ĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġfun Ġseparate DateString Parts (@ Size ( max Ġ= Ġ 4 ) Ġexpiry Input : ĠString ): ĠArray < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( expiry Input . length Ġ>= Ġ 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpiry Input . substring ( 0 , Ġ 2 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpiry Input . substring ( 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). to Typed Array () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( expiry Input , Ġ""). to Typed Array () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠChecks Ġwhether Ġor Ġnot Ġthe Ġinput Ġmonth Ġand Ġyear Ġhas Ġyet Ġexpired . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġexpiry Month ĠAn Ġinteger Ġrepresenting Ġa Ġmonth . ĠOnly Ġvalues Ġ 1 - 1 2 Ġare Ġvalid , ĊĠĠĠĠ Ġ* Ġbut Ġthis Ġis Ġcalled Ġby Ġuser Ġinput , Ġso Ġwe Ġhave Ġto Ġcheck Ġoutside Ġthat Ġrange . ĊĠĠĠĠ Ġ* Ġ@ param Ġexpiry Year ĠAn Ġinteger Ġrepresenting Ġthe Ġfull Ġyear Ġ( 2 0 1 7 , Ġnot Ġ 1 7 ). ĠOnly Ġpositive Ġvalues ĊĠĠĠĠ Ġ* Ġare Ġvalid , Ġbut Ġthis Ġis Ġcalled Ġby Ġuser Ġinput , Ġso Ġwe Ġhave Ġto Ġcheck Ġoutside ĊĠĠĠĠ Ġ* Ġfor Ġotherwise Ġn ons ens ical Ġdates . ĠThis Ġcode Ġcannot Ġvalidate Ġyears Ġgreater ĊĠĠĠĠ Ġ* Ġthan Ġ[ 9 9 8 0 ][ MAX _ VALID _ YEAR ] Ġbecause Ġof Ġhow Ġwe Ġparse Ġyears Ġin Ġ[ convert Two Digit Year To Four ]. ĊĠĠĠĠ Ġ* Ġ@ return Ġ` true ` Ġif Ġthe Ġcurrent Ġmonth Ġand Ġyear Ġis Ġthe Ġsame Ġas Ġor Ġlater Ġthan Ġthe Ġinput ĊĠĠĠĠ Ġ* Ġmonth Ġand Ġyear , Ġ` false ` Ġotherwise . ĠNote Ġthat Ġsome Ġcards Ġexpire Ġon Ġthe Ġfirst Ġof Ġthe ĊĠĠĠĠ Ġ* Ġmonth , Ġbut Ġwe Ġdon 't Ġvalidate Ġthat Ġhere . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġfun Ġis Expiry Data Valid ( expiry Month : ĠInt , Ġexpiry Year : ĠInt ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġis Expiry Data Valid ( expiry Month , Ġexpiry Year , ĠCalendar . getInstance ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Visible ForTesting ĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġfun Ġis Expiry Data Valid ( expiry Month : ĠInt , Ġexpiry Year : ĠInt , Ġcalendar : ĠCalendar ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( expiry Month Ġ< Ġ 1 Ġ|| Ġexpiry Month Ġ> Ġ 1 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( expiry Year Ġ< Ġ 0 Ġ|| Ġexpiry Year Ġ> ĠMAX _ VALID _ YEAR ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġcurrent Year Ġ= Ġcalendar . get ( Calendar . YEAR ) ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpiry Year Ġ< Ġcurrent Year Ġ-> Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpiry Year Ġ> Ġcurrent Year Ġ-> Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ Ġ// Ġthe Ġcard Ġexpires Ġthis Ġyear ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreadable Month Ġ= Ġcalendar . get ( Calendar . MONTH ) Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpiry Month Ġ>= Ġreadable Month ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCreates Ġa Ġstring Ġvalue Ġto Ġbe Ġentered Ġinto Ġan Ġexpiration Ġdate Ġtext Ġfield ĊĠĠĠĠ Ġ* Ġwithout Ġa Ġdivider . ĠFor Ġinstance , Ġ( 1 , Ġ 2 0 2 0 ) Ġ=> Ġ" 0 1 2 0 ". ĠIt Ġdoesn 't Ġmatter Ġif ĊĠĠĠĠ Ġ* Ġthe Ġyear Ġis Ġtwo - digit Ġor Ġfour . Ġ( 1 , Ġ 2 0 ) Ġ=> Ġ" 0 1 2 0 ". ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠNote : ĠA Ġfour - digit Ġyear Ġwill Ġbe Ġtruncated , Ġso Ġ( 1 , Ġ 2 7 2 0 ) Ġ=> Ġ" 0 1 2 0 ". ĠIf Ġthe Ġyear ĊĠĠĠĠ Ġ* Ġdate Ġis Ġ 3 Ġdigits , Ġthe Ġdata Ġwill Ġbe Ġconsidered Ġinvalid Ġand Ġthe Ġempty Ġstring Ġwill Ġbe Ġreturned . ĊĠĠĠĠ Ġ* ĠA Ġone - digit Ġdate Ġis Ġvalid Ġ( re presents Ġ 2 0 0 1 , Ġfor Ġinstance ). ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġmonth Ġa Ġmonth Ġof Ġthe Ġyear , Ġrepresented Ġas Ġa Ġnumber Ġbetween Ġ 1 Ġand Ġ 1 2 ĊĠĠĠĠ Ġ* Ġ@ param Ġyear Ġa Ġyear Ġnumber , Ġeither Ġin Ġtwo - digit Ġform Ġor Ġfour - digit Ġform ĊĠĠĠĠ Ġ* Ġ@ return Ġa Ġlength - four Ġstring Ġrepresenting Ġthe Ġdate , Ġor Ġan Ġempty Ġstring Ġif Ġinput Ġis Ġinvalid ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġfun Ġcreate DateString From Integer Input ( ĊĠĠĠĠĠĠĠ Ġ@ Int Range ( from Ġ= Ġ 1 , Ġto Ġ= Ġ 1 2 ) Ġmonth : ĠInt , ĊĠĠĠĠĠĠĠ Ġ@ Int Range ( from Ġ= Ġ 0 , Ġto Ġ= Ġ 9 9 9 9 ) Ġyear : ĠInt ĊĠĠĠ Ġ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġmonth String Ġ= Ġmonth . toString () ĊĠĠĠĠĠĠĠ Ġif Ġ( month String . length Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmonth String Ġ= Ġ" 0 $ month String " ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvar Ġyear String Ġ= Ġyear . toString () ĊĠĠĠĠĠĠĠ Ġ// ĠThree - digit Ġyears Ġare Ġinvalid . ĊĠĠĠĠĠĠĠ Ġif Ġ( year String . length Ġ== Ġ 3 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ"" ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( year String . length Ġ> Ġ 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġyear String Ġ= Ġyear String . substring ( year String . length Ġ- Ġ 2 ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( year String . length Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġyear String Ġ= Ġ" 0 $ year String " ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġmonth String Ġ+ Ġyear String ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠConverts Ġa Ġtwo - digit Ġinput Ġyear Ġto Ġa Ġfour - digit Ġyear . ĠAs Ġthe Ġcurrent Ġcalendar Ġyear ĊĠĠĠĠ Ġ* Ġapproaches Ġa Ġcent ury , Ġwe Ġassume Ġsmall Ġvalues Ġto Ġmean Ġthe Ġnext Ġcent ury . ĠFor Ġinstance , Ġif ĊĠĠĠĠ Ġ* Ġthe Ġcurrent Ġyear Ġis Ġ 2 0 9 0 , Ġand Ġthe Ġinput Ġvalue Ġis Ġ" 1 8 ", Ġthe Ġuser Ġprobably Ġmeans Ġ 2 1 1 8 , ĊĠĠĠĠ Ġ* Ġnot Ġ 2 0 1 8 . ĠHowever , Ġin Ġ 2 0 1 7 , Ġthe Ġinput Ġ" 1 8 " Ġprobably Ġmeans Ġ 2 0 1 8 . ĠThis Ġcode Ġshould Ġbe ĊĠĠĠĠ Ġ* Ġupdated Ġbefore Ġthe Ġyear Ġ 9 9 8 1 . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġinput Year Ġa Ġtwo - digit Ġinteger , Ġbetween Ġ 0 Ġand Ġ 9 9 , Ġinclusive ĊĠĠĠĠ Ġ* Ġ@ return Ġa Ġfour - digit Ġyear ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Int Range ( from Ġ= Ġ 1 0 0 0 , Ġto Ġ= Ġ 9 9 9 9 ) ĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġfun Ġconvert Two Digit Year To Four (@ Int Range ( from Ġ= Ġ 0 , Ġto Ġ= Ġ 9 9 ) Ġinput Year : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġconvert Two Digit Year To Four ( input Year , ĠCalendar . getInstance ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Visible ForTesting ĊĠĠĠ Ġ@ Int Range ( from Ġ= Ġ 1 0 0 0 , Ġto Ġ= Ġ 9 9 9 9 ) ĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġfun Ġconvert Two Digit Year To Four ( ĊĠĠĠĠĠĠĠ Ġ@ Int Range ( from Ġ= Ġ 0 , Ġto Ġ= Ġ 9 9 ) Ġinput Year : ĠInt , ĊĠĠĠĠĠĠĠ Ġcalendar : ĠCalendar ĊĠĠĠ Ġ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġyear Ġ= Ġcalendar . get ( Calendar . YEAR ) ĊĠĠĠĠĠĠĠ Ġ// ĠInt ention al Ġinteger Ġdivision ĊĠĠĠĠĠĠĠ Ġvar Ġcent ury Base Ġ= Ġyear Ġ/ Ġ 1 0 0 ĊĠĠĠĠĠĠĠ Ġif Ġ( year Ġ% Ġ 1 0 0 Ġ> Ġ 8 0 Ġ&& Ġinput Year Ġ< Ġ 2 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcent ury Base ++ ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( year Ġ% Ġ 1 0 0 Ġ< Ġ 2 0 Ġ&& Ġinput Year Ġ> Ġ 8 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcent ury Base -- ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġcent ury Base Ġ* Ġ 1 0 0 Ġ+ Ġinput Year ĊĠĠĠ Ġ} Ċ } Ċ