package Ġcom . ing resse . design . ui . spinner Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . util . Attribute Set Ċ import Ġandroid . util . Typed Value Ċ import Ġandroid . view . Motion Event Ċ import Ġandroid . view . View Ċ import Ġandroid . view . animation . Translate Animation Ċ import Ġandroid . widget .* Ċ import Ġcom . ing resse . design . R Ċ import Ġcom . ing resse . design . helper . Resources Helper Ċ import Ġkotlinx . android . synt hetic . main . custom _ spinner . view .* Ċ import Ġkotlinx . android . synt hetic . main . custom _ spinner . view . txt _ hint Ċ Ċ class ĠD SS p inner ( context : ĠContext , Ġattrs : ĠAttributeSet ): ĠFrame Layout ( context , Ġattrs ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġhint : ĠString ĊĠĠĠ Ġprivate Ġval Ġhint Color : ĠInt ĊĠĠĠ Ġprivate Ġvar Ġcustom Hints : ĠList < String > Ġ= Ġempty List () ĊĊĠĠĠ Ġprivate Ġval Ġres Helper Ġ= ĠResources Helper ( context ) ĊĠĠĠ Ġprivate Ġvar Ġhas First Item Ġ= Ġfalse ĊĠĠĠ Ġvar Ġis Wrong Ġ= Ġfalse ĊĊĠĠĠ Ġprivate Ġval ĠtextView : ĠTextView Ġget () Ġ= Ġtxt _ hint ĊĠĠĠ Ġval Ġspinner : ĠSp inner Ġget () Ġ= Ġcustom _ spinner ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġinf late ( context , ĠR . layout . custom _ spinner , Ġthis ) ĊĊĠĠĠĠĠĠĠ Ġval Ġdefault Color Ġ= Ġres Helper . getColor Helper ( R . color . mer cury ) ĊĠĠĠĠĠĠĠ Ġval Ġarray Ġ= Ġcontext . theme . obtain Styled Attributes ( attrs , ĠR . style able . D SS p inner , Ġ 0 , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġhint Ġ= Ġarray . getString ( R . style able . D SS p inner _ custom Hint ) Ġ?: Ġ"" ĊĠĠĠĠĠĠĠ Ġhint Color Ġ= Ġarray . getColor ( R . style able . D SS p inner _ custom Hint Color , Ġdefault Color ) ĊĊĠĠĠĠĠĠĠ Ġtxt _ hint . text Ġ= Ġhint ĊĠĠĠĠĠĠĠ Ġtxt _ hint . setTextColor ( hint Color ) ĊĠĠĠĠĠĠĠ Ġset Listeners () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Listeners ( on ItemSelected : Ġ(( position : ĠInt ) Ġ-> ĠUnit )? Ġ= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= Ġobject Ġ: ĠAdapter View . On ItemSelected Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon ItemSelected ( parent : ĠAdapter View < *> ?, Ġview : ĠView ?, Ġposition : ĠInt , Ġid : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Wrong ) Ġanimate Hint To Center () Ġelse Ġanimate Translation ( position ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Wrong ) Ġvalidate Empty EditText Error () Ġelse Ġset Spinner Hint Text Default () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġspinner . alpha Ġ= Ġif Ġ( is Wrong ) Ġ 0 F Ġelse Ġ 1 F ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( custom Hints . size Ġ> Ġposition ) Ġtxt _ hint . text Ġ= Ġcustom Hints [ position ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon ItemSelected ?. invoke ( position ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Wrong Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Nothing Selected ( parent : ĠAdapter View < *> ?) Ġ{} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġspinner . on ItemSelected Listener Ġ= Ġlistener ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset SelectedItem ( position : ĠInt , Ġerror : ĠBoolean Ġ= Ġfalse ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis Wrong Ġ= Ġerror ĊĠĠĠĠĠĠĠ Ġif Ġ( is Wrong ) Ġreturn Ġspinner . setSelection ( 0 ) ĊĠĠĠĠĠĠĠ Ġspinner . setSelection ( position ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġanimate Translation ( position : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmovement Ġ= Ġ( textView . height Ġ* Ġ- 0 . 6 ). toFloat () ĊĠĠĠĠĠĠĠ Ġval Ġcoords Ġ= Ġif Ġ( has First Item Ġ&& Ġposition Ġ== Ġ 0 ) ĠPair ( movement , Ġ 0 F ) Ġelse ĠPair ( 0 F , Ġmovement ) ĊĠĠĠĠĠĠĠ Ġval Ġanimation Ġ= ĠTranslate Animation ( 0 F , Ġ 0 F , Ġcoords . first , Ġcoords . second ) ĊĠĠĠĠĠĠĠ Ġanimation . duration Ġ= Ġ 2 0 0 ĊĠĠĠĠĠĠĠ Ġanimation . fill After Ġ= Ġtrue ĊĠĠĠĠĠĠĠ ĠtextView . start Animation ( animation ) ĊĊĠĠĠĠĠĠĠ Ġval ĠfontSize Ġ= Ġif Ġ( has First Item Ġ&& Ġposition Ġ== Ġ 0 ) Ġ 1 6 f Ġelse Ġ 1 4 f ĊĠĠĠĠĠĠĠ Ġtxt _ hint . setText Size ( Typed Value . COMPLEX _ UNIT _ SP , ĠfontSize ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġanimate Hint To Center () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmovement Ġ= Ġ( textView . height Ġ* Ġ- 0 . 6 ). toFloat () ĊĠĠĠĠĠĠĠ Ġval Ġanimation Ġ= ĠTranslate Animation ( 0 F , Ġ 0 F , Ġmovement , Ġ 0 F ) ĊĠĠĠĠĠĠĠ Ġanimation . duration Ġ= Ġ 2 0 0 ĊĠĠĠĠĠĠĠ Ġanimation . fill After Ġ= Ġtrue ĊĠĠĠĠĠĠĠ ĠtextView . start Animation ( animation ) ĊĠĠĠĠĠĠĠ Ġtxt _ hint . setText Size ( Typed Value . COMPLEX _ UNIT _ SP , Ġ 1 6 f ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Hint ( new Hint : ĠString ) Ġ{ Ġtxt _ hint . text Ġ= Ġnew Hint Ġ} ĊĊĠĠĠ Ġfun Ġset Items ( items : ĠList < String >, Ġshort Items : ĠList < String > Ġ= Ġempty List (), Ġhints : ĠList < String > Ġ= Ġempty List (), Ġfirst Item : ĠString ? Ġ= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġspinner Adapter Ġ= Ġspinner . adapter Ġas ? ĠD SS p inner Adapter Ġ?: Ġcreate Adapter () ĊĠĠĠĠĠĠĠ Ġif Ġ( spinner . adapter Ġ== Ġnull ) Ġspinner . adapter Ġ= Ġspinner Adapter ĊĊĠĠĠĠĠĠĠ Ġhas First Item Ġ= Ġ( first Item Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠ Ġcustom Hints Ġ= Ġhints ĊĠĠĠĠĠĠĠ Ġspinner Adapter . put Item As First ( first Item ) ĊĠĠĠĠĠĠĠ Ġspinner Adapter . items Ġ= Ġitems ĊĠĠĠĠĠĠĠ Ġspinner Adapter . short Items Ġ= Ġshort Items ĊĠĠĠĠĠĠĠ Ġspinner Adapter . notify DataSet Changed () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠD SS p inner Adapter . put Item As First ( item : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( has First Item ) Ġthis . insert ( item , Ġ 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Adapter () Ġ= ĠD SS p inner Adapter ( context ) ĊĊĠĠĠ Ġfun Ġset Spinner Hint Text Default () Ġ{ ĊĠĠĠĠĠĠĠ Ġtxt _ hint . setTextColor ( hint Color ) ĊĠĠĠĠĠĠĠ Ġis Wrong Ġ= Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Spinner Hint Text Error ( animation : ĠBoolean Ġ= Ġfalse ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġerror Color Ġ= Ġres Helper . getColor Helper ( R . color . ruby ) ĊĠĠĠĠĠĠĠ Ġtxt _ hint . setTextColor ( error Color ) ĊĠĠĠĠĠĠĠ Ġif ( animation ) Ġanimate Hint To Center () ĊĠĠĠĠĠĠĠ Ġis Wrong Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġvalidate Empty EditText Error () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( is Wrong ) Ġ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanimate Hint To Center () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Spinner Hint Text Error () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġset Spinner Hint Text Default () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Touch Listener ( listener : Ġ( v : ĠView , Ġevent : ĠMotion Event ) Ġ-> ĠBoolean ) ĊĠĠĠĠĠĠĠ Ġ= Ġspinner . setOn Touch Listener ( listener ) Ċ }