/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 1 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 . lint . checks Ċ Ċ import Ġcom . android . resources . Resource Folder Type Ċ import Ġcom . android . tools . lint . detector . api . Category Ċ import Ġcom . android . tools . lint . detector . api . Default Position Ċ import Ġcom . android . tools . lint . detector . api . Implementation Ċ import Ġcom . android . tools . lint . detector . api . Issue Ċ import Ġcom . android . tools . lint . detector . api . Location Ċ import Ġcom . android . tools . lint . detector . api . Resource Xml Detector Ċ import Ġcom . android . tools . lint . detector . api . Scope Ċ import Ġcom . android . tools . lint . detector . api . Severity Ċ import Ġcom . android . tools . lint . detector . api . Xml Context Ċ import Ġorg . w 3 c . dom . Document Ċ import Ġorg . w 3 c . dom . Node Ċ Ċ /** Ċ Ġ* ĠCheck Ġwhich Ġlooks Ġfor Ġinvalid Ġresources . ĠA apt Ġalready Ġperforms Ġsome Ċ Ġ* Ġvalidation , Ġsuch Ġas Ġmaking Ġsure Ġthat Ġresource Ġreferences Ġpoint Ġto Ċ Ġ* Ġresources Ġthat Ġexist , Ġbut Ġthis Ġdetector Ġlooks Ġfor Ġadditional Ġissues . Ċ Ġ*/ Ċ class ĠExtra Text Detector Ġ: ĠResource Xml Detector () Ġ{ ĊĠĠĠ Ġcompanion Ġobject ĠIssues Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ/** ĠThe Ġmain Ġissue Ġdiscovered Ġby Ġthis Ġdetector . Ġ*/ ĊĠĠĠĠĠĠĠ Ġ@ Jvm Field ĊĠĠĠĠĠĠĠ Ġval ĠISS UE Ġ= ĠIssue . create ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġ" Extra Text ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbrief Description Ġ= Ġ" Extr aneous Ġtext Ġin Ġresource Ġfiles ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexplanation Ġ= Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLayout Ġresource Ġfiles Ġshould Ġonly Ġcontain Ġelements Ġand Ġattributes . ĠAny ĠXML Ġtext Ġcontent Ġfound Ġ\ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin Ġthe Ġfile Ġis Ġlikely Ġaccident al Ġ( and Ġpotentially Ġdangerous Ġif Ġthe Ġtext Ġre semb les ĠXML Ġand Ġthe Ġ\ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdeveloper Ġbel ie ves Ġthe Ġtext Ġto Ġbe Ġfunctional ) """, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcategory Ġ= ĠCategory . CORRECT NESS , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpriority Ġ= Ġ 3 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġseverity Ġ= ĠSeverity . WARNING , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimplementation Ġ= ĠImplementation ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠExtra Text Detector :: class . java , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠScope . MAN IFEST _ AND _ RESOURCE _ SCOPE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠScope . RESOURCE _ FILE _ SCOPE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠScope . MAN IFEST _ SCOPE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġfound Text : ĠBoolean Ġ= Ġfalse ĊĊĠĠĠ Ġoverride Ġfun Ġapplies To ( folder Type : ĠResource Folder Type ): ĠBoolean Ġ= ĊĠĠĠĠĠĠĠ Ġfolder Type Ġ== ĠResource Folder Type . LAYOUT Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfolder Type Ġ== ĠResource Folder Type . MENU Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfolder Type Ġ== ĠResource Folder Type . ANIM Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfolder Type Ġ== ĠResource Folder Type . ANIM ATOR Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfolder Type Ġ== ĠResource Folder Type . DRAW ABLE Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfolder Type Ġ== ĠResource Folder Type . COLOR Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfolder Type Ġ== ĠResource Folder Type . NAV IG ATION ĊĊĠĠĠ Ġoverride Ġfun Ġvisit Document ( context : ĠXml Context , Ġdocument : ĠDocument ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfound Text Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġvisit Node ( context , Ġdocument ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġvisit Node ( context : ĠXml Context , Ġnode : ĠNode ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnode Type Ġ= Ġnode . nodeType ĊĠĠĠĠĠĠĠ Ġif Ġ( nodeType Ġ== ĠNode . TEXT _ NODE Ġ&& Ġ! found Text ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtext Ġ= Ġnode . node Value ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġi Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġn Ġ= Ġtext . length ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( i Ġ< Ġn ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġc Ġ= Ġtext [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! Character . is Whitespace ( c )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġsnippet Ġ= Ġtext . trim Ġ{ Ġit Ġ<= Ġ' Ġ' Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠmaxLength Ġ= Ġ 1 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( snippet . length Ġ> ĠmaxLength ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsnippet Ġ= Ġsnippet . substring ( 0 , ĠmaxLength ) Ġ+ Ġ" ..." ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġlocation Ġ= Ġcontext . getLocation ( node ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( i Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAdjust Ġthe Ġerror Ġposition Ġto Ġpoint Ġto Ġthe Ġbeginning Ġof ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthe Ġtext Ġrather Ġthan Ġthe Ġbeginning Ġof Ġthe Ġtext Ġnode ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ( which Ġis Ġoften Ġthe Ġnewline Ġat Ġthe Ġend Ġof Ġthe Ġprevious ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġline Ġand Ġthe Ġindentation ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġstart Ġ= Ġlocation . start ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( start Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġline Ġ= Ġstart . line ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcolumn Ġ= Ġstart . column ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġoffset Ġ= Ġstart . offset ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( j Ġin Ġ 0 Ġuntil Ġi ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoffset ++ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( text [ j ] Ġ== Ġ'\ n ') Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( line Ġ!= Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġline ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( column Ġ!= Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcolumn Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( column Ġ!= Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcolumn ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Ġ= ĠDefault Position ( line , Ġcolumn , Ġoffset ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocation Ġ= ĠLocation . create ( context . file , Ġstart , Ġlocation . end ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . report ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠISS UE , Ġnode , Ġlocation , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Unexpected Ġtext Ġfound Ġin Ġlayout Ġfile : Ġ\"$ snippet \"" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfound Text Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠVisit Ġchildren ĊĠĠĠĠĠĠĠ Ġval Ġchild Nodes Ġ= Ġnode . childNodes ĊĠĠĠĠĠĠĠ Ġvar Ġi Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġval Ġn Ġ= Ġchild Nodes . length ĊĠĠĠĠĠĠĠ Ġwhile Ġ( i Ġ< Ġn ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchild Ġ= Ġchild Nodes . item ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvisit Node ( context , Ġchild ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġi ++ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ