Added `resource_configuration_filters` and `densities` attributes to android_local_test so we can test with pseudo locales.
Rule changes will follow this, see unknown commit.
BEGIN_PUBLIC
Added `resource_configuration_filters` and `densities` attributes to android_local_test so we can test with pseudo locales.
END_PUBLIC
PiperOrigin-RevId: 301262845
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLocalTestBase.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLocalTestBase.java
index b8442bd..c9d6579 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLocalTestBase.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLocalTestBase.java
@@ -113,7 +113,8 @@
ResourceDependencies.fromRuleDeps(ruleContext, /* neverlink = */ false),
AssetDependencies.fromRuleDeps(ruleContext, /* neverlink = */ false),
StampedAndroidManifest.getManifestValues(ruleContext),
- ruleContext.getExpander().withDataExecLocations().tokenized("nocompress_extensions"));
+ ruleContext.getExpander().withDataExecLocations().tokenized("nocompress_extensions"),
+ ResourceFilterFactory.fromRuleContextAndAttrs(ruleContext));
attributesBuilder.addRuntimeClassPathEntry(resourceApk.getResourceJavaClassJar());
@@ -490,7 +491,8 @@
ResourceDependencies resourceDeps,
AssetDependencies assetDeps,
Map<String, String> manifestValues,
- List<String> noCompressExtensions)
+ List<String> noCompressExtensions,
+ ResourceFilterFactory resourceFilterFactory)
throws InterruptedException {
StampedAndroidManifest stamped =
@@ -511,7 +513,8 @@
assets,
resourceDeps,
assetDeps,
- noCompressExtensions)
+ noCompressExtensions,
+ resourceFilterFactory)
.generateRClass(dataContext);
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLocalTestBaseRule.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLocalTestBaseRule.java
index ea2fea5..2931c9f 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLocalTestBaseRule.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLocalTestBaseRule.java
@@ -141,6 +141,17 @@
A list of file extensions to leave uncompressed in the resource apk.
<!-- #END_BLAZE_RULE.ATTRIBUTE --> */
.add(attr("nocompress_extensions", STRING_LIST))
+ /* <!-- #BLAZE_RULE($android_local_test_base).ATTRIBUTE(resource_configuration_filters) -->
+ A list of resource configuration filters, such as 'en' that will limit the resources in the
+ apk to only the ones in the 'en' configuration.
+ <!-- #END_BLAZE_RULE.ATTRIBUTE --> */
+ .add(attr("resource_configuration_filters", STRING_LIST))
+ /* <!-- #BLAZE_RULE($android_local_test_base).ATTRIBUTE(densities) -->
+ Densities to filter for when building the apk. A corresponding compatible-screens
+ section will also be added to the manifest if it does not already contain a
+ superset SkylarkListing.
+ <!-- #END_BLAZE_RULE.ATTRIBUTE --> */
+ .add(attr("densities", STRING_LIST))
.build();
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSkylarkData.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSkylarkData.java
index 1168eaa..da2bfa5 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSkylarkData.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSkylarkData.java
@@ -298,7 +298,9 @@
String aaptVersionString,
Dict<?, ?> manifestValues, // <String, String>
Sequence<?> deps, // <ConfiguredTarget>
- Sequence<?> noCompressExtensions) // <String>
+ Sequence<?> noCompressExtensions, // <String>
+ Sequence<?> resourceConfigurationFilters, // <String>
+ Sequence<?> densities) // <String>)
throws InterruptedException, EvalException {
SkylarkErrorReporter errorReporter = SkylarkErrorReporter.from(ctx.getRuleErrorConsumer());
List<ConfiguredTarget> depsTargets = deps.getContents(ConfiguredTarget.class, "deps");
@@ -335,7 +337,11 @@
AssetDependencies.fromProviders(
getProviders(depsTargets, AndroidAssetsInfo.PROVIDER), /* neverlink = */ false),
manifestValues.getContents(String.class, String.class, "manifest_values"),
- noCompressExtensions.getContents(String.class, "nocompress_extensions"));
+ noCompressExtensions.getContents(String.class, "nocompress_extensions"),
+ ResourceFilterFactory.from(
+ resourceConfigurationFilters.getContents(
+ String.class, "resource_configuration_filters"),
+ densities.getContents(String.class, "densities")));
ImmutableMap.Builder<Provider, NativeInfo> builder = ImmutableMap.builder();
builder.putAll(getNativeInfosFrom(resourceApk, ctx.getLabel()));
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/ProcessedAndroidData.java b/src/main/java/com/google/devtools/build/lib/rules/android/ProcessedAndroidData.java
index d60d068..a1164c7 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/ProcessedAndroidData.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/ProcessedAndroidData.java
@@ -164,7 +164,8 @@
AndroidAssets assets,
ResourceDependencies resourceDeps,
AssetDependencies assetDeps,
- List<String> noCompressExtensions)
+ List<String> noCompressExtensions,
+ ResourceFilterFactory resourceFilterFactory)
throws InterruptedException {
return builderForNonIncrementalTopLevelTarget(dataContext, manifest, manifestValues)
@@ -176,6 +177,7 @@
.withResourceDependencies(resourceDeps)
.withAssetDependencies(assetDeps)
.setUncompressedExtensions(noCompressExtensions)
+ .setResourceFilterFactory(resourceFilterFactory)
.build(dataContext, resources, assets, manifest, dataBindingContext);
}
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/AndroidDataProcessingApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/AndroidDataProcessingApi.java
index be67ec0..5da316c 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/AndroidDataProcessingApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/AndroidDataProcessingApi.java
@@ -613,7 +613,28 @@
type = Sequence.class,
generic1 = String.class,
named = true,
- doc = "A list of file extensions to leave uncompressed in the resource apk.")
+ doc = "A list of file extensions to leave uncompressed in the resource apk."),
+ @Param(
+ name = "resource_configuration_filters",
+ positional = false,
+ defaultValue = "[]",
+ type = Sequence.class,
+ generic1 = String.class,
+ named = true,
+ doc =
+ "A list of resource configuration filters, such as 'en' that will limit the"
+ + " resources in the apk to only the ones in the 'en' configuration."),
+ @Param(
+ name = "densities",
+ positional = false,
+ defaultValue = "[]",
+ type = Sequence.class,
+ generic1 = String.class,
+ named = true,
+ doc =
+ "Densities to filter for when building the apk. A corresponding compatible-screens"
+ + " section will also be added to the manifest if it does not already contain a"
+ + " superset listing."),
},
doc =
"Processes resources, assets, and manifests for android_local_test and returns a dict"
@@ -629,7 +650,9 @@
String aaptVersionString,
Dict<?, ?> manifestValues, // <String, String>
Sequence<?> deps, // <TransitiveInfoCollectionT>
- Sequence<?> noCompressExtensions) // <String>
+ Sequence<?> noCompressExtensions, // <String>
+ Sequence<?> resourceConfigurationFilters, // <String>
+ Sequence<?> densities) // <String>
throws InterruptedException, EvalException;
@SkylarkCallable(
@@ -659,7 +682,7 @@
generic1 = String.class,
named = true,
doc =
- "A list of resource configuration filters, such 'en' that will limit the"
+ "A list of resource configuration filters, such as 'en' that will limit the"
+ " resources in the apk to only the ones in the 'en' configuration."),
@Param(
name = "densities",
@@ -671,7 +694,7 @@
doc =
"Densities to filter for when building the apk. A corresponding compatible-screens"
+ " section will also be added to the manifest if it does not already contain a"
- + " superset SkylarkListing."),
+ + " superset listing."),
@Param(
name = "nocompress_extensions",
positional = false,
diff --git a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidLocalTestTest.java b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidLocalTestTest.java
index d759819..6998282 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidLocalTestTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidLocalTestTest.java
@@ -15,13 +15,15 @@
import static com.google.common.truth.Truth.assertThat;
import static com.google.devtools.build.lib.actions.util.ActionsTestUtil.getFirstArtifactEndingWith;
-import static com.google.devtools.build.lib.rules.android.AndroidBuildViewTestCase.getValidatedResources;
import com.google.common.collect.ImmutableList;
+import com.google.devtools.build.lib.actions.ActionAnalysisMetadata;
import com.google.devtools.build.lib.actions.Artifact;
import com.google.devtools.build.lib.actions.util.ActionsTestUtil;
import com.google.devtools.build.lib.analysis.ConfiguredTarget;
import com.google.devtools.build.lib.analysis.FileProvider;
+import com.google.devtools.build.lib.analysis.actions.SpawnAction;
+import com.google.devtools.build.lib.analysis.configuredtargets.RuleConfiguredTarget;
import com.google.devtools.build.lib.collect.nestedset.NestedSet;
import com.google.devtools.build.lib.rules.java.JavaPrimaryClassProvider;
import com.google.devtools.build.lib.testutil.MoreAsserts;
@@ -249,6 +251,32 @@
.inOrder();
}
+ @Test
+ public void testResourceConfigurationFilters() throws Exception {
+ scratch.file(
+ "java/test/BUILD",
+ "load('//java/bar:foo.bzl', 'extra_deps')",
+ "android_local_test(name = 'dummyTest',",
+ " srcs = ['test.java'],",
+ " deps = extra_deps,",
+ " resource_configuration_filters = ['ar_XB'])");
+
+ ConfiguredTarget binary = getConfiguredTarget("//java/test:dummyTest");
+ final ImmutableList<ActionAnalysisMetadata> actions =
+ ((RuleConfiguredTarget) binary).getActions();
+
+ ActionAnalysisMetadata aaptAction = null;
+ for (ActionAnalysisMetadata action : actions) {
+ if (action.getMnemonic().equals("AndroidAapt2")) {
+ aaptAction = action;
+ }
+ }
+ assertThat(aaptAction).isNotNull();
+ final List<String> aaptArguments = ((SpawnAction) aaptAction).getArguments();
+ assertThat(aaptArguments).contains("--resourceConfigs");
+ assertThat(aaptArguments).contains("ar_XB");
+ }
+
@Override
protected String getRuleName() {
return "android_local_test";