11package cn.hx.plugin.junkcode.task
22
3-
4- import cn.hx.plugin.junkcode.template.ResTemplate
3+ import cn.hx.plugin.junkcode.ext.JunkCodeConfig
54import cn.hx.plugin.junkcode.template.ManifestTemplate
5+ import cn.hx.plugin.junkcode.template.ResTemplate
66import com.squareup.javapoet.ClassName
77import com.squareup.javapoet.JavaFile
88import com.squareup.javapoet.MethodSpec
99import com.squareup.javapoet.TypeSpec
1010import groovy.text.GStringTemplateEngine
1111import org.gradle.api.DefaultTask
1212import org.gradle.api.tasks.Input
13+ import org.gradle.api.tasks.Nested
1314import org.gradle.api.tasks.OutputDirectories
1415import org.gradle.api.tasks.TaskAction
1516
@@ -21,28 +22,20 @@ class AndroidJunkCodeTask extends DefaultTask {
2122
2223 static abc = " abcdefghijklmnopqrstuvwxyz" . toCharArray()
2324
25+ @Nested
26+ JunkCodeConfig config = new JunkCodeConfig ()
27+
2428 @Input
2529 String manifestPackageName = " "
26- @Input
27- String [] packages = []
28- @Input
29- int activityCountPerPackage = 0
30- @Input
31- int otherCountPerPackage = 0
32- @Input
33- int methodCountPerClass = 0
34- @Input
35- String resPrefix = " junk_"
36- @Input
37- int drawableCount = 0
38- @Input
39- int stringCount = 0
4030
4131 @OutputDirectories
4232 File outDir
4333
4434 @TaskAction
4535 void execute () {
36+ if (outDir. exists()) {
37+ outDir. deleteDir()
38+ }
4639 // 通过成类
4740 generateClasses()
4841 // 生成资源
@@ -53,28 +46,26 @@ class AndroidJunkCodeTask extends DefaultTask {
5346 * 生成java代码和AndroidManifest.xml
5447 */
5548 void generateClasses () {
56- def manifestFile = new File (outDir, " AndroidManifest.xml" )
57- if (manifestFile. exists()) {
58- manifestFile. delete()
59- }
60- packages. each { packageName ->
49+ def javaDir = new File (outDir, " java" )
50+ for (int i = 0 ; i < config. packageCount; i++ ) {
51+ String packageName = config. packageBase + " ." + generateName(i)
6152 // 生成Activity
62- for (int i = 0 ; i < activityCountPerPackage; i ++ ) {
63- def activityPreName = generateName(i )
53+ for (int j = 0 ; j < config . activityCountPerPackage; j ++ ) {
54+ def activityPreName = generateName(j )
6455 generateActivity(packageName, activityPreName)
6556 }
6657 // 生成其它类
67- for (int i = 0 ; i < otherCountPerPackage; i ++ ) {
68- def className = generateName(i ). capitalize()
58+ for (int j = 0 ; j < config . otherCountPerPackage; j ++ ) {
59+ def className = generateName(j ). capitalize()
6960 def typeBuilder = TypeSpec . classBuilder(className)
70- for (int j = 0 ; j < methodCountPerClass; j ++ ) {
71- def methodName = generateName(j )
61+ for (int k = 0 ; k < config . methodCountPerClass; k ++ ) {
62+ def methodName = generateName(k )
7263 def methodBuilder = MethodSpec . methodBuilder(methodName)
7364 generateMethods(methodBuilder)
7465 typeBuilder. addMethod(methodBuilder. build())
7566 }
7667 def fileBuilder = JavaFile . builder(packageName, typeBuilder. build())
77- fileBuilder. build(). writeTo(outDir )
68+ fileBuilder. build(). writeTo(javaDir )
7869 }
7970 }
8071 }
@@ -133,8 +124,9 @@ class AndroidJunkCodeTask extends DefaultTask {
133124 * @param activityPreName
134125 */
135126 void generateActivity (String packageName , String activityPreName ) {
127+ def javaDir = new File (outDir, " java" )
136128 def className = activityPreName. capitalize() + " Activity"
137- def layoutName = " ${ resPrefix.toLowerCase()}${ packageName.replace(".", "_")} _activity_${ activityPreName} "
129+ def layoutName = " ${ config. resPrefix.toLowerCase()}${ packageName.replace(".", "_")} _activity_${ activityPreName} "
138130 generateLayout(layoutName)
139131 def typeBuilder = TypeSpec . classBuilder(className)
140132 typeBuilder. superclass(ClassName . get(" android.app" , " Activity" ))
@@ -148,14 +140,14 @@ class AndroidJunkCodeTask extends DefaultTask {
148140 .addStatement(" setContentView(\$ T.layout.${ layoutName} )" , ClassName . get(manifestPackageName, " R" ))
149141 .build())
150142 // 其它方法
151- for (int j = 0 ; j < methodCountPerClass; j++ ) {
143+ for (int j = 0 ; j < config . methodCountPerClass; j++ ) {
152144 def methodName = generateName(j)
153145 def methodBuilder = MethodSpec . methodBuilder(methodName)
154146 generateMethods(methodBuilder)
155147 typeBuilder. addMethod(methodBuilder. build())
156148 }
157149 def fileBuilder = JavaFile . builder(packageName, typeBuilder. build())
158- fileBuilder. build(). writeTo(outDir )
150+ fileBuilder. build(). writeTo(javaDir )
159151 addToManifestByFileIo(className, packageName)
160152 }
161153
@@ -164,17 +156,13 @@ class AndroidJunkCodeTask extends DefaultTask {
164156 */
165157 void generateRes () {
166158 // 生成drawable
167- for (int i = 0 ; i < drawableCount; i++ ) {
168- def drawableName = " ${ resPrefix.toLowerCase()}${ generateName(i)} "
159+ for (int i = 0 ; i < config . drawableCount; i++ ) {
160+ def drawableName = " ${ config. resPrefix.toLowerCase()}${ generateName(i)} "
169161 generateDrawable(drawableName)
170162 }
171163 // 生成string
172- def stringFile = new File (outDir, " res/values/strings.xml" )
173- if (stringFile. exists()) {
174- stringFile. delete()
175- }
176- for (int i = 0 ; i < stringCount; i++ ) {
177- def name = " ${ resPrefix.toLowerCase()}${ generateName(i)} "
164+ for (int i = 0 ; i < config. stringCount; i++ ) {
165+ def name = " ${ config.resPrefix.toLowerCase()}${ generateName(i)} "
178166 def value = name
179167 addStringByFileIo(name, value)
180168 }
@@ -242,6 +230,9 @@ class AndroidJunkCodeTask extends DefaultTask {
242230 */
243231 void addToManifestByFileIo (String activityName , String packageName ) {
244232 def manifestFile = new File (outDir, " AndroidManifest.xml" )
233+ if (! manifestFile. getParentFile(). exists()) {
234+ manifestFile. getParentFile(). mkdirs()
235+ }
245236 if (! manifestFile. exists()) {
246237 def template = ManifestTemplate . TEMPLATE
247238 FileWriter writer
0 commit comments