/* Ċ Ġ* Ġ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 . tools . idea . assistant Ċ Ċ import Ġcom . android . Sdk Constants Ċ import Ġcom . android . tools . idea . np w . model . act ually Render Ċ import Ġcom . android . tools . idea . np w . model . find References Ċ import Ġcom . android . tools . idea . templates . Template Utils . open Editors Ċ import Ġcom . android . tools . idea . templates . get Existing Module Template Data Builder Ċ import Ġcom . android . tools . idea . templates . recipe . Rendering Context Ċ import Ġcom . google . common . collect . ImmutableList Ċ import Ġcom . intellij . openapi . command . Write Command Action . write Command Action Ċ import Ġcom . intellij . openapi . diagnostic . Logger Ċ import Ġcom . intellij . openapi . diagnostic . logger Ċ import Ġcom . intellij . openapi . module . Module Ċ import Ġcom . intellij . openapi . project . Project Ċ import Ġcom . intellij . openapi . util . Pair Ċ import Ġcom . intellij . openapi . util . io . File Util Ċ import Ġorg . jetbrains . android . facet . Android Root Util Ċ import Ġorg . xml . sax . Attributes Ċ import Ġorg . xml . sax . helpers . Default Handler Ċ import Ġjava . io . File Ċ import Ġjavax . xml . parsers . SAX Parser Factory Ċ import Ġcom . android . tools . idea . wizard . template . Recipe Ċ Ċ private Ġval Ġlog : ĠLogger Ġget () Ġ= Ġlogger < Recipe Utils >() Ċ Ċ /** Ċ Ġ* ĠA Ġcollection Ġof Ġutility Ġmethods Ġfor Ġinteracting Ġwith Ġan Ġ` Recipe `. Ċ Ġ*/ Ċ object ĠRecipe Utils Ġ{ ĊĠ Ġ// ĠTODO ( q um eric ): Ġremove Ġthis Ġcache . ĠIt Ġis Ġnot Ġneeded Ġanymore , Ġeverything Ġis Ġfast Ġwithout Ġit . ĊĠ Ġprivate Ġval Ġrecipe Metadata Cache : ĠMutable Map < Pair < Recipe , ĠProject >, ĠList < Recipe Metadata >> Ġ= Ġhash Map Of () ĊĊĠ Ġprivate Ġfun Ġget Recipe Metadata ( recipe : ĠRecipe , Ġmodule : ĠModule ): ĠRecipe Metadata Ġ{ ĊĠĠĠ Ġval Ġkey Ġ= ĠPair ( recipe , Ġmodule . project ) ĊĠĠĠ Ġif Ġ( recipe Metadata Cache . containsKey ( key )) Ġ{ ĊĠĠĠĠĠ Ġval Ġmetadata Ġ= Ġrecipe Metadata Cache [ key ] !!. find Ġ{ Ġit . recipe Ġ== Ġrecipe Ġ} ĊĠĠĠĠĠ Ġif Ġ( metadata Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġmetadata ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġmetadata Ġ= ĠRecipe Metadata ( recipe , Ġmodule ) ĊĊĠĠĠ Ġval Ġmodule Root Ġ= ĠAndroid Root Util . find Module Root FolderPath ( module ) !! ĊĠĠĠ Ġ// ĠTODO : Ġdo Ġwe Ġcare Ġabout Ġthis Ġpath ? ĊĠĠĠ Ġval Ġroot Path Ġ= ĠFile ( File Util . generate Random Temporary Path (), Ġ" unused ") ĊĠĠĠ Ġroot Path . delete On Exit () ĊĊĠĠĠ Ġval Ġcontext Ġ= ĠRendering Context ( ĊĠĠĠĠĠ Ġproject Ġ= Ġmodule . project , ĊĠĠĠĠĠ Ġmodule Ġ= Ġmodule , ĊĠĠĠĠĠ Ġcommand Name Ġ= Ġ" Unnamed ", ĊĠĠĠĠĠ Ġtemplate Data Ġ= Ġget Existing Module Template Data Builder ( module ). build (), ĊĠĠĠĠĠ Ġoutput Root Ġ= Ġroot Path , ĊĠĠĠĠĠ Ġmodule Root Ġ= Ġmodule Root , ĊĠĠĠĠĠ Ġdry Run Ġ= Ġfalse , ĊĠĠĠĠĠ Ġshow Errors Ġ= Ġtrue ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġ// ĠTODO ( b / 1 4 9 0 8 5 6 9 6 ): Ġcreate Ġlogging Ġevents Ġfor ĠFirebase ? ĊĠĠĠ Ġrecipe . find References ( context ) ĊĊĠĠĠ Ġ// ĠTODO ( q um eric ): Ġconsider Ġusing ĠRendering Context Ġinstead Ġof Ġcustom ĠRecipe Metadata Ġclass ĊĠĠĠ Ġwith ( context ) Ġ{ ĊĠĠĠĠĠ Ġval Ġmanifest s Ġ= Ġmutable ListOf < File >() ĊĠĠĠĠĠ Ġ// ĠFIXME ( q um eric ): Ġsource Files . filter Ġ{ Ġit . name Ġ== ĠS dk Constants . FN _ ANDROID _ MAN IFEST _ XML Ġ} ĊĊĠĠĠĠĠ Ġ// ĠIgnore Ġtest Ġconfigurations Ġhere . ĊĠĠĠĠĠ Ġdependencies [ Sdk Constants . GRAD LE _ COMPILE _ CONFIGURATION ]. forEach Ġ{ Ġmetadata . dependencies . add ( it !! ) Ġ} ĊĠĠĠĠĠ Ġclasspath Entries . forEach Ġ{ Ġmetadata . classpath Entries . add ( it ) Ġ} ĊĠĠĠĠĠ Ġmanifest s . forEach Ġ{ Ġparse Manifest For Permissions ( it , Ġmetadata ) Ġ} ĊĠĠĠĠĠ Ġplugins . forEach Ġ{ Ġmetadata . plugins . add ( it ) Ġ} ĊĠĠĠĠĠ Ġtarget Files . forEach Ġ{ Ġmetadata . modified Files . add ( it ) Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġmetadata ĊĠ Ġ} ĊĊĠ Ġ@ Jvm Static ĊĠ Ġfun Ġget Recipe Metadata ( recipe : ĠRecipe , Ġproject : ĠProject ): ĠList < Recipe Metadata > Ġ{ ĊĠĠĠ Ġval Ġkey Ġ= ĠPair ( recipe , Ġproject ) ĊĠĠĠ Ġif Ġ(! recipe Metadata Cache . containsKey ( key )) Ġ{ ĊĠĠĠĠĠ Ġval Ġcache Ġ= ĠImmutableList . builder < Recipe Metadata >() ĊĠĠĠĠĠ Ġfor Ġ( module Ġin ĠAss ist Action StateManager . get Android Modules ( project )) Ġ{ ĊĠĠĠĠĠĠĠ Ġcache . add ( get Recipe Metadata ( recipe , Ġmodule )) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġrecipe Metadata Cache [ key ] Ġ= Ġcache . build () ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġrecipe Metadata Cache [ key ] !! ĊĠ Ġ} ĊĊĠ Ġ@ Jvm Static ĊĠ Ġfun Ġexecute ( recipe : ĠRecipe , Ġmodule : ĠModule ) Ġ{ ĊĠĠĠ Ġval Ġmodule Root Ġ= ĠAndroid Root Util . find Module Root FolderPath ( module ) !! ĊĠĠĠ Ġval Ġroot Path Ġ= ĠFile ( File Util . generate Random Temporary Path (), Ġ" unused ") ĊĊĠĠĠ Ġval Ġcontext Ġ= ĠRendering Context ( ĊĠĠĠĠĠ Ġproject Ġ= Ġmodule . project , ĊĠĠĠĠĠ Ġmodule Ġ= Ġmodule , ĊĠĠĠĠĠ Ġcommand Name Ġ= Ġ" Unnamed ", ĊĠĠĠĠĠ Ġtemplate Data Ġ= Ġget Existing Module Template Data Builder ( module ). build (), ĊĠĠĠĠĠ Ġoutput Root Ġ= Ġroot Path , ĊĠĠĠĠĠ Ġmodule Root Ġ= Ġmodule Root , ĊĠĠĠĠĠ Ġdry Run Ġ= Ġfalse , ĊĠĠĠĠĠ Ġshow Errors Ġ= Ġtrue ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġwrite Command Action ( module . project ). with Name (" Executing Ġrecipe Ġinstructions "). run < Exception > Ġ{ ĊĠĠĠĠĠ Ġ// ĠTODO ( b / 1 4 9 0 8 5 6 9 6 ): Ġcreate Ġlogging Ġevents Ġfor ĠFirebase ? ĊĠĠĠĠĠ Ġrecipe . act ually Render ( context ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Editors ( module . project , Ġcontext . files To Open , Ġtrue ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġparse Manifest For Permissions ( f : ĠFile , Ġmetadata : ĠRecipe Metadata ) Ġ= Ġtry Ġ{ ĊĠĠĠ Ġval Ġfactory Ġ= ĠSAX Parser Factory . newInstance () ĊĠĠĠ Ġval Ġs ax Parser Ġ= Ġfactory . new SAX Parser () ĊĠĠĠ Ġs ax Parser . parse ( f , Ġobject Ġ: ĠDefault Handler () Ġ{ ĊĠĠĠĠĠ Ġoverride Ġfun Ġstart Element ( uri : ĠString , Ġlocal Name : ĠString , ĠtagName : ĠString , Ġattributes : ĠAttributes ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( tagName Ġ== ĠS dk Constants . TAG _ USE S _ PERMISSION Ġ|| ĠtagName Ġ== ĠS dk Constants . TAG _ USE S _ PERMISSION _ SDK _ 2 3 Ġ|| ĠtagName Ġ== ĠS dk Constants . TAG _ USE S _ PERMISSION _ SDK _ M ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġ// ĠMost Ġpermissions Ġare Ġ" android . permission . XXX ", Ġso Ġfor Ġread ability , Ġjust Ġremove Ġthe Ġprefix Ġif Ġpresent ĊĠĠĠĠĠĠĠĠĠ Ġval Ġpermission Ġ= Ġattributes . getValue ( Sdk Constants . ANDROID _ NS _ NAME _ PREFIX Ġ+ ĠS dk Constants . ATTR _ NAME ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. replace ( Sdk Constants . ANDROID _ PKG _ PREFIX Ġ+ ĠS dk Constants . ATTR _ PERMISSION Ġ+ Ġ".", Ġ"") ĊĠĠĠĠĠĠĠĠĠ Ġmetadata . permissions . add ( permission ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}) ĊĠ Ġ} ĊĠ Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠ Ġ// ĠThis Ġmethod Ġshouldn 't Ġcrash Ġthe Ġuser Ġfor Ġany Ġreason , Ġas Ġshowing Ġpermissions Ġis Ġjust Ġinformation al , ĊĠĠĠ Ġ// Ġbut Ġlog Ġa Ġwarning Ġso Ġdevelopers Ġcan Ġsee Ġif Ġthey Ġmake Ġa Ġmistake Ġwhen Ġcreating Ġtheir Ġservice . ĊĠĠĠ Ġlog . warn (" Failed Ġto Ġread Ġpermissions Ġfrom ĠAndroid Manifest . xml ", Ġe ) ĊĠ Ġ} Ċ } ĊĊ