package Ġcom . mem fault . b ort Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroidx . work . Coroutine Worker Ċ import Ġandroidx . work . Data Ċ import Ġandroidx . work . List enable Worker . Result Ċ import Ġandroidx . work . One Time Work Request Ċ import Ġandroidx . work . One Time Work RequestBuilder Ċ import Ġandroidx . work . Periodic Work Request Ċ import Ġandroidx . work . Periodic Work RequestBuilder Ċ import Ġandroidx . work . Work Manager Ċ import Ġandroidx . work . Work Request Ċ import Ġandroidx . work . Worker Parameters Ċ import Ġcom . mem fault . b ort . shared . Logger Ċ import Ġcom . mem fault . b ort . uploader . limit Attempts Ċ import Ġjava . util . concurrent . TimeUnit Ċ import Ġkotlin . time . Duration Ċ Ċ /** Ċ Ġ* ĠHelpers Ġaround Ġandroidx . work Ġthat Ġdelegate Ġthe Ġactual Ġwork Ġto Ġa ĠTask , Ġwith Ċ Ġ* Ġthe Ġgoal Ġof Ġfacilit ating Ġunit Ġtesting Ġby Ġminim izing Ġthe Ġdependencies Ġon ĠAndroid ĠAPIs . Ċ Ġ*/ Ċ Ċ enum Ġclass ĠTask Result Ġ{ ĊĠĠĠ ĠSUCCESS , ĊĠĠĠ ĠFAILURE , ĊĠĠĠ ĠRET RY ; ĊĊĠĠĠ Ġfun Ġto Worker Result () Ġ= ĊĠĠĠĠĠĠĠ Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSUCCESS Ġ-> ĠResult . success () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFAILURE Ġ-> ĠResult . failure () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRET RY Ġ-> ĠResult . retry () ĊĠĠĠĠĠĠĠ Ġ} Ċ } Ċ Ċ abstract Ġclass ĠTask < I > Ġ{ ĊĠĠĠ Ġabstract Ġval ĠgetMax Attempts : Ġ() Ġ-> ĠInt ĊĊĠĠĠ Ġsuspend Ġfun Ġdo Work ( worker : ĠTask Runner Worker ): ĠTask Result Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinput Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconvert And Validate InputData ( worker . input Data ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠTask Result . FAILURE . also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . e (" Could Ġnot Ġdeserialize Ġinput Ġdata Ġ( id =${ worker . id })", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinally ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġworker . limit Attempts ( getMax Attempts ( input ), Ġ{ Ġfinally ( input ) Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdo Work ( worker , Ġinput ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġabstract Ġsuspend Ġfun Ġdo Work ( worker : ĠTask Runner Worker , Ġinput : ĠI ): ĠTask Result ĊĊĠĠĠ Ġopen Ġfun Ġfinally ( input : ĠI ?) Ġ{} ĊĊĠĠĠ Ġopen Ġfun ĠgetMax Attempts ( input : ĠI ): ĠInt Ġ= ĠgetMax Attempts () ĊĊĠĠĠ Ġabstract Ġfun Ġconvert And Validate InputData ( input Data : ĠData ): ĠI Ċ } Ċ Ċ inline Ġfun Ġ< re ified ĠK Ġ: ĠTask <* >> Ġenqueue Work Once ( ĊĠĠĠ Ġcontext : ĠContext , ĊĠĠĠ Ġinput Data : ĠData Ġ= ĠData . EMPTY , ĊĠĠĠ Ġblock : ĠOne Time Work Request . Builder . () Ġ-> ĠUnit Ġ= Ġ{} Ċ ): ĠWork Request Ġ= ĊĠĠĠ Ġone Time Work Request < K >( input Data , Ġblock ). also Ġ{ ĊĠĠĠĠĠĠĠ ĠWork Manager . getInstance ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. enqueue ( it ) ĊĠĠĠ Ġ} Ċ Ċ inline Ġfun Ġ< re ified ĠK Ġ: ĠTask <* >> Ġone Time Work Request ( ĊĠĠĠ Ġinput Data : ĠData , ĊĠĠĠ Ġblock : ĠOne Time Work Request . Builder . () Ġ-> ĠUnit Ġ= Ġ{} Ċ ): ĠOne Time Work Request Ġ= ĊĠĠĠ ĠOne Time Work RequestBuilder < Task Runner Worker >() ĊĠĠĠĠĠĠĠ Ġ. set InputData ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Work Delegate Class ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠcheckNotNull ( K :: class . qualified Name ), Ġinput Data ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ. apply ( block ) ĊĠĠĠĠĠĠĠ Ġ. build () Ċ Ċ inline Ġfun Ġ< re ified ĠK Ġ: ĠTask <* >> Ġperiodic Work Request ( ĊĠĠĠ Ġrepeat Interval : ĠDuration , ĊĠĠĠ Ġinput Data : ĠData , ĊĠĠĠ Ġblock : ĠPeriod ic Work Request . Builder . () Ġ-> ĠUnit Ġ= Ġ{} Ċ ): ĠPeriod ic Work Request Ġ= ĊĠĠĠ ĠPeriod ic Work RequestBuilder < Task Runner Worker >( ĊĠĠĠĠĠĠĠ Ġrepeat Interval . in Milliseconds . to Long (), ĊĠĠĠĠĠĠĠ ĠTimeUnit . MILLISECONDS , ĊĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ. set InputData ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Work Delegate Class ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠcheckNotNull ( K :: class . qualified Name ), Ġinput Data ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ. apply ( block ) ĊĠĠĠĠĠĠĠ Ġ. build () Ċ Ċ interface ĠTask Factory Ġ{ ĊĠĠĠ Ġfun Ġcreate ( input Data : ĠData ): ĠTask < *> ? Ċ } Ċ Ċ class ĠTask Runner Worker ( ĊĠĠĠ Ġapp Context : ĠContext , ĊĠĠĠ Ġworker Parameters : ĠWorker Parameters , ĊĠĠĠ Ġprivate Ġval Ġtask Factory : ĠTask Factory Ċ ) Ġ: ĠCor outine Worker ( app Context , Ġworker Parameters ) Ġ{ ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġdo Work (): ĠResult Ġ= ĊĠĠĠĠĠĠĠ Ġwhen Ġ( val Ġtask Ġ= Ġtask Factory . create ( input Data )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull Ġ-> ĠResult . failure (). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . e (" Could Ġnot Ġcreate Ġtask Ġfor Ġinput Data Ġ( id =$ id )") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġtask . do Work ( this ). to Worker Result () ĊĠĠĠĠĠĠĠ Ġ} Ċ } Ċ Ċ private Ġconst Ġval ĠWORK _ DE LEG ATE _ CLASS Ġ= Ġ"__ WORK _ DE LEG ATE _ CLASS " Ċ Ċ val ĠData . work Delegate Class : ĠString ? ĊĠĠĠ Ġget () Ġ= ĠgetString ( WORK _ DE LEG ATE _ CLASS ) Ċ Ċ fun Ġadd Work Delegate Class ( className : ĠString , Ġinput Data : ĠData ): ĠData Ġ= ĊĠĠĠ ĠData . Builder () ĊĠĠĠĠĠĠĠ Ġ. put All ( map Of ( WORK _ DE LEG ATE _ CLASS Ġto ĠclassName )) ĊĠĠĠĠĠĠĠ Ġ. put All ( input Data ) ĊĠĠĠĠĠĠĠ Ġ. build () Ċ