/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 1 7 Ġ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 . ide Ċ Ċ import Ġcom . android . build . api . artifact . Artifact Type Ċ import Ġcom . android . build . Filter Data Ċ import Ġcom . android . build . OutputFile Ċ import Ġcom . android . build . Variant Output Ċ import Ġcom . android . build . gradle . internal . api . artifact . to Artifact Type Ċ import Ġcom . android . build . gradle . internal . scope . Anchor OutputType Ċ import Ġcom . android . build . gradle . internal . scope . A pk Data Ċ import Ġcom . android . build . gradle . internal . scope . Build Output Ċ import Ġcom . android . build . gradle . internal . scope . Existing Build Elements Ċ import Ġcom . android . build . gradle . internal . scope . Internal Artifact Type Ċ import Ġcom . google . common . collect . ImmutableList Ċ import Ġcom . google . gson . Gson Builder Ċ import Ġcom . google . gson . Type Adapter Ċ import Ġcom . google . gson . reflect . Type Token Ċ import Ġcom . google . gson . stream . Json Reader Ċ import Ġcom . google . gson . stream . Json Writer Ċ import Ġjava . io . File Ċ import Ġjava . io . FileReader Ċ import Ġjava . io . IOException Ċ import Ġjava . io . Reader Ċ Ċ /** Ċ Ġ* ĠTemporary Ġclass Ġto Ġload Ġenough Ġmetadata Ġto Ġpopulate Ġearly Ġmodel . Ġshould Ġbe Ġdeleted Ġonce Ċ Ġ* ĠIDE Ġonly Ġrelies Ġon Ġminimal istic Ġafter Ġbuild Ġmodel . Ċ Ġ*/ Ċ data Ġclass ĠEarly Sync Build Output ( ĊĠĠĠĠĠĠĠ Ġval Ġtype : ĠArtifact Type <* >, ĊĠĠĠĠĠĠĠ Ġval Ġapk Type : ĠVariant Output . OutputType , ĊĠĠĠĠĠĠĠ Ġval Ġfilters Data : ĠCollection < Filter Data >, ĊĠĠĠĠĠĠĠ Ġval Ġversion : ĠInt , ĊĠĠĠĠĠĠĠ Ġval Ġoutput : ĠFile ) Ġ: Ġjava . io . Serializable , ĠOutput File Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġget OutputFile (): ĠFile Ġ= Ġoutput ĊĠĠĠ Ġoverride Ġfun Ġget OutputType (): ĠString Ġ= Ġapk Type . name ĊĊĠĠĠ Ġoverride Ġfun Ġget Filter Types (): ĠCollection < String > Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfilters Data . as Sequence () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . filter Type Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toList () ĊĊĠĠĠ Ġoverride Ġfun Ġget Filters (): ĠCollection < Filter Data > Ġ= Ġfilters Data ĊĠĠĠ Ġoverride Ġfun Ġget Main OutputFile (): ĠOutput File Ġ= Ġthis ĊĠĠĠ Ġ@ Suppress (" Over riding Deprecated Member ") ĊĠĠĠ Ġoverride Ġfun Ġget Outputs (): ĠMutable Collection < out ĠOutput File > Ġ= ĠImmutableList . of < OutputFile >( this ) ĊĠĠĠ Ġoverride Ġfun Ġget Version Code (): ĠInt Ġ= Ġversion ĊĠĠĠ Ġfun Ġget Filter ( filter Type : ĠString ): ĠString ? Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfilters Data . as Sequence (). find Ġ{ Ġit . filter Type Ġ== Ġfilter Type Ġ} ?. identifier ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġload ( folder : ĠFile ): ĠCollection < Early Sync Build Output > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmetadata File Ġ= ĠExisting Build Elements . getMetadata File If Present ( folder ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( metadata File Ġ== Ġnull Ġ|| Ġ! metadata File . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠImmutableList . of < Early Sync Build Output >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFileReader ( metadata File ). use Ġ{ Ġreader : ĠFileReader Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġload ( metadata File , Ġreader ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠImmutableList . of < Early Sync Build Output >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġload ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmetadata File : ĠFile , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreader : ĠReader ): ĠCollection < Early Sync Build Output > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgson Builder Ġ= ĠGson Builder () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO Ġ: Ġremove Ġuse Ġof ĠA pk Info Ġand Ġreplace Ġwith ĠEarly Sync A pk Info . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgson Builder . register Type Adapter ( A pk Data :: class . java , ĠA pk Data Adapter ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgson Builder . register Type Adapter ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠArtifact Type :: class . java , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOutput Type Type Adapter ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgson Ġ= Ġgson Builder . create () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrecord Type Ġ= Ġobject Ġ: ĠType Token < List < Build Output >>() Ġ{} . type ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuild Outputs Ġ= Ġgson . fromJson < Collection < Build Output >>( reader , Ġrecord Type ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSome Ġproduced ĠBuild Output 's Ġmight Ġhave Ġnull Ġapk Data , Ġmostly Ġbecause ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthey 're Ġunused Ġones Ġor Ġnot Ġreadable Ġby Ġthe Ġcurrent Ġadapter Ġ( b / 1 2 9 9 9 4 5 9 6 ). ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( build Outputs . any Ġ{ Ġit . apk Data Ġ== Ġnull Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInvalid Ġfile Ġfound Ġ( empty Ġapk Ġdata ). ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTry Ġto Ġremove Ġ${ metadata File . absolute Path } Ġor Ġclean Ġyour Ġbuild Ġdirectory . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIf Ġthe Ġerror Ġpers ists , Ġreport Ġthis Ġissue Ġvia ĠHelp Ġ> ĠSubmit ĠFeedback . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġresolve Ġthe Ġfile Ġpath Ġto Ġthe Ġcurrent Ġproject Ġlocation . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġproject Path Ġ= Ġmetadata File . parent File . to Path () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġbuild Outputs ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. as Sequence () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġbuild Output Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEarly Sync Build Output ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Output . type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Output . apk Data . type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Output . apk Data . filters , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Output . apk Data . version Code , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproject Path . resolve ( build Output . output Path ). to File ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toList () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġinternal Ġclass ĠA pk Data Adapter Ġ: ĠType Adapter < A pk Data >() Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġwrite ( out : ĠJson Writer , Ġvalue : ĠA pk Data ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIOException (" Unexpected Ġcall Ġto Ġwrite ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġread (` in `: ĠJson Reader ): ĠA pk Data Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ` in `. begin Object () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġoutput Type : ĠString ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfilters Ġ= ĠImmutableList . builder < Filter Data >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġversion Code Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ(` in `. hasNext ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ(` in `. next Name ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" type " Ġ-> Ġoutput Type Ġ= Ġ` in `. next String () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" splits " Ġ-> Ġread Filters (` in `, Ġfilters ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" version Code " Ġ-> Ġversion Code Ġ= Ġ` in `. nextInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" enabled " Ġ-> Ġ` in `. next Boolean () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ` in `. next String () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ` in `. end Object () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( output Type Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIOException (" invalid Ġformat Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠA pk Data . of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠVariant Output . OutputType . valueOf ( output Type ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfilters . build (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġversion Code ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġfun Ġread Filters (` in `: ĠJson Reader , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfilters : ĠImmutableList . Builder < Filter Data >) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ` in `. begin Array () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ(` in `. hasNext ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ` in `. begin Object () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġfilter Type : ĠVariant Output . Filter Type ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġvalue : ĠString ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ(` in `. hasNext ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ(` in `. next Name ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" filter Type " Ġ-> Ġfilter Type Ġ= ĠVariant Output . Filter Type . valueOf (` in `. next String ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" value " Ġ-> Ġvalue Ġ= Ġ` in `. next String () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( filter Type Ġ!= Ġnull Ġ&& Ġvalue Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfilters . add ( Filter Data Impl ( filter Type , Ġvalue )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ` in `. end Object () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ` in `. end Array () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġinternal Ġclass ĠOutput Type Type Adapter Ġ: ĠType Adapter < Artifact Type <* >>() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġwrite ( out : ĠJson Writer ?, Ġvalue : ĠArtifact Type < *> ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIOException (" Unexpected Ġcall Ġto Ġwrite ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġread (` in `: ĠJson Reader ): ĠArtifact Type < *> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ` in `. begin Object () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! ` in `. next Name (). endsWith (" type ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIOException (" Invalid Ġformat ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnext String Ġ= Ġ` in `. next String () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoutput Type : ĠArtifact Type < *> Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext String . to Artifact Type () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ` in `. end Object () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġoutput Type ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ