/* Ċ Ġ* Ġ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 . ide . common . resources Ċ Ċ import Ġcom . google . common . base . Join er Ċ import Ġcom . google . common . base . Splitter Ċ import Ġjava . io . File Ċ Ċ /** ĠImplements ĠA AP T - compatible Ġfile Ġfiltering Ġlogic . Ġ*/ Ċ class ĠPattern Based File Filter Ġ{ ĊĠĠĠ Ġprivate Ġval Ġignored Patterns : ĠList < String > ĊĊĠĠĠ Ġval Ġa apt Style Ignored Pattern : ĠString ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠJoin er . on (': '). join ( ignored Patterns ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCreates Ġdefault Ġresource Ġfile Ġfilter . ĠThe Ġdefault Ġignored Ġpatterns Ġare Ġthe Ġsame Ġas Ġused Ġby ĊĠĠĠĠ Ġ* Ġa apt Ġbut Ġcan Ġbe Ġcustomized Ġvia Ġthe Ġ` ANDROID _ A AP T _ IGNORE ` Ġenvironment Ġvariable . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġconstructor ( android A apt Ignore : ĠAndroid A apt Ignore ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġpatterns : ĠString ? Ġ= Ġandroid A apt Ignore . a apt Ignore Value ĊĠĠĠĠĠĠĠ Ġif Ġ( patterns Ġ== Ġnull Ġ|| Ġpatterns . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠMat ches Ġa apt : Ġframeworks / base / tools / a apt / A apt Assets . cpp : g Default Ignore Assets ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpatterns Ġ= Ġ" !. svn : !. git : !. ds _ store : ! *. scc : .* :< dir >_ *: ! C VS : ! thumbs . db : ! pic asa . ini : ! * ~ " ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġignored Patterns Ġ= ĠSplit ter . on (': '). split ToList ( patterns ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCreates Ġa Ġresource Ġfile Ġfilter Ġusing Ġthe Ġgiven Ġa apt - style Ġignored Ġpattern Ġstring . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠPattern s Ġsyntax : ĊĠĠĠĠ Ġ* Ġ* ĠIndividual Ġpatterns Ġare Ġseparated Ġby Ġcolon Ġ(: ) ĊĠĠĠĠ Ġ* Ġ* ĠEntry Ġcan Ġstart Ġwith Ġthe Ġflag Ġ` !` Ġto Ġavoid Ġprinting Ġa Ġwarning Ġabout Ġthe Ġfile Ġbeing Ġignored . ĊĠĠĠĠ Ġ* Ġ* ĠEntry Ġcan Ġhave Ġthe Ġflag Ġ`< dir >` Ġto Ġmatch Ġonly Ġdirectories Ġor Ġ`< file >` Ġto Ġmatch Ġonly Ġfiles . ĊĠĠĠĠ Ġ* ĠĠ ĠDefault Ġis Ġto Ġmatch Ġboth . ĊĠĠĠĠ Ġ* Ġ* ĠEntry Ġcan Ġbe Ġa Ġsimplified Ġglob Ġ`< prefix >* ` Ġor Ġ` *< suffix >` Ġwhere Ġprefix / suffix Ġmust Ġhave Ġat ĊĠĠĠĠ Ġ* ĠĠ Ġleast Ġ 1 Ġcharacter Ġ( so Ġthat Ġwe Ġdon 't Ġmatch Ġa Ġ'*' Ġcatch - all Ġpattern .) ĊĠĠĠĠ Ġ* Ġ* ĠThe Ġspecial Ġfilenames Ġ"." Ġand Ġ".. " Ġare Ġalways Ġignored . ĊĠĠĠĠ Ġ* Ġ* ĠOtherwise Ġthe Ġfull Ġstring Ġis Ġmatched . ĊĠĠĠĠ Ġ* Ġ* ĠMatch Ġis Ġnot Ġcase - sensitive . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġa apt Style Ignored Pattern Ġthe Ġfile Ġname Ġpatterns Ġto Ġbe Ġignored ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġconstructor ( a apt Style Ignored Pattern : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . ignored Patterns Ġ= ĠSplit ter . on (': '). split ToList ( a apt Style Ignored Pattern ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCreates Ġa Ġresource Ġfile Ġfilter Ġusing Ġthe Ġgiven Ġignored Ġpatterns . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠSimilar Ġto Ġconstructor ( a apt St ype ignored Pattern : ĠString ) Ġabove , Ġbut Ġthis Ġconstructor Ġaccepts Ġa ĊĠĠĠĠ Ġ* Ġlist Ġof Ġstrings Ġinstead Ġof Ġa Ġsingle Ġcolon - de limited Ġstring . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġignored Patterns Ġthe Ġfile Ġname Ġpatterns Ġto Ġbe Ġignored ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġconstructor ( ignored Patterns : ĠList < String >) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . ignored Patterns Ġ= Ġignored Patterns . toList () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠChecks Ġwhether Ġthe Ġgiven Ġfile Ġshould Ġbe Ġignored . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġfile Ġthe Ġfile Ġto Ġcheck ĊĠĠĠĠ Ġ* Ġ@ return Ġtrue Ġif Ġthe Ġfile Ġshould Ġbe Ġignored ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġis Ignored ( file : ĠFile ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠfilePath Ġ= Ġfile . path ĊĊĠĠĠĠĠĠĠ Ġif Ġ( filePath Ġ== Ġ"." Ġ|| ĠfilePath Ġ== Ġ".. ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġis Directory Ġ= Ġfile . isDirectory ĊĠĠĠĠĠĠĠ Ġreturn Ġis Ignored ( filePath , Ġis Directory ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠChecks Ġwhether Ġthe Ġgiven Ġfile Ġshould Ġbe Ġignored . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param ĠfilePath Ġthe Ġpath Ġof Ġthe Ġfile Ġto Ġcheck ĊĠĠĠĠ Ġ* Ġ@ param Ġis Directory Ġindicates Ġwhether Ġthe Ġfile Ġis Ġa Ġdirectory Ġor Ġnot ĊĠĠĠĠ Ġ* Ġ@ return Ġtrue Ġif Ġthe Ġfile Ġshould Ġbe Ġignored ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġis Ignored ( filePath : ĠString , Ġis Directory : ĠBoolean ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( filePath Ġ== Ġ"." Ġ|| ĠfilePath Ġ== Ġ".. ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvar Ġignore Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġval Ġname Index Ġ= ĠfilePath . lastIndexOf ( File . separator Char ) Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠ Ġval Ġname Length Ġ= ĠfilePath . length Ġ- Ġname Index ĊĠĠĠĠĠĠĠ Ġfor Ġ( token Ġin Ġignored Patterns ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( token . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġtoken Index Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( token [ token Index ] Ġ== Ġ' !') Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoken Index ++ Ġ// ĠSkip . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( token . region Matches ( token Index , Ġ"< dir >", Ġ 0 , Ġ 5 )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! isDirectory ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoken Index Ġ+= Ġ 5 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( token . region Matches ( token Index , Ġ"< file >", Ġ 0 , Ġ 6 )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( isDirectory ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoken Index Ġ+= Ġ 6 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġn Ġ= Ġtoken . length Ġ- Ġtoken Index ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( token [ token Index ] Ġ== Ġ'* ') Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠMatch Ġ* suffix Ġsuch Ġas Ġ*. scc Ġor Ġ* ~ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoken Index ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġn -- ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( n Ġ<= Ġname Length ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġignore Ġ= Ġtoken . region Matches ( token Index , ĠfilePath , Ġname Index Ġ+ Ġname Length Ġ- Ġn , Ġn , Ġignore Case Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ( n Ġ> Ġ 1 Ġ&& Ġtoken [ token . length Ġ- Ġ 1 ] Ġ== Ġ'* ') Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠMatch Ġprefix * Ġsuch Ġas Ġ.* Ġor Ġ_ * ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġignore Ġ= Ġtoken . region Matches ( token Index , ĠfilePath , Ġname Index , Ġn Ġ- Ġ 1 , Ġignore Case Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠMatch Ġexactly , Ġsuch Ġas Ġthumb s . db , Ġ. git , Ġetc . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġignore Ġ= Ġtoken . length Ġ- Ġtoken Index Ġ== ĠfilePath . length Ġ- Ġname Index Ġ&& Ġtoken . region Matches ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoken Index , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠfilePath , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Index , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠfilePath . length Ġ- Ġname Index , Ġignore Case Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ignore ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġignore ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( this Ġ=== Ġother ) Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġif Ġ( other Ġ== Ġnull Ġ|| Ġjava Class Ġ!= Ġother . java Class ) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġval Ġother Filter Ġ= Ġother Ġas ĠPattern Based File Filter ? ĊĠĠĠĠĠĠĠ Ġreturn Ġignored Patterns Ġ== Ġother Filter !!. ignored Patterns ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠhashCode (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġignored Patterns . hashCode () ĊĠĠĠ Ġ} Ċ } Ċ