package Ġcom . yandex . pay . core . ui . views . present ers Ċ Ċ import Ġandroid . text . Editable Ċ import Ġandroid . text . Sp anned Ċ import Ġcom . yandex . pay . core . data . Card Details Ċ import Ġcom . yandex . pay . core . ui . views . Slash Span Ċ import Ġcom . yandex . pay . core . ui . views . interfaces . Controller Ċ import Ġcom . yandex . pay . core . ui . views . interfaces . I Expiration Date Input Ċ import Ġcom . yandex . x plat . yandex . pay . Card Expiration Date Field Ċ import Ġcom . yandex . x plat . yandex . pay . Card Field Ċ import Ġcom . yandex . x plat . yandex . pay . Card Field Validator Ċ import Ġcom . yandex . x plat . yandex . pay . Card ValidationError Ċ Ċ internal Ġclass ĠExp iration Date Input Controller ( ĊĠĠĠ Ġprivate Ġval Ġvalidator : ĠCard Field Validator < Card Expiration Date Field >, Ċ ) Ġ: ĠController < Expiration Date Input Controller . Payload , ĠI Expiration Date Input > Ġ{ ĊĠĠĠ Ġinternal Ġclass ĠDate ( val Ġmonth : ĠInt , Ġval Ġyear : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġinternal Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġfrom ( card Details : ĠCard Details ): ĠDate ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ(_, Ġmonth , Ġyear , Ġ_) Ġ= Ġcard Details ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( month Ġ!= Ġnull Ġ&& Ġyear Ġ!= Ġnull ) ĠDate ( month , Ġyear ) Ġelse Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠPayload ( val Ġdata : ĠDate ?, Ġval Ġon Done : Ġ( Date ) Ġ-> ĠUnit ) ĊĊĠĠĠ Ġprivate Ġvar Ġview : ĠI Expiration Date Input ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġval Ġrequire View : ĠI Expiration Date Input ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġrequire NotNull ( view ) ĊĊĠĠĠ Ġprivate Ġvar Ġon Done : Ġ(( Date ) Ġ-> ĠUnit )? Ġ= Ġnull ĊĊĠĠĠ Ġoverride Ġfun Ġbind ( data : ĠPayload , Ġview : ĠI Expiration Date Input ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( this . view Ġ!= Ġnull Ġ&& Ġthis . view Ġ!= Ġview ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" Controller Ġis Ġalready Ġbound Ġto Ġanother Ġview . ĠU nb ind Ġfirst .") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġthis . view Ġ= Ġview ĊĠĠĠĠĠĠĠ Ġthis . on Done Ġ= Ġdata . on Done ĊĠĠĠĠĠĠĠ Ġrequire View . content Formatter Ġ= Ġ:: format Content ĊĠĠĠĠĠĠĠ Ġrequire View . on Finish Editing Ġ= Ġ:: on Finish Editing ĊĠĠĠĠĠĠĠ Ġrequire View . reset Input Filters ( MAX _ NUM _ CHARS ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġun bind ( view : ĠI Expiration Date Input ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( this . view Ġ!= Ġnull Ġ&& Ġthis . view Ġ!= Ġview ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" Controller Ġis Ġactually Ġbound Ġto Ġanother Ġview .") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġon Done Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġthis . view ?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Formatter Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Finish Editing Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon ValueChanged Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġthis . view Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġhas Expiration Date : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠisValid Ġ&& Ġexpiration Month . isNotBlank () Ġ&& Ġexpiration Year . isNotBlank () ĊĊĠĠĠ Ġval ĠisValid : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġvalidate () Ġ== Ġnull ĊĊĠĠĠ Ġval Ġhas Focus : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġrequire View . has Focus ĊĊĠĠĠ Ġfun Ġvalidate (): ĠCard ValidationError ? Ġ= ĊĠĠĠĠĠĠĠ Ġvalidator . validate ( Card Field . expiration Date ( expiration Month , Ġexpiration Year )) ĊĊĠĠĠ Ġprivate Ġval Ġexpiration Month : ĠString ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġrequire View . text FieldValue . take If Ġ{ Ġit . length Ġ>= ĠMON TH _ LENGTH Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . substring ( 0 , ĠMON TH _ LENGTH ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. or Empty () ĊĊĠĠĠ Ġprivate Ġval Ġexpiration Year : ĠString ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġrequire View . text FieldValue . take If Ġ{ Ġit . length Ġ>= ĠMON TH _ LENGTH Ġ+ ĠYEAR _ LENGTH Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . substring ( MONTH _ LENGTH ). or Empty () ĊĊĠĠĠ Ġprivate Ġfun Ġon Finish Editing () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġerror Ġ= Ġvalidate () ĊĠĠĠĠĠĠĠ Ġif Ġ( error Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire View . show Error ( error ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire View . hide Error () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Done !! ( Date ( expiration Month . toInt (), Ġexpiration Year . toInt ())) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġformat Content ( value : ĠEdit able , Ġchange Was Addition : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( change Was Addition ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value . length Ġ== Ġ 1 Ġ&& ĠCharacter . get Numeric Value ( value [ 0 ]) Ġ> Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprepend Leading Zero ( value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġpadding Spans Ġ= Ġvalue . get Spans ( ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 , Ġvalue . length , ĠSl ash Span :: class . java ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġpadding Spans . forEach ( value :: remove Span ) ĊĠĠĠĠĠĠĠ Ġadd Date Slash ( value ) ĊĠĠĠĠĠĠĠ Ġrequire View . hide Error () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprepend Leading Zero ( editable : ĠEdit able ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfirst Char Ġ= Ġeditable [ 0 ] ĊĠĠĠĠĠĠĠ Ġeditable . replace ( 0 , Ġ 1 , Ġ" 0 "). append ( first Char ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġadd Date Slash ( editable : ĠEdit able ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġindex Ġ= ĠMON TH _ LENGTH ĊĠĠĠĠĠĠĠ Ġval Ġlength Ġ= Ġeditable . length ĊĠĠĠĠĠĠĠ Ġif Ġ( index Ġ<= Ġlength ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġeditable . set Span ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSl ash Span (), Ġindex Ġ- Ġ 1 , Ġindex , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSp anned . SPAN _ EXCL USIVE _ EXCL USIVE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠMON TH _ LENGTH : ĠInt Ġ= Ġ 2 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠYEAR _ LENGTH : ĠInt Ġ= Ġ 2 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠMAX _ NUM _ CHARS : ĠInt Ġ= ĠMON TH _ LENGTH Ġ+ ĠYEAR _ LENGTH ĊĠĠĠ Ġ} Ċ } Ċ