package Ġcom . lev ib ost ian . wend y Ċ Ċ import Ġandroid . os . Handler Ċ import Ġandroid . os . Looper Ċ import Ġcom . lev ib ost ian . wend y . listeners . Pending Task Status Listener Ċ import Ġcom . lev ib ost ian . wend y . listeners . Task Runner Listener Ċ import Ġcom . lev ib ost ian . wend y . service . Pending Task Ċ import Ġcom . lev ib ost ian . wend y . service . W end y Ċ import Ġcom . lev ib ost ian . wend y . service . Pending Tasks Runner Ċ import Ġcom . lev ib ost ian . wend y . types . Reason Pending Task Skipped Ċ import Ġjava . lang . ref . Weak Reference Ċ Ċ /** Ċ Ġ* ĠConfigure ĠW end y Ġand Ġhow Ġit Ġoper ates . Ċ Ġ*/ Ċ class ĠW end y Config Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠTurn Ġon Ġand Ġoff Ġthe Ġability Ġfor ĠW end y Ġto Ġautomatically Ġrun Ġall Ġof Ġthe Ġ[ Pending Task ] s Ġset Ġto Ġnot Ġmanually Ġrun Ġfor Ġyou . ĊĠĠĠĠĠĠĠĠ Ġ* ĠThis Ġtakes Ġplace Ġwhen Ġyou : ĊĠĠĠĠĠĠĠĠ Ġ* Ġ 1 . ĠAdd Ġa Ġtask Ġto ĠW end y Ġvia Ġ[ W end y . add Task ]. ĊĠĠĠĠĠĠĠĠ Ġ* Ġ 2 . ĠThe Ġperiodically Ġscheduled Ġexecution Ġof Ġall Ġ[ Pending Task ] s Ġby ĠW end y . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ* Note :* ĠYou Ġcan Ġstill Ġhave Ġthis Ġproperty Ġset Ġto Ġfalse Ġand Ġmanually Ġcall Ġ[ W end y . run Tasks ] Ġto Ġrun Ġall Ġtasks . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġvar Ġautomatically Run Tasks : ĠBoolean Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠSets ĠW end y Ġto Ġstrict Ġmode Ġor Ġnot . ĠStrict Ġmode Ġhelps Ġwhile Ġdeveloping Ġyour Ġapp Ġto Ġfind Ġand Ġfix Ġpotential Ġissues Ġwhile Ġworking Ġwith ĠW end y . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* ĠStrict Ġmode Ġis Ġ** only ** Ġused Ġin Ġscenarios Ġthat Ġa Ġwarning Ġis Ġnot Ġcritical Ġto Ġthe Ġsuccess Ġof Ġyour Ġapp . ĠHow Ġsuccess Ġif Ġdefined Ġhere Ġis : Ġ( 1 ) ĠYour Ġuser Ġdoes Ġnot Ġget Ġconfused Ġwhen Ġthey Ġperform Ġan Ġaction Ġin Ġyour Ġapp Ġand Ġthe Ġrequest Ġis Ġsimply Ġignored Ġresulting Ġin Ġthem Ġbeing Ġconfused Ġand Ġ( 2 ) Ġyour Ġapp Ġcrash ing Ġonly Ġwhen Ġyou Ġhave Ġhit Ġa Ġmajor Ġissue Ġthat Ġyou Ġreally Ġshould Ġfix Ġ( wend y Ġcannot Ġwork Ġwithout Ġyou Ġfixing Ġthese Ġcrashes ). ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* ĠW end y Ġ** does ** Ġstill Ġthrow Ġexceptions . ĠStrict Ġmode Ġdoes Ġ* not * Ġsil ence Ġall Ġexceptions . ĠStrict Ġsimply Ġgives Ġyou Ġthe Ġoption Ġto Ġsil ence Ġwarnings Ġwhen Ġit 's Ġreally Ġnot Ġa Ġbig Ġdeal Ġthat Ġyour Ġcode Ġworks Ġin Ġa Ġcertain Ġway . ĠIt 's Ġassumed Ġyou Ġknow Ġwhat Ġyou Ġare Ġdoing . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* ĠWhen Ġstrict Ġis Ġtrue , Ġwarnings Ġthrow Ġerrors Ġinstead Ġof Ġlogging Ġthe Ġwarning Ġto Ġthe Ġconsole . ĊĠĠĠĠĠĠĠĠ Ġ* ĠWhen Ġstrict Ġis Ġfalse , Ġwarnings Ġget Ġlogged Ġto Ġthe Ġconsole Ġand Ġnot Ġcrash Ġyour Ġapp Ġinstead . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* ĠDefault : Ġtrue ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġvar Ġstrict : ĠBoolean Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠTurn Ġon Ġand Ġoff Ġdebug Ġmode . ĠThis Ġturns Ġon Ġand Ġoff ĠW end y Ġsending Ġmessages Ġto Ġthe Ġlog cat . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġvar Ġdebug : ĠBoolean Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠThe Ġtag Ġused Ġwhen ĠW end y Ġsends Ġdebug Ġmessages Ġto Ġthe Ġlog cat . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġvar Ġlog Tag : ĠString Ġ= Ġ" W END Y " ĊĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġtask Runner Listeners Ġ= ĠArrayList < Weak Reference < Task Runner Listener >>() ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠListen Ġto Ġupdates Ġabout Ġthe ĠW end y Ġtask Ġrunner . ĠGet Ġupdates Ġabout Ġwhen Ġtasks Ġget Ġexecuted , Ġwhen Ġthe Ġtask Ġrunner Ġis Ġdone Ġrunning Ġall Ġthe Ġtasks , Ġetc . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġlistener ĠInstance Ġof Ġlistener Ġto Ġreceive Ġthe Ġcallbacks . ĠNote : ĠW end y Ġkeeps Ġa Ġweak Ġreference Ġto Ġyour Ġlistener . ĠMake Ġsure Ġthat Ġ* you * Ġkeep Ġa Ġstrong Ġreference Ġto Ġthe Ġlistener Ġyou Ġgive ! ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ see ĠTask Runner Listener Ġto Ġlearn Ġmore Ġabout Ġwhat Ġcallbacks Ġto Ġexpect . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġadd Task Runner Listener ( listener : ĠTask Runner Listener ) Ġ= Ġtask Runner Listeners . add ( Weak Reference ( listener )) ĊĠĠĠĠĠĠĠ Ġinternal Ġfun Ġget Task Runner Listeners (): ĠList < Task Runner Listener > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Looper . get Main Looper (). thread Ġ!= ĠThread . currentThread ()) Ġthrow ĠRuntimeException (" You Ġmust Ġbe Ġon ĠUI Ġthread .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtask Runner Listeners ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map NotNull Ġ{ Ġit . get () Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġtask Status Listeners Ġ= ĠArrayList < Task Status Listener >() ĊĠĠĠĠĠĠĠ Ġinternal Ġfun Ġget Task Status Listener For Task ( taskId : ĠLong ): ĠList < Pending Task Status Listener > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Looper . get Main Looper (). thread Ġ!= ĠThread . currentThread ()) Ġthrow ĠRuntimeException (" You Ġmust Ġbe Ġon ĠUI Ġthread .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtask Status Listeners ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . taskId Ġ== ĠtaskId Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map NotNull Ġ{ Ġit . listener . get () Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠListen Ġto Ġupdates Ġabout Ġa Ġspecific Ġtask Ġand Ġhow Ġit Ġis Ġgoing . ĠGet Ġupdated Ġwhen Ġthis Ġspecific Ġtask Ġgets Ġrun Ġby Ġthe Ġtask Ġrunner , Ġthen Ġif Ġit Ġfails / suc ceeds / gets Ġskipped . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* ĠIf Ġthe Ġtask Ġwith Ġthe Ġ[ taskId ] Ġparameter Ġdoes Ġnot Ġexist , Ġyou Ġwill Ġsimply Ġnot Ġreceive Ġany Ġcallbacks . ĠYour Ġlistener Ġwill Ġbe Ġignored . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param ĠtaskId ĠThe ĠtaskId Ġto Ġthe Ġ[ Pending Task ] Ġyou Ġwant Ġto Ġreceive Ġcallbacks Ġabout . ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġlistener ĠInstance Ġof Ġlistener Ġto Ġreceive Ġthe Ġcallbacks . ĠNote : ĠW end y Ġkeeps Ġa Ġweak Ġreference Ġto Ġyour Ġlistener . ĠMake Ġsure Ġthat Ġ* you * Ġkeep Ġa Ġstrong Ġreference Ġto Ġthe Ġlistener Ġyou Ġgive ! ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ see ĠPending Task Status Listener Ġto Ġlearn Ġmore Ġabout Ġwhat Ġcallbacks Ġto Ġexpect . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġadd Task Status Listener For Task ( taskId : ĠLong , Ġlistener : ĠPending Task Status Listener ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtasks Runner : ĠPending Tasks Runner Ġ= ĠW end y . shared Instance (). runner ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtask Status Listeners . add ( Task Status Listener ( taskId , ĠWeak Reference ( listener ))) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( tasks Runner . currently Running Task ?. id ?. equals ( taskId ) Ġ== Ġtrue ) Ġlistener . running ( taskId ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠW end y . shared . get Latest Error ( taskId )?. let Ġ{ Ġlatest Error Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . error Re corded ( taskId , Ġlatest Error . errorMessage , Ġlatest Error . error Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġclass ĠTask Status Listener ( val ĠtaskId : ĠLong , Ġval Ġlistener : ĠWeak Reference < Pending Task Status Listener >) Ċ Ċ } Ċ Ċ internal Ġfun ĠW end y Config . Companion . log Task Skipped ( task : ĠPending Task , Ġreason For Skip : ĠReason Pending Task Skipped ) Ġ{ ĊĠĠĠ ĠHandler ( Looper . get Main Looper ()). post ({ ĊĠĠĠĠĠĠĠ ĠW end y Config . get Task Status Listener For Task ( task . taskId Ġ?: Ġ 0 ). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . skipped ( task . taskId !! , Ġreason For Skip ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠW end y Config . get Task Runner Listeners (). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . task Skipped ( reason For Skip , Ġtask ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}) Ċ } Ċ Ċ internal Ġfun ĠW end y Config . Companion . log Task Running ( task : ĠPending Task ) Ġ{ ĊĠĠĠ ĠHandler ( Looper . get Main Looper ()). post ({ ĊĠĠĠĠĠĠĠ ĠW end y Config . get Task Status Listener For Task ( task . taskId Ġ?: Ġ 0 ). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . running ( task . taskId !! ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠW end y Config . get Task Runner Listeners (). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . running Task ( task ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}) Ċ } Ċ Ċ internal Ġfun ĠW end y Config . Companion . log Task Complete ( task : ĠPending Task , Ġsuccessful : ĠBoolean ) Ġ{ ĊĠĠĠ ĠHandler ( Looper . get Main Looper ()). post ({ ĊĠĠĠĠĠĠĠ ĠW end y Config . get Task Status Listener For Task ( task . taskId Ġ?: Ġ 0 ). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . complete ( task . taskId !! , Ġsuccessful ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠW end y Config . get Task Runner Listeners (). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . task Complete ( successful , Ġtask ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}) Ċ } Ċ Ċ internal Ġfun ĠW end y Config . Companion . log Error Re corded ( task : ĠPending Task , ĠerrorMessage : ĠString ?, Ġerror Id : ĠString ?) Ġ{ ĊĠĠĠ ĠHandler ( Looper . get Main Looper ()). post ({ ĊĠĠĠĠĠĠĠ ĠW end y Config . get Task Status Listener For Task ( task . taskId Ġ?: Ġ 0 ). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . error Re corded ( task . taskId !! , ĠerrorMessage , Ġerror Id ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠW end y Config . get Task Runner Listeners (). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . error Re corded ( task , ĠerrorMessage , Ġerror Id ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}) Ċ } Ċ Ċ internal Ġfun ĠW end y Config . Companion . log Error Resolved ( task : ĠPending Task ) Ġ{ ĊĠĠĠ ĠHandler ( Looper . get Main Looper ()). post ({ ĊĠĠĠĠĠĠĠ ĠW end y Config . get Task Status Listener For Task ( task . taskId Ġ?: Ġ 0 ). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . error Resolved ( task . taskId !! ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠW end y Config . get Task Runner Listeners (). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . error Resolved ( task ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}) Ċ } Ċ Ċ internal Ġfun ĠW end y Config . Companion . log All Tasks Complete () Ġ{ ĊĠĠĠ ĠHandler ( Looper . get Main Looper ()). post ({ ĊĠĠĠĠĠĠĠ ĠW end y Config . get Task Runner Listeners (). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . all Tasks Complete () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}) Ċ } Ċ Ċ internal Ġfun ĠW end y Config . Companion . log New Task Added ( task : ĠPending Task ) Ġ{ ĊĠĠĠ ĠHandler ( Looper . get Main Looper ()). post ({ ĊĠĠĠĠĠĠĠ ĠW end y Config . get Task Runner Listeners (). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . new Task Added ( task ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}) Ċ }