/* Ċ Ġ* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 2 1 ĠP AY , ĠInc . Ċ Ġ* Ċ Ġ* Ġ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 Ġjp . pay . android . ui . widget Ċ Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . text . Input Filter Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroidx . lifecycle . ViewModel Provider Ċ import Ġandroidx . lifecycle . observe Ċ import Ġandroidx . transition . Transition Manager Ċ import Ġcom . google . android . material . text field . TextInput Layout Ċ import Ġjp . pay . android . Pay jp Card Form Ċ import Ġjp . pay . android . databinding . Pay jp Card Form View Binding Ċ import Ġjp . pay . android . model . Card Brand Ċ import Ġjp . pay . android . model . TenantId Ċ import Ġjp . pay . android . ui . extension . add On TextChanged Ċ import Ġjp . pay . android . ui . extension . cv c Icon ResourceId Ċ import Ġjp . pay . android . ui . extension . logo ResourceId Ċ import Ġjp . pay . android . ui . extension . setError OrNull Ċ import Ġjp . pay . android . util . auto Cle ared Ċ import Ġjp . pay . android . validator . Card C vc Input Transformer Ċ import Ġjp . pay . android . validator . Card Expiration Input Transformer Ċ import Ġjp . pay . android . validator . Card Holder Name Input Transformer Ċ import Ġjp . pay . android . validator . Card Number Input Transformer Ċ Ċ class ĠPay jp Card Form Fragment Ġ: ĠPay jp Card Form Abstract Fragment () Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠARGS _ HOLDER _ NAME _ ENABLED Ġ= Ġ" ARGS _ HOLDER _ NAME _ ENABLED " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠARGS _ TEN ANT _ ID Ġ= Ġ" ARGS _ TEN ANT _ ID " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠARGS _ ACCEPT ED _ B RAN DS Ġ= Ġ" ARGS _ ACCEPT ED _ B RAN DS " ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠCreate Ġnew Ġfragment Ġinstance Ġwith Ġargs ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġholder Name Enabled Ġa Ġoption Ġit Ġrequire Ġcard Ġholder Ġname Ġor Ġnot . ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġtenant Id Ġa Ġoption Ġfor Ġplatform Ġtenant . ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġaccepted Br ands Ġaccepted Ġbr ands . Ġif Ġit Ġis Ġnull , Ġthe Ġfragment Ġtry Ġto Ġget Ġthem . ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return Ġfragment ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġnew Instance ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġholder Name Enabled : ĠBoolean Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtenant Id : ĠTenant Id ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaccepted Br ands : ĠArray < Card Brand >? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ): ĠPay jp Card Form Fragment Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPay jp Card Form Fragment (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarguments Ġ= ĠBundle (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Boolean ( ARGS _ HOLDER _ NAME _ ENABLED , Ġholder Name Enabled ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput String ( ARGS _ TEN ANT _ ID , Ġtenant Id ?. id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Parcelable Array ( ARGS _ ACCEPT ED _ B RAN DS , Ġaccepted Br ands ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġbinding : ĠPay jp Card Form View Binding Ġby Ġauto Cle ared () ĊĊĠĠĠ Ġprivate Ġval Ġdelimiter Expiration Ġ= ĠPay jp Card Form . CARD _ FORM _ DE LIMITER _ EXPI RATION ĊĠĠĠ Ġprivate Ġval Ġcard Number Formatter Ġ= ĊĠĠĠĠĠĠĠ ĠCard NumberFormat Text Watcher ( Pay jp Card Form . CARD _ FORM _ DE LIMITER _ NUMBER ) ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate View ( ĊĠĠĠĠĠĠĠ Ġinflater : ĠLayoutInflater , ĊĠĠĠĠĠĠĠ Ġcontainer : ĠViewGroup ?, ĊĠĠĠĠĠĠĠ ĠsavedInstanceState : ĠBundle ? ĊĠĠĠ Ġ): ĠView ? Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding Ġ= ĠPay jp Card Form View Binding . inflate ( in flater , Ġcontainer , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġreturn Ġbinding . root ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Scan Result ( card Number : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġcard Number ?. let ( binding . layout Number . input Edit Number :: setText ) ĊĠĠĠĠĠĠĠ Ġbinding . layout Expiration . input Edit Expiration . request Focus From Touch () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġset Card Holder Name Input Enabled ( enabled : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( viewModel Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarguments Ġ= ĠBundle ( arguments ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Boolean ( ARGS _ HOLDER _ NAME _ ENABLED , Ġenabled ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel ?. update Card Holder Name Enabled ( enabled ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠsetUp UI ( view : ĠViewGroup ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġadd Ġformatter ĊĠĠĠĠĠĠĠ Ġbinding . layout Number . input Edit Number . add TextChanged Listener ( card Number Formatter ) ĊĠĠĠĠĠĠĠ Ġbinding . layout Expiration . input Edit Expiration . add TextChanged Listener ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCard Expiration Format Text Watcher ( delimiter Expiration ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ// Ġdefault Ġc vc Ġlength ĊĠĠĠĠĠĠĠ Ġbinding . layout C vc . input Edit C vc . filters Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf < Input Filter >( Input Filter . Length Filter ( Card Brand . UNKNOWN . cv c Length )) ĊĠĠĠĠĠĠĠ ĠPay jp Card Form . card Scanner Plugin ()?. let Ġ{ Ġbridge Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . layout Number . input Layout Number . end Icon Mode Ġ= ĠText Input Layout . END _ ICON _ CUSTOM ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . layout Number . input Layout Number . set End Icon OnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbridge . start Scan Activity ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// Ġeditor ĊĠĠĠĠĠĠĠ Ġbinding . layout Holder Name . input Edit Holder Name . setOn Editor ActionListener ( this :: on Editor Action ) ĊĠĠĠĠĠĠĠ Ġbinding . layout C vc . input Edit C vc . setOn Editor ActionListener Ġ{ Ġv , Ġaction Id , Ġevent Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( viewModel ?. card Holder Name Enabled ?. value Ġ== Ġfalse ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Editor Action ( v , Ġaction Id , Ġevent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠviewModel ?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcard Holder Name Enabled . observe ( view Lifecycle Owner ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . layout Holder Name . input Layout Holder Name . visibility Ġ= Ġif Ġ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTransition Manager . begin Delayed Transition ( view ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġc vc I me Options . observe ( view Lifecycle Owner , Ġbinding . layout C vc . input Edit C vc :: set I me Options ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcard Number Brand . observe ( view Lifecycle Owner ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcard Number Formatter . brand Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . layout C vc . input Edit C vc . filters Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf < Input Filter >( Input Filter . Length Filter ( it . cv c Length )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . layout C vc . input Layout C vc . set End Icon Drawable ( it . cv c Icon ResourceId ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . layout Number . input Layout Number . set Start Icon Drawable ( it . logo ResourceId ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcard Expiration . observe ( view Lifecycle Owner ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . layout Expiration . input Edit Expiration . expiration Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcard Number Error . observe ( view Lifecycle Owner ) Ġ{ Ġres Id Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . layout Number . input Layout Number . setError OrNull ( res Id ?. let Ġ{ ĠgetString ( it ) Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcard Expiration Error . observe ( view Lifecycle Owner ) Ġ{ Ġres Id Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . layout Expiration . input Layout Expiration . setError OrNull ( res Id ?. let Ġ{ ĠgetString ( it ) Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcard C vc Error . observe ( view Lifecycle Owner ) Ġ{ Ġres Id Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . layout C vc . input Layout C vc . setError OrNull ( res Id ?. let Ġ{ ĠgetString ( it ) Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcard Holder Name Error . observe ( view Lifecycle Owner ) Ġ{ Ġres Id Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . layout Holder Name . input Layout Holder Name . setError OrNull ( res Id ?. let Ġ{ ĠgetString ( it ) Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcard Number Valid . observe ( view Lifecycle Owner ) Ġ{ Ġvalid Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( valid Ġ&& Ġbinding . layout Number . input Edit Number . has Focus ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . layout Expiration . input Edit Expiration . request Focus From Touch () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcard Expiration Valid . observe ( view Lifecycle Owner ) Ġ{ Ġvalid Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( valid Ġ&& Ġbinding . layout Expiration . input Edit Expiration . has Focus ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . layout C vc . input Edit C vc . request Focus From Touch () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcard C vc Valid . observe ( view Lifecycle Owner ) Ġ{ Ġvalid Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( valid Ġ&& Ġbinding . layout C vc . input Edit C vc . has Focus () Ġ&& Ġbinding . layout Holder Name . input Layout Holder Name . visibility Ġ== ĠView . VISIBLE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . layout Holder Name . input Edit Holder Name . request Focus From Touch () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . layout Number . input Edit Number . add On TextChanged Ġ{ Ġs , Ġ_, Ġ_, Ġ_ Ġ-> Ġinput Card Number ( s . toString ()) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . layout Expiration . input Edit Expiration . add On TextChanged Ġ{ Ġs , Ġ_, Ġ_, Ġ_ Ġ-> Ġinput Card Expiration ( s . toString ()) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . layout C vc . input Edit C vc . add On TextChanged Ġ{ Ġs , Ġ_, Ġ_, Ġ_ Ġ-> Ġinput Card C vc ( s . toString ()) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . layout Holder Name . input Edit Holder Name . add On TextChanged Ġ{ Ġs , Ġ_, Ġ_, Ġ_ Ġ-> Ġinput Card Holder Name ( s . toString ()) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcreate ViewModel (): ĠCard Form ViewModel Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtenant Id Ġ= Ġarguments ?. getString ( ARGS _ TEN ANT _ ID )?. let Ġ{ ĠTenant Id ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġholder Name Enabled Ġ= Ġarguments ?. getBoolean ( ARGS _ HOLDER _ NAME _ ENABLED ) Ġ?: Ġtrue ĊĠĠĠĠĠĠĠ Ġval Ġaccepted Brand Array Ġ= Ġarguments ?. get Parcelable Array ( ARGS _ ACCEPT ED _ B RAN DS ) ĊĠĠĠĠĠĠĠ Ġval Ġfactory Ġ= ĠCard Form ViewModel . Factory ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtoken Service Ġ= ĠcheckNotNull ( Pay jp Card Form . token Service ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" You Ġmust Ġinitialize ĠPay jp Ġfirst " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcard Number Input Transformer Ġ= ĠCard Number Input Transformer (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcard Expiration Input Transformer Ġ= ĠCard Expiration Input Transformer ( delimiter Ġ= Ġdelimiter Expiration ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcard C vc Input Transformer Ġ= ĠCard C vc Input Transformer (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcard Holder Name Input Transformer Ġ= ĠCard Holder Name Input Transformer , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtenant Id Ġ= Ġtenant Id , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġholder Name Enabled Default Ġ= Ġholder Name Enabled , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaccepted Br ands Ġ= Ġaccepted Brand Array ?. filter Is Instance < Card Brand >() ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġreturn ĠViewModel Provider ( require Activity (), Ġfactory ). get ( Card Form ViewModel :: class . java ) ĊĠĠĠ Ġ} Ċ } Ċ