diff --git a/build/project-template-gradle/build.gradle b/build/project-template-gradle/build.gradle index 19fb432f6..f926258e8 100644 --- a/build/project-template-gradle/build.gradle +++ b/build/project-template-gradle/build.gradle @@ -38,7 +38,7 @@ def createPluginConfigFile = false def configStage = "\n:config phase: " def nodeModulesDir = "../../node_modules/" def libDir = "$projectDir/../../lib/Android/" -def pluginNames = new ArrayList<String>() +def flavorNames = new ArrayList<String>() def configDir = file(configurationsDir) def dontRunSbg = project.hasProperty("dontRunSbg"); @@ -206,36 +206,119 @@ task pluginStructureCheck { } } -def createIncludeFile (filePath, fileName, dimensionName) { - println "\t+creating include.gradle file for: " + filePath +def createProductFlavorsContent(flavor, dimensionName, includeAndroidContent = true) +{ + if (includeAndroidContent) + { + def content = """android { + productFlavors { + "${flavor}" { + dimension "${dimensionName}" + } + } + }""" + return content; + } + else + { + def content = """productFlavors { + "${flavor}" { + dimension "${dimensionName}" + } + }""" + return content; + } +} + + +def createIncludeFile (filePath, flavor, dimensionName) { + println "\t + creating include.gradle file for ${filePath}" + def defaultIncludeFile = new File(filePath, "include.gradle") - defaultIncludeFile.write "" - defaultIncludeFile << "android { \n" - defaultIncludeFile << "\tproductFlavors {\n" - defaultIncludeFile << '\t\t"' + fileName + '" {\n' - defaultIncludeFile << '\t\t\tdimension "' + dimensionName + '"\n' - defaultIncludeFile << "\t\t}\n" - defaultIncludeFile << "\t}\n" - defaultIncludeFile << "}" + defaultIncludeFiletext.text = createProductFlavorsContent(flavor, dimensionName); } def sanatizeDimensionName(str) { return str.replaceAll(/\W/, "") } +def replaceProductFlavorInContent(content, dimension, flavor) +{ + def indexStart = content.indexOf("productFlavors"); + def index = indexStart + "productFlavors".length(); + def indexEnd = -1; + def nestedOpenBraketsCount = 0; + + while (index < content.length()) + { + print content[index] + if (content[index] == "}") + { + if (nestedOpenBraketsCount == 0) + { + indexEnd = index; + break; + } + else + { + nestedOpenBraketsCount--; + } + } + else if (content[index] == "{") + { + nestedOpenBraketsCount++; + } + + index++; + } + + if (indexEnd != -1) + { + def oldProductFlavorsText = content.substring(indexStart, indexEnd - 1); + + def newProductFlavorsContent = createProductFlavorsContent(flavor, dimension, false); + + return content.replace(oldProductFlavorsText, newProductFlavorsContent); + } + else + { + def androidContentExists = content.indexOf("android {") != -1; + def newProductFlavorsContent = createProductFlavorsContent(flavor, dimension, !androidContentExists); + + if (androidContentExists) + { + return content.replace("android {", "android { ${newProductFlavorsContent}"); + } + else + { + return "${newProductFlavorsContent} \t ${content}" + } + } +} + //make sure the include.gradle file, produced by the user, has only allowed characters in dimension attribute and remove any invalid characters if necessary -def updateIncludeGradleFile(subFile, dimensionName) { - def igFile = new File(subFile.getAbsolutePath()) - def newContent = igFile.text.replaceAll(/dimension\s+["'](.+?)["']/) { fullMatch, fDimension -> - def newFg = sanatizeDimensionName(fDimension) - dimensionName = newFg - return "dimension \"$newFg\"" - } - igFile.text = newContent - - return dimensionName +def updateIncludeGradleFile(targetFile, dimensionName, flavor) +{ + def fileEntry = new File(targetFile.getAbsolutePath()); + def content = fileEntry.text; + def replacedContent = replaceProductFlavorInContent(content, dimensionName, flavor); + fileEntry.text = replacedContent; } +def renamePluginDirToFlavorName(directory, flavor) +{ + def parentName = directory.getName(); + def parentFile = new File("src", parentName); + if (parentFile.exists()) + { + def targetDirName = new File("src", flavor); + println "Renaming plugin directory to flavor name: ${parentFile.getAbsolutePath()} -> ${targetDirName.getAbsolutePath()}"; + parentFile.renameTo(targetDirName); + } +} + +def flavorNumber = 0 + task createDefaultIncludeFiles { description "creates default include.gradle files for added plugins IF NECESSARY" println "$configStage createDefaultIncludeFiles" @@ -249,19 +332,23 @@ task createDefaultIncludeFiles { createPluginConfigFile = true def foundIncludeFile = false + def flavor = "F" + flavorNumber++ + println "\t+found plugins: " + fileName fl.listFiles().each { subFile -> if(subFile.name == "include.gradle") { foundIncludeFile = true - dimensionName = updateIncludeGradleFile(subFile, dimensionName) + updateIncludeGradleFile(subFile, dimensionName, flavor) + renamePluginDirToFlavorName(subFile.getParentFile(), flavor); } } - pluginNames.add('"' + dimensionName + '"') + flavorNames.add('"' + dimensionName + '"') if(!foundIncludeFile) { - createIncludeFile(fl.getAbsolutePath() ,fileName, dimensionName) + createIncludeFile(fl.getAbsolutePath() , flavor, dimensionName) + renamePluginDirToFlavorName(fl, flavor); } } } @@ -274,15 +361,16 @@ task createPluginsConfigFile { println "$configStage createPluginsConfigFile" def flavorsFile = new File("$configurationsDir/include.gradle") - flavorsFile.write "" //clear config file - + if(createPluginConfigFile) { - println "\t+creating product flavors include.gradle file in $configurationsDir folder..." - def flavors = pluginNames.join(",") + println "\t Creating product flavors include.gradle file in $configurationsDir folder..." + def flavors = flavorNames.join(", ") - flavorsFile << "android { \n" - flavorsFile << "\tflavorDimensions " + flavors + "\n" - flavorsFile << "}\n" + def content = """android { + flavorDimensions ${flavors} + }""" + + flavorsFile.text = content } } } @@ -530,4 +618,3 @@ task buildapk { dependsOn deleteExplodedAarFolder } -