/* Ċ Ġ* Ġ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 . tools . idea . ui builder . property 2 Ċ Ċ import Ġcom . android . Sdk Constants . ANDROID _ PKG _ PREFIX Ċ import Ġcom . android . Sdk Constants . ANDROID _ SUPPORT _ PKG _ PREFIX Ċ import Ġcom . android . Sdk Constants . ANDROID _ URI Ċ import Ġcom . android . Sdk Constants . ATTR _ ID Ċ import Ġcom . android . Sdk Constants . ATTR _ P ADDING _ END Ċ import Ġcom . android . Sdk Constants . ATTR _ P ADDING _ START Ċ import Ġcom . android . Sdk Constants . ATTR _ POP UP _ BACKGROUND Ċ import Ġcom . android . Sdk Constants . ATTR _ SRC Ċ import Ġcom . android . Sdk Constants . ATTR _ SRC _ COMPAT Ċ import Ġcom . android . Sdk Constants . ATTR _ THEME Ċ import Ġcom . android . Sdk Constants . AUTO _ COMPLETE _ TEXT _ VIEW Ċ import Ġcom . android . Sdk Constants . AUTO _ URI Ċ import Ġcom . android . Sdk Constants . FQ CN _ AUTO _ COMPLETE _ TEXT _ VIEW Ċ import Ġcom . android . ide . common . rendering . api . Attribute Format Ċ import Ġcom . android . ide . common . rendering . api . Resource Namespace Ċ import Ġcom . android . ide . common . rendering . api . Resource Reference Ċ import Ġcom . android . resources . ResourceType Ċ import Ġcom . android . tools . idea . common . model . Nl Component Ċ import Ġcom . android . tools . idea . lint . common . Lint Ide Client Ċ import Ġcom . android . tools . property . panel . api . Properties Table Ċ import Ġcom . android . tools . idea . model . Android Module Info Ċ import Ġcom . android . tools . idea . ui builder . model . has Nl Component Info Ċ import Ġcom . android . tools . idea . ui builder . model . view Info Ċ import Ġcom . android . tools . idea . ui builder . property 2 . support . Type Resolver Ċ import Ġcom . google . common . collect . Hash Based Table Ċ import Ġcom . google . common . collect . Immutable Table Ċ import Ġcom . google . common . collect . Table Ċ import Ġcom . intellij . openapi . application . Application Manager Ċ import Ġcom . intellij . openapi . diagnostic . Logger Ċ import Ġcom . intellij . openapi . project . D umb Service Ċ import Ġcom . intellij . psi . Java Psi Facade Ċ import Ġcom . intellij . psi . Psi Class Ċ import Ġcom . intellij . psi . search . Global Search Scope Ċ import Ġcom . intellij . psi . util . Psi Tree Util Ċ import Ġcom . intellij . psi . xml . Xml Tag Ċ import Ġcom . intellij . xml . Namespace Aware XmlAttribute Descriptor Ċ import Ġcom . intellij . xml . XmlAttribute Descriptor Ċ import Ġorg . jetbrains . android . dom . Android Dom Element Descriptor Provider Ċ import Ġorg . jetbrains . android . dom . Attribute Processing Util Ċ import Ġorg . jetbrains . android . dom . attrs . Attribute Definition Ċ import Ġorg . jetbrains . android . dom . attrs . Attribute Definitions Ċ import Ġorg . jetbrains . android . facet . Android Facet Ċ import Ġorg . jetbrains . android . resource Managers . Module Resource Managers Ċ import Ġjava . awt . EventQueue Ċ import Ġjava . util . ArrayList Ċ Ċ private Ġconst Ġval ĠEXPECT ED _ ROWS Ġ= Ġ 3 Ċ private Ġconst Ġval ĠEXPECT ED _ CELL S _ PER _ ROW Ġ= Ġ 1 0 Ċ Ċ /** Ċ Ġ* ĠProperties Ġgenerator Ġfor ĠNe le . Ċ Ġ* Ċ Ġ* ĠGiven Ġa Ġlist Ġof Ġ[ Nl Component ] s Ġgenerate Ġa Ġtable Ġwith Ġall Ġthe Ġproperties Ċ Ġ* Ġthe Ġcomponents Ġhave Ġin Ġcommon . ĠOnly Ġattributes Ġthat Ġare Ġavailable Ġfor Ċ Ġ* Ġall Ġversions Ġdown Ġto Ġand Ġincluding Ġmin Sdk Version Ġwill Ġbe Ġincluded . Ċ Ġ* Ċ Ġ* ĠIf Ġlayout lib Ġinfl ated Ġa Ġdifferent Ġview Ġclass , Ġadd Ġthe Ġattributes Ġfrom Ċ Ġ* Ġthat Ġview Ġas Ġwell Ġ( unless Ġan Ġexisting Ġframework Ġattribute Ġexists ). Ċ Ġ* Ċ Ġ* ĠThere Ġare Ġspecial Ġexceptions Ġfor Ġthe Ġsrc Compat Ġattribute Ġand Ġattributes Ċ Ġ* Ġon Ġan ĠAuto Complete TextView Ġwidget . Ċ Ġ*/ Ċ class ĠNe le Properties Provider ( private Ġval Ġfacet : ĠAndroid Facet ): ĠProperties Provider Ġ{ ĊĊĠ Ġoverride Ġfun Ġget Properties ( model : ĠNe le Properties Model , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoptional Value : ĠAny ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomponents : ĠList < Nl Component >): ĠProperties Table < Ne le Property Item > Ġ{ ĊĠĠĠ Ġassert (! EventQueue . is Dispatch Thread () Ġ|| ĠApplication Manager . getApplication (). is UnitTest Mode ) ĊĊĠĠĠ Ġif Ġ( components . isEmpty ()) Ġ{ ĊĠĠĠĠĠ Ġreturn ĠProperties Table . empty Table () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġproject Ġ= Ġfacet . module . project ĊĠĠĠ Ġval Ġresource Managers Ġ= ĠModule Resource Managers . getInstance ( facet ) ĊĠĠĠ Ġval Ġlocal ResourceManager Ġ= Ġresource Managers . local ResourceManager ĊĠĠĠ Ġval Ġframework ResourceManager Ġ= Ġresource Managers . framework ResourceManager ĊĠĠĠ Ġval Ġlocal Attr Defs Ġ= Ġlocal ResourceManager . attribute Definitions ĊĠĠĠ Ġval Ġsystem Attr Defs Ġ= Ġframework ResourceManager ?. attribute Definitions ĊĊĠĠĠ Ġif Ġ( framework ResourceManager Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠ ĠLogger . getInstance ( Ne le Properties Provider :: class . java ). error (" No Ġsystem Ġresource Ġmanager Ġfor Ġmodule : Ġ" Ġ+ Ġfacet . module . name ) ĊĠĠĠĠĠ Ġreturn ĠProperties Table . empty Table () ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( system Attr Defs Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġreturn ĠProperties Table . empty Table () ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġgenerator Ġ= ĠProperties Generator ( facet , Ġmodel , Ġcomponents , Ġlocal Attr Defs , Ġsystem Attr Defs ) ĊĊĠĠĠ Ġreturn ĠD umb Service . getInstance ( project ). run Read Action In Smart Mode < Properties Table < Ne le Property Item >> Ġ{ ĊĠĠĠĠĠ ĠProperties Table . create ( generator . generate ()) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġcreate Empty Table (): ĠProperties Table < Ne le Property Item > Ġ= ĊĠĠĠ ĠProperties Table . create ( Hash Based Table . create ( EXPECTED _ ROWS , ĠEXPECT ED _ CELL S _ PER _ ROW )) ĊĊĠ Ġprivate Ġclass ĠProperties Generator ( facet : ĠAndroid Facet , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġmodel : ĠNe le Properties Model , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġcomponents : ĠList < Nl Component >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġlocal Attr Defs : ĠAttribute Definitions , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġsystem Attr Defs : ĠAttribute Definitions ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġproject Ġ= Ġfacet . module . project ĊĠĠĠ Ġprivate Ġval Ġapi Lookup Ġ= ĠL int Ide Client . get Api Lookup ( project ) ĊĠĠĠ Ġprivate Ġval Ġmin Api Ġ= ĠAndroid Module Info . getInstance ( facet ). min Sdk Version . feature Level ĊĠĠĠ Ġprivate Ġval Ġpsi Facade Ġ= ĠJava Psi Facade . getInstance ( project ) ĊĠĠĠ Ġprivate Ġval Ġdescriptor Provider Ġ= ĠAndroid Dom Element Descriptor Provider () ĊĠĠĠ Ġprivate Ġvar Ġproperties : ĠTable < String , ĠString , ĠNe le Property Item > Ġ= ĠImmutable Table . of () ĊĠĠĠ Ġprivate Ġval Ġempty Table Ġ= ĠImmutable Table . of < String , ĠString , ĠNe le Property Item >() ĊĊĠĠĠ Ġfun Ġgenerate (): ĠTable < String , ĠString , ĠNe le Property Item > Ġ{ ĊĠĠĠĠĠ Ġvar Ġcombined Properties : ĠTable < String , ĠString , ĠNe le Property Item >? Ġ= Ġnull ĊĠĠĠĠĠ Ġfor Ġ( component Ġin Ġcomponents ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtag Ġ= Ġcomponent . tag Ġ?: Ġreturn Ġempty Table ĊĊĠĠĠĠĠĠĠ Ġval Ġelement Descriptor Ġ= Ġdescriptor Provider . get Descriptor ( tag ) Ġ?: Ġreturn Ġempty Table ĊĠĠĠĠĠĠĠ Ġval Ġdescriptors Ġ= Ġelement Descriptor . getAttributes Descriptors ( tag ) ĊĠĠĠĠĠĠĠ Ġproperties Ġ= ĠHash Based Table . create ( EXPECTED _ ROWS , Ġdescriptors . size ) ĊĊĠĠĠĠĠĠĠ Ġload Properties From Descriptors ( tag , Ġdescriptors ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( component . has Nl Component Info ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġload Properties From Style able ( component ) ĊĠĠĠĠĠĠĠĠĠ Ġload Properties From Layout Style able ( component ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠException : ĠAlways Ġprefer ĠATTR _ SRC _ COMPAT Ġover ĠATTR _ SRC : ĊĠĠĠĠĠĠĠ Ġif Ġ( properties . contains ( AUTO _ URI , ĠATTR _ SRC _ COMPAT )) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġproperties . remove ( ANDROID _ URI , ĠATTR _ SRC ) ĊĠĠĠĠĠĠĠĠĠ Ġproperties . remove ( AUTO _ URI , ĠATTR _ SRC ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠExceptions : ĊĠĠĠĠĠĠĠ Ġif Ġ( tag . name Ġ== ĠAUTO _ COMPLETE _ TEXT _ VIEW ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġ// ĠAn ĠAuto Complete TextView Ġhas Ġa Ġpopup Ġthat Ġis Ġcreated Ġat Ġruntime . ĊĠĠĠĠĠĠĠĠĠ Ġ// ĠProperties Ġfor Ġthis Ġpopup Ġcan Ġbe Ġadded Ġto Ġthe ĠAuto Complete TextView Ġtag . ĊĠĠĠĠĠĠĠĠĠ Ġval Ġattr Ġ= Ġsystem Attr Defs . get Attr Def ByName ( ATTR _ POP UP _ BACKGROUND ) ĊĠĠĠĠĠĠĠĠĠ Ġval Ġproperty Ġ= Ġcreate Property ( ANDROID _ URI , ĠATTR _ POP UP _ BACKGROUND , Ġattr , ĠF Q CN _ AUTO _ COMPLETE _ TEXT _ VIEW , Ġmodel , Ġcomponents ) ĊĠĠĠĠĠĠĠĠĠ Ġproperties . put ( ANDROID _ URI , ĠATTR _ POP UP _ BACKGROUND , Ġproperty ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcombined Properties Ġ= Ġcombine ( properties , Ġcombined Properties ) ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġ// ĠThe Ġfollowing Ġproperties Ġare Ġdeprecated Ġin Ġthe Ġsupport Ġlibrary Ġand Ġcan Ġbe Ġignored Ġby Ġtools : ĊĠĠĠĠĠ Ġcombined Properties ?. let Ġ{ ĊĠĠĠĠĠĠĠ Ġit . remove ( AUTO _ URI , ĠATTR _ P ADDING _ START ) ĊĠĠĠĠĠĠĠ Ġit . remove ( AUTO _ URI , ĠATTR _ P ADDING _ END ) ĊĠĠĠĠĠĠĠ Ġit . remove ( AUTO _ URI , ĠATTR _ THEME ) ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġreturn Ġcombined Properties Ġ?: Ġempty Table ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġload Properties From Descriptors ( tag : ĠXml Tag , Ġdescriptors : ĠArray < XmlAttribute Descriptor >) Ġ{ ĊĠĠĠĠĠ Ġfor Ġ( desc Ġin Ġdescriptors ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġdesc . name ĊĠĠĠĠĠĠĠ Ġval Ġnamespace Uri Ġ= Ġget Namespace ( desc , Ġtag ) ĊĠĠĠĠĠĠĠ Ġ// ĠExclude Ġthe Ġframework Ġattributes Ġthat Ġwere Ġadded Ġafter Ġthe Ġcurrent Ġmin ĠAPI Ġlevel . ĊĠĠĠĠĠĠĠ Ġif Ġ( ANDROID _ URI Ġ== Ġnamespace Uri Ġ&& Ġapi Lookup Ġ!= Ġnull Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapi Lookup . getField Version (" android / R \$ attr ", Ġname ) Ġ> Ġmin Api ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġattr Defs Ġ= Ġif Ġ( ANDROID _ URI Ġ== Ġnamespace Uri ) Ġsystem Attr Defs Ġelse Ġlocal Attr Defs ĊĠĠĠĠĠĠĠ Ġval Ġnamespace Ġ= ĠResource Namespace . from Namespace Uri ( namespace Uri ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! properties . contains ( namespace Uri , Ġname )) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġval Ġattr Def Ġ= Ġnamespace ?. let Ġ{ Ġattr Defs . get Attr Definition ( Resource Reference . attr ( it , Ġname )) Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġval Ġproperty Ġ= Ġcreate Property ( namespace Uri , Ġname , Ġattr Def , Ġ"", Ġmodel , Ġcomponents ) ĊĠĠĠĠĠĠĠĠĠ Ġproperties . put ( namespace Uri , Ġname , Ġproperty ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġload Properties From Style able ( component : ĠN l Component ) Ġ{ ĊĠĠĠĠĠ Ġvar Ġpsi Class : ĠPsi Class ? Ġ= Ġfind Psi Class Of Component ( component ) ĊĠĠĠĠĠ Ġwhile Ġ( psi Class Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġload From Style able Name ( psi Class , Ġpsi Class . name ) ĊĠĠĠĠĠĠĠ Ġpsi Class Ġ= Ġpsi Class . super Class ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġload Properties From Layout Style able ( component : ĠN l Component ) Ġ{ ĊĠĠĠĠĠ Ġval Ġparent Ġ= Ġcomponent . parent Ġ?: Ġreturn ĊĠĠĠĠĠ Ġvar Ġpsi Class : ĠPsi Class ? Ġ= Ġfind Psi Class Of Component ( parent ) ĊĠĠĠĠĠ Ġwhile Ġ( psi Class Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġload From Style able Name ( psi Class , ĠAttribute Processing Util . get Layout Style able Primary ( psi Class )) ĊĠĠĠĠĠĠĠ Ġload From Style able Name ( psi Class , ĠAttribute Processing Util . get Layout Style able Secondary ( psi Class )) ĊĠĠĠĠĠĠĠ Ġpsi Class Ġ= Ġpsi Class . super Class ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġload From Style able Name ( psi Class : ĠPsi Class , Ġstyle able Name : ĠString ?) Ġ{ ĊĠĠĠĠĠ Ġif Ġ( style able Name Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġval Ġnamespace Ġ= Ġfind Namespace From Psi Class ( psi Class ) Ġ?: Ġreturn ĊĠĠĠĠĠ Ġval Ġreference Ġ= ĠResource Reference ( namespace , ĠResource Type . STYLE ABLE , Ġstyle able Name ) ĊĠĠĠĠĠ Ġval Ġattr Defs Ġ= Ġif Ġ( namespace . xml Namespace Uri Ġ== ĠAND ROID _ URI ) Ġsystem Attr Defs Ġelse Ġlocal Attr Defs ĊĠĠĠĠĠ Ġval Ġstyle able Ġ= Ġattr Defs . getStyle able Definition ( reference ) Ġ?: Ġreturn ĊĠĠĠĠĠ Ġstyle able . attributes . forEach Ġ{ Ġadd Property From Attribute ( it , Ġpsi Class ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfind Psi Class Of Component ( component : ĠN l Component ): ĠPsi Class ? Ġ{ ĊĠĠĠĠĠ Ġval Ġtag Ġ= Ġcomponent . tag Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠ Ġval Ġpsi Class Ġ= ĠPsi Tree Util . getParent OfType ( tag , ĠPsi Class :: class . java ) ĊĠĠĠĠĠ Ġval Ġview ClassName Ġ= Ġcomponent . view Info ?. className ĊĠĠĠĠĠ Ġif Ġ( view ClassName Ġ!= Ġnull Ġ&& Ġview ClassName Ġ!= Ġpsi Class ?. qualified Name ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġpsi Facade . find Class ( view ClassName , ĠGlobal Search Scope . all Scope ( project )) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġreturn Ġpsi Class ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠTODO : ĠFix Ġthe Ġnamespace Ġcomputation Ġbelow ... ĊĠĠĠ Ġprivate Ġfun Ġfind Namespace From Psi Class ( psi Class : ĠPsi Class ): ĠResource Namespace ? Ġ{ ĊĠĠĠĠĠ Ġval ĠclassName Ġ= Ġpsi Class . qualified Name Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠ Ġval Ġnamespace Uri Ġ= Ġif Ġ( className . startsWith ( ANDROID _ PKG _ PREFIX ) Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ! className . startsWith ( ANDROID _ SUPPORT _ PKG _ PREFIX )) ĠAND ROID _ URI ĊĠĠĠĠĠ Ġelse ĠAUTO _ URI ĊĠĠĠĠĠ Ġreturn ĠResource Namespace . from Namespace Uri ( namespace Uri ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġadd Property From Attribute ( attribute : ĠAttribute Definition , Ġpsi Class : ĠPsi Class ) Ġ{ ĊĠĠĠĠĠ Ġval Ġnamespace Ġ= Ġattribute . resource Reference . namespace . xml Namespace Uri ĊĠĠĠĠĠ Ġval Ġproperty Ġ= Ġcreate Property ( namespace , Ġattribute . name , Ġattribute , Ġpsi Class . qualified Name Ġ?: Ġ"", Ġmodel , Ġcomponents ) ĊĠĠĠĠĠ Ġif Ġ( ANDROID _ URI Ġ== Ġnamespace Ġ&& Ġapi Lookup Ġ!= Ġnull Ġ&& ĊĠĠĠĠĠĠĠĠĠ Ġapi Lookup . getField Version (" android / R \$ attr ", Ġattribute . name ) Ġ> Ġmin Api ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠExclude Ġthe Ġframework Ġattributes Ġthat Ġwere Ġadded Ġafter Ġthe Ġcurrent Ġmin ĠAPI Ġlevel . ĊĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġif Ġ( namespace Ġ!= ĠAND ROID _ URI Ġ&& Ġproperties . contains ( ANDROID _ URI , Ġattribute . name )) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠIf Ġthe Ġcorresponding Ġframework Ġattribute Ġis Ġsupported , Ġprefer Ġthe Ġframework Ġattribute . ĊĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġproperties . put ( property . namespace , Ġproperty . name , Ġproperty ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Property ( namespace : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġattr : ĠAttribute Definition ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomponent Name : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodel : ĠNe le Properties Model , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomponents : ĠList < Nl Component >): ĠNe le Property Item Ġ{ ĊĠĠĠĠĠ Ġval Ġtype Ġ= ĠType Resolver . resolve Type ( name , Ġattr ) ĊĠĠĠĠĠ Ġval Ġlibrary Name Ġ= Ġattr ?. library Name Ġ?: Ġ"" ĊĠĠĠĠĠ Ġif Ġ( namespace Ġ== ĠAND ROID _ URI Ġ&& Ġname Ġ== ĠATTR _ ID ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠNe le Id Property Item ( model , Ġattr , Ġcomponent Name , Ġcomponents ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġif Ġ( attr Ġ!= Ġnull Ġ&& Ġattr . formats . contains ( Attribute Format . FLAGS ) Ġ&& Ġattr . values . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠNe le Flags Property Item ( namespace , Ġname , Ġtype , Ġattr , Ġcomponent Name , Ġlibrary Name , Ġmodel , Ġcomponents ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġreturn ĠNe le Property Item ( namespace , Ġname , Ġtype , Ġattr , Ġcomponent Name , Ġlibrary Name , Ġmodel , Ġcomponents ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Namespace ( descriptor : ĠXml Attribute Descriptor , Ġcontext : ĠXml Tag ): ĠString Ġ{ ĊĠĠĠĠĠ Ġreturn Ġ( descriptor Ġas ? ĠNamespace Aware XmlAttribute Descriptor )?. getName space ( context ) Ġ?: ĠAND ROID _ URI ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠWhen Ġcomponents Ġof Ġdifferent Ġtype Ġare Ġselected : Ġe . g . Ġa ĠImage Button Ġand Ġa ĠTextView , ĊĠĠĠ Ġ// Ġwe Ġjust Ġshow Ġthe Ġattributes Ġthose Ġcomponents Ġhave Ġin Ġcommon . ĊĠĠĠ Ġprivate Ġfun Ġcombine ( properties : ĠTable < String , ĠString , ĠNe le Property Item >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcombined Properties : ĠTable < String , ĠString , ĠNe le Property Item >? ): ĠTable < String , ĠString , ĠNe le Property Item > Ġ{ ĊĠĠĠĠĠ Ġif Ġ( combined Properties Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġproperties ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġval Ġnamespaces Ġ= ĠArrayList ( combined Properties . row Key Set ()) ĊĠĠĠĠĠ Ġval Ġproperties ToRemove Ġ= ĠArrayList < String >() ĊĠĠĠĠĠ Ġfor Ġ( namespace Ġin Ġnamespaces ) Ġ{ ĊĠĠĠĠĠĠĠ Ġproperties ToRemove . clear () ĊĠĠĠĠĠĠĠ Ġfor Ġ(( name , Ġitem ) Ġin Ġcombined Properties . row ( namespace )) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( item Ġ!= Ġproperties . get ( namespace , Ġname )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproperties ToRemove . add ( name ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfor Ġ( propertyName Ġin Ġproperties ToRemove ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġcombined Properties . remove ( namespace , ĠpropertyName ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ// ĠNever Ġinclude Ġthe ĠID Ġattribute Ġwhen Ġlooking Ġat Ġmultiple Ġcomponents : ĊĠĠĠĠĠ Ġcombined Properties . remove ( ANDROID _ URI , ĠATTR _ ID ) ĊĠĠĠĠĠ Ġreturn Ġcombined Properties ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ } Ċ