package Ġcom . os ack y . doctor Ċ Ċ import Ġcom . os ack y . doctor . Download Speed Meas urer . External Download Event . Companion . from Gradle Type Ċ import Ġcom . os ack y . doctor . internal . Interval Meas urer Ċ import Ġcom . os ack y . doctor . internal . Scan Api Ċ import Ġcom . os ack y . doctor . internal . Slow Network Printer Ċ import Ġcom . os ack y . doctor . internal . Slow Network Printer . Companion . ONE _ ME G AB Y TE Ċ import Ġio . reactivex . rx java 3 . dis pos ables . Disposable Ċ import Ġorg . gradle . internal . operations . Operation Finish Event Ċ import Ġorg . gradle . internal . resource . External Resource Read Build Operation Type Ċ import Ġjava . util . Collections Ċ Ċ class ĠDownload Speed Meas urer ( ĊĠĠĠ Ġprivate Ġval Ġbuild Operations : ĠOperation Events , ĊĠĠĠ Ġprivate Ġval Ġextension : ĠDoctor Extension , ĊĠĠĠ Ġprivate Ġval Ġinterval Meas urer : ĠInterval Meas urer Ċ ) Ġ: ĠBuild Start Finish Listener , ĠHas Build Scan Tag Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġslow Network Printer Ġ= ĠS low Network Printer (" External ĠRe pos ") ĊĠĠĠ Ġprivate Ġval Ġdownload Events Ġ= ĠCollections . synchronized List ( mutable ListOf < External Download Event >()) ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġdis posable : ĠDis posable ĊĊĠĠĠ Ġoverride Ġfun ĠonStart () Ġ{ ĊĠĠĠĠĠĠĠ Ġdis posable Ġ= Ġbuild Operations . fin ishes () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . result Ġis ĠExternal Resource Read Build Operation Type . Result Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġfrom Gradle Type ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe Ġ{ Ġevent Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdownload Events . add ( event ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Finish (): ĠList < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠDispose Ġfirst Ġbefore Ġsum ming Ġbyte Ġtotals Ġotherwise Ġwe Ġget Ġcr azy ĠN PE s ? ĊĠĠĠĠĠĠĠ Ġdis posable . dispose () ĊĊĠĠĠĠĠĠĠ Ġsynchronized ( download Events ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtotal Bytes Ġ= Ġdownload Events . sum By Ġ{ Ġevent Ġ-> Ġevent . byte Total . toInt () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtotal Time Ġ= Ġinterval Meas urer . find Total Time ( download Events . map Ġ{ Ġit . start Ġto Ġit . end Ġ}) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDon 't Ġdo Ġanything Ġif Ġwe Ġdidn 't Ġdownload Ġanything . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( total Bytes Ġ== Ġ 0 Ġ|| Ġtotal Time Ġ== Ġ 0 L ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġempty List () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtotal Speed Ġ= Ġ( total Bytes Ġ/ Ġtotal Time ) Ġ/ Ġ 1 0 2 4 f ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠOnly Ġprint Ġtime Ġif Ġwe Ġdownloaded Ġat Ġleast Ġone Ġmeg abyte ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( total Bytes Ġ> ĠONE _ ME G AB Y TE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( total Speed Ġ< Ġextension . download Speed Warning Threshold . get ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠlistOf ( slow Network Printer . obtain Message ( total Bytes , Ġtotal Time , Ġtotal Speed )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġempty List () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġdata Ġclass ĠExternal Download Event ( val Ġstart : ĠLong , Ġval Ġend : ĠLong , Ġval Ġbyte Total : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġfrom Gradle Type ( event : ĠOperation Finish Event ): ĠExternal Download Event Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġevent . result ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( result Ġis ĠExternal Resource Read Build Operation Type . Result ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠExternal Download Event ( event . startTime , Ġevent . endTime , Ġresult . bytes Read ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġadd Custom Values ( build Scan Api : ĠScan Api ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbuild Scan Api . tag (" doctor - slow - maven - connection ") ĊĠĠĠ Ġ} Ċ } Ċ