package Ġcom . ql ang . gdx kt . lifecycle Ċ Ċ import Ġkotlinx . coroutines .* Ċ import Ġkotlin . coroutines . Coroutine Context Ċ import Ġkotlin . coroutines . Empty Coroutine Context Ċ import Ġkotlin . experimental . Experimental Type Inference Ċ Ċ internal Ġconst Ġval ĠDEFAULT _ TIMEOUT Ġ= Ġ 5 0 0 0 L Ċ Ċ /** Ċ Ġ* ĠInterface Ġthat Ġallows Ġcontrolling Ġa Ġ[ LiveData ] Ġfrom Ġa Ġcoroutine Ġblock . Ċ Ġ* Ċ Ġ* Ġ@ see Ġlive Data Ċ Ġ*/ Ċ interface ĠLive Data Scope < T > Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSet 's Ġthe Ġ[ LiveData ]' s Ġvalue Ġto Ġthe Ġgiven Ġ[ value ]. ĠIf Ġyou 've Ġcalled Ġ[ emit Source ] Ġpreviously , ĊĠĠĠĠ Ġ* Ġcalling Ġ[ emit ] Ġwill Ġremove Ġthat Ġsource . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠNote Ġthat Ġthis Ġfunction Ġsus p ends Ġuntil Ġthe Ġvalue Ġis Ġset Ġon Ġthe Ġ[ LiveData ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġvalue ĠThe Ġnew Ġvalue Ġfor Ġthe Ġ[ LiveData ] ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ see Ġemit Source ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġsuspend Ġfun Ġemit ( value : ĠT ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAdd Ġthe Ġgiven Ġ[ LiveData ] Ġas Ġa Ġsource , Ġsimilar Ġto Ġ[ Mediator LiveData . add Source ]. ĠCalling Ġthis ĊĠĠĠĠ Ġ* Ġmethod Ġwill Ġremove Ġany Ġsource Ġthat Ġwas Ġy ielded Ġbefore Ġvia Ġ[ emit Source ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġsource ĠThe Ġ[ LiveData ] Ġinstance Ġwhose Ġvalues Ġwill Ġbe Ġdis patched Ġfrom Ġthe Ġcurrent ĊĠĠĠĠ Ġ* Ġ[ LiveData ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ see Ġemit ĊĠĠĠĠ Ġ* Ġ@ see ĠMed iator LiveData . add Source ĊĠĠĠĠ Ġ* Ġ@ see ĠMed iator LiveData . remove Source ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġsuspend Ġfun Ġemit Source ( source : ĠLive Data < T >): ĠDis posable Handle ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReferences Ġthe Ġcurrent Ġvalue Ġof Ġthe Ġ[ LiveData ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠIf Ġthe Ġblock Ġnever Ġ` emit ` ed Ġa Ġvalue , Ġ[ latest Value ] Ġwill Ġbe Ġ` null `. ĠYou Ġcan Ġuse Ġthis ĊĠĠĠĠ Ġ* Ġvalue Ġto Ġcheck Ġwhat Ġwas Ġthen Ġlatest Ġvalue Ġ` emit ` ed Ġby Ġyour Ġ` block ` Ġbefore Ġit Ġgot Ġcancelled . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠNote Ġthat Ġif Ġthe Ġblock Ġcalled Ġ[ emit Source ], Ġthen Ġ` latest Value ` Ġwill Ġbe Ġlast Ġvalue ĊĠĠĠĠ Ġ* Ġdis patched Ġby Ġthe Ġ` source ` Ġ[ LiveData ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġlatest Value : ĠT ? Ċ } Ċ Ċ internal Ġclass ĠLive Data Scope Impl < T >( ĊĠĠĠĠĠĠĠ Ġinternal Ġvar Ġtarget : ĠCor outine LiveData < T >, ĊĠĠĠĠĠĠĠ Ġcontext : ĠCor outine Context , ĊĠĠĠĠĠĠĠ Ġdisp : ĠCor outine Dispatcher Ċ ) Ġ: ĠLive Data Scope < T > Ġ{ ĊĊĠĠĠ Ġoverride Ġval Ġlatest Value : ĠT ? ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġtarget . value ĊĊĠĠĠ Ġ// Ġuse Ġ` live Data ` Ġprovided Ġcontext Ġ+ Ġmain Ġdispatcher Ġto Ġcommunicate Ġwith Ġthe Ġtarget ĊĠĠĠ Ġ// ĠLive Data . ĠThis Ġgives Ġus Ġmain Ġthread Ġsafety Ġas Ġwell Ġas Ġcancellation Ġc oo peration ĊĠĠĠ Ġprivate Ġval Ġcoroutine Context Ġ= Ġcontext Ġ+ Ġdisp ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġemit Source ( source : ĠLive Data < T >): ĠDis posable Handle Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith Context ( coroutine Context ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ with Context Ġtarget . emit Source ( source ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġemit ( value : ĠT ) Ġ= Ġwith Context ( coroutine Context ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtarget . clear Source () ĊĠĠĠĠĠĠĠ Ġtarget . value Ġ= Ġvalue ĊĠĠĠ Ġ} Ċ } Ċ Ċ internal Ġsuspend Ġfun Ġ< T > ĠMed iator LiveData < T >. add Disposable Source ( ĊĠĠĠĠĠĠĠ Ġsource : ĠLive Data < T >, ĊĠĠĠĠĠĠĠ Ġdisp : ĠCor outine Dispatcher Ċ ): ĠE mitted Source Ġ= Ġwith Context ( disp ) Ġ{ ĊĠĠĠ Ġadd Source ( source , ĠObserver Ġ{ Ġvalue Ġ= Ġit Ġ}) ĊĠĠĠ ĠE mitted Source ( source , Ġthis @ add Disposable Source , Ġdisp ) Ċ } Ċ Ċ internal Ġclass ĠE mitted Source ( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġsource : ĠLive Data <* >, ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġmedi ator : ĠMed iator LiveData <* >, ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġdisp : ĠCor outine Dispatcher Ċ ) Ġ: ĠDis posable Handle Ġ{ ĊĠĠĠ Ġ// Ġ@ MainThread ĊĠĠĠ Ġprivate Ġvar Ġdisposed Ġ= Ġfalse ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠUn like Ġ[ dispose ] Ġwhich Ġcannot Ġbe Ġsync Ġbecause Ġit Ġnot Ġa Ġcoroutine Ġ( and Ġwe Ġdo Ġnot Ġwant Ġto ĊĠĠĠĠ Ġ* Ġlock ), Ġthis Ġversion Ġis Ġa Ġsuspend Ġfunction Ġand Ġdoes Ġnot Ġreturn Ġuntil Ġsource Ġis Ġremoved . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġsuspend Ġfun Ġdispose Now () Ġ= Ġwith Context ( disp ) Ġ{ ĊĠĠĠĠĠĠĠ Ġremove Source () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdispose () Ġ{ ĊĠĠĠĠĠĠĠ ĠCor outine Scope ( disp ). launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġremove Source () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġremove Source () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! dis posed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmedi ator . remove Source ( source ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdisposed Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ internal Ġtype alias ĠBlock < T > Ġ= Ġsuspend ĠLive Data Scope < T >. () Ġ-> ĠUnit Ċ Ċ /** Ċ Ġ* ĠHandles Ġrunning Ġa Ġblock Ġat Ġmost Ġonce Ġto Ġcompletion . Ċ Ġ*/ Ċ internal Ġclass ĠBlock Runner < T >( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġlive Data : ĠCor outine LiveData < T >, ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġblock : ĠBlock < T >, ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġtimeout In Ms : ĠLong , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġdisp : ĠCor outine Dispatcher , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġscope : ĠCor outine Scope , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġon Done : Ġ() Ġ-> ĠUnit Ċ ) Ġ{ ĊĠĠĠ Ġ// Ġcurrently Ġrunning Ġblock Ġjob . ĊĠĠĠ Ġprivate Ġvar Ġrunning Job : ĠJob ? Ġ= Ġnull ĊĊĠĠĠ Ġ// Ġcancel ation Ġjob Ġcreated Ġin Ġcancel . ĊĠĠĠ Ġprivate Ġvar Ġcancellation Job : ĠJob ? Ġ= Ġnull ĊĊĠĠĠ Ġfun Ġmaybe Run () Ġ{ ĊĠĠĠĠĠĠĠ Ġcancellation Job ?. cancel () ĊĠĠĠĠĠĠĠ Ġcancellation Job Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġif Ġ( running Job Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġrunning Job Ġ= Ġscope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlive Data Scope Ġ= ĠLive Data Scope Impl ( live Data , Ġcoroutine Context , Ġdisp ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġblock ( live Data Scope ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Done () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcancel () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( c ancellation Job Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror (" Cancel Ġcall Ġcannot Ġhappen Ġwithout Ġa Ġmaybe Run ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcancellation Job Ġ= Ġscope . launch ( disp ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( timeout In Ms ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! live Data . has Active Observer s ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġone Ġlast Ġcheck Ġon Ġactive Ġob servers Ġto Ġavoid Ġany Ġrace Ġcondition Ġbetween Ġstarting ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġa Ġrunning Ġcoroutine Ġand Ġcancel ation ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrunning Job ?. cancel () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrunning Job Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ internal Ġclass ĠCor outine LiveData < T >( ĊĠĠĠĠĠĠĠ Ġcontext : ĠCor outine Context Ġ= ĠEmpty Coroutine Context , ĊĠĠĠĠĠĠĠ Ġtimeout In Ms : ĠLong Ġ= ĠDEFAULT _ TIMEOUT , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġdisp : ĠCor outine Dispatcher Ġ= ĠDispatch ers . Main , ĊĠĠĠĠĠĠĠ Ġblock : ĠBlock < T > Ċ ) Ġ: ĠMed iator LiveData < T >() Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġblock Runner : ĠBlock Runner < T >? ĊĠĠĠ Ġprivate Ġvar Ġemitted Source : ĠE mitted Source ? Ġ= Ġnull ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġuse Ġan Ġintermediate Ġsupervisor Ġjob Ġso Ġthat Ġif Ġwe Ġcancel Ġindividual Ġblock Ġruns Ġdue Ġto Ġlo sing ĊĠĠĠĠĠĠĠ Ġ// Ġob servers , Ġit Ġwon 't Ġcancel Ġthe Ġgiven Ġcontext Ġas Ġwe Ġonly Ġcancel Ġw / Ġthe Ġintention Ġof Ġpossibly ĊĠĠĠĠĠĠĠ Ġ// Ġrel a unch ing Ġusing Ġthe Ġsame Ġparent Ġcontext . ĊĠĠĠĠĠĠĠ Ġval Ġsupervisor Job Ġ= ĠSuper visor Job ( context [ Job ]) ĊĊĠĠĠĠĠĠĠ Ġ// ĠThe Ġscope Ġfor Ġthis ĠLive Data Ġwhere Ġwe Ġlaunch Ġevery Ġblock ĠJob . ĊĠĠĠĠĠĠĠ Ġ// ĠWe Ġdefault Ġto ĠMain Ġdispatcher Ġbut Ġdeveloper Ġcan Ġoverride Ġit . ĊĠĠĠĠĠĠĠ Ġ// ĠThe Ġsupervisor Ġjob Ġis Ġadded Ġlast Ġto Ġisolate Ġblock Ġruns . ĊĠĠĠĠĠĠĠ Ġval Ġscope Ġ= ĠCor outine Scope ( disp Ġ+ Ġcontext Ġ+ Ġsupervisor Job ) ĊĠĠĠĠĠĠĠ Ġblock Runner Ġ= ĠBlock Runner ( this , Ġblock , Ġtimeout In Ms , Ġdisp , Ġscope ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġblock Runner Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġsuspend Ġfun Ġemit Source ( source : ĠLive Data < T >): ĠDis posable Handle Ġ{ ĊĠĠĠĠĠĠĠ Ġclear Source () ĊĠĠĠĠĠĠĠ Ġval Ġnew Source Ġ= Ġadd Disposable Source ( source , Ġdisp ) ĊĠĠĠĠĠĠĠ Ġemitted Source Ġ= Ġnew Source ĊĠĠĠĠĠĠĠ Ġreturn Ġnew Source ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġsuspend Ġfun Ġclear Source () Ġ{ ĊĠĠĠĠĠĠĠ Ġemitted Source ?. dispose Now () ĊĠĠĠĠĠĠĠ Ġemitted Source Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Active () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Active () ĊĠĠĠĠĠĠĠ Ġblock Runner ?. maybe Run () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Inactive () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Inactive () ĊĠĠĠĠĠĠĠ Ġblock Runner ?. cancel () ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Use Experimental ( Experimental Type Inference :: class ) Ċ fun Ġ< T > Ġlive Data ( ĊĠĠĠĠĠĠĠ Ġcontext : ĠCor outine Context Ġ= ĠEmpty Coroutine Context , ĊĠĠĠĠĠĠĠ Ġtimeout In Ms : ĠLong Ġ= ĠDEFAULT _ TIMEOUT , ĊĠĠĠĠĠĠĠ Ġdisp : ĠCor outine Dispatcher Ġ= ĠDispatch ers . Main , ĊĠĠĠĠĠĠĠ Ġ@ Builder Inference Ġblock : Ġsuspend ĠLive Data Scope < T >. () Ġ-> ĠUnit Ċ ): ĠLive Data < T > Ġ= ĠCor outine LiveData ( context , Ġtimeout In Ms , Ġdisp , Ġblock )