package com.antfortune.freeline.idea.utils;
import com.android.tools.idea.gradle.parser.GradleBuildFile;
import com.android.tools.idea.gradle.task.AndroidGradleTaskManager;
import com.intellij.openapi.editor.Document;
import com.intellij.openapi.externalSystem.model.task.ExternalSystemTaskId;
import com.intellij.openapi.externalSystem.model.task.ExternalSystemTaskNotificationListener;
import com.intellij.openapi.externalSystem.model.task.ExternalSystemTaskNotificationListenerAdapter;
import com.intellij.openapi.externalSystem.model.task.ExternalSystemTaskType;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiDocumentManager;
import com.intellij.psi.PsiFile;
import com.intellij.psi.search.FilenameIndex;
import com.intellij.psi.search.GlobalSearchScope;
import com.antfortune.freeline.idea.models.GradleSyncHandler;
import org.jetbrains.plugins.gradle.util.GradleConstants;
import org.jetbrains.plugins.groovy.lang.psi.GroovyFile;
import org.jetbrains.plugins.groovy.lang.psi.GroovyPsiElementFactory;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrStatement;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrExpression;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.*;
/**
* Created by pengwei on 16/9/13.
*/
public final class GradleUtil {
/**
* gradle sync
* 暂时不推荐使用
*
* @param project
* @param handler
*/
@Deprecated
private static void startSync(Project project, GradleSyncHandler handler) {
GradleSyncUtil.startSync(project, handler);
}
/**
* 执行task
*
* @param project
* @param taskName
* @param args
* @param listener
*/
public static void executeTask(Project project, String taskName, String args, ExternalSystemTaskNotificationListener listener) {
AndroidGradleTaskManager manager = new AndroidGradleTaskManager();
List<String> taskNames = new ArrayList<String>();
if (taskName != null) {
taskNames.add(taskName);
}
List<String> vmOptions = new ArrayList<String>();
List<String> params = new ArrayList<String>();
if (args != null) {
params.add(args);
}
if (listener == null) {
listener = new ExternalSystemTaskNotificationListenerAdapter() {};
}
manager.executeTasks(
ExternalSystemTaskId.create(GradleConstants.SYSTEM_ID, ExternalSystemTaskType.EXECUTE_TASK, project),
taskNames, project.getBasePath(), null, vmOptions, params, null, listener);
}
/**
* 查找所有的build.gradle文件
*
* @param project
* @return
*/
public static Collection<VirtualFile> getAllGradleFile(Project project) {
Collection<VirtualFile> collection = FilenameIndex.getVirtualFilesByName(project,
GradleConstants.DEFAULT_SCRIPT_NAME, GlobalSearchScope.allScope(project));
return collection == null ? Collections.EMPTY_LIST : collection;
}
/**
* 插入插件的表达式
* apply plugin: 'com.antfortune.freeline'
*
* @param project
* @param psiFile
* @param pluginId
*/
public static void applyPlugin(Project project, GroovyFile psiFile, String pluginId) {
GroovyPsiElementFactory factory = GroovyPsiElementFactory.getInstance(project);
GrStatement grStatement = factory.createExpressionFromText(String.format("apply plugin: \'%s\'",
new Object[]{pluginId}), null);
GrExpression expression = GroovyFileUil.getLastPlugin(psiFile);
if (expression != null && expression.getParent() != null) {
psiFile.addAfter(grStatement, expression.getParent());
// 换行
psiFile.addAfter(factory.createLineTerminator("\n"), expression.getParent());
}
PsiDocumentManager documentManager = PsiDocumentManager.getInstance(project);
Document document = documentManager.getDocument(psiFile);
if (document != null) {
documentManager.commitDocument(document);
}
}
public static void applyPlugin(Project project, VirtualFile file, String pluginId) {
GradleBuildFile gradleBuildFile = new GradleBuildFile(file, project);
if (gradleBuildFile != null) {
PsiFile psiFile = gradleBuildFile.getPsiFile();
if (psiFile != null && psiFile instanceof GroovyFile) {
applyPlugin(project, (GroovyFile) psiFile, pluginId);
}
}
}
/**
* 是否在同步过程中
*
* @return
*/
public static boolean isSyncInProgress(Project project) {
Class<?> gradleSyncClass = null;
try {
gradleSyncClass = Class.forName("com.android.tools.idea.gradle.project.sync.GradleSyncState");
} catch (ClassNotFoundException e) {
try {
gradleSyncClass = Class.forName("com.android.tools.idea.gradle.GradleSyncState");
} catch (ClassNotFoundException e1) {
}
}
if (gradleSyncClass != null) {
try {
Method instance = gradleSyncClass.getMethod("getInstance", Project.class);
Object value = instance.invoke(null, project);
Method inProgress = gradleSyncClass.getMethod("isSyncInProgress");
Object b = inProgress.invoke(value);
if (b != null && b instanceof Boolean) {
return Boolean.valueOf(b.toString());
}
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
return false;
}
/**
* 项目是否为library库
* @param file
* @return
*/
public static boolean isLibrary(GradleBuildFile file) {
if (file != null) {
List plugins = file.getPlugins();
if (plugins != null && plugins.size() > 0) {
return plugins.contains("com.android.library") || plugins.contains("android-library");
}
}
return true;
}
}