/* Ċ Ġ* ĠCopyright Ġ 2 0 2 1 Ġ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 Ġandroidx . gl ance . app widget . layout generator Ċ Ċ import Ġorg . w 3 c . dom . Document Ċ import Ġorg . w 3 c . dom . Node Ċ import Ġjava . io . File Ċ import Ġjavax . xml . parsers . Document BuilderFactory Ċ import Ġjavax . xml . transform . Output Keys Ċ import Ġjavax . xml . transform . Transformer Factory Ċ import Ġjavax . xml . transform . dom . DOM Source Ċ import Ġjavax . xml . transform . stream . Stream Result Ċ Ċ /** Ċ Ġ* ĠGenerate Ġthe Ġlayouts Ġfrom Ġthe Ġtemplates Ġprovided Ġto Ġthe Ġtask . Ċ Ġ* Ċ Ġ* ĠFor Ġeach Ġlayout Ġtemplate , Ġ 1 8 Ġlayouts Ġare Ġcreated : Ġ 9 Ġsimple Ġand Ġ 9 Ġcomplex . ĠThe Ġsimple Ġlayouts Ċ Ġ* Ġare Ġthere Ġto Ġcreate Ġnon - resizable Ġviews , Ġwhile Ġcomplex Ġlayouts Ġare Ġthere Ġto Ġcreate Ġres izable Ċ Ġ* Ġlayouts Ġ( i . e . Ġlayout Ġwith Ġat Ġleast Ġone Ġdimension Ġsets Ġexplicitly Ġin Ġdip ). Ċ Ġ* Ċ Ġ* ĠA Ġlayout Ġshould Ġbe Ġof Ġthe Ġform : Ċ Ġ* Ċ Ġ* Ġ``` Ċ Ġ* Ġ< Target View Ġprop 1 ="" Ġ... Ġ/> Ċ Ġ* Ġ``` Ċ Ġ* Ċ Ġ* ĠFor Ġexample , Ġfor Ġthe Ġrow : Ċ Ġ* Ċ Ġ* Ġ``` Ċ Ġ* Ġ< LinearLayout Ġxmlns : android =" http :// schemas . android . com / apk / res / android " Ċ Ġ* ĠĠĠĠ Ġandroid : orientation =" horizontal " Ġ/> Ċ Ġ* Ġ``` Ċ Ġ* Ċ Ġ* ĠThe Ġtemplate Ġshould Ġnot Ġdefine Ġthe Ġview Ġid , Ġor Ġthe Ġdesired Ġwidth Ġand Ġheight Ġof Ġthe Ġview . Ċ Ġ*/ Ċ internal Ġclass ĠLayout Generator Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġdocument BuilderFactory Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠDocument BuilderFactory . newInstance (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Namespace Aware Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġdocument Builder Ġby Ġlazy Ġ{ Ġdocument BuilderFactory . new Document Builder () !! Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġtransformer Factory Ġby Ġlazy Ġ{ ĠTransformer Factory . newInstance () Ġ} ĊĊĠĠĠ Ġfun Ġparse Layout Template ( input : ĠFile ): ĠDocument Ġ= Ġdocument Builder . parse ( input ) ĊĊĠĠĠ Ġfun Ġwrite Generated Layout ( document : ĠDocument , Ġoutput : ĠFile ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtransformer Factory . new Transformer (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Output Property ( Output Keys . IND ENT , Ġ" yes ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransform ( DOM Source ( document ), ĠStream Result ( output )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġextract Main View Id ( document : ĠDocument ) Ġ= ĊĠĠĠĠĠĠĠ Ġdocument . documentElement . android Id ?. textContent ?. replace ("@ id /", Ġ"") Ġ?: Ġ" gl ance View " ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGenerate Ġfiles Ġand Ġreturn Ġa Ġmapping Ġfrom ĠFile Ġobject Ġto Ġa Ġstructure Ġdefining Ġuseful ĊĠĠĠĠ Ġ* Ġinformation Ġextracted Ġfrom Ġthe Ġinput . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġgenerate All Files ( files : ĠList < File >, Ġoutput Resources Dir : ĠFile ): ĠMap < File , ĠLayout Properties > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġoutput Layout Dir Ġ= Ġoutput Resources Dir . resolve (" layout ") ĊĠĠĠĠĠĠĠ Ġoutput Layout Dir . mkdir s () ĊĠĠĠĠĠĠĠ Ġgenerate Size Layouts ( output Layout Dir ) ĊĠĠĠĠĠĠĠ Ġgenerate Child Layouts ( output Layout Dir ) ĊĠĠĠĠĠĠĠ Ġreturn Ġfiles . associate With Ġ{ Ġgenerate For File ( it , Ġoutput Layout Dir ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate Size Layouts ( output Layout Dir : ĠFile ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstub Sizes Ġ= ĠlistOf ( Valid Size . Wrap , ĠValid Size . Match ) ĊĠĠĠĠĠĠĠ ĠforEach In Cross Product ( stub Sizes , Ġstub Sizes ) Ġ{ Ġwidth , Ġheight Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠfileName Ġ= Ġ" size _${ width . resourceName }_${ height . resourceName }. xml " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgenerate File ( output Layout Dir , ĠfileName ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġroot Ġ= ĠcreateElement (" TextView ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend Child ( root ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroot . attributes . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Named Item ( android Namespace ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Named Item NS ( android Width ( width )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Named Item NS ( android Height ( height )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate Child Layouts ( output Layout Dir : ĠFile ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( child Count Ġin Ġ 1 .. Max Children ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgenerate File ( output Layout Dir , Ġget Child Merge Filename ( child Count )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġroot Ġ= ĠcreateElement (" merge ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend Child ( root ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroot . attributes . apply Ġ{ Ġset Named Item ( android Namespace ) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrepeat ( child Count ) Ġ{ Ġindex Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstub Ġ= ĠcreateElement (" View Stub ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroot . appendChild ( stub ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstub . attributes . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Named Item NS ( android Id ("@ id / stub $ index ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Named Item NS ( android Width ( Valid Size . Wrap )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Named Item NS ( android Height ( Valid Size . Wrap )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate For File ( file : ĠFile , Ġoutput Layout Dir : ĠFile ): ĠLayout Properties Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdocument Ġ= Ġparse Layout Template ( file ) ĊĠĠĠĠĠĠĠ ĠforEach Configuration ( file ) Ġ{ Ġwidth , Ġheight , Ġchild Count Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Generated Layout ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgenerate Simple Layout ( document , Ġwidth , Ġheight , Ġchild Count ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput Layout Dir . resolve ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmake Simple ResourceName ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwidth , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheight , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchild Count ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ+ Ġ". xml " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Generated Layout ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgenerate Complex Layout ( document , Ġwidth , Ġheight , Ġchild Count ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput Layout Dir . resolve ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmake Complex ResourceName ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwidth , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheight , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchild Count ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ+ Ġ". xml " ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠLayout Properties ( main View Id Ġ= Ġextract Main View Id ( document )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGenerate Ġa Ġsimple Ġlayout . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠA Ġsimple Ġlayout Ġonly Ġcontains Ġthe Ġview Ġitself , Ġset Ġup Ġfor Ġa Ġgiven Ġwidth Ġand Ġheight . ĊĠĠĠĠ Ġ* ĠOn ĠAndroid ĠR - , Ġsimple Ġlayouts Ġare Ġnon - resizable . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġgenerate Simple Layout ( ĊĠĠĠĠĠĠĠ Ġdocument : ĠDocument , ĊĠĠĠĠĠĠĠ Ġwidth : ĠValid Size , ĊĠĠĠĠĠĠĠ Ġheight : ĠValid Size , ĊĠĠĠĠĠĠĠ Ġchild Count : ĠInt ĊĠĠĠ Ġ): ĠDocument Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġgenerated Ġ= Ġdocument Builder . new Document () ĊĠĠĠĠĠĠĠ Ġval Ġroot Ġ= Ġgenerated . import Node ( document . documentElement , Ġtrue ) ĊĠĠĠĠĠĠĠ Ġgenerated . appendChild ( root ) ĊĠĠĠĠĠĠĠ Ġroot . attributes . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Named Item ( generated . android Namespace ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( root . android Id Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Named Item NS ( generated . android Id ("@ id / gl ance View ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Named Item NS ( generated . android Width ( width )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Named Item NS ( generated . android Height ( height )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( width Ġ== ĠValid Size . Expand Ġ|| Ġheight Ġ== ĠValid Size . Expand ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Named Item NS ( generated . android Weight ( 1 )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Named Item NS ( generated . android Layout Direction (" locale ")) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġappend View Stub s ( root , Ġchild Count ) ĊĠĠĠĠĠĠĠ Ġreturn Ġgenerated ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGenerate Ġa Ġcomplex Ġlayout . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠA Ġcomplex Ġlayout Ġcontains Ġa ĠRelative Layout Ġcontaining Ġthe Ġtarget Ġview Ġand Ġa ĠTextView , ĊĠĠĠĠ Ġ* Ġwhich Ġwill Ġbe Ġused Ġto Ġresize Ġthe Ġtarget Ġview . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠComplex Ġlayouts Ġare Ġalways Ġres izable . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThe Ġcomplex Ġlayouts Ġfollow Ġthe Ġfollowing Ġpattern : ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ``` ĊĠĠĠĠ Ġ* Ġ< Relative Layout Ġxmlns : android =" http :// schemas . android . com / apk / res / android " ĊĠĠĠĠ Ġ* ĠĠĠĠ Ġandroid : id ="@ id / relative Layout " ĊĠĠĠĠ Ġ* ĠĠĠĠ Ġandroid : layout _ height =" match _ parent " ĊĠĠĠĠ Ġ* ĠĠĠĠ Ġandroid : layout _ width =" wrap _ content "> ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠĠ Ġ< TextView ĊĠĠĠĠ Ġ* ĠĠĠĠĠĠ Ġandroid : id ="@ id / size View " ĊĠĠĠĠ Ġ* ĠĠĠĠĠĠ Ġandroid : layout _ height =" match _ parent " ĊĠĠĠĠ Ġ* ĠĠĠĠĠĠ Ġandroid : layout _ width =" wrap _ content "/> ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠĠ Ġ< Target View ĊĠĠĠĠ Ġ* ĠĠĠĠĠĠ Ġandroid : id ="@ id / gl ance View " ĊĠĠĠĠ Ġ* ĠĠĠĠĠĠ Ġandroid : layout _ height =" wrap _ content " ĊĠĠĠĠ Ġ* ĠĠĠĠĠĠ Ġandroid : layout _ width =" wrap _ content " ĊĠĠĠĠ Ġ* ĠĠĠĠĠĠ Ġandroid : layout _ align Bottom ="@ id / size View " ĊĠĠĠĠ Ġ* ĠĠĠĠĠĠ Ġandroid : layout _ align Left ="@ id / size View " ĊĠĠĠĠ Ġ* ĠĠĠĠĠĠ Ġandroid : layout _ align Right ="@ id / size View " ĊĠĠĠĠ Ġ* ĠĠĠĠĠĠ Ġandroid : layout _ align Top ="@ id / size View " Ġ/> ĊĠĠĠĠ Ġ* Ġ</ Relative Layout > ĊĠĠĠĠ Ġ* Ġ``` ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThe Ġwidth Ġand Ġheight Ġof Ġthe Ġtarget Ġview Ġare Ġalways Ġset Ġto Ġ` wrap _ content `, Ġso ĊĠĠĠĠ Ġ* Ġ` wrap _ content ` Ġon Ġthe Ġ` TextView ` Ġworks Ġproperly . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThe Ġwidth Ġand Ġheight Ġon Ġthe Ġ` Relative Layout ` Ġare Ġset Ġto Ġbe Ġwhat Ġwe Ġwant Ġto Ġachieve . ĠIf Ġthe ĊĠĠĠĠ Ġ* Ġdesired Ġdimension Ġis Ġ` Expand `, Ġa Ġweight Ġof Ġ 1 Ġis Ġspecified . ĠThis Ġimplies Ġwe Ġcannot Ġlet Ġthe ĊĠĠĠĠ Ġ* Ġdeveloper Ġcontrol Ġthe Ġproportion Ġof Ġthe Ġspace Ġused Ġby Ġa Ġparticular Ġview , Ġbut Ġthere Ġis Ġno ĊĠĠĠĠ Ġ* Ġway Ġto Ġcontrol Ġthis Ġprogram matically , Ġand Ġallowing Ġeven Ġa Ġfew Ġstandard Ġvalues Ġwould ĊĠĠĠĠ Ġ* Ġincrease Ġdr astic ally Ġthe Ġnumber Ġof Ġgenerated Ġlayouts . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThe Ġwidth Ġand Ġheight Ġof Ġthe Ġ` TextView ` Ġare Ġ` match _ parent ` Ġby Ġdefault , Ġunless Ġthe Ġdesired ĊĠĠĠĠ Ġ* Ġdimension Ġis Ġ` wrap _ content `, Ġin Ġwhich Ġcase Ġit Ġis Ġalso Ġset Ġto Ġ` wrap _ content `. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġgenerate Complex Layout ( ĊĠĠĠĠĠĠĠ Ġdocument : ĠDocument , ĊĠĠĠĠĠĠĠ Ġwidth : ĠValid Size , ĊĠĠĠĠĠĠĠ Ġheight : ĠValid Size , ĊĠĠĠĠĠĠĠ Ġchild Count : ĠInt ĊĠĠĠ Ġ): ĠDocument Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġgenerated Ġ= Ġdocument Builder . new Document () ĊĠĠĠĠĠĠĠ Ġval Ġroot Ġ= Ġgenerated . createElement (" Relative Layout ") ĊĠĠĠĠĠĠĠ Ġgenerated . appendChild ( root ) ĊĠĠĠĠĠĠĠ Ġroot . attributes . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Named Item NS ( generated . android Id ("@ id / relative Layout ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Named Item NS ( generated . android Width ( width )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Named Item NS ( generated . android Height ( height )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( width Ġ== ĠValid Size . Expand Ġ|| Ġheight Ġ== ĠValid Size . Expand ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Named Item NS ( generated . android Weight ( 1 )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( width Ġ== ĠValid Size . Fixed Ġ|| Ġheight Ġ== ĠValid Size . Fixed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠA Ġs izing Ġview Ġis Ġonly Ġrequired Ġif Ġthe Ġwidth Ġor Ġheight Ġare Ġfixed . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsize View Ġ= Ġgenerated . createElement (" Frame Layout ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġroot . appendChild ( size View ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsize View . attributes . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Named Item NS ( generated . android Id ("@ id / size View ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Named Item NS ( generated . android Width ( Valid Size . Wrap )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Named Item NS ( generated . android Height ( Valid Size . Wrap )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsize View Stub Ġ= Ġgenerated . createElement (" View Stub ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsize View . appendChild ( size View Stub ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsize View Stub . attributes . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Named Item NS ( generated . android Id ("@ id / size View Stub ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Named Item NS ( generated . android Width ( Valid Size . Wrap )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Named Item NS ( generated . android Height ( Valid Size . Wrap )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġmain Node Ġ= Ġgenerated . import Node ( document . documentElement , Ġtrue ) ĊĠĠĠĠĠĠĠ Ġroot . appendChild ( main Node ) ĊĠĠĠĠĠĠĠ Ġmain Node . attributes . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( main Node . android Id Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Named Item NS ( generated . android Id ("@ id / gl ance View ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( width ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠValid Size . Wrap Ġ-> Ġset Named Item NS ( generated . android Width ( Valid Size . Wrap )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠValid Size . Match , ĠValid Size . Expand Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Named Item NS ( generated . android Width ( Valid Size . Match )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠValid Size . Fixed Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġthe Ġview 's Ġheight Ġis Ġfixed , Ġits Ġheight Ġis Ġdetermined Ġby Ġsize View . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠUse Ġ 0 dp Ġwidth Ġfor Ġefficiency . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Named Item NS ( generated . android Width ( Valid Size . Expand )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Named Item NS ( generated . android Attr (" layout _ align Left ", Ġ"@ id / size View ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Named Item NS ( generated . android Attr (" layout _ align Right ", Ġ"@ id / size View ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. let Ġ{} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( height ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠValid Size . Wrap Ġ-> Ġset Named Item NS ( generated . android Height ( Valid Size . Wrap )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠValid Size . Match , ĠValid Size . Expand Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Named Item NS ( generated . android Height ( Valid Size . Match )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠValid Size . Fixed Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġthe Ġview 's Ġheight Ġis Ġfixed , Ġits Ġheight Ġis Ġdetermined Ġby Ġsize View . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠUse Ġ 0 dp Ġwidth Ġfor Ġefficiency . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Named Item NS ( generated . android Height ( Valid Size . Expand )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Named Item NS ( generated . android Attr (" layout _ align Top ", Ġ"@ id / size View ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Named Item NS ( generated . android Attr (" layout _ align Bottom ", Ġ"@ id / size View ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. let Ġ{} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Named Item NS ( generated . android Layout Direction (" locale ")) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġappend View Stub s ( main Node , Ġchild Count ) ĊĠĠĠĠĠĠĠ Ġreturn Ġgenerated ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinline Ġfun Ġgenerate File ( ĊĠĠĠĠĠĠĠ Ġoutput Layout Dir : ĠFile , ĊĠĠĠĠĠĠĠ Ġfilename : ĠString , ĊĠĠĠĠĠĠĠ Ġbuilder : ĠDocument . () Ġ-> ĠUnit ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdocument Ġ= Ġdocument Builder . new Document () ĊĠĠĠĠĠĠĠ Ġbuilder ( document ) ĊĠĠĠĠĠĠĠ Ġwrite Generated Layout ( document , Ġoutput Layout Dir . resolve ( filename )) ĊĠĠĠ Ġ} Ċ } Ċ Ċ internal Ġfun Ġappend View Stub s ( node : ĠNode , Ġchild Count : ĠInt ) Ġ{ ĊĠĠĠ Ġif Ġ( child Count Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinclude Ġ= Ġnode . owner Document . createElement (" include ") ĊĠĠĠĠĠĠĠ Ġnode . appendChild ( include ) ĊĠĠĠĠĠĠĠ Ġinclude . attributes . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Named Item ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode . owner Document . include ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"@ layout /" Ġ+ Ġget Child Merge Filename Without Extension ( child Count ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ internal Ġdata Ġclass ĠLayout Properties ( ĊĠĠĠ Ġval Ġmain View Id : ĠString Ċ ) Ċ Ċ internal Ġenum Ġclass ĠValid Size ( val Ġandroid Value : ĠString , Ġval Ġresource Name : ĠString ) Ġ{ ĊĠĠĠ ĠWrap (" wrap _ content ", Ġ" wrap "), ĊĠĠĠ ĠFixed (" wrap _ content ", Ġ" fixed "), ĊĠĠĠ ĠMatch (" match _ parent ", Ġ" match "), ĊĠĠĠ ĠExpand (" 0 dp ", Ġ" expand ") Ċ } Ċ Ċ internal Ġfun Ġget Child Merge Filename ( child Count : ĠInt ) Ġ= ĊĠĠĠ Ġget Child Merge Filename Without Extension ( child Count ) Ġ+ Ġ". xml " Ċ internal Ġfun Ġget Child Merge Filename Without Extension ( child Count : ĠInt ) Ġ= Ġ" merge _${ child Count } child " Ċ Ċ private Ġval ĠAndroid NS Ġ= Ġ" http :// schemas . android . com / apk / res / android " Ċ Ċ internal Ġfun ĠDocument . android Attr ( name : ĠString , Ġvalue : ĠString ) Ġ= ĊĠĠĠ Ġcreate Attribute NS ( Android NS , Ġ" android :$ name "). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġtext Content Ġ= Ġvalue ĊĠĠĠ Ġ} Ċ Ċ internal Ġfun ĠNode . android Attr ( name : ĠString ): ĠNode ? Ġ= ĊĠĠĠ Ġattributes . getName d Item NS ( Android NS , Ġname ) Ċ Ċ internal Ġfun ĠDocument . android Id ( value : ĠString ) Ġ= Ġandroid Attr (" id ", Ġvalue ) Ċ Ċ internal Ġval ĠNode . android Id : ĠNode ? ĊĠĠĠ Ġget () Ġ= Ġandroid Attr (" id ") Ċ Ċ internal Ġfun ĠDocument . android Width ( value : ĠValid Size ) Ġ= ĊĠĠĠ Ġandroid Attr (" layout _ width ", Ġvalue . android Value ) Ċ Ċ internal Ġfun ĠDocument . android Height ( value : ĠValid Size ) Ġ= ĊĠĠĠ Ġandroid Attr (" layout _ height ", Ġvalue . android Value ) Ċ Ċ internal Ġfun ĠDocument . android Weight ( value : ĠInt ) Ġ= Ġandroid Attr (" layout _ weight ", Ġvalue . toString ()) Ċ Ċ internal Ġfun ĠDocument . android Layout Direction ( value : ĠString ) Ġ= ĊĠĠĠ Ġandroid Attr (" layout Direction ", Ġvalue ) Ċ Ċ internal Ġfun ĠDocument . include ( layout : ĠString ) Ġ= ĊĠĠĠ Ġcreate Attribute (" layout "). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġtext Content Ġ= Ġlayout ĊĠĠĠ Ġ} Ċ Ċ internal Ġval ĠDocument . android Namespace ĊĠĠĠ Ġget () Ġ= Ġcreate Attribute (" xmlns : android "). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġtext Content Ġ= ĠAndroid NS ĊĠĠĠ Ġ} Ċ Ċ internal Ġinline Ġfun ĠforEach Configuration ( ĊĠĠĠ Ġfile : ĠFile , ĊĠĠĠ Ġfunction : Ġ( width : ĠValid Size , Ġheight : ĠValid Size , Ġchild Count : ĠInt ) Ġ-> ĠUnit Ċ ) Ġ{ ĊĠĠĠ ĠValid Size . values (). forEach Ġ{ Ġwidth Ġ-> ĊĠĠĠĠĠĠĠ ĠValid Size . values (). forEach Ġ{ Ġheight Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile . all Child Counts (). forEach Ġ{ Ġchild Count Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfunction ( width , Ġheight , Ġchild Count ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ