Merge change Icb1674f1 into eclair-mr2
* changes: Create android-common static library which gets included in frameworks.jar, but can also be used by unbundled apps. Move android.text.util.Regex there as a starting example, renamed to a more sensible (?) com.android.common.Patterns. Set up a corresponding test package, and move RegexTest (to PatternsTest). Update clients.
This commit is contained in:
@@ -175,6 +175,7 @@ LOCAL_INTERMEDIATE_SOURCES := \
|
||||
|
||||
LOCAL_NO_STANDARD_LIBRARIES := true
|
||||
LOCAL_JAVA_LIBRARIES := core ext
|
||||
LOCAL_STATIC_JAVA_LIBRARIES := android-common
|
||||
|
||||
LOCAL_MODULE := framework
|
||||
LOCAL_MODULE_CLASS := JAVA_LIBRARIES
|
||||
|
||||
23
common/Android.mk
Normal file
23
common/Android.mk
Normal file
@@ -0,0 +1,23 @@
|
||||
# Copyright (C) 2009 The Android Open Source Project
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
|
||||
LOCAL_PATH := $(call my-dir)
|
||||
|
||||
include $(CLEAR_VARS)
|
||||
LOCAL_MODULE := android-common
|
||||
LOCAL_SRC_FILES := $(call all-java-files-under, src)
|
||||
include $(BUILD_STATIC_JAVA_LIBRARY)
|
||||
|
||||
# Include this library in the build server's output directory
|
||||
$(call dist-for-goals, droid, $(LOCAL_BUILT_MODULE):android-common.jar)
|
||||
@@ -14,22 +14,22 @@
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package android.text.util;
|
||||
package com.android.common;
|
||||
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
/**
|
||||
* @hide
|
||||
* Commonly used regular expression patterns.
|
||||
*/
|
||||
public class Regex {
|
||||
public class Patterns {
|
||||
/**
|
||||
* Regular expression pattern to match all IANA top-level domains.
|
||||
* List accurate as of 2007/06/15. List taken from:
|
||||
* http://data.iana.org/TLD/tlds-alpha-by-domain.txt
|
||||
* This pattern is auto-generated by //device/tools/make-iana-tld-pattern.py
|
||||
*/
|
||||
public static final Pattern TOP_LEVEL_DOMAIN_PATTERN
|
||||
public static final Pattern TOP_LEVEL_DOMAIN
|
||||
= Pattern.compile(
|
||||
"((aero|arpa|asia|a[cdefgilmnoqrstuwxz])"
|
||||
+ "|(biz|b[abdefghijmnorstvwyz])"
|
||||
@@ -63,7 +63,7 @@ public class Regex {
|
||||
* http://data.iana.org/TLD/tlds-alpha-by-domain.txt
|
||||
* This pattern is auto-generated by //device/tools/make-iana-tld-pattern.py
|
||||
*/
|
||||
public static final Pattern WEB_URL_PATTERN
|
||||
public static final Pattern WEB_URL
|
||||
= Pattern.compile(
|
||||
"((?:(http|https|Http|Https|rtsp|Rtsp):\\/\\/(?:(?:[a-zA-Z0-9\\$\\-\\_\\.\\+\\!\\*\\'\\(\\)"
|
||||
+ "\\,\\;\\?\\&\\=]|(?:\\%[a-fA-F0-9]{2})){1,64}(?:\\:(?:[a-zA-Z0-9\\$\\-\\_"
|
||||
@@ -107,20 +107,20 @@ public class Regex {
|
||||
// input. This is to stop foo.sure from
|
||||
// matching as foo.su
|
||||
|
||||
public static final Pattern IP_ADDRESS_PATTERN
|
||||
public static final Pattern IP_ADDRESS
|
||||
= Pattern.compile(
|
||||
"((25[0-5]|2[0-4][0-9]|[0-1][0-9]{2}|[1-9][0-9]|[1-9])\\.(25[0-5]|2[0-4]"
|
||||
+ "[0-9]|[0-1][0-9]{2}|[1-9][0-9]|[1-9]|0)\\.(25[0-5]|2[0-4][0-9]|[0-1]"
|
||||
+ "[0-9]{2}|[1-9][0-9]|[1-9]|0)\\.(25[0-5]|2[0-4][0-9]|[0-1][0-9]{2}"
|
||||
+ "|[1-9][0-9]|[0-9]))");
|
||||
|
||||
public static final Pattern DOMAIN_NAME_PATTERN
|
||||
public static final Pattern DOMAIN_NAME
|
||||
= Pattern.compile(
|
||||
"(((([a-zA-Z0-9][a-zA-Z0-9\\-]*)*[a-zA-Z0-9]\\.)+"
|
||||
+ TOP_LEVEL_DOMAIN_PATTERN + ")|"
|
||||
+ IP_ADDRESS_PATTERN + ")");
|
||||
+ TOP_LEVEL_DOMAIN + ")|"
|
||||
+ IP_ADDRESS + ")");
|
||||
|
||||
public static final Pattern EMAIL_ADDRESS_PATTERN
|
||||
public static final Pattern EMAIL_ADDRESS
|
||||
= Pattern.compile(
|
||||
"[a-zA-Z0-9\\+\\.\\_\\%\\-]{1,256}" +
|
||||
"\\@" +
|
||||
@@ -145,7 +145,7 @@ public class Regex {
|
||||
* <li>A string starting and ending with a digit, containing digits, spaces, dots, and/or dashes.
|
||||
* </ul>
|
||||
*/
|
||||
public static final Pattern PHONE_PATTERN
|
||||
public static final Pattern PHONE
|
||||
= Pattern.compile( // sdd = space, dot, or dash
|
||||
"(\\+[0-9]+[\\- \\.]*)?" // +<digits><sdd>*
|
||||
+ "(\\([0-9]+\\)[\\- \\.]*)?" // (<digits>)<sdd>*
|
||||
@@ -201,4 +201,9 @@ public class Regex {
|
||||
}
|
||||
return buffer.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* Do not create this static utility class.
|
||||
*/
|
||||
private Patterns() {}
|
||||
}
|
||||
26
common/tests/Android.mk
Normal file
26
common/tests/Android.mk
Normal file
@@ -0,0 +1,26 @@
|
||||
# Copyright (C) 2009 The Android Open Source Project
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
|
||||
LOCAL_PATH := $(call my-dir)
|
||||
|
||||
include $(CLEAR_VARS)
|
||||
LOCAL_CERTIFICATE := platform
|
||||
LOCAL_JAVA_LIBRARIES := android.test.runner
|
||||
LOCAL_MODULE_TAGS := tests
|
||||
LOCAL_PACKAGE_NAME := AndroidCommonTests
|
||||
LOCAL_SDK_VERSION := current
|
||||
LOCAL_SRC_FILES := $(call all-java-files-under, src)
|
||||
LOCAL_STATIC_JAVA_LIBRARIES := android-common
|
||||
|
||||
include $(BUILD_PACKAGE)
|
||||
30
common/tests/AndroidManifest.xml
Normal file
30
common/tests/AndroidManifest.xml
Normal file
@@ -0,0 +1,30 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Copyright (C) 2009 The Android Open Source Project
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
-->
|
||||
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
package="com.android.common.tests"
|
||||
android:sharedUserId="com.android.uid.test">
|
||||
|
||||
<application>
|
||||
<uses-library android:name="android.test.runner" />
|
||||
</application>
|
||||
|
||||
<!-- Run tests with "runtest common" -->
|
||||
<instrumentation android:name="android.test.InstrumentationTestRunner"
|
||||
android:targetPackage="com.android.common.tests"
|
||||
android:label="Android Common Library Tests" />
|
||||
|
||||
</manifest>
|
||||
@@ -14,25 +14,24 @@
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.android.unit_tests;
|
||||
package com.android.common;
|
||||
|
||||
import android.test.suitebuilder.annotation.SmallTest;
|
||||
import android.text.util.Regex;
|
||||
import junit.framework.TestCase;
|
||||
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
public class RegexTest extends TestCase {
|
||||
public class PatternsTest extends TestCase {
|
||||
|
||||
@SmallTest
|
||||
public void testTldPattern() throws Exception {
|
||||
boolean t;
|
||||
|
||||
t = Regex.TOP_LEVEL_DOMAIN_PATTERN.matcher("com").matches();
|
||||
t = Patterns.TOP_LEVEL_DOMAIN_PATTERN.matcher("com").matches();
|
||||
assertTrue("Missed valid TLD", t);
|
||||
|
||||
t = Regex.TOP_LEVEL_DOMAIN_PATTERN.matcher("xer").matches();
|
||||
t = Patterns.TOP_LEVEL_DOMAIN_PATTERN.matcher("xer").matches();
|
||||
assertFalse("Matched invalid TLD!", t);
|
||||
}
|
||||
|
||||
@@ -40,19 +39,19 @@ public class RegexTest extends TestCase {
|
||||
public void testUrlPattern() throws Exception {
|
||||
boolean t;
|
||||
|
||||
t = Regex.WEB_URL_PATTERN.matcher("http://www.google.com").matches();
|
||||
t = Patterns.WEB_URL_PATTERN.matcher("http://www.google.com").matches();
|
||||
assertTrue("Valid URL", t);
|
||||
|
||||
t = Regex.WEB_URL_PATTERN.matcher("ftp://www.example.com").matches();
|
||||
t = Patterns.WEB_URL_PATTERN.matcher("ftp://www.example.com").matches();
|
||||
assertFalse("Matched invalid protocol", t);
|
||||
|
||||
t = Regex.WEB_URL_PATTERN.matcher("http://www.example.com:8080").matches();
|
||||
t = Patterns.WEB_URL_PATTERN.matcher("http://www.example.com:8080").matches();
|
||||
assertTrue("Didn't match valid URL with port", t);
|
||||
|
||||
t = Regex.WEB_URL_PATTERN.matcher("http://www.example.com:8080/?foo=bar").matches();
|
||||
t = Patterns.WEB_URL_PATTERN.matcher("http://www.example.com:8080/?foo=bar").matches();
|
||||
assertTrue("Didn't match valid URL with port and query args", t);
|
||||
|
||||
t = Regex.WEB_URL_PATTERN.matcher("http://www.example.com:8080/~user/?foo=bar").matches();
|
||||
t = Patterns.WEB_URL_PATTERN.matcher("http://www.example.com:8080/~user/?foo=bar").matches();
|
||||
assertTrue("Didn't match valid URL with ~", t);
|
||||
}
|
||||
|
||||
@@ -60,10 +59,10 @@ public class RegexTest extends TestCase {
|
||||
public void testIpPattern() throws Exception {
|
||||
boolean t;
|
||||
|
||||
t = Regex.IP_ADDRESS_PATTERN.matcher("172.29.86.3").matches();
|
||||
t = Patterns.IP_ADDRESS_PATTERN.matcher("172.29.86.3").matches();
|
||||
assertTrue("Valid IP", t);
|
||||
|
||||
t = Regex.IP_ADDRESS_PATTERN.matcher("1234.4321.9.9").matches();
|
||||
t = Patterns.IP_ADDRESS_PATTERN.matcher("1234.4321.9.9").matches();
|
||||
assertFalse("Invalid IP", t);
|
||||
}
|
||||
|
||||
@@ -71,10 +70,10 @@ public class RegexTest extends TestCase {
|
||||
public void testDomainPattern() throws Exception {
|
||||
boolean t;
|
||||
|
||||
t = Regex.DOMAIN_NAME_PATTERN.matcher("mail.example.com").matches();
|
||||
t = Patterns.DOMAIN_NAME_PATTERN.matcher("mail.example.com").matches();
|
||||
assertTrue("Valid domain", t);
|
||||
|
||||
t = Regex.DOMAIN_NAME_PATTERN.matcher("__+&42.xer").matches();
|
||||
t = Patterns.DOMAIN_NAME_PATTERN.matcher("__+&42.xer").matches();
|
||||
assertFalse("Invalid domain", t);
|
||||
}
|
||||
|
||||
@@ -82,10 +81,10 @@ public class RegexTest extends TestCase {
|
||||
public void testPhonePattern() throws Exception {
|
||||
boolean t;
|
||||
|
||||
t = Regex.PHONE_PATTERN.matcher("(919) 555-1212").matches();
|
||||
t = Patterns.PHONE_PATTERN.matcher("(919) 555-1212").matches();
|
||||
assertTrue("Valid phone", t);
|
||||
|
||||
t = Regex.PHONE_PATTERN.matcher("2334 9323/54321").matches();
|
||||
t = Patterns.PHONE_PATTERN.matcher("2334 9323/54321").matches();
|
||||
assertFalse("Invalid phone", t);
|
||||
|
||||
String[] tests = {
|
||||
@@ -116,7 +115,7 @@ public class RegexTest extends TestCase {
|
||||
};
|
||||
|
||||
for (String test : tests) {
|
||||
Matcher m = Regex.PHONE_PATTERN.matcher(test);
|
||||
Matcher m = Patterns.PHONE_PATTERN.matcher(test);
|
||||
|
||||
assertTrue("Valid phone " + test, m.find());
|
||||
}
|
||||
@@ -43,7 +43,6 @@ import android.text.Editable;
|
||||
import android.text.InputType;
|
||||
import android.text.TextUtils;
|
||||
import android.text.TextWatcher;
|
||||
import android.text.util.Regex;
|
||||
import android.util.AndroidRuntimeException;
|
||||
import android.util.AttributeSet;
|
||||
import android.util.Log;
|
||||
@@ -69,6 +68,8 @@ import android.widget.TextView;
|
||||
import android.widget.AdapterView.OnItemClickListener;
|
||||
import android.widget.AdapterView.OnItemSelectedListener;
|
||||
|
||||
import com.android.common.Patterns;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.WeakHashMap;
|
||||
import java.util.concurrent.atomic.AtomicLong;
|
||||
@@ -823,7 +824,7 @@ public class SearchDialog extends Dialog implements OnItemClickListener, OnItemS
|
||||
// The user changed the query, check if it is a URL and if so change the search
|
||||
// button in the soft keyboard to the 'Go' button.
|
||||
int options = (mSearchAutoComplete.getImeOptions() & (~EditorInfo.IME_MASK_ACTION));
|
||||
if (Regex.WEB_URL_PATTERN.matcher(mUserQuery).matches()) {
|
||||
if (Patterns.WEB_URL.matcher(mUserQuery).matches()) {
|
||||
options = options | EditorInfo.IME_ACTION_GO;
|
||||
} else {
|
||||
options = options | EditorInfo.IME_ACTION_SEARCH;
|
||||
|
||||
@@ -37,9 +37,10 @@ import android.text.Spanned;
|
||||
import android.text.TextUtils;
|
||||
import android.text.TextUtils.SimpleStringSplitter;
|
||||
import android.text.style.CharacterStyle;
|
||||
import android.text.util.Regex;
|
||||
import android.util.Log;
|
||||
|
||||
import com.android.common.Patterns;
|
||||
|
||||
import java.io.UnsupportedEncodingException;
|
||||
import java.net.URLEncoder;
|
||||
import java.util.ArrayList;
|
||||
@@ -192,7 +193,7 @@ public final class Gmail {
|
||||
*/
|
||||
public static String getEmailFromAddressString(String addressString) {
|
||||
String result = addressString;
|
||||
Matcher match = Regex.EMAIL_ADDRESS_PATTERN.matcher(addressString);
|
||||
Matcher match = Patterns.EMAIL_ADDRESS.matcher(addressString);
|
||||
if (match.find()) {
|
||||
result = addressString.substring(match.start(), match.end());
|
||||
}
|
||||
|
||||
@@ -28,10 +28,11 @@ import android.database.Cursor;
|
||||
import android.net.Uri;
|
||||
import android.telephony.SmsMessage;
|
||||
import android.text.TextUtils;
|
||||
import android.text.util.Regex;
|
||||
import android.util.Config;
|
||||
import android.util.Log;
|
||||
|
||||
import com.android.common.Patterns;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
import java.util.regex.Matcher;
|
||||
@@ -1290,7 +1291,7 @@ public final class Telephony {
|
||||
}
|
||||
|
||||
String s = extractAddrSpec(address);
|
||||
Matcher match = Regex.EMAIL_ADDRESS_PATTERN.matcher(s);
|
||||
Matcher match = Patterns.EMAIL_ADDRESS.matcher(s);
|
||||
return match.matches();
|
||||
}
|
||||
|
||||
@@ -1305,7 +1306,7 @@ public final class Telephony {
|
||||
return false;
|
||||
}
|
||||
|
||||
Matcher match = Regex.PHONE_PATTERN.matcher(number);
|
||||
Matcher match = Patterns.PHONE.matcher(number);
|
||||
return match.matches();
|
||||
}
|
||||
|
||||
|
||||
@@ -25,6 +25,8 @@ import android.text.Spanned;
|
||||
import android.webkit.WebView;
|
||||
import android.widget.TextView;
|
||||
|
||||
import com.android.common.Patterns;
|
||||
|
||||
import java.io.UnsupportedEncodingException;
|
||||
import java.net.URLEncoder;
|
||||
import java.util.ArrayList;
|
||||
@@ -133,7 +135,7 @@ public class Linkify {
|
||||
*/
|
||||
public static final TransformFilter sPhoneNumberTransformFilter = new TransformFilter() {
|
||||
public final String transformUrl(final Matcher match, String url) {
|
||||
return Regex.digitsAndPlusOnly(match);
|
||||
return Patterns.digitsAndPlusOnly(match);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -207,19 +209,19 @@ public class Linkify {
|
||||
ArrayList<LinkSpec> links = new ArrayList<LinkSpec>();
|
||||
|
||||
if ((mask & WEB_URLS) != 0) {
|
||||
gatherLinks(links, text, Regex.WEB_URL_PATTERN,
|
||||
gatherLinks(links, text, Patterns.WEB_URL,
|
||||
new String[] { "http://", "https://", "rtsp://" },
|
||||
sUrlMatchFilter, null);
|
||||
}
|
||||
|
||||
if ((mask & EMAIL_ADDRESSES) != 0) {
|
||||
gatherLinks(links, text, Regex.EMAIL_ADDRESS_PATTERN,
|
||||
gatherLinks(links, text, Patterns.EMAIL_ADDRESS,
|
||||
new String[] { "mailto:" },
|
||||
null, null);
|
||||
}
|
||||
|
||||
if ((mask & PHONE_NUMBERS) != 0) {
|
||||
gatherLinks(links, text, Regex.PHONE_PATTERN,
|
||||
gatherLinks(links, text, Patterns.PHONE,
|
||||
new String[] { "tel:" },
|
||||
sPhoneNumberMatchFilter, sPhoneNumberTransformFilter);
|
||||
}
|
||||
|
||||
@@ -733,7 +733,6 @@ android.text.style.UnderlineSpan
|
||||
android.text.util.Linkify
|
||||
android.text.util.Linkify$1
|
||||
android.text.util.Linkify$4
|
||||
android.text.util.Regex
|
||||
android.text.util.Rfc822Tokenizer
|
||||
android.text.util.Rfc822Validator
|
||||
android.util.AttributeSet
|
||||
|
||||
@@ -17,10 +17,10 @@
|
||||
package com.android.internal.telephony.gsm;
|
||||
|
||||
import android.os.*;
|
||||
import android.text.util.Regex;
|
||||
import android.util.EventLog;
|
||||
import android.util.Log;
|
||||
|
||||
import com.android.common.Patterns;
|
||||
import com.android.internal.telephony.CommandException;
|
||||
import com.android.internal.telephony.CommandsInterface;
|
||||
import com.android.internal.telephony.DataConnection;
|
||||
@@ -318,7 +318,7 @@ public class PdpConnection extends DataConnection {
|
||||
private boolean isIpAddress(String address) {
|
||||
if (address == null) return false;
|
||||
|
||||
return Regex.IP_ADDRESS_PATTERN.matcher(apn.mmsProxy).matches();
|
||||
return Patterns.IP_ADDRESS.matcher(apn.mmsProxy).matches();
|
||||
}
|
||||
|
||||
public ApnSetting getApn() {
|
||||
|
||||
@@ -17,7 +17,6 @@
|
||||
package android.core;
|
||||
|
||||
import android.test.suitebuilder.annotation.SmallTest;
|
||||
import android.text.util.Regex;
|
||||
|
||||
import junit.framework.TestCase;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user