/** Ċ Ġ* ĠCopyright Ġ 2 0 2 0 ĠThe ĠT ari ĠProject Ċ Ġ* Ċ Ġ* ĠRedistribution Ġand Ġuse Ġin Ġsource Ġand Ġbinary Ġforms , Ġwith Ġor Ċ Ġ* Ġwithout Ġmodification , Ġare Ġpermitted Ġprovided Ġthat Ġthe Ċ Ġ* Ġfollowing Ġconditions Ġare Ġmet : Ċ Ġ* Ċ Ġ* Ġ 1 . ĠRedistributions Ġof Ġsource Ġcode Ġmust Ġretain Ġthe Ġabove Ġcopyright Ġnotice , Ċ Ġ* Ġthis Ġlist Ġof Ġconditions Ġand Ġthe Ġfollowing Ġdisclaimer . Ċ Ġ* Ċ Ġ* Ġ 2 . ĠRedistributions Ġin Ġbinary Ġform Ġmust Ġreproduce Ġthe Ġabove Ċ Ġ* Ġcopyright Ġnotice , Ġthis Ġlist Ġof Ġconditions Ġand Ġthe Ġfollowing Ġdisclaimer Ġin Ġthe Ċ Ġ* Ġdocumentation Ġand / or Ġother Ġmaterials Ġprovided Ġwith Ġthe Ġdistribution . Ċ Ġ* Ċ Ġ* Ġ 3 . ĠNeither Ġthe Ġname Ġof Ġthe Ġcopyright Ġholder Ġnor Ġthe Ġnames Ġof Ċ Ġ* Ġits Ġcontributors Ġmay Ġbe Ġused Ġto Ġendorse Ġor Ġpromote Ġproducts Ċ Ġ* Ġderived Ġfrom Ġthis Ġsoftware Ġwithout Ġspecific Ġprior Ġwritten Ġpermission . Ċ Ġ* Ċ Ġ* ĠTHIS ĠSOFTWARE ĠIS ĠPROVIDED ĠBY ĠTHE ĠCOPYRIGHT ĠHOLDERS ĠAND Ċ Ġ* ĠCONTRIBUTORS Ġ" AS ĠIS " ĠAND ĠANY ĠEXPRESS ĠOR ĠIMPLIED ĠWARRANTIES , Ċ Ġ* ĠINCLUDING , ĠBUT ĠNOT ĠLIMITED ĠTO , ĠTHE ĠIMPLIED ĠWARRANTIES Ċ Ġ* ĠOF ĠMERCHANTABILITY ĠAND ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE ĠARE Ċ Ġ* ĠDISCLAIMED . ĠIN ĠNO ĠEVENT ĠSHALL ĠTHE ĠCOPYRIGHT ĠHOLDER ĠOR Ċ Ġ* ĠCONTRIBUTORS ĠBE ĠLIABLE ĠFOR ĠANY ĠDIRECT , ĠINDIRECT , ĠINCIDENTAL , Ċ Ġ* ĠSPECIAL , ĠEXEMPLARY , ĠOR ĠCONSEQUENTIAL ĠDAMAGES Ġ( INCLUDING , ĠBUT Ċ Ġ* ĠNOT ĠLIMITED ĠTO , ĠPROCUREMENT ĠOF ĠSUBSTITUTE ĠGOODS ĠOR ĠSERVICES ; Ċ Ġ* ĠLOSS ĠOF ĠUSE , ĠDATA , ĠOR ĠPROFITS ; ĠOR ĠBUSINESS ĠINTERRUPTION ) Ċ Ġ* ĠHOWEVER ĠCAUSED ĠAND ĠON ĠANY ĠTHEORY ĠOF ĠLIABILITY , ĠWHETHER ĠIN Ċ Ġ* ĠCONTRACT , ĠSTRICT ĠLIABILITY , ĠOR ĠTORT Ġ( INCLUDING ĠNEGLIGENCE Ċ Ġ* ĠOR ĠOTHERWISE ) ĠARISING ĠIN ĠANY ĠWAY ĠOUT ĠOF ĠTHE ĠUSE ĠOF ĠTHIS Ċ Ġ* ĠSOFTWARE , ĠEVEN ĠIF ĠADVISED ĠOF ĠTHE ĠPOSSIBILITY ĠOF ĠSUCH ĠDAMAGE . Ċ Ġ*/ Ċ package Ġcom . t ari . android . wallet . ui . extension Ċ Ċ import Ġandroid . animation . Animator Set Ċ import Ġandroid . animation . Value Animator Ċ import Ġandroid . content . Context Ċ import Ġandroid . graphics . drawable . Drawable Ċ import Ġandroid . util . Typed Value Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroid . view . View Tree Observer Ċ import Ġandroid . view . animation . Accel erate Interpolator Ċ import Ġandroid . view . animation . De cel erate Interpolator Ċ import Ġandroid . widget . ProgressBar Ċ import Ġandroid . widget . ScrollView Ċ import Ġandroid . widget . TextView Ċ import Ġandroidx . annotation .* Ċ import Ġandroidx . appcompat . widget . AppCompat EditText Ċ import Ġandroidx . core . animation . addListener Ċ import Ġandroidx . core . graphics . Blend Mode Color Filter Compat Ċ import Ġandroidx . core . graphics . Blend Mode Compat Ċ import Ġandroidx . fragment . app . Fragment Transaction Ċ import Ġandroidx . recyclerview . widget . Linear LayoutManager Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġcom . air bnb . lott ie . Lot tie Animation View Ċ import Ġcom . or h ano but . logger . Logger Ċ import Ġcom . t ari . android . wallet . R Ċ import Ġcom . t ari . android . wallet . ui . dialog . Bottom Slide Dialog Ċ import Ġcom . t ari . android . wallet . util . Constants Ċ import Ġjava . lang . ref . Weak Reference Ċ import Ġandroid . animation . Animator Ġas ĠLegacy Animator Ċ import Ġandroid . animation . Animator . Animator Listener Ġas ĠLegacy Animator Listener Ċ Ċ internal Ġfun ĠRecyclerView . is Sc rolled To Top (): ĠBoolean Ġ{ ĊĠĠĠ Ġval Ġlayout Manager Ġ= Ġ( layout Manager Ġas ? ĠLinearLayoutManager ) Ġ?: Ġreturn Ġfalse ĊĠĠĠ Ġif Ġ( layout Manager . child Count Ġ== Ġ 0 ) Ġreturn Ġtrue ĊĠĠĠ Ġreturn Ġ( layout Manager . findFirst Visible Item Position () Ġ== Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġlayout Manager . find View By Position ( 0 )?. top Ġ== Ġ 0 ) Ċ } Ċ Ċ internal Ġfun ĠView . visible () Ġ{ ĊĠĠĠ Ġthis . visibility Ġ= ĠView . VISIBLE Ċ } Ċ Ċ internal Ġfun ĠView . invisible () Ġ{ ĊĠĠĠ Ġthis . visibility Ġ= ĠView . IN VISIBLE Ċ } Ċ Ċ internal Ġfun ĠView . g one () Ġ{ ĊĠĠĠ Ġthis . visibility Ġ= ĠView . GONE Ċ } Ċ Ċ internal Ġfun ĠView . setVisible ( visible : ĠBoolean , Ġhide State : ĠInt Ġ= ĠView . GONE ) Ġ{ ĊĠĠĠ Ġvisibility Ġ= Ġif Ġ( visible ) ĠView . VISIBLE Ġelse Ġhide State Ċ } Ċ Ċ /** Ċ Ġ* ĠGiven Ġthe Ġcontext , Ġdisplays Ġthe Ġstandard Ġ" no Ġinternet Ġconnection " Ġdialog . Ċ Ġ*/ Ċ internal Ġfun Ġshow Internet Connection Error Dialog ( context : ĠContext ) Ġ{ ĊĠĠĠ ĠBottom Slide Dialog ( ĊĠĠĠĠĠĠĠ Ġcontext Ġ= Ġcontext , ĊĠĠĠĠĠĠĠ Ġlayout Id Ġ= ĠR . layout . internet _ connection _ error _ dialog , ĊĠĠĠĠĠĠĠ Ġdismiss View Id Ġ= ĠR . id . internet _ connection _ error _ dialog _ txt _ close ĊĠĠĠ Ġ). show () Ċ } Ċ Ċ /** Ċ Ġ* ĠSets Ġthe Ġwidth Ġof Ġa ĠTextView Ġto Ġthe Ġmeasured Ġwidth Ġof Ġits Ġcontents Ċ Ġ* Ġtaking Ġinto Ġaccount Ġthe Ġtext Ġsize Ġand Ġthe Ġtype face . Ċ Ġ*/ Ċ internal Ġfun ĠTextView . setWidth To Measured () Ġ{ ĊĠĠĠ Ġmeasure ( View . Measure Spec . UNSPECIFIED , ĠView . Measure Spec . UNSPECIFIED ) ĊĠĠĠ Ġset Layout Width ( meas ured Width ) Ċ } Ċ Ċ /** Ċ Ġ* ĠSets Ġthe Ġsize Ġof Ġa ĠTextView Ġto Ġthe Ġmeasured Ġsize Ġof Ġits Ġcontents Ċ Ġ* Ġtaking Ġinto Ġaccount Ġthe Ġtext Ġsize Ġand Ġthe Ġtype face . Ċ Ġ*/ Ċ internal Ġfun ĠTextView . setWidth And Height To Measured () Ġ{ ĊĠĠĠ Ġmeasure ( View . Measure Spec . UNSPECIFIED , ĠView . Measure Spec . UNSPECIFIED ) ĊĠĠĠ Ġset Layout Width ( meas ured Width ) ĊĠĠĠ Ġset Layout Height ( meas ured Height ) Ċ } Ċ Ċ /** Ċ Ġ* ĠSets Ġtext Ġsize Ġin Ġpixel Ġunits . Ċ Ġ*/ Ċ internal Ġfun ĠTextView . setText Size Px ( size Px : ĠFloat ) Ġ{ ĊĠĠĠ Ġset Text Size ( ĊĠĠĠĠĠĠĠ ĠTyped Value . COMPLEX _ UNIT _ PX , ĊĠĠĠĠĠĠĠ Ġsize Px ĊĠĠĠ Ġ) Ċ } Ċ Ċ /** Ċ Ġ* Ġ@ return Ġfirst Ġchild Ġof Ġthe Ġview Ġgroup , Ġnull Ġif Ġno Ġchildren Ċ Ġ*/ Ċ internal Ġfun ĠViewGroup . getFirst Child (): ĠView ? Ġ{ ĊĠĠĠ Ġreturn Ġif Ġ( child Count Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . getChild At ( 0 ) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġnull ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* Ġ@ return Ġlast Ġchild Ġof Ġthe Ġview Ġgroup , Ġnull Ġif Ġno Ġchildren Ċ Ġ*/ Ċ internal Ġfun ĠViewGroup . getLast Child (): ĠView ? Ġ{ ĊĠĠĠ Ġreturn Ġif Ġ( child Count Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . getChild At ( child Count Ġ- Ġ 1 ) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġnull ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠScroll Ġto Ġthe Ġtop Ġof Ġthe Ġscroll Ġview . Ċ Ġ*/ Ċ internal Ġfun ĠScroll View . scrollTo Top () Ġ{ ĊĠĠĠ Ġscroll To ( 0 , Ġ 0 ) Ċ } Ċ Ċ /** Ċ Ġ* ĠScroll Ġto Ġthe Ġbottom Ġof Ġthe Ġscroll Ġview . Ċ Ġ*/ Ċ internal Ġfun ĠScroll View . scrollTo Bottom () Ġ{ ĊĠĠĠ Ġval Ġlast Child Ġ= Ġget Child At ( child Count Ġ- Ġ 1 ) ĊĠĠĠ Ġval Ġbottom Ġ= Ġlast Child . bottom Ġ+ Ġpadding Bottom ĊĠĠĠ Ġval Ġdelta Ġ= Ġbottom Ġ- Ġ( scroll Y Ġ+ Ġheight ) ĊĠĠĠ Ġsmooth Scroll By ( 0 , Ġdelta ) Ċ } Ċ Ċ internal Ġfun ĠL ot tie Animation View . add Animator Listener ( ĊĠĠĠ ĠonStart : Ġ( Legacy Animator ?) Ġ-> ĠUnit Ġ= Ġ{}, ĊĠĠĠ Ġon End : Ġ( Legacy Animator ?) Ġ-> ĠUnit Ġ= Ġ{}, ĊĠĠĠ Ġon Cancel : Ġ( Legacy Animator ?) Ġ-> ĠUnit Ġ= Ġ{}, ĊĠĠĠ Ġon Repeat : Ġ( Legacy Animator ?) Ġ-> ĠUnit Ġ= Ġ{} Ċ ) Ġ{ ĊĠĠĠ Ġadd Animator Listener ( object Ġ: ĠLegacy Animator Listener Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Animation Repeat ( animation : ĠLegacy Animator ?) Ġ= Ġon Repeat ( animation ) ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Animation End ( animation : ĠLegacy Animator ?) Ġ= Ġon End ( animation ) ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Animation Cancel ( animation : ĠLegacy Animator ?) Ġ= Ġon Cancel ( animation ) ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Animation Start ( animation : ĠLegacy Animator ?) Ġ= ĠonStart ( animation ) ĊĠĠĠ Ġ}) Ċ } Ċ Ċ internal Ġfun ĠView . do On Global Layout ( block : Ġ() Ġ-> ĠUnit ) Ġ{ ĊĠĠĠ Ġthis . view Tree Observer . add On Global Layout Listener ( ĊĠĠĠĠĠĠĠ Ġobject Ġ: ĠView Tree Observer . On Global Layout Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Global Layout () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ do On Global Layout . view Tree Observer . remove On Global Layout Listener ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblock () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) Ċ } Ċ Ċ internal Ġfun ĠView . set Top Margin ( margin : ĠInt ) Ġ{ ĊĠĠĠ Ġif Ġ( layout Params Ġis ĠViewGroup . Margin LayoutParams ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlayout Params Ġ= Ġlayout Params Ġas ĠViewGroup . Margin LayoutParams ĊĠĠĠĠĠĠĠ Ġlayout Params . top Margin Ġ= Ġmargin ĊĠĠĠĠĠĠĠ Ġthis . layout Params Ġ= Ġlayout Params ĊĠĠĠ Ġ} Ċ } Ċ Ċ internal Ġfun ĠView . set Bottom Margin ( margin : ĠInt ) Ġ{ ĊĠĠĠ Ġif Ġ( layout Params Ġis ĠViewGroup . Margin LayoutParams ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlayout Params Ġ= Ġlayout Params Ġas ĠViewGroup . Margin LayoutParams ĊĠĠĠĠĠĠĠ Ġlayout Params . bottom Margin Ġ= Ġmargin ĊĠĠĠĠĠĠĠ Ġthis . layout Params Ġ= Ġlayout Params ĊĠĠĠ Ġ} Ċ } Ċ Ċ internal Ġfun ĠView . post Delayed ( time Millis : ĠLong , Ġaction : Ġ() Ġ-> ĠUnit ) Ġ= ĊĠĠĠ Ġthis . post Delayed ( action , Ġtime Millis ) Ċ Ċ internal Ġfun ĠView . string (@ String Res Ġid : ĠInt ): ĠString Ġ= Ġcontext . string ( id ) Ċ Ċ internal Ġfun ĠView . string (@ String Res Ġid : ĠInt , Ġvar arg Ġformat Args : ĠAny ): ĠString Ġ= ĊĠĠĠ Ġcontext . string ( id , Ġ* format Args ) Ċ Ċ internal Ġfun ĠView . color (@ Color Res Ġid : ĠInt ): ĠInt Ġ= Ġcontext . color ( id ) Ċ Ċ internal Ġfun ĠView . dim en (@ Dim en Res Ġid : ĠInt ): ĠFloat Ġ= Ġcontext . dim en ( id ) Ċ Ċ internal Ġfun ĠView . dim en Px (@ Dim en Res Ġid : ĠInt ): ĠInt Ġ= Ġcontext . dim en Px ( id ) Ċ Ċ internal Ġfun ĠView . drawable (@ Drawable Res Ġid : ĠInt ): ĠDrawable ? Ġ= Ġcontext . drawable ( id ) Ċ Ċ internal Ġfun ĠView . setOn Th rott led ClickListener ( action : Ġ( View ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠ Ġthis . setOnClickListener ( Throttle Click ( action )) Ċ } Ċ Ċ internal Ġclass ĠTh rottle Click ( private Ġval Ġdelegate : Ġ( View ) Ġ-> ĠUnit ) Ġ: ĠView . OnClickListener Ġ{ ĊĠĠĠ Ġoverride Ġfun ĠonClick ( v : ĠView ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġv ?. temp or arily Disable Click () ĊĠĠĠĠĠĠĠ Ġv ?. let ( delegate ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ // Ġmethod Ġname Ġis Ġthis Ġrather Ġthan Ġ" setWidth " Ġbecause Ġ" setWidth " Ġmight Ġconflict Ġwith ĠView 's Ċ // Ġsub types Ġintr insic Ġmethods Ċ fun ĠView . setLayout Width ( width : ĠInt ) Ġ{ ĊĠĠĠ Ġthis . layout Params ?. let Ġ{ Ġthis @ setLayout Width . layout Params Ġ= Ġit . also Ġ{ Ġp Ġ-> Ġp . width Ġ= Ġwidth Ġ} Ġ} Ċ } Ċ Ċ // Ġmethod Ġname Ġis Ġthis Ġrather Ġthan Ġ" set Height " Ġbecause Ġ" set Height " Ġmight Ġconflict Ġwith ĠView 's Ċ // Ġsub types Ġintr insic Ġmethods Ċ fun ĠView . setLayout Height ( height : ĠInt ) Ġ{ ĊĠĠĠ Ġthis . layout Params ?. let Ġ{ Ġthis @ setLayout Height . layout Params Ġ= Ġit . also Ġ{ Ġp Ġ-> Ġp . height Ġ= Ġheight Ġ} Ġ} Ċ } Ċ Ċ fun ĠView . setLayout Size ( width : ĠInt , Ġheight : ĠInt ) Ġ{ ĊĠĠĠ Ġthis . layout Params ?. let Ġ{ ĊĠĠĠĠĠĠĠ Ġthis @ setLayout Size . layout Params Ġ= Ġit . also Ġ{ Ġp Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġp . width Ġ= Ġwidth ĊĠĠĠĠĠĠĠĠĠĠĠ Ġp . height Ġ= Ġheight ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun ĠView . layout Params Height () Ġ= Ġ( layout Params Ġas ĠViewGroup . Margin LayoutParams ). height Ċ Ċ fun ĠView . get Bottom Margin () Ġ= Ġ( layout Params Ġas ĠViewGroup . Margin LayoutParams ). bottom Margin Ċ Ċ fun ĠView . getStart Margin () Ġ= Ġ( layout Params Ġas ĠViewGroup . Margin LayoutParams ). margin Start Ċ Ċ fun ĠView . set Start Margin ( margin : ĠInt ) Ġ{ ĊĠĠĠ Ġif Ġ( layout Params Ġis ĠViewGroup . Margin LayoutParams ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlayout Params Ġ= Ġthis . layout Params Ġas ĠViewGroup . Margin LayoutParams ĊĠĠĠĠĠĠĠ Ġlayout Params . margin Start Ġ= Ġmargin ĊĠĠĠĠĠĠĠ Ġthis . layout Params Ġ= Ġlayout Params ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun ĠProgress Bar . setColor ( color : ĠInt ) Ġ{ ĊĠĠĠ Ġthis . in determinate Drawable ĊĠĠĠĠĠĠĠ Ġ. mutate () ĊĠĠĠĠĠĠĠ Ġ. color Filter Ġ= ĠBlend Mode Color Filter Compat . create Blend Mode Color Filter Compat ( ĊĠĠĠĠĠĠĠ Ġcolor , ĠBlend Mode Compat . SRC _ IN ĊĠĠĠ Ġ) Ċ } Ċ Ċ fun ĠView . temp or arily Disable Click () Ġ{ ĊĠĠĠ Ġis Clickable Ġ= Ġfalse ĊĠĠĠ Ġpost Delayed ( ĊĠĠĠĠĠĠĠ ĠClick En abling Runnable ( this ), ĊĠĠĠĠĠĠĠ ĠConstants . UI . x Long Duration Ms ĊĠĠĠ Ġ) Ċ } Ċ Ċ fun ĠAppCompat EditText . setText Sil ently ( new Text : ĠString ) Ġ{ ĊĠĠĠ Ġif Ġ( text . toString () Ġ!= Ġnew Text ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġselection Start Point Ġ= Ġselection Start ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġselection EndPoint Ġ= Ġselection End ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Text ( new Text ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġselection EndPoint Ġ= ĠMath . min ( selection End , Ġnew Text . length ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġselection Start Point Ġ= ĠMath . min ( selection Start , Ġselection End ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Selection ( selection Start Point , Ġselection EndPoint ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . i ( e . toString ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun ĠAppCompat EditText . setSelection ToEnd () Ġ{ ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġselection EndPoint Ġ= Ġtext . toString (). length ĊĠĠĠĠĠĠĠ Ġset Selection ( selection EndPoint , Ġselection EndPoint ) ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠ ĠLogger . i ( e . toString ()) ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠMakes Ġthe Ġgiven Ġview Ġclick able Ġagain . Ċ Ġ*/ Ċ private Ġclass ĠClick En abling Runnable (@ NonNull Ġview : ĠView ) Ġ: ĠRunnable Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġview WR : ĠWeak Reference < View > Ġ= ĠWeak Reference ( view ) ĊĊĠĠĠ Ġoverride Ġfun Ġrun () Ġ{ ĊĠĠĠĠĠĠĠ Ġview WR . get ()?. run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Clickable Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġno - op ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun ĠView . animate Click ( on End : Ġ( android . animation . Animator ) Ġ-> ĠUnit Ġ= Ġ{}) Ġ{ ĊĠĠĠ Ġval Ġscale Down Btn Anim Ġ= ĠValue Animator . of Float ( ĊĠĠĠĠĠĠĠ ĠConstants . UI . Button . click Scale Anim Full Scale , ĊĠĠĠĠĠĠĠ ĠConstants . UI . Button . click Scale Anim Small Scale ĊĠĠĠ Ġ) ĊĠĠĠ Ġscale Down Btn Anim . add Update Listener Ġ{ Ġvalue Animator : ĠValue Animator Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġscale Ġ= Ġvalue Animator . animated Value Ġas ĠFloat ĊĠĠĠĠĠĠĠ Ġscale X Ġ= Ġscale ĊĠĠĠĠĠĠĠ Ġscale Y Ġ= Ġscale ĊĠĠĠ Ġ} ĊĠĠĠ Ġscale Down Btn Anim . duration Ġ= ĠConstants . UI . Button . click Scale Anim Duration Ms ĊĠĠĠ Ġscale Down Btn Anim . start Delay Ġ= ĠConstants . UI . Button . click Scale Anim Start Offset ĊĠĠĠ Ġscale Down Btn Anim . interpol ator Ġ= ĠDec el erate Interpolator () ĊĊĠĠĠ Ġval Ġscale Up Btn Anim Ġ= ĠValue Animator . of Float ( ĊĠĠĠĠĠĠĠ ĠConstants . UI . Button . click Scale Anim Small Scale , ĊĠĠĠĠĠĠĠ ĠConstants . UI . Button . click Scale Anim Full Scale ĊĠĠĠ Ġ) ĊĠĠĠ Ġscale Up Btn Anim . add Update Listener Ġ{ Ġvalue Animator : ĠValue Animator Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġscale Ġ= Ġvalue Animator . animated Value Ġas ĠFloat ĊĠĠĠĠĠĠĠ Ġscale X Ġ= Ġscale ĊĠĠĠĠĠĠĠ Ġscale Y Ġ= Ġscale ĊĠĠĠ Ġ} ĊĠĠĠ Ġscale Up Btn Anim . duration Ġ= ĠConstants . UI . Button . click Scale Anim Return Duration Ms ĊĠĠĠ Ġscale Up Btn Anim . start Delay Ġ= ĠConstants . UI . Button . click Scale Anim Return Start Offset ĊĠĠĠ Ġscale Up Btn Anim . interpol ator Ġ= ĠAccel erate Interpolator () ĊĊĠĠĠ Ġval Ġanim Set Ġ= ĠAn imator Set () ĊĠĠĠ Ġanim Set . addListener ( on End Ġ= Ġon End ) ĊĠĠĠ Ġanim Set . play Se quent ially ( scale Down Btn Anim , Ġscale Up Btn Anim ) ĊĠĠĠ Ġanim Set . start () Ċ } Ċ Ċ fun ĠFragment Transaction . add Fade In Animation (): ĠFragment Transaction Ġ{ ĊĠĠĠ Ġthis . set Custom Animations ( R . anim . fade _ in , ĠR . anim . fade _ out ) ĊĠĠĠ Ġreturn Ġthis Ċ } Ċ Ċ fun ĠFragment Transaction . add Enter Left Animation (): ĠFragment Transaction Ġ{ ĊĠĠĠ Ġthis . set Custom Animations ( ĊĠĠĠĠĠĠĠ ĠR . anim . enter _ from _ right , ĠR . anim . exit _ to _ left , ĊĠĠĠĠĠĠĠ ĠR . anim . enter _ from _ left , ĠR . anim . exit _ to _ right ĊĠĠĠ Ġ) ĊĠĠĠ Ġreturn Ġthis Ċ }