All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.imqa.injector.CompileAction Maven / Gradle / Ivy

There is a newer version: 2.25.11
Show newest version
package io.imqa.injector;

import org.gradle.api.Task;
import org.gradle.api.Action;

import java.io.File;
import java.util.ArrayList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import io.imqa.injector.util.BuildOption;
import io.imqa.injector.util.Logger;
import io.imqa.injector.util.PathBuilder;
import io.imqa.injector.util.StringUtil;

import static io.imqa.injector.util.BuildOption.gradleVersion;

public class CompileAction implements Action, io.imqa.injector.Action {
    String buildLocation;
    String projectName;

    private BuildType buildType;
//    private String flavorName = "";
    private Flavor flavor;
    AndroidManifestParser manifestParser;

    public CompileAction(BuildType buildType, Flavor flavor) {
        this.buildType = buildType;
        this.flavor = flavor;

//        Logger.d("Compile Action created");
    }

    public CompileAction(BuildType buildType, Flavor flavor, String buildLocation, AndroidManifestParser manifestParser) {
        this.buildType = buildType;
        this.buildLocation = buildLocation;
        this.manifestParser = manifestParser;
        this.flavor = flavor;
    }

    public void doAction(Task compileTask) {
        projectName = compileTask.getProject().getName();
        Pattern javacPattern;

        if (gradleVersion.majorVersion == 3
            && gradleVersion.minorVersion >= 2) {

            javacPattern = Pattern.compile(":"+projectName+":compile"+
                    StringUtil.toCapitalize(flavor.flavorName) +
                    StringUtil.toCapitalize(buildType.typeName) +
                    "Sources");
        } else {
            javacPattern = Pattern.compile(":"+projectName+":compile"+
                    StringUtil.toCapitalize(flavor.flavorName) +
                    StringUtil.toCapitalize(buildType.typeName) +
                    "JavaWithJavac");
        }
        /*Pattern javacPattern = Pattern.compile(":"+projectName+":compile"+
                StringUtil.toCapitalize(flavor.flavorName) +
                StringUtil.toCapitalize(buildType.typeName) +
                "JavaWithJavac");*/

        /*Pattern javacPattern = Pattern.compile(":"+projectName+":transformClassesWithDexBuilderFor"+
                StringUtil.toCapitalize(flavor.flavorName) +
                StringUtil.toCapitalize(buildType.typeName));*/

//        Logger.d("javac pattern", javacPattern.toString());
        Matcher javacMatcher = javacPattern.matcher( compileTask.toString() );

        if( javacMatcher.find() ) {
            compileTask.deleteAllActions();
            compileTask.doLast(this);
        }

    }


    public void execute(Task task) {
        if (BuildOption.stop) return;
        bciExecute(buildType.typeName);
    }

    public void bciExecute(String buildType) {
        Logger.d("IMQA Task", "BCI Execute");

        // Find Compile Location
        if (buildLocation == null || buildLocation.equals("")) {
            if (gradleVersion.majorVersion == 3
                    && gradleVersion.minorVersion >= 2) {
                PathBuilder builder = PathBuilder.getBuilder(new File("./").getAbsolutePath())
                        .addPath(projectName)
                        .addPath("/build/intermediates/javac");
                if (!this.flavor.flavorName.equals("")) {
                    builder.addPath(this.flavor.flavorName + StringUtil.toCapitalize(buildType));
                } else {
                    builder.addPath(buildType);
                }
                builder.addPath("compile" + StringUtil.toCapitalize(this.flavor.flavorName) + StringUtil.toCapitalize(buildType) + "JavaWithJavac")
                        .addPath("classes");
                buildLocation = builder.toString();
            } else {
                // File location it
                buildLocation = PathBuilder.getBuilder(new File("./").getAbsolutePath())
                        .addPath(projectName)
                        .addPath("/build/intermediates/classes/")
                        .addPath(this.flavor.flavorName)
                        .addPath(buildType)
                        .toString();
            }
        }

        if (manifestParser == null) {
            AndroidBuildConfig buildConfig = new AndroidBuildConfig(
                    projectName, buildType, flavor, buildLocation, null);

            manifestParser = new AndroidManifestParser(
                    projectName, flavor.flavorName, buildType,
                    buildConfig.getPackageName());
        }

        // Get Activity List on Manifest.xml
        ArrayList activityList = manifestParser.getActivityList();

        // This find 'activity'
        Logger.d("LifeCycle Search", "Start");
        int injectedFileCount = 0;
        for (String activityName : activityList) {
            injectedFileCount++;
            callLifeCycleInject(manifestParser.getPackageName().replace(".", "/"), activityName, buildLocation);
        }
        Logger.d("LifeCycle Search", "LifeCycle Searched of "+injectedFileCount+" Files");

        // Get All Class List
        ArrayList fileList = getAllFileList(new File(buildLocation));
        Logger.d("Global Search", "Start");
        injectedFileCount = 0;
        for (String fileAbsoluteName : fileList) {
            injectedFileCount++;
            callGlobalInject(fileAbsoluteName);
        }

        Logger.d("Global Search", "Global Searched of "+injectedFileCount+" Files");
    }

    private ArrayList getAllFileList(File root) {
        ArrayList list = new ArrayList();
        File[] files = root.listFiles();
        for (File file : files) {
            if (file.isFile()) {
                //Logger.d("FILE NAME", file.getName());
                String[] names = file.getName().split("\\.");
                //Logger.d("Splited size", names.toString());
                if (names.length > 0 && names[names.length-1].equals("class")) {
                    //Logger.d("FILES TEST", file.getAbsolutePath());
                    list.add(file.getAbsolutePath());
                    //doSome();
                }
            } else {
                list.addAll(getAllFileList(file));
            }
        }
        return list;
    }

    private void callLifeCycleInject(String packageName, String activityName, String buildLocation) {
        if (BuildOption.lifecycleInject) {
            try {

                Injector activityInjector =
                        //ActivityInjectorFactory.checkActivityPackage(projectName, packageName, activityName, buildLocation);
                        new ProjectActivityInjector(projectName, packageName, activityName, buildLocation);

                if (activityInjector == null)
                    throw new InjectorException();

                activityInjector.doInject();

            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    private void callGlobalInject(String fileAbsoluteName) {
        String[] filePath = fileAbsoluteName.split("/");
        StringBuilder sb = new StringBuilder();
        for (int i=0; i 0) {
                sb.append("/");
                sb.append(filePath[i]);
            }
        }
        GlobalInjector globalInjector = new GlobalInjector(filePath[filePath.length-1], sb.toString());
        globalInjector.doInject();
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy