package Ġorg . od k . collect . async Ċ Ċ import Ġandroidx . work .* Ċ import Ġkotlinx . coroutines .* Ċ import Ġjava . util . concurrent . TimeUnit Ċ import Ġjava . util . function . Consumer Ċ import Ġjava . util . function . Supplier Ċ import Ġkotlin . coroutines . Coroutine Context Ċ Ċ class ĠCor outine And Work Manager Scheduler ( private Ġval Ġforeground : ĠCor outine Context , Ġprivate Ġval Ġbackground : ĠCor outine Context , Ġprivate Ġval Ġwork Manager : ĠWork Manager ) Ġ: ĠScheduler Ġ{ ĊĊĠĠĠ Ġconstructor ( work Manager : ĠWork Manager ) Ġ: Ġthis ( Dispatch ers . Main , ĠDispatch ers . IO , Ġwork Manager ) Ġ// ĠN eeded Ġfor ĠJava Ġconstruction ĊĊĠĠĠ Ġoverride Ġfun Ġ< T > Ġrun In Background ( task : ĠSupplier < T >, Ġcallback : ĠConsumer < T >) Ġ{ ĊĠĠĠĠĠĠĠ ĠCor outine Scope ( foreground ). launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . accept ( with Context ( background ) Ġ{ Ġtask . get () Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġschedule ( task : ĠRunnable , Ġrepeat Period : ĠLong ): ĠC ancellable Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrepeat Scope Ġ= ĠCor outine Scope ( foreground ) ĊĊĠĠĠĠĠĠĠ Ġrepeat Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( isActive ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtask . run () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( repeat Period ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠScope C ancellable ( repeat Scope ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġschedule In Background When Network Available ( tag : ĠString , Ġspec : ĠTask Spec , Ġrepeat Period : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġconstraints Ġ= ĠConstraints . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Required Network Type ( Network Type . CONNECTED ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġval Ġworker Ġ= Ġspec . get Work Manager Adapter () ĊĠĠĠĠĠĠĠ Ġval Ġwork Request Ġ= ĠPeriod ic Work Request . Builder ( worker , Ġrepeat Period , ĠTimeUnit . MILLISECONDS ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Constraints ( constraints ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġwork Manager . enqueue Unique Periodic Work ( tag , ĠExisting Periodic Work Policy . REPLACE , Ġwork Request ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcancel In Background ( tag : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwork Manager . cancel Unique Work ( tag ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġis Running ( tag : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġis Work Manager Work Running ( tag ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis Work Manager Work Running ( tag : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstatuses Ġ= Ġwork Manager . get Work Infos By Tag ( tag ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( work Info Ġin Ġstatuses . get ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( work Info . state Ġ== ĠWork Info . State . RUNNING ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġclass ĠScope C ancellable ( private Ġval Ġscope : ĠCor outine Scope ) Ġ: ĠC ancellable Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġcancel (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġscope . cancel () ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} Ċ } ĊĊ