package Ġcom . z ait a . ali yo unes . z ait afc . helpers . glide progress Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . os . Handler Ċ import Ġandroid . os . Looper Ċ Ċ import Ġcom . bump tech . glide . G lide Ċ import Ġcom . bump tech . glide . Registry Ċ import Ġcom . bump tech . glide . annotation . G lide Module Ċ import Ġcom . bump tech . glide . integration . okhttp 3 . Ok Http Url Loader Ċ import Ġcom . bump tech . glide . load . model . G lide Url Ċ import Ġcom . bump tech . glide . module . App G lide Module Ċ Ċ import Ġjava . io . IOException Ċ import Ġjava . io . InputStream Ċ import Ġjava . util . Weak HashMap Ċ Ċ import Ġokhttp 3 . Http Url Ċ import Ġokhttp 3 . MediaType Ċ import Ġokhttp 3 . Ok HttpClient Ċ import Ġokhttp 3 . ResponseBody Ċ import Ġok io . Buffer Ċ import Ġok io . Buffered Source Ċ import Ġok io . Forwarding Source Ċ import Ġok io . Ok io Ċ import Ġok io . Source Ċ Ċ @ G lide Module Ċ class ĠProgress App G lide Module Ġ: ĠApp G lide Module () Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġregister Components ( context : ĠContext , Ġg lide : ĠG lide , Ġregistry : ĠRegistry ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . register Components ( context , Ġg lide , Ġregistry ) ĊĠĠĠĠĠĠĠ Ġval Ġclient Ġ= ĠOk HttpClient . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Network Interceptor Ġ{ Ġchain Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= Ġchain . request () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= Ġchain . proceed ( request ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= ĠDispatch ing Progress Listener () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . newBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. body ( Ok Http Progress ResponseBody ( request . url (), Ġresponse . body () !! , Ġlistener )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġregistry . replace ( G lide Url :: class . java , ĠInputStream :: class . java , ĠOk Http Url Loader . Factory ( client )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinterface ĠResponse Progress Listener Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġupdate ( url : ĠHttp Url , Ġbytes Read : ĠLong , Ġcontent Length : ĠLong ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinterface ĠUI on Progress Listener Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠControl Ġhow Ġoften Ġthe Ġlistener Ġneeds Ġan Ġupdate . Ġ 0 % Ġand Ġ 1 0 0 % Ġwill Ġalways Ġbe Ġdis patched . ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return Ġin Ġpercentage Ġ( 0 . 2 Ġ= Ġcall Ġ[. on Progress ] Ġaround Ġevery Ġ 0 . 2 Ġpercent Ġof Ġprogress ) ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġval Ġgran ual ity Percentage : ĠFloat ĊĊĠĠĠĠĠĠĠ Ġfun Ġon Progress ( bytes Read : ĠLong , Ġexpected Length : ĠLong ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠDispatch ing Progress Listener Ġinternal Ġconstructor () Ġ: ĠProgress App G lide Module . Response Progress Listener Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġhandler : ĠHandler Ġ= ĠHandler ( Looper . get Main Looper ()) ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġupdate ( url : ĠHttp Url , Ġbytes Read : ĠLong , Ġcontent Length : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// System . out . printf ("% s : Ġ% d /% d Ġ= Ġ%. 2 f %%% n ", Ġurl , Ġbytes Read , Ġcontent Length , Ġ( 1 0 0 f Ġ* Ġbytes Read ) Ġ/ Ġcontent Length ); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Ġ= Ġurl . toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= ĠLIST EN ERS [ key ] Ġ?: Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( content Length Ġ<= Ġbytes Read ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġforget ( key ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( needs Dispatch ( key , Ġbytes Read , Ġcontent Length , Ġlistener . gran ual ity Percentage )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandler . post Ġ{ Ġlistener . on Progress ( bytes Read , Ġcontent Length ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġneeds Dispatch ( key : ĠString , Ġcurrent : ĠLong , Ġtotal : ĠLong , Ġgranularity : ĠFloat ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( gran ularity Ġ== Ġ 0 f Ġ|| Ġcurrent Ġ== Ġ 0 L Ġ|| Ġtotal Ġ== Ġcurrent ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpercent Ġ= Ġ 1 0 0 f Ġ* Ġcurrent Ġ/ Ġtotal ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Progress Ġ= Ġ( percent Ġ/ Ġgranularity ). to Long () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlast Progress Ġ= ĠPRO GRES SES [ key ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( last Progress Ġ== Ġnull Ġ|| Ġcurrent Progress Ġ!= Ġlast Progress ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPRO GRES SES [ key ] Ġ= Ġcurrent Progress ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval ĠLIST EN ERS Ġ= ĠWeak HashMap < String , ĠUI on Progress Listener >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval ĠPRO GRES SES Ġ= ĠWeak HashMap < String , ĠLong >() ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġinternal Ġfun Ġforget ( url : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLIST EN ERS . remove ( url ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPRO GRES SES . remove ( url ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġinternal Ġfun Ġexpect ( url : ĠString , Ġlistener : ĠUI on Progress Listener ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLIST EN ERS [ url ] Ġ= Ġlistener ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠOk Http Progress ResponseBody Ġinternal Ġconstructor ( private Ġval Ġurl : ĠHttp Url , Ġprivate Ġval Ġresponse Body : ĠResponse Body , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġprogress Listener : ĠResponse Progress Listener ) Ġ: ĠResponse Body () Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġbuffered Source : ĠBuffered Source ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠcontentType (): ĠMediaType ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġresponse Body . contentType () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcontent Length (): ĠLong Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġresponse Body . content Length () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġsource (): ĠBuffered Source Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( buffered Source Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuffered Source Ġ= ĠOk io . buffer ( source ( response Body . source ())) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġbuffered Source !! ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġsource ( source : ĠSource ): ĠSource Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġobject Ġ: ĠForward ing Source ( source ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġtotal Bytes Read Ġ= Ġ 0 L ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġread ( sink : ĠBuffer , Ġbyte Count : ĠLong ): ĠLong Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbytes Read Ġ= Ġsuper . read ( sink , Ġbyte Count ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfull Length Ġ= Ġresponse Body . content Length () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( bytes Read Ġ== Ġ- 1 L ) Ġ{ Ġ// Ġthis Ġsource Ġis Ġex hausted ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtotal Bytes Read Ġ= Ġfull Length ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtotal Bytes Read Ġ+= Ġbytes Read ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprogress Listener . update ( url , Ġtotal Bytes Read , Ġfull Length ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġbytes Read ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġfun Ġforget ( url : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠProgress App G lide Module . Dispatch ing Progress Listener . forget ( url ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġexpect ( url : ĠString , Ġlistener : ĠProgress App G lide Module . UI on Progress Listener ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠProgress App G lide Module . Dispatch ing Progress Listener . expect ( url , Ġlistener ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }