aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/tools/android/java/com/google/devtools/build
diff options
context:
space:
mode:
authorGravatar Googler <noreply@google.com>2016-05-19 17:46:26 +0000
committerGravatar Kristina Chodorow <kchodorow@google.com>2016-05-19 18:05:23 +0000
commitd3cccae7b663d5defea2943509b0d9d245279830 (patch)
treefda1f7666033ee03ba3b01409ab20ad1b211a7e5 /src/tools/android/java/com/google/devtools/build
parent5d54cec0b27ba9aef183b46a354af061860eff23 (diff)
*** Reason for rollback *** Breaks Bazel due to internal patch for Round qualifier. *** Original change description *** * Adds handling for anydpi and watch, two unsupported qualifiers in FolderConfiguration. * Handles resources nested in directories. * Makes the resource processing resilient to invalid qualifiers. -- MOS_MIGRATED_REVID=122747030
Diffstat (limited to 'src/tools/android/java/com/google/devtools/build')
-rw-r--r--src/tools/android/java/com/google/devtools/build/android/FullyQualifiedName.java88
-rw-r--r--src/tools/android/java/com/google/devtools/build/android/ParsedAndroidData.java24
2 files changed, 38 insertions, 74 deletions
diff --git a/src/tools/android/java/com/google/devtools/build/android/FullyQualifiedName.java b/src/tools/android/java/com/google/devtools/build/android/FullyQualifiedName.java
index 072b9d5683..2678706d21 100644
--- a/src/tools/android/java/com/google/devtools/build/android/FullyQualifiedName.java
+++ b/src/tools/android/java/com/google/devtools/build/android/FullyQualifiedName.java
@@ -22,7 +22,9 @@ import com.google.common.collect.Iterators;
import com.google.common.collect.PeekingIterator;
import com.google.devtools.build.android.proto.SerializeFormat;
+import com.android.ide.common.resources.configuration.CountryCodeQualifier;
import com.android.ide.common.resources.configuration.FolderConfiguration;
+import com.android.ide.common.resources.configuration.NetworkCodeQualifier;
import com.android.ide.common.resources.configuration.ResourceQualifier;
import com.android.resources.ResourceType;
@@ -97,18 +99,19 @@ public class FullyQualifiedName implements DataKey, Comparable<FullyQualifiedNam
}
private static List<String> getQualifiers(String[] dirNameAndQualifiers) {
+ // TODO(corysmith): Remove when FolderConfiguration supports ll-r{3,4} regions.
PeekingIterator<String> rawQualifiers =
Iterators.peekingIterator(Iterators.forArray(dirNameAndQualifiers));
// Remove directory name
rawQualifiers.next();
List<String> unHandledLanguageRegionQualifiers = new ArrayList<>();
- List<String> unHandledDensityQualifiers = new ArrayList<>();
- List<String> unHandledUIModeQualifiers = new ArrayList<>();
List<String> handledQualifiers = new ArrayList<>();
- // TODO(corysmith): Remove when FolderConfiguration is updated to handle anydpi and
- // BCP prefixes.
- // The language/region qualifiers and anydpi cannot be currently handled.
- while (rawQualifiers.hasNext()) {
+ // The language/region qualifiers can be in the first 4 qualifier slots.
+ for (int qualifierSlot = 0; qualifierSlot < 4; qualifierSlot++) {
+ // qualifiers have been exhausted.
+ if (!rawQualifiers.hasNext()) {
+ break;
+ }
String qualifier = rawQualifiers.next();
if (qualifier.startsWith(BCP_PREFIX)) {
// The b+local+script/region can't be handled.
@@ -127,15 +130,12 @@ public class FullyQualifiedName implements DataKey, Comparable<FullyQualifiedNam
unHandledLanguageRegionQualifiers.add("b+sr+Latn");
// Consume the next value, as it's been replaced.
rawQualifiers.next();
- } else if (qualifier.equals("anydpi")) {
- unHandledDensityQualifiers.add(qualifier);
- } else if (qualifier.equals("watch")) {
- unHandledUIModeQualifiers.add(qualifier);
} else {
// This qualifier can probably be handled by FolderConfiguration.
handledQualifiers.add(qualifier);
}
}
+ Iterators.addAll(handledQualifiers, rawQualifiers);
// Create a configuration
FolderConfiguration config = FolderConfiguration.getConfigFromQualifiers(handledQualifiers);
// FolderConfiguration returns an unhelpful null when it considers the qualifiers to be
@@ -145,53 +145,29 @@ public class FullyQualifiedName implements DataKey, Comparable<FullyQualifiedNam
String.format(INVALID_QUALIFIERS, DASH_JOINER.join(dirNameAndQualifiers)));
}
config.normalize();
-
- // This is fragile but better than the Gradle scheme of just dropping
- // entire subtrees.
- Builder<String> builder = ImmutableList.<String>builder();
- addIfNotNull(config.getCountryCodeQualifier(), builder);
- addIfNotNull(config.getNetworkCodeQualifier(), builder);
- if (unHandledLanguageRegionQualifiers.isEmpty()) {
- addIfNotNull(config.getLanguageQualifier(), builder);
- addIfNotNull(config.getRegionQualifier(), builder);
- } else {
- builder.addAll(unHandledLanguageRegionQualifiers);
- }
- addIfNotNull(config.getLayoutDirectionQualifier(), builder);
- addIfNotNull(config.getSmallestScreenWidthQualifier(), builder);
- addIfNotNull(config.getScreenWidthQualifier(), builder);
- addIfNotNull(config.getScreenHeightQualifier(), builder);
- addIfNotNull(config.getScreenSizeQualifier(), builder);
- addIfNotNull(config.getScreenRatioQualifier(), builder);
- addIfNotNull(config.getScreenRoundQualifier(), builder);
- addIfNotNull(config.getScreenOrientationQualifier(), builder);
- if (unHandledUIModeQualifiers.isEmpty()) {
- addIfNotNull(config.getUiModeQualifier(), builder);
- } else {
- builder.addAll(unHandledUIModeQualifiers);
+ PeekingIterator<ResourceQualifier> normalizedQualifiers =
+ Iterators.peekingIterator(Iterators.forArray(config.getQualifiers()));
+ // No qualifiers, just returns the language regions. Which may be empty, but an empty list is
+ // an empty list.
+ if (!normalizedQualifiers.hasNext()) {
+ return ImmutableList.copyOf(unHandledLanguageRegionQualifiers);
}
- addIfNotNull(config.getNightModeQualifier(), builder);
- if (unHandledDensityQualifiers.isEmpty()) {
- addIfNotNull(config.getDensityQualifier(), builder);
- } else {
- builder.addAll(unHandledDensityQualifiers);
- }
- addIfNotNull(config.getTouchTypeQualifier(), builder);
- addIfNotNull(config.getKeyboardStateQualifier(), builder);
- addIfNotNull(config.getTextInputMethodQualifier(), builder);
- addIfNotNull(config.getNavigationStateQualifier(), builder);
- addIfNotNull(config.getNavigationMethodQualifier(), builder);
- addIfNotNull(config.getScreenDimensionQualifier(), builder);
- addIfNotNull(config.getVersionQualifier(), builder);
-
- return builder.build();
- }
-
- private static void addIfNotNull(
- ResourceQualifier qualifier, ImmutableList.Builder<String> builder) {
- if (qualifier != null) {
- builder.add(qualifier.getFolderSegment());
+ Builder<String> finalQualifiers = ImmutableList.<String>builder();
+ while (normalizedQualifiers.hasNext()) {
+ // The Mobile Country Code and Mobile Network Code will always come before the unhandled
+ // qualifiers.
+ if (normalizedQualifiers.peek() instanceof CountryCodeQualifier
+ || normalizedQualifiers.peek() instanceof NetworkCodeQualifier) {
+ finalQualifiers.add(QUALIFIER_TO_STRING.apply(normalizedQualifiers.next()));
+ } else {
+ // Exit the loop to add the rest of the qualifiers.
+ break;
+ }
}
+ finalQualifiers.addAll(unHandledLanguageRegionQualifiers);
+ // Consume the rest of the qualifers without care.
+ finalQualifiers.addAll(Iterators.transform(normalizedQualifiers, QUALIFIER_TO_STRING));
+ return finalQualifiers.build();
}
public static Factory from(List<String> qualifiers, String pkg) {
@@ -226,7 +202,7 @@ public class FullyQualifiedName implements DataKey, Comparable<FullyQualifiedNam
String parsedPackage = matcher.group("package");
ResourceType resourceType = ResourceType.getEnum(matcher.group("type"));
String resourceName = matcher.group("name");
-
+
if (resourceType == null || resourceName == null) {
throw new IllegalArgumentException(
String.format(
diff --git a/src/tools/android/java/com/google/devtools/build/android/ParsedAndroidData.java b/src/tools/android/java/com/google/devtools/build/android/ParsedAndroidData.java
index 4e78428b88..0ec40d8aa3 100644
--- a/src/tools/android/java/com/google/devtools/build/android/ParsedAndroidData.java
+++ b/src/tools/android/java/com/google/devtools/build/android/ParsedAndroidData.java
@@ -21,7 +21,6 @@ import com.google.common.collect.Iterables;
import com.google.devtools.build.android.xml.StyleableXmlResourceValue;
import com.android.ide.common.res2.MergingException;
-import com.android.resources.ResourceFolderType;
import java.io.IOException;
import java.nio.file.FileVisitOption;
@@ -38,7 +37,6 @@ import java.util.Map;
import java.util.Map.Entry;
import java.util.Objects;
import java.util.Set;
-import java.util.logging.Logger;
import javax.annotation.concurrent.Immutable;
import javax.annotation.concurrent.NotThreadSafe;
@@ -54,7 +52,6 @@ import javax.xml.stream.XMLStreamException;
*/
@Immutable
public class ParsedAndroidData {
- private static final Logger logger = Logger.getLogger(ParsedAndroidData.class.getCanonicalName());
@NotThreadSafe
static class Builder {
@@ -245,7 +242,7 @@ public class ParsedAndroidData {
private final KeyValueConsumer<DataKey, DataResource> overwritingConsumer;
private final KeyValueConsumer<DataKey, DataResource> combiningResources;
private final List<Exception> errors;
- private ResourceFolderType folderType;
+ private boolean inValuesSubtree;
private FullyQualifiedName.Factory fqnFactory;
private final XMLInputFactory xmlInputFactory = XMLInputFactory.newFactory();
@@ -279,28 +276,19 @@ public class ParsedAndroidData {
public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs)
throws IOException {
final String[] dirNameAndQualifiers = dir.getFileName().toString().split("-");
- folderType = ResourceFolderType.getTypeByName(dirNameAndQualifiers[0]);
- if (folderType == null) {
- return FileVisitResult.CONTINUE;
- }
- try {
- fqnFactory = FullyQualifiedName.Factory.fromDirectoryName(dirNameAndQualifiers);
- return FileVisitResult.CONTINUE;
- } catch (IllegalArgumentException e) {
- logger.warning(
- String.format("%s is an invalid resource directory due to %s", dir, e.getMessage()));
- return FileVisitResult.SKIP_SUBTREE;
- }
+ inValuesSubtree = "values".equals(dirNameAndQualifiers[0]);
+ fqnFactory = FullyQualifiedName.Factory.fromDirectoryName(dirNameAndQualifiers);
+ return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFile(Path path, BasicFileAttributes attrs) throws IOException {
try {
if (!Files.isDirectory(path) && !path.getFileName().toString().startsWith(".")) {
- if (folderType == ResourceFolderType.VALUES) {
+ if (inValuesSubtree) {
DataResourceXml.parse(
xmlInputFactory, path, fqnFactory, overwritingConsumer, combiningResources);
- } else if (folderType != null) {
+ } else {
String rawFqn = deriveRawFullyQualifiedName(path);
FullyQualifiedName key = fqnFactory.parse(rawFqn);
overwritingConsumer.consume(key, DataValueFile.of(path));