package Ġincl u dex . com . dio . service Ċ Ċ import Ġandroid . content . Intent Ċ import Ġandroid . os . IB inder Ċ import Ġandroid . util . Log Ċ import Ġincl u dex . com . dio . consts . Consts Ċ import Ġjava . io . Data InputStream Ċ import Ġjava . io . IOException Ċ import Ġjava . net . Inet SocketAddress Ċ import Ġjava . net . Socket Ċ Ċ class ĠA db Bridge Service Ġ: ĠBase Service () Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠSOCKET _ TIMEOUT Ġ= Ġ 3 0 0 0 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠLOOP BACK _ IP _ ADDRESS Ġ= Ġ" 1 2 7 . 0 . 0 . 1 " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠLOOP BACK _ PORT Ġ= Ġ 8 0 8 0 ĊĊĠĠĠĠĠĠĠ Ġconst Ġval ĠREL AY _ PORT Ġ= Ġ 7 0 7 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġa db Socket : ĠSocket ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġrelay Socket : ĠSocket ĊĊĠĠĠ Ġoverride Ġfun ĠonStart Command ( intent : ĠIntent ?, Ġflags : ĠInt , Ġstart Id : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ ĠA db Socket Thread (). start () ĊĠĠĠĠĠĠĠ ĠRelay Socket Thread (). start () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġsuper . onStart Command ( intent , Ġflags , Ġstart Id ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Bind ( intent : ĠIntent ?): ĠI Binder Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinner Ġclass ĠA db Socket Thread Ġ: ĠThread () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġrun () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġa db Socket Ġ= ĠSocket () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbytes Ġ= ĠByteArray ( 1 0 2 4 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġa db Address Ġ= ĠInet SocketAddress ( LOOP BACK _ IP _ ADDRESS , ĠLOOP BACK _ PORT ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġa db Socket . connect ( adb Address , ĠSOCKET _ TIMEOUT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e (" suc ", Ġ" connect ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinput Ġ= ĠData InputStream ( adb Socket . getInputStream ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcount Ġ= Ġinput . read ( bytes ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( count Ġ<= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e (" suc ", Ġ" send ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrelay Socket . get OutputStream (). write ( bytes , Ġ 0 , Ġcount ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e (" error Ġa db ", Ġe . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrelay Socket ?. close () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġa db Socket . close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinner Ġclass ĠRelay Socket Thread Ġ: ĠThread () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġrun () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrelay Socket Ġ= ĠSocket () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbytes Ġ= ĠByteArray ( 1 0 2 4 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrelay Address Ġ= ĠInet SocketAddress ( Consts . RE LAY _ IP , ĠConst s . RE LAY _ PORT ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrelay Socket . connect ( relay Address ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e (" relay Ġsuc ", Ġ" connect ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinput Ġ= ĠData InputStream ( relay Socket . getInputStream ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcount Ġ= Ġinput . read ( bytes ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( count Ġ<= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e (" relay Ġsuc ", Ġ" send ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġa db Socket . get OutputStream (). write ( bytes , Ġ 0 , Ġcount ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e (" relay Ġerror Ġserver ", Ġe . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrelay Socket ?. close () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġa db Socket . close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }