package Ġcom . s uka idev . compiler Ċ Ċ import Ġcom . google . auto . service . Auto Service Ċ import Ġcom . s uka idev . annotation . Destination Ċ import Ġcom . s uka idev . compiler . Constants . ACTIVITY _ JVM _ CLASS _ NAME Ċ import Ġcom . s uka idev . compiler . Constants . CONFIG _ OUT _ PUT _ FILE _ NAME Ċ import Ġcom . s uka idev . compiler . Constants . DIALOG _ FRAGMENT _ JVM _ CLASS _ NAME Ċ import Ġcom . s uka idev . compiler . Constants . FRAGMENT _ JVM _ CLASS _ NAME Ċ import Ġcom . s uka idev . compiler . Constants . NAV _ MODULE _ NAME Ċ import Ġcom . s uka idev . compiler . Context Holder . elements Ċ import Ġcom . s uka idev . compiler . Context Holder . filer Ċ import Ġcom . s uka idev . compiler . Context Holder . gson Ċ import Ġcom . s uka idev . compiler . Context Holder . types Ċ import Ġjava . io . File Ċ import Ġjava . io . File OutputStream Ċ import Ġjava . io . OutputStream Writer Ċ import Ġjavax . annotation . processing .* Ċ import Ġjavax . lang . model . Source Version Ċ import Ġjavax . lang . model . element . Element Ċ import Ġjavax . lang . model . element . Type Element Ċ import Ġjavax . lang . model . type . Type Mirror Ċ import Ġjavax . tools . Standard Location Ċ import Ġkotlin . math . abs Ċ Ċ @ Auto Service ( Processor :: class ) Ċ @ Supported Source Version ( Source Version . RELEASE _ 1 1 ) Ċ @ Supported Annotation Types (" com . s uka idev . annotation . Destination ") Ċ class ĠNav Processor Ġ: ĠAbstract Processor () Ġ{ ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġactivity Type : ĠType Mirror ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġfragment Type : ĠType Mirror ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġdialog Type : ĠType Mirror ĊĠĠĠ Ġprivate Ġlateinit Ġvar ĠmoduleName : ĠString ĊĊĠĠĠ Ġoverride Ġfun Ġinit ( processing Env : ĠProcessing Environment ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . init ( processing Env ) ĊĠĠĠĠĠĠĠ ĠLogger . init ( processing Env . mess ager ) ĊĠĠĠĠĠĠĠ ĠContext Holder . init ( processing Env ) ĊĊĠĠĠĠĠĠĠ ĠmoduleName Ġ= Ġprocessing Env . options [ NAV _ MODULE _ NAME ] Ġ?: Ġ"" ĊĠĠĠĠĠĠĠ Ġactivity Type Ġ= Ġelements . getType Element ( ACTIVITY _ JVM _ CLASS _ NAME ). as Type () ĊĠĠĠĠĠĠĠ Ġfragment Type Ġ= Ġelements . getType Element ( FRAGMENT _ JVM _ CLASS _ NAME ). as Type () ĊĠĠĠĠĠĠĠ Ġdialog Type Ġ= Ġelements . getType Element ( DIALOG _ FRAGMENT _ JVM _ CLASS _ NAME ). as Type () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġprocess ( ĊĠĠĠĠĠĠĠ Ġannotations : ĠMutable Set < out ĠType Element >, ĊĠĠĠĠĠĠĠ Ġround Env : ĠRound Environment ĊĠĠĠ Ġ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Map Ġ= ĠHashMap < String , ĠDestination Node >() ĊĊĠĠĠĠĠĠĠ Ġround Env . getElement s Annotated With ( Destination :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . filter Ġ{ Ġit . kind . is Class Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . forEach Ġ{ Ġelement Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Destination ( element , Ġresult Map ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( result Map . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgenerate ConfigFile ( result Map ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Destination ( element : ĠElement , Ġresult Map : ĠHashMap < String , ĠDestination Node >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtype Element Ġ= Ġelement Ġas ĠType Element ĊĠĠĠĠĠĠĠ Ġval Ġdestination Ġ= Ġtype Element . getAnnotation ( Destination :: class . java ) ĊĊĠĠĠĠĠĠĠ Ġval Ġclazz Name Ġ= Ġtype Element . qualified Name . toString () ĊĊĠĠĠĠĠĠĠ Ġval Ġid Ġ= Ġabs ( clazz Name . hashCode ()) ĊĠĠĠĠĠĠĠ Ġval Ġpath Ġ= Ġdestination . path ĊĠĠĠĠĠĠĠ Ġval Ġas Starter Ġ= Ġdestination . as Starter ĊĊĠĠĠĠĠĠĠ Ġif Ġ( result Map . containsKey ( path )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . error ( element , Ġ" Different Ġpages Ġcannot Ġhave Ġthe Ġsame Ġpath .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelement . as Type (). is SubType ( activity Type , Ġtypes ) Ġ-> Ġ" Activity " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelement . as Type (). is SubType ( fragment Type , Ġtypes ) Ġ-> Ġ" Fragment " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelement . as Type (). is SubType ( dialog Type , Ġtypes ) Ġ-> Ġ" Dialog " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . error ( element , Ġ" Unsupported Ġtype Element :${ element . simple Name }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult Map [ path ] Ġ= ĠDestination Node ( id , Ġpath , Ġtype , Ġas Starter , Ġclazz Name ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . log Parsing Error ( element , ĠDestination :: class . java , Ġe ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate ConfigFile ( map : ĠHashMap < String , ĠDestination Node >) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconfig Path Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġf iler . create Resource ( Standard Location . CLASS _ OUTPUT , Ġ"", ĠCONFIG _ OUT _ PUT _ FILE _ NAME ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. to Uri (). path Ċ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġapp Path Ġ= Ġconfig Path . substring ( 0 , Ġconfig Path . indexOf (" app ") Ġ+ Ġ 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġapp Path Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconfig Path . substring ( 0 , Ġconfig Path . indexOf ( moduleName ) Ġ+ ĠmoduleName . length ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġassets Path Ġ= Ġ"$ app Path / src / main / assets " Ċ // ĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . warn (" app Path : Ġ$ app Path ĠĠ Ġassets Path Ġ: Ġ$ assets Path ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġassets File Ġ= ĠFile ( assets Path ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġassets çĽ®å½ķ åı¯èĥ½ å¹¶ æľª åĪĽå»º ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! assets File . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġassets File . mkdir s () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠoutputFile Ġ= ĠFile ( assets Path , ĠCONFIG _ OUT _ PUT _ FILE _ NAME ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( outputFile . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠoutputFile . delete () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġf os Ġ= ĠFileOutputStream ( outputFile ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwriter Ġ= ĠOutputStream Writer ( fos ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwriter . write ( gson . toJson ( map )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwriter . flush () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwriter . close () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġf os . close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwriter . close () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ }