/* Ċ Ġ* ĠCopyright Ġ 2 0 1 6 - 2 0 2 0 ĠJetBrains Ġs . r . o . ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 Ġlicense . Ċ Ġ*/ Ċ Ċ @ file : Suppress (" Red undant Visibility Modifier ") Ċ Ċ package Ġkotlinx . coroutines . tasks Ċ Ċ import Ġcom . google . android . gms . tasks . CancellationToken Source Ċ import Ġcom . google . android . gms . tasks . Runtime ExecutionException Ċ import Ġcom . google . android . gms . tasks . Task Ċ import Ġcom . google . android . gms . tasks . Task Completion Source Ċ import Ġkotlinx . coroutines . Cancellation Exception Ċ import Ġkotlinx . coroutines . Comp letable Deferred Ċ import Ġkotlinx . coroutines . Deferred Ċ import Ġkotlinx . coroutines . Job Ċ import Ġkotlinx . coroutines . suspend C ancellable Coroutine Ċ import Ġkotlin . coroutines .* Ċ Ċ /** Ċ Ġ* ĠConverts Ġthis Ġdeferred Ġto Ġthe Ġinstance Ġof Ġ[ Task ]. Ċ Ġ* ĠIf Ġdeferred Ġis Ġcancelled Ġthen Ġresulting Ġtask Ġwill Ġbe Ġcancelled Ġas Ġwell . Ċ Ġ*/ Ċ public Ġfun Ġ< T > ĠDeferred < T >. as Task (): ĠTask < T > Ġ{ ĊĠĠĠ Ġval Ġcancellation Ġ= ĠCancellationToken Source () ĊĠĠĠ Ġval Ġsource Ġ= ĠTask Completion Source < T >( c ancellation . token ) ĊĊĠĠĠ Ġinvoke On Completion Ġcallback @{ ĊĠĠĠĠĠĠĠ Ġif Ġ( it Ġis ĠC ancellation Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcancellation . cancel () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ callback ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġt Ġ= Ġget Completion Exception OrNull () ĊĠĠĠĠĠĠĠ Ġif Ġ( t Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsource . set Result ( get Completed ()) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsource . set Exception ( t Ġas ? ĠException Ġ?: ĠRuntime ExecutionException ( t )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġsource . task Ċ } Ċ Ċ /** Ċ Ġ* ĠConverts Ġthis Ġtask Ġto Ġan Ġinstance Ġof Ġ[ Deferred ]. Ċ Ġ* ĠIf Ġtask Ġis Ġcancelled Ġthen Ġresulting Ġdeferred Ġwill Ġbe Ġcancelled Ġas Ġwell . Ċ Ġ*/ Ċ public Ġfun Ġ< T > ĠTask < T >. as Deferred (): ĠDeferred < T > Ġ{ ĊĠĠĠ Ġif Ġ( is Complete ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġe Ġ= Ġexception ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( e Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠComp letable Deferred < T >(). apply Ġ{ Ġif Ġ( is Canceled ) Ġcancel () Ġelse Ġcomplete ( result Ġas ĠT ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠComp letable Deferred < T >(). apply Ġ{ Ġcomplete Exception ally ( e ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġresult Ġ= ĠComp letable Deferred < T >() ĊĠĠĠ Ġadd On Complete Listener Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġe Ġ= Ġit . exception ĊĠĠĠĠĠĠĠ Ġif Ġ( e Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Canceled ) Ġresult . cancel () Ġelse Ġresult . complete ( it . result Ġas ĠT ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . complete Exception ally ( e ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġresult Ċ } Ċ Ċ /** Ċ Ġ* ĠAwait s Ġfor Ġcompletion Ġof Ġthe Ġtask Ġwithout Ġblocking Ġa Ġthread . Ċ Ġ* Ċ Ġ* ĠThis Ġsus pending Ġfunction Ġis Ġcancell able . Ċ Ġ* ĠIf Ġthe Ġ[ Job ] Ġof Ġthe Ġcurrent Ġcoroutine Ġis Ġcancelled Ġor Ġcompleted Ġwhile Ġthis Ġsus pending Ġfunction Ġis Ġwaiting , Ġthis Ġfunction Ċ Ġ* Ġstops Ġwaiting Ġfor Ġthe Ġcompletion Ġstage Ġand Ġimmediately Ġresume s Ġwith Ġ[ Cancellation Exception ]. Ċ Ġ*/ Ċ public Ġsuspend Ġfun Ġ< T > ĠTask < T >. await (): ĠT Ġ{ ĊĠĠĠ Ġ// Ġfast Ġpath ĊĠĠĠ Ġif Ġ( is Complete ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġe Ġ= Ġexception ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( e Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Canceled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠC ancellation Exception (" Task Ġ$ this Ġwas Ġcancelled Ġnormally .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġas ĠT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġe ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġsuspend C ancellable Coroutine Ġ{ Ġcont Ġ-> ĊĠĠĠĠĠĠĠ Ġadd On Complete Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġe Ġ= Ġexception ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( e Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Canceled ) Ġcont . cancel () Ġelse Ġcont . resume ( result Ġas ĠT ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcont . resume With Exception ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ