/** Packages up the manifest with resource and assets from the rule and dependent resources. */
  public ResourceApk packWithDataAndResources(
      Artifact resourceApk,
      RuleContext ruleContext,
      NestedSet<ResourceContainer> resourceContainers,
      Artifact rTxt,
      Artifact symbolsTxt,
      List<String> configurationFilters,
      List<String> uncompressedExtensions,
      List<String> densities,
      String applicationId,
      String versionCode,
      String versionName,
      boolean incremental,
      Artifact proguardCfg) {
    try {
      LocalResourceContainer data =
          new LocalResourceContainer.Builder()
              .withAssets(
                  AndroidCommon.getAssetDir(ruleContext),
                  ruleContext.getPrerequisites(
                      // TODO(bazel-team): Remove the ResourceType construct.
                      ResourceType.ASSETS.getAttribute(), Mode.TARGET, FileProvider.class))
              .withResources(
                  ruleContext.getPrerequisites("resource_files", Mode.TARGET, FileProvider.class))
              .build();

      return createApk(
          resourceApk,
          ruleContext,
          resourceContainers,
          rTxt,
          symbolsTxt,
          configurationFilters,
          uncompressedExtensions,
          densities,
          applicationId,
          versionCode,
          versionName,
          incremental,
          data,
          proguardCfg);
    } catch (InvalidAssetPath e) {
      ruleContext.attributeError(ResourceType.ASSETS.getAttribute(), e.getMessage());
      throw new RuleConfigurationException();
    } catch (InvalidResourcePath e) {
      ruleContext.attributeError("resource_files", e.getMessage());
      throw new RuleConfigurationException();
    }
  }
  /** Packages up the manifest with assets from the rule and dependent resources. */
  public ResourceApk packWithAssets(
      Artifact resourceApk,
      RuleContext ruleContext,
      NestedSet<ResourceContainer> resourceContainers,
      Artifact rTxt,
      boolean incremental,
      Artifact proguardCfg) {
    try {
      LocalResourceContainer data =
          new LocalResourceContainer.Builder()
              .withAssets(
                  AndroidCommon.getAssetDir(ruleContext),
                  ruleContext.getPrerequisites(
                      // TODO(bazel-team): Remove the ResourceType construct.
                      ResourceType.ASSETS.getAttribute(), Mode.TARGET, FileProvider.class))
              .build();

      return createApk(
          resourceApk,
          ruleContext,
          resourceContainers,
          rTxt,
          null, /* configurationFilters */
          ImmutableList.<String>of(), /* uncompressedExtensions */
          ImmutableList.<String>of(), /* densities */
          ImmutableList.<String>of(), /* String applicationId */
          null, /* String versionCode */
          null, /* String versionName */
          null, /* Artifact symbolsTxt */
          incremental,
          data,
          proguardCfg);
    } catch (InvalidAssetPath e) {
      ruleContext.attributeError(ResourceType.ASSETS.getAttribute(), e.getMessage());
      throw new RuleConfigurationException();
    }
  }
 /**
  * Retrieves the asset {@link Artifact} and asset root {@link PathFragment}.
  *
  * @param assetsDir The common directory for the assets, used to get the directory roots and
  *     verify the artifacts are located beneath the assetsDir
  * @param targets {@link FileProvider}s for a given set of assets.
  * @return The Builder.
  */
 public LocalResourceContainer.Builder withAssets(
     PathFragment assetsDir, Iterable<? extends TransitiveInfoCollection> targets) {
   for (TransitiveInfoCollection target : targets) {
     for (Artifact file : target.getProvider(FileProvider.class).getFilesToBuild()) {
       PathFragment packageFragment =
           file.getArtifactOwner().getLabel().getPackageIdentifier().getSourceRoot();
       PathFragment packageRelativePath = file.getRootRelativePath().relativeTo(packageFragment);
       if (packageRelativePath.startsWith(assetsDir)) {
         PathFragment relativePath = packageRelativePath.relativeTo(assetsDir);
         assetRoots.add(trimTail(file.getExecPath(), relativePath));
       } else {
         ruleContext.attributeError(
             ResourceType.ASSETS.getAttribute(),
             String.format(
                 "'%s' (generated by '%s') is not beneath '%s'",
                 file.getRootRelativePath(), target.getLabel(), assetsDir));
         return this;
       }
       assets.add(file);
     }
   }
   return this;
 }