/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 2 0 ĠThe ĠAndroid ĠOpen ĠSource ĠProject Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġcom . android . build . gradle . internal . testing . ut p Ċ Ċ import Ġcom . google . common . annotations . Visible ForTesting Ċ import Ġorg . apache . commons . io . FileUtils Ċ import Ġjava . io . File Ċ import Ġjava . io . IOException Ċ import Ġjava . nio . charset . StandardCharsets Ċ import Ġjava . nio . file . Files Ċ import Ġjava . nio . file . Invalid Path Exception Ċ import Ġjava . nio . file . Path Ċ import Ġjava . nio . file . Paths Ċ import Ġjava . util . Locale Ċ import Ġjava . util . logging . Logger Ċ import Ġjava . util . regex . Pattern Ċ import Ġkotlin . streams . as Sequence Ċ Ċ // ĠEm ulator ĠgRPC Ġport Ċ @ Visible ForTesting Ċ const Ġval ĠDEFAULT _ EM UL ATOR _ GRPC _ PORT Ġ= Ġ 8 5 5 4 Ċ Ċ private Ġval ĠLOG Ġ= ĠLogger . getLogger (" Ice box Config Utils ") Ċ Ċ /** Ċ Ġ* ĠReturns Ġthe ĠEm ulator Ġregistration Ġdirectory . Ċ Ġ*/ Ċ private Ġfun Ġcompute Registration Directory Container (): ĠPath ? Ġ{ ĊĠĠĠ Ġval Ġos Ġ= ĠSystem . getProperty (" os . name "). toLowerCase ( Locale . ROOT ) ĊĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠ Ġos . startsWith (" mac ") Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠPaths . get ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . getenv (" HOME ") Ġ?: Ġ"/", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Library ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Caches ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Temporary Items " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġos . startsWith (" win ") Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠPaths . get ( System . getenv (" LOCAL APP DATA ") Ġ?: Ġ"/", Ġ" Temp ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ Ġ// ĠLinux Ġand ĠChrome ĠOS . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( dir str Ġin ĠarrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . getenv (" X DG _ RUNTIME _ DIR "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"/ run / user /${ get Uid () }", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . getenv (" ANDROID _ EM UL ATOR _ HOME "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . getenv (" ANDROID _ PRE FS _ ROOT "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . getenv (" ANDROID _ SDK _ HOME "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( System . getenv (" HOME ") Ġ?: Ġ"/") Ġ+ Ġ". android ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFor Ġintegration Ġtests , Ġwe Ġuse Ġjava Ġproperty . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . getProperty (" android . emulator . home ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ)) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( dir str Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdir Ġ= ĠPaths . get ( dir str ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Files . isDirectory ( dir )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġdir ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( exception : ĠInvalid Path Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . fin er (" Failed Ġto Ġparse Ġdir Ġ${ dir str }, Ġexception Ġ${ exception }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠPaths . get ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFileUtils . get Temp Directory (). absolute Path , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" android -" Ġ+ ĠSystem . getProperty (" USER ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun Ġget Uid (): ĠString ? Ġ{ ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠuserName Ġ= ĠSystem . getProperty (" user . name ") ĊĠĠĠĠĠĠĠ Ġval Ġcommand Ġ= Ġ" id Ġ- u Ġ$ userName " ĊĠĠĠĠĠĠĠ Ġval Ġprocess Ġ= ĠRuntime . get Runtime (). exec ( command ) ĊĠĠĠĠĠĠĠ Ġprocess . inputStream . use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠString ( it . read Bytes (), ĠStandard Charsets . UTF _ 8 ). trim () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} Ċ } Ċ Ċ data Ġclass ĠEm ulator Grpc Info ( val Ġport : ĠInt , Ġval Ġtoken : ĠString ?) Ċ Ċ fun Ġfind Grpc Info ( device Serial : ĠString , Ġfile : ĠPath ): ĠEm ulator Grpc Info ? Ġ{ ĊĠĠĠ Ġvar Ġcurrent Grpc Port Ġ= ĠDEFAULT _ EM UL ATOR _ GRPC _ PORT ĊĠĠĠ Ġvar Ġcurrent Grpc Token : ĠString ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġmatched Av d Ġ= Ġfalse ĊĠĠĠ ĠFiles . read All Lines ( file ). forEach Ġ{ Ġline Ġ-> ĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġline . startsWith (" grpc . port =") Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Grpc Port Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInteger . parseInt ( line . substring (" grpc . port =". length ), Ġ 1 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġline . startsWith (" grpc . token =") Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Grpc Token Ġ= Ġline . substring (" grpc . token =". length ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġline . startsWith (" port . serial =") Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġserial Ġ= Ġline . substring (" port . serial =". length ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmatched Av d Ġ= Ġ(" emulator -" Ġ+ Ġserial Ġ== Ġdevice Serial ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( matched Av d ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠEm ulator Grpc Info ( current Grpc Port , Ġcurrent Grpc Token ) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} Ċ } ĊĊ Ċ fun Ġfind Grpc Info ( device Serial : ĠString ): ĠEm ulator Grpc Info Ġ{ ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠfileName Pattern Ġ= ĠPattern . compile (" pid _ \\ d +. ini ") ĊĠĠĠĠĠĠĠ Ġval Ġdirectory Ġ= Ġcompute Registration Directory Container ()?. resolve (" av d / running ") ĊĠĠĠĠĠĠĠ Ġreturn ĠFiles . list ( directory ). as Sequence (). map Ġ{ Ġfile Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( fileName Pattern . matcher ( file . fileName . toString ()). matches ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfind Grpc Info ( device Serial , Ġfile ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. filter NotNull (). first OrNull () Ġ?: ĠEm ulator Grpc Info ( DEFAULT _ EM UL ATOR _ GRPC _ PORT , Ġnull ) ĊĠĠĠ Ġ} Ġcatch Ġ( exception : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠ ĠLOG . fine ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Failed Ġto Ġparse Ġemulator ĠgRPC Ġport , Ġfallback Ġto Ġdefault ," ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ" Ġexception Ġ${ exception }" ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġreturn ĠEm ulator Grpc Info ( DEFAULT _ EM UL ATOR _ GRPC _ PORT , Ġnull ) ĊĠĠĠ Ġ} Ċ } Ċ