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";