diff options
author | Tor Norbye <tnorbye@google.com> | 2012-01-06 09:29:25 -0800 |
---|---|---|
committer | Tor Norbye <tnorbye@google.com> | 2012-01-06 09:29:25 -0800 |
commit | 18bce12c5916331971b2e8108f8485cc56b696d3 (patch) | |
tree | 2c634dc2e09bf68bfe21faa0674c208e62017c71 | |
parent | 9f338c0725644f84597366c1e4acb680a72b3f00 (diff) | |
download | sdk-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
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);
}
|