/* Ċ Ġ* ĠCopyright Ġ 2 0 1 6 ĠJetBrains Ġs . r . o . Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġcom . lo o peer . and roi dex t Ċ Ċ import Ġandroid . app . Activity Ċ import Ġandroid . content . Context Ċ import Ġandroid . os . Handler Ċ import Ġandroid . os . Looper Ċ import Ġandroid . support . v 4 . app . Fragment Ċ import Ġjava . lang . ref . Weak Reference Ċ import Ġjava . util . concurrent . ExecutorService Ċ import Ġjava . util . concurrent . Executors Ċ import Ġjava . util . concurrent . Future Ċ Ċ /** Ċ Ġ* Ġfrom Ġan ko ĠAsync . kt Ċ Ġ* Ġ*/ Ċ Ċ fun ĠContext . run On Ui Thread ( f : ĠContext . () Ġ-> ĠUnit ) Ġ{ ĊĠĠĠ Ġif Ġ( Context Helper . main Thread Ġ== ĠThread . currentThread ()) Ġf () Ġelse ĠContext Helper . handler . post Ġ{ Ġf () Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠExecute Ġ[ f ] Ġon Ġthe Ġapplication ĠUI Ġthread . Ċ Ġ*/ Ċ inline Ġfun ĠFragment . run On Ui Thread ( cross inline Ġf : Ġ() Ġ-> ĠUnit ) Ġ{ ĊĠĠĠ Ġactivity ?. run On Ui Thread Ġ{ Ġf () Ġ} Ċ } Ċ Ċ class ĠAn ko Async Context < T >( val Ġweak Ref : ĠWeak Reference < T >) Ċ Ċ /** Ċ Ġ* ĠExecute Ġ[ f ] Ġon Ġthe Ġapplication ĠUI Ġthread . Ċ Ġ* ĠIf Ġthe Ġ[ do Async ] Ġreceiver Ġstill Ġexists Ġ( was Ġnot Ġcollected Ġby ĠGC ), Ċ Ġ* Ġ Ġ[ f ] Ġgets Ġit Ġas Ġa Ġparameter Ġ([ f ] Ġgets Ġnull Ġif Ġthe Ġreceiver Ġdoes Ġnot Ġexist Ġanymore ). Ċ Ġ*/ Ċ fun Ġ< T > ĠAn ko Async Context < T >. onComplete ( f : Ġ( T ?) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠ Ġval Ġref Ġ= Ġweak Ref . get () ĊĠĠĠ Ġif Ġ( Context Helper . main Thread Ġ== ĠThread . currentThread ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġf ( ref ) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ ĠContext Helper . handler . post Ġ{ Ġf ( ref ) Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠExecute Ġ[ f ] Ġon Ġthe Ġapplication ĠUI Ġthread . Ċ Ġ* Ġ[ do Async ] Ġreceiver Ġwill Ġbe Ġpassed Ġto Ġ[ f ]. Ċ Ġ* ĠIf Ġthe Ġreceiver Ġdoes Ġnot Ġexist Ġanymore Ġ( it Ġwas Ġcollected Ġby ĠGC ), Ġ[ f ] Ġwill Ġnot Ġbe Ġexecuted . Ċ Ġ*/ Ċ fun Ġ< T > ĠAn ko Async Context < T >. ui Thread ( f : Ġ( T ) Ġ-> ĠUnit ): ĠBoolean Ġ{ ĊĠĠĠ Ġval Ġref Ġ= Ġweak Ref . get () Ġ?: Ġreturn Ġfalse ĊĠĠĠ Ġif Ġ( Context Helper . main Thread Ġ== ĠThread . currentThread ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġf ( ref ) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ ĠContext Helper . handler . post Ġ{ Ġf ( ref ) Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġtrue Ċ } Ċ Ċ /** Ċ Ġ* ĠExecute Ġ[ f ] Ġon Ġthe Ġapplication ĠUI Ġthread Ġif Ġthe Ġunderlying Ġ[ Activity ] Ġstill Ġexists Ġand Ġis Ġnot Ġfinished . Ċ Ġ* ĠThe Ġreceiver Ġ[ Activity ] Ġwill Ġbe Ġpassed Ġto Ġ[ f ]. Ċ Ġ* Ġ ĠIf Ġit Ġis Ġnot Ġexist Ġanymore Ġor Ġif Ġit Ġwas Ġfinished , Ġ[ f ] Ġwill Ġnot Ġbe Ġcalled . Ċ Ġ*/ Ċ fun Ġ< T Ġ: ĠActivity > ĠAn ko Async Context < T >. activity Ui Thread ( f : Ġ( T ) Ġ-> ĠUnit ): ĠBoolean Ġ{ ĊĠĠĠ Ġval Ġactivity Ġ= Ġweak Ref . get () Ġ?: Ġreturn Ġfalse ĊĠĠĠ Ġif Ġ( activity . is Finish ing ) Ġreturn Ġfalse ĊĠĠĠ Ġactivity . run On Ui Thread Ġ{ Ġf ( activity ) Ġ} ĊĠĠĠ Ġreturn Ġtrue Ċ } Ċ Ċ fun Ġ< T Ġ: ĠActivity > ĠAn ko Async Context < T >. activity Ui Thread WithContext ( f : ĠContext .( T ) Ġ-> ĠUnit ): ĠBoolean Ġ{ ĊĠĠĠ Ġval Ġactivity Ġ= Ġweak Ref . get () Ġ?: Ġreturn Ġfalse ĊĠĠĠ Ġif Ġ( activity . is Finish ing ) Ġreturn Ġfalse ĊĠĠĠ Ġactivity . run On Ui Thread Ġ{ Ġactivity . f ( activity ) Ġ} ĊĠĠĠ Ġreturn Ġtrue Ċ } Ċ Ċ fun Ġ< T Ġ: ĠFragment > ĠAn ko Async Context < T >. fragment Ui Thread ( f : Ġ( T ) Ġ-> ĠUnit ): ĠBoolean Ġ{ ĊĠĠĠ Ġval Ġfragment Ġ= Ġweak Ref . get () Ġ?: Ġreturn Ġfalse ĊĠĠĠ Ġif Ġ( fragment . is Detached ) Ġreturn Ġfalse ĊĠĠĠ Ġval Ġactivity Ġ= Ġfragment . activity Ġ?: Ġreturn Ġfalse ĊĠĠĠ Ġactivity . run On Ui Thread Ġ{ Ġf ( fragment ) Ġ} ĊĠĠĠ Ġreturn Ġtrue Ċ } Ċ Ċ fun Ġ< T Ġ: ĠFragment > ĠAn ko Async Context < T >. fragment Ui Thread WithContext ( f : ĠContext .( T ) Ġ-> ĠUnit ): ĠBoolean Ġ{ ĊĠĠĠ Ġval Ġfragment Ġ= Ġweak Ref . get () Ġ?: Ġreturn Ġfalse ĊĠĠĠ Ġif Ġ( fragment . is Detached ) Ġreturn Ġfalse ĊĠĠĠ Ġval Ġactivity Ġ= Ġfragment . activity Ġ?: Ġreturn Ġfalse ĊĠĠĠ Ġactivity . run On Ui Thread Ġ{ Ġactivity . f ( fragment ) Ġ} ĊĠĠĠ Ġreturn Ġtrue Ċ } Ċ Ċ private Ġval Ġcrash Logger Ġ= Ġ{ Ġthrowable : ĠThrowable Ġ-> Ġthrowable . printStackTrace () Ġ} Ċ /** Ċ Ġ* ĠExecute Ġ[ task ] Ġasynchronously . Ċ Ġ* Ċ Ġ* Ġ@ param Ġexception Handler Ġoptional Ġexception Ġhandler . Ċ Ġ* Ġ ĠIf Ġdefined , Ġany Ġexceptions Ġthrown Ġinside Ġ[ task ] Ġwill Ġbe Ġpassed Ġto Ġit . ĠIf Ġnot , Ġexceptions Ġwill Ġbe Ġignored . Ċ Ġ* Ġ@ param Ġtask Ġthe Ġcode Ġto Ġexecute Ġasynchronously . Ċ Ġ*/ Ċ fun Ġ< T > ĠT . do Async ( ĊĠĠĠ Ġexception Handler : Ġ(( Throwable ) Ġ-> ĠUnit )? Ġ= Ġcrash Logger , ĊĠĠĠ Ġtask : ĠAn ko Async Context < T >. () Ġ-> ĠUnit Ċ ): ĠFuture < Unit > Ġ{ ĊĠĠĠ Ġval Ġcontext Ġ= ĠAn ko Async Context ( Weak Reference ( this )) ĊĠĠĠ Ġreturn ĠBackground Executor . submit Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn @ submit Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . task () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( thr : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġexception Handler ?. invoke ( thr ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUnit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġ< T > ĠT . do Async ( ĊĠĠĠ Ġexception Handler : Ġ(( Throwable ) Ġ-> ĠUnit )? Ġ= Ġcrash Logger , ĊĠĠĠ ĠexecutorService : ĠExecutor Service , ĊĠĠĠ Ġtask : ĠAn ko Async Context < T >. () Ġ-> ĠUnit Ċ ): ĠFuture < Unit > Ġ{ ĊĠĠĠ Ġval Ġcontext Ġ= ĠAn ko Async Context ( Weak Reference ( this )) ĊĠĠĠ Ġreturn ĠexecutorService . submit < Unit > Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . task () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( thr : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexception Handler ?. invoke ( thr ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġ< T , ĠR > ĠT . do AsyncResult ( ĊĠĠĠ Ġexception Handler : Ġ(( Throwable ) Ġ-> ĠUnit )? Ġ= Ġcrash Logger , ĊĠĠĠ Ġtask : ĠAn ko Async Context < T >. () Ġ-> ĠR Ċ ): ĠFuture < R > Ġ{ ĊĠĠĠ Ġval Ġcontext Ġ= ĠAn ko Async Context ( Weak Reference ( this )) ĊĠĠĠ Ġreturn ĠBackground Executor . submit Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . task () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( thr : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexception Handler ?. invoke ( thr ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġthr ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġ< T , ĠR > ĠT . do AsyncResult ( ĊĠĠĠ Ġexception Handler : Ġ(( Throwable ) Ġ-> ĠUnit )? Ġ= Ġcrash Logger , ĊĠĠĠ ĠexecutorService : ĠExecutor Service , ĊĠĠĠ Ġtask : ĠAn ko Async Context < T >. () Ġ-> ĠR Ċ ): ĠFuture < R > Ġ{ ĊĠĠĠ Ġval Ġcontext Ġ= ĠAn ko Async Context ( Weak Reference ( this )) ĊĠĠĠ Ġreturn ĠexecutorService . submit < R > Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . task () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( thr : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexception Handler ?. invoke ( thr ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġthr ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ internal Ġobject ĠBackground Executor Ġ{ ĊĠĠĠ Ġvar Ġexecutor : ĠExecutor Service Ġ= ĊĠĠĠĠĠĠĠ ĠExec utors . new Scheduled ThreadPool ( 2 Ġ* ĠRuntime . get Runtime (). available Processors ()) ĊĊĠĠĠ Ġfun Ġ< T > Ġsubmit ( task : Ġ() Ġ-> ĠT ): ĠFuture < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġexecutor . submit ( task ) ĊĠĠĠ Ġ} Ċ Ċ } Ċ Ċ private Ġobject ĠContext Helper Ġ{ ĊĠĠĠ Ġval Ġhandler Ġ= ĠHandler ( Looper . get Main Looper ()) ĊĠĠĠ Ġval Ġmain Thread : ĠThread Ġ= ĠL ooper . get Main Looper (). thread Ċ } Ċ