diff options
3 files changed, 39 insertions, 33 deletions
diff --git a/src/com/android/dialer/lookup/auskunft/AuskunftApi.java b/src/com/android/dialer/lookup/auskunft/AuskunftApi.java index 91c2ecd4a..7b7c98cce 100644 --- a/src/com/android/dialer/lookup/auskunft/AuskunftApi.java +++ b/src/com/android/dialer/lookup/auskunft/AuskunftApi.java @@ -25,6 +25,7 @@ import com.android.dialer.lookup.ContactBuilder; import com.android.dialer.lookup.LookupUtils; import java.io.IOException; +import java.util.ArrayList; import java.util.List; public final class AuskunftApi { @@ -34,7 +35,7 @@ public final class AuskunftApi { "https://auskunft.at/suche"; private static final String SEARCH_RESULTS_REGEX = - "(?i)class=[\"']?search-list(.*?)class=[\"']?pagination"; + "(?i)<section[\\s]+class=[\"']?search-entry(.*?)?</section"; private static final String NAME_REGEX = "(?i)<h1[\\s]+itemprop=[\"']?name[\"']?>(.*?)</h1"; private static final String NUMBER_REGEX = @@ -47,7 +48,7 @@ public final class AuskunftApi { private AuskunftApi() { } - public static ContactInfo[] query(String filter, int lookupType, String normalizedNumber, + public static List<ContactInfo> query(String filter, int lookupType, String normalizedNumber, String formattedNumber) throws IOException { // build URI Uri uri = Uri.parse(PEOPLE_LOOKUP_URL) @@ -55,38 +56,36 @@ public final class AuskunftApi { .appendQueryParameter("query", filter) .build(); - // get search results from HTML to speedup subsequent matching and avoid errors - String output = LookupUtils.firstRegexResult(LookupUtils.httpGet(uri.toString(), null), - SEARCH_RESULTS_REGEX, true); + // get all search entry sections + List<String> entries = LookupUtils.allRegexResults(LookupUtils.httpGet(uri.toString(), + null), SEARCH_RESULTS_REGEX, true); - // get all names, abort lookup if nothing found - List<String> names = LookupUtils.allRegexResults(output, NAME_REGEX, true); - if (names == null || names.isEmpty()) { + // abort lookup if nothing found + if (entries == null || entries.isEmpty()) { Log.w(TAG, "nothing found"); return null; } - // get all numbers and addresses - List<String> numbers = LookupUtils.allRegexResults(output, NUMBER_REGEX, true); - List<String> addresses = LookupUtils.allRegexResults(output, ADDRESS_REGEX, true); - - // abort on invalid data (all the data arrays must have the same size because we query - // all the results at once and expect them to be in the right order) - if (numbers == null || addresses == null || names.size() != numbers.size() || - numbers.size() != addresses.size()) { - Log.w(TAG, "names, numbers and address data do not match"); - return null; - } - - // build and return contact list - ContactInfo[] details = new ContactInfo[names.size()]; - for (int i = 0; i < names.size(); i++) { + // build response by iterating through the search entries and parsing their HTML data + List<ContactInfo> infos = new ArrayList<ContactInfo>(); + for (String entry : entries) { + // parse wanted data and replace null values + String name = replaceNullResult(LookupUtils.firstRegexResult(entry, NAME_REGEX, true)); + String address = replaceNullResult(LookupUtils.firstRegexResult( + entry, ADDRESS_REGEX, true)); + String number = replaceNullResult(LookupUtils.firstRegexResult( + entry, NUMBER_REGEX, true)); + // ignore entry if name or number is empty (should not occur) + // missing addresses won't be a problem (but do occur) + if (name.isEmpty() || number.isEmpty()) { + continue; + } // figure out if we have a business contact - boolean isBusiness = names.get(i).contains(BUSINESS_IDENTIFIER); + boolean isBusiness = name.contains(BUSINESS_IDENTIFIER); // cleanup results - String name = cleanupResult(names.get(i)); - String number = cleanupResult(numbers.get(i)); - String address = cleanupResult(addresses.get(i)); + name = cleanupResult(name); + number = cleanupResult(number); + address = cleanupResult(address); // set normalized and formatted number if we're not doing a reverse lookup if (lookupType != ContactBuilder.REVERSE_LOOKUP) { normalizedNumber = formattedNumber = number; @@ -100,9 +99,9 @@ public final class AuskunftApi { builder.addWebsite(ContactBuilder.WebsiteUrl.createProfile(uri.toString())); builder.addAddress(ContactBuilder.Address.createFormattedHome(address)); builder.setIsBusiness(isBusiness); - details[i] = builder.build(); + infos.add(builder.build()); } - return details; + return infos; } private static String cleanupResult(String result) { @@ -119,4 +118,8 @@ public final class AuskunftApi { return result; } + + private static String replaceNullResult(String result) { + return (result == null) ? "" : result; + } } diff --git a/src/com/android/dialer/lookup/auskunft/AuskunftPeopleLookup.java b/src/com/android/dialer/lookup/auskunft/AuskunftPeopleLookup.java index 2898fc64d..970f2d0ef 100644 --- a/src/com/android/dialer/lookup/auskunft/AuskunftPeopleLookup.java +++ b/src/com/android/dialer/lookup/auskunft/AuskunftPeopleLookup.java @@ -24,6 +24,7 @@ import com.android.dialer.lookup.ContactBuilder; import com.android.dialer.lookup.PeopleLookup; import java.io.IOException; +import java.util.List; public class AuskunftPeopleLookup extends PeopleLookup { private static final String TAG = AuskunftPeopleLookup.class.getSimpleName(); @@ -33,12 +34,13 @@ public class AuskunftPeopleLookup extends PeopleLookup { @Override public ContactInfo[] lookup(Context context, String filter) { - ContactInfo[] infos = null; + List<ContactInfo> infos = null; try { infos = AuskunftApi.query(filter, ContactBuilder.PEOPLE_LOOKUP, null, null); } catch (IOException e) { Log.e(TAG, "People lookup failed", e); } - return infos; + return (infos != null && !infos.isEmpty()) + ? infos.toArray(new ContactInfo[infos.size()]) : null; } } diff --git a/src/com/android/dialer/lookup/auskunft/AuskunftReverseLookup.java b/src/com/android/dialer/lookup/auskunft/AuskunftReverseLookup.java index 894fd3b4c..383b4d53d 100644 --- a/src/com/android/dialer/lookup/auskunft/AuskunftReverseLookup.java +++ b/src/com/android/dialer/lookup/auskunft/AuskunftReverseLookup.java @@ -23,6 +23,7 @@ import com.android.dialer.lookup.ContactBuilder; import com.android.dialer.lookup.ReverseLookup; import java.io.IOException; +import java.util.List; public class AuskunftReverseLookup extends ReverseLookup { private static final String TAG = AuskunftReverseLookup.class.getSimpleName(); @@ -39,8 +40,8 @@ public class AuskunftReverseLookup extends ReverseLookup { } // query the API and return null if nothing found or general error - ContactInfo[] infos = AuskunftApi.query(normalizedNumber, ContactBuilder.REVERSE_LOOKUP, + List<ContactInfo> infos = AuskunftApi.query(normalizedNumber, ContactBuilder.REVERSE_LOOKUP, normalizedNumber, formattedNumber); - return (infos != null && infos.length != 0) ? infos[0] : null; + return (infos != null && !infos.isEmpty()) ? infos.get(0) : null; } } |
