package Ġcom . al vin h kh . bu set a . service Ċ Ċ import Ġandroid . app .* Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . content . SharedPreferences Ċ import Ġandroid . os . Build Ċ import Ġandroid . os . IB inder Ċ import Ġandroidx . core . app . Notification Compat Ċ import Ġandroidx . preference . Preference Manager Ċ import Ġandroidx . work . Data Ċ import Ġandroidx . work . One Time Work Request Ċ import Ġandroidx . work . Work Manager Ċ import Ġcom . al vin h kh . bu set a . Api Ċ import Ġcom . al vin h kh . bu set a . C Ċ import Ġcom . al vin h kh . bu set a . R Ċ import Ġcom . al vin h kh . bu set a . m tr . M tr Line Worker Ċ import Ġcom . al vin h kh . bu set a . data gov hk . Rt Nw st Worker Ċ import Ġcom . al vin h kh . bu set a . data gov hk . Td Worker Ċ import Ġcom . al vin h kh . bu set a . follow . dao . Follow Database Ċ import Ġcom . al vin h kh . bu set a . k mb . K mb Route Worker Ċ import Ġcom . al vin h kh . bu set a . l wb . L wb Route Worker Ċ import Ġcom . al vin h kh . bu set a . m tr . AES Bus Worker Ċ import Ġcom . al vin h kh . bu set a . m tr . M tr Bus Worker Ċ import Ġcom . al vin h kh . bu set a . m tr . M tr Resource Worker Ċ import Ġcom . al vin h kh . bu set a . nl b . N lb Worker Ċ import Ġcom . al vin h kh . bu set a . nw st . Nw st Route Worker Ċ import Ġcom . al vin h kh . bu set a . route . dao . Route Database Ċ import Ġcom . al vin h kh . bu set a . utils . Connectivity Util Ċ import Ġcom . al vin h kh . bu set a . utils . Preference Util Ċ import Ġtim ber . log . Tim ber Ċ Ċ class ĠProvider Update Service : ĠService () Ġ{ ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġfollow Database : ĠFollow Database ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġroute Database : ĠRoute Database ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġshared Preferences : ĠSharedPreferences ĊĊĠĠĠ Ġoverride Ġfun Ġon Bind ( intent : ĠIntent ?): ĠI Binder ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate () ĊĠĠĠĠĠĠĠ Ġfollow Database Ġ= ĠFollow Database . getInstance ( this ) !! ĊĠĠĠĠĠĠĠ Ġroute Database Ġ= ĠRoute Database . getInstance ( this ) !! ĊĠĠĠĠĠĠĠ Ġshared Preferences Ġ= ĠPreference Manager . getDefault SharedPreferences ( this ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . O ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnotification Manager Ġ= Ġget System Service ( Context . NOTIFICATION _ SERVICE ) Ġas ĠNotification Manager ? ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( notification Manager ?. get Notification Channel ( C . NOTIFICATION . CHANNEL _ UPDATE ) Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnotification Channel Ġ= ĠNotification Channel ( C . NOTIFICATION . CHANNEL _ UPDATE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetString ( R . string . channel _ name _ update ), ĠNotification Manager . IMPORT ANCE _ DEFAULT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnotification Channel . description Ġ= ĠgetString ( R . string . channel _ description _ update ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnotification Channel . enable Lights ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnotification Channel . enable V ibration ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnotification Channel . import ance Ġ= ĠNotification Manager . IMPORT ANCE _ DEFAULT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnotification Manager ?. create Notification Channel ( notification Channel ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġstart Foreground Notification ( 1 0 0 , Ġ 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstart Foreground Notification ( max : ĠInt , Ġprogress : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnotification Id Ġ= Ġ 2 0 0 0 ĊĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠNotification Compat . Builder ( this , ĠC . NOTIFICATION . CHANNEL _ UPDATE ) ĊĠĠĠĠĠĠĠ Ġbuilder . set Only Alert Once ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setVisibility ( Notification Compat . VIS IBILITY _ PUBLIC ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Priority ( Notification Compat . PRIORITY _ DEFAULT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Small Icon ( R . drawable . ic _ outline _ directions _ bus _ 2 4 dp ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Category ( Notification Compat . CATEGORY _ SYSTEM ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Show When ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Progress ( max , Ġprogress , Ġprogress Ġ<= Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setContent Title ( getString ( R . string . channel _ description _ update )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setContent Text ( if Ġ( progress Ġ<= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ progress /$ max " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġstart Foreground ( notification Id , Ġbuilder . build ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy () Ġ{ ĊĠĠĠĠĠĠĠ Ġstop Foreground ( true ) ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonStart Command ( intent : ĠIntent , Ġflags : ĠInt , Ġstart Id : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmanual Update Ġ= Ġintent . getBoolean Extra ( C . EXTRA . MAN UAL , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! Connectivity Util . isConnected ( this )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCheck Ġinternet Ġconnection ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġi Ġ= ĠIntent ( C . ACTION . SU G GEST ION _ ROUTE _ UPDATE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġi . putExtra ( C . EXTRA . UPDATED , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġi . putExtra ( C . EXTRA . MAN UAL , Ġmanual Update ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġi . putExtra ( C . EXTRA . MESSAGE _ RID , ĠR . string . message _ no _ internet _ connection ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsend Broadcast ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstop Self () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠSTART _ NOT _ STICK Y ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠWork Manager . getInstance (). cancel All Work By Tag ( TAG ) ĊĊĠĠĠĠĠĠĠ Ġval Ġroute Count Ġ= Ġroute Database . route Dao (). count () ĊĠĠĠĠĠĠĠ Ġval Ġshared Preferences Ġ= ĠPreference Manager . getDefault SharedPreferences ( this ) ĊĠĠĠĠĠĠĠ Ġval Ġtime Now Ġ= ĠSystem . currentTimeMillis () Ġ/ Ġ 1 0 0 0 ĊĠĠĠĠĠĠĠ Ġval Ġsaved Time Ġ= Ġshared Preferences . getLong (" last _ update _ check ", Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! manual Update Ġ&& Ġroute Count Ġ> Ġ 0 Ġ&& Ġtime Now Ġ< Ġsaved Time Ġ+ Ġ 1 2 9 6 0 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" recent ly Ġupdated Ġand Ġnot Ġmanual Ġupdate ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstop Self () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠSTART _ NOT _ STICK Y ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġshared Preferences . edit (). put Long (" last _ update _ check ", Ġtime Now ). apply () ĊĊĠĠĠĠĠĠĠ ĠWork Manager . getInstance (). cancel All Work By Tag (" Route List ") ĊĠĠĠĠĠĠĠ Ġvar Ġwork Count Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ ĠWork Manager . getInstance (). get Work Infos By Tag LiveData ( TAG ). observe Fore ver Ġ{ Ġwork Infos Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( work Count Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwork Count Ġ= Ġwork Infos . size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( work Infos . size Ġ== Ġwork Count Ġ|| Ġwork Infos . size Ġ== Ġ 0 ) Ġreturn @ observe Fore ver ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġfinished Count Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( work Info Ġin Ġwork Infos ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( work Info . state . is Finished ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinished Count Ġ+= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Foreground Notification ( work Infos . size Ġ- Ġwork Count , Ġfinished Count Ġ- Ġwork Count ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( finished Count Ġ>= Ġwork Infos . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġi Ġ= ĠIntent ( C . ACTION . SU G GEST ION _ ROUTE _ UPDATE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi . putExtra ( C . EXTRA . UPDATED , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi . putExtra ( C . EXTRA . MAN UAL , Ġmanual Update ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi . putExtra ( C . EXTRA . MESSAGE _ RID , ĠR . string . message _ database _ updated ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapplication Context . send Broadcast ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠWork Manager . getInstance (). cancel All Work By Tag ( TAG ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Follow Route ( manual Update ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġdata Td Ġ= ĠData . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. put Boolean ( C . EXTRA . MAN UAL , Ġmanual Update ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġval Ġtd Request Ġ= ĠOne Time Work Request . Builder ( Td Worker :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Tag ( TAG ). set InputData ( data Td ). build () ĊĠĠĠĠĠĠĠ ĠWork Manager . getInstance () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. enqueue ( td Request ) ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġapi Service Ġ= ĠApi . ret rofit . create ( Api :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= Ġapi Service . app Update (). execute () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( response . is Successful ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġres Ġ= Ġresponse . body () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( res Ġ!= Ġnull Ġ&& Ġres . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġapp Update Ġ= Ġres [ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġi Ġ= ĠIntent ( C . ACTION . APP _ UPDATE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi . putExtra ( C . EXTRA . UPDATED , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi . putExtra ( C . EXTRA . MAN UAL , Ġmanual Update ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi . putExtra ( C . EXTRA . APP _ UPDATE _ OBJECT , Ġapp Update ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend Broadcast ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ignored : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġdata Aes Bus Ġ= ĠData . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. put Boolean ( C . EXTRA . MAN UAL , Ġmanual Update ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. putString ( C . EXTRA . COMP ANY _ CODE , ĠC . PROVIDER . AES BUS ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġval Ġaes Bus Request Ġ= ĠOne Time Work Request . Builder ( AES Bus Worker :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Tag ( TAG ). set InputData ( data Aes Bus ). build () ĊĠĠĠĠĠĠĠ ĠWork Manager . getInstance () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. enqueue ( aes Bus Request ) ĊĊĠĠĠĠĠĠĠ Ġval Ġdata M tr Bus Ġ= ĠData . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. put Boolean ( C . EXTRA . MAN UAL , Ġmanual Update ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. putString ( C . EXTRA . COMP ANY _ CODE , ĠC . PROVIDER . L RT FEED ER ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġval Ġm tr Bus Request Ġ= ĠOne Time Work Request . Builder ( M tr Bus Worker :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Tag ( TAG ). set InputData ( data M tr Bus ). build () ĊĠĠĠĠĠĠĠ ĠWork Manager . getInstance () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. enqueue ( m tr Bus Request ) ĊĊĠĠĠĠĠĠĠ Ġval Ġdata M tr Line Ġ= ĠData . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. put Boolean ( C . EXTRA . MAN UAL , Ġmanual Update ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. putString ( C . EXTRA . COMP ANY _ CODE , ĠC . PROVIDER . M TR ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġval Ġm tr Line Request Ġ= ĠOne Time Work Request . Builder ( M tr Line Worker :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Tag ( TAG ). set InputData ( data M tr Line ). build () ĊĠĠĠĠĠĠĠ ĠWork Manager . getInstance () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. enqueue ( m tr Line Request ) ĊĊĠĠĠĠĠĠĠ Ġval Ġdata N lb Ġ= ĠData . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. put Boolean ( C . EXTRA . MAN UAL , Ġmanual Update ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. putString ( C . EXTRA . COMP ANY _ CODE , ĠC . PROVIDER . N LB ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġval Ġn lb Request Ġ= ĠOne Time Work Request . Builder ( N lb Worker :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Tag ( TAG ). set InputData ( data N lb ). build () ĊĠĠĠĠĠĠĠ ĠWork Manager . getInstance () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. enqueue ( nl b Request ) ĊĊĠĠĠĠĠĠĠ Ġreturn ĠSTART _ STICK Y ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Follow Route ( manual Update : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġcheck Ġany Ġroute Ġin Ġfollow Ġlist Ġupdated Ġor Ġremoved ĊĠĠĠĠĠĠĠ Ġval Ġfollow Tag Ġ= Ġ" Follow Route " ĊĠĠĠĠĠĠĠ ĠWork Manager . getInstance (). cancel All Work By Tag ( follow Tag ) ĊĠĠĠĠĠĠĠ Ġval Ġmap Ġ= Ġhash Map Of < String , ĠPair < String , ĠString >>() ĊĠĠĠĠĠĠĠ Ġval Ġlist Ġ= Ġfollow Database . follow Dao (). list () ĊĠĠĠĠĠĠĠ Ġlist . forEach Ġ{ Ġfollow Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid Ġ= Ġwhen ( follow . company Code ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠC . PROVIDER . CT B , ĠC . PROVIDER . NW FB , ĠC . PROVIDER . NW ST , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠC . PROVIDER . K MB , ĠC . PROVIDER . L WB Ġ-> Ġfollow . company Code Ġ+ Ġfollow . route No ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġfollow . company Code ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmap [ id ] Ġ= ĠPair ( follow . company Code , Ġfollow . route No ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġrequests Ġ= Ġmutable ListOf < One Time Work Request >() ĊĠĠĠĠĠĠĠ Ġmap . values . forEach Ġ{ Ġitem Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Ġ= ĠData . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. put Boolean ( C . EXTRA . MAN UAL , Ġmanual Update ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. putString ( C . EXTRA . TAG , Ġfollow Tag ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. putString ( C . EXTRA . COMP ANY _ CODE , Ġitem . first ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. putString ( C . EXTRA . ROUTE _ NO , Ġitem . second ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. put Boolean ( C . EXTRA . LOAD _ STOP , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( item . first ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠC . PROVIDER . CT B , ĠC . PROVIDER . NW FB , ĠC . PROVIDER . NW ST Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequests . add ( One Time Work Request . Builder ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Preference Util . is Using Nw st Data G ov Hk Api ( application Context )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR t Nw st Worker :: class . java ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠN w st Route Worker :: class . java ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). add Tag ( follow Tag ). set InputData ( data ). build ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠC . PROVIDER . K MB , ĠC . PROVIDER . L WB Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequests . add ( One Time Work Request . Builder ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Preference Util . is Using New K mb Api ( application Context )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠK mb Route Worker :: class . java ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠL wb Route Worker :: class . java ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). add Tag ( follow Tag ). set InputData ( data ). build ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( requests . size Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġwork Count Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ ĠWork Manager . getInstance (). get Work Infos By Tag LiveData ( follow Tag ). observe Fore ver Ġ{ Ġwork Infos Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( work Count Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwork Count Ġ= Ġwork Infos . size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( work Infos . size Ġ== Ġwork Count Ġ|| Ġwork Infos . size Ġ== Ġ 0 ) Ġreturn @ observe Fore ver ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġfinished Count Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( work Info Ġin Ġwork Infos ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( work Info . state . is Finished ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinished Count Ġ+= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Foreground Notification ( work Infos . size Ġ- Ġwork Count , Ġfinished Count Ġ- Ġwork Count ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( finished Count Ġ>= Ġwork Infos . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠWork Manager . getInstance (). cancel All Work By Tag ( follow Tag ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstop Self () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠWork Manager . getInstance (). enqueue ( requests ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstop Self () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠTAG Ġ= Ġ" Provider Update Service " ĊĠĠĠ Ġ} Ċ Ċ }