package Ġse . loc ut us . sl . re alt id hem . net Ċ Ċ import Ġandroid . content . Context Ċ import Ġcom . android . vol ley . Network Response Ċ import Ġcom . android . vol ley . Request Ċ import Ġcom . android . vol ley . Response Ċ import Ġcom . android . vol ley . toolbox . Http Header Parser Ċ import Ġcom . android . vol ley . toolbox . Vol ley Ċ import Ġse . loc ut us . proto . Ng Ċ import Ġse . loc ut us . proto . Ng . ResponseData Ċ import Ġse . loc ut us . proto . Ng . Request Data Ċ import Ġjava . lang . Exception Ċ import Ġjava . util . logging . Logger Ċ Ċ interface ĠNetwork Interface Ġ{ ĊĠĠĠ Ġfun Ġdo Stop Data Request ( request Ġ: ĠNg . Stop Data Request , Ġforce Http Ġ: ĠBoolean Ġ= Ġfalse , Ġcall Back Ġ: Ġ( Int , ĠResponse Data , ĠException ?) Ġ-> ĠUnit ) Ġ: ĠInt Ċ } Ċ Ċ class ĠNetwork Manager ( var Ġcontext Ġ: ĠContext ) Ġ: ĠNetwork Interface Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠLOG Ġ= ĠLogger . getLogger ( Network Manager :: class . java . name ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġrequest Queue Ġ= ĠVol ley . new Request Queue ( context ) ĊĠĠĠ Ġval Ġprefs Ġ= Ġcontext . get SharedPreferences ( null , Ġ 0 ) ĊĠĠĠ Ġval Ġudp Socket Ġ= ĠUp d Client ( context , Ġprefs ). apply Ġ{ Ġstart () Ġ} ĊĠĠĠ Ġprivate Ġvar ĠrequestId Ġ= Ġ 1 ĊĊĠĠĠ Ġoverride Ġfun Ġdo Stop Data Request ( request Ġ: ĠNg . Stop Data Request , Ġforce Http Ġ: ĠBoolean , Ġcall Back Ġ: Ġ( Int , ĠResponse Data , ĠException ?) Ġ-> ĠUnit ) Ġ: ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġapi Ġ= Ġcontext . package Manager . get Package Info ( context . packageName , Ġ 0 ). version Code ĊĠĠĠĠĠĠĠ Ġdo Request ( Request Data . newBuilder (). set Stop Data Request ( request ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. setRequest Header ( Ng . Request Header . newBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Api ( api ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setId ( requestId )). build (), Ġ Ġforce Http , Ġcall Back ) ĊĠĠĠĠĠĠĠ Ġreturn ĠrequestId ++ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdo Request ( request Ġ: ĠRequest Data , Ġforce Http Ġ: ĠBoolean , Ġcallback Ġ: Ġ( Int , ĠResponse Data , ĠException ?) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( udp Socket . ready () Ġ&& Ġudp Socket . responsive Ġ&& Ġ! force Http ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . info (" Sending Ġrequest Ġusing ĠUDP ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsend Request With UDP ( request , Ġcallback ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . info (" Sending Ġrequest Ġusing ĠHTTP ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsend Request With HTTP ( request , Ġcallback ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( udp Socket . ready () Ġ&& Ġ! force Http ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġudp Socket . br ing Back To Life () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsend Request With UDP ( request Ġ: ĠRequest Data , Ġcallback Ġ: Ġ( Int , ĠResponse Data , ĠException ?) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠ Ġudp Socket . send Request ( request , Ġcallback ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsend Request With HTTP ( request Ġ: ĠRequest Data , Ġcallback Ġ: Ġ( Int , ĠResponse Data , ĠException ?) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġproto Request Ġ= ĠProto Request ( request , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠResponse . Listener Ġ{ Ġresponse Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . fine (" Got Ġdata Ġ$ response ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback ( request . request Header . id , Ġresponse , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ ĠResponse . Error Listener Ġ{ Ġerror Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback ( request . request Header . id , ĠResponse Data . getDefaultInstance (), Ġerror ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġrequest Queue . add ( proto Request ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠProto Request ĊĠĠĠ Ġ( val Ġrequest Data Ġ: ĠRequest Data , ĊĠĠĠĠ Ġvar Ġm Listener : ĠResponse . Listener < ResponseData > ?, ĊĠĠĠ Ġerror Listener : ĠResponse . Error Listener ? Ċ ) Ġ: ĠRequest < ResponseData >( Request . Method . POST , ĠURL , Ġerror Listener ) Ġ{ ĊĊĊĠĠĠ Ġoverride Ġfun Ġget Headers (): ĠMutable Map < String , ĠString > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġheaders Ġ= ĠHashMap < String , ĠString >() ĊĠĠĠĠĠĠĠ Ġheaders [" Content - Type "] Ġ= Ġ" application / octet - stream " ĊĠĠĠĠĠĠĠ Ġreturn Ġheaders ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Body (): ĠByteArray Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġrequest Data . toByteArray () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġm Lock Ġ= ĠAny () ĊĊĠĠĠ Ġoverride Ġfun Ġdeliver Response ( response : ĠResponse Data ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġlistener : ĠResponse . Listener < ResponseData >? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġsynchronized ( m Lock ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlistener Ġ= Ġm Listener ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( listener Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlistener !!. on Response ( response ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcancel () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . cancel () ĊĠĠĠĠĠĠĠ Ġsynchronized ( m Lock ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Listener Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġparse Network Response ( response : ĠNetwork Response ): ĠResponse < ResponseData > Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( response . statusCode Ġ== Ġ 2 0 0 ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġresponse Data Ġ= ĠResponse Data . parseFrom ( response . data ) ĊĠĠĠĠĠĠĠ Ġreturn ĠResponse . success ( response Data , ĠHttp Header Parser . parse Cache Headers ( response )) ĊĠĠĠ Ġ} Ċ }