/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 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 Ġcom . android . tools . idea . layout inspector . pipeline . app inspection . view Ċ Ċ import Ġcom . android . Sdk Constants Ċ import Ġcom . android . ide . common . rendering . api . Resource Reference Ċ import Ġcom . android . tools . idea . layout inspector . properties . Inspector Property Item Ċ import Ġcom . android . tools . idea . layout inspector . properties . Property Section Ċ import Ġcom . android . tools . idea . layout inspector . properties . View Node And Resource Lookup Ċ import Ġcom . android . tools . idea . res . color ToString Ċ import Ġcom . android . tools . property . panel . api . Properties Table Ċ import Ġcom . google . common . collect . Hash Based Table Ċ import Ġcom . google . common . collect . Table Ċ import Ġlayout inspector . view . inspection . Layout Inspector View Protocol . Flag Value Ċ import Ġlayout inspector . view . inspection . Layout Inspector View Protocol . Property Ċ import Ġlayout inspector . view . inspection . Layout Inspector View Protocol . PropertyGroup Ċ import Ġlayout inspector . view . inspection . Layout Inspector View Protocol . Resource Ċ import Ġjava . awt . Color Ċ Ċ private Ġconst Ġval ĠSO ME _ UNKNOWN _ ANIM _ VALUE Ġ= Ġ"@ anim /? " Ċ private Ġconst Ġval ĠSO ME _ UNKNOWN _ ANIM ATOR _ VALUE Ġ= Ġ"@ anim ator /? " Ċ private Ġconst Ġval ĠSO ME _ UNKNOWN _ DRAW ABLE _ VALUE Ġ= Ġ"@ drawable /? " Ċ private Ġconst Ġval ĠSO ME _ UNKNOWN _ INTER POL ATOR _ VALUE Ġ= Ġ"@ interpol ator /? " Ċ private Ġconst Ġval ĠAN IM ATION _ PACKAGE Ġ= Ġ" android . view . animation " Ċ private Ġconst Ġval ĠFRAME WORK _ INTER POL ATOR _ PREFIX Ġ= Ġ"@ android : interpol ator " Ċ Ċ class ĠView Properties Data ( ĊĠ Ġ/** ĊĠĠ Ġ* ĠThe Ġproperties Ġassociated Ġwith Ġa Ġview . ĊĠĠ Ġ*/ ĊĠ Ġval Ġproperties : ĠProperties Table < Inspector Property Item >, ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠThe Ġresolution Ġstacks Ġfor Ġeach Ġ( namespace , Ġproperty - name ) Ġpair . ĊĠĠ Ġ*/ ĊĠ Ġval Ġresolution Stack s : ĠTable < String , ĠString , ĠList < Resource Reference >>, ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠThe ĠclassName Ġof Ġknown Ġobject Ġtypes : Ġ( ANIM , ĠAN IM ATOR , ĠINTER POL ATOR , ĠD RAW ABLE ) ĊĠĠ Ġ*/ ĊĠ Ġval ĠclassNames : ĠTable < String , ĠString , ĠString >, Ċ ) Ċ Ċ /** Ċ Ġ* ĠBridge Ġbetween Ġincoming Ġproto Ġdata Ġand Ġclasses Ġexpected Ġby Ġthe ĠStudio Ġproperties Ġframework . Ċ Ġ*/ Ċ class ĠView Properties Data Generator ( ĊĠ Ġprivate Ġval Ġstring Table : ĠString Table Impl , ĊĠ Ġprivate Ġval Ġproperties : ĠProperty Group , ĊĠ Ġprivate Ġval Ġlookup : ĠView Node And Resource Lookup , Ċ ) Ġ{ ĊĠ Ġ// ĠTODO : ĠThe Ġmodule Ġnamespace Ġprobably Ġshould Ġbe Ġretrieved Ġfrom Ġthe Ġmodule . ĠUse Ġthe Ġlayout Ġnamespace Ġfor Ġnow : ĊĠ Ġprivate Ġval Ġlayout Ġ= Ġstring Table [ properties . layout ] ĊĠ Ġprivate Ġval Ġproperty Table Ġ= ĠHash Based Table . create < String , ĠString , ĠIns pector Property Item >() ĊĠ Ġprivate Ġval ĠclassNames Table Ġ= ĠHash Based Table . create < String , ĠString , ĠString >() ĊĠ Ġprivate Ġval Ġresolution Stack Table Ġ= ĠHash Based Table . create < String , ĠString , ĠList < Resource Reference >>() ĊĠ Ġprivate Ġval Ġresolution Stack Map Ġ= Ġmutable Map Of < List < Resource >, ĠList < Resource Reference >>() ĊĠ Ġprivate Ġval Ġview Id Ġ= Ġproperties . view Id ĊĊĠ Ġfun Ġgenerate (): ĠView Properties Data Ġ{ ĊĠĠĠ Ġfor Ġ( property Ġin Ġproperties . property List ) Ġ{ ĊĠĠĠĠĠ Ġval Ġitem Ġ= Ġconvert ( property ) ĊĠĠĠĠĠ Ġproperty Table . put ( item . namespace , Ġitem . name , Ġitem ) ĊĠĠĠĠĠ Ġadd Resolution Stack ( property ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn ĠView Properties Data ( Properties Table . create ( property Table ), Ġresolution Stack Table , ĠclassNames Table ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġconvert ( property : ĠProperty ): ĠIns pector Property Item Ġ{ ĊĠĠĠ Ġval Ġname Ġ= Ġstring Table [ property . name ] ĊĠĠĠ Ġval Ġis Declared Ġ= Ġproperty . source Ġ== Ġproperties . layout Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproperty . source Ġ!= ĠResource . getDefaultInstance () ĊĠĠĠ Ġval Ġsource Ġ= Ġstring Table [ property . source ] ĊĠĠĠ Ġval Ġgroup Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠ Ġproperty . is Layout Ġ-> ĠProperty Section . LAYOUT ĊĠĠĠĠĠ Ġis Declared Ġ-> ĠProperty Section . DECLARE D ĊĠĠĠĠĠ Ġelse Ġ-> ĠProperty Section . DEFAULT ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġvalue : ĠString ? Ġ= Ġwhen Ġ( property . type ) Ġ{ ĊĠĠĠĠĠ ĠProperty . Type . STRING , ĊĠĠĠĠĠ ĠProperty . Type . INT _ ENUM Ġ-> Ġstring Table [ property . int 3 2 Value ] ĊĠĠĠĠĠ ĠProperty . Type . GR AV ITY , ĊĠĠĠĠĠ ĠProperty . Type . INT _ FLAG Ġ-> Ġfrom Flags ( property . flag Value ) ĊĠĠĠĠĠ ĠProperty . Type . BOOLEAN Ġ-> Ġfrom Boolean ( property )?. toString () ĊĠĠĠĠĠ ĠProperty . Type . CHAR Ġ-> Ġfrom Char ( property )?. toString () ĊĠĠĠĠĠ ĠProperty . Type . BYTE , ĊĠĠĠĠĠ ĠProperty . Type . INT 1 6 , ĊĠĠĠĠĠ ĠProperty . Type . INT 3 2 Ġ-> Ġfrom Int 3 2 ( property )?. toString () ĊĠĠĠĠĠ ĠProperty . Type . INT 6 4 Ġ-> Ġfrom Int 6 4 ( property )?. toString () ĊĠĠĠĠĠ ĠProperty . Type . DOUBLE Ġ-> Ġfrom Double ( property )?. toString () ĊĠĠĠĠĠ ĠProperty . Type . FLOAT Ġ-> Ġfrom Float ( property )?. toString () ĊĠĠĠĠĠ ĠProperty . Type . RESOURCE Ġ-> Ġfrom Resource ( property , Ġlayout ) ĊĠĠĠĠĠ ĠProperty . Type . COLOR Ġ-> Ġfrom Color ( property ) ĊĊĠĠĠĠĠ Ġ// ĠFor Ġthe Ġfollowing Ġtypes Ġwe Ġare Ġunable Ġto Ġget Ġthe Ġvalue Ġfrom Ġthe Ġagent . ĠFor Ġnow Ġstore Ġthe ĠclassName : ĊĠĠĠĠĠ ĠProperty . Type . DRAW ABLE , ĊĠĠĠĠĠ ĠProperty . Type . ANIM , ĊĠĠĠĠĠ ĠProperty . Type . ANIM ATOR , ĊĠĠĠĠĠ ĠProperty . Type . INTER POL ATOR Ġ-> Ġfrom Known ObjectType ( property ) ĊĠĠĠĠĠ Ġelse Ġ-> Ġ"" ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġtype Ġ= Ġproperty . type . convert () ĊĊĠĠĠ Ġ// ĠTODO : ĠHandle Ġattribute Ġnamespaces Ġi . e . Ġthe Ġhardcoded ĠAND ROID _ URI Ġbelow ĊĠĠĠ Ġreturn ĠIns pector Property Item ( Sdk Constants . ANDROID _ URI , Ġname , Ġtype , Ġvalue , Ġgroup , Ġsource , Ġview Id , Ġlookup ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġfrom Resource ( property : ĠProperty , Ġlayout : ĠResource Reference ?): ĠString Ġ{ ĊĠĠĠ Ġval Ġreference Ġ= Ġstring Table [ property . resource Value ] ĊĠĠĠ Ġval Ġurl Ġ= Ġlayout ?. let Ġ{ Ġreference ?. get Relative Resource Url ( layout . namespace ) Ġ} Ġ?: Ġreference ?. resource Url ĊĠĠĠ Ġreturn Ġurl ?. toString () Ġ?: Ġ"" ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġfrom Flags ( flag Value : ĠFlag Value ): ĠString Ġ{ ĊĠĠĠ Ġreturn Ġflag Value . flag List . join ToString ("| ") Ġ{ Ġstring Table [ it ] Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġfrom Boolean ( property : ĠProperty ): ĠBoolean ? Ġ{ ĊĠĠĠ Ġval Ġint Value Ġ= Ġfrom Int 3 2 ( property ) Ġ?: Ġreturn Ġnull ĊĠĠĠ Ġreturn Ġint Value Ġ!= Ġ 0 ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġfrom Char ( property : ĠProperty ): ĠChar ? Ġ{ ĊĠĠĠ Ġval Ġint Value Ġ= Ġfrom Int 3 2 ( property ) Ġ?: Ġreturn Ġnull ĊĠĠĠ Ġreturn Ġint Value . to Char () ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġfrom Int 3 2 ( property : ĠProperty ): ĠInt ? Ġ{ ĊĠĠĠ Ġreturn Ġif Ġ( property . value Case Ġ== ĠProperty . Value Case . INT 3 2 _ VALUE ) Ġproperty . int 3 2 Value Ġelse Ġnull ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġfrom Int 6 4 ( property : ĠProperty ): ĠLong ? Ġ{ ĊĠĠĠ Ġreturn Ġif Ġ( property . value Case Ġ== ĠProperty . Value Case . INT 6 4 _ VALUE ) Ġproperty . int 6 4 Value Ġelse Ġnull ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġfrom Double ( property : ĠProperty ): ĠDouble ? Ġ{ ĊĠĠĠ Ġreturn Ġif Ġ( property . value Case Ġ== ĠProperty . Value Case . DOUBLE _ VALUE ) Ġproperty . doubleValue Ġelse Ġnull ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġfrom Float ( property : ĠProperty ): ĠFloat ? Ġ{ ĊĠĠĠ Ġreturn Ġif Ġ( property . value Case Ġ== ĠProperty . Value Case . FLOAT _ VALUE ) Ġproperty . float Value Ġelse Ġnull ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġfrom Color ( property : ĠProperty ): ĠString ? Ġ{ ĊĠĠĠ Ġval Ġint Value Ġ= Ġfrom Int 3 2 ( property ) Ġ?: Ġreturn Ġnull ĊĠĠĠ Ġreturn Ġcolor ToString ( Color ( intValue )) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġfrom Known ObjectType ( property : ĠProperty ): ĠString ? Ġ{ ĊĠĠĠ Ġval Ġname Ġ= Ġstring Table [ property . name ] ĊĠĠĠ Ġval ĠclassName Ġ= Ġstring Table [ property . int 3 2 Value ] ĊĠĠĠ Ġif Ġ( className . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠ Ġ// ĠTODO : ĠHandle Ġattribute Ġnamespaces Ġi . e . Ġthe Ġhardcoded ĠAND ROID _ URI Ġbelow ĊĠĠĠĠĠ ĠclassNames Table . put ( Sdk Constants . ANDROID _ URI , Ġname , ĠclassName ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġwhen Ġ( property . type ) Ġ{ ĊĠĠĠĠĠ ĠProperty . Type . ANIM Ġ-> ĠSO ME _ UNKNOWN _ ANIM _ VALUE ĊĠĠĠĠĠ ĠProperty . Type . ANIM ATOR Ġ-> ĠSO ME _ UNKNOWN _ ANIM ATOR _ VALUE ĊĠĠĠĠĠ ĠProperty . Type . DRAW ABLE Ġ-> ĠSO ME _ UNKNOWN _ DRAW ABLE _ VALUE ĊĠĠĠĠĠ ĠProperty . Type . INTER POL ATOR Ġ-> Ġvalue From Interpolator Class ( className ) Ġ?: ĠSO ME _ UNKNOWN _ INTER POL ATOR _ VALUE ĊĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠMap Ġan Ġinterpol ator ĠclassName Ġinto Ġthe Ġresource Ġid Ġfor Ġthe Ġinterpol ator . ĊĠĠ Ġ* ĊĠĠ Ġ* ĠSome Ġinterpol ator Ġimplementations Ġdo Ġnot Ġhave Ġany Ġvariants . ĠWe Ġcan Ġmap Ġsuch Ġan ĊĠĠ Ġ* Ġinterpol ator Ġto Ġa Ġresource Ġvalue Ġeven Ġif Ġwe Ġdon 't Ġhave Ġaccess Ġto Ġthe Ġsource . ĊĠĠ Ġ* ĊĠĠ Ġ* ĠNote : Ġthe Ġfollowing Ġinterpol ator Ġclasses Ġhave Ġvariants : ĊĠĠ Ġ* Ġ Ġ- ĠAccel erate Interpolator ĊĠĠ Ġ* Ġ Ġ- ĠDec el erate Interpolator ĊĠĠ Ġ* Ġ Ġ- ĠPath Interpolator ĊĠĠ Ġ* Ġand Ġare Ġrepresented Ġby Ġmore Ġthan Ġ 1 Ġresource Ġid Ġdepending Ġon Ġthe Ġvariant . ĊĠĠ Ġ*/ ĊĠ Ġprivate Ġfun Ġvalue From Interpolator Class ( className : ĠString ?): ĠString ? Ġ= ĊĠĠĠ Ġwhen Ġ( className ) Ġ{ ĊĠĠĠĠĠ Ġ"${ ANIM ATION _ PACKAGE }. Accel erate De cel erate Interpolator " Ġ-> Ġ"${ FRAME WORK _ INTER POL ATOR _ PREFIX }/ accel erate _ de cel erate " ĊĠĠĠĠĠ Ġ"${ ANIM ATION _ PACKAGE }. Ant icip ate Interpolator " Ġ-> Ġ"${ FRAME WORK _ INTER POL ATOR _ PREFIX }/ ant icip ate " ĊĠĠĠĠĠ Ġ"${ ANIM ATION _ PACKAGE }. Ant icip ate Over shoot Interpolator " Ġ-> Ġ"${ FRAME WORK _ INTER POL ATOR _ PREFIX }/ ant icip ate _ over shoot " ĊĠĠĠĠĠ Ġ"${ ANIM ATION _ PACKAGE }. Bo unce Interpolator " Ġ-> Ġ"${ FRAME WORK _ INTER POL ATOR _ PREFIX }/ bounce " ĊĠĠĠĠĠ Ġ"${ ANIM ATION _ PACKAGE }. Cycle Interpolator " Ġ-> Ġ"${ FRAME WORK _ INTER POL ATOR _ PREFIX }/ cycle " ĊĠĠĠĠĠ Ġ"${ ANIM ATION _ PACKAGE }. Linear Interpolator " Ġ-> Ġ"${ FRAME WORK _ INTER POL ATOR _ PREFIX }/ linear " ĊĠĠĠĠĠ Ġ"${ ANIM ATION _ PACKAGE }. Over shoot Interpolator " Ġ-> Ġ"${ FRAME WORK _ INTER POL ATOR _ PREFIX }/ over shoot " ĊĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠAdd Ġthe Ġresolution Stack Ġfor Ġthis Ġproperty Ġto Ġ[ resolution Stack Table ] ĊĠĠ Ġ*/ ĊĠ Ġprivate Ġfun Ġadd Resolution Stack ( property : ĠProperty ) Ġ{ ĊĠĠĠ Ġvar Ġencoded Resolution Stack Ġ= Ġproperty . resolution Stack List ĊĠĠĠ Ġif Ġ( encoded Resolution Stack . isEmpty ()) Ġ{ ĊĠĠĠĠĠ Ġif Ġ( property . source Ġ== ĠResource . getDefaultInstance ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġencoded Resolution Stack Ġ= ĠlistOf ( property . source ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġ// ĠMany Ġresolution Ġstacks Ġfrom Ġthe Ġagent Ġare Ġidentical . ĠCon serve Ġmemory Ġby Ġonly Ġconverting Ġunique Ġstacks : ĊĠĠĠ Ġval Ġresolution Stack Ġ= Ġresolution Stack Map . compute If Absent ( encoded Resolution Stack ) Ġ{ Ġit . map NotNull Ġ{ Ġres Ġ-> Ġstring Table [ res ] Ġ} Ġ} ĊĠĠĠ Ġif Ġ( resolution Stack . isEmpty ()) Ġ{ ĊĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġname Ġ= Ġstring Table [ property . name ] ĊĊĠĠĠ Ġ// ĠTODO : ĠHandle Ġattribute Ġnamespaces Ġi . e . Ġthe Ġhardcoded ĠAND ROID _ URI Ġbelow ĊĠĠĠ Ġresolution Stack Table . put ( Sdk Constants . ANDROID _ URI , Ġname , Ġresolution Stack ) ĊĠ Ġ} Ċ } Ċ