aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Googler <noreply@google.com>2017-05-15 19:39:36 +0200
committerGravatar Dmitry Lomov <dslomov@google.com>2017-05-15 23:20:33 +0200
commit4ae59984ec23c06e04e4de3888dd5d5b255ef22e (patch)
treed735688621859dc882aa3313500ecd009b808754
parent866ecc8c3d5e0b899e3f0c9c6b2265f16daae842 (diff)
Convert locale qualifiers from old Aapt format to correct format before parsing
Aapt used to require resource locale qualifiers with regions of the form 'en_US', rather than the correct Android 'en-rUS'. The resource qualifier processing code used by ResourceFilter cannot handle the (incorrect) Aapt format. However, for backwards compatability, we want to continue supporting the Aapt format. Handle it by using a regex to replace the old format with the correct format when parsing. RELNOTES: none PiperOrigin-RevId: 156072395
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/ResourceFilter.java23
-rw-r--r--src/test/java/com/google/devtools/build/lib/rules/android/AndroidBinaryTest.java16
2 files changed, 38 insertions, 1 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/ResourceFilter.java b/src/main/java/com/google/devtools/build/lib/rules/android/ResourceFilter.java
index fd3658889f..d61beaabf5 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/ResourceFilter.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/ResourceFilter.java
@@ -197,7 +197,7 @@ public class ResourceFilter {
ImmutableList.Builder<FolderConfiguration> filterBuilder = ImmutableList.builder();
for (String filter : configFilters) {
addIfNotNull(
- FolderConfiguration.getConfigForQualifierString(filter),
+ getFolderConfiguration(filter),
filter,
filterBuilder,
ruleContext,
@@ -207,6 +207,27 @@ public class ResourceFilter {
return filterBuilder.build();
}
+ private static FolderConfiguration getFolderConfiguration(String filter) {
+ /*
+ * Aapt used to expect locale configurations of form 'en_US'. It now also supports the correct
+ * 'en-rUS' format. For backwards comparability, use a regex to convert filters with locales in
+ * the old format to filters with locales of the correct format.
+ *
+ * The correct format for locales is defined at
+ * https://developer.android.com/guide/topics/resources/providing-resources.html#LocaleQualifier
+ *
+ * TODO(bazel-team): Migrate consumers away from the old Aapt locale format, then remove this
+ * replacement.
+ *
+ * The regex is a bit complicated to avoid modifying potential new qualifiers that contain
+ * underscores. Specifically, it searches for the entire beginning of the resource qualifier,
+ * including (optionally) MCC and MNC, and then the locale itself.
+ */
+ String fixedFilter =
+ filter.replaceFirst("^((mcc[0-9]{3}-(mnc[0-9]{3}-)?)?[a-z]{2})_([A-Z]{2})", "$1-r$4");
+ return FolderConfiguration.getConfigForQualifierString(fixedFilter);
+ }
+
private ImmutableList<Density> getDensities(RuleContext ruleContext) {
ImmutableList.Builder<Density> densityBuilder = ImmutableList.builder();
for (String density : densities) {
diff --git a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidBinaryTest.java b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidBinaryTest.java
index 4948c8bfa5..a06521393e 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidBinaryTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidBinaryTest.java
@@ -1164,6 +1164,22 @@ public class AndroidBinaryTest extends AndroidBuildViewTestCase {
}
@Test
+ public void testFilteredResourcesOldAaptLocale() throws Exception {
+ testDirectResourceFiltering(
+ "en_US,fr_CA",
+ /* unexepectedQualifiers= */ ImmutableList.of("en-rCA"),
+ /* expectedQualifiers = */ ImmutableList.of("en-rUS", "fr-rCA"));
+ }
+
+ @Test
+ public void testFilteredResourcesOldAaptLocaleOtherQualifiers() throws Exception {
+ testDirectResourceFiltering(
+ "mcc310-en_US-ldrtl,mcc311-mnc312-fr_CA",
+ /* unexepectedQualifiers= */ ImmutableList.of("en-rCA", "mcc312", "mcc311-mnc311"),
+ /* expectedQualifiers = */ ImmutableList.of("en-rUS", "fr-rCA", "mcc310", "mcc311-mnc312"));
+ }
+
+ @Test
public void testFilteredResourcesSmallestScreenWidth() throws Exception {
testDirectResourceFiltering(
"sw600dp",