blob: 905c7d557d29bc5d60066b8b7e1198a28105b3dc [file] [log] [blame]
/*
* Copyright (C) 2013 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.tools.idea.gradle.project;
import com.android.builder.model.AndroidProject;
import com.google.common.collect.Maps;
import org.gradle.tooling.BuildAction;
import org.gradle.tooling.BuildController;
import org.gradle.tooling.model.GradleTask;
import org.gradle.tooling.model.idea.IdeaModule;
import org.gradle.tooling.model.idea.IdeaProject;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.io.Serializable;
import java.util.Map;
/**
* Imports an Android project using a single call to the Gradle Tooling API.
*/
public class ProjectImportAction implements BuildAction<ProjectImportAction.AllModels>, Serializable {
@NonNls private static final String ANDROID_TASK_NAME_PREFIX = "android";
@Nullable
@Override
public AllModels execute(BuildController controller) {
IdeaProject ideaProject = controller.getModel(IdeaProject.class);
if (ideaProject == null || ideaProject.getModules().isEmpty()) {
return null;
}
AllModels allModels = new AllModels(ideaProject);
for (IdeaModule module : ideaProject.getModules()) {
if (isAndroidProject(module)) {
AndroidProject androidProject = controller.getModel(module, AndroidProject.class);
allModels.addAndroidProject(androidProject, module);
}
}
return allModels.hasAndroidProjects() ? allModels : null;
}
private static boolean isAndroidProject(@NotNull IdeaModule module) {
// A Gradle project is an Android project is if has at least one task with name starting with 'android'.
for (GradleTask task : module.getGradleProject().getTasks()) {
String taskName = task.getName();
if (taskName != null && taskName.startsWith(ANDROID_TASK_NAME_PREFIX)) {
return true;
}
}
return false;
}
public static class AllModels implements Serializable {
@NotNull private final Map<String, AndroidProject> androidProjectsByPath = Maps.newHashMap();
@NotNull private final IdeaProject myIdeaProject;
public AllModels(@NotNull IdeaProject project) {
myIdeaProject = project;
}
@NotNull
public IdeaProject getIdeaProject() {
return myIdeaProject;
}
public void addAndroidProject(@NotNull AndroidProject project, @NotNull IdeaModule module) {
androidProjectsByPath.put(extractMapKey(module), project);
}
@Nullable
public AndroidProject getAndroidProject(@NotNull IdeaModule module) {
return androidProjectsByPath.get(extractMapKey(module));
}
@NotNull
private static String extractMapKey(@NotNull IdeaModule module) {
return module.getGradleProject().getPath();
}
public boolean hasAndroidProjects() {
return !androidProjectsByPath.isEmpty();
}
}
}