aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTor Norbye <tnorbye@google.com>2012-01-06 09:29:25 -0800
committerTor Norbye <tnorbye@google.com>2012-01-06 09:29:25 -0800
commit18bce12c5916331971b2e8108f8485cc56b696d3 (patch)
tree2c634dc2e09bf68bfe21faa0674c208e62017c71
parent9f338c0725644f84597366c1e4acb680a72b3f00 (diff)
downloadsdk-18bce12c5916331971b2e8108f8485cc56b696d3.zip
sdk-18bce12c5916331971b2e8108f8485cc56b696d3.tar.gz
sdk-18bce12c5916331971b2e8108f8485cc56b696d3.tar.bz2
Fix locale handling of uppercase/lowercase
This changeset fixes issue 23747: i and İ character problem in turkish operating Systems... and probably many other bugs in the Turkish locale. Basically, we had a lot of String.toLowerCase() and String.toUpperCase() calls. This performs locale sensitive conversions, which in many cases is NOT what we want; for "machine readable" conversions we should be using Locale.US which performs no special cases. For more, see http://developer.android.com/reference/java/util/Locale.html#default_locale Change-Id: I996b0e70fb377e8dae484c5811deb8bc9afb684c
-rw-r--r--ddms/libs/ddmlib/src/com/android/ddmlib/AllocationInfo.java13
-rw-r--r--ddms/libs/ddmlib/src/com/android/ddmlib/EmulatorConsole.java4
-rw-r--r--ddms/libs/ddmlib/src/com/android/ddmlib/log/EventContainer.java65
-rw-r--r--ddms/libs/ddmlib/src/com/android/ddmlib/log/EventValueDescription.java32
-rw-r--r--ddms/libs/ddmuilib/src/com/android/ddmuilib/AllocationPanel.java8
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/BaseViewRule.java12
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/resources/platform/AttrsXmlParser.java3
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/descriptors/DescriptorsUtils.java13
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/DomUtilities.java16
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gre/ViewMetadataRepository.java3
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/ExtractIncludeRefactoring.java6
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/VisualRefactoring.java3
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/ui/tree/NewItemSelectionDialog.java5
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/uimodel/UiElementNode.java3
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/project/ExportHelper.java3
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/refactorings/extractstring/ExtractStringInputPage.java3
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/ui/ResourceChooser.java3
-rw-r--r--ide_common/src/com/android/ide/common/resources/configuration/LanguageQualifier.java3
-rw-r--r--ide_common/src/com/android/ide/common/resources/configuration/RegionQualifier.java4
-rw-r--r--lint/libs/lint_api/src/com/android/tools/lint/client/api/DefaultConfiguration.java4
-rwxr-xr-xsdkmanager/libs/sdklib/src/com/android/sdklib/SystemImage.java3
-rwxr-xr-xsdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/AddonPackage.java3
-rwxr-xr-xsdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/Archive.java5
-rwxr-xr-xsdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/SystemImagePackage.java3
-rw-r--r--sdkmanager/libs/sdklib/src/com/android/sdklib/xml/AndroidManifestParser.java3
-rwxr-xr-xsdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/ImageFactory.java3
26 files changed, 136 insertions, 90 deletions
diff --git a/ddms/libs/ddmlib/src/com/android/ddmlib/AllocationInfo.java b/ddms/libs/ddmlib/src/com/android/ddmlib/AllocationInfo.java
index a68962f..157b044 100644
--- a/ddms/libs/ddmlib/src/com/android/ddmlib/AllocationInfo.java
+++ b/ddms/libs/ddmlib/src/com/android/ddmlib/AllocationInfo.java
@@ -17,6 +17,7 @@
package com.android.ddmlib;
import java.util.Comparator;
+import java.util.Locale;
/**
* Holds an Allocation information.
@@ -185,8 +186,12 @@ public class AllocationInfo implements IStackTraceInfo {
return null;
}
- public boolean filter(String filter, boolean fullTrace) {
- if (mAllocatedClass.toLowerCase().contains(filter)) {
+ /**
+ * Returns true if the given filter matches case insensitively (according to
+ * the given locale) this allocation info.
+ */
+ public boolean filter(String filter, boolean fullTrace, Locale locale) {
+ if (mAllocatedClass.toLowerCase(locale).contains(filter)) {
return true;
}
@@ -195,11 +200,11 @@ public class AllocationInfo implements IStackTraceInfo {
final int length = fullTrace ? mStackTrace.length : 1;
for (int i = 0 ; i < length ; i++) {
- if (mStackTrace[i].getClassName().toLowerCase().contains(filter)) {
+ if (mStackTrace[i].getClassName().toLowerCase(locale).contains(filter)) {
return true;
}
- if (mStackTrace[i].getMethodName().toLowerCase().contains(filter)) {
+ if (mStackTrace[i].getMethodName().toLowerCase(locale).contains(filter)) {
return true;
}
}
diff --git a/ddms/libs/ddmlib/src/com/android/ddmlib/EmulatorConsole.java b/ddms/libs/ddmlib/src/com/android/ddmlib/EmulatorConsole.java
index d34f203..f3ab28c 100644
--- a/ddms/libs/ddmlib/src/com/android/ddmlib/EmulatorConsole.java
+++ b/ddms/libs/ddmlib/src/com/android/ddmlib/EmulatorConsole.java
@@ -419,7 +419,7 @@ public final class EmulatorConsole {
String value = m.group(1);
// get the index from the list
- status.voice = GsmMode.getEnum(value.toLowerCase());
+ status.voice = GsmMode.getEnum(value.toLowerCase(Locale.US));
// move on to next line.
continue;
@@ -431,7 +431,7 @@ public final class EmulatorConsole {
String value = m.group(1);
// get the index from the list
- status.data = GsmMode.getEnum(value.toLowerCase());
+ status.data = GsmMode.getEnum(value.toLowerCase(Locale.US));
// move on to next line.
continue;
diff --git a/ddms/libs/ddmlib/src/com/android/ddmlib/log/EventContainer.java b/ddms/libs/ddmlib/src/com/android/ddmlib/log/EventContainer.java
index ec9186c..0afdf5d 100644
--- a/ddms/libs/ddmlib/src/com/android/ddmlib/log/EventContainer.java
+++ b/ddms/libs/ddmlib/src/com/android/ddmlib/log/EventContainer.java
@@ -18,6 +18,7 @@ package com.android.ddmlib.log;
import com.android.ddmlib.log.LogReceiver.LogEntry;
+import java.util.Locale;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@@ -25,7 +26,7 @@ import java.util.regex.Pattern;
* Represents an event and its data.
*/
public class EventContainer {
-
+
/**
* Comparison method for {@link EventContainer#testValue(int, Object, com.android.ddmlib.log.EventContainer.CompareMethod)}
*
@@ -37,7 +38,7 @@ public class EventContainer {
GREATER_THAN("greater than or equals to", ">="),
GREATER_THAN_STRICT("greater than", ">"),
BIT_CHECK("bit check", "&");
-
+
private final String mName;
private final String mTestString;
@@ -62,7 +63,7 @@ public class EventContainer {
}
}
-
+
/**
* Type for event data.
*/
@@ -73,11 +74,11 @@ public class EventContainer {
STRING(3),
LIST(4),
TREE(5);
-
+
private final static Pattern STORAGE_PATTERN = Pattern.compile("^(\\d+)@(.*)$"); //$NON-NLS-1$
-
+
private int mValue;
-
+
/**
* Returns a {@link EventValueType} from an integer value, or <code>null</code> if no match
* was found.
@@ -89,7 +90,7 @@ public class EventContainer {
return type;
}
}
-
+
return null;
}
@@ -106,16 +107,16 @@ public class EventContainer {
*/
public static String getStorageString(Object object) {
if (object instanceof String) {
- return STRING.mValue + "@" + (String)object; //$NON-NLS-1$
+ return STRING.mValue + "@" + (String)object; //$NON-NLS-1$
} else if (object instanceof Integer) {
- return INT.mValue + "@" + object.toString(); //$NON-NLS-1$
+ return INT.mValue + "@" + object.toString(); //$NON-NLS-1$
} else if (object instanceof Long) {
- return LONG.mValue + "@" + object.toString(); //$NON-NLS-1$
+ return LONG.mValue + "@" + object.toString(); //$NON-NLS-1$
}
-
+
return null;
}
-
+
/**
* Creates an {@link Object} from a storage string created with
* {@link #getStorageString(Object)}.
@@ -131,7 +132,7 @@ public class EventContainer {
if (type == null) {
return null;
}
-
+
switch (type) {
case STRING:
return m.group(2);
@@ -144,11 +145,11 @@ public class EventContainer {
return null;
}
}
-
+
return null;
}
-
-
+
+
/**
* Returns the integer value of the enum.
*/
@@ -158,7 +159,7 @@ public class EventContainer {
@Override
public String toString() {
- return super.toString().toLowerCase();
+ return super.toString().toLowerCase(Locale.US);
}
private EventValueType(int value) {
@@ -172,7 +173,7 @@ public class EventContainer {
public int sec; /* seconds since Epoch */
public int nsec; /* nanoseconds */
- private Object mData;
+ private Object mData;
/**
* Creates an {@link EventContainer} from a {@link LogEntry}.
@@ -190,7 +191,7 @@ public class EventContainer {
sec = entry.sec;
nsec = entry.nsec;
}
-
+
/**
* Creates an {@link EventContainer} with raw data
*/
@@ -198,7 +199,7 @@ public class EventContainer {
getType(data);
mTag = tag;
mData = data;
-
+
this.pid = pid;
this.tid = tid;
this.sec = sec;
@@ -217,10 +218,10 @@ public class EventContainer {
throw new InvalidTypeException();
}
-
+
/**
* Returns the data as a long.
- * @throws InvalidTypeException if the data type is not {@link EventValueType#LONG}.
+ * @throws InvalidTypeException if the data type is not {@link EventValueType#LONG}.
* @see #getType()
*/
public final Long getLong() throws InvalidTypeException {
@@ -243,7 +244,7 @@ public class EventContainer {
throw new InvalidTypeException();
}
-
+
/**
* Returns a value by index. The return type is defined by its type.
* @param valueIndex the index of the value. If the data is not a list, this is ignored.
@@ -277,7 +278,7 @@ public class EventContainer {
public String getValueAsString(int valueIndex) throws InvalidTypeException {
return getValueAsString(mData, valueIndex, true);
}
-
+
/**
* Returns the type of the data.
*/
@@ -309,7 +310,7 @@ public class EventContainer {
return EventValueType.UNKNOWN;
}
-
+
/**
* Checks that the <code>index</code>-th value of this event against a provided value.
* @param index the index of the value to test
@@ -326,7 +327,7 @@ public class EventContainer {
if (index > 0 && type != EventValueType.LIST) {
throw new InvalidTypeException();
}
-
+
Object data = mData;
if (type == EventValueType.LIST) {
data = ((Object[])mData)[index];
@@ -388,10 +389,10 @@ public class EventContainer {
throw new InvalidTypeException();
}
}
-
+
private final Object getValue(Object data, int valueIndex, boolean recursive) {
EventValueType type = getType(data);
-
+
switch (type) {
case INT:
case LONG:
@@ -405,14 +406,14 @@ public class EventContainer {
}
}
}
-
+
return null;
}
private final double getValueAsDouble(Object data, int valueIndex, boolean recursive)
throws InvalidTypeException {
EventValueType type = getType(data);
-
+
switch (type) {
case INT:
return ((Integer)data).doubleValue();
@@ -428,14 +429,14 @@ public class EventContainer {
}
}
}
-
+
throw new InvalidTypeException();
}
private final String getValueAsString(Object data, int valueIndex, boolean recursive)
throws InvalidTypeException {
EventValueType type = getType(data);
-
+
switch (type) {
case INT:
return ((Integer)data).toString();
diff --git a/ddms/libs/ddmlib/src/com/android/ddmlib/log/EventValueDescription.java b/ddms/libs/ddmlib/src/com/android/ddmlib/log/EventValueDescription.java
index b68b4e8..58d147c 100644
--- a/ddms/libs/ddmlib/src/com/android/ddmlib/log/EventValueDescription.java
+++ b/ddms/libs/ddmlib/src/com/android/ddmlib/log/EventValueDescription.java
@@ -18,6 +18,8 @@ package com.android.ddmlib.log;
import com.android.ddmlib.log.EventContainer.EventValueType;
+import java.util.Locale;
+
/**
* Describes an {@link EventContainer} value.
@@ -28,13 +30,13 @@ import com.android.ddmlib.log.EventContainer.EventValueType;
* The index of the value is not contained within this class, and is instead dependent on the
* index of this particular object in the array of {@link EventValueDescription} returned by
* {@link EventLogParser#getEventInfoMap()} when queried for a particular event tag.
- *
+ *
*/
public final class EventValueDescription {
-
+
/**
* Represents the type of a numerical value. This is used to display values of vastly different
- * type/range in graphs.
+ * type/range in graphs.
*/
public static enum ValueType {
NOT_APPLICABLE(0),
@@ -80,21 +82,21 @@ public final class EventValueDescription {
public int getValue() {
return mValue;
}
-
+
@Override
public String toString() {
- return super.toString().toLowerCase();
+ return super.toString().toLowerCase(Locale.US);
}
-
+
private ValueType(int value) {
mValue = value;
}
}
-
+
private String mName;
private EventValueType mEventValueType;
private ValueType mValueType;
-
+
/**
* Builds a {@link EventValueDescription} with a name and a type.
* <p/>
@@ -121,7 +123,7 @@ public final class EventValueDescription {
* @param type
* @param valueType
* @throws InvalidValueTypeException if type and valuetype are not compatible.
- *
+ *
*/
EventValueDescription(String name, EventValueType type, ValueType valueType)
throws InvalidValueTypeException {
@@ -130,7 +132,7 @@ public final class EventValueDescription {
mValueType = valueType;
mValueType.checkType(mEventValueType);
}
-
+
/**
* @return the Name.
*/
@@ -151,14 +153,14 @@ public final class EventValueDescription {
public ValueType getValueType() {
return mValueType;
}
-
+
@Override
public String toString() {
if (mValueType != ValueType.NOT_APPLICABLE) {
return String.format("%1$s (%2$s, %3$s)", mName, mEventValueType.toString(),
mValueType.toString());
}
-
+
return String.format("%1$s (%2$s)", mName, mEventValueType.toString());
}
@@ -178,10 +180,10 @@ public final class EventValueDescription {
case LIST:
return value instanceof Object[];
}
-
+
return false;
}
-
+
/**
* Returns an object of a valid type (based on the value returned by
* {@link #getEventValueType()}) from a String value.
@@ -208,7 +210,7 @@ public final class EventValueDescription {
case STRING:
return value;
}
-
+
return null;
}
}
diff --git a/ddms/libs/ddmuilib/src/com/android/ddmuilib/AllocationPanel.java b/ddms/libs/ddmuilib/src/com/android/ddmuilib/AllocationPanel.java
index 3214da2..23775e8 100644
--- a/ddms/libs/ddmuilib/src/com/android/ddmuilib/AllocationPanel.java
+++ b/ddms/libs/ddmuilib/src/com/android/ddmuilib/AllocationPanel.java
@@ -61,6 +61,7 @@ import org.eclipse.swt.widgets.Text;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.Locale;
/**
* Base class for our information panels.
@@ -643,12 +644,13 @@ public class AllocationPanel extends TablePanel {
private AllocationInfo[] getFilteredAllocations(AllocationInfo[] allocations,
String filterText) {
ArrayList<AllocationInfo> results = new ArrayList<AllocationInfo>();
-
- filterText = filterText.toLowerCase();
+ // Using default locale here such that the locale-specific c
+ Locale locale = Locale.getDefault();
+ filterText = filterText.toLowerCase(locale);
boolean fullTrace = mTraceFilterCheck.getSelection();
for (AllocationInfo info : allocations) {
- if (info.filter(filterText, fullTrace)) {
+ if (info.filter(filterText, fullTrace, locale)) {
results.add(info);
}
}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/BaseViewRule.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/BaseViewRule.java
index 6e5b287..17726d0 100644
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/BaseViewRule.java
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/BaseViewRule.java
@@ -28,8 +28,10 @@ import static com.android.ide.common.layout.LayoutConstants.ATTR_TEXT;
import static com.android.ide.common.layout.LayoutConstants.DOT_LAYOUT_PARAMS;
import static com.android.ide.common.layout.LayoutConstants.ID_PREFIX;
import static com.android.ide.common.layout.LayoutConstants.NEW_ID_PREFIX;
+import static com.android.ide.common.layout.LayoutConstants.VALUE_FALSE;
import static com.android.ide.common.layout.LayoutConstants.VALUE_FILL_PARENT;
import static com.android.ide.common.layout.LayoutConstants.VALUE_MATCH_PARENT;
+import static com.android.ide.common.layout.LayoutConstants.VALUE_TRUE;
import static com.android.ide.common.layout.LayoutConstants.VALUE_WRAP_CONTENT;
import static com.android.ide.eclipse.adt.internal.editors.layout.descriptors.LayoutDescriptors.VIEW_FRAGMENT;
@@ -59,6 +61,7 @@ import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
+import java.util.Locale;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
@@ -644,11 +647,12 @@ public class BaseViewRule extends AbstractViewRule {
// Toggles are handled as a multiple-choice between true, false
// and nothing (clear)
String value = selectedNode.getStringAttr(ANDROID_URI, id);
- if (value != null)
- value = value.toLowerCase();
- if ("true".equals(value)) { //$NON-NLS-1$
+ if (value != null) {
+ value = value.toLowerCase(Locale.US);
+ }
+ if (VALUE_TRUE.equals(value)) {
value = TRUE_ID;
- } else if ("false".equals(value)) { //$NON-NLS-1$
+ } else if (VALUE_FALSE.equals(value)) {
value = FALSE_ID;
} else {
value = CLEAR_ID;
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/resources/platform/AttrsXmlParser.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/resources/platform/AttrsXmlParser.java
index ed2fb75..abe56d8 100644
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/resources/platform/AttrsXmlParser.java
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/resources/platform/AttrsXmlParser.java
@@ -31,6 +31,7 @@ import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
+import java.util.Locale;
import java.util.Map;
import java.util.Map.Entry;
import java.util.TreeSet;
@@ -475,7 +476,7 @@ public final class AttrsXmlParser {
if (attrFormat != null) {
for (String f : attrFormat.getNodeValue().split("\\|")) { //$NON-NLS-1$
try {
- Format format = AttributeInfo.Format.valueOf(f.toUpperCase());
+ Format format = AttributeInfo.Format.valueOf(f.toUpperCase(Locale.US));
// enum and flags are handled differently right below
if (format != null &&
format != AttributeInfo.Format.ENUM &&
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/descriptors/DescriptorsUtils.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/descriptors/DescriptorsUtils.java
index 4693a1e..30c7687 100644
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/descriptors/DescriptorsUtils.java
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/descriptors/DescriptorsUtils.java
@@ -52,6 +52,7 @@ import org.eclipse.swt.graphics.Image;
import java.util.ArrayList;
import java.util.HashSet;
+import java.util.Locale;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
@@ -182,7 +183,7 @@ public final class DescriptorsUtils {
Format f = formats_list[i];
formats_set.add(f);
- sb.append(f.toString().toLowerCase());
+ sb.append(f.toString().toLowerCase(Locale.US));
if (i < flen - 1) {
sb.append(", "); //$NON-NLS-1$
}
@@ -862,10 +863,13 @@ public final class DescriptorsUtils {
prefix = Character.toLowerCase(prefix.charAt(0)) + prefix.substring(1);
}
+ // Note that we perform locale-independent lowercase checks; in "Image" we
+ // want the lowercase version to be "image", not "?mage" where ? is
+ // the char LATIN SMALL LETTER DOTLESS I.
do {
num++;
generated = String.format("%1$s%2$d", prefix, num); //$NON-NLS-1$
- } while (map.contains(generated.toLowerCase()));
+ } while (map.contains(generated.toLowerCase(Locale.US)));
params[0] = prefix;
params[1] = num;
@@ -876,12 +880,13 @@ public final class DescriptorsUtils {
if (id != null) {
id = id.replace(NEW_ID_PREFIX, ""); //$NON-NLS-1$
id = id.replace(ID_PREFIX, ""); //$NON-NLS-1$
- if (map.add(id.toLowerCase()) && map.contains(generated.toLowerCase())) {
+ if (map.add(id.toLowerCase(Locale.US))
+ && map.contains(generated.toLowerCase(Locale.US))) {
do {
num++;
generated = String.format("%1$s%2$d", prefix, num); //$NON-NLS-1$
- } while (map.contains(generated.toLowerCase()));
+ } while (map.contains(generated.toLowerCase(Locale.US)));
params[1] = num;
params[2] = generated;
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/DomUtilities.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/DomUtilities.java
index 0d0644f..8725fa4 100644
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/DomUtilities.java
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/DomUtilities.java
@@ -49,6 +49,7 @@ import java.util.Collections;
import java.util.Comparator;
import java.util.HashSet;
import java.util.List;
+import java.util.Locale;
import java.util.Set;
import javax.xml.parsers.DocumentBuilder;
@@ -467,11 +468,12 @@ public class DomUtilities {
if (root.hasAttributeNS(ANDROID_URI, ATTR_ID)) {
String id = root.getAttributeNS(ANDROID_URI, ATTR_ID);
if (id.startsWith(NEW_ID_PREFIX)) {
- seen.add(id.substring(NEW_ID_PREFIX.length()).toLowerCase());
+ // See getFreeWidgetId for details on locale
+ seen.add(id.substring(NEW_ID_PREFIX.length()).toLowerCase(Locale.US));
} else if (id.startsWith(ID_PREFIX)) {
- seen.add(id.substring(ID_PREFIX.length()).toLowerCase());
+ seen.add(id.substring(ID_PREFIX.length()).toLowerCase(Locale.US));
} else {
- seen.add(id.toLowerCase());
+ seen.add(id.toLowerCase(Locale.US));
}
}
}
@@ -492,7 +494,11 @@ public class DomUtilities {
Set<String> ids = new HashSet<String>();
if (reserved != null) {
for (String id : reserved) {
- ids.add(id.toLowerCase());
+ // Note that we perform locale-independent lowercase checks; in "Image" we
+ // want the lowercase version to be "image", not "?mage" where ? is
+ // the char LATIN SMALL LETTER DOTLESS I.
+
+ ids.add(id.toLowerCase(Locale.US));
}
}
addLowercaseIds(element.getOwnerDocument().getDocumentElement(), ids);
@@ -504,7 +510,7 @@ public class DomUtilities {
int num = 1;
do {
generated = String.format("%1$s%2$d", prefix, num++); //$NON-NLS-1$
- } while (ids.contains(generated.toLowerCase()));
+ } while (ids.contains(generated.toLowerCase(Locale.US)));
return generated;
}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gre/ViewMetadataRepository.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gre/ViewMetadataRepository.java
index 665a923..4096ffe 100644
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gre/ViewMetadataRepository.java
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gre/ViewMetadataRepository.java
@@ -51,6 +51,7 @@ import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
+import java.util.Locale;
import java.util.Map;
import java.util.Set;
@@ -208,7 +209,7 @@ public class ViewMetadataRepository {
Document document = builder.parse(is);
Map<String, FillPreference> fillTypes = new HashMap<String, FillPreference>();
for (FillPreference pref : FillPreference.values()) {
- fillTypes.put(pref.toString().toLowerCase(), pref);
+ fillTypes.put(pref.toString().toLowerCase(Locale.US), pref);
}
NodeList categoryNodes = document.getDocumentElement().getChildNodes();
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/ExtractIncludeRefactoring.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/ExtractIncludeRefactoring.java
index 2e69501..039bec5 100644
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/ExtractIncludeRefactoring.java
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/ExtractIncludeRefactoring.java
@@ -89,6 +89,7 @@ import org.w3c.dom.Node;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
+import java.util.Locale;
import java.util.Map;
/**
@@ -423,8 +424,9 @@ public class ExtractIncludeRefactoring extends VisualRefactoring {
// id null check for https://bugs.eclipse.org/bugs/show_bug.cgi?id=272378
if (id != null && (id.startsWith(ID_PREFIX) || id.startsWith(NEW_ID_PREFIX))) {
// Use everything following the id/, and make it lowercase since that is
- // the convention for layouts
- defaultName = id.substring(id.indexOf('/') + 1).toLowerCase();
+ // the convention for layouts (and use Locale.US to ensure that "Image" becomes
+ // "image" etc)
+ defaultName = id.substring(id.indexOf('/') + 1).toLowerCase(Locale.US);
IInputValidator validator = ResourceNameValidator.create(true, mProject, LAYOUT);
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/VisualRefactoring.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/VisualRefactoring.java
index 24140ef..315936d 100644
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/VisualRefactoring.java
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/VisualRefactoring.java
@@ -95,6 +95,7 @@ import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
+import java.util.Locale;
import java.util.Map;
import java.util.Set;
@@ -853,7 +854,7 @@ public abstract class VisualRefactoring extends Refactoring {
String oldTypeBase = oldType.substring(oldType.lastIndexOf('.') + 1);
String id = getId(element);
if (id == null || id.length() == 0
- || id.toLowerCase().contains(oldTypeBase.toLowerCase())) {
+ || id.toLowerCase(Locale.US).contains(oldTypeBase.toLowerCase(Locale.US))) {
String newTypeBase = newType.substring(newType.lastIndexOf('.') + 1);
return ensureHasId(rootEdit, element, newTypeBase);
}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/ui/tree/NewItemSelectionDialog.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/ui/tree/NewItemSelectionDialog.java
index 1187f5c..d880f3d 100644
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/ui/tree/NewItemSelectionDialog.java
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/ui/tree/NewItemSelectionDialog.java
@@ -40,6 +40,7 @@ import org.eclipse.ui.part.FileEditorInput;
import java.util.Arrays;
import java.util.HashMap;
+import java.util.Locale;
import java.util.Map;
import java.util.Map.Entry;
import java.util.TreeMap;
@@ -300,7 +301,7 @@ public class NewItemSelectionDialog extends AbstractElementListSelectionDialog {
String name = mInitialXmlName;
boolean partial = name.startsWith("*"); //$NON-NLS-1$
if (partial) {
- name = name.substring(1).toLowerCase();
+ name = name.substring(1).toLowerCase(Locale.US);
}
for (ElementDescriptor desc : getAllowedDescriptors(rootNode)) {
@@ -308,7 +309,7 @@ public class NewItemSelectionDialog extends AbstractElementListSelectionDialog {
initialElement = desc;
break;
} else if (partial) {
- String name2 = desc.getXmlLocalName().toLowerCase();
+ String name2 = desc.getXmlLocalName().toLowerCase(Locale.US);
if (name.startsWith(name2) || name2.startsWith(name)) {
initialElement = desc;
break;
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/uimodel/UiElementNode.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/uimodel/UiElementNode.java
index cab6601..7cf9151 100644
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/uimodel/UiElementNode.java
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/uimodel/UiElementNode.java
@@ -64,6 +64,7 @@ import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
+import java.util.Locale;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
@@ -310,7 +311,7 @@ public class UiElementNode implements IPropertySource {
if (attr != null) {
// Don't append the two when it's a repeat, e.g. Button01 (Button),
// only when the ui name is not part of the attribute
- if (attr.toLowerCase().indexOf(uiName.toLowerCase()) == -1) {
+ if (attr.toLowerCase(Locale.US).indexOf(uiName.toLowerCase(Locale.US)) == -1) {
styledString.append(attr);
styledString.append(String.format(" (%1$s)", uiName),
StyledString.DECORATIONS_STYLER);
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/project/ExportHelper.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/project/ExportHelper.java
index fa97b59..1e5171c 100644
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/project/ExportHelper.java
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/project/ExportHelper.java
@@ -18,6 +18,7 @@ package com.android.ide.eclipse.adt.internal.project;
import com.android.ide.eclipse.adt.AdtConstants;
import com.android.ide.eclipse.adt.AdtPlugin;
+import com.android.ide.eclipse.adt.AdtUtils;
import com.android.ide.eclipse.adt.AndroidPrintStream;
import com.android.ide.eclipse.adt.internal.build.BuildHelper;
import com.android.ide.eclipse.adt.internal.build.DexException;
@@ -336,7 +337,7 @@ public final class ExportHelper {
} else if (file.isFile()) {
// check the extension
String name = file.getName();
- if (name.toLowerCase().endsWith(AdtConstants.DOT_CLASS) == false) {
+ if (!AdtUtils.endsWith(name, AdtConstants.DOT_CLASS)) {
return;
}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/refactorings/extractstring/ExtractStringInputPage.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/refactorings/extractstring/ExtractStringInputPage.java
index ff3f5f6..f94b20a 100644
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/refactorings/extractstring/ExtractStringInputPage.java
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/refactorings/extractstring/ExtractStringInputPage.java
@@ -47,6 +47,7 @@ import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import java.util.HashMap;
+import java.util.Locale;
import java.util.Map;
import java.util.TreeSet;
import java.util.regex.Matcher;
@@ -294,7 +295,7 @@ class ExtractStringInputPage extends UserInputWizardPage {
}
// make lower case
- text = text.toLowerCase();
+ text = text.toLowerCase(Locale.US);
// everything not alphanumeric becomes an underscore
text = text.replaceAll("[^a-zA-Z0-9]+", "_"); //$NON-NLS-1$ //$NON-NLS-2$
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/ui/ResourceChooser.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/ui/ResourceChooser.java
index b424435..263cc2d 100644
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/ui/ResourceChooser.java
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/ui/ResourceChooser.java
@@ -70,6 +70,7 @@ import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
+import java.util.Locale;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@@ -153,7 +154,7 @@ public class ResourceChooser extends AbstractElementListSelectionDialog implemen
setTitle("Resource Chooser");
setMessage(String.format("Choose a %1$s resource",
- mResourceType.getDisplayName().toLowerCase()));
+ mResourceType.getDisplayName().toLowerCase(Locale.US)));
}
/**
diff --git a/ide_common/src/com/android/ide/common/resources/configuration/LanguageQualifier.java b/ide_common/src/com/android/ide/common/resources/configuration/LanguageQualifier.java
index ff18bdc..972a50f 100644
--- a/ide_common/src/com/android/ide/common/resources/configuration/LanguageQualifier.java
+++ b/ide_common/src/com/android/ide/common/resources/configuration/LanguageQualifier.java
@@ -16,6 +16,7 @@
package com.android.ide.common.resources.configuration;
+import java.util.Locale;
import java.util.regex.Pattern;
/**
@@ -51,7 +52,7 @@ public final class LanguageQualifier extends ResourceQualifier {
* @param value the value of the qualifier, as returned by {@link #getValue()}.
*/
public static String getFolderSegment(String value) {
- String segment = value.toLowerCase();
+ String segment = value.toLowerCase(Locale.US);
if (sLanguagePattern.matcher(segment).matches()) {
return segment;
}
diff --git a/ide_common/src/com/android/ide/common/resources/configuration/RegionQualifier.java b/ide_common/src/com/android/ide/common/resources/configuration/RegionQualifier.java
index 7e8ca9a..2b9c29e 100644
--- a/ide_common/src/com/android/ide/common/resources/configuration/RegionQualifier.java
+++ b/ide_common/src/com/android/ide/common/resources/configuration/RegionQualifier.java
@@ -16,6 +16,7 @@
package com.android.ide.common.resources.configuration;
+import java.util.Locale;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@@ -54,7 +55,8 @@ public final class RegionQualifier extends ResourceQualifier {
*/
public static String getFolderSegment(String value) {
if (value != null) {
- String segment = "r" + value.toUpperCase(); //$NON-NLS-1$
+ // See http://developer.android.com/reference/java/util/Locale.html#default_locale
+ String segment = "r" + value.toUpperCase(Locale.US); //$NON-NLS-1$
if (sRegionPattern.matcher(segment).matches()) {
return segment;
}
diff --git a/lint/libs/lint_api/src/com/android/tools/lint/client/api/DefaultConfiguration.java b/lint/libs/lint_api/src/com/android/tools/lint/client/api/DefaultConfiguration.java
index 1f3d9e9..3622a73 100644
--- a/lint/libs/lint_api/src/com/android/tools/lint/client/api/DefaultConfiguration.java
+++ b/lint/libs/lint_api/src/com/android/tools/lint/client/api/DefaultConfiguration.java
@@ -42,6 +42,7 @@ import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
+import java.util.Locale;
import java.util.Map;
import java.util.Set;
@@ -279,7 +280,8 @@ public class DefaultConfiguration extends Configuration {
writeAttribute(writer, ATTR_ID, id);
Severity severity = mSeverity.get(id);
if (severity != null) {
- writeAttribute(writer, ATTR_SEVERITY, severity.name().toLowerCase());
+ writeAttribute(writer, ATTR_SEVERITY,
+ severity.name().toLowerCase(Locale.US));
}
List<String> paths = mSuppressed.get(id);
diff --git a/sdkmanager/libs/sdklib/src/com/android/sdklib/SystemImage.java b/sdkmanager/libs/sdklib/src/com/android/sdklib/SystemImage.java
index 422ae90..c4957e0 100755
--- a/sdkmanager/libs/sdklib/src/com/android/sdklib/SystemImage.java
+++ b/sdkmanager/libs/sdklib/src/com/android/sdklib/SystemImage.java
@@ -19,6 +19,7 @@ package com.android.sdklib;
import com.android.sdklib.io.FileOp;
import java.io.File;
+import java.util.Locale;
/**
@@ -158,7 +159,7 @@ public class SystemImage implements ISystemImage {
public String toString() {
return String.format("SystemImage ABI=%s, location %s='%s'", //$NON-NLS-1$
mAbiType,
- mLocationtype.toString().replace('_', ' ').toLowerCase(),
+ mLocationtype.toString().replace('_', ' ').toLowerCase(Locale.US),
mLocation
);
}
diff --git a/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/AddonPackage.java b/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/AddonPackage.java
index 09bf3c9..6ce1118 100755
--- a/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/AddonPackage.java
+++ b/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/AddonPackage.java
@@ -34,6 +34,7 @@ import org.w3c.dom.Node;
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.Locale;
import java.util.Map;
import java.util.Properties;
@@ -421,7 +422,7 @@ public class AddonPackage extends Package
private String encodeAddonName() {
String name = String.format("addon-%s-%s-%s", //$NON-NLS-1$
getName(), getVendor(), mVersion.getApiString());
- name = name.toLowerCase();
+ name = name.toLowerCase(Locale.US);
name = name.replaceAll("[^a-z0-9_-]+", "_"); //$NON-NLS-1$ //$NON-NLS-2$
name = name.replaceAll("_+", "_"); //$NON-NLS-1$ //$NON-NLS-2$
return name;
diff --git a/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/Archive.java b/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/Archive.java
index 52d9221..4fa7c38 100755
--- a/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/Archive.java
+++ b/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/Archive.java
@@ -23,6 +23,7 @@ import com.android.sdklib.io.FileOp;
import java.io.File;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
+import java.util.Locale;
import java.util.Properties;
@@ -88,7 +89,7 @@ public class Archive implements IDescription, Comparable<Archive> {
/** Returns the XML name of the OS. */
public String getXmlName() {
- return toString().toLowerCase();
+ return toString().toLowerCase(Locale.US);
}
/**
@@ -140,7 +141,7 @@ public class Archive implements IDescription, Comparable<Archive> {
/** Returns the XML name of the architecture. */
public String getXmlName() {
- return toString().toLowerCase();
+ return toString().toLowerCase(Locale.US);
}
/**
diff --git a/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/SystemImagePackage.java b/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/SystemImagePackage.java
index 5457a35..268a24c 100755
--- a/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/SystemImagePackage.java
+++ b/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/SystemImagePackage.java
@@ -31,6 +31,7 @@ import com.android.sdklib.repository.SdkRepoConstants;
import org.w3c.dom.Node;
import java.io.File;
+import java.util.Locale;
import java.util.Map;
import java.util.Properties;
@@ -294,7 +295,7 @@ public class SystemImagePackage extends Package
// Computes a folder directory using the sanitized abi string.
String abi = mAbi;
- abi = abi.toLowerCase();
+ abi = abi.toLowerCase(Locale.US);
abi = abi.replaceAll("[^a-z0-9_-]+", "_"); //$NON-NLS-1$ //$NON-NLS-2$
abi = abi.replaceAll("_+", "_"); //$NON-NLS-1$ //$NON-NLS-2$
diff --git a/sdkmanager/libs/sdklib/src/com/android/sdklib/xml/AndroidManifestParser.java b/sdkmanager/libs/sdklib/src/com/android/sdklib/xml/AndroidManifestParser.java
index 9590dc3..1c10828 100644
--- a/sdkmanager/libs/sdklib/src/com/android/sdklib/xml/AndroidManifestParser.java
+++ b/sdkmanager/libs/sdklib/src/com/android/sdklib/xml/AndroidManifestParser.java
@@ -41,6 +41,7 @@ import org.xml.sax.helpers.DefaultHandler;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
+import java.util.Locale;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
@@ -393,7 +394,7 @@ public class AndroidManifestParser {
String exportedStr = getAttributeValue(attributes,
AndroidManifest.ATTRIBUTE_EXPORTED, true);
boolean exported = exportedStr == null ||
- exportedStr.toLowerCase().equals("true"); //$NON-NLS-1$
+ exportedStr.toLowerCase(Locale.US).equals("true"); //$NON-NLS-1$
mCurrentActivity = new Activity(activityName, exported);
mManifestData.mActivities.add(mCurrentActivity);
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/ImageFactory.java b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/ImageFactory.java
index 03b5a5b..fa2e360 100755
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/ImageFactory.java
+++ b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/ImageFactory.java
@@ -28,6 +28,7 @@ import org.eclipse.swt.widgets.Display;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Iterator;
+import java.util.Locale;
import java.util.Map;
@@ -101,7 +102,7 @@ public class ImageFactory {
if (clz.endsWith(Package.class.getSimpleName())) {
String name = clz.replaceFirst(Package.class.getSimpleName(), "") //$NON-NLS-1$
.replace("SystemImage", "sysimg") //$NON-NLS-1$ //$NON-NLS-2$
- .toLowerCase();
+ .toLowerCase(Locale.US);
name += "_pkg_16.png"; //$NON-NLS-1$
return getImageByName(name);
}