/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 1 7 - 2 0 1 9 ĠH az uki Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġjp . h az uki . y uz ub rowser . ad block . service Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . net . Uri Ċ import Ġandroid . os . Build Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . os . Handler Ċ import Ġandroid . os . Result Receiver Ċ import Ġandroidx . core . app . Notification Compat Ċ import Ġandroidx . local broadcast manager . content . Local Broadcast Manager Ċ import Ġdagger . android . D agger Intent Service Ċ import Ġjp . h az uki . y uz ub rowser . ad block . BRO ADCAST _ ACTION _ UPDATE _ AD _ BLOCK _ DATA Ċ import Ġjp . h az uki . y uz ub rowser . ad block . NOTIFICATION _ CHANNEL _ AD BLOCK _ FILTER _ UPDATE Ċ import Ġjp . h az uki . y uz ub rowser . ad block . R Ċ import Ġjp . h az uki . y uz ub rowser . ad block . filter . ab p .* Ċ import Ġjp . h az uki . y uz ub rowser . ad block . filter . unified . Unified Filter Ċ import Ġjp . h az uki . y uz ub rowser . ad block . filter . unified . element . Element Filter Ċ import Ġjp . h az uki . y uz ub rowser . ad block . filter . unified . get Filter Dir Ċ import Ġjp . h az uki . y uz ub rowser . ad block . filter . unified . io . Element Writer Ċ import Ġjp . h az uki . y uz ub rowser . ad block . filter . unified . io . Filter Writer Ċ import Ġjp . h az uki . y uz ub rowser . ad block . repository . Ad Block Pref Ċ import Ġjp . h az uki . y uz ub rowser . ad block . repository . ab p . Ab p Database Ċ import Ġjp . h az uki . y uz ub rowser . ad block . repository . ab p . Ab p Entity Ċ import Ġkotlinx . coroutines . run Blocking Ċ import Ġokhttp 3 . Ok HttpClient Ċ import Ġokhttp 3 . Request Ċ import Ġjava . io . BufferedReader Ċ import Ġjava . io . File Ċ import Ġjava . io . IOException Ċ import Ġjava . nio . charset . Charset Ċ import Ġjavax . inject . Inject Ċ Ċ class ĠAb p Update Service Ġ: ĠD agger Intent Service (" Ab p Update Service ") Ġ{ ĊĊĠĠĠ Ġ@ Inject ĊĠĠĠ Ġinternal Ġlateinit Ġvar Ġok HttpClient : ĠOk HttpClient ĊĊĠĠĠ Ġ@ Inject ĊĠĠĠ Ġinternal Ġlateinit Ġvar Ġab p Database : ĠAb p Database ĊĊĠĠĠ Ġoverride Ġfun Ġon Handle Intent ( intent : ĠIntent ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( intent ?. action ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠACTION _ UPDATE _ AB P Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparam 1 Ġ= Ġintent . get Parcelable Extra < Ab p Entity >( EXTRA _ AB P _ ENTRY ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġintent . get Parcelable Extra < Result Receiver ? >( EXTRA _ RESULT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Ab p Entity ( param 1 , Ġresult ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠACTION _ UPDATE _ ALL Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġforce Update Ġ= Ġintent . getBoolean Extra ( EXTRA _ FORCE _ UPDATE , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġintent . get Parcelable Extra < Result Receiver ? >( EXTRA _ RESULT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate All ( force Update , Ġresult ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate () ĊĊĠĠĠĠĠĠĠ Ġval Ġnotify Ġ= ĠNotification Compat . Builder ( this , ĠNOT IFICATION _ CHANNEL _ AD BLOCK _ FILTER _ UPDATE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. setContent Title ( getText ( R . string . updating _ ad _ filters )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Small Icon ( R . drawable . ic _ y uz ub rowser _ white ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Priority ( Notification Compat . PRIORITY _ MIN ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Progress ( 0 , Ġ 0 , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġstart Foreground ( 1 , Ġnotify ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy () ĊĠĠĠĠĠĠĠ Ġstop Foreground ( true ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate All ( force Update : ĠBoolean , Ġresult Receiver : ĠResult Receiver ?) Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġresult Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġvar Ġnext UpdateTime Ġ= ĠLong . MAX _ VALUE ĊĠĠĠĠĠĠĠ Ġval Ġnow Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠ Ġab p Database . ab p Dao (). getAll (). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( force Update Ġ|| Ġit . is Need Update ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlocal Result Ġ= Ġupdate Internal ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( local Result Ġ&& Ġit . expires Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnext Time Ġ= Ġit . expires Ġ* ĠAN _ HOUR Ġ+ Ġnow ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( next Time Ġ< Ġnext UpdateTime ) Ġnext UpdateTime Ġ= Ġnext Time ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= Ġresult Ġor Ġlocal Result ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠAd Block Pref . get ( application Context ). ab pNext UpdateTime Ġ= Ġif Ġ( next UpdateTime Ġ!= ĠLong . MAX _ VALUE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnext UpdateTime ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . currentTimeMillis () Ġ+ ĠA _ DAY ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( result ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLocal Broadcast Manager ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. getInstance ( application Context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. send Broadcast ( Intent ( BRO ADCAST _ ACTION _ UPDATE _ AD _ BLOCK _ DATA )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġresult Receiver ?. send ( RESULT _ CODE _ UPDATE _ ALL , Ġnull ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Ab p Entity ( entity : ĠAb p Entity , Ġresult : ĠResult Receiver ?) Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( update Internal ( entity )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult ?. send ( RESULT _ CODE _ UPDATED , ĠBundle (). apply Ġ{ Ġput Parcelable ( EXTRA _ AB P _ ENTRY , Ġentity ) Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLocal Broadcast Manager ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. getInstance ( application Context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. send Broadcast ( Intent ( BRO ADCAST _ ACTION _ UPDATE _ AD _ BLOCK _ DATA )) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult ?. send ( RESULT _ CODE _ FAILED , ĠBundle (). apply Ġ{ Ġput Parcelable ( EXTRA _ AB P _ ENTRY , Ġentity ) Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġupdate Internal ( entity : ĠAb p Entity ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġentity . url Ġ== Ġ" yu zu :// ad block / filter " Ġ-> Ġupdate Assets ( entity ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġentity . url . startsWith (" http ") Ġ-> Ġupdate Http ( entity ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġentity . url . startsWith (" file ") Ġ-> Ġupdate File ( entity ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġupdate Http ( entity : ĠAb p Entity ): ĠBoolean Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRequest . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. url ( entity . url ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. get () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIllegalArgumentException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġentity . lastModified ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdir Ġ= Ġget Filter Dir () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( dir . get Ab p Black List File ( entity ). exists () Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdir . get Ab p White List File ( entity ). exists () Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdir . get Ab p White Page List File ( entity ). exists ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest . add Header (" If - Modified - Since ", Ġit ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġcall Ġ= Ġok HttpClient . new Call ( request . build ()) ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= Ġcall . execute () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( response . code Ġ== Ġ 3 0 4 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġentity . last Local Update Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġab p Database . ab p Dao (). update ( entity ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . body ?. run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcharset Ġ= ĠcontentType ()?. charset () Ġ?: ĠChar sets . UTF _ 8 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource (). inputStream (). buffered Reader ( charset ). use Ġ{ Ġreader Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( decode ( reader , Ġcharset , Ġentity )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġentity . lastModified Ġ= Ġresponse . header (" Last - Modified ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġupdate File ( entity : ĠAb p Entity ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpath Ġ= ĠUri . parse ( entity . url ). path Ġ?: Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile ( path ) ĊĠĠĠĠĠĠĠ Ġif Ġ( file . lastModified () Ġ< Ġentity . last Local Update ) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile . inputStream (). buffered Reader (). use Ġ{ Ġreader Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġdecode ( reader , ĠChar sets . UTF _ 8 , Ġentity ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġupdate Assets ( entity : ĠAb p Entity ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( entity . version Ġ== Ġ" 2 ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdir Ġ= Ġget Filter Dir () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( dir . get Ab p Black List File ( entity ). exists () Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdir . get Ab p White List File ( entity ). exists () Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdir . get Ab p White Page List File ( entity ). exists ()) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġassets . open (" ad block / yu zu _ filter . txt "). buffered Reader (). use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġdecode ( it , ĠChar sets . UTF _ 8 , Ġentity ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġdecode ( reader : ĠBufferedReader , Ġcharset : ĠCharset , Ġentity : ĠAb p Entity ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdecoder Ġ= ĠAb p Filter Decoder () ĊĠĠĠĠĠĠĠ Ġif Ġ(! decoder . check Header ( reader , Ġcharset )) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġval Ġset Ġ= Ġdecoder . decode ( reader , Ġentity . url ) ĊĊĠĠĠĠĠĠĠ Ġval Ġinfo Ġ= Ġset . filter Info ĊĠĠĠĠĠĠĠ Ġentity . title Ġ= Ġinfo . title ĊĠĠĠĠĠĠĠ Ġentity . expires Ġ= Ġinfo . expires Ġ?: Ġ- 1 ĊĠĠĠĠĠĠĠ Ġentity . home Page Ġ= Ġinfo . home Page ĊĠĠĠĠĠĠĠ Ġentity . version Ġ= Ġinfo . version ĊĠĠĠĠĠĠĠ Ġentity . last Update Ġ= Ġinfo . last Update ĊĠĠĠĠĠĠĠ Ġentity . last Local Update Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠ Ġval Ġdir Ġ= Ġget Filter Dir () ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwriter Ġ= ĠFilter Writer () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwriter . write ( dir . get Ab p Black List File ( entity ), Ġset . black List ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwriter . write ( dir . get Ab p White List File ( entity ), Ġset . white List ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwriter . write ( dir . get Ab p White Page List File ( entity ), Ġset . white Page List ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġelement Writer Ġ= ĠElement Writer () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelement Writer . write ( dir . get Ab p Element List File ( entity ), Ġset . element List ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġab p Database . ab p Dao (). update ( entity ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠFilter Writer . write ( file : ĠFile , Ġlist : ĠList < Unified Filter >) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( list . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile . output Stream (). buffered (). use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrite ( it , Ġlist ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( file . exists ()) Ġfile . delete () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠElement Writer . write ( file : ĠFile , Ġlist : ĠList < Element Filter >) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( list . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile . output Stream (). buffered (). use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrite ( it , Ġlist ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( file . exists ()) Ġfile . delete () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠACTION _ UPDATE _ ALL Ġ= Ġ" jp . h az uki . y uz ub rowser . ad block . service . action . Update All " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠACTION _ UPDATE _ AB P Ġ= Ġ" jp . h az uki . y uz ub rowser . ad block . service . action . Update Ab p " ĊĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠEX TRA _ AB P _ ENTRY Ġ= Ġ" jp . h az uki . y uz ub rowser . ad block . service . extra . entry " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠEX TRA _ RESULT Ġ= Ġ" jp . h az uki . y uz ub rowser . ad block . service . extra . result " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠEX TRA _ FORCE _ UPDATE Ġ= Ġ" jp . h az uki . y uz ub rowser . ad block . service . extra . update . force " ĊĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠRESULT _ CODE _ UPDATED Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠRESULT _ CODE _ FAILED Ġ= Ġ 2 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠRESULT _ CODE _ UPDATE _ ALL Ġ= Ġ 3 ĊĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠAN _ HOUR Ġ= Ġ 6 0 Ġ* Ġ 6 0 Ġ* Ġ 1 0 0 0 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠA _ DAY Ġ= Ġ 2 4 Ġ* ĠAN _ HOUR ĊĊĠĠĠĠĠĠĠ Ġfun Ġupdate All ( context : ĠContext , Ġforce Update : ĠBoolean Ġ= Ġfalse , Ġresult : ĠUpdate Result ? Ġ= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( context , ĠAb p Update Service :: class . java ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction Ġ= ĠACTION _ UPDATE _ ALL ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Extra ( EXTRA _ FORCE _ UPDATE , Ġforce Update ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Extra ( EXTRA _ RESULT , Ġresult ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . O ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . start Foreground Service ( intent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . start Service ( intent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġupdate ( context : ĠContext , Ġab p Entity : ĠAb p Entity , Ġresult : ĠUpdate Result ? Ġ= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( context , ĠAb p Update Service :: class . java ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction Ġ= ĠACTION _ UPDATE _ AB P ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Extra ( EXTRA _ AB P _ ENTRY , Ġab p Entity ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Extra ( EXTRA _ RESULT , Ġresult ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . O ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . start Foreground Service ( intent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . start Service ( intent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġabstract Ġclass ĠUpdate Result ( handler : ĠHandler ?) Ġ: ĠResult Receiver ( handler ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġfinal Ġoverride Ġfun Ġon Receive Result ( result Code : ĠInt , Ġresult Data : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( result Code ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRESULT _ CODE _ UPDATED Ġ-> Ġon Updated ( result Data !!. get Parcelable ( EXTRA _ AB P _ ENTRY ) !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRESULT _ CODE _ FAILED Ġ-> Ġon Failed Update ( result Data !!. get Parcelable ( EXTRA _ AB P _ ENTRY ) !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRESULT _ CODE _ UPDATE _ ALL Ġ-> ĠonUpdate All () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġabstract Ġfun Ġon Failed Update ( entity : ĠAb p Entity ) ĊĊĠĠĠĠĠĠĠ Ġabstract Ġfun Ġon Updated ( entity : ĠAb p Entity ) ĊĊĠĠĠĠĠĠĠ Ġabstract Ġfun ĠonUpdate All () ĊĠĠĠ Ġ} Ċ } Ċ