/* Ċ Ġ* Ġ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 . Ċ Ġ*/ Ċ @ file : Jvm Name (" Gradle Build Output Util ") Ċ Ċ package Ġcom . android . tools . idea . gradle . util Ċ Ċ import Ġcom . android . annotations . concurrency . Ui Thread Ċ import Ġcom . android . ide . common . build . Generic Built Artifacts Ċ import Ġcom . android . ide . common . build . Generic Built Artifacts Loader . load FromFile Ċ import Ġcom . android . tools . idea . Android Startup Activity Ċ import Ġcom . android . tools . idea . gradle . model . Ide Build Tasks And Output Information Ċ import Ġcom . android . tools . idea . gradle . model . Ide Variant Build Information Ċ import Ġcom . android . tools . idea . gradle . project . build . BuildContext Ċ import Ġcom . android . tools . idea . gradle . project . build . Build Status Ċ import Ġcom . android . tools . idea . gradle . project . build . Gradle Build Listener Ċ import Ġcom . android . tools . idea . gradle . project . build . Gradle Build State Ċ import Ġcom . android . tools . idea . gradle . project . model . Android Module Model Ċ import Ġcom . android . tools . idea . gradle . util . Dynamic App Utils . use Select A pk s From Bundle Builder Ċ import Ġcom . android . tools . idea . log . Log Wrapper Ċ import Ġcom . android . tools . idea . run . Android Run Configuration Base Ċ import Ġcom . google . common . annotations . Visible ForTesting Ċ import Ġcom . intellij . openapi . Disposable Ċ import Ġcom . intellij . openapi . diagnostic . Logger Ċ import Ġcom . intellij . openapi . external System . model . task . External System TaskId Ċ import Ġcom . intellij . openapi . external System . model . task . External System Task Notification Listener Adapter Ċ import Ġcom . intellij . openapi . module . Module Ċ import Ġcom . intellij . openapi . project . Project Ċ import Ġorg . jetbrains . annotations . Test Only Ċ import Ġjava . io . File Ċ Ċ /** Ċ Ġ* ĠUtility Ġmethods Ġto Ġfind ĠA PK / Bundle Ġoutput Ġfile Ġor Ġfolder . Ċ Ġ*/ Ċ Ċ private Ġval ĠLOG : ĠLogger Ġget () Ġ= ĠLogger . getInstance (" Gradle Build Output Util . kt ") Ċ Ċ enum Ġclass ĠOutput Type Ġ{ ĊĠ ĠA pk , ĊĠ ĠA pk From Bundle , ĊĠ ĠBundle Ċ } Ċ Ċ /** Ċ Ġ* ĠRetrieve Ġthe Ġlocation Ġof Ġgenerated ĠA PK Ġor ĠBundle Ġfor Ġthe Ġgiven Ġrun Ġconfiguration . Ċ Ġ* Ċ Ġ* ĠThis Ġmethod Ġfinds Ġthe Ġlocation Ġfrom Ġbuild Ġoutput Ġlisting Ġfile Ġif Ġit Ġis Ġsupported , Ġfalls Ġback Ġto Ċ Ġ* ĠArtifact Output Ġmodel Ġotherwise . Ċ Ġ* Ċ Ġ* ĠIf Ġthe Ġgenerated Ġfile Ġis Ġa Ġbundle Ġfile , Ġthis Ġmethod Ġreturns Ġthe Ġlocation Ġof Ġbundle . Ċ Ġ* ĠIf Ġthe Ġgenerated Ġfile Ġis Ġa Ġsingle ĠA PK , Ġthis Ġmethod Ġreturns Ġthe Ġlocation Ġof Ġthe Ġapk . Ċ Ġ* ĠIf Ġthe Ġgenerated Ġfiles Ġare Ġmultiple ĠA PK s , Ġthis Ġmethod Ġreturns Ġthe Ġfolder Ġthat Ġcontains Ġthe ĠA PK s . Ċ Ġ*/ Ċ fun Ġget A pk For Run Configuration ( module : ĠModule , Ġconfiguration : ĠAndroid Run Configuration Base , Ġis Test : ĠBoolean ): ĠFile ? Ġ{ ĊĠ Ġval Ġandroid Model Ġ= ĠAndroid Module Model . get ( module ) Ġ?: Ġreturn Ġnull ĊĠ Ġval Ġselected Variant Ġ= Ġandroid Model . selected Variant ĊĠ Ġval Ġartifact Ġ= ĊĠĠĠ Ġif Ġ( is Test ) Ġselected Variant . android Test Artifact Ġ?: Ġreturn Ġnull ĊĠĠĠ Ġelse Ġselected Variant . main Artifact ĊĊĠ Ġreturn Ġif Ġ( android Model . features . is Build OutputFile Supported ) ĊĠĠĠ Ġartifact . build Information . getOutput File Or Folder From Listing File ( getOutput Type ( module , Ġconfiguration )) ĊĠ Ġelse Ġartifact . outputs . first OrNull ()?. outputFile Ċ } Ċ Ċ /** Ċ Ġ* ĠRetrieve Ġthe Ġlocation Ġof Ġgenerated ĠA PK Ġor ĠBundle Ġfor Ġthe Ġgiven Ġvariant . Ċ Ġ* Ċ Ġ* ĠThis Ġmethod Ġreturns Ġnull Ġif Ġbuild Ġoutput Ġlisting Ġfile Ġis Ġnot Ġsupported . Ċ Ġ* Ċ Ġ* ĠIf Ġthe Ġgenerated Ġfile Ġis Ġa Ġbundle Ġfile , Ġthis Ġmethod Ġreturns Ġthe Ġlocation Ġof Ġbundle . Ċ Ġ* ĠIf Ġthe Ġgenerated Ġfile Ġis Ġa Ġsingle ĠA PK , Ġthis Ġmethod Ġreturns Ġthe Ġlocation Ġof Ġthe Ġapk . Ċ Ġ* ĠIf Ġthe Ġgenerated Ġfiles Ġare Ġmultiple ĠA PK s , Ġthis Ġmethod Ġreturns Ġthe Ġfolder Ġthat Ġcontains Ġthe ĠA PK s . Ċ Ġ*/ Ċ fun Ġget OutputFile Or Folder From Listing File By Variant Name Or From Selected Variant Test Artifact ( ĊĠ Ġandroid Model : ĠAndroid Module Model , ĊĠ Ġvariant Name : ĠString , ĊĠ Ġoutput Type : ĠOutput Type , ĊĠ Ġis Test : ĠBoolean Ċ ): ĠFile ? Ġ{ ĊĠ Ġval Ġoutput Information Ġ= ĊĠĠĠ Ġif Ġ( is Test ) Ġandroid Model . selected Variant . android Test Artifact ?. build Information ĊĠĠĠ Ġelse Ġandroid Model . android Project . variants Build Information . variant Output Information ( variant Name ) ĊĠ Ġreturn Ġoutput Information ?. getOutput File Or Folder From Listing File ( output Type ) Ċ } Ċ Ċ fun ĠIde Build Tasks And Output Information . getOutput File Or Folder From Listing File ( ĊĠ Ġoutput Type : ĠOutput Type Ċ ): ĠFile ? Ġ{ ĊĠ Ġval Ġlisting File Ġ= Ġget Output Listing File ( output Type ) ĊĠ Ġif Ġ( listing File Ġ!= Ġnull ) Ġ{ ĊĠĠĠ Ġreturn Ġget OutputFile Or Folder From Listing File ( listing File ) ĊĠ Ġ} ĊĠ ĠLOG . warn (" Could Ġnot Ġfind Ġoutput Ġlisting Ġfile . ĠBuild Ġmay Ġhave Ġfailed .") ĊĠ Ġreturn Ġnull Ċ } Ċ Ċ @ Visible ForTesting Ċ fun Ġget OutputFile Or Folder From Listing File ( listing File : ĠString ): ĠFile ? Ġ{ ĊĠ Ġval Ġbuilt Artifacts Ġ= Ġload FromFile ( File ( listing File ), ĠLog Wrapper ( LOG )) ĊĠ Ġif Ġ( built Artifacts Ġ!= Ġnull ) Ġ{ ĊĠĠĠ Ġval Ġartifacts Ġ= Ġbuilt Artifacts . elements ĊĠĠĠ Ġif Ġ(! artifacts . isEmpty ()) Ġ{ ĊĠĠĠĠĠ Ġval Ġoutput Ġ= ĠFile ( artifacts . iterator (). next (). outputFile ) ĊĠĠĠĠĠ Ġreturn Ġif Ġ( artifacts . size Ġ> Ġ 1 ) Ġoutput . parent File Ġelse Ġoutput ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĠ ĠLOG . warn (" Failed Ġto Ġread ĠJson Ġoutput Ġfile Ġfrom Ġ${ listing File }. ĠBuild Ġmay Ġhave Ġfailed .") ĊĠ Ġreturn Ġnull Ċ } Ċ Ċ private Ġfun Ġget OutputType ( module : ĠModule , Ġconfiguration : ĠAndroid Run Configuration Base ): ĠOutput Type Ġ{ ĊĠ Ġreturn Ġif Ġ( use Select A pk s From Bundle Builder ( module , Ġconfiguration , Ġnull )) Ġ{ ĊĠĠĠ ĠOutput Type . A pk From Bundle ĊĠ Ġ} ĊĠ Ġelse Ġ{ ĊĠĠĠ ĠOutput Type . A pk ĊĠ Ġ} Ċ } Ċ Ċ private Ġfun ĠCollection < Ide Variant Build Information >. variant Output Information ( variant Name : ĠString ): ĠIde Build Tasks And Output Information ? Ġ{ ĊĠ Ġreturn Ġfirst OrNull Ġ{ Ġit . variant Name Ġ== Ġvariant Name Ġ} ?. build Information Ċ } Ċ Ċ fun ĠIde Build Tasks And Output Information . getOutput Listing File ( output Type : ĠOutput Type ): ĠString ? Ġ{ ĊĠ Ġreturn Ġwhen Ġ( output Type ) Ġ{ ĊĠĠĠ ĠOutput Type . A pk Ġ-> Ġassemble Task Output Listing File ĊĠĠĠ ĠOutput Type . A pk From Bundle Ġ-> Ġapk From Bundle Task Output Listing File ĊĠĠĠ Ġelse Ġ-> Ġbundle Task Output Listing File ĊĠ Ġ} Ċ } Ċ Ċ fun Ġget Generic Built Artifact ( android Model : ĠAndroid Module Model , Ġvariant Name : ĠString ): ĠGeneric Built Artifacts ? Ġ{ ĊĠ Ġval Ġvariant Build Information Ġ= Ġandroid Model . android Project . variants Build Information . variant Output Information ( variant Name ) Ġ?: Ġreturn Ġnull ĊĠ Ġval Ġlisting File Ġ= Ġvariant Build Information . getOutput Listing File ( OutputType . A pk ) Ġ?: Ġreturn Ġnull ĊĠ Ġval Ġbuilt Artifacts Ġ= Ġload FromFile ( File ( listing File ), ĠLog Wrapper ( LOG )) ĊĠ Ġif Ġ( built Artifacts Ġ!= Ġnull ) Ġ{ ĊĠĠĠ Ġreturn Ġbuilt Artifacts ĊĠ Ġ} ĊĊĠ ĠLOG . warn (" Failed Ġto Ġread ĠJson Ġoutput Ġfile Ġfrom Ġ${ listing File }. ĠBuild Ġmay Ġhave Ġfailed .") ĊĠ Ġreturn Ġnull Ċ } Ċ Ċ class ĠLast Build Or Sync Service Ġ{ ĊĠ Ġ// ĠDo Ġnot Ġset Ġoutside Ġof Ġtests Ġor Ġthis Ġclass !! ĊĠ Ġ@ Volatile ĊĠ Ġvar Ġlast Build Or Sync TimeStamp Ġ= Ġ- 1 L ĊĠĠĠ Ġ@ Visible ForTesting Ġset Ċ } Ċ Ċ internal Ġclass ĠLast Build Or Sync Listener Ġ: ĠExternal System Task Notification Listener Adapter () Ġ{ ĊĠ Ġoverride Ġfun Ġon End ( id : ĠExternal System TaskId ) Ġ{ ĊĠĠĠ Ġid . find Project ()?. also Ġ{ Ġproject Ġ-> ĊĠĠĠĠĠ Ġproject . getService ( Last Build Or Sync Service :: class . java ). last Build Or Sync TimeStamp Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠThis Ġshould Ġnot Ġreally Ġbe Ġused , Ġbut Ġwe Ġcurrently Ġdo Ġnot Ġuse Ġthe Ġint ellij Ġbuild Ġinfra Ġand Ġtherefore Ġdo Ġnot Ġget Ċ Ġ* Ġevents Ġfor Ġbuild . ĠIf Ġwe Ġmove Ġto Ġusing Ġthis Ġand Ġthe Ġevents Ġfrom Ġrunning Ġtasks Ġtrigger Ġthe ĠGeneric Built Artifacts Cache Clean er Ġthen Ċ Ġ* Ġthis Ġshould Ġbe Ġremoved . Ċ Ġ*/ Ċ internal Ġclass ĠLast Build Or Sync Startup Activity Ġ: ĠAndroid Startup Activity Ġ{ ĊĠ Ġ@ Ui Thread ĊĠ Ġoverride Ġfun Ġrun Activity ( project : ĠProject , Ġdis posable : ĠDis posable ) Ġ{ ĊĠĠĠ ĠGradle Build State . subscribe ( project , Ġobject Ġ: ĠGradle Build Listener . Adapter () Ġ{ ĊĠĠĠĠĠ Ġoverride Ġfun Ġbuild Finished ( status : ĠBuild Status , Ġcontext : ĠBuild Context ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( context Ġ== Ġnull ) Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġservice Ġ= Ġcontext . project . getService ( Last Build Or Sync Service :: class . java ) ĊĠĠĠĠĠĠĠ Ġservice . last Build Or Sync TimeStamp Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}) ĊĊĠĠĠ Ġval Ġservice Ġ= Ġproject . getService ( Last Build Or Sync Service :: class . java ) ĊĠĠĠ Ġservice . last Build Or Sync TimeStamp Ġ= ĠSystem . currentTimeMillis () ĊĠ Ġ} Ċ } Ċ Ċ @ Test Only Ċ fun Ġem ulate Startup Activity For Test ( project : ĠProject ) Ġ= ĠAndroid Startup Activity . START UP _ ACTIVITY . find Extension ( ĊĠ ĠLast Build Or Sync Startup Activity :: class . java )?. run Activity ( project , Ġproject ) Ċ Ċ data Ġclass ĠGeneric Built Artifact sWith Timestamp ( val Ġgeneric Built Artifacts : ĠGeneric Built Artifacts ?, Ġval Ġtime Stamp : ĠLong ) Ċ