package Ġcom . the wiz rd . simple weather . services Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . pm . Service Info Ċ import Ġandroid . os . Build Ċ import Ġandroid . util . Log Ċ import Ġandroidx . work .* Ċ import Ġcom . the wiz rd . shared _ resources . utils . LiveData Utils . await WithTimeout Ċ import Ġcom . the wiz rd . shared _ resources . utils . Logger Ċ import Ġcom . the wiz rd . simple weather . App Ċ import Ġcom . the wiz rd . simple weather . services . Service Notification Helper . JOB _ ID Ċ import Ġcom . the wiz rd . simple weather . services . Service Notification Helper . get Foreground Notification Ċ import Ġcom . the wiz rd . simple weather . services . Service Notification Helper . init Channel Ċ import Ġcom . the wiz rd . simple weather . we arable . Weather Comp lication Helper Ċ import Ġcom . the wiz rd . simple weather . we arable . Weather Tile Helper Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . Global Scope Ċ import Ġkotlinx . coroutines . launch Ċ import Ġtim ber . log . Tim ber Ċ import Ġjava . util . concurrent . TimeUnit Ċ Ċ class ĠWidget Updater Worker ( context : ĠContext , Ġworker Params : ĠWorker Parameters ) Ġ: ĠCor outine Worker ( context , Ġworker Params ) Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠTAG Ġ= Ġ" Widget Updater Worker " ĊĊĠĠĠĠĠĠĠ Ġconst Ġval ĠACTION _ UPDATE WIDGET S Ġ= Ġ" Simple Weather . Droid . action . UPDATE _ WIDGET S " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠACTION _ EN QUEUE WORK Ġ= Ġ" Simple Weather . Droid . action . START _ ALARM " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠACTION _ CANCEL WORK Ġ= Ġ" Simple Weather . Droid . action . CANCEL _ ALARM " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠACTION _ REQ UE UE WORK Ġ= Ġ" Simple Weather . Droid . action . UPDATE _ ALARM " ĊĊĠĠĠĠĠĠĠ Ġsuspend Ġfun Ġrequest Widget Update ( context : ĠContext ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( App . instance . settings Manager . is Weather Loaded ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . tag ( TAG ). i (" Request ing Ġwidget Ġupdate ...") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠUpdate Ġcomp lications ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠWeather Comp lication Helper . request Comp lication Update All ( context . application Context ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠUpdate Ġtiles ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠWeather Tile Helper . request Tile Update All ( context . application Context ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġ@ Jvm Over loads ĊĠĠĠĠĠĠĠ Ġfun Ġenqueue Action ( context : ĠContext , Ġintent Action : ĠString , Ġon Boot : ĠBoolean Ġ= Ġfalse ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( intent Action ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠACTION _ REQ UE UE WORK Ġ-> Ġenqueue Work ( context . application Context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠACTION _ EN QUEUE WORK Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGlobal Scope . launch ( Dispatch ers . Default ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( on Boot Ġ|| Ġ! is Work Scheduled ( context . application Context )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Work ( context . application Context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠACTION _ UPDATE WIDGET S Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFor Ġimmediate Ġaction ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Work ( context . application Context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠACTION _ CANCEL WORK Ġ-> Ġcancel Work ( context . application Context ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġstart Work ( context : ĠContext ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . write Line ( Log . INFO , Ġ"% s : ĠRequest ing Ġto Ġstart Ġwork ", ĠTAG ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġupdate Request Ġ= ĠOne Time Work RequestBuilder < Widget Updater Worker >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Exp edited ( OutOf Quota Policy . RUN _ AS _ NON _ EX PED IT ED _ WORK _ REQUEST ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠWork Manager . getInstance ( context . application Context ). enqueue ( update Request ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . write Line ( Log . INFO , Ġ"% s : ĠOne - time Ġwork Ġen queued ", ĠTAG ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠEn queue Ġperiodic Ġtask Ġas Ġwell ĊĠĠĠĠĠĠĠĠĠĠĠ Ġenqueue Work ( context . application Context ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġenqueue Work ( context : ĠContext ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . write Line ( Log . INFO , Ġ"% s : ĠRequest ing Ġwork ", ĠTAG ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġupdate Request Ġ= ĠPeriod ic Work Request . Builder ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠWidget Updater Worker :: class . java , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 6 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTimeUnit . MIN UTES , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 5 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTimeUnit . MIN UTES ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Constraints ( Constraints . NONE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Tag ( TAG ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠWork Manager . getInstance ( context . application Context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. enqueue Unique Periodic Work ( TAG , ĠExisting Periodic Work Policy . REPLACE , Ġupdate Request ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . write Line ( Log . INFO , Ġ"% s : ĠWork Ġen queued ", ĠTAG ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġsuspend Ġfun Ġis Work Scheduled ( context : ĠContext ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwork Mgr Ġ= ĠWork Manager . getInstance ( context . application Context ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstatuses Ġ= Ġwork Mgr . get Work Infos For Unique Work LiveData ( TAG ). await WithTimeout ( 1 0 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( statuses . isNull OrEmpty ()) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġrunning Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( work Status Ġin Ġstatuses ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrunning Ġ= Ġ( work Status . state Ġ== ĠWork Info . State . RUNNING ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġwork Status . state Ġ== ĠWork Info . State . EN QUE U ED ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġrunning ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġcancel Work ( context : ĠContext ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCancel Ġalarm Ġif Ġdependent Ġfeatures Ġare Ġturned Ġoff ĊĠĠĠĠĠĠĠĠĠĠĠ ĠWork Manager . getInstance ( context . application Context ). cancel Unique Work ( TAG ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . write Line ( Log . INFO , Ġ"% s : ĠC anceled Ġwork ", ĠTAG ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġget Foreground Info (): ĠFore ground Info Ġ{ ĊĠĠĠĠĠĠĠ Ġinit Channel ( application Context ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . Q ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFore ground Info ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJOB _ ID , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Foreground Notification ( application Context ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠService Info . FO REG ROUND _ SERVICE _ TYPE _ DATA _ SYNC Ġor ĠService Info . FO REG ROUND _ SERVICE _ TYPE _ LOCATION ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFore ground Info ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJOB _ ID , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Foreground Notification ( application Context ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġdo Work (): ĠResult Ġ{ ĊĠĠĠĠĠĠĠ Ġrequest Widget Update ( application Context ) ĊĠĠĠĠĠĠĠ Ġreturn ĠResult . success () ĊĠĠĠ Ġ} Ċ }