aboutsummaryrefslogtreecommitdiff
path: root/resources
diff options
context:
space:
mode:
authorChristian Williams <christianw@google.com>2017-11-07 13:10:00 -0800
committerChristian Williams <christianw@google.com>2017-11-07 13:10:00 -0800
commitede3fe4bd1dd8d637cd02e8b7a2086daea5c59d9 (patch)
tree8ea1fabea13a8bfaaacfa408f8cb15770a7fe6f2 /resources
parent3e9ceb7f2e72e9ea5cec79ba4c7c4930ee899174 (diff)
downloadrobolectric-shadows-ede3fe4bd1dd8d637cd02e8b7a2086daea5c59d9.tar.gz
Fix BCP 47 locale support.
Diffstat (limited to 'resources')
-rw-r--r--resources/src/main/java/org/robolectric/res/android/ConfigDescription.java5
-rw-r--r--resources/src/main/java/org/robolectric/res/android/ResTable_config.java33
2 files changed, 16 insertions, 22 deletions
diff --git a/resources/src/main/java/org/robolectric/res/android/ConfigDescription.java b/resources/src/main/java/org/robolectric/res/android/ConfigDescription.java
index 45aeee039..72f4f3a9a 100644
--- a/resources/src/main/java/org/robolectric/res/android/ConfigDescription.java
+++ b/resources/src/main/java/org/robolectric/res/android/ConfigDescription.java
@@ -93,10 +93,10 @@ public class ConfigDescription {
int initFromParts(PeekingIterator<String> iter) {
String part = iter.peek();
- if (part.indexOf(0) == 'b' && part.indexOf(1) == '+') {
+ if (part.startsWith("b+")) {
// This is a "modified" BCP 47 language tag. Same semantics as BCP 47 tags,
// except that the separator is "+" and not "-".
- String[] subtags = part.toLowerCase().split("\\+");
+ String[] subtags = part.substring(2).toLowerCase().split("\\+");
if (subtags.length == 1) {
set_language(subtags[0]);
} else if (subtags.length == 2) {
@@ -689,6 +689,7 @@ public class ConfigDescription {
return true;
}
+ // check that we have 'dpi' after the last digit.
Matcher matcher = DENSITY_PATTERN.matcher(name);
if (matcher.matches()) {
out.density = Integer.parseInt(matcher.group(1));
diff --git a/resources/src/main/java/org/robolectric/res/android/ResTable_config.java b/resources/src/main/java/org/robolectric/res/android/ResTable_config.java
index 91ea4fa10..d949cee7a 100644
--- a/resources/src/main/java/org/robolectric/res/android/ResTable_config.java
+++ b/resources/src/main/java/org/robolectric/res/android/ResTable_config.java
@@ -615,37 +615,30 @@ public class ResTable_config {
return new String(value, US_ASCII);
}
- /* static */ void packLanguageOrRegion(final byte[] in, final byte base,
- final byte out[]) {
- if (in.length < 3 || in[2] == 0 || in[2] == '-') {
- out[0] = in[0];
- out[1] = in[1];
+ /* static */ void packLanguageOrRegion(final String in, final byte base,
+ final byte[] out) {
+ if (in == null) {
+ out[0] = 0;
+ out[1] = 0;
+ } else if (in.length() < 3 || in.charAt(2) == 0 || in.charAt(2) == '-') {
+ out[0] = (byte) in.charAt(0);
+ out[1] = (byte) in.charAt(1);
} else {
- byte first = (byte) ((in[0] - base) & 0x007f);
- byte second = (byte) ((in[1] - base) & 0x007f);
- byte third = (byte) ((in[2] - base) & 0x007f);
+ byte first = (byte) ((in.charAt(0) - base) & 0x007f);
+ byte second = (byte) ((in.charAt(1) - base) & 0x007f);
+ byte third = (byte) ((in.charAt(2) - base) & 0x007f);
out[0] = (byte) (0x80 | (third << 2) | (second >> 3));
out[1] = (byte) ((second << 5) | first);
}
}
- void packLanguage(final byte[] language) {
- packLanguageOrRegion(language, (byte) 'a', this.language);
- }
-
void packLanguage(final String language) {
- byte[] bytes = language == null ? new byte[2] : language.getBytes();
- packLanguageOrRegion(bytes, (byte) 'a', this.language);
- }
-
- void packRegion(final byte[] region) {
- packLanguageOrRegion(region, (byte) '0', this.country);
+ packLanguageOrRegion(language, (byte) 'a', this.language);
}
void packRegion(final String region) {
- byte[] bytes = region == null ? new byte[2] : region.getBytes();
- packLanguageOrRegion(bytes, (byte) '0', this.country);
+ packLanguageOrRegion(region, (byte) '0', this.country);
}
private String unpackLanguage() {