@@ -38,7 +38,7 @@ def createPluginConfigFile = false
3838def configStage = " \n :config phase: "
3939def nodeModulesDir = " ../../node_modules/"
4040def libDir = " $projectDir /../../lib/Android/"
41- def pluginNames = new ArrayList<String > ()
41+ def flavorNames = new ArrayList<String > ()
4242def configDir = file(configurationsDir)
4343
4444def dontRunSbg = project. hasProperty(" dontRunSbg" );
@@ -203,36 +203,119 @@ task pluginStructureCheck {
203203 }
204204}
205205
206- def createIncludeFile (filePath , fileName , dimensionName ) {
207- println " \t +creating include.gradle file for: " + filePath
206+ def createProductFlavorsContent (flavor , dimensionName , includeAndroidContent = true )
207+ {
208+ if (includeAndroidContent)
209+ {
210+ def content = """ android {
211+ productFlavors {
212+ "${ flavor} " {
213+ dimension "${ dimensionName} "
214+ }
215+ }
216+ }"""
217+ return content;
218+ }
219+ else
220+ {
221+ def content = """ productFlavors {
222+ "${ flavor} " {
223+ dimension "${ dimensionName} "
224+ }
225+ }"""
226+ return content;
227+ }
228+ }
229+
230+
231+ def createIncludeFile (filePath , flavor , dimensionName ) {
232+ println " \t + creating include.gradle file for ${ filePath} "
233+
208234 def defaultIncludeFile = new File (filePath, " include.gradle" )
209- defaultIncludeFile. write " "
210- defaultIncludeFile << " android { \n "
211- defaultIncludeFile << " \t productFlavors {\n "
212- defaultIncludeFile << ' \t\t "' + fileName + ' " {\n '
213- defaultIncludeFile << ' \t\t\t dimension "' + dimensionName + ' "\n '
214- defaultIncludeFile << " \t\t }\n "
215- defaultIncludeFile << " \t }\n "
216- defaultIncludeFile << " }"
235+ defaultIncludeFiletext. text = createProductFlavorsContent(flavor, dimensionName);
217236}
218237
219238def sanatizeDimensionName (str ) {
220239 return str. replaceAll(/ \W / , " " )
221240}
222241
242+ def replaceProductFlavorInContent (content , dimension , flavor )
243+ {
244+ def indexStart = content. indexOf(" productFlavors" );
245+ def index = indexStart + " productFlavors" . length();
246+ def indexEnd = -1 ;
247+ def nestedOpenBraketsCount = 0 ;
248+
249+ while (index < content. length())
250+ {
251+ print content[index]
252+ if (content[index] == " }" )
253+ {
254+ if (nestedOpenBraketsCount == 0 )
255+ {
256+ indexEnd = index;
257+ break ;
258+ }
259+ else
260+ {
261+ nestedOpenBraketsCount-- ;
262+ }
263+ }
264+ else if (content[index] == " {" )
265+ {
266+ nestedOpenBraketsCount++ ;
267+ }
268+
269+ index++ ;
270+ }
271+
272+ if (indexEnd != -1 )
273+ {
274+ def oldProductFlavorsText = content. substring(indexStart, indexEnd - 1 );
275+
276+ def newProductFlavorsContent = createProductFlavorsContent(flavor, dimension, false );
277+
278+ return content. replace(oldProductFlavorsText, newProductFlavorsContent);
279+ }
280+ else
281+ {
282+ def androidContentExists = content. indexOf(" android {" ) != -1 ;
283+ def newProductFlavorsContent = createProductFlavorsContent(flavor, dimension, ! androidContentExists);
284+
285+ if (androidContentExists)
286+ {
287+ return content. replace(" android {" , " android { ${ newProductFlavorsContent} " );
288+ }
289+ else
290+ {
291+ return " ${ newProductFlavorsContent} \t ${ content} "
292+ }
293+ }
294+ }
295+
223296// make sure the include.gradle file, produced by the user, has only allowed characters in dimension attribute and remove any invalid characters if necessary
224- def updateIncludeGradleFile (subFile , dimensionName ) {
225- def igFile = new File (subFile. getAbsolutePath())
226- def newContent = igFile. text. replaceAll(/ dimension\s +["'](.+?)["']/ ) { fullMatch , fDimension ->
227- def newFg = sanatizeDimensionName(fDimension)
228- dimensionName = newFg
229- return " dimension \" $newFg \" "
230- }
231- igFile. text = newContent
232-
233- return dimensionName
297+ def updateIncludeGradleFile (targetFile , dimensionName , flavor )
298+ {
299+ def fileEntry = new File (targetFile. getAbsolutePath());
300+ def content = fileEntry. text;
301+ def replacedContent = replaceProductFlavorInContent(content, dimensionName, flavor);
302+ fileEntry. text = replacedContent;
234303}
235304
305+ def renamePluginDirToFlavorName (directory , flavor )
306+ {
307+ def parentName = directory. getName();
308+ def parentFile = new File (" src" , parentName);
309+ if (parentFile. exists())
310+ {
311+ def targetDirName = new File (" src" , flavor);
312+ println " Renaming plugin directory to flavor name: ${ parentFile.getAbsolutePath()} -> ${ targetDirName.getAbsolutePath()} " ;
313+ parentFile. renameTo(targetDirName);
314+ }
315+ }
316+
317+ def flavorNumber = 0
318+
236319task createDefaultIncludeFiles {
237320 description " creates default include.gradle files for added plugins IF NECESSARY"
238321 println " $configStage createDefaultIncludeFiles"
@@ -246,19 +329,23 @@ task createDefaultIncludeFiles {
246329 createPluginConfigFile = true
247330 def foundIncludeFile = false
248331
332+ def flavor = " F" + flavorNumber++
333+
249334 println " \t +found plugins: " + fileName
250335 fl. listFiles(). each { subFile ->
251336
252337 if (subFile. name == " include.gradle" ) {
253338 foundIncludeFile = true
254- dimensionName = updateIncludeGradleFile(subFile, dimensionName)
339+ updateIncludeGradleFile(subFile, dimensionName, flavor)
340+ renamePluginDirToFlavorName(subFile. getParentFile(), flavor);
255341 }
256342 }
257343
258- pluginNames . add(' "' + dimensionName + ' "' )
344+ flavorNames . add(' "' + dimensionName + ' "' )
259345
260346 if (! foundIncludeFile) {
261- createIncludeFile(fl. getAbsolutePath() ,fileName, dimensionName)
347+ createIncludeFile(fl. getAbsolutePath() , flavor, dimensionName)
348+ renamePluginDirToFlavorName(fl, flavor);
262349 }
263350 }
264351 }
@@ -271,15 +358,16 @@ task createPluginsConfigFile {
271358 println " $configStage createPluginsConfigFile"
272359
273360 def flavorsFile = new File (" $configurationsDir /include.gradle" )
274- flavorsFile. write " " // clear config file
275-
361+
276362 if (createPluginConfigFile) {
277- println " \t +creating product flavors include.gradle file in $configurationsDir folder..."
278- def flavors = pluginNames . join(" ," )
363+ println " \t Creating product flavors include.gradle file in $configurationsDir folder..."
364+ def flavors = flavorNames . join(" , " )
279365
280- flavorsFile << " android { \n "
281- flavorsFile << " \t flavorDimensions " + flavors + " \n "
282- flavorsFile << " }\n "
366+ def content = """ android {
367+ flavorDimensions ${ flavors}
368+ }"""
369+
370+ flavorsFile. text = content
283371 }
284372 }
285373}
@@ -527,4 +615,3 @@ task buildapk {
527615
528616 dependsOn deleteExplodedAarFolder
529617}
530-
0 commit comments