summaryrefslogtreecommitdiff
path: root/gradlePlugin/src/main/java/android/databinding
diff options
context:
space:
mode:
authorYigit Boyar <yboyar@google.com>2015-10-12 18:59:27 -0700
committerYigit Boyar <yboyar@google.com>2015-10-28 14:33:53 -0700
commit9784c9aaedeb863018f5fcaa0a598e8e2f8ed2f3 (patch)
tree50d9b6a2ce235ca732e9da52026eef55e708e1ce /gradlePlugin/src/main/java/android/databinding
parent012f7781add1b38b28c0c68a94172715e635c00e (diff)
downloaddata-binding-9784c9aaedeb863018f5fcaa0a598e8e2f8ed2f3.tar.gz
Data binding as studio dep + java6
This CL gets rid of the gradle plugin and instead provides DataBindingBuilder for the gradle plugin to directly use. Now, everything that is deployed via SDK Manager (lib and adapters) are included as prebuilts so that we avoid accidently changing them w/o an SDK manager release. There is still work to do: > re-enable proguard for externel dependencies > release a batch to ensure everything works Bug: 22516688 Change-Id: I83ace15bd6d3d23bf5b4ad850f36453dd23ebd43
Diffstat (limited to 'gradlePlugin/src/main/java/android/databinding')
-rw-r--r--gradlePlugin/src/main/java/android/databinding/tool/DataBinderPlugin.java421
-rw-r--r--gradlePlugin/src/main/java/android/databinding/tool/DataBindingExportInfoTask.java89
-rw-r--r--gradlePlugin/src/main/java/android/databinding/tool/DataBindingProcessLayoutsTask.java110
3 files changed, 0 insertions, 620 deletions
diff --git a/gradlePlugin/src/main/java/android/databinding/tool/DataBinderPlugin.java b/gradlePlugin/src/main/java/android/databinding/tool/DataBinderPlugin.java
deleted file mode 100644
index 238e360b..00000000
--- a/gradlePlugin/src/main/java/android/databinding/tool/DataBinderPlugin.java
+++ /dev/null
@@ -1,421 +0,0 @@
-/*
- * Copyright (C) 2015 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 android.databinding.tool;
-
-import com.google.common.base.Preconditions;
-
-import com.android.build.gradle.AppExtension;
-import com.android.build.gradle.BaseExtension;
-import com.android.build.gradle.LibraryExtension;
-import com.android.build.gradle.api.ApplicationVariant;
-import com.android.build.gradle.api.LibraryVariant;
-import com.android.build.gradle.api.TestVariant;
-import com.android.build.gradle.internal.api.ApplicationVariantImpl;
-import com.android.build.gradle.internal.api.LibraryVariantImpl;
-import com.android.build.gradle.internal.api.TestVariantImpl;
-import com.android.build.gradle.internal.core.GradleVariantConfiguration;
-import com.android.build.gradle.internal.variant.ApplicationVariantData;
-import com.android.build.gradle.internal.variant.BaseVariantData;
-import com.android.build.gradle.internal.variant.LibraryVariantData;
-import com.android.build.gradle.internal.variant.TestVariantData;
-import com.android.build.gradle.tasks.ProcessAndroidResources;
-import com.android.builder.model.ApiVersion;
-
-import org.apache.commons.io.IOUtils;
-import org.apache.commons.lang3.StringUtils;
-import org.apache.commons.lang3.exception.ExceptionUtils;
-import org.gradle.api.Action;
-import org.gradle.api.Plugin;
-import org.gradle.api.Project;
-import org.gradle.api.Task;
-import org.gradle.api.logging.LogLevel;
-import org.gradle.api.logging.Logger;
-import org.gradle.api.plugins.ExtraPropertiesExtension;
-import org.gradle.api.tasks.bundling.Jar;
-import org.gradle.api.tasks.compile.AbstractCompile;
-
-import android.databinding.tool.processing.ScopedException;
-import android.databinding.tool.util.L;
-import android.databinding.tool.writer.JavaFileWriter;
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.lang.reflect.Field;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Properties;
-
-import javax.tools.Diagnostic;
-import javax.xml.bind.JAXBException;
-
-public class DataBinderPlugin implements Plugin<Project> {
-
- private static final String INVOKED_FROM_IDE_PROPERTY = "android.injected.invoked.from.ide";
- private static final String PRINT_ENCODED_ERRORS_PROPERTY
- = "android.databinding.injected.print.encoded.errors";
- private Logger logger;
- private boolean printEncodedErrors = false;
-
- class GradleFileWriter extends JavaFileWriter {
-
- private final String outputBase;
-
- public GradleFileWriter(String outputBase) {
- this.outputBase = outputBase;
- }
-
- @Override
- public void writeToFile(String canonicalName, String contents) {
- String asPath = canonicalName.replace('.', '/');
- File f = new File(outputBase + "/" + asPath + ".java");
- logD("Asked to write to " + canonicalName + ". outputting to:" +
- f.getAbsolutePath());
- //noinspection ResultOfMethodCallIgnored
- f.getParentFile().mkdirs();
- FileOutputStream fos = null;
- try {
- fos = new FileOutputStream(f);
- IOUtils.write(contents, fos);
- } catch (IOException e) {
- logE(e, "cannot write file " + f.getAbsolutePath());
- } finally {
- IOUtils.closeQuietly(fos);
- }
- }
- }
-
- private boolean safeGetBooleanProperty(Project project, String property) {
- boolean hasProperty = project.hasProperty(property);
- if (!hasProperty) {
- return false;
- }
- try {
- if (Boolean.parseBoolean(String.valueOf(project.getProperties().get(property)))) {
- return true;
- }
- } catch (Throwable t) {
- L.w("unable to read property %s", project);
- }
- return false;
- }
-
- private boolean resolvePrintEncodedErrors(Project project) {
- return safeGetBooleanProperty(project, INVOKED_FROM_IDE_PROPERTY) ||
- safeGetBooleanProperty(project, PRINT_ENCODED_ERRORS_PROPERTY);
- }
-
- @Override
- public void apply(Project project) {
- if (project == null) {
- return;
- }
- setupLogger(project);
-
- Versions versions = readMyVersion();
- logD("data binding plugin versions are: %s", versions);
- printEncodedErrors = resolvePrintEncodedErrors(project);
- ScopedException.encodeOutput(printEncodedErrors);
- project.getDependencies()
- .add("compile", "com.android.databinding:library:" + versions.getLibraryVersion());
- boolean addAdapters = true;
- if (project.hasProperty("ext")) {
- Object ext = project.getProperties().get("ext");
- if (ext instanceof ExtraPropertiesExtension) {
- ExtraPropertiesExtension propExt = (ExtraPropertiesExtension) ext;
- if (propExt.has("addDataBindingAdapters")) {
- addAdapters = Boolean.valueOf(
- String.valueOf(propExt.get("addDataBindingAdapters")));
- }
- }
- }
- if (addAdapters) {
- project.getDependencies().add("compile",
- "com.android.databinding:adapters:" + versions.getAdaptersVersion());
- }
- project.getDependencies().add("provided",
- "com.android.databinding:compiler:" + versions.getCompilerVersion());
- project.afterEvaluate(new Action<Project>() {
- @Override
- public void execute(Project project) {
- try {
- createXmlProcessor(project);
- } catch (Throwable t) {
- logE(t, "failed to setup data binding");
- }
- }
- });
- }
-
- private void setupLogger(Project project) {
- logger = project.getLogger();
- L.setClient(new L.Client() {
- @Override
- public void printMessage(Diagnostic.Kind kind, String message) {
- if (kind == Diagnostic.Kind.ERROR) {
- logE(null, message);
- } else {
- logD(message);
- }
- }
- });
- }
-
- Versions readMyVersion() {
- try {
- Properties props = new Properties();
- InputStream stream = getClass().getResourceAsStream("/data_binding_build_info.properties");
- try {
- props.load(stream);
- return new Versions(props);
- } finally {
- IOUtils.closeQuietly(stream);
- }
- } catch (IOException exception) {
- logE(exception, "Cannot read data binding version");
- }
- return null;
- }
-
- private void createXmlProcessor(Project project)
- throws NoSuchFieldException, IllegalAccessException {
- L.d("creating xml processor for " + project);
- Object androidExt = project.getExtensions().getByName("android");
- if (!(androidExt instanceof BaseExtension)) {
- return;
- }
- if (androidExt instanceof AppExtension) {
- createXmlProcessorForApp(project, (AppExtension) androidExt);
- } else if (androidExt instanceof LibraryExtension) {
- createXmlProcessorForLibrary(project, (LibraryExtension) androidExt);
- } else {
- logE(new UnsupportedOperationException("cannot understand android ext"),
- "unsupported android extension. What is it? %s", androidExt);
- }
- }
-
- private void createXmlProcessorForLibrary(Project project, LibraryExtension lib)
- throws NoSuchFieldException, IllegalAccessException {
- File sdkDir = lib.getSdkDirectory();
- L.d("create xml processor for " + lib);
- for (TestVariant variant : lib.getTestVariants()) {
- logD("test variant %s. dir name %s", variant, variant.getDirName());
- BaseVariantData variantData = getVariantData(variant);
- attachXmlProcessor(project, variantData, sdkDir, false);//tests extend apk variant
- }
- for (LibraryVariant variant : lib.getLibraryVariants()) {
- logD("library variant %s. dir name %s", variant, variant.getDirName());
- BaseVariantData variantData = getVariantData(variant);
- attachXmlProcessor(project, variantData, sdkDir, true);
- }
- }
-
- private void createXmlProcessorForApp(Project project, AppExtension appExt)
- throws NoSuchFieldException, IllegalAccessException {
- L.d("create xml processor for " + appExt);
- File sdkDir = appExt.getSdkDirectory();
- for (TestVariant testVariant : appExt.getTestVariants()) {
- TestVariantData variantData = getVariantData(testVariant);
- attachXmlProcessor(project, variantData, sdkDir, false);
- }
- for (ApplicationVariant appVariant : appExt.getApplicationVariants()) {
- ApplicationVariantData variantData = getVariantData(appVariant);
- attachXmlProcessor(project, variantData, sdkDir, false);
- }
- }
-
- private LibraryVariantData getVariantData(LibraryVariant variant)
- throws NoSuchFieldException, IllegalAccessException {
- Field field = LibraryVariantImpl.class.getDeclaredField("variantData");
- field.setAccessible(true);
- return (LibraryVariantData) field.get(variant);
- }
-
- private TestVariantData getVariantData(TestVariant variant)
- throws IllegalAccessException, NoSuchFieldException {
- Field field = TestVariantImpl.class.getDeclaredField("variantData");
- field.setAccessible(true);
- return (TestVariantData) field.get(variant);
- }
-
- private ApplicationVariantData getVariantData(ApplicationVariant variant)
- throws IllegalAccessException, NoSuchFieldException {
- Field field = ApplicationVariantImpl.class.getDeclaredField("variantData");
- field.setAccessible(true);
- return (ApplicationVariantData) field.get(variant);
- }
-
- private void attachXmlProcessor(Project project, final BaseVariantData variantData,
- final File sdkDir,
- final Boolean isLibrary) {
- final GradleVariantConfiguration configuration = variantData.getVariantConfiguration();
- final ApiVersion minSdkVersion = configuration.getMinSdkVersion();
- ProcessAndroidResources generateRTask = variantData.generateRClassTask;
- final String packageName = generateRTask.getPackageForR();
- String fullName = configuration.getFullName();
- List<File> resourceFolders = Arrays.asList(variantData.mergeResourcesTask.getOutputDir());
-
- final File codeGenTargetFolder = new File(project.getBuildDir() + "/data-binding-info/" +
- configuration.getDirName());
- String writerOutBase = codeGenTargetFolder.getAbsolutePath();
- JavaFileWriter fileWriter = new GradleFileWriter(writerOutBase);
- final LayoutXmlProcessor xmlProcessor = new LayoutXmlProcessor(packageName, resourceFolders,
- fileWriter, minSdkVersion.getApiLevel(), isLibrary);
- final ProcessAndroidResources processResTask = generateRTask;
- final File xmlOutDir = new File(project.getBuildDir() + "/layout-info/" +
- configuration.getDirName());
- final File generatedClassListOut = isLibrary ? new File(xmlOutDir, "_generated.txt") : null;
- logD("xml output for %s is %s", variantData, xmlOutDir);
- String layoutTaskName = "dataBindingLayouts" + StringUtils
- .capitalize(processResTask.getName());
- String infoClassTaskName = "dataBindingInfoClass" + StringUtils
- .capitalize(processResTask.getName());
-
- final DataBindingProcessLayoutsTask[] processLayoutsTasks
- = new DataBindingProcessLayoutsTask[1];
- project.getTasks().create(layoutTaskName,
- DataBindingProcessLayoutsTask.class,
- new Action<DataBindingProcessLayoutsTask>() {
- @Override
- public void execute(final DataBindingProcessLayoutsTask task) {
- processLayoutsTasks[0] = task;
- task.setXmlProcessor(xmlProcessor);
- task.setSdkDir(sdkDir);
- task.setXmlOutFolder(xmlOutDir);
- task.setMinSdk(minSdkVersion.getApiLevel());
- task.setBlameLogDir(variantData.getScope().getResourceBlameLogDir());
-
- logD("TASK adding dependency on %s for %s", task, processResTask);
- processResTask.dependsOn(task);
- processResTask.getInputs().dir(xmlOutDir);
- for (Object dep : processResTask.getDependsOn()) {
- if (dep == task) {
- continue;
- }
- logD("adding dependency on %s for %s", dep, task);
- task.dependsOn(dep);
- }
- processResTask.doLast(new Action<Task>() {
- @Override
- public void execute(Task unused) {
- try {
- task.writeLayoutXmls();
- } catch (JAXBException e) {
- // gradle sometimes fails to resolve JAXBException.
- // We get stack trace manually to ensure we have the log
- logE(e, "cannot write layout xmls %s",
- ExceptionUtils.getStackTrace(e));
- }
- }
- });
- }
- });
- final DataBindingProcessLayoutsTask processLayoutsTask = processLayoutsTasks[0];
- project.getTasks().create(infoClassTaskName,
- DataBindingExportInfoTask.class,
- new Action<DataBindingExportInfoTask>() {
-
- @Override
- public void execute(DataBindingExportInfoTask task) {
- task.dependsOn(processLayoutsTask);
- task.dependsOn(processResTask);
- task.setXmlProcessor(xmlProcessor);
- task.setSdkDir(sdkDir);
- task.setXmlOutFolder(xmlOutDir);
- task.setExportClassListTo(generatedClassListOut);
- task.setPrintEncodedErrors(printEncodedErrors);
- task.setEnableDebugLogs(logger.isEnabled(LogLevel.DEBUG));
-
- variantData.registerJavaGeneratingTask(task, codeGenTargetFolder);
- }
- });
- String packageJarTaskName = "package" + StringUtils.capitalize(fullName) + "ClassesJar";
- final Task packageTask = project.getTasks().findByName(packageJarTaskName);
- if (packageTask instanceof Jar) {
- String removeGeneratedTaskName = "dataBindingExcludeGeneratedFrom" +
- StringUtils.capitalize(packageTask.getName());
- if (project.getTasks().findByName(removeGeneratedTaskName) == null) {
- final AbstractCompile javaCompileTask = variantData.javacTask;
- Preconditions.checkNotNull(javaCompileTask);
-
- project.getTasks().create(removeGeneratedTaskName,
- DataBindingExcludeGeneratedTask.class,
- new Action<DataBindingExcludeGeneratedTask>() {
- @Override
- public void execute(DataBindingExcludeGeneratedTask task) {
- packageTask.dependsOn(task);
- task.dependsOn(javaCompileTask);
- task.setAppPackage(packageName);
- task.setInfoClassQualifiedName(xmlProcessor.getInfoClassFullName());
- task.setPackageTask((Jar) packageTask);
- task.setLibrary(isLibrary);
- task.setGeneratedClassListFile(generatedClassListOut);
- }
- });
- }
- }
- }
-
- private void logD(String s, Object... args) {
- logger.info(formatLog(s, args));
- }
-
- private void logE(Throwable t, String s, Object... args) {
- logger.error(formatLog(s, args), t);
- }
-
- private String formatLog(String s, Object... args) {
- return "[data binding plugin]: " + String.format(s, args);
- }
-
- private class Versions {
-
- Properties properties;
- String myVersion;
-
- public Versions(Properties properties) {
- this.properties = properties;
- myVersion = properties.getProperty("myVersion");
- if (myVersion == null) {
- throw new IllegalStateException("cannot read data binding plugin version");
- }
- }
-
- public String getCompilerVersion() {
- return properties.getProperty("compiler", myVersion);
- }
-
- public String getAdaptersVersion() {
- return properties.getProperty("adapters", myVersion);
- }
-
- public String getLibraryVersion() {
- return properties.getProperty("library", myVersion);
- }
-
- @Override
- public String toString() {
- StringBuilder sb = new StringBuilder();
- sb.append("[Data Binding Versions:");
- sb.append(" plugin:").append(myVersion);
- sb.append(" compiler:").append(getCompilerVersion());
- sb.append(" adapters:").append(getAdaptersVersion());
- sb.append(" library:").append(getLibraryVersion());
- return sb.append("]").toString();
- }
- }
-}
diff --git a/gradlePlugin/src/main/java/android/databinding/tool/DataBindingExportInfoTask.java b/gradlePlugin/src/main/java/android/databinding/tool/DataBindingExportInfoTask.java
deleted file mode 100644
index 768fe68a..00000000
--- a/gradlePlugin/src/main/java/android/databinding/tool/DataBindingExportInfoTask.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Copyright (C) 2015 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 android.databinding.tool;
-
-import org.gradle.api.DefaultTask;
-import org.gradle.api.tasks.TaskAction;
-
-import android.databinding.tool.processing.Scope;
-
-import java.io.File;
-
-/**
- * Task to pass environment info to javac
- */
-public class DataBindingExportInfoTask extends DefaultTask {
- private LayoutXmlProcessor xmlProcessor;
- private File sdkDir;
- private File xmlOutFolder;
- private File exportClassListTo;
- private boolean printEncodedErrors;
- private boolean enableDebugLogs = false;
- @TaskAction
- public void exportInfo() {
- xmlProcessor.writeInfoClass(sdkDir, xmlOutFolder, exportClassListTo, enableDebugLogs,
- printEncodedErrors);
- Scope.assertNoError();
- }
-
- public LayoutXmlProcessor getXmlProcessor() {
- return xmlProcessor;
- }
-
- public void setXmlProcessor(LayoutXmlProcessor xmlProcessor) {
- this.xmlProcessor = xmlProcessor;
- }
-
- public File getSdkDir() {
- return sdkDir;
- }
-
- public void setSdkDir(File sdkDir) {
- this.sdkDir = sdkDir;
- }
-
- public File getXmlOutFolder() {
- return xmlOutFolder;
- }
-
- public void setXmlOutFolder(File xmlOutFolder) {
- this.xmlOutFolder = xmlOutFolder;
- }
-
- public File getExportClassListTo() {
- return exportClassListTo;
- }
-
- public void setExportClassListTo(File exportClassListTo) {
- this.exportClassListTo = exportClassListTo;
- }
-
- public boolean isPrintEncodedErrors() {
- return printEncodedErrors;
- }
-
- public void setPrintEncodedErrors(boolean printEncodedErrors) {
- this.printEncodedErrors = printEncodedErrors;
- }
-
- public boolean isEnableDebugLogs() {
- return enableDebugLogs;
- }
-
- public void setEnableDebugLogs(boolean enableDebugLogs) {
- this.enableDebugLogs = enableDebugLogs;
- }
-} \ No newline at end of file
diff --git a/gradlePlugin/src/main/java/android/databinding/tool/DataBindingProcessLayoutsTask.java b/gradlePlugin/src/main/java/android/databinding/tool/DataBindingProcessLayoutsTask.java
deleted file mode 100644
index 1e6906bc..00000000
--- a/gradlePlugin/src/main/java/android/databinding/tool/DataBindingProcessLayoutsTask.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- * Copyright (C) 2015 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 android.databinding.tool;
-
-import com.android.ide.common.blame.MergingLog;
-import com.android.ide.common.blame.SourceFile;
-
-import android.databinding.tool.processing.Scope;
-import android.databinding.tool.util.L;
-
-import org.gradle.api.DefaultTask;
-import org.gradle.api.tasks.TaskAction;
-import org.xml.sax.SAXException;
-import java.io.File;
-import java.io.IOException;
-
-import javax.xml.bind.JAXBException;
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.xpath.XPathExpressionException;
-
-/**
- * Task that parses xml files and generated metadata.
- * Will be removed when aapt supports binding tags.
- */
-public class DataBindingProcessLayoutsTask extends DefaultTask {
-
- private LayoutXmlProcessor xmlProcessor;
-
- private File sdkDir;
-
- private File xmlOutFolder;
-
- private int minSdk;
- private File mBlameLogDir;
-
- @TaskAction
- public void processResources()
- throws ParserConfigurationException, SAXException, XPathExpressionException,
- IOException {
- L.d("running process layouts task %s", getName());
- if (mBlameLogDir != null) {
- final MergingLog mergingLog = new MergingLog(mBlameLogDir);
- xmlProcessor.setOriginalFileLookup(new LayoutXmlProcessor.OriginalFileLookup() {
- @Override
- public File getOriginalFileFor(File file) {
- SourceFile input = new SourceFile(file);
- SourceFile original = mergingLog.find(input);
- // merged log api returns the file back if original cannot be found.
- // it is not what we want so we alter the response.
- return original == input ? null : original.getSourceFile();
- }
- });
- }
- xmlProcessor.processResources(minSdk);
- Scope.assertNoError();
- }
-
- public void writeLayoutXmls() throws JAXBException {
- xmlProcessor.writeLayoutInfoFiles(xmlOutFolder);
- }
-
- public LayoutXmlProcessor getXmlProcessor() {
- return xmlProcessor;
- }
-
- public void setXmlProcessor(LayoutXmlProcessor xmlProcessor) {
- this.xmlProcessor = xmlProcessor;
- }
-
- public File getSdkDir() {
- return sdkDir;
- }
-
- public void setSdkDir(File sdkDir) {
- this.sdkDir = sdkDir;
- }
-
- public File getXmlOutFolder() {
- return xmlOutFolder;
- }
-
- public void setXmlOutFolder(File xmlOutFolder) {
- this.xmlOutFolder = xmlOutFolder;
- }
-
- public int getMinSdk() {
- return minSdk;
- }
-
- public void setMinSdk(int minSdk) {
- this.minSdk = minSdk;
- }
-
- public void setBlameLogDir(File blameLogDir) {
- mBlameLogDir = blameLogDir;
- }
-}