Pass the java packages of direct dependencies with databinding to databinding's
annotation processor so that it can distinguish between transitive and direct
BR files.

RELNOTES: None.
PiperOrigin-RevId: 228249266
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/databinding/DataBindingProcessorArgsBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/android/databinding/DataBindingProcessorArgsBuilder.java
index 89e78db..3854054 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/databinding/DataBindingProcessorArgsBuilder.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/databinding/DataBindingProcessorArgsBuilder.java
@@ -13,10 +13,16 @@
 // limitations under the License.
 package com.google.devtools.build.lib.rules.android.databinding;
 
+import com.google.common.base.Joiner;
 import com.google.common.collect.ImmutableList;
 import com.google.devtools.build.lib.actions.Artifact;
+import java.util.Set;
 
-/** Builder for annotation processor arguments that can be passed down to data binding. */
+/**
+ * Builder for annotation processor arguments that can be passed down to data binding.
+ *
+ * TODO: Refactor the names of the setter methods in this class to include "set".
+ */
 public class DataBindingProcessorArgsBuilder {
   private final boolean useUpdatedArgs;
   private final ImmutableList.Builder<String> flags = ImmutableList.builder();
@@ -135,6 +141,15 @@
     return this;
   }
 
+  /**
+   * Sets the Java packages of the direct dependencies.
+   */
+  public DataBindingProcessorArgsBuilder directDependencyPkgs(Set<String> packages) {
+    String value = String.format("[%s]", Joiner.on(",").join(packages));
+    flags.add(createProcessorFlag("directDependencyPkgs", value));
+    return this;
+  }
+
   /** Builds annotation processor arguments for Data Binding */
   public ImmutableList<String> build() {
     return flags.build();
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/databinding/DataBindingV2Context.java b/src/main/java/com/google/devtools/build/lib/rules/android/databinding/DataBindingV2Context.java
index ff3a497..2b53316 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/databinding/DataBindingV2Context.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/databinding/DataBindingV2Context.java
@@ -16,6 +16,7 @@
 import com.google.common.base.Joiner;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMultimap;
+import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.ImmutableSetMultimap;
 import com.google.devtools.build.lib.actions.Action;
 import com.google.devtools.build.lib.actions.Artifact;
@@ -39,6 +40,7 @@
 import java.util.Collection;
 import java.util.List;
 import java.util.Map.Entry;
+import java.util.Set;
 import java.util.function.BiConsumer;
 import java.util.function.Consumer;
 
@@ -79,6 +81,7 @@
     // Unused.
     args.exportClassListTo("/tmp/exported_classes");
     args.modulePackage(AndroidCommon.getJavaPackage(ruleContext));
+    args.directDependencyPkgs(getJavaPackagesOfDirectDependencies(ruleContext));
 
     // The minimum Android SDK compatible with this rule.
     // TODO(bazel-team): This probably should be based on the actual min-sdk from the manifest,
@@ -97,6 +100,23 @@
     consumer.accept(args.build());
   }
 
+  private static Set<String> getJavaPackagesOfDirectDependencies(RuleContext ruleContext) {
+
+    ImmutableSet.Builder<String> javaPackagesOfDirectDependencies = ImmutableSet.builder();
+    if (ruleContext.attributes().has("deps", BuildType.LABEL_LIST)) {
+      Iterable<DataBindingV2Provider> providers = ruleContext.getPrerequisites(
+          "deps", RuleConfiguredTarget.Mode.TARGET, DataBindingV2Provider.PROVIDER);
+
+      for (DataBindingV2Provider provider : providers) {
+        for (LabelJavaPackagePair labelJavaPackagePair : provider.getLabelAndJavaPackages()) {
+          javaPackagesOfDirectDependencies.add(labelJavaPackagePair.javaPackage());
+        }
+      }
+    }
+
+    return javaPackagesOfDirectDependencies.build();
+  }
+
   @Override
   public void supplyAnnotationProcessor(
       RuleContext ruleContext,
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/databinding/DataBindingV2Provider.java b/src/main/java/com/google/devtools/build/lib/rules/android/databinding/DataBindingV2Provider.java
index c3e2bee..38d2449 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/databinding/DataBindingV2Provider.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/databinding/DataBindingV2Provider.java
@@ -22,6 +22,7 @@
 import com.google.devtools.build.lib.skylarkbuildapi.android.DataBindingV2ProviderApi;
 import com.google.devtools.build.lib.syntax.EvalException;
 import com.google.devtools.build.lib.syntax.SkylarkList;
+import javax.annotation.Nullable;
 
 /**
  * A provider that exposes this enables <a
@@ -39,17 +40,25 @@
 
   private final NestedSet<Artifact> transitiveBRFiles;
 
+  /**
+   * The label and java package of this rule and any rules that this rule exports.
+   */
+  @Nullable
+  private final ImmutableList<LabelJavaPackagePair> labelAndJavaPackages;
+
   private final NestedSet<LabelJavaPackagePair> transitiveLabelAndJavaPackages;
 
   public DataBindingV2Provider(
       ImmutableList<Artifact> classInfos,
       ImmutableList<Artifact> setterStores,
       NestedSet<Artifact> transitiveBRFiles,
+      ImmutableList<LabelJavaPackagePair> labelAndJavaPackages,
       NestedSet<LabelJavaPackagePair> transitiveLabelAndJavaPackages) {
     super(PROVIDER);
     this.classInfos = classInfos;
     this.setterStores = setterStores;
     this.transitiveBRFiles = transitiveBRFiles;
+    this.labelAndJavaPackages = labelAndJavaPackages;
     this.transitiveLabelAndJavaPackages = transitiveLabelAndJavaPackages;
   }
 
@@ -69,6 +78,12 @@
   }
 
   @Override
+  @Nullable
+  public ImmutableList<LabelJavaPackagePair> getLabelAndJavaPackages() {
+    return labelAndJavaPackages;
+  }
+
+  @Override
   public NestedSet<LabelJavaPackagePair> getTransitiveLabelAndJavaPackages() {
     return transitiveLabelAndJavaPackages;
   }
@@ -97,24 +112,31 @@
       brFiles.add(brFile);
     }
 
-    NestedSetBuilder<LabelJavaPackagePair> labelAndJavaPackages = NestedSetBuilder.stableOrder();
-    labelAndJavaPackages.add(LabelJavaPackagePair.create(label, javaPackage));
+    NestedSetBuilder<LabelJavaPackagePair> transitiveLabelAndJavaPackages =
+        NestedSetBuilder.stableOrder();
+    ImmutableList.Builder<LabelJavaPackagePair> labelAndJavaPackages = ImmutableList.builder();
+    LabelJavaPackagePair labelAndJavaPackage = LabelJavaPackagePair.create(label, javaPackage);
+    labelAndJavaPackages.add(labelAndJavaPackage);
+    transitiveLabelAndJavaPackages.add(labelAndJavaPackage);
 
     if (databindingV2ProvidersInDeps != null) {
 
       for (DataBindingV2ProviderApi<Artifact> provider : databindingV2ProvidersInDeps) {
         brFiles.addTransitive(provider.getTransitiveBRFiles());
-        labelAndJavaPackages.addTransitive(provider.getTransitiveLabelAndJavaPackages());
+        transitiveLabelAndJavaPackages.addTransitive(provider.getTransitiveLabelAndJavaPackages());
       }
     }
 
     if (databindingV2ProvidersInExports != null) {
 
+      // Add all of the information from providers from exported targets, so that targets which
+      // depend on this target appear to depend on the exported targets.
       for (DataBindingV2ProviderApi<Artifact> provider : databindingV2ProvidersInExports) {
         setterStoreFiles.addAll(provider.getSetterStores());
         classInfoFiles.addAll(provider.getClassInfos());
         brFiles.addTransitive(provider.getTransitiveBRFiles());
-        labelAndJavaPackages.addTransitive(provider.getTransitiveLabelAndJavaPackages());
+        labelAndJavaPackages.addAll(provider.getLabelAndJavaPackages());
+        transitiveLabelAndJavaPackages.addTransitive(provider.getTransitiveLabelAndJavaPackages());
       }
     }
 
@@ -122,7 +144,8 @@
         classInfoFiles.build(),
         setterStoreFiles.build(),
         brFiles.build(),
-        labelAndJavaPackages.build());
+        labelAndJavaPackages.build(),
+        transitiveLabelAndJavaPackages.build());
   }
 
   /** The provider can construct the DataBindingV2Provider provider. */
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/databinding/DisabledDataBindingV2Context.java b/src/main/java/com/google/devtools/build/lib/rules/android/databinding/DisabledDataBindingV2Context.java
index ddbdbb9..dd71b8f 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/databinding/DisabledDataBindingV2Context.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/databinding/DisabledDataBindingV2Context.java
@@ -53,6 +53,7 @@
     ImmutableList.Builder<Artifact> setterStores = ImmutableList.builder();
     ImmutableList.Builder<Artifact> classInfos = ImmutableList.builder();
     NestedSetBuilder<Artifact> brFiles = NestedSetBuilder.stableOrder();
+    ImmutableList.Builder<LabelJavaPackagePair> exportedLabelJavaPackages = ImmutableList.builder();
     NestedSetBuilder<LabelJavaPackagePair> targetNameAndJavaPackages =
         NestedSetBuilder.stableOrder();
 
@@ -65,6 +66,7 @@
         setterStores.addAll(provider.getSetterStores());
         classInfos.addAll(provider.getClassInfos());
         brFiles.addTransitive(provider.getTransitiveBRFiles());
+        exportedLabelJavaPackages.addAll(provider.getLabelAndJavaPackages());
         targetNameAndJavaPackages.addTransitive(provider.getTransitiveLabelAndJavaPackages());
       }
     }
@@ -82,6 +84,7 @@
             classInfos.build(),
             setterStores.build(),
             brFiles.build(),
+            exportedLabelJavaPackages.build(),
             targetNameAndJavaPackages.build()));
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/DataBindingV2ProviderApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/DataBindingV2ProviderApi.java
index 466788f..0c3f2c0 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/DataBindingV2ProviderApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/DataBindingV2ProviderApi.java
@@ -25,6 +25,7 @@
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
 import com.google.devtools.build.lib.syntax.EvalException;
 import com.google.devtools.build.lib.syntax.SkylarkList;
+import javax.annotation.Nullable;
 
 /**
  * An interface for a provider that exposes the use of <a
@@ -78,7 +79,10 @@
   @SkylarkCallable(name = "transitive_br_files", structField = true, doc = "", documented = false)
   NestedSet<T> getTransitiveBRFiles();
 
-  /** Returns the java package for this rule. */
+  /**
+   * Returns a NestedSet containing the label and java package for this rule and its transitive
+   * dependencies.
+   * */
   @SkylarkCallable(
       name = "transitive_label_and_java_packages",
       structField = true,
@@ -86,6 +90,17 @@
       documented = false)
   NestedSet<LabelJavaPackagePair> getTransitiveLabelAndJavaPackages();
 
+  /**
+   * Returns the label and java package for this rule and any rules that this rule exports.
+   */
+  @SkylarkCallable(
+      name = "label_and_java_packages",
+      structField = true,
+      doc = "",
+      documented = false)
+  @Nullable
+  ImmutableList<LabelJavaPackagePair> getLabelAndJavaPackages();
+
   /** The provider implementing this can construct the DataBindingV2Info provider. */
   @SkylarkModule(
       name = "Provider",
diff --git a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidDataBindingV2Test.java b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidDataBindingV2Test.java
index f922547..1f64d83 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidDataBindingV2Test.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidDataBindingV2Test.java
@@ -48,9 +48,20 @@
   private void writeDataBindingFiles() throws Exception {
 
     scratch.file(
+        "java/android/library2/BUILD",
+        "android_library(",
+        "    name = 'lib2_with_databinding',",
+        "    enable_data_binding = 1,",
+        "    manifest = 'AndroidManifest.xml',",
+        "    srcs = ['MyLib2.java'],",
+        "    resource_files = [],",
+        ")");
+
+    scratch.file(
         "java/android/library/BUILD",
         "android_library(",
-        "    name = 'lib_with_data_binding',",
+        "    name = 'lib_with_databinding',",
+        "    deps = ['//java/android/library2:lib2_with_databinding'],",
         "    enable_data_binding = 1,",
         "    manifest = 'AndroidManifest.xml',",
         "    srcs = ['MyLib.java'],",
@@ -67,7 +78,7 @@
         "    enable_data_binding = 1,",
         "    manifest = 'AndroidManifest.xml',",
         "    srcs = ['MyApp.java'],",
-        "    deps = ['//java/android/library:lib_with_data_binding'],",
+        "    deps = ['//java/android/library:lib_with_databinding'],",
         ")");
 
     scratch.file(
@@ -126,7 +137,7 @@
     // output:
     Artifact libResourceInfoOutput =
         getFirstArtifactEndingWith(
-            allArtifacts, "databinding/lib_with_data_binding/layout-info.zip");
+            allArtifacts, "databinding/lib_with_databinding/layout-info.zip");
     assertThat(getGeneratingSpawnActionArgs(libResourceInfoOutput))
         .containsAllOf("--dataBindingInfoOut", libResourceInfoOutput.getExecPathString())
         .inOrder();
@@ -143,13 +154,13 @@
     SpawnAction libCompileAction =
         (SpawnAction)
             getGeneratingAction(
-                getFirstArtifactEndingWith(allArtifacts, "lib_with_data_binding.jar"));
+                getFirstArtifactEndingWith(allArtifacts, "lib_with_databinding.jar"));
     assertThat(getProcessorNames(libCompileAction))
         .contains("android.databinding.annotationprocessor.ProcessDataBinding");
     assertThat(prettyArtifactNames(libCompileAction.getInputs()))
         .containsAllOf(
-            "java/android/library/databinding/lib_with_data_binding/layout-info.zip",
-            "java/android/library/databinding/lib_with_data_binding/DataBindingInfo.java");
+            "java/android/library/databinding/lib_with_databinding/layout-info.zip",
+            "java/android/library/databinding/lib_with_databinding/DataBindingInfo.java");
 
     SpawnAction binCompileAction =
         (SpawnAction) getGeneratingAction(getFirstArtifactEndingWith(allArtifacts, "app.jar"));
@@ -175,7 +186,7 @@
     SpawnAction libCompileAction =
         (SpawnAction)
             getGeneratingAction(
-                getFirstArtifactEndingWith(allArtifacts, "lib_with_data_binding.jar"));
+                getFirstArtifactEndingWith(allArtifacts, "lib2_with_databinding.jar"));
     assertThat(
             Iterables.filter(
                 libCompileAction.getInputs(), ActionsTestUtil.getArtifactSuffixMatcher(".bin")))
@@ -187,15 +198,21 @@
     Iterable<Artifact> depMetadataInputs =
         Iterables.filter(
             binCompileAction.getInputs(), ActionsTestUtil.getArtifactSuffixMatcher(".bin"));
-    final String depMetadataBaseDir =
-        Iterables.getFirst(depMetadataInputs, null).getExecPath().getParentDirectory().toString();
+
+    final String appDependentLibArtifacts =
+        Iterables.getFirst(depMetadataInputs, null).getRoot().getExecPathString()
+        + "/java/android/binary/databinding/app/dependent-lib-artifacts/";
     ActionsTestUtil.execPaths(
         Iterables.filter(
             binCompileAction.getInputs(), ActionsTestUtil.getArtifactSuffixMatcher(".bin")));
     assertThat(ActionsTestUtil.execPaths(depMetadataInputs))
         .containsExactly(
-            depMetadataBaseDir + "/android.library-android.library-setter_store.bin",
-            depMetadataBaseDir + "/android.library-android.library-br.bin");
+            appDependentLibArtifacts + "java/android/library/databinding/"
+                + "lib_with_databinding/bin-files/android.library-android.library-br.bin",
+            appDependentLibArtifacts + "java/android/library/databinding/"
+                + "lib_with_databinding/bin-files/android.library-android.library-setter_store.bin",
+            appDependentLibArtifacts + "java/android/library2/databinding/"
+                + "lib2_with_databinding/bin-files/android.library2-android.library2-br.bin");
   }
 
   @Test
@@ -222,7 +239,9 @@
             "-Aandroid.databinding.exportClassListTo=/tmp/exported_classes",
             "-Aandroid.databinding.modulePackage=android.binary",
             "-Aandroid.databinding.minApi=14",
-            "-Aandroid.databinding.enableV2=1");
+            "-Aandroid.databinding.enableV2=1",
+            // Note that this includes only android.library and not android.library2
+            "-Aandroid.databinding.directDependencyPkgs=[android.library]");
     assertThat(paramFileArgsForAction(binCompileAction)).containsAllIn(expectedJavacopts);
 
     // Regression test for b/63134122
@@ -260,7 +279,9 @@
             "-Aandroid.databinding.exportClassListOutFile=/tmp/exported_classes",
             "-Aandroid.databinding.modulePackage=android.binary",
             "-Aandroid.databinding.minApi=14",
-            "-Aandroid.databinding.enableV2=1");
+            "-Aandroid.databinding.enableV2=1",
+            // Note that this includes only android.library and not android.library2
+            "-Aandroid.databinding.directDependencyPkgs=[android.library]");
     assertThat(paramFileArgsForAction(binCompileAction)).containsAllIn(expectedJavacopts);
 
     JavaCompileInfo javaCompileInfo =
@@ -347,7 +368,7 @@
     scratch.file(
         "java/android/library/BUILD",
         "android_library(",
-        "    name = 'lib_with_data_binding',",
+        "    name = 'lib_with_databinding',",
         "    enable_data_binding = 1,",
         "    manifest = 'AndroidManifest.xml',",
         "    srcs = ['MyLib.java'],",
@@ -364,7 +385,7 @@
         "    enable_data_binding = 0,",
         "    manifest = 'AndroidManifest.xml',",
         "    srcs = ['MyApp.java'],",
-        "    deps = ['//java/android/library:lib_with_data_binding'],",
+        "    deps = ['//java/android/library:lib_with_databinding'],",
         ")");
 
     scratch.file(
@@ -637,7 +658,9 @@
 
     checkError(
         "//java/com/bin:bin",
-        "Java package com.lib:\n" + "    //java/com/lib:lib\n" + "    //java/com/lib:lib2");
+        "Java package com.lib:\n"
+            + "    //java/com/lib:lib\n"
+            + "    //java/com/lib:lib2");
   }
 
   @Test
@@ -780,7 +803,10 @@
         ")");
 
     checkError(
-        "//java/com/bin:bin", "Java package com.foo:\n" + "    //libA:libA\n" + "    //libB:libB");
+        "//java/com/bin:bin",
+        "Java package com.foo:\n"
+            + "    //libA:libA\n"
+            + "    //libB:libB");
   }
 
   @Test
@@ -823,7 +849,9 @@
 
     checkError(
         "//java/com/bin:bin",
-        "Java package com.bin:\n" + "    //java/com/bin:bin\n" + "    //java/com/bin:lib");
+        "Java package com.bin:\n"
+            + "    //java/com/bin:bin\n"
+            + "    //java/com/bin:lib");
   }
 
   @Test
@@ -837,8 +865,8 @@
         "//third_party/java/android/android_sdk_linux/extras/android/compatibility/annotations"
             + ":annotations";
 
-    // The bin target depends on this twice target indirectly and separately through the libraries
-    // in middleA and middleB, but this should not be a problem.
+    // The bin target depends on this target twice: indirectly and separately through the libraries
+    // in middleA and middleB, but this should not be a problem because it's the same library.
     scratch.file(
         "java/com/bottom/BUILD",
         "android_library(",
@@ -892,4 +920,143 @@
     // Should not throw error.
     getConfiguredTarget("//java/com/bin:bin");
   }
+
+
+  private void writeDataBindingFilesWithExports() throws Exception {
+
+    scratch.file(
+        "java/android/library1/BUILD",
+        "android_library(",
+        "    name = 'lib1_with_databinding',",
+        "    enable_data_binding = 1,",
+        "    manifest = 'AndroidManifest.xml',",
+        "    srcs = ['MyLib1.java'],",
+        ")");
+
+    scratch.file(
+        "java/android/library2/BUILD",
+        "android_library(",
+        "    name = 'lib2_with_databinding',",
+        "    enable_data_binding = 1,",
+        "    manifest = 'AndroidManifest.xml',",
+        "    srcs = ['MyLib2.java'],",
+        ")");
+
+    scratch.file(
+        "java/android/library3/BUILD",
+        "android_library(",
+        "    name = 'lib3',",
+        "    manifest = 'AndroidManifest.xml',",
+        "    srcs = ['MyLib3.java'],",
+        ")");
+
+    scratch.file(
+        "java/android/lib_with_exports/BUILD",
+        "android_library(",
+        "    name = 'lib_with_exports_no_databinding',",
+        "    exports = [",
+        "        '//java/android/library1:lib1_with_databinding',",
+        "        '//java/android/library2:lib2_with_databinding',",
+        "        '//java/android/library3:lib3',",
+        "    ],",
+        "    manifest = 'AndroidManifest.xml',",
+        ")",
+        "",
+        "android_library(",
+        "    name = 'lib_with_exports_and_databinding',",
+        "    exports = [",
+        "        '//java/android/library1:lib1_with_databinding',",
+        "        '//java/android/library2:lib2_with_databinding',",
+        "        '//java/android/library3:lib3',",
+        "    ],",
+        "    manifest = 'AndroidManifest.xml',",
+        "    enable_data_binding = 1,",
+        ")");
+
+    scratch.file(
+        "java/android/binary/BUILD",
+        "android_binary(",
+        "    name = 'app_dep_on_exports_no_databinding',",
+        "    enable_data_binding = 1,",
+        "    manifest = 'AndroidManifest.xml',",
+        "    srcs = ['MyApp.java'],",
+        "    deps = ['//java/android/lib_with_exports:lib_with_exports_no_databinding'],",
+        ")",
+        "",
+        "android_binary(",
+        "    name = 'app_dep_on_exports_and_databinding',",
+        "    enable_data_binding = 1,",
+        "    manifest = 'AndroidManifest.xml',",
+        "    srcs = ['MyApp.java'],",
+        "    deps = ['//java/android/lib_with_exports:lib_with_exports_and_databinding'],",
+        ")");
+  }
+
+  @Test
+  public void testDependentLibraryJavaPackagesPassedFromLibraryWithExportsNoDatabinding()
+      throws Exception {
+
+    writeDataBindingFilesWithExports();
+
+    ConfiguredTarget ctapp =
+        getConfiguredTarget("//java/android/binary:app_dep_on_exports_no_databinding");
+    Set<Artifact> allArtifacts = actionsTestUtil().artifactClosureOf(getFilesToBuild(ctapp));
+    SpawnAction binCompileAction =
+        (SpawnAction) getGeneratingAction(getFirstArtifactEndingWith(
+            allArtifacts, "app_dep_on_exports_no_databinding.jar"));
+
+    ImmutableList<String> expectedJavacopts =
+        ImmutableList.of(
+            "-Aandroid.databinding.directDependencyPkgs=[android.library1,android.library2]");
+    assertThat(paramFileArgsForAction(binCompileAction)).containsAllIn(expectedJavacopts);
+
+  }
+
+  @Test
+  public void testDependentLibraryJavaPackagesPassedFromLibraryWithExportsAndDatabinding()
+      throws Exception {
+
+    writeDataBindingFilesWithExports();
+
+    ConfiguredTarget ctapp =
+        getConfiguredTarget("//java/android/binary:app_dep_on_exports_and_databinding");
+    Set<Artifact> allArtifacts = actionsTestUtil().artifactClosureOf(getFilesToBuild(ctapp));
+    SpawnAction binCompileAction =
+        (SpawnAction) getGeneratingAction(getFirstArtifactEndingWith(
+            allArtifacts, "app_dep_on_exports_and_databinding.jar"));
+
+    ImmutableList<String> expectedJavacopts =
+        ImmutableList.of("-Aandroid.databinding.directDependencyPkgs="
+            + "[android.lib_with_exports,android.library1,android.library2]");
+    assertThat(paramFileArgsForAction(binCompileAction)).containsAllIn(expectedJavacopts);
+
+  }
+
+  @Test
+  public void testNoDependentLibraryJavaPackagesIsEmptyBrackets()
+      throws Exception {
+
+    scratch.file(
+        "java/android/binary/BUILD",
+        "android_binary(",
+        "    name = 'app_databinding_no_deps',",
+        "    enable_data_binding = 1,",
+        "    manifest = 'AndroidManifest.xml',",
+        "    srcs = ['MyApp.java'],",
+        "    deps = [],",
+        ")");
+
+    ConfiguredTarget ctapp =
+        getConfiguredTarget("//java/android/binary:app_databinding_no_deps");
+    Set<Artifact> allArtifacts = actionsTestUtil().artifactClosureOf(getFilesToBuild(ctapp));
+    SpawnAction binCompileAction =
+        (SpawnAction) getGeneratingAction(getFirstArtifactEndingWith(
+            allArtifacts, "app_databinding_no_deps.jar"));
+
+    ImmutableList<String> expectedJavacopts =
+        ImmutableList.of("-Aandroid.databinding.directDependencyPkgs=[]");
+    assertThat(paramFileArgsForAction(binCompileAction)).containsAllIn(expectedJavacopts);
+
+  }
+
 }