/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 1 7 - 2 0 1 8 Ġ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 . download . core . downloader Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . webkit . Cookie Manager Ċ import Ġjp . h az uki . y uz ub rowser . Constants Ċ import Ġjp . h az uki . y uz ub rowser . download . core . data . Download FileInfo Ċ import Ġjp . h az uki . y uz ub rowser . download . core . data . Download Request Ċ import Ġjp . h az uki . y uz ub rowser . download . core . downloader . client . HttpClient Ċ import Ġjp . h az uki . y uz ub rowser . download . core . utils . check Flag Ċ import Ġjp . h az uki . y uz ub rowser . download . core . utils . content Length Ċ import Ġjp . h az uki . y uz ub rowser . download . core . utils . is Res um able Ċ import Ġjp . h az uki . y uz ub rowser . utils . Error Report Ċ import Ġjava . io . IOException Ċ import Ġjava . net . Http URLConnection Ċ import Ġjava . net . Malformed URLException Ċ Ċ class ĠHttp Downloader ( private Ġval Ġcontext : ĠContext , Ġprivate Ġval Ġinfo : ĠDownload FileInfo , Ġprivate Ġval Ġrequest : ĠDownload Request ) Ġ: ĠDown loader Ġ{ ĊĠĠĠ Ġoverride Ġvar Ġdownload Listener : ĠDown loader . Download Listener ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġvar Ġabort Ġ= Ġfalse ĊĊĠĠĠ Ġoverride Ġfun Ġdownload (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠhttpClient : ĠHttpClient ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠhttpClient Ġ= ĠHttpClient . create ( info . url ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠMal formed URLException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdownload Listener ?. on File Download Failed ( info , Ġ" unknown Ġurl :${ info . url }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠhttpClient . instance Follow Redirect s Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠ ĠhttpClient . setHeader (" Connection ", Ġ" close ") ĊĊĠĠĠĠĠĠĠ ĠhttpClient . set Cookie ( Cookie Manager . getInstance (). get Cookie ( info . url )) ĊĠĠĠĠĠĠĠ ĠhttpClient . set Ref errer ( request . referrer ) ĊĠĠĠĠĠĠĠ ĠhttpClient . set UserAgent ( context , Ġrequest . userAgent ) ĊĊĠĠĠĠĠĠĠ Ġval Ġexist Tmp Ġ= Ġinfo . root . find File ("${ info . name }${ Constants . download . TMP _ FILE _ SUFFIX }") ĊĊĠĠĠĠĠĠĠ Ġif Ġ( info . res um able Ġ&& Ġinfo . check Flag ( Download FileInfo . STATE _ PA USED ) Ġ&& Ġexist Tmp Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinfo . current Size Ġ= Ġexist Tmp . length () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠhttpClient . set Range (" bytes =${ info . current Size }-${ info . size }") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġtmp Ġ= Ġexist Tmp Ġ?: Ġinfo . root . create File ( info . mime Type , Ġ"${ info . name }${ Constants . download . TMP _ FILE _ SUFFIX }") ĊĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠIllegalStateException (" Can Ġnot Ġcreate Ġfile . Ġmime type :${ info . mime Type }, Ġfilename :${ info . name }${ Constants . download . TMP _ FILE _ SUFFIX }, ĠEx ists :${ info . root . exists ()}, ĠWrit able :${ info . root . can Write ()}, ĠUri :${ info . root . uri }") ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠhttpClient . connect () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmode Ġ= Ġwhen Ġ( httpClient . response Code ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHttp URLConnection . HTTP _ OK Ġ-> Ġ" w " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHttp URLConnection . HTTP _ PAR TIAL Ġ-> Ġ" wa " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinfo . state Ġ= ĠDownload FileInfo . STATE _ UNKNOWN _ ERROR ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdownload Listener ?. on File Download Failed ( info , Ġ" failed Ġconnect Ġresponse :${ httpClient . response Code }\ nat :${ info . url }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( info . size Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinfo . size Ġ= ĠhttpClient . content Length ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! info . res um able ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinfo . res um able Ġ= ĠhttpClient . is Res um able ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . content Resolver . open OutputStream ( tmp . uri , Ġmode ). use Ġ{ Ġoutput Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠhttpClient . inputStream . use Ġ{ Ġinput Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdownload Listener ?. onStart Download ( info ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġlen Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġprogress Ġ= Ġinfo . current Size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuffer Ġ= ĠByteArray ( BUFFER _ SIZE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġold Size : ĠLong ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġold Sec Ġ= ĠSystem . currentTimeMillis () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( input . read ( buffer , Ġ 0 , ĠBUFFER _ SIZE ). also Ġ{ Ġlen Ġ= Ġit Ġ} Ġ>= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( abort ) Ġbreak ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput . write ( buffer , Ġ 0 , Ġlen ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprogress Ġ+= Ġlen ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( System . currentTimeMillis () Ġ> Ġold Sec Ġ+ ĠNOT IFICATION _ INTERVAL ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġold Size Ġ= Ġinfo . current Size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinfo . current Size Ġ= Ġprogress ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtime Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinfo . transfer Speed Ġ= Ġ(( progress Ġ- Ġold Size ) Ġ* Ġ 1 0 0 0 . 0 Ġ/ Ġ( time Ġ- Ġold Sec )). to Long () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdownload Listener ?. on File Downloading ( info , Ġprogress ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġold Sec Ġ= Ġtime ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( abort ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelete Temp If Need () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdownload Listener ?. on File Download Abort ( info ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! tmp . rename To ( info . name )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIOException (" Rename Ġis Ġfailed . Ġname :\" ${ info . name }\ ", Ġmime type :${ info . mime Type }, exists :${ info . root . find File ( info . name ) Ġ!= Ġnull }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġinfo . state Ġ= ĠDownload FileInfo . STATE _ DOWN LOADED ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdownload Listener ?. on File Downloaded ( info ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠError Report . print And Write Log ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( info . res um able ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinfo . state Ġ= ĠDownload FileInfo . STATE _ UNKNOWN _ ERROR Ġor ĠDownload FileInfo . STATE _ PA USED ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtmp . delete () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinfo . state Ġ= ĠDownload FileInfo . STATE _ UNKNOWN _ ERROR ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdownload Listener ?. on File Download Failed ( info , Ġnull ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcancel () Ġ{ ĊĠĠĠĠĠĠĠ Ġinfo . state Ġ= ĠDownload FileInfo . STATE _ C ANCE LED ĊĠĠĠĠĠĠĠ Ġabort Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġpause () Ġ{ ĊĠĠĠĠĠĠĠ Ġinfo . state Ġ= ĠDownload FileInfo . STATE _ PA USED ĊĠĠĠĠĠĠĠ Ġabort Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġabort () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( info . res um able ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinfo . state Ġ= ĠDownload FileInfo . STATE _ UNKNOWN _ ERROR Ġor ĠDownload FileInfo . STATE _ PA USED ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinfo . state Ġ= ĠDownload FileInfo . STATE _ UNKNOWN _ ERROR ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġabort Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdelete Temp If Need () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( info . state Ġ== ĠDownload FileInfo . STATE _ UNKNOWN _ ERROR Ġ|| Ġinfo . state Ġ== ĠDownload FileInfo . STATE _ C ANCE LED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinfo . root . find File ("${ info . name }${ Constants . download . TMP _ FILE _ SUFFIX }") ?. delete () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠBUFFER _ SIZE Ġ= Ġ 1 0 2 4 Ġ* Ġ 2 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠNOT IFICATION _ INTERVAL Ġ= Ġ 1 0 0 0 ĊĠĠĠ Ġ} Ċ }