diff options
author | Danny Baumann <dannybaumann@web.de> | 2014-10-02 12:55:23 +0200 |
---|---|---|
committer | Danny Baumann <dannybaumann@web.de> | 2014-10-02 13:51:19 +0200 |
commit | e64d747e3ae87cc6ddf83b96882e7bcad6ebcd31 (patch) | |
tree | 89cf361a07a7156808d185dfc603e021e6f62b37 | |
parent | 2491d19f178f2b78a00cce00bce5dc8ec0d60231 (diff) | |
download | android_packages_apps_Dialer-e64d747e3ae87cc6ddf83b96882e7bcad6ebcd31.tar.gz android_packages_apps_Dialer-e64d747e3ae87cc6ddf83b96882e7bcad6ebcd31.tar.bz2 android_packages_apps_Dialer-e64d747e3ae87cc6ddf83b96882e7bcad6ebcd31.zip |
Code cleanup.
Avoid repetetive boilerplate code by using helper methods.
Change-Id: Id3ce8d07d35d59c08cbc67fa35bbf6daa67c9608
19 files changed, 345 insertions, 859 deletions
diff --git a/src/com/android/dialer/lookup/ContactBuilder.java b/src/com/android/dialer/lookup/ContactBuilder.java index b6c85a2d0..069045db2 100644 --- a/src/com/android/dialer/lookup/ContactBuilder.java +++ b/src/com/android/dialer/lookup/ContactBuilder.java @@ -259,6 +259,13 @@ public class ContactBuilder { public String postCode; public String country; + public static Address createFormattedHome(String address) { + Address a = new Address(); + a.formattedAddress = address; + a.type = StructuredPostal.TYPE_HOME; + return a; + } + public JSONObject getJsonObject() throws JSONException { JSONObject json = new JSONObject(); json.putOpt(StructuredPostal.FORMATTED_ADDRESS, @@ -301,6 +308,12 @@ public class ContactBuilder { public String phoneticMiddleName; public String phoneticFamilyName; + public static Name createDisplayName(String displayName) { + Name name = new Name(); + name.displayName = displayName; + return name; + } + public JSONObject getJsonObject() throws JSONException { JSONObject json = new JSONObject(); json.putOpt(StructuredName.DISPLAY_NAME, displayName); @@ -337,6 +350,13 @@ public class ContactBuilder { public int type; public String label; + public static PhoneNumber createMainNumber(String number) { + PhoneNumber n = new PhoneNumber(); + n.number = number; + n.type = Phone.TYPE_MAIN; + return n; + } + public JSONObject getJsonObject() throws JSONException { JSONObject json = new JSONObject(); json.put(Phone.NUMBER, number); @@ -358,6 +378,13 @@ public class ContactBuilder { public int type; public String label; + public static WebsiteUrl createProfile(String url) { + WebsiteUrl u = new WebsiteUrl(); + u.url = url; + u.type = Website.TYPE_PROFILE; + return u; + } + public JSONObject getJsonObject() throws JSONException { JSONObject json = new JSONObject(); json.put(Website.URL, url); diff --git a/src/com/android/dialer/lookup/LookupUtils.java b/src/com/android/dialer/lookup/LookupUtils.java new file mode 100644 index 000000000..c0b84dc38 --- /dev/null +++ b/src/com/android/dialer/lookup/LookupUtils.java @@ -0,0 +1,84 @@ +/* + * Copyright (C) 2014 The CyanogenMod 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. + */ + +package com.android.dialer.lookup; + +import android.text.Html; + +import org.apache.http.Header; +import org.apache.http.HttpResponse; +import org.apache.http.HttpStatus; +import org.apache.http.client.HttpClient; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.impl.client.DefaultHttpClient; +import org.apache.http.util.EntityUtils; + +import java.io.IOException; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class LookupUtils { + private static final String USER_AGENT = + "Mozilla/5.0 (X11; Linux x86_64; rv:26.0) Gecko/20100101 Firefox/26.0"; + + public static String httpGet(HttpGet request) throws IOException { + HttpClient client = new DefaultHttpClient(); + + request.setHeader("User-Agent", USER_AGENT); + + HttpResponse response = client.execute(request); + int status = response.getStatusLine().getStatusCode(); + + // Android's org.apache.http doesn't have the RedirectStrategy class + if (status == HttpStatus.SC_MOVED_PERMANENTLY + || status == HttpStatus.SC_MOVED_TEMPORARILY) { + Header[] headers = response.getHeaders("Location"); + + if (headers != null && headers.length != 0) { + HttpGet newGet = new HttpGet(headers[headers.length - 1].getValue()); + for (Header header : request.getAllHeaders()) { + newGet.addHeader(header); + } + return httpGet(newGet); + } else { + throw new IOException("Empty redirection header"); + } + } + + if (status != HttpStatus.SC_OK) { + throw new IOException("HTTP failure (status " + status + ")"); + } + + return EntityUtils.toString(response.getEntity()); + } + + public static String firstRegexResult(String input, String regex, boolean dotall) { + if (input == null) { + return null; + } + Pattern pattern = Pattern.compile(regex, dotall ? Pattern.DOTALL : 0); + Matcher m = pattern.matcher(input); + return m.find() ? m.group(1).trim() : null; + } + + public static String fromHtml(String input) { + if (input == null) { + return null; + } + return Html.fromHtml(input).toString().trim(); + } +} + diff --git a/src/com/android/dialer/lookup/ReverseLookup.java b/src/com/android/dialer/lookup/ReverseLookup.java index e0fe1e98c..041b6ffba 100644 --- a/src/com/android/dialer/lookup/ReverseLookup.java +++ b/src/com/android/dialer/lookup/ReverseLookup.java @@ -29,7 +29,8 @@ import android.content.Context; import android.graphics.Bitmap; import android.net.Uri; import android.util.Log; -import android.util.Pair; + +import java.io.IOException; public abstract class ReverseLookup { private static final String TAG = ReverseLookup.class.getSimpleName(); @@ -98,9 +99,8 @@ public abstract class ReverseLookup { * * @param context The application context * @param uri The image URI - * @param data Extra data (a authentication token, perhaps) */ - public Bitmap lookupImage(Context context, Uri uri, Object data) { + public Bitmap lookupImage(Context context, Uri uri) { return null; } @@ -112,6 +112,6 @@ public abstract class ReverseLookup { * @param formattedNumber The formatted phone number * @return The phone number info object */ - public abstract Pair<ContactInfo, Object> lookupNumber(Context context, - String normalizedNumber, String formattedNumber); + public abstract ContactInfo lookupNumber(Context context, + String normalizedNumber, String formattedNumber) throws IOException; } diff --git a/src/com/android/dialer/lookup/ReverseLookupThread.java b/src/com/android/dialer/lookup/ReverseLookupThread.java index 95173764b..31c344265 100644 --- a/src/com/android/dialer/lookup/ReverseLookupThread.java +++ b/src/com/android/dialer/lookup/ReverseLookupThread.java @@ -27,8 +27,8 @@ import android.os.Looper; import android.telephony.PhoneNumberUtils; import android.telephony.TelephonyManager; import android.util.Log; -import android.util.Pair; +import java.io.IOException; import java.util.concurrent.Executors; import java.util.concurrent.ExecutorService; @@ -91,26 +91,23 @@ public class ReverseLookupThread extends Thread { } // Lookup contact if it's not cached - Object data = null; if (info == null) { - Pair<ContactInfo, Object> results = - ReverseLookup.getInstance(mContext).lookupNumber( - mContext, mNormalizedNumber, mFormattedNumber); + try { + info = ReverseLookup.getInstance(mContext).lookupNumber(mContext, + mNormalizedNumber, mFormattedNumber); + } catch (IOException e) { + // ignored, we'll return below + } - if (results == null) { + if (info == null) { return; } - info = results.first; - data = results.second; - // Put in cache only if the contact is valid - if (info != null) { - if (info.equals(ContactInfo.EMPTY)) { - return; - } else if (info.name != null) { - LookupCache.cacheContact(mContext, info); - } + if (info.equals(ContactInfo.EMPTY)) { + return; + } else if (info.name != null) { + LookupCache.cacheContact(mContext, info); } } @@ -126,7 +123,7 @@ public class ReverseLookupThread extends Thread { if (info.photoUri != null) { if (!LookupCache.hasCachedImage(mContext, mNormalizedNumber)) { Bitmap bmp = ReverseLookup.getInstance(mContext).lookupImage( - mContext, info.photoUri, data); + mContext, info.photoUri); if (bmp != null) { LookupCache.cacheImage(mContext, mNormalizedNumber, bmp); diff --git a/src/com/android/dialer/lookup/cyngn/CyngnChineseReverseLookup.java b/src/com/android/dialer/lookup/cyngn/CyngnChineseReverseLookup.java index 4b4aa6d33..355208a18 100644 --- a/src/com/android/dialer/lookup/cyngn/CyngnChineseReverseLookup.java +++ b/src/com/android/dialer/lookup/cyngn/CyngnChineseReverseLookup.java @@ -22,7 +22,6 @@ import android.database.Cursor; import android.net.Uri; import android.provider.ContactsContract; import android.util.Log; -import android.util.Pair; import com.android.dialer.calllog.ContactInfo; import com.android.dialer.lookup.ContactBuilder; import com.android.dialer.lookup.ReverseLookup; @@ -36,6 +35,8 @@ public class CyngnChineseReverseLookup extends ReverseLookup { private static final int COMMON_CHINESE_PHONE_NUMBER_AREANO_END = 5; private static final boolean DEBUG = false; + private static final Uri PROVIDER_URI = + Uri.parse("content://com.cyngn.chineselocationlookup.provider"); public CyngnChineseReverseLookup(Context context) { } @@ -48,12 +49,9 @@ public class CyngnChineseReverseLookup extends ReverseLookup { * @param formattedNumber The formatted phone number * @return The phone number info object */ - public Pair<ContactInfo, Object> lookupNumber(Context context, - String normalizedNumber, String formattedNumber) { - String displayName; - - displayName = queryProvider(context, normalizedNumber); - + public ContactInfo lookupNumber(Context context, + String normalizedNumber, String formattedNumber) { + String displayName = queryProvider(context, normalizedNumber); if (displayName == null) { return null; } @@ -66,19 +64,11 @@ public class CyngnChineseReverseLookup extends ReverseLookup { ContactBuilder builder = new ContactBuilder( ContactBuilder.REVERSE_LOOKUP, normalizedNumber, formattedNumber); - - ContactBuilder.Name n = new ContactBuilder.Name(); - n.displayName = displayName; - builder.setName(n); - - ContactBuilder.PhoneNumber pn = new ContactBuilder.PhoneNumber(); - pn.number = number; - pn.type = ContactsContract.CommonDataKinds.Phone.TYPE_MAIN; - builder.addPhoneNumber(pn); - + builder.setName(ContactBuilder.Name.createDisplayName(displayName)); + builder.addPhoneNumber(ContactBuilder.PhoneNumber.createMainNumber(number)); builder.setPhotoUri(ContactBuilder.PHOTO_URI_BUSINESS); - return Pair.create(builder.build(), null); + return builder.build(); } private String queryProvider(Context context, String normalizedNumber) { @@ -91,20 +81,19 @@ public class CyngnChineseReverseLookup extends ReverseLookup { COMMON_CHINESE_PHONE_NUMBER_AREANO_END); ContentResolver resolver = context.getContentResolver(); - Cursor cursor = resolver.query(Uri.parse("content://com.cyngn.chineselocationlookup.provider"), + Cursor cursor = context.getContentResolver().query(PROVIDER_URI, null, null, new String[] { areaPrefix }, null); - - String city = null; + if (cursor == null) { + return null; + } try { if (cursor.moveToFirst()) { - city = cursor.getString(2); + return cursor.getString(2); } - } catch (NullPointerException e) { - return null; } finally { cursor.close(); - return city; } + return null; } } diff --git a/src/com/android/dialer/lookup/dastelefonbuch/TelefonbuchApi.java b/src/com/android/dialer/lookup/dastelefonbuch/TelefonbuchApi.java index 70c2962a7..2d9ed3e5f 100644 --- a/src/com/android/dialer/lookup/dastelefonbuch/TelefonbuchApi.java +++ b/src/com/android/dialer/lookup/dastelefonbuch/TelefonbuchApi.java @@ -18,21 +18,12 @@ package com.android.dialer.lookup.dastelefonbuch; import android.content.Context; import android.net.Uri; -import android.text.Html; -import com.android.dialer.lookup.LookupSettings; +import com.android.dialer.lookup.LookupUtils; -import org.apache.http.Header; -import org.apache.http.HttpResponse; -import org.apache.http.HttpStatus; -import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; -import org.apache.http.impl.client.DefaultHttpClient; -import org.apache.http.util.EntityUtils; import java.io.IOException; -import java.util.regex.Matcher; -import java.util.regex.Pattern; public class TelefonbuchApi { private static final String TAG = TelefonbuchApi.class.getSimpleName(); @@ -41,8 +32,9 @@ public class TelefonbuchApi { "http://www.dastelefonbuch.de/?s=a20000" + "&cmd=search&sort_ok=0&sp=55&vert_ok=0&aktion=23"; - private static final String USER_AGENT = - "Mozilla/5.0 (X11; Linux x86_64; rv:26.0) Gecko/20100101 Firefox/26.0"; + private static String NAME_REGEX ="<a id=\"name0.*?>\\s*\n?(.*?)\n?\\s*</a>"; + private static String NUMBER_REGEX = "<span\\s+class=\"ico fon.*>.*<span>(.*?)</span><br/>"; + private static String ADDRESS_REGEX = "<address.*?>\n?(.*?)</address>"; private TelefonbuchApi() { } @@ -53,28 +45,19 @@ public class TelefonbuchApi { .buildUpon() .appendQueryParameter("kw", number) .build(); - String output = httpGet(uri.toString()); - if (output == null) { - return null; - } - // Cut out everything we're not interested in (scripts etc.) to // speed up the subsequent matching. - Pattern regex = Pattern.compile(": Treffer(.*)Ende Treffer", Pattern.DOTALL); - Matcher matcher = regex.matcher(output); - if (!matcher.find()) { - return null; - } - - output = matcher.group(1); + String output = LookupUtils.firstRegexResult( + LookupUtils.httpGet(new HttpGet(uri.toString())), + ": Treffer(.*)Ende Treffer", true); - String name = parseName(output); + String name = parseValue(output, NAME_REGEX, true, false); if (name == null) { return null; } - String phoneNumber = parseNumber(output); - String address = parseAddress(output); + String phoneNumber = parseValue(output, NUMBER_REGEX, false, true); + String address = parseValue(output, ADDRESS_REGEX, true, true); ContactInfo info = new ContactInfo(); info.name = name; @@ -85,72 +68,13 @@ public class TelefonbuchApi { return info; } - private static String httpGet(String url) throws IOException { - HttpClient client = new DefaultHttpClient(); - HttpGet get = new HttpGet(url); - - get.setHeader("User-Agent", USER_AGENT); - - HttpResponse response = client.execute(get); - int status = response.getStatusLine().getStatusCode(); - - // Android's org.apache.http doesn't have the RedirectStrategy class - if (status == HttpStatus.SC_MOVED_PERMANENTLY - || status == HttpStatus.SC_MOVED_TEMPORARILY) { - Header[] headers = response.getHeaders("Location"); - - if (headers != null && headers.length != 0) { - String newUrl = headers[headers.length - 1].getValue(); - return httpGet(newUrl); - } else { - return null; - } - } - - if (status != HttpStatus.SC_OK) { - return null; - } - - return EntityUtils.toString(response.getEntity()); - } - - private static String parseName(String output) { - Pattern regex = Pattern.compile("<a id=\"name0.*?>\\s*\n?(.*?)\n?\\s*</a>", - Pattern.DOTALL); - Matcher m = regex.matcher(output); - - if (m.find()) { - return fromHtml(m.group(1)); - } - - return null; - } - - private static String parseNumber(String output) { - Pattern regex = Pattern.compile("<span\\s+class=\"ico fon.*>.*<span>(.*?)</span><br/>", 0); - Matcher m = regex.matcher(output); - if (m.find()) { - return fromHtml(m.group(1).replaceAll("</?span.*?>", "")); - } - - return null; - } - - private static String parseAddress(String output) { - Pattern regex = Pattern.compile("<address.*?>\n?(.*?)</address>", Pattern.DOTALL); - Matcher m = regex.matcher(output); - if (m.find()) { - return fromHtml(m.group(1).replaceAll("</?span.*?>", "")); - } - - return null; - } - - private static String fromHtml(String input) { - if (input == null) { - return null; + private static String parseValue(String output, String regex, + boolean dotall, boolean removeSpans) { + String result = LookupUtils.firstRegexResult(output, regex, dotall); + if (result != null && removeSpans) { + result = result.replaceAll("</?span.*?>", ""); } - return Html.fromHtml(input).toString().trim(); + return LookupUtils.fromHtml(result); } public static class ContactInfo { diff --git a/src/com/android/dialer/lookup/dastelefonbuch/TelefonbuchReverseLookup.java b/src/com/android/dialer/lookup/dastelefonbuch/TelefonbuchReverseLookup.java index 18c24e163..a96a77260 100644 --- a/src/com/android/dialer/lookup/dastelefonbuch/TelefonbuchReverseLookup.java +++ b/src/com/android/dialer/lookup/dastelefonbuch/TelefonbuchReverseLookup.java @@ -21,7 +21,6 @@ import android.net.Uri; import android.provider.ContactsContract.CommonDataKinds.Phone; import android.provider.ContactsContract.CommonDataKinds.StructuredPostal; import android.provider.ContactsContract.CommonDataKinds.Website; -import android.util.Pair; import com.android.dialer.calllog.ContactInfo; import com.android.dialer.lookup.ContactBuilder; @@ -43,21 +42,14 @@ public class TelefonbuchReverseLookup extends ReverseLookup { * @param formattedNumber The formatted phone number * @return The phone number info object */ - public Pair<ContactInfo, Object> lookupNumber(Context context, - String normalizedNumber, String formattedNumber) { - TelefonbuchApi.ContactInfo info = null; - + public ContactInfo lookupNumber(Context context, + String normalizedNumber, String formattedNumber) throws IOException { if (normalizedNumber.startsWith("+") && !normalizedNumber.startsWith("+49")) { // Das Telefonbuch only supports German numbers return null; } - try { - info = TelefonbuchApi.reverseLookup(context, normalizedNumber); - } catch (IOException e) { - return null; - } - + TelefonbuchApi.ContactInfo info = TelefonbuchApi.reverseLookup(context, normalizedNumber); if (info == null) { return null; } @@ -65,28 +57,13 @@ public class TelefonbuchReverseLookup extends ReverseLookup { ContactBuilder builder = new ContactBuilder( ContactBuilder.REVERSE_LOOKUP, normalizedNumber, formattedNumber); - - ContactBuilder.Name n = new ContactBuilder.Name(); - n.displayName = info.name; - builder.setName(n); - - ContactBuilder.PhoneNumber pn = new ContactBuilder.PhoneNumber(); - pn.number = info.formattedNumber; - pn.type = Phone.TYPE_MAIN; - builder.addPhoneNumber(pn); - + builder.setName(ContactBuilder.Name.createDisplayName(info.name)); + builder.addPhoneNumber(ContactBuilder.PhoneNumber.createMainNumber(info.formattedNumber)); + builder.addWebsite(ContactBuilder.WebsiteUrl.createProfile(info.website)); if (info.address != null) { - ContactBuilder.Address a = new ContactBuilder.Address(); - a.formattedAddress = info.address; - a.type = StructuredPostal.TYPE_HOME; - builder.addAddress(a); + builder.addAddress(ContactBuilder.Address.createFormattedHome(info.address)); } - ContactBuilder.WebsiteUrl w = new ContactBuilder.WebsiteUrl(); - w.url = info.website; - w.type = Website.TYPE_PROFILE; - builder.addWebsite(w); - - return Pair.create(builder.build(), null); + return builder.build(); } } diff --git a/src/com/android/dialer/lookup/google/GoogleForwardLookup.java b/src/com/android/dialer/lookup/google/GoogleForwardLookup.java index 89214925a..215cbfd3b 100644 --- a/src/com/android/dialer/lookup/google/GoogleForwardLookup.java +++ b/src/com/android/dialer/lookup/google/GoogleForwardLookup.java @@ -179,15 +179,9 @@ public class GoogleForwardLookup extends ForwardLookup { ContactBuilder builder = new ContactBuilder( ContactBuilder.FORWARD_LOOKUP, null, phoneNumber); - - ContactBuilder.Name n = new ContactBuilder.Name(); - n.displayName = displayName; - builder.setName(n); - - ContactBuilder.PhoneNumber pn = new ContactBuilder.PhoneNumber(); - pn.number = phoneNumber; - pn.type = Phone.TYPE_MAIN; - builder.addPhoneNumber(pn); + builder.setName(ContactBuilder.Name.createDisplayName(displayName)); + builder.addPhoneNumber(ContactBuilder.PhoneNumber.createMainNumber(phoneNumber)); + builder.addWebsite(ContactBuilder.WebsiteUrl.createProfile(profileUrl)); ContactBuilder.Address a = new ContactBuilder.Address(); a.formattedAddress = address; @@ -195,11 +189,6 @@ public class GoogleForwardLookup extends ForwardLookup { a.type = StructuredPostal.TYPE_WORK; builder.addAddress(a); - ContactBuilder.WebsiteUrl w = new ContactBuilder.WebsiteUrl(); - w.url = profileUrl; - w.type = Website.TYPE_PROFILE; - builder.addWebsite(w); - if (photoUri != null) { builder.setPhotoUri(photoUri); } else { diff --git a/src/com/android/dialer/lookup/opencnam/OpenCnamReverseLookup.java b/src/com/android/dialer/lookup/opencnam/OpenCnamReverseLookup.java index f7c907905..9dafab785 100644 --- a/src/com/android/dialer/lookup/opencnam/OpenCnamReverseLookup.java +++ b/src/com/android/dialer/lookup/opencnam/OpenCnamReverseLookup.java @@ -16,26 +16,19 @@ package com.android.dialer.lookup.opencnam; -import com.android.dialer.calllog.ContactInfo; -import com.android.dialer.lookup.ContactBuilder; -import com.android.dialer.lookup.ReverseLookup; - import android.content.Context; import android.net.Uri; import android.provider.Settings; import android.text.TextUtils; import android.util.Log; -import android.util.Pair; -import android.provider.ContactsContract.CommonDataKinds.Phone; +import com.android.dialer.calllog.ContactInfo; +import com.android.dialer.lookup.ContactBuilder; +import com.android.dialer.lookup.LookupUtils; +import com.android.dialer.lookup.ReverseLookup; -import org.apache.http.HttpStatus; -import org.apache.http.HttpResponse; -import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; -import org.apache.http.impl.client.DefaultHttpClient; -import java.io.ByteArrayOutputStream; import java.io.IOException; public class OpenCnamReverseLookup extends ReverseLookup { @@ -62,20 +55,15 @@ public class OpenCnamReverseLookup extends ReverseLookup { * @param formattedNumber The formatted phone number * @return The phone number info object */ - public Pair<ContactInfo, Object> lookupNumber(Context context, - String normalizedNumber, String formattedNumber) { - String displayName; - + public ContactInfo lookupNumber(Context context, + String normalizedNumber, String formattedNumber) throws IOException { if (normalizedNumber.startsWith("+") &&!normalizedNumber.startsWith("+1")) { // Any non-US number will return "We currently accept only US numbers" return null; } - try { - displayName = httpGetRequest(context, normalizedNumber); - if (DEBUG) Log.d(TAG, "Reverse lookup returned name: " + displayName); - } catch (IOException e) { - return null; - } + + String displayName = httpGetRequest(context, normalizedNumber); + if (DEBUG) Log.d(TAG, "Reverse lookup returned name: " + displayName); // Check displayName. The free tier of the service will return the // following for some numbers: @@ -91,19 +79,11 @@ public class OpenCnamReverseLookup extends ReverseLookup { ContactBuilder builder = new ContactBuilder( ContactBuilder.REVERSE_LOOKUP, normalizedNumber, formattedNumber); - - ContactBuilder.Name n = new ContactBuilder.Name(); - n.displayName = displayName; - builder.setName(n); - - ContactBuilder.PhoneNumber pn = new ContactBuilder.PhoneNumber(); - pn.number = number; - pn.type = Phone.TYPE_MAIN; - builder.addPhoneNumber(pn); - + builder.setName(ContactBuilder.Name.createDisplayName(displayName)); + builder.addPhoneNumber(ContactBuilder.PhoneNumber.createMainNumber(number)); builder.setPhotoUri(ContactBuilder.PHOTO_URI_BUSINESS); - return Pair.create(builder.build(), null); + return builder.build(); } private String httpGetRequest(Context context, String number) throws IOException { @@ -124,20 +104,6 @@ public class OpenCnamReverseLookup extends ReverseLookup { builder.appendQueryParameter(AUTH_TOKEN, authToken); } - String url = builder.build().toString(); - - HttpClient client = new DefaultHttpClient(); - HttpGet request = new HttpGet(url); - - HttpResponse response = client.execute(request); - - if (response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) { - throw new IOException(); - } - - ByteArrayOutputStream out = new ByteArrayOutputStream(); - response.getEntity().writeTo(out); - - return new String(out.toByteArray()); + return LookupUtils.httpGet(new HttpGet(builder.build().toString())); } } diff --git a/src/com/android/dialer/lookup/openstreetmap/OpenStreetMapForwardLookup.java b/src/com/android/dialer/lookup/openstreetmap/OpenStreetMapForwardLookup.java index 0f6d8dfcd..5bd5e723f 100644 --- a/src/com/android/dialer/lookup/openstreetmap/OpenStreetMapForwardLookup.java +++ b/src/com/android/dialer/lookup/openstreetmap/OpenStreetMapForwardLookup.java @@ -19,32 +19,31 @@ package com.android.dialer.lookup.openstreetmap; -import com.android.dialer.calllog.ContactInfo; -import com.android.dialer.lookup.ContactBuilder; -import com.android.dialer.lookup.ForwardLookup; - import android.content.Context; import android.location.Location; -import android.provider.ContactsContract.CommonDataKinds.Phone; import android.provider.ContactsContract.CommonDataKinds.StructuredPostal; import android.provider.ContactsContract.CommonDataKinds.Website; import android.util.Log; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Locale; +import com.android.dialer.calllog.ContactInfo; +import com.android.dialer.lookup.ContactBuilder; +import com.android.dialer.lookup.ForwardLookup; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpPost; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.DefaultHttpClient; +import org.apache.http.util.EntityUtils; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Locale; + public class OpenStreetMapForwardLookup extends ForwardLookup { private static final String TAG = OpenStreetMapForwardLookup.class.getSimpleName(); @@ -149,14 +148,8 @@ public class OpenStreetMapForwardLookup extends ForwardLookup { ContactBuilder builder = new ContactBuilder( ContactBuilder.FORWARD_LOOKUP, null, phoneNumber); - ContactBuilder.Name n = new ContactBuilder.Name(); - n.displayName = displayName; - builder.setName(n); - - ContactBuilder.PhoneNumber pn = new ContactBuilder.PhoneNumber(); - pn.number = phoneNumber; - pn.type = Phone.TYPE_MAIN; - builder.addPhoneNumber(pn); + builder.setName(ContactBuilder.Name.createDisplayName(displayName)); + builder.addPhoneNumber(ContactBuilder.PhoneNumber.createMainNumber(phoneNumber)); ContactBuilder.Address a = new ContactBuilder.Address(); a.formattedAddress = address; @@ -192,11 +185,6 @@ public class OpenStreetMapForwardLookup extends ForwardLookup { post.setEntity(new StringEntity(query)); - HttpResponse response = client.execute(post); - - ByteArrayOutputStream out = new ByteArrayOutputStream(); - response.getEntity().writeTo(out); - - return new String(out.toByteArray()); + return EntityUtils.toString(client.execute(post).getEntity()); } } diff --git a/src/com/android/dialer/lookup/paginebianche/PagineBiancheApi.java b/src/com/android/dialer/lookup/paginebianche/PagineBiancheApi.java index 4bc93a2d8..cace3b56c 100644 --- a/src/com/android/dialer/lookup/paginebianche/PagineBiancheApi.java +++ b/src/com/android/dialer/lookup/paginebianche/PagineBiancheApi.java @@ -18,21 +18,12 @@ package com.android.dialer.lookup.paginebianche; import android.content.Context; import android.net.Uri; -import android.text.Html; -import com.android.dialer.lookup.LookupSettings; +import com.android.dialer.lookup.LookupUtils; -import org.apache.http.Header; -import org.apache.http.HttpResponse; -import org.apache.http.HttpStatus; -import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; -import org.apache.http.impl.client.DefaultHttpClient; -import org.apache.http.util.EntityUtils; import java.io.IOException; -import java.util.regex.Matcher; -import java.util.regex.Pattern; public class PagineBiancheApi { private static final String TAG = PagineBiancheApi.class.getSimpleName(); @@ -40,6 +31,10 @@ public class PagineBiancheApi { private static final String REVERSE_LOOKUP_URL = "http://www.paginebianche.it/ricerca-da-numero?"; + private static final String NAME_REGEX = "\\stitle=\"(.*?)\""; + private static final String NUMBER_REGEX = "class=\"tel\".*?class=\"value\">(.*?)<"; + private static final String ADDRESS_REGEX = "class=\"street-address\">(.*?)</div>"; + private PagineBiancheApi() { } @@ -50,27 +45,18 @@ public class PagineBiancheApi { .appendQueryParameter("qs", number) .build(); - String output = httpGet(uri.toString()); - if (output == null) { - return null; - } - // Cut out everything we're not interested in (scripts etc.) to // speed up the subsequent matching. - Pattern regex = Pattern.compile("class=\"org fn\"(.*?)class=\"link_social", Pattern.DOTALL); - Matcher matcher = regex.matcher(output); - if (!matcher.find()) { - return null; - } - - output = matcher.group(1); + String output = LookupUtils.firstRegexResult( + LookupUtils.httpGet(new HttpGet(uri.toString())), + "class=\"org fn\"(.*?)class=\"link_social", true); - String name = parseName(output); + String name = LookupUtils.firstRegexResult(output, NAME_REGEX, false); if (name == null) { return null; } - String phoneNumber = parseNumber(output); + String phoneNumber = LookupUtils.firstRegexResult(output, NUMBER_REGEX, false); String address = parseAddress(output); ContactInfo info = new ContactInfo(); @@ -82,62 +68,9 @@ public class PagineBiancheApi { return info; } - private static String httpGet(String url) throws IOException { - HttpClient client = new DefaultHttpClient(); - HttpGet get = new HttpGet(url); - - HttpResponse response = client.execute(get); - int status = response.getStatusLine().getStatusCode(); - - // Android's org.apache.http doesn't have the RedirectStrategy class - if (status == HttpStatus.SC_MOVED_PERMANENTLY - || status == HttpStatus.SC_MOVED_TEMPORARILY) { - Header[] headers = response.getHeaders("Location"); - - if (headers != null && headers.length != 0) { - String newUrl = headers[headers.length - 1].getValue(); - return httpGet(newUrl); - } else { - return null; - } - } - - if (status != HttpStatus.SC_OK) { - return null; - } - - return EntityUtils.toString(response.getEntity()); - } - - private static String parseName(String output) { - Pattern regex = Pattern.compile("\\stitle=\"(.*?)\""); - Matcher m = regex.matcher(output); - - if (m.find()) { - return m.group(1); - } - - return null; - } - - private static String parseNumber(String output) { - Pattern regex = Pattern.compile("class=\"tel\".*?class=\"value\">(.*?)<"); - Matcher m = regex.matcher(output); - if (m.find()) { - return m.group(1); - } - - return null; - } - private static String parseAddress(String output) { - Pattern regex = Pattern.compile("class=\"street-address\">(.*?)</div>"); - Matcher m = regex.matcher(output); - if (m.find()) { - return m.group(1).replaceAll("</?span.*?>", ""); - } - - return null; + String address = LookupUtils.firstRegexResult(output, ADDRESS_REGEX, false); + return address != null ? address.replaceAll("</?span.*?>", "") : null; } public static class ContactInfo { diff --git a/src/com/android/dialer/lookup/paginebianche/PagineBiancheReverseLookup.java b/src/com/android/dialer/lookup/paginebianche/PagineBiancheReverseLookup.java index aa8191a3a..212663828 100644 --- a/src/com/android/dialer/lookup/paginebianche/PagineBiancheReverseLookup.java +++ b/src/com/android/dialer/lookup/paginebianche/PagineBiancheReverseLookup.java @@ -21,7 +21,6 @@ import android.net.Uri; import android.provider.ContactsContract.CommonDataKinds.Phone; import android.provider.ContactsContract.CommonDataKinds.StructuredPostal; import android.provider.ContactsContract.CommonDataKinds.Website; -import android.util.Pair; import com.android.dialer.calllog.ContactInfo; import com.android.dialer.lookup.ContactBuilder; @@ -43,21 +42,15 @@ public class PagineBiancheReverseLookup extends ReverseLookup { * @param formattedNumber The formatted phone number * @return The phone number info object */ - public Pair<ContactInfo, Object> lookupNumber(Context context, - String normalizedNumber, String formattedNumber) { - PagineBiancheApi.ContactInfo info = null; - + public ContactInfo lookupNumber(Context context, + String normalizedNumber, String formattedNumber) throws IOException { if (normalizedNumber.startsWith("+") && !normalizedNumber.startsWith("+39")) { // PagineBianche only supports Italian numbers return null; } - try { - info = PagineBiancheApi.reverseLookup(context, normalizedNumber.replace("+39","")); - } catch (IOException e) { - return null; - } - + PagineBiancheApi.ContactInfo info = + PagineBiancheApi.reverseLookup(context, normalizedNumber.replace("+39","")); if (info == null) { return null; } @@ -66,24 +59,12 @@ public class PagineBiancheReverseLookup extends ReverseLookup { ContactBuilder.REVERSE_LOOKUP, normalizedNumber, formattedNumber); - ContactBuilder.Name n = new ContactBuilder.Name(); - n.displayName = info.name; - builder.setName(n); - - ContactBuilder.PhoneNumber pn = new ContactBuilder.PhoneNumber(); - pn.number = info.formattedNumber; - pn.type = Phone.TYPE_MAIN; - builder.addPhoneNumber(pn); - + builder.setName(ContactBuilder.Name.createDisplayName(info.name)); + builder.addPhoneNumber(ContactBuilder.PhoneNumber.createMainNumber(info.formattedNumber)); if (info.address != null) { - ContactBuilder.Address a = new ContactBuilder.Address(); - a.formattedAddress = info.address; - a.type = StructuredPostal.TYPE_HOME; - builder.addAddress(a); + builder.addAddress(ContactBuilder.Address.createFormattedHome(info.address)); } - // No website information because PagineBianche does not provide any - - return Pair.create(builder.build(), null); + return builder.build(); } } diff --git a/src/com/android/dialer/lookup/whitepages/WhitePagesApi.java b/src/com/android/dialer/lookup/whitepages/WhitePagesApi.java index 6497ac3be..5b266bf9c 100644 --- a/src/com/android/dialer/lookup/whitepages/WhitePagesApi.java +++ b/src/com/android/dialer/lookup/whitepages/WhitePagesApi.java @@ -16,26 +16,21 @@ package com.android.dialer.lookup.whitepages; +import android.content.Context; +import android.net.Uri; +import android.text.TextUtils; +import android.util.Log; + import com.android.dialer.lookup.LookupSettings; +import com.android.dialer.lookup.LookupUtils; + +import org.apache.http.client.methods.HttpGet; -import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.ArrayList; import java.util.regex.Matcher; import java.util.regex.Pattern; -import org.apache.http.Header; -import org.apache.http.HttpResponse; -import org.apache.http.HttpStatus; -import org.apache.http.client.HttpClient; -import org.apache.http.client.methods.HttpGet; -import org.apache.http.impl.client.DefaultHttpClient; - -import android.content.Context; -import android.net.Uri; -import android.text.Html; -import android.util.Log; - public class WhitePagesApi { private static final String TAG = WhitePagesApi.class.getSimpleName(); @@ -97,7 +92,7 @@ public class WhitePagesApi { continue; } - String name = unHtml(extractXmlRegex(section, + String name = LookupUtils.fromHtml(extractXmlRegex(section, "<span[^>]+?itemprop=\"name\">", "span")); if (name == null) { @@ -105,11 +100,11 @@ public class WhitePagesApi { } // Address - String addrCountry = unHtml(extractXmlRegex(section, + String addrCountry = LookupUtils.fromHtml(extractXmlRegex(section, "<span[^>]+?itemprop=\"addressCountry\">", "span")); - String addrState = unHtml(extractXmlRegex(section, + String addrState = LookupUtils.fromHtml(extractXmlRegex(section, "<span[^>]+?itemprop=\"addressRegion\">", "span")); - String addrCity = unHtml(extractXmlRegex(section, + String addrCity = LookupUtils.fromHtml(extractXmlRegex(section, "<span[^>]+?itemprop=\"addressLocality\">", "span")); StringBuilder sb = new StringBuilder(); @@ -145,13 +140,12 @@ public class WhitePagesApi { } String profile = httpGet(website); - String phoneNumber = unHtml(extractXmlRegex(profile, + String phoneNumber = LookupUtils.fromHtml(extractXmlRegex(profile, "<li[^>]+?class=\"no-overflow tel\">", "li")); String address = parseAddressUnitedStates(profile); if (phoneNumber == null) { - Log.e(TAG, - "Phone number is null. Either cookie is bad or regex is broken"); + Log.e(TAG, "Phone number is null. Either cookie is bad or regex is broken"); continue; } @@ -209,14 +203,6 @@ public class WhitePagesApi { return str.substring(realBegin, realEnd); } - private static String unHtml(String html) { - if (html == null) { - return null; - } - - return Html.fromHtml(html).toString().trim(); - } - public static ContactInfo reverseLookup(Context context, String number) throws IOException { String provider = LookupSettings.getReverseLookupProvider(context); @@ -257,36 +243,13 @@ public class WhitePagesApi { } private static String httpGet(String url) throws IOException { - HttpClient client = new DefaultHttpClient(); HttpGet get = new HttpGet(url); - get.setHeader("User-Agent", USER_AGENT); - if (mCookie != null) { get.setHeader("Cookie", COOKIE + "=" + mCookie); } - HttpResponse response = client.execute(get); - int status = response.getStatusLine().getStatusCode(); - - // Android's org.apache.http doesn't have the RedirectStrategy class - if (status == HttpStatus.SC_MOVED_PERMANENTLY - || status == HttpStatus.SC_MOVED_TEMPORARILY) { - Header[] headers = response.getHeaders("Location"); - - if (headers != null && headers.length != 0) { - String newUrl = headers[headers.length - 1].getValue(); - return httpGet(newUrl); - } else { - return null; - } - } - - ByteArrayOutputStream out = new ByteArrayOutputStream(); - response.getEntity().writeTo(out); - - String output = new String(out.toByteArray()); - + String output = LookupUtils.httpGet(get); // If we can find a new cookie, use it Pattern p = Pattern.compile(COOKIE_REGEX, Pattern.DOTALL); Matcher m = p.matcher(output); @@ -309,28 +272,13 @@ public class WhitePagesApi { } private static String parseNameUnitedStates(String output) { - Matcher m; - - Pattern regexName = Pattern - .compile("<h2.*?>Send (.*?)'s details to phone</h2>", - Pattern.DOTALL); - String name = null; - - m = regexName.matcher(output); - if (m.find()) { - name = m.group(1).trim(); - } + String name = LookupUtils.firstRegexResult(output, + "<h2.*?>Send (.*?)'s details to phone</h2>", true); // Use summary if name doesn't exist if (name == null) { - Pattern regexSummary = Pattern.compile( - "<span\\s*class=\"subtitle.*?>\\s*\n?(.*?)\n?\\s*</span>", - Pattern.DOTALL); - - m = regexSummary.matcher(output); - if (m.find()) { - name = m.group(1).trim(); - } + name = LookupUtils.firstRegexResult(output, + "<span\\s*class=\"subtitle.*?>\\s*\n?(.*?)\n?\\s*</span>", true); } if (name != null) { @@ -341,80 +289,36 @@ public class WhitePagesApi { } private static String parseNameCanada(String output) { - Matcher m; - - Pattern regexName = Pattern.compile( - "(<li\\s+class=\"listing_info\">.*?</li>)", Pattern.DOTALL); - String name = null; - - m = regexName.matcher(output); - if (m.find()) { - name = m.group(1).trim(); - } - - if (name != null) { - name = Html.fromHtml(name).toString().trim(); - } - - return name; + String name = LookupUtils.firstRegexResult(output, + "(<li\\s+class=\"listing_info\">.*?</li>)", true); + return LookupUtils.fromHtml(name); } private static String parseNumberUnitedStates(String output) { - Matcher m; - - Pattern regexPhoneNumber = Pattern.compile( - "Full Number:</span>([0-9\\-\\+\\(\\)]+)</li>", Pattern.DOTALL); - String phoneNumber = null; - - m = regexPhoneNumber.matcher(output); - if (m.find()) { - phoneNumber = m.group(1).trim(); - } - - return phoneNumber; + return LookupUtils.firstRegexResult(output, + "Full Number:</span>([0-9\\-\\+\\(\\)]+)</li>", true); } private static String parseAddressUnitedStates(String output) { - Matcher m; - String regexBase = "<span\\s+class=\"%s[^\"]+\"\\s*>([^<]*)</span>"; - Pattern regexAddressPrimary = Pattern.compile( - String.format(regexBase, "address-primary"), Pattern.DOTALL); - Pattern regexAddressSecondary = Pattern.compile( - String.format(regexBase, "address-secondary"), Pattern.DOTALL); - Pattern regexAddressLocation = Pattern.compile( - String.format(regexBase, "address-location"), Pattern.DOTALL); - - String addressPrimary = null; - String addressSecondary = null; - String addressLocation = null; - - m = regexAddressPrimary.matcher(output); - if (m.find()) { - addressPrimary = m.group(1).trim(); - } - - m = regexAddressSecondary.matcher(output); - if (m.find()) { - addressSecondary = m.group(1).trim(); - } - - m = regexAddressLocation.matcher(output); - if (m.find()) { - addressLocation = m.group(1).trim(); - } + String addressPrimary = LookupUtils.firstRegexResult(output, + String.format(regexBase, "address-primary"), true); + String addressSecondary = LookupUtils.firstRegexResult(output, + String.format(regexBase, "address-secondary"), true); + String addressLocation = LookupUtils.firstRegexResult(output, + String.format(regexBase, "address-location"), true); StringBuilder sb = new StringBuilder(); - if (addressPrimary != null && addressPrimary.length() != 0) { + if (!TextUtils.isEmpty(addressPrimary)) { sb.append(addressPrimary); } - if (addressSecondary != null && addressSecondary.length() != 0) { + if (!TextUtils.isEmpty(addressSecondary)) { sb.append(", "); sb.append(addressSecondary); } - if (addressLocation != null && addressLocation.length() != 0) { + if (!TextUtils.isEmpty(addressLocation)) { sb.append(", "); sb.append(addressLocation); } @@ -428,22 +332,12 @@ public class WhitePagesApi { } private static String parseAddressCanada(String output) { - Matcher m; - - Pattern regexAddress = Pattern - .compile( - "<ol class=\"result people_result\">.*?(<li\\s+class=\"col_location\">.*?</li>).*?</ol>", - Pattern.DOTALL); - String address = null; - - m = regexAddress.matcher(output); - if (m.find()) { - address = m.group(1).trim(); - } + String address = LookupUtils.firstRegexResult(output, + "<ol class=\"result people_result\">.*?(<li\\s+class=\"col_location\">.*?</li>)" + + ".*?</ol>", true); if (address != null) { - address = Html.fromHtml(address).toString().replace("\n", ", ") - .trim(); + address = LookupUtils.fromHtml(address).replace("\n", ", "); } return address; diff --git a/src/com/android/dialer/lookup/whitepages/WhitePagesPeopleLookup.java b/src/com/android/dialer/lookup/whitepages/WhitePagesPeopleLookup.java index 5de1bec82..b237327b4 100644 --- a/src/com/android/dialer/lookup/whitepages/WhitePagesPeopleLookup.java +++ b/src/com/android/dialer/lookup/whitepages/WhitePagesPeopleLookup.java @@ -51,20 +51,16 @@ public class WhitePagesPeopleLookup extends PeopleLookup { return null; } - ArrayList<ContactInfo> details = new ArrayList<ContactInfo>(); - - for (WhitePagesApi.ContactInfo info : infos) { + ContactInfo[] details = new ContactInfo[infos.length]; + for (int i = 0; i < infos.length; i++) { + WhitePagesApi.ContactInfo info = infos[i]; ContactBuilder builder = new ContactBuilder( ContactBuilder.PEOPLE_LOOKUP, null, info.formattedNumber); - ContactBuilder.Name n = new ContactBuilder.Name(); - n.displayName = info.name; - builder.setName(n); - - ContactBuilder.PhoneNumber pn = new ContactBuilder.PhoneNumber(); - pn.number = info.formattedNumber; - pn.type = Phone.TYPE_MAIN; - builder.addPhoneNumber(pn); + builder.setName(ContactBuilder.Name.createDisplayName(info.name)); + builder.addPhoneNumber( + ContactBuilder.PhoneNumber.createMainNumber(info.formattedNumber)); + builder.addWebsite(ContactBuilder.WebsiteUrl.createProfile(info.website)); if (info.address != null || info.city != null) { ContactBuilder.Address a = new ContactBuilder.Address(); @@ -74,18 +70,9 @@ public class WhitePagesPeopleLookup extends PeopleLookup { builder.addAddress(a); } - ContactBuilder.WebsiteUrl w = new ContactBuilder.WebsiteUrl(); - w.url = info.website; - w.type = Website.TYPE_PROFILE; - builder.addWebsite(w); - - details.add(builder.build()); + details[i] = builder.build(); } - if (details.size() > 0) { - return details.toArray(new ContactInfo[details.size()]); - } else { - return null; - } + return details; } } diff --git a/src/com/android/dialer/lookup/whitepages/WhitePagesReverseLookup.java b/src/com/android/dialer/lookup/whitepages/WhitePagesReverseLookup.java index 470758b9d..375c63f35 100644 --- a/src/com/android/dialer/lookup/whitepages/WhitePagesReverseLookup.java +++ b/src/com/android/dialer/lookup/whitepages/WhitePagesReverseLookup.java @@ -21,12 +21,6 @@ import com.android.dialer.lookup.ContactBuilder; import com.android.dialer.lookup.ReverseLookup; import android.content.Context; -import android.net.Uri; -import android.util.Pair; - -import android.provider.ContactsContract.CommonDataKinds.Phone; -import android.provider.ContactsContract.CommonDataKinds.StructuredPostal; -import android.provider.ContactsContract.CommonDataKinds.Website; import java.io.IOException; @@ -45,16 +39,9 @@ public class WhitePagesReverseLookup extends ReverseLookup { * @param formattedNumber The formatted phone number * @return The phone number info object */ - public Pair<ContactInfo, Object> lookupNumber(Context context, - String normalizedNumber, String formattedNumber) { - WhitePagesApi.ContactInfo info = null; - - try { - info = WhitePagesApi.reverseLookup(context, normalizedNumber); - } catch (IOException e) { - return null; - } - + public ContactInfo lookupNumber(Context context, + String normalizedNumber, String formattedNumber) throws IOException { + WhitePagesApi.ContactInfo info = WhitePagesApi.reverseLookup(context, normalizedNumber); if (info == null || info.name == null) { return null; } @@ -63,27 +50,13 @@ public class WhitePagesReverseLookup extends ReverseLookup { ContactBuilder.REVERSE_LOOKUP, normalizedNumber, formattedNumber); - ContactBuilder.Name n = new ContactBuilder.Name(); - n.displayName = info.name; - builder.setName(n); - - ContactBuilder.PhoneNumber pn = new ContactBuilder.PhoneNumber(); - pn.number = info.formattedNumber; - pn.type = Phone.TYPE_MAIN; - builder.addPhoneNumber(pn); - + builder.setName(ContactBuilder.Name.createDisplayName(info.name)); + builder.addPhoneNumber(ContactBuilder.PhoneNumber.createMainNumber(info.formattedNumber)); + builder.addWebsite(ContactBuilder.WebsiteUrl.createProfile(info.website)); if (info.address != null) { - ContactBuilder.Address a = new ContactBuilder.Address(); - a.formattedAddress = info.address; - a.type = StructuredPostal.TYPE_HOME; - builder.addAddress(a); + builder.addAddress(ContactBuilder.Address.createFormattedHome(info.address)); } - ContactBuilder.WebsiteUrl w = new ContactBuilder.WebsiteUrl(); - w.url = info.website; - w.type = Website.TYPE_PROFILE; - builder.addWebsite(w); - - return Pair.create(builder.build(), null); + return builder.build(); } } diff --git a/src/com/android/dialer/lookup/yellowpages/YellowPagesApi.java b/src/com/android/dialer/lookup/yellowpages/YellowPagesApi.java index 75078b92f..b52a67b1f 100644 --- a/src/com/android/dialer/lookup/yellowpages/YellowPagesApi.java +++ b/src/com/android/dialer/lookup/yellowpages/YellowPagesApi.java @@ -16,25 +16,18 @@ package com.android.dialer.lookup.yellowpages; +import android.content.Context; +import android.text.TextUtils; + import com.android.dialer.lookup.LookupSettings; +import com.android.dialer.lookup.LookupUtils; -import android.content.Context; -import android.text.Html; +import org.apache.http.client.methods.HttpGet; -import java.io.ByteArrayOutputStream; import java.io.IOException; -import java.net.MalformedURLException; -import java.net.URL; import java.util.regex.Matcher; import java.util.regex.Pattern; -import org.apache.http.Header; -import org.apache.http.HttpResponse; -import org.apache.http.HttpStatus; -import org.apache.http.client.HttpClient; -import org.apache.http.client.methods.HttpGet; -import org.apache.http.impl.client.DefaultHttpClient; - public class YellowPagesApi { private static final String TAG = YellowPagesApi.class.getSimpleName(); @@ -61,81 +54,33 @@ public class YellowPagesApi { } private void fetchPage() throws IOException { - mOutput = httpGet(mLookupUrl + mNumber); - } - - private String httpGet(String url) throws IOException { - HttpClient client = new DefaultHttpClient(); - HttpGet get = new HttpGet(url); - - HttpResponse response = client.execute(get); - int status = response.getStatusLine().getStatusCode(); - - // Android's org.apache.http doesn't have the RedirectStrategy class - if (status == HttpStatus.SC_MOVED_PERMANENTLY - || status == HttpStatus.SC_MOVED_TEMPORARILY) { - Header[] headers = response.getHeaders("Location"); - - if (headers != null && headers.length != 0) { - String newUrl = headers[headers.length - 1].getValue(); - return httpGet(newUrl); - } else { - return null; - } - } - - ByteArrayOutputStream out = new ByteArrayOutputStream(); - response.getEntity().writeTo(out); - - return new String(out.toByteArray()); + mOutput = LookupUtils.httpGet(new HttpGet(mLookupUrl + mNumber)); } private String getPhotoUrl(String website) throws IOException { - String output = httpGet(website); - - Matcher m; - - Pattern regexGallery = Pattern.compile( - "href=\"([^\"]+gallery\\?lid=[^\"]+)\"", Pattern.DOTALL); - - String galleryUrl = null; - - m = regexGallery.matcher(output); - if (m.find()) { - galleryUrl = "http://www.yellowpages.com" + m.group(1).trim(); - } - - if (galleryUrl == null) { + String output = LookupUtils.httpGet(new HttpGet(website)); + String galleryRef = LookupUtils.firstRegexResult(output, + "href=\"([^\"]+gallery\\?lid=[^\"]+)\"", true); + if (galleryRef == null) { return null; } // Get first image + HttpGet get = new HttpGet("http://www.yellowpages.com" + galleryRef); + output = LookupUtils.httpGet(get); - output = httpGet(galleryUrl); - - Pattern regexPhoto = Pattern.compile( - "\"type\":\"image\",\"src\":\"([^\"]+)\"", Pattern.DOTALL); - - String photoUrl = null; - - m = regexPhoto.matcher(output); - if (m.find()) { - photoUrl = m.group(1).trim(); - } - - return photoUrl; + return LookupUtils.firstRegexResult(output, + "\"type\":\"image\",\"src\":\"([^\"]+)\"", true); } private String[] parseNameWebsiteUnitedStates() { - Matcher m; - Pattern regexNameAndWebsite = Pattern.compile( "<a href=\"([^>]+?)\"[^>]+?class=\"url[^>]+?>([^<]+)</a>", Pattern.DOTALL); String name = null; String website = null; - m = regexNameAndWebsite.matcher(mOutput); + Matcher m = regexNameAndWebsite.matcher(mOutput); if (m.find()) { website = m.group(1).trim(); name = m.group(2).trim(); @@ -145,8 +90,6 @@ public class YellowPagesApi { } private String[] parseNameWebsiteCanada() { - Matcher m; - Pattern regexNameAndWebsite = Pattern.compile( "class=\"ypgListingTitleLink utagLink\".*?href=\"(.*?)\">" + "(<span\\s+class=\"listingTitle\">.*?</span>)", @@ -154,14 +97,10 @@ public class YellowPagesApi { String name = null; String website = null; - m = regexNameAndWebsite.matcher(mOutput); + Matcher m = regexNameAndWebsite.matcher(mOutput); if (m.find()) { website = m.group(1).trim(); - name = m.group(2).trim(); - } - - if (name != null) { - name = Html.fromHtml(name).toString().trim(); + name = LookupUtils.fromHtml(m.group(2).trim()); } if (website != null) { @@ -172,90 +111,43 @@ public class YellowPagesApi { } private String parseNumberUnitedStates() { - Matcher m; - - Pattern regexPhoneNumber = Pattern.compile( - "business-phone.*?>\n*([^\n<]+)\n*<", Pattern.DOTALL); - String phoneNumber = null; - - m = regexPhoneNumber.matcher(mOutput); - if (m.find()) { - phoneNumber = m.group(1).trim(); - } - - return phoneNumber; + return LookupUtils.firstRegexResult(mOutput, + "business-phone.*?>\n*([^\n<]+)\n*<", true); } private String parseNumberCanada() { - Matcher m; - - Pattern regexPhoneNumber = Pattern.compile( - "<div\\s+class=\"phoneNumber\">(.*?)</div>", Pattern.DOTALL); - String phoneNumber = null; - - m = regexPhoneNumber.matcher(mOutput); - if (m.find()) { - phoneNumber = m.group(1).trim(); - } - - return phoneNumber; + return LookupUtils.firstRegexResult(mOutput, + "<div\\s+class=\"phoneNumber\">(.*?)</div>", true); } private String parseAddressUnitedStates() { - Matcher m; - - Pattern regexAddressStreet = Pattern.compile( - "street-address.*?>\n*([^\n<]+)\n*<", Pattern.DOTALL); - Pattern regexAddressCity = Pattern.compile( - "locality.*?>\n*([^\n<]+)\n*<", Pattern.DOTALL); - Pattern regexAddressState = Pattern.compile( - "region.*?>\n*([^\n<]+)\n*<", Pattern.DOTALL); - Pattern regexAddressZip = Pattern.compile( - "postal-code.*?>\n*([^\n<]+)\n*<", Pattern.DOTALL); - - String addressStreet = null; - String addressCity = null; - String addressState = null; - String addressZip = null; - - m = regexAddressStreet.matcher(mOutput); - if (m.find()) { - addressStreet = m.group(1).trim(); - if (addressStreet.endsWith(",")) { - addressStreet = addressStreet.substring(0, - addressStreet.length() - 1); - } + String addressStreet = LookupUtils.firstRegexResult(mOutput, + "street-address.*?>\n*([^\n<]+)\n*<", true); + if (addressStreet != null && addressStreet.endsWith(",")) { + addressStreet = addressStreet.substring(0, addressStreet.length() - 1); } - m = regexAddressCity.matcher(mOutput); - if (m.find()) { - addressCity = m.group(1).trim(); - } - - m = regexAddressState.matcher(mOutput); - if (m.find()) { - addressState = m.group(1).trim(); - } - - m = regexAddressZip.matcher(mOutput); - if (m.find()) { - addressZip = m.group(1).trim(); - } + String addressCity = LookupUtils.firstRegexResult(mOutput, + "locality.*?>\n*([^\n<]+)\n*<", true); + String addressState = LookupUtils.firstRegexResult(mOutput, + "region.*?>\n*([^\n<]+)\n*<", true); + String addressZip = LookupUtils.firstRegexResult(mOutput, + "postal-code.*?>\n*([^\n<]+)\n*<", true); StringBuilder sb = new StringBuilder(); - if (addressStreet != null && addressStreet.length() != 0) { + if (!TextUtils.isEmpty(addressStreet)) { sb.append(addressStreet); } - if (addressCity != null && addressCity.length() != 0) { + if (!TextUtils.isEmpty(addressCity)) { sb.append(", "); sb.append(addressCity); } - if (addressState != null && addressState.length() != 0) { + if (!TextUtils.isEmpty(addressState)) { sb.append(", "); sb.append(addressState); } - if (addressZip != null && addressZip.length() != 0) { + if (!TextUtils.isEmpty(addressZip)) { sb.append(", "); sb.append(addressZip); } @@ -269,22 +161,9 @@ public class YellowPagesApi { } private String parseAddressCanada() { - Matcher m; - - Pattern regexAddress = Pattern.compile( - "<div\\s+class=\"address\">(.*?)</div>", Pattern.DOTALL); - String address = null; - - m = regexAddress.matcher(mOutput); - if (m.find()) { - address = m.group(1).trim(); - } - - if (address != null) { - address = Html.fromHtml(address).toString().trim(); - } - - return address; + String address = LookupUtils.firstRegexResult(mOutput, + "<div\\s+class=\"address\">(.*?)</div>", true); + return LookupUtils.fromHtml(address); } private void buildContactInfo() throws IOException { diff --git a/src/com/android/dialer/lookup/yellowpages/YellowPagesReverseLookup.java b/src/com/android/dialer/lookup/yellowpages/YellowPagesReverseLookup.java index 6e7b44df9..eaaee5779 100644 --- a/src/com/android/dialer/lookup/yellowpages/YellowPagesReverseLookup.java +++ b/src/com/android/dialer/lookup/yellowpages/YellowPagesReverseLookup.java @@ -25,12 +25,8 @@ import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.net.Uri; -import android.util.Log; -import android.util.Pair; - -import android.provider.ContactsContract.CommonDataKinds.Phone; import android.provider.ContactsContract.CommonDataKinds.StructuredPostal; -import android.provider.ContactsContract.CommonDataKinds.Website; +import android.util.Log; import org.apache.http.HttpResponse; import org.apache.http.HttpStatus; @@ -54,9 +50,8 @@ public class YellowPagesReverseLookup extends ReverseLookup { * * @param context The application context * @param uri The image URI - * @param data Extra data (a authentication token, perhaps) */ - public Bitmap lookupImage(Context context, Uri uri, Object data) { + public Bitmap lookupImage(Context context, Uri uri) { if (uri == null) { throw new NullPointerException("URI is null"); } @@ -107,16 +102,10 @@ public class YellowPagesReverseLookup extends ReverseLookup { * @param formattedNumber The formatted phone number * @return The phone number info object */ - public Pair<ContactInfo, Object> lookupNumber(Context context, - String normalizedNumber, String formattedNumber) { + public ContactInfo lookupNumber(Context context, + String normalizedNumber, String formattedNumber) throws IOException { YellowPagesApi ypa = new YellowPagesApi(context, normalizedNumber); - YellowPagesApi.ContactInfo info = null; - - try { - info = ypa.getContactInfo(); - } catch (IOException e) { - return null; - } + YellowPagesApi.ContactInfo info = ypa.getContactInfo(); if (info.name == null) { return null; @@ -126,14 +115,9 @@ public class YellowPagesReverseLookup extends ReverseLookup { ContactBuilder.REVERSE_LOOKUP, normalizedNumber, formattedNumber); - ContactBuilder.Name n = new ContactBuilder.Name(); - n.displayName = info.name; - builder.setName(n); - - ContactBuilder.PhoneNumber pn = new ContactBuilder.PhoneNumber(); - pn.number = info.formattedNumber; - pn.type = Phone.TYPE_MAIN; - builder.addPhoneNumber(pn); + builder.setName(ContactBuilder.Name.createDisplayName(info.name)); + builder.addPhoneNumber(ContactBuilder.PhoneNumber.createMainNumber(info.formattedNumber)); + builder.addWebsite(ContactBuilder.WebsiteUrl.createProfile(info.website)); if (info.address != null) { ContactBuilder.Address a = new ContactBuilder.Address(); @@ -142,17 +126,12 @@ public class YellowPagesReverseLookup extends ReverseLookup { builder.addAddress(a); } - ContactBuilder.WebsiteUrl w = new ContactBuilder.WebsiteUrl(); - w.url = info.website; - w.type = Website.TYPE_PROFILE; - builder.addWebsite(w); - if (info.photoUrl != null) { builder.setPhotoUri(info.photoUrl); } else { builder.setPhotoUri(ContactBuilder.PHOTO_URI_BUSINESS); } - return Pair.create(builder.build(), null); + return builder.build(); } } diff --git a/src/com/android/dialer/lookup/zabasearch/ZabaSearchApi.java b/src/com/android/dialer/lookup/zabasearch/ZabaSearchApi.java index 76fc414f5..2e8b65abd 100644 --- a/src/com/android/dialer/lookup/zabasearch/ZabaSearchApi.java +++ b/src/com/android/dialer/lookup/zabasearch/ZabaSearchApi.java @@ -16,15 +16,13 @@ package com.android.dialer.lookup.zabasearch; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.util.regex.Matcher; -import java.util.regex.Pattern; +import android.text.TextUtils; + +import com.android.dialer.lookup.LookupUtils; -import org.apache.http.HttpResponse; -import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; -import org.apache.http.impl.client.DefaultHttpClient; + +import java.io.IOException; public class ZabaSearchApi { private static final String TAG = ZabaSearchApi.class.getSimpleName(); @@ -40,93 +38,40 @@ public class ZabaSearchApi { } private void fetchPage() throws IOException { - mOutput = httpGet(LOOKUP_URL + mNumber); - } - - private String httpGet(String url) throws IOException { - HttpClient client = new DefaultHttpClient(); - HttpGet get = new HttpGet(url); - - HttpResponse response = client.execute(get); - - ByteArrayOutputStream out = new ByteArrayOutputStream(); - response.getEntity().writeTo(out); - - return new String(out.toByteArray()); + mOutput = LookupUtils.httpGet(new HttpGet(LOOKUP_URL + mNumber)); } private void buildContactInfo() { - Matcher m; - // Name - Pattern regexName = Pattern.compile( - "itemprop=\"?name\"?>([^<]+)<", Pattern.DOTALL); - String name = null; - - m = regexName.matcher(mOutput); - if (m.find()) { - name = m.group(1).trim(); - } - + String name = LookupUtils.firstRegexResult(mOutput, + "itemprop=\"?name\"?>([^<]+)<", true); // Formatted phone number - Pattern regexPhoneNumber = Pattern.compile( - "itemprop=\"?telephone\"?>([^<]+)<", Pattern.DOTALL); - String phoneNumber = null; - - m = regexPhoneNumber.matcher(mOutput); - if (m.find()) { - phoneNumber = m.group(1).trim(); - } - + String phoneNumber = LookupUtils.firstRegexResult(mOutput, + "itemprop=\"?telephone\"?>([^<]+)<", true); // Address - Pattern regexStreet = Pattern.compile( - "itemprop=\"?streetAddress\"?>([^<]+?)( )*<", Pattern.DOTALL); - Pattern regexCity = Pattern.compile( - "itemprop=\"?addressLocality\"?>([^<]+)<", Pattern.DOTALL); - Pattern regexState = Pattern.compile( - "itemprop=\"?addressRegion\"?>([^<]+)<", Pattern.DOTALL); - Pattern regexZip = Pattern.compile( - "itemprop=\"?postalCode\"?>([^<]+)<", Pattern.DOTALL); - - String addressStreet = null; - String addressCity = null; - String addressState = null; - String addressZip = null; - - m = regexStreet.matcher(mOutput); - if (m.find()) { - addressStreet = m.group(1).trim(); - } - - m = regexCity.matcher(mOutput); - if (m.find()) { - addressCity = m.group(1).trim(); - } - - m = regexState.matcher(mOutput); - if (m.find()) { - addressState = m.group(1).trim(); - } - - m = regexZip.matcher(mOutput); - if (m.find()) { - addressZip = m.group(1).trim(); - } + String addressStreet = LookupUtils.firstRegexResult(mOutput, + "itemprop=\"?streetAddress\"?>([^<]+?)( )*<", true); + String addressCity = LookupUtils.firstRegexResult(mOutput, + "itemprop=\"?addressLocality\"?>([^<]+)<", true); + String addressState = LookupUtils.firstRegexResult(mOutput, + "itemprop=\"?addressRegion\"?>([^<]+)<", true); + String addressZip = LookupUtils.firstRegexResult(mOutput, + "itemprop=\"?postalCode\"?>([^<]+)<", true); StringBuilder sb = new StringBuilder(); - if (addressStreet != null && addressStreet.length() != 0) { + if (!TextUtils.isEmpty(addressStreet)) { sb.append(addressStreet); } - if (addressCity != null && addressCity.length() != 0) { + if (!TextUtils.isEmpty(addressCity)) { sb.append(", "); sb.append(addressCity); } - if (addressState != null && addressState.length() != 0) { + if (!TextUtils.isEmpty(addressState)) { sb.append(", "); sb.append(addressState); } - if (addressZip != null && addressZip.length() != 0) { + if (!TextUtils.isEmpty(addressZip)) { sb.append(", "); sb.append(addressZip); } diff --git a/src/com/android/dialer/lookup/zabasearch/ZabaSearchReverseLookup.java b/src/com/android/dialer/lookup/zabasearch/ZabaSearchReverseLookup.java index e0395214a..afe9961ac 100644 --- a/src/com/android/dialer/lookup/zabasearch/ZabaSearchReverseLookup.java +++ b/src/com/android/dialer/lookup/zabasearch/ZabaSearchReverseLookup.java @@ -21,11 +21,6 @@ import com.android.dialer.lookup.ContactBuilder; import com.android.dialer.lookup.ReverseLookup; import android.content.Context; -import android.util.Pair; - -import android.provider.ContactsContract.CommonDataKinds.Phone; -import android.provider.ContactsContract.CommonDataKinds.StructuredPostal; -import android.provider.ContactsContract.CommonDataKinds.Website; import java.io.IOException; @@ -44,17 +39,10 @@ public class ZabaSearchReverseLookup extends ReverseLookup { * @param formattedNumber The formatted phone number * @return The phone number info object */ - public Pair<ContactInfo, Object> lookupNumber(Context context, - String normalizedNumber, String formattedNumber) { + public ContactInfo lookupNumber(Context context, + String normalizedNumber, String formattedNumber) throws IOException { ZabaSearchApi zsa = new ZabaSearchApi(normalizedNumber); - ZabaSearchApi.ContactInfo info = null; - - try { - info = zsa.getContactInfo(); - } catch (IOException e) { - return null; - } - + ZabaSearchApi.ContactInfo info = zsa.getContactInfo(); if (info.name == null) { return null; } @@ -63,27 +51,13 @@ public class ZabaSearchReverseLookup extends ReverseLookup { ContactBuilder.REVERSE_LOOKUP, normalizedNumber, formattedNumber); - ContactBuilder.Name n = new ContactBuilder.Name(); - n.displayName = info.name; - builder.setName(n); - - ContactBuilder.PhoneNumber pn = new ContactBuilder.PhoneNumber(); - pn.number = info.formattedNumber; - pn.type = Phone.TYPE_MAIN; - builder.addPhoneNumber(pn); - + builder.setName(ContactBuilder.Name.createDisplayName(info.name)); + builder.addPhoneNumber(ContactBuilder.PhoneNumber.createMainNumber(info.formattedNumber)); + builder.addWebsite(ContactBuilder.WebsiteUrl.createProfile(info.website)); if (info.address != null) { - ContactBuilder.Address a = new ContactBuilder.Address(); - a.formattedAddress = info.address; - a.type = StructuredPostal.TYPE_HOME; - builder.addAddress(a); + builder.addAddress(ContactBuilder.Address.createFormattedHome(info.address)); } - ContactBuilder.WebsiteUrl w = new ContactBuilder.WebsiteUrl(); - w.url = info.website; - w.type = Website.TYPE_PROFILE; - builder.addWebsite(w); - - return Pair.create(builder.build(), null); + return builder.build(); } } |