/* Ċ Ġ* ĠCopyright Ġ 2 0 2 1 ĠRe think DNS Ġand Ġits Ġauthors Ċ Ġ* Ċ Ġ* Ġ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 Ċ Ġ* Ċ Ġ* Ġhttps :// 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 Ġcom . cel zero . br aved ns . download Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . util . Log Ċ import Ġandroidx . work . Worker Ċ import Ġandroidx . work . Worker Parameters Ċ import Ġandroidx . work . work Data Of Ċ import Ġcom . cel zero . br aved ns . download . Block list Download Helper . Companion . delete From External Dir Ċ import Ġcom . cel zero . br aved ns . service . Persistent State Ċ import Ġcom . cel zero . br aved ns . ui . Home Screen Activity . Global Variable . DEBUG Ċ import Ġcom . cel zero . br aved ns . util . Constants Ċ import Ġcom . cel zero . br aved ns . util . Constants . Companion . INIT _ TIME _ MS Ċ import Ġcom . cel zero . br aved ns . util . Logger Constants . Companion . LOG _ TAG _ DOWNLOAD Ċ import Ġcom . cel zero . br aved ns . util . Utilities Ċ import Ġcom . cel zero . br aved ns . util . Utilities . Companion . has Local Block lists Ċ import Ġcom . cel zero . br aved ns . util . Utilities . Companion . local Block list Download Path Ċ import Ġdns x . Dns x Ċ import Ġorg . k oin . core . component . K oin Component Ċ import Ġorg . k oin . core . component . inject Ċ import Ġjava . io . File Ċ Ċ /** Ċ Ġ* ĠClass Ġresponsible Ġfor Ġcopying Ġthe Ġfiles Ġfrom ĠExternal Ġpath Ġto Ġcanonical Ġpath . Ċ Ġ* ĠThe Ġworker Ġwill Ġbe Ġtriggered Ġonce Ġthe ĠDownload Watcher Ġworker Ġfinishes Ġits Ġwork . Ċ Ġ* Ċ Ġ* ĠFile Ġhandler Ġshould Ġcheck Ġif Ġthe Ġfiles Ġare Ġavailable Ġin Ġthe Ġexternal Ġfile Ġpath . Ċ Ġ* ĠIf Ġyes , Ġwill Ġcopy Ġto Ġthe Ġcanonical Ġpath Ġand Ġwill Ġstop Ġthe Ġworker . Ċ Ġ* Ċ Ġ* ĠAs Ġof Ġnow Ġthe Ġcode Ġis Ġwritten Ġonly Ġfor Ġthe Ġlocal Ġblock Ġlist Ġcopy . Ċ Ġ*/ Ċ Ċ class ĠFile Handle Worker ( val Ġcontext : ĠContext , Ġworker Parameters : ĠWorker Parameters ) Ġ: ĊĠĠĠĠĠĠĠ ĠWorker ( context , Ġworker Parameters ), ĠK oin Component Ġ{ ĊĊĠĠĠ Ġval Ġpersistent State Ġby Ġinject < Persistent State >() ĊĊĠĠĠ Ġoverride Ġfun Ġdo Work (): ĠResult Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtimestamp Ġ= Ġinput Data . getLong (" block list Download Initi ated Time ", ĠLong . MIN _ VALUE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( DEBUG ) ĠLog . d ( LOG _ TAG _ DOWNLOAD , Ġ" block list Download Initi ated Time Ġ- Ġ$ timestamp ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġinvalid Ġdownload Ġinitiated Ġtime ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( timestamp Ġ<= ĠINIT _ TIME _ MS ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . w ( LOG _ TAG _ DOWNLOAD , Ġ" timestamp Ġversion Ġinvalid Ġ$ timestamp ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠResult . failure () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠA Ġfile Ġmove Ġfrom Ġexternal Ġfile Ġpath Ġto Ġapp Ġdata Ġdir Ġis Ġpreferred Ġbecause Ġit Ġis Ġan ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġatomic Ġoperation : Ġbut ĠAndroid Ġdoesn 't Ġsupport Ġmove / rename Ġacross Ġmount Ġpoints . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= Ġcopy Files ( context , Ġtimestamp ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoutput Data Ġ= Ġwork Data Of ( Download Constants . OUTPUT _ FILES Ġto Ġresponse ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( response ) ĠResult . success ( output Data ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĠResult . failure () ĊĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( LOG _ TAG _ DOWNLOAD , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" File Handle Worker ĠError Ġwhile Ġmoving Ġfiles Ġto Ġcanonical Ġpath Ġ${ e . message }", Ġe ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠResult . failure () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcopy Files ( context : ĠContext , Ġtimestamp : ĠLong ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! Block list Download Helper . is Download Complete ( context , Ġtimestamp . toString ())) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠBlock list Download Helper . delete From Canonical Path ( context , Ġtimestamp ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdir Ġ= ĠFile ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBlock list Download Helper . get External FilePath ( context , Ġtimestamp . toString ())) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! dir . isDirectory ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . w ( LOG _ TAG _ DOWNLOAD , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Abort : Ġfile Ġdownload Ġpath Ġ${ dir . absolute Path } Ġisn 't Ġa Ġdirectory ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchildren Ġ= Ġdir . list () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( children . isNull OrEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . w ( LOG _ TAG _ DOWNLOAD , Ġ" Abort : Ġ${ dir . absolute Path } Ġis Ġempty Ġdirectory ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIn Ġcase Ġof Ġfailure , Ġall Ġfiles Ġin ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ 1 . Ġ" from " Ġdir Ġwill Ġbe Ġdeleted Ġby Ġdelete From External Dir ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ 2 . Ġ" to " Ġdir Ġwill Ġbe Ġdelete Ġby Ġdelete From Canonical Path ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġduring Ġthe Ġnext Ġdownload Ġdownload Local Block list ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġchildren . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfrom Ġ= Ġdir . absolute Path Ġ+ ĠFile . separator Ġ+ Ġchildren [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġto Ġ= Ġlocal Block list Download Path ( context , Ġchildren [ i ], Ġtimestamp ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( to Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . w ( LOG _ TAG _ DOWNLOAD , Ġ" Copy Ġfailed Ġfrom Ġ$ from , Ġto : Ġ$ to ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠUtilities . copy ( from , Ġto ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! result ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . w ( LOG _ TAG _ DOWNLOAD , Ġ" Copy Ġfailed Ġfrom : Ġ$ from , Ġto : Ġ$ to ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdestination Dir Ġ= ĠFile ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ context . files Dir . canonical Path }${ File . separator }$ timestamp ${ File . separator }") ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( LOG _ TAG _ DOWNLOAD , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" After Ġcopy , Ġdest Ġdir : Ġ$ destination Dir , Ġ${ destination Dir . isDirectory }, Ġ${ destination Dir . list ()?. count () }") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! has Local Block lists ( context , Ġtimestamp ) Ġ|| Ġ! is Download Valid ( timestamp )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Persistence On Copy Success ( timestamp ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelete From External Dir ( context , Ġtimestamp ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( LOG _ TAG _ DOWNLOAD , Ġ" App Download Manager ĠCopy Ġexception Ġ- Ġ${ e . message }", Ġe ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Persistence On Copy Success ( timestamp : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġpersistent State . local Block list Timestamp Ġ= Ġtimestamp ĊĠĠĠĠĠĠĠ Ġpersistent State . block list Enabled Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠPost Ġthe Ġcheck Ġof Ġnumber Ġof Ġfiles Ġdownloaded Ġby Ġthe ĊĠĠĠĠ Ġ* Ġdownload Ġmanager , Ġneed Ġto Ġvalidate Ġthe Ġdownloaded Ġfiles . ĊĠĠĠĠ Ġ* ĠAs Ġof Ġnow Ġthere Ġis Ġno Ġchecksum Ġvalidation . ĊĠĠĠĠ Ġ* ĠSo Ġvalidating Ġthe Ġdownloaded Ġfiles Ġby ĊĠĠĠĠ Ġ* Ġcreate Ġlocal Br ave DNS Ġobject . ĠIf Ġthe Ġobject Ġreturned Ġby Ġthe ĊĠĠĠĠ Ġ* ĠD ns x Ġis Ġnot Ġnull Ġthen Ġvalid . ĠNull / exception Ġwill Ġbe Ġinvalid . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġis Download Valid ( timestamp : ĠLong ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpath : ĠString Ġ= Ġcontext . files Dir . canonical Path Ġ+ ĠFile . separator Ġ+ Ġtimestamp ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbr ave DNS Ġ= ĠD ns x . new Br ave DNS Local ( path Ġ+ ĠConstants . ON DEVICE _ BLOCK LIST _ FILE _ TD , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath Ġ+ ĠConstants . ON DEVICE _ BLOCK LIST _ FILE _ RD , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath Ġ+ ĠConstants . ON DEVICE _ BLOCK LIST _ FILE _ BASIC _ CONFIG , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath Ġ+ ĠConstants . ON DEVICE _ BLOCK LIST _ FILE _ TAG ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( DEBUG ) ĠLog . d ( LOG _ TAG _ DOWNLOAD , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" App Download Manager Ġis Download Valid ? Ġ${ br ave DNS Ġ!= Ġnull }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġbr ave DNS Ġ!= Ġnull ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( LOG _ TAG _ DOWNLOAD , Ġ" App Download Manager Ġis Download Valid Ġexception Ġ- Ġ${ e . message }", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} Ċ Ċ } Ċ