From 4ae59984ec23c06e04e4de3888dd5d5b255ef22e Mon Sep 17 00:00:00 2001 From: Googler Date: Mon, 15 May 2017 19:39:36 +0200 Subject: 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 --- .../build/lib/rules/android/ResourceFilter.java | 23 +++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) (limited to 'src/main/java/com/google/devtools/build/lib/rules/android/ResourceFilter.java') 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 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 getDensities(RuleContext ruleContext) { ImmutableList.Builder densityBuilder = ImmutableList.builder(); for (String density : densities) { -- cgit v1.2.3