package Ġcom . b anno . g ord on Ċ Ċ import Ġarrow . fx . IO Ċ import Ġarrow . fx . extensions . fx Ċ import Ġkotlinx . coroutines . Coroutine Dispatcher Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġkotlinx . coroutines . Coroutine Start Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . async Ċ import Ġkotlinx . coroutines . await All Ċ import Ġkotlinx . coroutines . run Blocking Ċ import Ġkotlinx . coroutines . with Timeout OrNull Ċ import Ġorg . gradle . api . logging . Logger Ċ import Ġse . vid st ige . j adb . J adb Connection Ċ import Ġse . vid st ige . j adb . J adb Device Ċ import Ġse . vid st ige . j adb . Remote File Ċ import Ġse . vid st ige . j adb . managers . Package Ċ import Ġse . vid st ige . j adb . managers . PackageManager Ċ import Ġjava . io . File Ċ Ċ internal Ġfun ĠJ adb Connection . getAll Devices (): ĠIO < List < J adb Device >> Ġ= ĠIO Ġ{ ĊĠĠĠ Ġdevices . toList () Ċ } Ċ Ċ internal Ġfun ĠJ adb Device . execute Shell WithTimeout ( ĊĠĠĠ Ġtimeout Millis : ĠLong , ĊĠĠĠ Ġcommand : ĠString , ĊĠĠĠ Ġvar arg Ġargs : ĠString Ċ ): ĠIO < String ?> Ġ= ĠIO Ġ{ ĊĠĠĠ Ġval Ġdeferred Ġ= ĠCor outine Scope ( Dispatch ers . IO ). async Ġ{ ĊĠĠĠĠĠĠĠ Ġexecute Shell ( command , Ġ* args ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. use Ġ{ Ġit . reader (). use Ġ{ Ġreader Ġ-> Ġreader . read Text () Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. trim () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġwith Timeout OrNull ( timeout Millis ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdeferred . await () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ internal Ġfun ĠJ adb Device . is Tablet (): ĠIO < Boolean > Ġ= ĊĠĠĠ Ġexecute Shell WithTimeout ( 2 0 _ 0 0 0 , Ġ" get prop ", Ġ" ro . build . character istics "). map Ġ{ Ġit !!. contains (" tablet ") Ġ} Ċ Ċ internal Ġfun ĠJ adb Device . install A pk ( apk : ĠFile , Ġvar arg Ġoptions : ĠString ) Ġ= ĠIO . fx Ġ{ ĊĠĠĠ Ġval Ġremote File Ġ= ĠRemote File ("/ data / local / tmp /" Ġ+ Ġapk . name ) ĊĊĠĠĠ Ġpush ( apk , Ġremote File ) ĊĊĠĠĠ Ġval Ġresult Ġ= Ġexecute Shell WithTimeout ( 1 2 0 _ 0 0 0 , Ġ" pm ", Ġ" install ", Ġ* options , Ġremote File . path ). bind () ĊĊĠĠĠ ĠPackage Manager ( this @ install A pk ). remove ( remote File ) ĊĊĠĠĠ Ġif Ġ( result Ġ== Ġnull Ġ|| Ġ! result . contains (" Success ")) Ġ{ ĊĠĠĠĠĠĠĠ Ġraise Error < Unit >( IllegalStateException (" Failed Ġto Ġinstall Ġ${ apk . name } Ġon Ġ$ serial \ n $ result ")). bind () ĊĠĠĠ Ġ} Ċ } Ċ Ċ internal Ġfun ĠPackage Manager . safe Un install ( packageName : ĠString ) Ġ= Ġtry Ġ{ ĊĠĠĠ Ġuninstall ( Package ( packageName )) Ċ } Ġcatch Ġ( t : ĠThrowable ) Ġ{ Ċ } Ċ Ċ internal Ġfun ĠList < J adb Device >. uninstall ( ĊĠĠĠ Ġdispatcher : ĠCor outine Dispatcher , ĊĠĠĠ Ġapplication Package : ĠString , ĊĠĠĠ Ġinstrument ation Package : ĠString Ċ ) Ġ= ĠIO Ġ{ ĊĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġmap Ġ{ Ġdevice Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġasync ( context Ġ= Ġdispatcher , Ġstart Ġ= ĠCor outine Start . LA ZY ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPackage Manager ( device ). run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsafe Un install ( application Package ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( instrumentation Package Ġ!= Ġapplication Package ) Ġsafe Un install ( instrumentation Package ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. await All () ĊĠĠĠ Ġ} Ċ } Ċ Ċ internal Ġfun ĠList < J adb Device >. re install ( ĊĠĠĠ Ġdispatcher : ĠCor outine Dispatcher , ĊĠĠĠ Ġlogger : ĠLogger , ĊĠĠĠ Ġapplication Package : ĠString , ĊĠĠĠ Ġinstrument ation Package : ĠString , ĊĠĠĠ Ġapplication A pk : ĠFile , ĊĠĠĠ Ġinstrument ation A pk : ĠFile Ċ ) Ġ= ĠIO Ġ{ ĊĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġmap Ġ{ Ġdevice Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġasync ( context Ġ= Ġdispatcher , Ġstart Ġ= ĠCor outine Start . LA ZY ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpackage Manager Ġ= ĠPackage Manager ( device ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . lifecycle ("${ device . serial }: Ġinstalling Ġ$ application Package ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpackage Manager . safe Un install ( application Package ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdevice . install A pk ( application A pk , Ġ"- d ", Ġ"- r "). unsafe Run Sync () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( instrumentation A pk Ġ!= Ġapplication A pk ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . lifecycle ("${ device . serial }: Ġinstalling Ġ$ instrumentation Package ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpackage Manager . safe Un install ( instrumentation Package ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdevice . install A pk ( instrumentation A pk , Ġ"- d ", Ġ"- r ", Ġ"- t "). unsafe Run Sync () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. await All () ĊĠĠĠ Ġ} Ċ } Ċ