package Ġio . b umb um apps . radio . intern e tr adi op layer . extensions Ċ Ċ import Ġandroid . animation . Object Animator Ċ import Ġandroid . os . Build Ċ import Ġandroid . os . Handler Ċ import Ġandroid . os . Looper Ċ import Ġandroid . text . Editable Ċ import Ġandroid . text . Text Watcher Ċ import Ġandroid . view . View Ċ import Ġandroid . view . View Tree Observer Ċ import Ġandroid . view . animation . Accel erate De cel erate Interpolator Ċ import Ġandroid . widget . Seek Bar Ċ import Ġandroid . widget . TextView Ċ import Ġandroidx . annotation . Id Res Ċ import Ġandroidx . drawer layout . widget . Drawer Layout Ċ import Ġandroidx . dynamic animation . animation . Dynamic Animation Ċ import Ġandroidx . dynamic animation . animation . Spring Animation Ċ import Ġandroidx . dynamic animation . animation . Spring Force ĊĊ Ċ /** Ċ Ġ* ĠCreated Ġby ĠV lad im ir ĠM ik h ale v Ġ 1 7 . 1 1 . 2 0 1 7 . Ċ Ġ*/ Ċ Ċ fun Ġrun On Ui Thread ( action : Ġ() Ġ-> ĠUnit ) Ġ{ ĊĠĠĠ Ġval Ġmain Looper Ġ= ĠL ooper . get Main Looper () ĊĠĠĠ Ġif Ġ( Thread . currentThread (). id Ġ!= Ġmain Looper . thread . id ) Ġ{ ĊĠĠĠĠĠĠĠ ĠHandler ( main Looper ). post ( action ) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġaction . invoke () ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġrun On Ui Thread Delayed ( delay Ms : ĠLong , Ġaction : Ġ() Ġ-> ĠUnit ) Ġ{ ĊĠĠĠ Ġval Ġmain Looper Ġ= ĠL ooper . get Main Looper () ĊĠĠĠ ĠHandler ( main Looper ). post Delayed ( action , Ġdelay Ms ) Ċ } Ċ Ċ inline Ġfun ĠView . waitFor Measure ( cross inline Ġblock : Ġ() Ġ-> ĠUnit ) Ġ{ ĊĠĠĠ Ġif Ġ( width Ġ> Ġ 0 Ġ&& Ġheight Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġblock () ĊĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} ĊĠĠĠ Ġview Tree Observer . add On Pre Draw Listener ( object Ġ: ĠView Tree Observer . On Pre Draw Listener Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Pre Draw (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġobserver Ġ= Ġview Tree Observer ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( observer . is Alive ) Ġobserver . remove On Pre Draw Listener ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġblock () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}) Ċ } Ċ Ċ inline Ġfun ĠView . waitFor Layout ( cross inline Ġhandler : Ġ() Ġ-> ĠBoolean ) Ġ{ ĊĠĠĠ Ġview Tree Observer . add On Global Layout Listener ( object Ġ: ĠView Tree Observer . On Global Layout Listener Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Global Layout () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġobserver Ġ= Ġview Tree Observer ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( handler () Ġ&& Ġobserver . is Alive ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobserver . remove On Global Layout Listener ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}) Ċ } Ċ Ċ fun ĠView . visible ( visible : ĠBoolean , Ġgone : ĠBoolean Ġ= Ġtrue ) Ġ{ ĊĠĠĠ Ġvisibility Ġ= Ġif Ġ( visible ) ĠView . VISIBLE Ġelse Ġif Ġ( g one ) ĠView . GONE Ġelse ĠView . IN VISIBLE Ċ } Ċ Ċ val ĠView ?. isVisible : ĠBoolean ĊĠĠĠ Ġget () Ġ= Ġthis ?. visibility Ġ== ĠView . VISIBLE Ċ Ċ fun ĠView . find Parent (@ Id Res Ġid : ĠInt ): ĠView ? Ġ{ ĊĠĠĠ Ġval Ġparent View Ġ= Ġparent Ġas ? ĠView Ġ?: Ġreturn Ġnull ĊĠĠĠ Ġreturn Ġif Ġ( parent View . id Ġ== Ġid ) Ġparent View ĊĠĠĠ Ġelse Ġparent View . find Parent ( id ) Ċ } Ċ Ċ fun ĠTextView . on Text Changes ( listener : Ġ( String ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠ Ġadd TextChanged Listener ( object Ġ: ĠText Watcher Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġafter TextChanged ( s : ĠEdit able ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . invoke ( s . toString ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġbefore TextChanged ( s : ĠCharSequence ?, Ġstart : ĠInt , Ġcount : ĠInt , Ġafter : ĠInt ) Ġ{} ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon TextChanged ( s : ĠCharSequence ?, Ġstart : ĠInt , Ġbefore : ĠInt , Ġcount : ĠInt ) Ġ{} ĊĠĠĠ Ġ}) Ċ } ĊĊ Ċ fun ĠTextView . setText Or Hide ( text : ĠString ?) Ġ{ ĊĠĠĠ Ġif Ġ( text Ġ== Ġnull Ġ|| Ġtext . isBlank ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġvisible ( false ) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġvisible ( true ) ĊĠĠĠĠĠĠĠ Ġthis . text Ġ= Ġtext ĊĠĠĠ Ġ} Ċ } ĊĊ Ċ fun ĠSeek Bar . set Progress X ( progress : ĠInt , Ġanimate : ĠBoolean ) Ġ{ ĊĠĠĠ Ġif Ġ( animate ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= Ġ 2 4 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Progress ( progress , Ġanimate ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( Object Animator . of Int ( this , Ġ" progress ", Ġprogress )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġduration Ġ= Ġ 3 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinterpol ator Ġ= ĠAccel erate De cel erate Interpolator () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġset Progress ( progress ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun ĠView . bounce X Animation ( dp Velocity : ĠFloat ): ĠSpring Animation Ġ{ ĊĠĠĠ Ġreturn ĠSpring Animation ( this , ĠDynamic Animation . TRANSL ATION _ X , Ġ 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Start Velocity ( dp Velocity Ġ* Ġcontext . dp ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġspring . d amping Ratio Ġ= ĠSpring Force . DA MP ING _ RATIO _ HIGH _ BOUN CY ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġspring . st iff ness Ġ= Ġ 1 0 0 0 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ } Ċ Ċ fun ĠDraw er Layout . lock ( locked : ĠBoolean ) Ġ{ ĊĠĠĠ Ġset Drawer Lock Mode ( if Ġ( locked ) ĠDraw er Layout . LOCK _ MODE _ LOCK ED _ CLOSED ĊĠĠĠ Ġelse ĠDraw er Layout . LOCK _ MODE _ UNLOCK ED ) Ċ } Ċ