package Ġir . dr ax . modal Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . graphics . drawable . Transition Drawable Ċ import Ġandroid . os . Build Ċ import Ġandroid . util . Attribute Set Ċ import Ġandroid . view .* Ċ import Ġandroid . view . View Tree Observer . On Global Layout Listener Ċ import Ġandroid . view . animation . Animation Ċ import Ġandroid . view . animation . Animation Utils Ċ import Ġandroid . widget .* Ċ import Ġandroidx . core . content . res . Resources Compat Ċ import Ġandroidx . core . view . draw To Bitmap Ċ import Ġandroidx . interpol ator . view . animation . Fast Out Slow In Interpolator Ċ import Ġandroidx . lifecycle . Observer Ċ import Ġandroidx . recyclerview . widget . Linear LayoutManager Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġir . dr ax . modal . model . Modal Obj Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . Global Scope Ċ import Ġkotlinx . coroutines . launch Ċ import Ġkotlinx . coroutines . with Context Ċ import Ġjava . lang . Exception Ċ import Ġjava . util .* Ċ Ċ class ĠModal Builder Ġ@ Jvm Over loads Ġconstructor ( var Ġoptions : Modal Obj , Ġval Ġroot : ĠViewGroup , Ġcontext : ĠContext = root . context , Ġattrs : ĠAttributeSet ?= null , Ġdef Style Attr : ĠInt Ġ= Ġ 0 ) ĊĠĠĠ Ġ: Relative Layout ( context , attrs , def Style Attr ) ĊĠĠĠĠĠĠĠ Ġ, Observer < Modal Obj > Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġslide Animation : ĠAnimation ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġbg : ViewGroup ĊĠĠĠ Ġprivate Ġvar Ġlayout Listener : ĠOn Global Layout Listener ?= null ĊĊĠĠĠ Ġprivate Ġval Ġblur Bg Ġ: ImageView Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠImageView ( root . context ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġvar Ġon Animation Finished Queue : Mutable List < () Ġ-> ĠUnit > Ġ= Ġmutable ListOf () ĊĊĠĠĠ Ġprivate Ġfun Ġdraw Blur Bg (){ ĊĠĠĠĠĠĠĠ Ġval Ġscreen To Capture Ġ= Ġroot . draw To Bitmap () ĊĊĠĠĠĠĠĠĠ ĠGlobal Scope . launch ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBl ur Builder ( root . context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. blur ( screen To Capture ). let Ġ{ bitmap Ġ-> ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith Context ( Dispatch ers . Main ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblur Bg . setImage Bitmap ( bitmap ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} catch Ġ( e : Exception ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġadd View ( options . modal , ĠLayout Params ( LayoutParams . MATCH _ PARENT , LayoutParams . WRAP _ CONTENT )) ĊĠĠĠĠĠĠĠ Ġtag = options . direction ĊĠĠĠĠĠĠĠ Ġvisibility = ĠView . IN VISIBLE ĊĠĠĠĠĠĠĠ Ġbg Ġ= Frame Layout ( root . context ) ĊĠĠĠĠĠĠĠ Ġbg . tag = Modal Obj . VIEW _ TAG _ ID ĊĠĠĠĠĠĠĠ Ġset View Direction () ĊĠĠĠĠĠĠĠ Ġset Header ( bg ) ĊĠĠĠĠĠĠĠ Ġset Progress () ĊĠĠĠĠĠĠĠ Ġset Callback () ĊĠĠĠĠĠĠĠ Ġset List () ĊĠĠĠĠĠĠĠ Ġbg . background = Resources Compat . get Drawable ( resources , R . drawable . modal _ root _ transition , null ) ĊĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . LO L LI POP ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbg . elevation = 1 0 0 f ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġbg . setOnClickListener { Ġhide ( bg ) Ġ} ĊĠĠĠĠĠĠĠ Ġbg . addView ( blur Bg , ViewGroup . LayoutParams ( ViewGroup . LayoutParams . MATCH _ PARENT , ViewGroup . LayoutParams . MATCH _ PARENT )) ĊĠĠĠĠĠĠĠ Ġbg . addView ( this , ViewGroup . LayoutParams ( ViewGroup . LayoutParams . MATCH _ PARENT , ViewGroup . LayoutParams . WRAP _ CONTENT )) ĊĊĊĠĠĠĠĠĠĠ Ġ// ĠDisplay Ġdirection Ġset ĊĠĠĠĠĠĠĠ Ġwith ( Frame Layout . LayoutParams ( LayoutParams . MATCH _ PARENT , ĠLayout Params . WRAP _ CONTENT )){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgravity Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( options . direction Ġ== ĠModal . Direction . Bottom ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGr avity . BOTTOM ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGr avity . TOP ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Params Ġ= Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġhide () Ġ= Ġhide ( bg , true ) ĊĊĠĠĠ Ġfun Ġshow (): Modal Builder { ĊĠĠĠĠĠĠĠ Ġif Ġ( slide Animation Ġ!= Ġnull ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Animation Finished Queue . add Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} else Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Modal () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoptions . update . observe Fore ver ( this ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġbuild Modal (){ ĊĠĠĠĠĠĠĠ Ġif ( bg . parent Ġ== null ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġroot . addView ( bg , ĠLayout Params ( LayoutParams . MATCH _ PARENT , ĠLayout Params . MATCH _ PARENT )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠOn Global Layout Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Global Layout () Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroot . view Tree Observer . remove On Global Layout Listener ( this ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( options . type Ġ== ĠModal . Type . List ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠfindViewById < RecyclerView >( R . id . list ScrollView ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( meas ured Height Ġ> Ġ( bg . height Ġ* Ġ. 7 )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Params . height Ġ= Ġ( bg . height Ġ* Ġ. 7 ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Layout () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠOn ĠAnimation Ġstart ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( options . blur Enabled . not ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( bg . background Ġas ĠTransition Drawable ). start Transition ( options . animation Duration . toInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblur Effect ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠOn ĠAnimation Ġstart ĊĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisibility Ġ= ĠView . VISIBLE ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanimate In ( options . direction ){ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoptions . listener ?. on Show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( options . type Ġ!= ĠModal . Type . Custom ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanimate Ok Btn () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. also Ġ{ Ġlayout Listener Ġ= Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġroot . view Tree Observer ?. add On Global Layout Listener ( layout Listener ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġanimate Ok Btn () Ġ{ ĊĠĠĠĠĠĠĠ ĠfindViewById < View >( R . id . ok ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. animate () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. translation Y ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( options . direction Ġ== ĠModal . Direction . Bottom ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ- 1 6 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Duration ( options . animation Duration ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. start () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġhide ( header : View , Ġforce Close : Boolean = false ) Ġ: ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( slide Animation Ġ!= Ġnull ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Animation Finished Queue . add Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhide ( header , Ġforce Close ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĊĠĠĠĠĠĠĠ Ġ} else Ġif Ġ( options . lock Visibility . not () Ġ|| Ġforce Close ){ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġroot . view Tree Observer . remove On Global Layout Listener ( layout Listener ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( options . blur Enabled . not ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( header . background Ġas ĠTransition Drawable ). reset Transition () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblur Effect ( false ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġanimate Out ( options . direction ){ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrelease ( header ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoptions . listener . let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit ?. on Dismiss () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĊĠĠĠĠĠĠĠ Ġ} else ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrelease ( header : ĠView ) Ġ{ ĊĠĠĠĠĠĠĠ Ġoptions . update . remove Observer ( this @ Modal Builder ) ĊĠĠĠĠĠĠĠ Ġroot . remove View ( header ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinline Ġfun Ġanimate Out ( direction : ĠModal . Direction , Ġcross inline Ġon End : ()-> Unit Ġ= Ġ{}) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġanimation Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen ( direction ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠModal . Direction . Bottom Ġ-> ĠR . anim . slide _ exit _ bottom ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠModal . Direction . Top Ġ-> ĠR . anim . slide _ exit _ top ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġslide Animation Ġ= ĠAnimation Utils ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. load Animation ( context , Ġanimation ) ĊĊĠĠĠĠĠĠĠ Ġstart Animation ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġslide Animation ?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġduration Ġ= Ġoptions . exit Animation Duration ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Animation Listener ( object Ġ: Animation . Animation Listener { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Animation Start ( p 0 : ĠAnimation ?) Ġ{} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Animation End ( p 0 : ĠAnimation ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanimation Finished ( on End ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Animation Repeat ( p 0 : ĠAnimation ?) Ġ{} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinline Ġfun Ġanimation Finished ( cross inline Ġon End : Ġ() Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġon End . invoke () ĊĠĠĠĠĠĠĠ Ġslide Animation Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġon Animation Finished Queue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. last OrNull () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Animation Finished Queue . clear () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . invoke () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinline Ġfun Ġanimate In ( direction : ĠModal . Direction , Ġcross inline Ġon End : ()-> Unit Ġ= Ġ{}) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġanimation Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen ( direction ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠModal . Direction . Top Ġ-> ĠR . anim . slide _ enter _ top ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠModal . Direction . Bottom Ġ-> ĠR . anim . slide _ enter _ bottom ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġslide Animation Ġ= ĠAnimation Utils ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. load Animation ( context , Ġanimation ) ĊĊĠĠĠĠĠĠĠ Ġstart Animation ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġslide Animation ?. apply Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġduration Ġ= Ġoptions . animation Duration ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinterpol ator Ġ= ĠFast Out Slow In Interpolator () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Animation Listener ( object Ġ: Animation . Animation Listener { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Animation Start ( p 0 : ĠAnimation ?) Ġ{} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Animation End ( p 0 : ĠAnimation ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanimation Finished ( on End ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Animation Repeat ( p 0 : ĠAnimation ?) Ġ{} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset Header ( header : ViewGroup ){ ĊĠĠĠĠĠĠĠ Ġif Ġ( options . type Ġ!= ĠModal . Type . Custom ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( options . message . display Text . isEmpty (). not ()){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsummary = findViewById < TextView >( R . id . text ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsummary . text = options . message . display Text ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsummary . set Compound Draw ables With Intr insic Bounds ( options . message . icon ResourceId , 0 , 0 , 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsummary . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( options . message . click Listener ( summary )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhide ( header , true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠfindViewById < TextView >( R . id . title ). text Ġ= Ġoptions . title ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( options . icon == 0 ) ĠfindViewById < ImageView >( R . id . icon ). visibility = ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĠfindViewById < ImageView >( R . id . icon ). setImage Resource ( options . icon ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( options . lock Visibility ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠfindViewById < ImageView >( R . id . close ). visibility = ĠView . IN VISIBLE ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset Callback (){ ĊĠĠĠĠĠĠĠ Ġif Ġ( options . type != Modal . Type . Custom ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoptions . callback ?. let Ġ{ Ġcb Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠfindViewById < TextView >( R . id . ok ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext Ġ= Ġcb . display Text ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Compound Draw ables With Intr insic Bounds ( cb . icon ResourceId , 0 , 0 , 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset OnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cb . click Listener ( this )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhide ( bg , true ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset List (){ ĊĠĠĠĠĠĠĠ Ġif Ġ( options . type == Modal . Type . List ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdone Btn View = findViewById < TextView >( R . id . ok ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠfindViewById < RecyclerView >( R . id . list ScrollView ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( adapter == null ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Manager = Linear LayoutManager ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadapter = ListAdapter ( done Btn View . type face , options . list ){ Ġposition -> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhide ( bg , true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} else ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( adapter Ġas ĠList Adapter ). set Med ic ines ( options . list ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset Progress (){ ĊĠĠĠĠĠĠĠ Ġif Ġ( options . type == Modal . Type . Progress ){ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠfindViewById < TextView >( R . id . percentage ). text = options . progress . toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprogress = findViewById < ProgressBar >( R . id . progress ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprogress . isIn determinate = options . progress == 0 ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . N ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprogress . set Progress ( options . progress , true ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} else ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprogress . progress = options . progress ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset View Direction (){ ĊĠĠĠĠĠĠĠ Ġbackground Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoptions . background Drawable Ġ!= Ġnull Ġ-> Ġoptions . background Drawable ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoptions . direction Ġ== ĠModal . Direction . Bottom Ġ-> ĠResources Compat . get Drawable ( resources , R . drawable . top _ cur ved _ header , null ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠResources Compat . get Drawable ( resources , R . drawable . bottom _ cur ved _ header , null ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġblur Effect ( set : Boolean ){ ĊĠĠĠĠĠĠĠ Ġif Ġ( options . blur Enabled ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Do Ġsome Ġblur Ġmagic .. ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( set ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdraw Blur Bg () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanimate In Blur View () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanimate Out Blur View () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġanimate In Blur View () Ġ{ ĊĠĠĠĠĠĠĠ Ġblur Bg . start Animation ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAnimation Utils . load Animation ( context , ĠR . anim . alpha _ enter ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġduration Ġ= Ġoptions . animation Duration ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġanimate Out Blur View () Ġ{ ĊĠĠĠĠĠĠĠ Ġblur Bg . start Animation ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAnimation Utils . load Animation ( context , ĠR . anim . alpha _ exit ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġduration Ġ= Ġoptions . animation Duration ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġis Showing (): Boolean Ġ= Ġbg . parent Ġ!= Ġnull ĊĊĠĠĠ Ġoverride Ġfun ĠonChanged ( obj : ĠModal Obj ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpatches : ĠMutable List < () Ġ-> ĠUnit > Ġ= Ġmutable ListOf () ĊĊĠĠĠĠĠĠĠ Ġif ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobj . title != options . title Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobj . message != options . message Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobj . icon != options . icon ĊĠĠĠĠĠĠĠ Ġ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpatches Ġ+= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Header ( bg ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobj . callback != options . callback Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobj . on Dismiss != options . on Dismiss Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobj . on Show != options . on Show ĊĠĠĠĠĠĠĠ Ġ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpatches Ġ+= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Callback () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobj . list != options . list ĊĠĠĠĠĠĠĠ Ġ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpatches Ġ+= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset List () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobj . progress != options . progress ĊĠĠĠĠĠĠĠ Ġ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpatches Ġ+= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Progress () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoptions Ġ= Ġobj ĊĠĠĠĠĠĠĠ Ġpatches . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . invoke () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġupdate ( patch : ĠModal Obj . ()-> Unit ) Ġ= Ġwith ( options . copy ()){ ĊĠĠĠĠĠĠĠ Ġpatch () ĊĠĠĠĠĠĠĠ Ġoptions . update . post Value ( this ) ĊĠĠĠ Ġ} Ċ }