package Ġcom . nk ming . sys usage Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . net . Connectivity Manager Ċ import Ġandroid . net . Traffic Stats Ċ import Ġandroid . os . Parcel Ċ import Ġandroid . os . Parcelable Ċ Ċ data Ġclass ĠNet Stat ( Ċ ĉ val Ġis Online : ĠBoolean , Ċ ĉ // ĠB Ġfor ĠByte Ċ ĉ val Ġtx B ps : ĠLong , Ċ ĉ val Ġtx Usage : ĠDouble , Ċ ĉ val Ġr xB ps : ĠLong , Ċ ĉ val Ġrx Usage : ĠDouble , Ċ ĉ private Ġval Ġ_ is Good : ĠBoolean Ġ= Ġtrue ) Ċ ĉ : ĠParcel able Ċ { Ċ ĉ comp anion Ġobject Ċ ĉ { Ċĉ ĉ @ Jvm Field Ċĉ ĉ val ĠCRE ATOR Ġ= Ġobject : ĠParcel able . Creator < Net Stat > Ċĉ ĉ { Ċĉĉ ĉ override Ġfun Ġcreate From Parcel ( source : ĠParcel ): ĠNet Stat Ċĉĉ ĉ { Ċĉĉĉ ĉ return ĠNet Stat (( source . readInt () Ġ!= Ġ 0 ), Ċĉĉĉĉĉ ĉ source . read Long (), Ċĉĉĉĉĉ ĉ source . read Double (), Ċĉĉĉĉĉ ĉ source . read Long (), Ċĉĉĉĉĉ ĉ source . read Double ()) Ċĉĉ ĉ } ĊĊĉĉ ĉ override Ġfun Ġnew Array ( size : ĠInt ): ĠArray < Net Stat ?> Ċĉĉ ĉ { Ċĉĉĉ ĉ return ĠarrayOf Null s ( size ) Ċĉĉ ĉ } Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ constructor () Ġ: Ġthis ( false , Ġ 0 , Ġ. 0 , Ġ 0 , Ġ. 0 , Ġfalse ) ĊĊ ĉ override Ġfun Ġdescribe Contents () Ġ= Ġ 0 ĊĊ ĉ override Ġfun ĠwriteTo Parcel ( dest : ĠParcel , Ġflags : ĠInt ) Ċ ĉ { Ċĉ ĉ dest . writeInt ( if Ġ( is Online ) Ġ 1 Ġelse Ġ 0 ) Ċĉ ĉ dest . write Long ( tx B ps ) Ċĉ ĉ dest . write Double ( tx Usage ) Ċĉ ĉ dest . write Long ( rx B ps ) Ċĉ ĉ dest . write Double ( rx Usage ) Ċ ĉ } ĊĊ ĉ val Ġis Good : ĠBoolean Ċĉ ĉ get () Ġ= Ġ_ is Good Ċ } Ċ Ċ class ĠNet Stat Provider ( context : ĠContext , Ċĉ ĉ on Stat Update : Ġ(( stat : ĠNet Stat ) Ġ-> ĠUnit )? Ġ= Ġnull , Ċĉ ĉ on Failure : Ġ(( msg : ĠString , Ġe : ĠException ?) Ġ-> ĠUnit )? Ġ= Ġnull ) Ċĉ ĉ : ĠBase Stat Provider () Ċ { Ċ ĉ var Ġon Stat Update Ġ= Ġon Stat Update Ċ ĉ var Ġon Failure Ġ= Ġon Failure ĊĊ ĉ // ĠThrough put Ġis Ġin Ġbit / s Ċ ĉ var Ġmobile Rx Through put Ġ= Ġ 0 L Ċ ĉ var Ġmobile Tx Through put Ġ= Ġ 0 L Ċ ĉ var Ġwifi Rx Through put Ġ= Ġ 0 L Ċ ĉ var Ġwifi Tx Through put Ġ= Ġ 0 L ĊĊ ĉ protected Ġoverride Ġfun ĠonUpdate () Ċ ĉ { Ċĉ ĉ val Ġnow Ġ= ĠSystem . currentTimeMillis () Ċĉ ĉ val Ġtx Ġ= ĠTraffic Stats . getTotal Tx Bytes () Ċĉ ĉ val Ġrx Ġ= ĠTraffic Stats . getTotal Rx Bytes () Ċĉ ĉ try Ċĉ ĉ { Ċĉĉ ĉ if Ġ(!_ is First Run ) Ċĉĉ ĉ { Ċĉĉĉ ĉ val Ġdivisor Ġ= Ġ( now Ġ- Ġ_ prev Time ) Ġ/ Ġ 1 0 0 0 . 0 Ċĉĉĉ ĉ val Ġr xB ps Ġ= Ġ( rx Ġ- Ġ_ prev Rx ) Ġ/ Ġdivisor Ċĉĉĉ ĉ val Ġtx B ps Ġ= Ġ( tx Ġ- Ġ_ prev Tx ) Ġ/ Ġdivisor Ċĉĉĉ ĉ val Ġthrough puts Ġ= Ġ_ active Through puts Ċĉĉĉ ĉ val Ġstat Ġ= Ġif Ġ( through puts Ġ== Ġnull ) Ċĉĉĉ ĉ { Ċĉĉĉĉ ĉ Net Stat ( false , Ġ 0 , Ġ. 0 , Ġ 0 , Ġ. 0 ) Ċĉĉĉ ĉ } Ċĉĉĉ ĉ else Ċĉĉĉ ĉ { Ċĉĉĉĉ ĉ val Ġrx Usage Ġ= Ġif Ġ( through puts . first Ġ> Ġ 0 ) Ċĉĉĉĉĉĉĉĉ ĉ ( rx B ps Ġ* Ġ 8 . 0 ) Ġ/ Ġthrough puts . first Ċĉĉĉĉĉĉ ĉ else Ġ 0 . 0 Ċĉĉĉĉ ĉ val Ġtx Usage Ġ= Ġif Ġ( through puts . second Ġ> Ġ 0 ) Ċĉĉĉĉĉĉĉĉ ĉ ( tx B ps Ġ* Ġ 8 . 0 ) Ġ/ Ġthrough puts . second Ċĉĉĉĉĉĉ ĉ else Ġ 0 . 0 Ċĉĉĉĉ ĉ Net Stat ( true , ĠMath . round ( tx B ps ), Ġtx Usage , ĠMath . round ( rx B ps ), Ċĉĉĉĉĉĉ ĉ rx Usage ) Ċĉĉĉ ĉ } Ċĉĉĉ ĉ on Stat Update ?. invoke ( stat ) Ċĉĉ ĉ } Ċĉĉ ĉ else Ċĉĉ ĉ { Ċĉĉĉ ĉ on Stat Update ?. invoke ( Net Stat ( false , Ġ 0 , Ġ. 0 , Ġ 0 , Ġ. 0 )) Ċĉĉ ĉ } Ċĉ ĉ } Ċĉ ĉ catch Ġ( e : ĠException ) Ċĉ ĉ { Ċĉĉ ĉ on Failure ?. invoke (" Failed Ġwhile Ġgather ing Ġnetwork Ġstat ", Ġe ) Ċĉ ĉ } Ċĉ ĉ finally Ċĉ ĉ { Ċĉĉ ĉ _ prev Time Ġ= Ġnow Ċĉĉ ĉ _ prev Tx Ġ= Ġtx Ċĉĉ ĉ _ prev Rx Ġ= Ġrx Ċĉĉ ĉ _ is First Run Ġ= Ġfalse Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ private Ġval Ġ_ active Through puts : ĠPair < Long , ĠLong >? Ċĉ ĉ get () Ċĉ ĉ { Ċĉĉ ĉ val Ġnet Info Ġ= Ġ_ connectivity Manager . active Network Info Ġ?: Ġreturn Ġnull Ċĉĉ ĉ if Ġ(! net Info . isConnected ) Ċĉĉ ĉ { Ċĉĉĉ ĉ return Ġnull Ċĉĉ ĉ } Ċĉĉ ĉ return Ġwhen Ġ( net Info . type ) Ċĉĉ ĉ { Ċĉĉĉ ĉ Connectivity Manager . TYPE _ ETHER NET , Ċĉĉĉ ĉ Connectivity Manager . TYPE _ WIFI Ġ-> Ċĉĉĉĉĉ ĉ Pair ( wifi Rx Through put , Ġwifi Tx Through put ) ĊĊĉĉĉ ĉ else Ġ-> ĠPair ( mobile Rx Through put , Ġmobile Tx Through put ) Ċĉĉ ĉ } Ċĉ ĉ } ĊĊ ĉ private Ġval Ġ_ context Ġ= Ġcontext Ċ ĉ private Ġval Ġ_ connectivity Manager Ġby Ġlazy { _ context . getSystem Service ( Ċĉĉ ĉ Context . CONNECT IVITY _ SERVICE ) Ġas ĠConnect ivity Manager } ĊĊ ĉ private Ġvar Ġ_ is First Run Ġ= Ġtrue Ċ ĉ private Ġvar Ġ_ prev Time Ġ= Ġ 0 L Ċ ĉ private Ġvar Ġ_ prev Tx Ġ= Ġ 0 L Ċ ĉ private Ġvar Ġ_ prev Rx Ġ= Ġ 0 L Ċ } Ċ