/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 1 8 Ġ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 . res . namespaced Ċ Ċ import Ġcom . android . ide . common . symbols . Symbol Ċ import Ġcom . android . ide . common . symbols . Symbol Io Ċ import Ġcom . android . ide . common . symbols . Symbol Table Ċ import Ġcom . android . ide . common . xml . Xml Format Preferences Ċ import Ġcom . android . ide . common . xml . Xml Format Style Ċ import Ġcom . android . ide . common . xml . Xml PrettyPrinter Ċ import Ġcom . android . resources . ResourceType Ċ import Ġcom . android . test utils . Test Resources Ċ import Ġcom . android . test utils . truth . Path Subject Ċ import Ġcom . android . test utils . truth . Path Subject . assertThat Ċ import Ġcom . android . tools . build . apk zlib . zip . Z File Ċ import Ġcom . android . utils . FileUtils Ċ import Ġcom . android . utils . Position Xml Parser Ċ import Ġcom . google . common . collect . ImmutableList Ċ import Ġcom . google . common . j im fs . Configuration Ċ import Ġcom . google . common . j im fs . Jim fs Ċ import Ġcom . google . common . truth . Truth . assertThat Ċ import Ġorg . junit . Rule Ċ import Ġorg . junit . Test Ċ import Ġorg . junit . rules . Temporary Folder Ċ import Ġjava . io . File Ċ import Ġjava . io . String Writer Ċ import Ġjava . lang . reflect . Invocation TargetException Ċ import Ġjava . net . URL ClassLoader Ċ import Ġjava . nio . file . Files Ċ import Ġjava . nio . file . Path Ċ import Ġjava . util . stream . Collectors Ċ import Ġkotlin . test . assert Fails With Ċ Ċ class ĠNamespace Rew riter Test Ġ{ ĊĊĠĠĠ Ġ@ get : Rule ĊĠĠĠ Ġvar Ġtemporary Folder Ġ= ĠTemporary Folder () ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġtest Class : ĠFile ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġtest 2 Class : ĠFile ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġmodule R Class : ĠFile ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġmodule R String Class : ĠFile ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġdependency R Class : ĠFile ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġdependency R String Class : ĠFile ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġjav ac Output : ĠFile ĊĊĠĠĠ Ġprivate Ġfun Ġset Byte code Up () Ġ{ ĊĠĠĠĠĠĠĠ Ġjav ac Output Ġ= Ġtemporary Folder . new Folder (" out ") ĊĊĠĠĠĠĠĠĠ Ġcompile Sources ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠImmutableList . of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetFile (" R . java "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetFile (" Test . java "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetFile (" Test 2 . java "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetFile (" dependency / R . java ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjav ac Output ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġtest Class Ġ= ĠFileUtils . join ( javac Output , Ġ" com ", Ġ" example ", Ġ" my module ", Ġ" Test . class ") ĊĠĠĠĠĠĠĠ ĠassertThat ( test Class ). exists () ĊĠĠĠĠĠĠĠ Ġtest 2 Class Ġ= ĠFileUtils . join ( javac Output , Ġ" com ", Ġ" example ", Ġ" my module ", Ġ" Test 2 . class ") ĊĠĠĠĠĠĠĠ ĠassertThat ( test 2 Class ). exists () ĊĠĠĠĠĠĠĠ Ġmodule R Class Ġ= ĠFileUtils . join ( javac Output , Ġ" com ", Ġ" example ", Ġ" my module ", Ġ" R . class ") ĊĠĠĠĠĠĠĠ ĠassertThat ( module R Class ). exists () ĊĠĠĠĠĠĠĠ Ġmodule R String Class Ġ= ĠFileUtils . join ( module R Class . parent File , Ġ" R \$ string . class ") ĊĠĠĠĠĠĠĠ ĠassertThat ( module R String Class ). exists () ĊĠĠĠĠĠĠĠ Ġdependency R Class Ġ= ĠFileUtils . join ( javac Output , Ġ" com ", Ġ" example ", Ġ" dependency ", Ġ" R . class ") ĊĠĠĠĠĠĠĠ ĠassertThat ( dependency R Class ). exists () ĊĠĠĠĠĠĠĠ Ġdependency R String Class Ġ= ĠFileUtils . join ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjav ac Output , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" com ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" example ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" dependency ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" R \$ string . class " ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠassertThat ( dependency R String Class ). exists () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠgetFile ( name : ĠString ): ĠFile Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠTest Resources . getFile ( Namespace Rew riter Test :: class . java , Ġname ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġno Changes When Leaf () Ġ{ ĊĠĠĠĠĠĠĠ Ġset Byte code Up () ĊĠĠĠĠĠĠĠ Ġ// ĠTest Ġclass Ġwill Ġcontain Ġonly Ġresources Ġfrom Ġits ' Ġown Ġmodule . ĊĠĠĠĠĠĠĠ Ġval Ġmodule Table Ġ= ĠSymbol Table . builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. table Package (" com . example . my module ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( symbol (" string ", Ġ" s 1 ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( symbol (" string ", Ġ" s 2 ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( symbol (" string ", Ġ" s 3 ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġ// ĠJust Ġoverride Ġthe Ġexisting Ġfile Ġas Ġwe Ġcompile Ġthem Ġper Ġtest . ĊĠĠĠĠĠĠĠ ĠNamespace Rew riter ( ImmutableList . of ( module Table )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. rewrite Class ( test Class . to Path (), Ġtest Class . to Path ()) ĊĊĠĠĠĠĠĠĠ Ġval Ġurls Ġ= ĠarrayOf ( javac Output . to URI (). to URL ()) ĊĠĠĠĠĠĠĠ ĠURL ClassLoader ( urls , Ġnull ). use Ġ{ Ġclass Loader Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtest C Ġ= Ġclass Loader . load Class (" com . example . my module . Test ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmethod Ġ= Ġtest C . getMethod (" test ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġmethod . invoke ( null ) Ġas ĠInt ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠValues Ġfrom Ġmy module . R ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( result ). isEqualTo ( 2 Ġ* Ġ 3 Ġ* Ġ 5 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġrewrite Packages () Ġ{ ĊĠĠĠĠĠĠĠ Ġset Byte code Up () ĊĠĠĠĠĠĠĠ Ġ// ĠTest Ġclass Ġcontains Ġreferences Ġto Ġits Ġown Ġresources Ġas Ġwell Ġas Ġresources Ġfrom Ġits ĊĠĠĠĠĠĠĠ Ġ// Ġdependencies . ĠOnly Ġresources Ġnot Ġdefined Ġin Ġthis Ġmodule Ġneed Ġto Ġbe Ġre written . ĊĠĠĠĠĠĠĠ Ġ// ĠTest Ġclass Ġwill Ġcontain Ġonly Ġresources Ġfrom Ġits ' Ġown Ġmodule . ĊĠĠĠĠĠĠĠ Ġval Ġmodule Table Ġ= ĠSymbol Table . builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. table Package (" com . example . my module ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( symbol (" string ", Ġ" s 1 ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġval Ġdependency Table Ġ= ĠSymbol Table . builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. table Package (" com . example . dependency ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( symbol (" string ", Ġ" s 2 ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( symbol (" string ", Ġ" s 3 ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġval Ġsecond Dependency Table Ġ= ĠSymbol Table . builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. table Package (" com . example . lib A ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( symbol (" string ", Ġ" s 2 ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġval Ġthird Dependency Table Ġ= ĠSymbol Table . builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. table Package (" com . example . lib B ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( symbol (" string ", Ġ" s 1 ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( symbol (" string ", Ġ" s 2 ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġval Ġlogger Ġ= ĠMock Logger () ĊĠĠĠĠĠĠĠ Ġ// ĠJust Ġoverride Ġthe Ġexisting Ġfile Ġas Ġwe Ġcompile Ġthem Ġper Ġtest . ĊĠĠĠĠĠĠĠ ĠNamespace Rew riter ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠImmutableList . of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodule Table , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdependency Table , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsecond Dependency Table , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthird Dependency Table ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. rewrite Class ( test Class . to Path (), Ġtest Class . to Path ()) ĊĊĠĠĠĠĠĠĠ ĠassertThat ( logger . warnings ). has Size ( 0 ) ĊĠĠĠĠĠĠĠ ĠassertThat ( logger . infos ). has Size ( 2 ) ĊĠĠĠĠĠĠĠ ĠassertThat ( logger . infos [ 0 ]). contains ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" In Ġpackage Ġcom . example . my module Ġmultiple Ġoptions Ġfound Ġin Ġits Ġdependencies Ġfor Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" resource Ġstring Ġs 1 . ĠUsing Ġcom . example . my module , Ġother Ġavailable : Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" com . example . lib B " ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠassertThat ( logger . infos [ 1 ]). contains ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" In Ġpackage Ġcom . example . my module Ġmultiple Ġoptions Ġfound Ġin Ġits Ġdependencies Ġfor Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" resource Ġstring Ġs 2 . ĠUsing Ġcom . example . dependency , Ġother Ġavailable : Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" com . example . lib A , Ġcom . example . lib B " ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġurls Ġ= ĠarrayOf ( javac Output . to URI (). to URL ()) ĊĠĠĠĠĠĠĠ ĠURL ClassLoader ( urls , Ġnull ). use Ġ{ Ġclass Loader Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtest C Ġ= Ġclass Loader . load Class (" com . example . my module . Test ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmethod Ġ= Ġtest C . getMethod (" test ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġmethod . invoke ( null ) Ġas ĠInt ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFirst Ġvalue Ġfrom Ġmy module . R , Ġsecond Ġand Ġthird Ġfrom Ġdependency . R ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( result ). isEqualTo ( 2 Ġ* Ġ 1 1 Ġ* Ġ 1 3 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġexception On Missing Resources () Ġ{ ĊĠĠĠĠĠĠĠ Ġset Byte code Up () ĊĠĠĠĠĠĠĠ Ġval Ġe Ġ= Ġassert Fails With < IllegalStateException > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsymbols Ġ= ĠSymbol Table . builder (). table Package (" my . example . lib "). build () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠNamespace Rew riter ( ImmutableList . of ( symbols )). rewrite Class ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtest Class . to Path (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtest Class . to Path () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠassertThat ( e . message ). contains ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" In Ġpackage Ġmy . example . lib Ġfound Ġunknown Ġsymbol Ġof Ġtype Ġstring Ġand Ġname Ġs 1 ." ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġrewrite Style able Children In Byte code () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠSetup : ĊĠĠĠĠĠĠĠ Ġ// Ġlib . A Ġ-> Ġlib . B Ġ-> Ġlib . C ĊĠĠĠĠĠĠĠ Ġ// ĠWe Ġwill Ġrewrite Ġall Ġreferences Ġin ĠLib A Ġto Ġstyle able Ġchildren Ġto Ġbe Ġname spaced . ĊĊĠĠĠĠĠĠĠ Ġ// ĠGet Ġthe Ġnot - namespaced Ġbytecode Ġfirst . ĊĠĠĠĠĠĠĠ Ġval Ġnot Name spaced Byte code Ġ= Ġget Lib AN ot Name spaced Byte code () ĊĊĠĠĠĠĠĠĠ Ġ// ĠSetting Ġup Ġthe ĠSymbol ĠTables Ġfor Ġthe Ġre - writer . ĠWe Ġwill Ġalso Ġuse Ġthem Ġto Ġwrite Ġthe ĊĠĠĠĠĠĠĠ Ġ// Ġname spaced ĠR Ġclasses Ġfor ĠLib ĠA Ġand ĠLib ĠB . ĊĠĠĠĠĠĠĠ Ġval Ġlib AS ymbols Ġ= ĠSymbol Table . builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. table Package (" lib . A ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSymbol . Style able Symbol ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" s 2 ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠImmutableList . of (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠImmutableList . of (" attr 1 ", Ġ" attr 2 ", Ġ" attr 3 ", Ġ" attr 4 "))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( symbol (" attr ", Ġ" attr 1 ", Ġtrue )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( symbol (" attr ", Ġ" attr 2 ", Ġtrue )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( symbol (" attr ", Ġ" attr 3 ", Ġtrue )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( symbol (" attr ", Ġ" attr 4 ")) Ġ// Ġonly Ġthis Ġwas Ġactually Ġdefined ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġval Ġlib BS ymbols Ġ= ĠSymbol Table . builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. table Package (" lib . B ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( Symbol . Style able Symbol ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" s 1 ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠImmutableList . of (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠImmutableList . of (" attr 1 ", Ġ" attr 2 "))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( symbol (" attr ", Ġ" attr 1 ", Ġtrue )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( symbol (" attr ", Ġ" attr 2 ", Ġtrue )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( symbol (" attr ", Ġ" attr 3 ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġval Ġlib CS ymbols Ġ= ĠSymbol Table . builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. table Package (" lib . C ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( symbol (" attr ", Ġ" attr 1 ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġ// ĠThe ĠURL Ġclass Ġloader Ġneeds Ġto Ġtake Ġthe Ġbase Ġdirectory , Ġnot Ġthe Ġ. class Ġfile Ġdirectly . ĊĠĠĠĠĠĠĠ Ġval Ġname spaced Lib AD ir Ġ= Ġtemporary Folder . new Folder () ĊĠĠĠĠĠĠĠ Ġval Ġname spaced Lib A Byte code Ġ= ĠFileUtils . join ( namespaced Lib AD ir , Ġ" lib ", Ġ" A ", Ġ" Lib A . class ") ĊĠĠĠĠĠĠĠ ĠFileUtils . mkdir s ( namespaced Lib A Byte code . parent File ) ĊĠĠĠĠĠĠĠ Ġval Ġre writer Ġ= ĠNamespace Rew riter ( ImmutableList . of ( lib AS ymbols , Ġlib BS ymbols , Ġlib CS ymbols )) ĊĊĠĠĠĠĠĠĠ Ġ// ĠRewrite Ġthe Ġbytecode Ġto Ġbe Ġname spaced . ĠThis Ġis Ġthe Ġmain Ġthing Ġbeing Ġtested Ġin Ġthis Ġtest . ĊĠĠĠĠĠĠĠ Ġre writer . rewrite Class ( not Name spaced Byte code . to Path (), Ġname spaced Lib A Byte code . to Path ()) ĊĊĠĠĠĠĠĠĠ Ġ// ĠWe Ġonly Ġneed ĠR Ġclasses Ġfor ĠLib ĠA Ġand ĠLib ĠB , Ġsince Ġwe 're Ġnot Ġreferencing Ġanything Ġfrom ĊĠĠĠĠĠĠĠ Ġ// ĠLib ĠC Ġdirectly . ĊĠĠĠĠĠĠĠ Ġval Ġname spaced R J ars Ġ= Ġtemporary Folder . new Folder () ĊĠĠĠĠĠĠĠ Ġval Ġname spaced Lib AR Jar Ġ= ĠFileUtils . join ( namespaced R J ars , Ġ" Lib A . jar ") ĊĠĠĠĠĠĠĠ Ġre writer . write R Class ( namespaced Lib AR Jar . to Path ()) ĊĠĠĠĠĠĠĠ Ġval Ġname spaced Lib BR Jar Ġ= ĠFileUtils . join ( namespaced R J ars , Ġ" Lib B . jar ") ĊĠĠĠĠĠĠĠ ĠNamespace Rew riter ( ImmutableList . of ( lib BS ymbols , Ġlib CS ymbols )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. write R Class ( namespaced Lib BR Jar . to Path ()) ĊĊĠĠĠĠĠĠĠ Ġ// ĠLet 's Ġmake Ġsure Ġeverything Ġstill Ġworks Ġafter Ġthe Ġre writing Ġand Ġusing Ġthe Ġname spaced ĠR ĊĠĠĠĠĠĠĠ Ġ// Ġclasses . ĊĠĠĠĠĠĠĠ Ġvar Ġurls Ġ= ĠarrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġname spaced Lib AR Jar . to URI (). to URL (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġname spaced Lib BR Jar . to URI (). to URL (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġname spaced Lib AD ir . to URI (). to URL ()) ĊĠĠĠĠĠĠĠ ĠURL ClassLoader ( urls , Ġnull ). use Ġ{ Ġclass Loader Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠLoad Ġthe Ġre written Ġclass . ĠWe Ġhave Ġthe Ġname spaced ĠR Ġclasses Ġand Ġnot Ġthe Ġoriginal ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġnon - namespaced ĠR Ġclass , Ġso Ġall Ġthe Ġreferences Ġneed Ġto Ġbe Ġre written Ġcorrectly Ġfor Ġthis ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġto Ġload . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtest C Ġ= Ġclass Loader . load Class (" lib . A . Lib A ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmethod Ġ= Ġtest C . getMethod (" test ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġmethod . invoke ( null ) Ġas ĠInt ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThe Ġvalues Ġwe Ġuse Ġare Ġfake ĠIDs Ġof Ġ 1 , Ġso Ġthe Ġsum Ġshould Ġbe Ġ 7 Ġ( just Ġto Ġmake Ġsure ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthe Ġreferences Ġresolve Ġcorrectly ). ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( result ). isEqualTo ( 7 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠNow Ġtry Ġwithout Ġthe ĠR Ġclass Ġfor Ġlib ĠB . ĠIt Ġshould Ġfail Ġto Ġresolve Ġlib . B . R . style able . ĊĠĠĠĠĠĠĠ Ġurls Ġ= ĠarrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġname spaced Lib AR Jar . to URI (). to URL (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġname spaced Lib AD ir . to URI (). to URL ()) ĊĠĠĠĠĠĠĠ Ġval Ġe Ġ= Ġassert Fails With < Invocation TargetException > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠURL ClassLoader ( urls , Ġnull ). use Ġ{ Ġclass Loader Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtest C Ġ= Ġclass Loader . load Class (" lib . A . Lib A ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmethod Ġ= Ġtest C . getMethod (" test ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmethod . invoke ( null ) Ġas ĠInt ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠassertThat ( e ). has Cause That (). has Message That (). contains (" lib / B / R \$ style able ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Lib AN ot Name spaced Byte code (): ĠFile Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠCreate Ġnon - namespaced ĠR Ġclass Ġso Ġthe Ġoriginal Ġlib . A Ġjava Ġsources Ġcan Ġcompile . ĠIt Ġcontains ĊĠĠĠĠĠĠĠ Ġ// ĠAll Ġthe Ġresources Ġfrom ĠLib ĠA , ĠLib ĠB Ġand ĠLib ĠC . ĊĠĠĠĠĠĠĠ Ġval Ġr Source Ġ= Ġtemporary Folder . new Folder () ĊĠĠĠĠĠĠĠ Ġval Ġlib AN ot Name spaced Symbols Ġ= ĠSymbol Table . builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. table Package (" lib . A ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSymbol . Style able Symbol ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" s 1 ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠImmutableList . of (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠImmutableList . of (" attr 1 ", Ġ" attr 2 "))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSymbol . Style able Symbol ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" s 2 ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠImmutableList . of (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠImmutableList . of (" attr 1 ", Ġ" attr 2 ", Ġ" attr 3 ", Ġ" attr 4 "))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( symbol (" attr ", Ġ" attr 1 ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( symbol (" attr ", Ġ" attr 2 ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( symbol (" attr ", Ġ" attr 3 ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( symbol (" attr ", Ġ" attr 4 ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġ// ĠNon - final ĠIDs Ġsince Ġwe Ġdon 't Ġwant Ġthe Ġvalues Ġto Ġget Ġin lined ! ĊĠĠĠĠĠĠĠ ĠSymbol Io . export To Java ( lib AN ot Name spaced Symbols , Ġr Source , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġval Ġnot Name spaced R Java Ġ= ĠFileUtils . join ( r Source , Ġ" lib ", Ġ" A ", Ġ" R . java ") ĊĠĠĠĠĠĠĠ ĠassertThat ( not Name spaced R Java ). exists () ĊĊĠĠĠĠĠĠĠ Ġ// ĠGet Ġthe Ġlib . A Ġnon - namespaced Ġjava Ġsources . ĊĠĠĠĠĠĠĠ Ġval Ġnot Name spaced Sources Ġ= ĠgetFile (" Lib A . java ") ĊĠĠĠĠĠĠĠ ĠassertThat ( not Name spaced Sources ). exists () ĊĊĠĠĠĠĠĠĠ Ġ// ĠCompile Ġeverything . ĊĠĠĠĠĠĠĠ Ġval Ġoutput Ġ= Ġtemporary Folder . new Folder (" out ") ĊĠĠĠĠĠĠĠ Ġcompile Sources ( ImmutableList . of ( not Name spaced R Java , Ġnot Name spaced Sources ), Ġoutput ) ĊĊĠĠĠĠĠĠĠ Ġval Ġcompiled Not Name spaced Sources Ġ= ĠFileUtils . join ( output , Ġ" lib ", Ġ" A ", Ġ" Lib A . class ") ĊĠĠĠĠĠĠĠ ĠassertThat ( compiled Not Name spaced Sources ). exists () ĊĊĠĠĠĠĠĠĠ Ġ// ĠWe Ġonly Ġcare Ġabout Ġthe ĠLib A . class Ġ( it Ġdoesn 't Ġhave Ġsub - classes Ġand Ġwe Ġdon 't Ġwant Ġthe ĊĠĠĠĠĠĠĠ Ġ// Ġnon - namespaced ĠR Ġclass ), Ġreturn Ġit . ĊĠĠĠĠĠĠĠ Ġreturn Ġcompiled Not Name spaced Sources ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġrewrite Jar () Ġ{ ĊĠĠĠĠĠĠĠ Ġset Byte code Up () ĊĠĠĠĠĠĠĠ Ġval Ġa ars Dir Ġ= Ġtemporary Folder . new Folder (" a ars ") ĊĠĠĠĠĠĠĠ Ġval Ġinput Jar Ġ= ĠFile ( a ars Dir , Ġ" classes . jar ") ĊĠĠĠĠĠĠĠ Ġval Ġoutput Jar Ġ= ĠFile ( a ars Dir , Ġ" namespaced - classes . jar ") ĊĊĠĠĠĠĠĠĠ ĠZ File . open ReadWrite ( input Jar ). use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . add (" com / example / my module / Test . class ", Ġtest Class . inputStream ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . add (" com / example / my module / Test 2 . class ", Ġtest 2 Class . inputStream ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġmodule Table Ġ= ĠSymbol Table . builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. table Package (" com . example . my module ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( symbol (" string ", Ġ" s 1 ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġval Ġdependency Table Ġ= ĠSymbol Table . builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. table Package (" com . example . dependency ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( symbol (" string ", Ġ" s 2 ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( symbol (" string ", Ġ" s 3 ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ ĠNamespace Rew riter ( ImmutableList . of ( module Table , Ġdependency Table )). rewrite Jar ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinput Jar , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutput Jar ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠassertThat ( output Jar ). exists () ĊĠĠĠĠĠĠĠ ĠZ File . open ReadWrite ( output Jar ). use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . add (" com / example / my module / R . class ", Ġmodule R Class . inputStream ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . add (" com / example / my module / R \$ string . class ", Ġmodule R String Class . inputStream ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . add (" com / example / dependency / R . class ", Ġdependency R Class . inputStream ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . add (" com / example / dependency / R \$ string . class ", Ġdependency R String Class . inputStream ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠURL ClassLoader ( array Of ( output Jar . to URI (). to URL ()), Ġnull ). use Ġ{ Ġclass Loader Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġtest C Ġ= Ġclass Loader . load Class (" com . example . my module . Test ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġmethod Ġ= Ġtest C . getMethod (" test ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġresult Ġ= Ġmethod . invoke ( null ) Ġas ĠInt ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( result ). isEqualTo ( 2 Ġ* Ġ 1 1 Ġ* Ġ 1 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtest C Ġ= Ġclass Loader . load Class (" com . example . my module . Test 2 ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmethod Ġ= Ġtest C . getMethod (" test 2 ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= Ġmethod . invoke ( null ) Ġas ĠInt ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( result ). isEqualTo ( 2 Ġ* Ġ 1 1 Ġ* Ġ 1 3 Ġ+ Ġ 2 Ġ+ Ġ 1 1 Ġ+ Ġ 1 3 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġrewrite Manifest () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġoriginal Manifest Ġ= Ġtemporary Folder . new File (" Android Manifest . xml ") ĊĠĠĠĠĠĠĠ ĠFileUtils . write ToFile ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoriginal Manifest , Ġ""" <? xml Ġversion =" 1 . 0 " Ġencoding =" UTF - 8 "?> Ċ < manifest Ġxmlns : android =" http :// schemas . android . com / apk / res / android " ĊĠĠĠ Ġpackage =" com . example . module " ĊĠĠĠ Ġandroid : version Code ="@ integer / version _ code " ĊĠĠĠ Ġandroid : version Name ="@ string / version _ name "> ĊĊĠĠĠ Ġ< application Ġandroid : label ="@ string / app _ name " ĊĠĠĠĠĠĠĠ Ġandroid : icon ="@ drawable / ic _ launcher " ĊĠĠĠĠĠĠĠ Ġandroid : theme ="@ style / Theme . Simple " ĊĠĠĠĠĠĠĠ Ġandroid : allow Backup =" true "> ĊĊĠĠĠĠĠĠĠ Ġ< activity Ġandroid : name ="@ string / activity _ name " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġandroid : label ="@ string / app _ name "> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ< intent - filter > ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ< action Ġandroid : name =" android . intent . action . MAIN " Ġ/> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ< category Ġandroid : name =" android . intent . category . LA UNCH ER " Ġ/> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ</ intent - filter > ĊĠĠĠĠĠĠĠ Ġ</ activity > ĊĠĠĠ Ġ</ application > Ċ Ċ </ manifest > """ ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġoutput Manifest Ġ= Ġtemporary Folder . new File (" com . foo . bar . example _ Android Manifest . xml ") ĊĠĠĠĠĠĠĠ Ġval Ġmodule Table Ġ= ĠSymbol Table . builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. table Package (" com . example . module ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( symbol (" integer ", Ġ" version _ code ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( symbol (" string ", Ġ" version _ name ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( symbol (" string ", Ġ" activity _ name ")) Ġ// Ġoverrides Ġlibrary Ġstring ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġval Ġdependency Table Ġ= ĠSymbol Table . builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. table Package (" com . example . dependency ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( symbol (" string ", Ġ" app _ name ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( symbol (" drawable ", Ġ" ic _ launcher ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( symbol (" style ", Ġ" Theme . Simple ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( symbol (" string ", Ġ" activity _ name ")) Ġ// Ġoverridden Ġby Ġthe Ġone Ġin Ġthe Ġmodule ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ ĠNamespace Rew riter ( ImmutableList . of ( module Table , Ġdependency Table )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. rewrite Manifest ( original Manifest . to Path (), Ġoutput Manifest . to Path ()) ĊĊĠĠĠĠĠĠĠ ĠassertThat ( FileUtils . load File With Unix Line Separ ators ( output Manifest )). contains ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" <? xml Ġversion =" 1 . 0 " Ġencoding =" utf - 8 "?> Ċ < manifest Ġxmlns : android =" http :// schemas . android . com / apk / res / android " ĊĠĠĠ Ġpackage =" com . example . module " ĊĠĠĠ Ġandroid : version Code ="@ * com . example . module : integer / version _ code " ĊĠĠĠ Ġandroid : version Name ="@ * com . example . module : string / version _ name " Ġ> ĊĊĠĠĠ Ġ< application ĊĠĠĠĠĠĠĠ Ġandroid : allow Backup =" true " ĊĠĠĠĠĠĠĠ Ġandroid : icon ="@ * com . example . dependency : drawable / ic _ launcher " ĊĠĠĠĠĠĠĠ Ġandroid : label ="@ * com . example . dependency : string / app _ name " ĊĠĠĠĠĠĠĠ Ġandroid : theme ="@ * com . example . dependency : style / Theme . Simple " Ġ> ĊĠĠĠĠĠĠĠ Ġ< activity ĊĠĠĠĠĠĠĠĠĠĠĠ Ġandroid : name ="@ * com . example . module : string / activity _ name " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġandroid : label ="@ * com . example . dependency : string / app _ name " Ġ> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ< intent - filter > ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ< action Ġandroid : name =" android . intent . action . MAIN " Ġ/> ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ< category Ġandroid : name =" android . intent . category . LA UNCH ER " Ġ/> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ</ intent - filter > ĊĠĠĠĠĠĠĠ Ġ</ activity > ĊĠĠĠ Ġ</ application > Ċ Ċ </ manifest > """ ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġrewrite Values File () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġoriginal Ġ= Ġtemporary Folder . new File (" values . xml ") ĊĠĠĠĠĠĠĠ ĠFileUtils . write ToFile ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoriginal , Ġ""" <? xml Ġversion =" 1 . 0 " Ġencoding =" UTF - 8 "?> Ċ < resources > ĊĠĠĠ Ġ< string Ġname =" app _ name ">@ string / string </ string > ĊĠĠĠ Ġ< string Ġname =" string "> string </ string > ĊĠĠĠ Ġ< string Ġname =" activity _ name "> foo </ string > ĊĠĠĠ Ġ< string Ġname =" activity _ ref ">@ string / activity _ name </ string > ĊĊĠĠĠ Ġ< integer Ġname =" version _ code ">@ integer / remote _ value </ integer > ĊĊĠĠĠ Ġ< style Ġname =" My Style " Ġparent ="@ style / Style Parent "> ĊĠĠĠĠĠĠĠ Ġ< item Ġname =" android : text Size "> 2 0 sp </ item > ĊĠĠĠĠĠĠĠ Ġ< item Ġname =" android : textColor "># 0 0 8 </ item > ĊĠĠĠ Ġ</ style > ĊĊĠĠĠ Ġ< style Ġname =" My Style 2 " Ġparent =" Style Parent "> ĊĠĠĠĠĠĠĠ Ġ< item Ġname =" android : text Size "> 2 0 sp </ item > ĊĠĠĠĠĠĠĠ Ġ< item Ġname =" android : textColor "># 0 0 8 </ item > ĊĠĠĠĠĠĠĠ Ġ< item Ġname =" show Text "> true </ item > ĊĠĠĠ Ġ</ style > ĊĊĠĠĠ Ġ< declare - style able Ġname =" Pie Chart " Ġparent =" Style able Parent "> ĊĠĠĠĠĠĠĠ Ġ< attr Ġname =" show Text " Ġformat =" boolean " Ġ/> ĊĠĠĠĠĠĠĠ Ġ< attr Ġname =" label Position " Ġformat =" enum "> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ< enum Ġname =" left " Ġvalue =" 0 "/> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ< enum Ġname =" right " Ġvalue =" 1 "/> ĊĠĠĠĠĠĠĠ Ġ</ attr > ĊĠĠĠ Ġ</ declare - style able > ĊĊĠĠĠ Ġ< declare - style able Ġname =" No Parent " Ġ/> ĊĊĠĠĠ Ġ< declare - style able Ġname =" Un necessary Parent " Ġparent =" invalid Parent Reference " Ġ/> ĊĊĠĠĠ Ġ< style Ġname =" My Style From Android " Ġparent =" android : Parent . Theme . Style "/> Ċ Ċ </ resources > """ ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġname spaced Ġ= ĠFile ( temporary Folder . new Folder (" namespaced ", Ġ" values "), Ġ" values . xml ") ĊĠĠĠĠĠĠĠ Ġval Ġlocal Table Ġ= ĠSymbol Table . builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. table Package (" com . example . local ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( symbol (" attr ", Ġ" show Text ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġval Ġmodule Table Ġ= ĠSymbol Table . builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. table Package (" com . example . module ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( symbol (" integer ", Ġ" version _ code ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( symbol (" string ", Ġ" app _ name ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( symbol (" string ", Ġ" string ")) Ġ// Ġjust Ġmake Ġsure Ġwe Ġdon 't Ġrewrite Ġthe Ġtypes ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( symbol (" string ", Ġ" activity _ name ")) Ġ// Ġoverrides Ġlibrary Ġstring ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( symbol (" string ", Ġ" activity _ ref ")) Ġ// Ġto Ġmake Ġsure Ġwe Ġwill Ġreference Ġthe Ġapp Ġone ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( symbol (" attr ", Ġ" label Position ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġval Ġdependency Table Ġ= ĠSymbol Table . builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. table Package (" com . example . dependency ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( symbol (" string ", Ġ" reference ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( symbol (" integer ", Ġ" remote _ value ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( symbol (" string ", Ġ" activity _ name ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( symbol (" style ", Ġ" Style Parent ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( symbol (" style able ", Ġ" Style able Parent ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ ĠNamespace Rew riter ( ImmutableList . of ( local Table , Ġmodule Table , Ġdependency Table )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. rewrite Values File ( original . to Path (), Ġname spaced . to Path ()) ĊĊĠĠĠĠĠĠĠ ĠassertThat ( FileUtils . load File With Unix Line Separ ators ( namespaced )). isEqualTo ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" <? xml Ġversion =" 1 . 0 " Ġencoding =" utf - 8 "?> Ċ < resources > ĊĊĠĠĠ Ġ< string Ġname =" app _ name ">@ * com . example . module : string / string </ string > ĊĠĠĠ Ġ< string Ġname =" string "> string </ string > ĊĠĠĠ Ġ< string Ġname =" activity _ name "> foo </ string > ĊĠĠĠ Ġ< string Ġname =" activity _ ref ">@ * com . example . module : string / activity _ name </ string > ĊĊĠĠĠ Ġ< integer Ġname =" version _ code ">@ * com . example . dependency : integer / remote _ value </ integer > ĊĊĠĠĠ Ġ< style Ġname =" My Style " Ġparent ="@ * com . example . dependency : style / Style Parent "> ĊĠĠĠĠĠĠĠ Ġ< item Ġname =" android : text Size "> 2 0 sp </ item > ĊĠĠĠĠĠĠĠ Ġ< item Ġname =" android : textColor "># 0 0 8 </ item > ĊĠĠĠ Ġ</ style > ĊĊĠĠĠ Ġ< style Ġname =" My Style 2 " Ġparent ="@ * com . example . dependency : style / Style Parent "> ĊĠĠĠĠĠĠĠ Ġ< item Ġname =" android : text Size "> 2 0 sp </ item > ĊĠĠĠĠĠĠĠ Ġ< item Ġname =" android : textColor "># 0 0 8 </ item > ĊĠĠĠĠĠĠĠ Ġ< item Ġname =" show Text "> true </ item > ĊĠĠĠ Ġ</ style > ĊĊĠĠĠ Ġ< declare - style able Ġname =" Pie Chart "> ĊĠĠĠĠĠĠĠ Ġ< attr Ġname =" show Text " Ġformat =" boolean " Ġ/> ĊĠĠĠĠĠĠĠ Ġ< attr Ġname =" * com . example . module : label Position " Ġformat =" enum "> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ< enum Ġname =" left " Ġvalue =" 0 " Ġ/> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ< enum Ġname =" right " Ġvalue =" 1 " Ġ/> ĊĠĠĠĠĠĠĠ Ġ</ attr > ĊĠĠĠ Ġ</ declare - style able > ĊĊĠĠĠ Ġ< declare - style able Ġname =" No Parent " Ġ/> ĊĊĠĠĠ Ġ< declare - style able Ġname =" Un necessary Parent " Ġ/> ĊĊĠĠĠ Ġ< style Ġname =" My Style From Android " Ġparent =" android : Parent . Theme . Style " Ġ/> Ċ Ċ </ resources > """. xml Format () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġrewrite Layout File () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġoriginal Ġ= Ġtemporary Folder . new File (" layout . xml ") ĊĠĠĠĠĠĠĠ ĠFileUtils . write ToFile ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoriginal , Ġ""" <? xml Ġversion =" 1 . 0 " Ġencoding =" utf - 8 "?> Ċ < LinearLayout Ġxmlns : android =" http :// schemas . android . com / apk / res / android " ĊĠĠĠ Ġxmlns : app =" http :// schemas . android . com / apk / res - auto " ĊĠĠĠ Ġxmlns : tools =" http :// schemas . android . com / tools " ĊĠĠĠ Ġxmlns : custom =" http :// schemas . android . com / apk / res / com . example . custom views " ĊĊĠĠĠ Ġandroid : layout _ width =" match _ parent " ĊĠĠĠ Ġandroid : layout _ height =" match _ parent " ĊĠĠĠ Ġapp : layout _ behavior ="@ string / app bar _ scroll ing _ view _ behavior " ĊĠĠĠ Ġtools : context =". MainActivity " ĊĠĠĠ Ġtools : show In ="@ layout / activity _ main "> ĊĊĠĠĠ Ġ< TextView ĊĠĠĠĠĠĠĠ Ġandroid : layout _ width =" wrap _ content " ĊĠĠĠĠĠĠĠ Ġandroid : layout _ height =" wrap _ content " ĊĠĠĠĠĠĠĠ Ġandroid : text ="@ string / text " ĊĠĠĠĠĠĠĠ Ġapp : layout _ constraint Bottom _ to Bottom Of =" parent " ĊĠĠĠĠĠĠĠ Ġapp : layout _ constraint Left _ to Left Of =" parent " ĊĠĠĠĠĠĠĠ Ġapp : layout _ constraint Right _ to Right Of =" parent " ĊĠĠĠĠĠĠĠ Ġapp : layout _ constraint Top _ to Top Of =" parent " Ġ/> ĊĊĠĠĠ Ġ< com . example . module . Pie Chart ĊĠĠĠĠĠĠĠ Ġcustom : show Text =" true " ĊĠĠĠĠĠĠĠ Ġcustom : label Position =" left " Ġ/> Ċ Ċ </ LinearLayout > """ ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġname spaced Ġ= ĠFile ( temporary Folder . new Folder (" namespaced ", Ġ" layout "), Ġ" layout . xml ") ĊĠĠĠĠĠĠĠ Ġval Ġmodule Table Ġ= ĠSymbol Table . builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. table Package (" com . example . module ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( symbol (" layout ", Ġ" activity _ main ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( symbol (" string ", Ġ" text ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( symbol (" attr ", Ġ" label Position ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( symbol (" attr ", Ġ" show Text ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġval Ġdependency Table Ġ= ĠSymbol Table . builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. table Package (" com . example . dependency ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( symbol (" string ", Ġ" app bar _ scroll ing _ view _ behavior ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġval Ġcoord inator layout Table Ġ= ĠSymbol Table . builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. table Package (" android x . coordinator layout ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( symbol (" attr ", Ġ" layout _ behavior ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġval Ġconstraint Table Ġ= ĠSymbol Table . builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. table Package (" android . support . constraint ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( symbol (" attr ", Ġ" layout _ constraint Bottom _ to Bottom Of ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( symbol (" attr ", Ġ" layout _ constraint Left _ to Left Of ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( symbol (" attr ", Ġ" layout _ constraint Right _ to Right Of ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( symbol (" attr ", Ġ" layout _ constraint Top _ to Top Of ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ ĠNamespace Rew riter ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠImmutableList . of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodule Table , Ġdependency Table , Ġcoord inator layout Table , Ġconstraint Table ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. rewrite Xml File ( original . to Path (), Ġname spaced . to Path ()) ĊĊĠĠĠĠĠĠĠ ĠassertThat ( FileUtils . load File With Unix Line Separ ators ( namespaced )). contains ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" <? xml Ġversion =" 1 . 0 " Ġencoding =" utf - 8 "?> Ċ < LinearLayout Ġxmlns : android =" http :// schemas . android . com / apk / res / android " ĊĠĠĠ Ġxmlns : custom =" http :// schemas . android . com / apk / res / com . example . custom views " ĊĠĠĠ Ġxmlns : tools =" http :// schemas . android . com / tools " ĊĠĠĠ Ġandroid : layout _ width =" match _ parent " ĊĠĠĠ Ġandroid : layout _ height =" match _ parent " ĊĠĠĠ Ġns 0 : layout _ behavior ="@ * com . example . dependency : string / app bar _ scroll ing _ view _ behavior " ĊĠĠĠ Ġxmlns : ns 0 =" http :// schemas . android . com / apk / res / android x . coordinator layout " ĊĠĠĠ Ġxmlns : ns 1 =" http :// schemas . android . com / apk / res / android . support . constraint " ĊĠĠĠ Ġtools : context =". MainActivity " ĊĠĠĠ Ġtools : show In ="@ layout / activity _ main " Ġ> ĊĊĠĠĠ Ġ< TextView ĊĠĠĠĠĠĠĠ Ġandroid : layout _ width =" wrap _ content " ĊĠĠĠĠĠĠĠ Ġandroid : layout _ height =" wrap _ content " ĊĠĠĠĠĠĠĠ Ġns 1 : layout _ constraint Bottom _ to Bottom Of =" parent " ĊĠĠĠĠĠĠĠ Ġns 1 : layout _ constraint Left _ to Left Of =" parent " ĊĠĠĠĠĠĠĠ Ġns 1 : layout _ constraint Right _ to Right Of =" parent " ĊĠĠĠĠĠĠĠ Ġns 1 : layout _ constraint Top _ to Top Of =" parent " ĊĠĠĠĠĠĠĠ Ġandroid : text ="@ string / text " Ġ/> ĊĊĠĠĠ Ġ< com . example . module . Pie Chart ĊĠĠĠĠĠĠĠ Ġcustom : label Position =" left " ĊĠĠĠĠĠĠĠ Ġcustom : show Text =" true " Ġ/> Ċ Ċ </ LinearLayout > """ ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġrewrite A ar Resources Empty () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfile System Ġ= ĠJim fs . new FileSystem ( Configuration . unix ()) ĊĠĠĠĠĠĠĠ Ġval Ġnamespace Rew riter Ġ= ĠNamespace Rew riter ( ImmutableList . of ()) ĊĊĠĠĠĠĠĠĠ Ġval Ġempty Res Ġ= Ġfile System . getPath ("/ tmp / aar / empty Res ") ĊĠĠĠĠĠĠĠ ĠFiles . create Directories ( empty Res ) ĊĠĠĠĠĠĠĠ Ġval Ġoutput Dir Ġ= Ġfile System . getPath ("/ tmp / re written A ar ") ĊĠĠĠĠĠĠĠ Ġnamespace Rew riter . rewrite A ar Resources ( empty Res , Ġoutput Dir ) ĊĠĠĠĠĠĠĠ ĠPath Subject . assertThat ( output Dir ). isDirectory () ĊĠĠĠĠĠĠĠ Ġval Ġre written Empty Ġ= ĠFiles . list ( output Dir ). use Ġ{ Ġit . collect ( Collectors . toList ()) Ġ} ĊĠĠĠĠĠĠĠ ĠassertThat ( re written Empty ). isEmpty () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġcheck A ar Value Rewrite () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmodule Table Ġ= ĠSymbol Table . builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. table Package (" com . example . module ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġval Ġdependency Table Ġ= ĠSymbol Table . builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. table Package (" com . example . dependency ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( symbol (" string ", Ġ" text ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġval Ġnamespace Rew riter Ġ= ĠNamespace Rew riter ( ImmutableList . of ( module Table , Ġdependency Table )) ĊĊĠĠĠĠĠĠĠ Ġval Ġfrom Ġ= Ġ""" <? xml Ġversion =" 1 . 0 " Ġencoding =" utf - 8 "?> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ< resources > ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ< string Ġname =" app _ name ">@ string / text </ string > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ</ resources > """ ĊĠĠĠĠĠĠĠ Ġval Ġto Ġ= Ġ""" <? xml Ġversion =" 1 . 0 " Ġencoding =" utf - 8 "?> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ< resources > ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ< string Ġname =" app _ name ">@ * com . example . dependency : string / text </ string > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ</ resources > """. xml Format () ĊĠĠĠĠĠĠĠ Ġcheck A ar Rewrite ( namespace Rew riter , Ġ" values / strings . xml ", Ġfrom , Ġto ) ĊĠĠĠĠĠĠĠ Ġcheck A ar Rewrite ( namespace Rew riter , Ġ" values - en / strings . xml ", Ġfrom , Ġto ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġcheck A ar Style Attr Reference Rewrite () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlocal Table Ġ= ĠSymbol Table . builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. table Package (" com . example . local ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( symbol (" attr ", Ġ" tab Max Width ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġval Ġmodule Table Ġ= ĠSymbol Table . builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. table Package (" com . example . module ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( symbol (" attr ", Ġ" tab Indicator Color ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġval Ġdep Table Ġ= ĠSymbol Table . builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. table Package (" com . example . foo ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( symbol (" attr ", Ġ" color Accent ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( symbol (" style ", Ġ" Base . Widget . Design ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( symbol (" dim en ", Ġ" design _ tab _ max _ width ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġval Ġnamespace Rew riter Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNamespace Rew riter ( ImmutableList . of ( local Table , Ġmodule Table , Ġdep Table )) ĊĊĠĠĠĠĠĠĠ Ġval Ġfrom Ġ= Ġ""" <? xml Ġversion =" 1 . 0 " Ġencoding =" utf - 8 "?> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ< resources > ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ< style Ġname =" Base . Widget . Design . Tab Layout "> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ< item Ġname =" tab Max Width ">@ dim en / design _ tab _ max _ width </ item > ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ< item Ġname =" tab Indicator Color "> ? attr / color Accent </ item > ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ</ style > ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ</ resources > """ ĊĠĠĠĠĠĠĠ Ġval Ġto Ġ= Ġ""" <? xml Ġversion =" 1 . 0 " Ġencoding =" utf - 8 "?> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ< resources > ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ< style Ġname =" Base . Widget . Design . Tab Layout " Ġparent ="@ * com . example . foo : style / Base . Widget . Design "> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ< item Ġname =" tab Max Width ">@ * com . example . foo : dim en / design _ tab _ max _ width </ item > ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ< item Ġname =" * com . example . module : tab Indicator Color "> ? com . example . foo : attr / color Accent </ item > ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ</ style > ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ</ resources > """. xml Format () ĊĠĠĠĠĠĠĠ Ġcheck A ar Rewrite ( namespace Rew riter , Ġ" values / styles . xml ", Ġfrom , Ġto ) ĊĠĠĠĠĠĠĠ Ġcheck A ar Rewrite ( namespace Rew riter , Ġ" values - en / styles . xml ", Ġfrom , Ġto ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġcheck A ar Raw Copy () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmodule Table Ġ= ĠSymbol Table . builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. table Package (" com . example . module ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( symbol (" string ", Ġ" text ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġval Ġnamespace Rew riter Ġ= ĠNamespace Rew riter ( ImmutableList . of ( module Table )) ĊĊĠĠĠĠĠĠĠ Ġval Ġraw Ġ= Ġ""" <? not xml """ ĊĠĠĠĠĠĠĠ Ġcheck A ar Rewrite ( namespace Rew riter , Ġ" raw / strings . xml ", Ġraw , Ġraw ) ĊĠĠĠĠĠĠĠ Ġcheck A ar Rewrite ( namespace Rew riter , Ġ" raw - en / strings . xml ", Ġraw , Ġraw ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġcheck A ar Drawable Process Copy () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlocal Table Ġ= ĠSymbol Table . builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. table Package (" com . example . local ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġval Ġmodule Table Ġ= ĠSymbol Table . builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. table Package (" com . example . module ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( symbol (" color ", Ġ" dot fill ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġval Ġnamespace Rew riter Ġ= ĠNamespace Rew riter ( ImmutableList . of ( local Table , Ġmodule Table )) ĊĊĠĠĠĠĠĠĠ Ġval Ġvector Ġ= Ġ""" < vector Ġxmlns : android =" http :// schemas . android . com / apk / res / android " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġandroid : width =" 2 4 dp " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġandroid : height =" 2 4 dp " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġandroid : viewport Width =" 2 4 . 0 " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġandroid : viewport Height =" 2 4 . 0 "> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ< path ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġandroid : fill Color ="@ color / dot fill " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġandroid : path Data =" M 1 2 , 1 2 m - 1 0 , 0 a 1 0 , 1 0 Ġ 0 , 1 Ġ 1 , 2 0 Ġ 0 a 1 0 , 1 0 Ġ 0 , 1 Ġ 1 ,- 2 0 Ġ 0 "/> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ</ vector > """ ĊĠĠĠĠĠĠĠ Ġval Ġre written Ġ= Ġ""" <? xml Ġversion =" 1 . 0 " Ġencoding =" utf - 8 "?> Ċ < vector Ġxmlns : android =" http :// schemas . android . com / apk / res / android " ĊĠĠĠ Ġandroid : height =" 2 4 dp " ĊĠĠĠ Ġandroid : viewport Height =" 2 4 . 0 " ĊĠĠĠ Ġandroid : viewport Width =" 2 4 . 0 " ĊĠĠĠ Ġandroid : width =" 2 4 dp " Ġ> ĊĊĠĠĠ Ġ< path ĊĠĠĠĠĠĠĠ Ġandroid : fill Color ="@ * com . example . module : color / dot fill " ĊĠĠĠĠĠĠĠ Ġandroid : path Data =" M 1 2 , 1 2 m - 1 0 , 0 a 1 0 , 1 0 Ġ 0 , 1 Ġ 1 , 2 0 Ġ 0 a 1 0 , 1 0 Ġ 0 , 1 Ġ 1 ,- 2 0 Ġ 0 " Ġ/> Ċ Ċ </ vector > ĊĠĠĠĠĠĠĠ Ġ""" . xml Format () ĊĠĠĠĠĠĠĠ Ġcheck A ar Rewrite ( namespace Rew riter , Ġ" drawable / vd . xml ", Ġvector , Ġre written ) ĊĠĠĠĠĠĠĠ Ġcheck A ar Rewrite ( namespace Rew riter , Ġ" drawable - en / vd . xml ", Ġvector , Ġre written ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġcheck Comment First () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcomment First Ġ= Ġ""" <? xml Ġversion =" 1 . 0 " Ġencoding =" utf - 8 "?> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ<!-- ĠCopyright Ġ( C ) Ġ 2 0 1 5 Ġ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 . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ--> ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ< ripple Ġxmlns : android =" http :// schemas . android . com / apk / res / android " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġandroid : color ="@ color / abc _ color _ highlight _ material " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġandroid : radius =" 2 0 dp " Ġ/> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĊĠĠĠĠĠĠĠ Ġval Ġexpected Ġ= Ġ""" <? xml Ġversion =" 1 . 0 " Ġencoding =" utf - 8 "?> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ<!-- ĠCopyright Ġ( C ) Ġ 2 0 1 5 Ġ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 . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ--> ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ< ripple Ġxmlns : android =" http :// schemas . android . com / apk / res / android " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġandroid : color ="@ * com . example . module : color / abc _ color _ highlight _ material " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġandroid : radius =" 2 0 dp " Ġ/> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . xml Format () ĊĊĠĠĠĠĠĠĠ Ġval Ġlocal Table Ġ= ĠSymbol Table . builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. table Package (" com . example . local ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġval Ġmodule Table Ġ= ĠSymbol Table . builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. table Package (" com . example . module ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( symbol (" color ", Ġ" abc _ color _ highlight _ material ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġval Ġnamespace Rew riter Ġ= ĠNamespace Rew riter ( ImmutableList . of ( local Table , Ġmodule Table )) ĊĊĠĠĠĠĠĠĠ Ġcheck A ar Rewrite ( namespace Rew riter , Ġ" drawable - v 2 3 / ripple . xml ", Ġcomment First , Ġexpected ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġcheck A ar Non Xml File Resource Copy () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnamespace Rew riter Ġ= ĠNamespace Rew riter ( ImmutableList . of ()) ĊĊĠĠĠĠĠĠĠ Ġval Ġraw Ġ= Ġ""" <? not xml """ ĊĠĠĠĠĠĠĠ Ġcheck A ar Rewrite ( namespace Rew riter , Ġ" drawable / my . foo ", Ġraw , Ġraw ) ĊĠĠĠĠĠĠĠ Ġcheck A ar Rewrite ( namespace Rew riter , Ġ" drawable / my . foo 2 ", Ġraw , Ġraw ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġcheck Public File Generation With Public Txt () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmodule Table Ġ= ĠSymbol Table . builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. table Package (" com . example . module ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( symbol (" color ", Ġ" abc _ color _ highlight _ material ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( symbol (" style ", Ġ" Base . Widget . Design . Tab Layout ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( symbol (" string ", Ġ" private ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( symbol (" attr ", Ġ" normal _ attr ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( symbol (" attr ", Ġ" local _ attr ", Ġtrue )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( symbol (" attr ", Ġ" remote _ attr ", Ġtrue )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( symbol (" attr ", Ġ" private _ attr ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġval Ġpublic Table Ġ= ĠSymbol Table . builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. table Package (" com . example . module ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( symbol (" color ", Ġ" abc _ color _ highlight _ material ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( symbol (" style ", Ġ" Base _ Widget _ Design _ Tab Layout ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( symbol (" attr ", Ġ" local _ attr ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( symbol (" attr ", Ġ" normal _ attr ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġval Ġdependency Table Ġ= ĠSymbol Table . builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. table Package (" com . example . dependency ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( symbol (" attr ", Ġ" remote _ attr ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġval Ġnamespace Rew riter Ġ= ĠNamespace Rew riter ( ImmutableList . of ( module Table , Ġdependency Table )) ĊĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠString Writer (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnamespace Rew riter . write Public File ( this , Ġmodule Table , Ġpublic Table ) ĊĠĠĠĠĠĠĠ Ġ}. toString (). trim () ĊĊĠĠĠĠĠĠĠ ĠassertThat ( result ). isEqualTo (""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ< resources > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ< public Ġname =" local _ attr " Ġtype =" attr " Ġ/> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ< public Ġname =" normal _ attr " Ġtype =" attr " Ġ/> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ< public Ġname =" abc _ color _ highlight _ material " Ġtype =" color " Ġ/> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ< public Ġname =" Base . Widget . Design . Tab Layout " Ġtype =" style " Ġ/> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ</ resources > ĊĠĠĠĠĠĠĠ Ġ""" . xml Format ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġcheck Public File Generation Without Public Txt () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmodule Table Ġ= ĠSymbol Table . builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. table Package (" com . example . module ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( symbol (" color ", Ġ" abc _ color _ highlight _ material ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( symbol (" style ", Ġ" Base . Widget . Design . Tab Layout ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( symbol (" string ", Ġ" local ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( symbol (" attr ", Ġ" normal _ attr ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( symbol (" attr ", Ġ" local _ attr ", Ġtrue )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( symbol (" attr ", Ġ" remote _ attr ", Ġtrue )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġval Ġdependency Table Ġ= ĠSymbol Table . builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. table Package (" com . example . dependency ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( symbol (" attr ", Ġ" remote _ attr ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġval Ġnamespace Rew riter Ġ= ĠNamespace Rew riter ( ImmutableList . of ( module Table , Ġdependency Table )) ĊĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠString Writer (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnamespace Rew riter . write Public File ( this , Ġmodule Table , Ġmodule Table ) ĊĠĠĠĠĠĠĠ Ġ}. toString (). trim () ĊĊĠĠĠĠĠĠĠ ĠassertThat ( result ). isEqualTo (""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ< resources > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ< public Ġname =" local _ attr " Ġtype =" attr " Ġ/> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ< public Ġname =" normal _ attr " Ġtype =" attr " Ġ/> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ< public Ġname =" abc _ color _ highlight _ material " Ġtype =" color " Ġ/> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ< public Ġname =" local " Ġtype =" string " Ġ/> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ< public Ġname =" Base . Widget . Design . Tab Layout " Ġtype =" style " Ġ/> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ</ resources > ĊĠĠĠĠĠĠĠ Ġ""" . xml Format ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġcheck Nested Namespaces () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġoriginal Ġ= Ġ""" Ċ < level one Ġxmlns : android =" http :// schemas . android . com / apk / res / android " ĊĠĠĠĠĠĠĠĠĠ Ġxmlns : app =" http :// schemas . android . com / apk / res - auto " ĊĠĠĠĠĠĠĠĠĠ Ġapp : attr 1 ="@ bool / value "> ĊĊĠĠĠ Ġ< level two ĊĠĠĠĠĠĠĠ Ġandroid : attr 1 ="@ bool / value " ĊĠĠĠĠĠĠĠ Ġapp : attr 1 ="@ bool / value " ĊĠĠĠĠĠĠĠ Ġapp : attr 2 ="@ bool / value "> ĊĊĠĠĠĠĠĠĠ Ġ< level three ĊĠĠĠĠĠĠĠĠĠĠĠ Ġandroid : attr 3 ="@ bool / value " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapp : attr 3 ="@ bool / value " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapp : attr 4 ="@ bool / value " Ġ/> ĊĠĠĠ Ġ</ level two > Ċ Ċ </ level one > """ ĊĊĠĠĠĠĠĠĠ Ġval Ġname spaced Ġ= Ġ""" Ċ < level one Ġxmlns : android =" http :// schemas . android . com / apk / res / android " ĊĠĠĠĠĠĠĠĠĠ Ġxmlns : ns 0 =" http :// schemas . android . com / apk / res / dependency . one " ĊĠĠĠĠĠĠĠĠĠ Ġxmlns : ns 1 =" http :// schemas . android . com / apk / res / dependency . two " ĊĠĠĠĠĠĠĠĠĠ Ġns 0 : attr 1 ="@ * dependency . three : bool / value " Ġ> ĊĊĠĠĠ Ġ< level two ĊĠĠĠĠĠĠĠ Ġandroid : attr 1 ="@ * dependency . three : bool / value " ĊĠĠĠĠĠĠĠ Ġns 0 : attr 1 ="@ * dependency . three : bool / value " ĊĠĠĠĠĠĠĠ Ġns 1 : attr 2 ="@ * dependency . three : bool / value " Ġ> ĊĊĠĠĠĠĠĠĠ Ġ< level three ĊĠĠĠĠĠĠĠĠĠĠĠ Ġandroid : attr 3 ="@ * dependency . three : bool / value " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġns 0 : attr 3 ="@ * dependency . three : bool / value " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġns 1 : attr 4 ="@ * dependency . three : bool / value " Ġ/> ĊĠĠĠ Ġ</ level two > Ċ Ċ </ level one > """. xml Format () ĊĊĠĠĠĠĠĠĠ Ġval Ġmodule Table Ġ= ĠSymbol Table . builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. table Package (" com . example . module ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġval Ġdep One Table Ġ= ĠSymbol Table . builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. table Package (" dependency . one ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( symbol (" attr ", Ġ" attr 1 ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( symbol (" attr ", Ġ" attr 3 ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġval Ġdep Two Table Ġ= ĠSymbol Table . builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. table Package (" dependency . two ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( symbol (" attr ", Ġ" attr 2 ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( symbol (" attr ", Ġ" attr 4 ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġval Ġdep Three Table Ġ= ĠSymbol Table . builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. table Package (" dependency . three ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( symbol (" bool ", Ġ" value ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġval Ġnamespace Rew riter Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNamespace Rew riter ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠImmutableList . of ( module Table , Ġdep One Table , Ġdep Two Table , dep Three Table )) ĊĊĠĠĠĠĠĠĠ Ġcheck A ar Rewrite ( namespace Rew riter , Ġ" drawable / test . xml ", Ġoriginal , Ġname spaced ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġcheck Only Used Namespaces Are Added () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġoriginal Ġ= Ġ""" Ċ < node 1 ĊĠĠĠ Ġxmlns : foo =" http :// schemas . android . com / apk / res - auto " ĊĠĠĠ Ġfoo : attr 1 ="@ bool / value " ĊĠĠĠ Ġfoo : attr 2 ="@ bool / value "> ĊĊĠĠĠ Ġ< node 2 Ġfoo : attr 1 ="@ bool / value "> ĊĠĠĠĠĠĠĠ Ġ< node 3 Ġfoo : attr 3 ="@ bool / value "/> ĊĠĠĠ Ġ</ node 2 > Ċ Ċ </ node 1 > """ ĊĊĠĠĠĠĠĠĠ Ġval Ġre written Ġ= Ġ""" Ċ <? xml Ġversion =" 1 . 0 " Ġencoding =" utf - 8 "?> Ċ < node 1 ĊĠĠĠ Ġxmlns : ns 0 =" http :// schemas . android . com / apk / res / dep . a " ĊĠĠĠ Ġxmlns : ns 1 =" http :// schemas . android . com / apk / res / dep . b " ĊĠĠĠ Ġxmlns : ns 2 =" http :// schemas . android . com / apk / res / dep . c " ĊĠĠĠ Ġns 0 : attr 1 ="@ * com . module : bool / value " ĊĠĠĠ Ġns 1 : attr 2 ="@ * com . module : bool / value " Ġ> ĊĊĠĠĠ Ġ< node 2 Ġns 0 : attr 1 ="@ * com . module : bool / value " Ġ> ĊĠĠĠĠĠĠĠ Ġ< node 3 Ġns 2 : attr 3 ="@ * com . module : bool / value " Ġ/> ĊĠĠĠ Ġ</ node 2 > Ċ Ċ </ node 1 > """ ĊĊĠĠĠĠĠĠĠ Ġval Ġlocal Ġ= ĠSymbol Table . builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. table Package (" com . local ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġval Ġmodule Table Ġ= ĠSymbol Table . builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. table Package (" com . module ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( symbol (" bool ", Ġ" value ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġval Ġdep A Ġ= ĠSymbol Table . builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. table Package (" dep . a ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( symbol (" attr ", Ġ" attr 1 ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġval Ġdep B Ġ= ĠSymbol Table . builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. table Package (" dep . b ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( symbol (" attr ", Ġ" attr 2 ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġval Ġdep C Ġ= ĠSymbol Table . builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. table Package (" dep . c ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( symbol (" attr ", Ġ" attr 3 ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġval Ġunused 1 Ġ= ĠSymbol Table . builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. table Package (" dep . unused . one ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( symbol (" attr ", Ġ" attr 1 2 3 ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġval Ġunused 2 Ġ= ĠSymbol Table . builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. table Package (" dep . unused . two ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( symbol (" attr ", Ġ" attr 1 ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġval Ġunused 3 Ġ= ĠSymbol Table . builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. table Package (" dep . unused . three ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġval Ġnamespace Rew riter Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNamespace Rew riter ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠImmutableList . of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocal , Ġmodule Table , Ġdep A , Ġdep B , Ġdep C , Ġunused 1 , Ġunused 2 , Ġunused 3 )) ĊĊĠĠĠĠĠĠĠ Ġcheck A ar Rewrite ( namespace Rew riter , Ġ" drawable / test . xml ", Ġoriginal , Ġre written ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġcheck Res Auto At Inner Level () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfrom Ġ= Ġ""" <? xml Ġversion =" 1 . 0 " Ġencoding =" utf - 8 "?> Ċ < LinearLayout Ġ> ĊĊĠĠĠ Ġ< TextView ĊĠĠĠĠĠĠĠ Ġxmlns : app =" http :// schemas . android . com / apk / res - auto " ĊĠĠĠĠĠĠĠ Ġapp : layout _ constraint Top _ to Top Of =" parent " Ġ/> Ċ Ċ </ LinearLayout > """ ĊĠĠĠĠĠĠĠ Ġval Ġto Ġ= Ġ""" <? xml Ġversion =" 1 . 0 " Ġencoding =" utf - 8 "?> Ċ < LinearLayout ĊĠĠĠ Ġxmlns : ns 0 =" http :// schemas . android . com / apk / res / com . dependency "> ĊĊĠĠĠ Ġ< TextView ĊĠĠĠĠĠĠĠ Ġns 0 : layout _ constraint Top _ to Top Of =" parent " Ġ/> Ċ Ċ </ LinearLayout > """. xml Format () ĊĊĠĠĠĠĠĠĠ Ġval Ġlocal Ġ= ĠSymbol Table . builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. table Package (" com . local ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġval Ġdep Table Ġ= ĠSymbol Table . builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. table Package (" com . dependency ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( symbol (" attr ", Ġ" layout _ constraint Top _ to Top Of ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġval Ġnamespace Rew riter Ġ= ĠNamespace Rew riter ( ImmutableList . of ( local , Ġdep Table )) ĊĠĠĠĠĠĠĠ Ġcheck A ar Rewrite ( namespace Rew riter , Ġ" layout / layout . xml ", Ġfrom , Ġto ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġcheck Res Auto At Var ious Levels () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfrom Ġ= Ġ""" <? xml Ġversion =" 1 . 0 " Ġencoding =" utf - 8 "?> Ċ < LinearLayout ĊĠĠĠĠĠĠĠ Ġxmlns : top Level =" http :// schemas . android . com / apk / res - auto " ĊĠĠĠĠĠĠĠ Ġtop Level : attr 1 =" false "> ĊĊĠĠĠ Ġ< Element One ĊĠĠĠĠĠĠĠ Ġxmlns : inner One =" http :// schemas . android . com / apk / res - auto " ĊĠĠĠĠĠĠĠ Ġtop Level : attr 1 =" false " ĊĠĠĠĠĠĠĠ Ġinner One : attr 2 =" false "> ĊĊĠĠĠĠĠĠĠ Ġ< Element Two ĊĠĠĠĠĠĠĠĠĠĠĠ Ġxmlns : inner Two =" http :// schemas . android . com / apk / res - auto " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtop Level : attr 1 =" false " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinner One : attr 2 =" false " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinner Two : attr 3 =" false " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinner Two : attr 4 =" false " Ġ/> ĊĊĠĠĠ Ġ</ Element One > Ċ Ċ </ LinearLayout > """ ĊĠĠĠĠĠĠĠ Ġval Ġto Ġ= Ġ""" <? xml Ġversion =" 1 . 0 " Ġencoding =" utf - 8 "?> Ċ < LinearLayout ĊĠĠĠ Ġxmlns : ns 0 =" http :// schemas . android . com / apk / res / com . dependency . one " ĊĠĠĠ Ġxmlns : ns 1 =" http :// schemas . android . com / apk / res / com . dependency . two " ĊĠĠĠ Ġxmlns : ns 2 =" http :// schemas . android . com / apk / res / com . dependency . three " ĊĠĠĠ Ġns 0 : attr 1 =" false " Ġ> ĊĊĠĠĠ Ġ< Element One ĊĠĠĠĠĠĠĠ Ġns 0 : attr 1 =" false " ĊĠĠĠĠĠĠĠ Ġns 1 : attr 2 =" false " Ġ> ĊĊĠĠĠĠĠĠĠ Ġ< Element Two ĊĠĠĠĠĠĠĠĠĠĠĠ Ġns 0 : attr 1 =" false " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġns 0 : attr 3 =" false " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġns 1 : attr 2 =" false " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġns 2 : attr 4 =" false " Ġ/> ĊĠĠĠ Ġ</ Element One > Ċ Ċ </ LinearLayout > """ ĊĊĠĠĠĠĠĠĠ Ġval Ġlocal Ġ= ĠSymbol Table . builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. table Package (" com . local ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġval Ġdep One Ġ= ĠSymbol Table . builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. table Package (" com . dependency . one ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( symbol (" attr ", Ġ" attr 1 ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( symbol (" attr ", Ġ" attr 3 ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġval Ġdep Two Ġ= ĠSymbol Table . builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. table Package (" com . dependency . two ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( symbol (" attr ", Ġ" attr 2 ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġval Ġdep Three Ġ= ĠSymbol Table . builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. table Package (" com . dependency . three ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( symbol (" attr ", Ġ" attr 4 ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġval Ġnamespace Rew riter Ġ= ĠNamespace Rew riter ( ImmutableList . of ( local , Ġdep One , Ġdep Two , Ġdep Three )) ĊĠĠĠĠĠĠĠ Ġcheck A ar Rewrite ( namespace Rew riter , Ġ" layout / layout . xml ", Ġfrom , Ġto ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġnamespace Style ables Test () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠWe Ġneed Ġto Ġcheck Ġdifferent Ġscenarios : ĊĠĠĠĠĠĠĠ Ġ// Ġ- Ġstyle ables Ġthat Ġhave Ġno Ġchildren ĊĠĠĠĠĠĠĠ Ġ// Ġ- Ġchildren Ġthat Ġalready Ġhave Ġa Ġnamespace ĊĠĠĠĠĠĠĠ Ġ// Ġ- Ġchildren Ġthat Ġare Ġlocal Ġand Ġdon 't Ġneed Ġa Ġpackage ĊĠĠĠĠĠĠĠ Ġ// Ġ- Ġchildren Ġthat Ġare Ġremote Ġand Ġneed Ġto Ġbe Ġre written Ġto Ġcontain Ġa Ġpackage ĊĠĠĠĠĠĠĠ Ġval Ġold Table Ġ= ĠSymbol Table . builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. table Package (" com . local ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( Symbol . Style able Symbol ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" style able _ no _ children ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠImmutableList . of (), ĠImmutableList . of ())) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( Symbol . Style able Symbol ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" style able _ un changed _ remote _ children ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠImmutableList . of (), ĠImmutableList . of (" android : color ", Ġ" android : font "))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( Symbol . Style able Symbol ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" style able _ un changed _ local _ children ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠImmutableList . of (), ĠImmutableList . of (" local _ real _ attr ", Ġ" local _ maybe _ attr "))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( Symbol . Style able Symbol ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" style able _ changed _ remote _ children ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠImmutableList . of (), ĠImmutableList . of (" remote _ real _ attr "))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( Symbol . Style able Symbol ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" style able _ mixed ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠImmutableList . of (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠImmutableList . of (" android : color ", Ġ" local _ maybe _ attr ", Ġ" remote _ real _ attr "))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( symbol (" attr ", Ġ" local _ real _ attr ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( symbol (" attr ", Ġ" local _ maybe _ attr ", Ġtrue )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġval Ġremote Table Ġ= ĠSymbol Table . builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. table Package (" com . remote ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( symbol (" attr ", Ġ" remote _ real _ attr ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġval Ġnamespace Rew riter Ġ= ĠNamespace Rew riter ( ImmutableList . of ( old Table , Ġremote Table )) ĊĠĠĠĠĠĠĠ Ġval Ġfixed Table Builder Ġ= ĠSymbol Table . builder (). table Package (" com . local ") ĊĠĠĠĠĠĠĠ Ġnamespace Rew riter ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. namespace Style ables ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġold Table . get Symbol By ResourceType ( ResourceType . STYLE ABLE ), Ġfixed Table Builder ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠCheck Ġall Ġstyle ables Ġwere Ġkept . ĊĠĠĠĠĠĠĠ Ġval Ġfixed Table Ġ= Ġfixed Table Builder . build () ĊĠĠĠĠĠĠĠ ĠassertThat ( fixed Table . get Symbol By ResourceType ( ResourceType . STYLE ABLE )). has Size ( 5 ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠCheck Ġno Ġextra Ġchildren Ġwere Ġadded . ĊĠĠĠĠĠĠĠ Ġval Ġno Children Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfixed Table . symbols . get ( ResourceType . STYLE ABLE , Ġ" style able _ no _ children ") ĊĠĠĠĠĠĠĠ ĠassertThat ( no Children . children ). isEmpty () ĊĊĠĠĠĠĠĠĠ Ġ// ĠCheck Ġchildren Ġwith Ġnamespaces Ġaren 't Ġmodified . ĊĠĠĠĠĠĠĠ Ġval Ġunchanged Remote Children Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfixed Table . symbols . get ( ResourceType . STYLE ABLE , Ġ" style able _ un changed _ remote _ children ") ĊĠĠĠĠĠĠĠ ĠassertThat ( un changed Remote Children . children ). has Size ( 2 ) ĊĠĠĠĠĠĠĠ ĠassertThat ( un changed Remote Children . children ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. contains Exactly (" android : color ", Ġ" android : font ") ĊĊĠĠĠĠĠĠĠ Ġ// ĠCheck Ġlocal Ġchildren Ġ( defined Ġas Ġattrs Ġor Ġonly Ġunder Ġstyle ables ) Ġare Ġnot Ġmodified . ĊĠĠĠĠĠĠĠ Ġval Ġunchanged Local Children Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfixed Table . symbols . get ( ResourceType . STYLE ABLE , Ġ" style able _ un changed _ local _ children ") ĊĠĠĠĠĠĠĠ ĠassertThat ( un changed Local Children . children ). has Size ( 2 ) ĊĠĠĠĠĠĠĠ ĠassertThat ( un changed Local Children . children ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. contains Exactly (" local _ real _ attr ", Ġ" local _ maybe _ attr ") ĊĊĠĠĠĠĠĠĠ Ġ// ĠCheck Ġthat Ġremote Ġchild Ġnow Ġhas Ġa Ġpackage . ĊĠĠĠĠĠĠĠ Ġval Ġchanged Remote Children Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfixed Table . symbols . get ( ResourceType . STYLE ABLE , Ġ" style able _ changed _ remote _ children ") ĊĠĠĠĠĠĠĠ ĠassertThat ( changed Remote Children . children ). has Size ( 1 ) ĊĠĠĠĠĠĠĠ ĠassertThat ( changed Remote Children . children ). contains Exactly (" com . remote : remote _ real _ attr ") ĊĊĠĠĠĠĠĠĠ Ġ// ĠAnd Ġfinally Ġcheck Ġmixed Ġcase . ĊĠĠĠĠĠĠĠ Ġval Ġmixed Ġ= Ġfixed Table . symbols . get ( ResourceType . STYLE ABLE , Ġ" style able _ mixed ") ĊĠĠĠĠĠĠĠ ĠassertThat ( mixed . children ). has Size ( 3 ) ĊĠĠĠĠĠĠĠ ĠassertThat ( mixed . children ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. contains Exactly (" android : color ", Ġ" local _ maybe _ attr ", Ġ" com . remote : remote _ real _ attr ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcheck A ar Rewrite ( ĊĠĠĠĠĠĠĠ Ġnamespace Rew riter : ĠNamespace Rew riter , ĊĠĠĠĠĠĠĠ Ġpath : ĠString , ĊĠĠĠĠĠĠĠ Ġfrom : ĠString , ĊĠĠĠĠĠĠĠ Ġto : ĠString ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfile System Ġ= ĠJim fs . new FileSystem ( Configuration . unix ()) ĊĠĠĠĠĠĠĠ Ġval Ġoutput Dir Ġ= Ġfile System . getPath ("/ tmp / re written A ar ") ĊĠĠĠĠĠĠĠ Ġval Ġa ar Res Ġ= Ġfile System . getPath ("/ tmp / a ars / some Res ") ĊĠĠĠĠĠĠĠ Ġval Ġinput File Ġ= Ġa ar Res . resolve ( path ) ĊĠĠĠĠĠĠĠ ĠFiles . create Directories ( inputFile . parent ) ĊĠĠĠĠĠĠĠ ĠFiles . write ( inputFile , Ġfrom . toByteArray ()) ĊĠĠĠĠĠĠĠ Ġnamespace Rew riter . rewrite A ar Resources ( aar Res , Ġoutput Dir ) ĊĠĠĠĠĠĠĠ Ġval ĠoutputFile Ġ= Ġoutput Dir . resolve ( path ) ĊĠĠĠĠĠĠĠ ĠassertThat ( outputFile ). exists () ĊĠĠĠĠĠĠĠ ĠassertThat ( outputFile . parent . list ()). has Size ( 1 ) ĊĠĠĠĠĠĠĠ ĠassertThat ( output Dir . list ()). has Size ( 1 ) ĊĠĠĠĠĠĠĠ ĠassertThat ( Files . read All Lines ( outputFile ). join ToString ("\ n "). trim ()). isEqualTo ( to . trim ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠPath . list (): ĠList < Path > Ġ= ĊĠĠĠĠĠĠĠ ĠFiles . list ( this ). use Ġ{ Ġit . collect ( ImmutableList . to ImmutableList ()) Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠString . xml Format (): ĠString Ġ= ĊĠĠĠĠĠĠĠ ĠPosition Xml Parser . parse ( this ). let Ġ{ Ġdoc Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠXml PrettyPrinter . pretty Print ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdoc , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠXml Format Preferences . defaults (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠXml Format Style . get ( doc ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"\ n ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} Ċ } Ċ