package Ġcom . horizon . do od le Ċ Ċ import Ġcom . horizon . task . base . Log Proxy Ċ import Ġokhttp 3 . Cache Ċ import Ġokhttp 3 . Cache Control Ċ import Ġokhttp 3 . Ok HttpClient Ċ import Ġokhttp 3 . Request Ċ import Ġok io . ByteString Ċ import Ġjava . io . File Ċ import Ġjava . io . IOException Ċ import Ġjava . io . InputStream Ċ import Ġjava . util . concurrent . TimeUnit Ċ Ċ /** Ċ Ġ* ĠHttp ĠClient , Ġneed Ġto Ġinit ĠContext Ġwhen Ġapp Ġstart , Ċ Ġ* Ġto Ġset Ġup Ġthe Ġcache Ġpath . Ċ Ġ*/ Ċ internal Ġobject ĠDown loader Ġ Ġ{ ĊĠĠĠ Ġprivate Ġconst Ġval ĠTAG Ġ= Ġ" Downloader " ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġcache DirPath : ĠString ĊĊĠĠĠ Ġprivate Ġval Ġclient : ĠOk HttpClient Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcapacity Ġ= ĠConfig . source Cache Capacity ĊĠĠĠĠĠĠĠ Ġval Ġagent Ġ= ĠConfig . userAgent ĊĠĠĠĠĠĠĠ Ġval ĠmaxSize Ġ= Ġif Ġ( capacity Ġ> Ġ 0 ) Ġcapacity Ġelse Ġ( 2 5 6 L Ġshl Ġ 2 0 ) ĊĠĠĠĠĠĠĠ Ġcache DirPath Ġ= ĠUtils . cacheDir Ġ+ Ġ"/ do od le / source /" ĊĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠOk HttpClient . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. connect Timeout ( 1 0 , ĠTimeUnit . SECONDS ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. read Timeout ( 1 5 , ĠTimeUnit . SECONDS ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. cache ( Cache ( File ( cache DirPath ), ĠmaxSize )) ĊĠĠĠĠĠĠĠ Ġif Ġ(! agent . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . add Network Interceptor Ġ{ Ġchain Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchain . proceed ( chain . request (). newBuilder (). header (" User - Agent ", Ġagent ). build ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġbuilder . build () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġfun Ġget Source ( request : ĠRequest ): ĠAny ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= Ġclient . new Call ( request ). execute () ĊĠĠĠĠĠĠĠ Ġif Ġ( response . is Successful ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġat ĠOk Http Ġ 3 . 1 0 . 0 , Ġwe Ġcan Ġget Ġcached Ġbody Ġ( the Ġfile ) Ġlike Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġif Ġinput Ġlater Ġversion Ġfailed , Ġwe Ġneed Ġto Ġalways Ġcover t Ġto ĠStream Source . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠinputStream Ġ= Ġresponse . body () !!. byte Stream () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( inputStream Ġ!= Ġnull Ġ&& ĠinputStream . toString (). contains (" FileInputStream ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcache File Ġ= ĠFile ( cache DirPath Ġ+ ĠCache . key ( request . url ()) Ġ+ Ġ". 1 ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cache File . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUtils . close Quiet ly ( inputStream ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcache File ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠinputStream ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIOException (" request Ġfailed , Ġ" Ġ+ Ġresponse . code ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdownload Only ( url : ĠString ): ĠFile ? Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġbuffer : ĠByteArray ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġvar ĠinputStream : ĠInputStream ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= ĠRequest . Builder (). url ( url ). build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= Ġclient . new Call ( request ). execute () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( response . is Successful ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠinputStream Ġ= Ġresponse . body () !!. byte Stream () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( inputStream Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! inputStream . toString (). contains (" FileInputStream ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer Ġ= ĠByteArray Pool . basic Array ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( inputStream . read ( buffer ) Ġ!= Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġdo Ġnothing , Ġjust Ġinvoke Ġread () Ġto Ġdownload Ġ- _- ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcache File Ġ= ĠFile ( cache DirPath Ġ+ ĠCache . key ( request . url ()) Ġ+ Ġ". 1 ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cache File . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcache File ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog Proxy . e ( TAG , Ġe ) ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠByteArray Pool . recycle Basic Array ( buffer ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠUtils . close Quiet ly ( inputStream ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Source Cache File ( url : ĠString ): ĠFile ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcache File Ġ= ĠFile ( cache DirPath Ġ+ ĠByte String . encode Utf 8 ( url ). md 5 (). hex () Ġ+ Ġ". 1 ") ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( cache File . exists ()) Ġcache File Ġelse Ġnull ĊĠĠĠ Ġ} Ċ } Ċ