package Ġbr . com . ever to fab io Ċ Ċ import Ġandroid . app . DatePicker Dialog Ċ import Ġandroid . content . Context Ċ import Ġandroid . text . Input Filter Ċ import Ġandroid . util . Attribute Set Ċ import Ġandroid . view . Context Theme Wrapper Ċ import Ġandroid . view . input method . Editor Info Ċ import Ġandroidx . annotation . NonNull Ċ import Ġandroidx . annotation . Nullable Ċ import Ġandroidx . core . content . Context Compat Ċ import Ġandroidx . core . widget . add TextChanged Listener Ċ import Ġcom . google . android . material . R . style Ċ import Ġcom . google . android . material . text field . TextInput EditText Ċ import Ġcom . google . android . material . text field . TextInput Layout Ċ import Ġjava . text . SimpleDateFormat Ċ import Ġjava . util .* Ċ Ċ class ĠEdit Date Ġ: ĠText Input Layout Ġ{ ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġm Edit Date : ĠText Input EditText ĊĠĠĠ Ġprivate Ġvar ĠmCurrent Date : ĠDate ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġwatcher Mask : ĠWatch er Mask ĊĠĠĠ Ġvar Ġon Focus Change : ĠOn Date ChangeListener ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġmask Ġ: ĠString Ġ= Ġ" dd / MM / yyyy " ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Edit Date . remove TextChanged Listener ( watcher Mask ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwatcher Mask Ġ= ĠWatch er Mask ( value , Ġm Edit Date ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Edit Date . add TextChanged Listener ( watcher Mask ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġdate : ĠDate ? ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠmCurrent Date ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠmCurrent Date Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprint Date () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġconstructor (@ NonNull Ġcontext : ĠContext ) Ġ: Ġsuper ( Context Theme Wrapper ( context , Ġstyle . Widget _ Material Components _ TextInput Layout _ Outlined Box )) ĊĠĠĠ Ġconstructor (@ NonNull Ġcontext : ĠContext , Ġ@ Nullable Ġattrs : ĠAttributeSet ?) Ġ: Ġsuper ( Context Theme Wrapper ( context , style . Widget _ Material Components _ TextInput Layout _ Outlined Box ), attrs ) ĊĠĠĠ Ġconstructor ( context : ĠContext ?, Ġattrs : ĠAttributeSet ?, Ġdef Style Attr : ĠInt ) Ġ: Ġsuper ( Context Theme Wrapper ( context , Ġstyle . Widget _ Material Components _ TextInput Layout _ Outlined Box ), attrs , def Style Attr ) ĊĊĠĠĠ Ġprivate Ġfun Ġinit ( context : ĠContext ) Ġ{ ĊĠĠĠĠĠĠĠ Ġset Will Not Draw ( false ) ĊĠĠĠĠĠĠĠ Ġend Icon Mode Ġ= ĠEND _ ICON _ CUSTOM ĊĠĠĠĠĠĠĠ Ġend Icon Drawable Ġ= ĠContext Compat . get Drawable ( context , ĠR . drawable . ic _ calendar ) ĊĠĠĠĠĠĠĠ Ġm Edit Date Ġ= ĠText Input EditText ( getContext ()) ĊĊĠĠĠĠĠĠĠ Ġcreate Edit Box ( m Edit Date ) ĊĊĠĠĠĠĠĠĠ Ġset End Icon OnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow Calendar () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Edit Box ( edit Text : ĠText Input EditText ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlayout Params Ġ= ĠLayout Params ( LayoutParams . MATCH _ PARENT , ĠLayout Params . MATCH _ PARENT ) ĊĠĠĠĠĠĠĠ Ġedit Text . layout Params Ġ= Ġlayout Params ĊĠĠĠĠĠĠĠ Ġedit Text . input Type Ġ= ĠEditor Info . TYPE _ CLASS _ DATETIME ĊĠĠĠĠĠĠĠ Ġedit Text . filters Ġ= ĠarrayOf < Input Filter >( Input Filter . Length Filter ( 1 0 )) ĊĊĠĠĠĠĠĠĠ Ġwatcher Mask Ġ= ĠWatch er Mask ( mask , Ġedit Text ) ĊĊĠĠĠĠĠĠĠ Ġedit Text . add TextChanged Listener ( watcher Mask ) ĊĠĠĠĠĠĠĠ Ġedit Text . add TextChanged Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! Ġvalidate ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠmCurrent Date Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġadd View ( edit Text ) ĊĊĠĠĠĠĠĠĠ Ġedit Text . setOn Focus ChangeListener Ġ{ Ġ_, Ġhas Focus Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Focus Change ?. on Focus Change ( has Focus ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow Calendar () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdate Default Ġ= ĠCalendar . getInstance () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( validate ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdate Default . time Ġ= ĠmCurrent Date ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġs Year Ġ= Ġdate Default . get ( Calendar . YEAR ) ĊĠĠĠĠĠĠĠ Ġval Ġs Month Ġ= Ġdate Default . get ( Calendar . MONTH ) ĊĠĠĠĠĠĠĠ Ġval Ġs Day Ġ= Ġdate Default . get ( Calendar . DAY _ OF _ MONTH ) ĊĊĠĠĠĠĠĠĠ Ġval Ġdate P iker Ġ= ĠDate Picker Dialog ( context , Ġ{ Ġ_, Ġyear , Ġmonth , Ġday OfMonth Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdate Default . set ( year , Ġmonth , Ġday OfMonth ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠmCurrent Date Ġ= Ġdate Default . time ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġprint Date () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Focus Change ?. on SetValue () ĊĠĠĠĠĠĠĠ Ġ}, Ġs Year , Ġs Month , Ġs Day ) ĊĊĠĠĠĠĠĠĠ Ġdate P iker . show () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġvalidate (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġonly Numbers ( m Edit Date . text . toString ()) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( data . length < 8 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġreturn Ġconvert () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġconvert (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Ġ= ĠSimpleDateFormat ( mask , ĠLocale . ROOT ). parse ( m Edit Date . text . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠmCurrent Date Ġ= Ġdata ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġinit ( context ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprint Date () Ġ{ ĊĠĠĠĠĠĠĠ Ġm Edit Date . setText ( format ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġformat (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠSimpleDateFormat ( mask ). format ( m Current Date ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠisValid Date (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠmCurrent Date Ġ!= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinterface ĠOn Date ChangeListener Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġon Focus Change ( has Focus : ĠBoolean ) ĊĠĠĠĠĠĠĠ Ġfun Ġon SetValue () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride ĊĠĠĠ Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġm Edit Date . text . toString () ĊĠĠĠ Ġ} Ċ }