@@ -38,7 +38,7 @@ def createPluginConfigFile = false
38
38
def configStage = " \n :config phase: "
39
39
def nodeModulesDir = " ../../node_modules/"
40
40
def libDir = " $projectDir /../../lib/Android/"
41
- def pluginNames = new ArrayList<String > ()
41
+ def flavorNames = new ArrayList<String > ()
42
42
def configDir = file(configurationsDir)
43
43
44
44
def dontRunSbg = project. hasProperty(" dontRunSbg" );
@@ -203,36 +203,119 @@ task pluginStructureCheck {
203
203
}
204
204
}
205
205
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
+
208
234
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);
217
236
}
218
237
219
238
def sanatizeDimensionName (str ) {
220
239
return str. replaceAll(/ \W / , " " )
221
240
}
222
241
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
+
223
296
// 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;
234
303
}
235
304
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
+
236
319
task createDefaultIncludeFiles {
237
320
description " creates default include.gradle files for added plugins IF NECESSARY"
238
321
println " $configStage createDefaultIncludeFiles"
@@ -246,19 +329,23 @@ task createDefaultIncludeFiles {
246
329
createPluginConfigFile = true
247
330
def foundIncludeFile = false
248
331
332
+ def flavor = " F" + flavorNumber++
333
+
249
334
println " \t +found plugins: " + fileName
250
335
fl. listFiles(). each { subFile ->
251
336
252
337
if (subFile. name == " include.gradle" ) {
253
338
foundIncludeFile = true
254
- dimensionName = updateIncludeGradleFile(subFile, dimensionName)
339
+ updateIncludeGradleFile(subFile, dimensionName, flavor)
340
+ renamePluginDirToFlavorName(subFile. getParentFile(), flavor);
255
341
}
256
342
}
257
343
258
- pluginNames . add(' "' + dimensionName + ' "' )
344
+ flavorNames . add(' "' + dimensionName + ' "' )
259
345
260
346
if (! foundIncludeFile) {
261
- createIncludeFile(fl. getAbsolutePath() ,fileName, dimensionName)
347
+ createIncludeFile(fl. getAbsolutePath() , flavor, dimensionName)
348
+ renamePluginDirToFlavorName(fl, flavor);
262
349
}
263
350
}
264
351
}
@@ -271,15 +358,16 @@ task createPluginsConfigFile {
271
358
println " $configStage createPluginsConfigFile"
272
359
273
360
def flavorsFile = new File (" $configurationsDir /include.gradle" )
274
- flavorsFile. write " " // clear config file
275
-
361
+
276
362
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(" , " )
279
365
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
283
371
}
284
372
}
285
373
}
@@ -527,4 +615,3 @@ task buildapk {
527
615
528
616
dependsOn deleteExplodedAarFolder
529
617
}
530
-
0 commit comments