/* Ċ Ġ* ĠCopyright Ġ 2 0 2 2 ĠP era ĠWallet , ĠL DA Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġ Ġlimitations Ġunder Ġthe ĠLicense Ċ Ġ* Ċ Ġ*/ Ċ Ċ package Ġcom . al gor and . android . custom views Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . os . Parcelable Ċ import Ġandroid . text . Input Filter Ċ import Ġandroid . util . Attribute Set Ċ import Ġandroid . util . Sparse Array Ċ import Ġandroidx . annotation . Drawable Res Ċ import Ġandroidx . constraint layout . widget . Constraint Layout Ċ import Ġandroidx . core . content . res . use Ċ import Ġandroidx . core . view . update Padding Ċ import Ġandroidx . core . widget . add TextChanged Listener Ċ import Ġcom . al gor and . android . R Ċ import Ġcom . al gor and . android . databinding . Custom Input Layout Binding Ċ import Ġcom . al gor and . android . models . Custom Input State Ċ import Ġcom . al gor and . android . utils . add Byte Limiter Ċ import Ġcom . al gor and . android . utils . extensions . setText And Visibility Ċ import Ġcom . al gor and . android . utils . view binding . view Binding Ċ import Ġkotlin . properties . Deleg ates Ċ Ċ class ĠAl gor and Input Layout Ġ@ Jvm Over loads Ġconstructor ( ĊĠĠĠ Ġcontext : ĠContext , ĊĠĠĠ Ġprivate Ġval Ġattrs : ĠAttributeSet ? Ġ= Ġnull Ċ ) Ġ: ĠConstraint Layout ( context , Ġattrs ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġbinding Ġ= Ġview Binding ( Custom Input Layout Binding :: inflate ) ĊĊĠĠĠ Ġprivate Ġval Ġedit Text Ġ= Ġbinding . textInput EditText ĊĊĠĠĠ Ġvar Ġtext : ĠString ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġedit Text . text . toString () ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . textInput EditText . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Text ( value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Selection ( length ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġhint : ĠString ? ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġbinding . textInput Layout . hint . toString () ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . textInput Layout . hint Ġ= Ġvalue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġerror : ĠString ? ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġbinding . error TextView . text . toString () ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . error TextView . setText And Visibility ( value ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġhelper : ĠString ? ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġbinding . helper TextView . text . toString () ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . helper TextView . setText And Visibility ( value ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġis Single Line Ġby ĠDeleg ates . observable ( false , Ġ{ Ġ_, Ġ_, ĠnewValue Ġ-> ĊĠĠĠĠĠĠĠ Ġbinding . textInput EditText . is Single Line Ġ= ĠnewValue ĊĠĠĠ Ġ}) ĊĊĠĠĠ Ġprivate Ġvar Ġmax Character Ġby ĠDeleg ates . observable (- 1 , Ġ{ Ġ_, Ġ_, ĠnewValue Ġ-> ĊĠĠĠĠĠĠĠ Ġif Ġ( newValue Ġ!= Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( binding . textInput EditText ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Filters Ġ= Ġfilters . to Mutable List () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Filters . add ( Input Filter . Length Filter ( newValue )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfilters Ġ= Ġnew Filters . to Typed Array () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}) ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġload Attrs () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset On Text ChangeListener ( listener : Ġ( text : ĠString ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding . textInput EditText . add TextChanged Listener Ġ{ Ġlistener . invoke ( text ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġload Attrs () Ġ{ ĊĠĠĠĠĠĠĠ Ġcontext . obtain Styled Attributes ( attrs , ĠR . style able . Custom Input Layout ). use Ġ{ Ġattrs Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext Ġ= Ġattrs . getString ( R . style able . Custom Input Layout _ text ). or Empty () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhint Ġ= Ġattrs . getString ( R . style able . Custom Input Layout _ hint ). or Empty () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror Ġ= Ġattrs . getString ( R . style able . Custom Input Layout _ error ). or Empty () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhelper Ġ= Ġattrs . getString ( R . style able . Custom Input Layout _ helper ). or Empty () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Single Line Ġ= Ġattrs . getBoolean ( R . style able . Custom Input Layout _ single Line , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmax Character Ġ= Ġattrs . getInteger ( R . style able . Custom Input Layout _ max Character , Ġ- 1 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd Byte Limiter ( maximum Byte Limit : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding . textInput EditText . add Byte Limiter ( maximum Byte Limit ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset As Non Focus able () Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding . textInput Layout . isEnabled Ġ= Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd Trailing Icon (@ Drawable Res Ġdrawable Res : ĠInt , Ġon Icon Click : Ġ() Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwith ( binding ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġicon Container View . add Icon View ( drawable Res , Ġon Icon Click ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġicon Container View . post Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext Input EditText . update Padding ( right Ġ= Ġicon Container View . width ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Save InstanceState (): ĠParcel able Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠCustom Input State ( super . on Save InstanceState (), Ġtext ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Restore InstanceState ( state : ĠParcel able ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġ( state Ġas ? ĠCustom Input State )?. run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Restore InstanceState ( super State ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Al gor and Input Layout . text Ġ= Ġtext ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdispatch Save InstanceState ( container : ĠSparse Array < Parcelable > ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . dispatch Freeze Self Only ( container ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdispatch Restore InstanceState ( container : ĠSparse Array < Parcelable > ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . dispatch Th aw Self Only ( container ) ĊĠĠĠ Ġ} Ċ } Ċ