// Copyright 2015 The Bazel Authors. All rights reserved. // // 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.google.devtools.build.lib.rules.android; import static com.google.devtools.build.lib.rules.android.AndroidSkylarkData.fromNoneable; import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableCollection; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Iterables; import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.collect.nestedset.NestedSet; import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; import com.google.devtools.build.lib.packages.BuiltinProvider; import com.google.devtools.build.lib.packages.NativeInfo; import com.google.devtools.build.lib.rules.java.JavaRuleOutputJarsProvider.OutputJar; import com.google.devtools.build.lib.skylarkbuildapi.android.AndroidIdeInfoProviderApi; import com.google.devtools.build.lib.syntax.EvalException; import com.google.devtools.build.lib.syntax.SkylarkDict; import com.google.devtools.build.lib.syntax.SkylarkList; import com.google.devtools.build.lib.syntax.SkylarkNestedSet; import java.util.Collection; import java.util.LinkedHashSet; import java.util.Map; import java.util.Set; import javax.annotation.Nullable; /** An Android target provider to provide Android-specific info to IDEs. */ @Immutable public final class AndroidIdeInfoProvider extends NativeInfo implements AndroidIdeInfoProviderApi { public static final String PROVIDER_NAME = "AndroidIdeInfo"; public static final Provider PROVIDER = new Provider(); /** Builder for {@link AndroidIdeInfoProvider} */ public static class Builder { private Artifact manifest = null; private Artifact generatedManifest = null; private Artifact apk = null; private Artifact resourceApk = null; private Artifact idlClassJar = null; private Artifact idlSourceJar = null; private OutputJar resourceJar = null; private String javaPackage = null; private String idlImportRoot = null; private final Set idlSrcs = new LinkedHashSet<>(); private final Set idlGeneratedJavaFiles = new LinkedHashSet<>(); private final Set apksUnderTest = new LinkedHashSet<>(); private boolean definesAndroidResources; private Artifact aar = null; private Map> nativeLibs = null; public AndroidIdeInfoProvider build() { return new AndroidIdeInfoProvider( javaPackage, idlImportRoot, manifest, generatedManifest, apk, idlClassJar, idlSourceJar, resourceJar, definesAndroidResources, aar, ImmutableList.copyOf(idlSrcs), ImmutableList.copyOf(idlGeneratedJavaFiles), ImmutableList.copyOf(apksUnderTest), nativeLibs != null ? ImmutableMap.copyOf(nativeLibs) : ImmutableMap.>of(), resourceApk); } public Builder setJavaPackage(String javaPackage) { this.javaPackage = javaPackage; return this; } public Builder setDefinesAndroidResources(boolean definesAndroidResources) { this.definesAndroidResources = definesAndroidResources; return this; } public Builder setApk(Artifact apk) { Preconditions.checkState(this.apk == null); this.apk = apk; return this; } public Builder setManifest(Artifact manifest) { Preconditions.checkState(this.manifest == null); this.manifest = manifest; return this; } public Builder setGeneratedManifest(Artifact manifest) { Preconditions.checkState(this.generatedManifest == null); this.generatedManifest = manifest; return this; } public Builder setIdlClassJar(@Nullable Artifact idlClassJar) { Preconditions.checkState(this.idlClassJar == null); this.idlClassJar = idlClassJar; return this; } public Builder setIdlSourceJar(@Nullable Artifact idlSourceJar) { Preconditions.checkState(this.idlSourceJar == null); this.idlSourceJar = idlSourceJar; return this; } public Builder setResourceJar(OutputJar resourceJar) { this.resourceJar = resourceJar; return this; } public Builder setResourceApk(Artifact resourceApk) { this.resourceApk = resourceApk; return this; } public Builder setAar(Artifact aar) { this.aar = aar; return this; } public Builder setNativeLibs(Map> nativeLibs) { this.nativeLibs = nativeLibs; return this; } public Builder addIdlImportRoot(String idlImportRoot) { this.idlImportRoot = idlImportRoot; return this; } /** Add "idl_srcs" contents. */ public Builder addIdlSrcs(Collection idlSrcs) { this.idlSrcs.addAll(idlSrcs); return this; } /** Add the java files generated from "idl_srcs". */ public Builder addIdlGeneratedJavaFiles(Collection idlGeneratedJavaFiles) { this.idlGeneratedJavaFiles.addAll(idlGeneratedJavaFiles); return this; } public Builder addAllApksUnderTest(Iterable apks) { Iterables.addAll(apksUnderTest, apks); return this; } } private final String javaPackage; private final String idlImportRoot; private final Artifact manifest; private final Artifact generatedManifest; private final Artifact signedApk; @Nullable private final Artifact idlClassJar; @Nullable private final Artifact idlSourceJar; @Nullable private final OutputJar resourceJar; @Nullable private final Artifact resourceApk; private final boolean definesAndroidResources; private final Artifact aar; private final ImmutableCollection idlSrcs; private final ImmutableCollection idlGeneratedJavaFiles; private final ImmutableCollection apksUnderTest; private final ImmutableMap> nativeLibs; public AndroidIdeInfoProvider( String javaPackage, String idlImportRoot, @Nullable Artifact manifest, @Nullable Artifact generatedManifest, @Nullable Artifact signedApk, @Nullable Artifact idlClassJar, @Nullable Artifact idlSourceJar, @Nullable OutputJar resourceJar, boolean definesAndroidResources, @Nullable Artifact aar, ImmutableCollection idlSrcs, ImmutableCollection idlGeneratedJavaFiles, ImmutableCollection apksUnderTest, ImmutableMap> nativeLibs, Artifact resourceApk) { super(PROVIDER); this.javaPackage = javaPackage; this.idlImportRoot = idlImportRoot; this.manifest = manifest; this.generatedManifest = generatedManifest; this.signedApk = signedApk; this.idlClassJar = idlClassJar; this.idlSourceJar = idlSourceJar; this.resourceJar = resourceJar; this.definesAndroidResources = definesAndroidResources; this.aar = aar; this.idlSrcs = idlSrcs; this.idlGeneratedJavaFiles = idlGeneratedJavaFiles; this.apksUnderTest = apksUnderTest; this.nativeLibs = nativeLibs; this.resourceApk = resourceApk; } @Override public String getJavaPackage() { return javaPackage; } @Override @Nullable public Artifact getManifest() { return manifest; } @Override @Nullable public Artifact getGeneratedManifest() { return generatedManifest; } @Override public boolean definesAndroidResources() { return this.definesAndroidResources; } @Override @Nullable public String getIdlImportRoot() { return idlImportRoot; } @Override @Nullable public Artifact getSignedApk() { return signedApk; } @Override @Nullable public Artifact getIdlClassJar() { return idlClassJar; } @Override @Nullable public Artifact getIdlSourceJar() { return idlSourceJar; } @Override @Nullable public OutputJar getResourceJar() { return resourceJar; } @Override @Nullable public Artifact getAar() { return aar; } @Override @Nullable public Artifact getResourceApk() { return resourceApk; } @Override public ImmutableCollection getIdlSrcs() { return idlSrcs; } @Override public ImmutableCollection getIdlGeneratedJavaFiles() { return idlGeneratedJavaFiles; } @Override public ImmutableCollection getApksUnderTest() { return apksUnderTest; } public ImmutableMap> getNativeLibs() { return nativeLibs; } @Override public ImmutableMap getNativeLibsSkylark() { ImmutableMap.Builder builder = ImmutableMap.builder(); for (Map.Entry> entry : getNativeLibs().entrySet()) { builder.put(entry.getKey(), SkylarkNestedSet.of(Artifact.class, entry.getValue())); } return builder.build(); } /** Provider class for {@link AndroidIdeInfoProvider} objects. */ public static class Provider extends BuiltinProvider implements AndroidIdeInfoProviderApi.Provider { private Provider() { super(PROVIDER_NAME, AndroidIdeInfoProvider.class); } @Override public AndroidIdeInfoProvider createInfo( String javaPackage, Object manifest, Object generatedManifest, String idlImportRoot, SkylarkList idlSrcs, SkylarkList idlGeneratedJavaFiles, Object idlSourceJar, Object idlClassJar, boolean definesAndroidResources, Object resourceJar, Artifact resourceApk, Object signedApk, Object aar, SkylarkList apksUnderTest, SkylarkDict nativeLibs) throws EvalException { Map nativeLibsMap = nativeLibs.getContents(String.class, SkylarkNestedSet.class, "native_libs"); ImmutableMap.Builder> builder = ImmutableMap.builder(); for (Map.Entry entry : nativeLibsMap.entrySet()) { builder.put(entry.getKey(), entry.getValue().getSet(Artifact.class)); } return new AndroidIdeInfoProvider( javaPackage, idlImportRoot, fromNoneable(manifest, Artifact.class), fromNoneable(generatedManifest, Artifact.class), fromNoneable(signedApk, Artifact.class), fromNoneable(idlClassJar, Artifact.class), fromNoneable(idlSourceJar, Artifact.class), fromNoneable(resourceJar, OutputJar.class), definesAndroidResources, fromNoneable(aar, Artifact.class), idlSrcs.getImmutableList(), idlGeneratedJavaFiles.getImmutableList(), apksUnderTest.getImmutableList(), builder.build(), resourceApk); } } }