package Ġcom . d eng z ii . plugin . adb . utils Ċ Ċ import Ġcom . d eng z ii . plugin . adb . X Log Ċ import Ġjava . io . BufferedReader Ċ import Ġjava . io . IOException Ċ import Ġjava . io . InputStream Reader Ċ import Ġjava . util . concurrent . Executors Ċ Ċ /** Ċ Ġ* Ġ< pre > Ċ Ġ* Ġauthor Ġ: Ġd eng zi Ċ Ġ* Ġe - mail Ġ: Ġd eng z ii @ fox mail . com Ċ Ġ* Ġgithub Ġ: Ġhttps :// github . com / d eng z ii Ċ Ġ* Ġtime ĠĠ Ġ: Ġ 2 0 1 9 / 1 0 / 4 Ċ Ġ* Ġdesc ĠĠ Ġ: ĠUtils Ġabout Ġsystem Ġcommand Ġexecutes . Ċ Ġ* Ġ</ pre > Ċ Ġ*/ Ċ object ĠCmd Utils Ġ{ ĊĊĠĠĠ Ġprivate Ġval ĠCMD _ EXECUT OR Ġby Ġlazy Ġ{ ĠExec utors . new Fixed ThreadPool ( 4 ) Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠExecute Ġthe Ġsystem Ġcommand Ġin Ġother Ġthread . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġcmd ĠThe Ġsystem Ġcommand . ĊĠĠĠĠ Ġ* Ġ@ param Ġcallback ĠThe Ġresult Ġlistener . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġexec ( cmd : ĠString , Ġcallback : Ġ(( Cmd Result ) Ġ-> ĠUnit )? ) Ġ{ ĊĠĠĠĠĠĠĠ ĠX Log . d ( cmd ) ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprocess Ġ= ĠRuntime . get Runtime (). exec ( cmd ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCMD _ EXECUT OR . submit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback ?. invoke ( resolve ( process )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠX Log . e ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcallback ?. invoke ( Cmd Result . of ( e )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠExecute Ġthe Ġsystem Ġcommand Ġin Ġthe Ġcurrent Ġthread . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġcmd ĠThe Ġsystem Ġcommand . ĊĠĠĠĠ Ġ* Ġ@ return ĠThe Ġresult . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġexec Sync ( cmd : ĠString ): ĠCmd Result Ġ{ ĊĠĠĠĠĠĠĠ ĠX Log . d ( cmd ) ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprocess Ġ= ĠRuntime . get Runtime (). exec ( cmd ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġerror Ġ= Ġresolve Error ( process )?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocess . destroy () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror Ġ?: Ġresolve ( process ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠX Log . e ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCmd Result . of ( e ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠHandle Ġresult Ġfrom Ġthe Ġprocess ĠInputStream . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġprocess ĠThe Ġcommand Ġprocess Ġneed Ġto Ġresolve . ĊĠĠĠĠ Ġ* Ġ@ return ĠThe Ġerror Ġresult , Ġnull Ġif Ġno Ġerror . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġresolve ( process : ĠProcess ): ĠCmd Result Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠCmd Result () ĊĠĠĠĠĠĠĠ Ġval Ġinput Ġ= Ġprocess . inputStream ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbf Ġ= ĠBufferedReader ( InputStream Reader ( input )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠStringBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbf . lines (). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠX Log . d ( ">$ it ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append ("$ it \ n ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . success Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . output Ġ= Ġbuilder . toString () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠX Log . e ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . output Ġ= Ġe . message Ġ?: Ġe . localized Message ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput . close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠX Log . e ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . output Ġ= Ġe . message Ġ?: Ġe . localized Message ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġresult . exit Code Ġ= Ġprocess . waitFor () ĊĠĠĠĠĠĠĠ Ġprocess . destroy () ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠHandle Ġerror Ġresult Ġfrom Ġthe Ġprocess ĠInputStream . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġprocess ĠThe Ġcommand Ġprocess Ġneed Ġto Ġresolve . ĊĠĠĠĠ Ġ* Ġ@ return ĠThe Ġerror Ġresult , Ġnull Ġif Ġno Ġerror . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġresolve Error ( process : ĠProcess ): ĠCmd Result ? Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval ĠinputStream Ġ= Ġprocess . error Stream ĊĠĠĠĠĠĠĠ Ġvar Ġerror Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbf Ġ= ĠBufferedReader ( InputStream Reader ( inputStream )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠStringBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbf . lines (). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠX Log . e ( ">$ it ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append ("$ it \ n ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġif Ġerror Ġstring Ġis Ġblank Ġmeans Ġthere Ġis Ġno Ġerror . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( builder . toString (). isBlank ()) Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠCmd Result ( process . waitFor (), Ġbuilder . toString ()) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠX Log . e ( e ) ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( error ) ĠinputStream . close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠX Log . e ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRepresents Ġthe Ġresult Ġof Ġa Ġcommand Ġexecution . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġclass ĠCmd Result ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġexit Code : ĠInt Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġoutput : ĠString Ġ= Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġsuccess : ĠBoolean Ġ= Ġexit Code Ġ== Ġ 0 ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġof ( e : ĠException ) Ġ= ĠCmd Result (- 1 , Ġe . message Ġ?: Ġ" No Ġmessage .", Ġfalse ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ