Issue 1638 support for several URLs in contact info, and some incidental test cleanup too

git-svn-id: https://zxing.googlecode.com/svn/trunk@2583 59b500cc-1b3d-0410-9834-0bbf25fbcc57
This commit is contained in:
srowen@gmail.com 2013-03-03 17:06:00 +00:00
parent 86671ab226
commit 33c5bd074b
15 changed files with 56 additions and 52 deletions

View file

@ -36,7 +36,7 @@ abstract class ContactEncoder {
Iterable<String> addresses,
Iterable<String> phones,
Iterable<String> emails,
String url,
Iterable<String> urls,
String note);
/**
@ -78,7 +78,7 @@ abstract class ContactEncoder {
Collection<String> uniques = new HashSet<String>(2);
for (String value : values) {
String trimmed = trim(value);
if (trimmed != null && !uniques.contains(trimmed)) {
if (trimmed != null && trimmed.length() > 0 && !uniques.contains(trimmed)) {
newContents.append(prefix).append(':').append(fieldFormatter.format(trimmed)).append(terminator);
String display = formatter == null ? trimmed : formatter.format(trimmed);
newDisplayContents.append(display).append('\n');

View file

@ -44,7 +44,7 @@ final class MECARDContactEncoder extends ContactEncoder {
Iterable<String> addresses,
Iterable<String> phones,
Iterable<String> emails,
String url,
Iterable<String> urls,
String note) {
StringBuilder newContents = new StringBuilder(100);
newContents.append("MECARD:");
@ -64,7 +64,7 @@ final class MECARDContactEncoder extends ContactEncoder {
}
});
appendUpToUnique(newContents, newDisplayContents, "EMAIL", emails, Integer.MAX_VALUE, null);
append(newContents, newDisplayContents, "URL", url);
appendUpToUnique(newContents, newDisplayContents, "URL", urls, Integer.MAX_VALUE, null);
append(newContents, newDisplayContents, "NOTE", note);
newContents.append(';');
return new String[] { newContents.toString(), newDisplayContents.toString() };

View file

@ -259,6 +259,7 @@ final class QRCodeEncoder {
emails.add(bundle.getString(Contents.EMAIL_KEYS[x]));
}
String url = bundle.getString(Contents.URL_KEY);
Collection<String> urls = url == null ? null : Collections.singletonList(url);
String note = bundle.getString(Contents.NOTE_KEY);
ContactEncoder mecardEncoder = useVCard ? new VCardContactEncoder() : new MECARDContactEncoder();
@ -267,7 +268,7 @@ final class QRCodeEncoder {
Collections.singleton(address),
phones,
emails,
url,
urls,
note);
// Make sure we've encoded at least one field.
if (encoded[1].length() > 0) {
@ -300,7 +301,7 @@ final class QRCodeEncoder {
toIterable(contact.getAddresses()),
toIterable(contact.getPhoneNumbers()),
toIterable(contact.getEmails()),
contact.getURL(),
toIterable(contact.getURLs()),
null);
// Make sure we've encoded at least one field.
if (encoded[1].length() > 0) {

View file

@ -43,7 +43,7 @@ final class VCardContactEncoder extends ContactEncoder {
Iterable<String> addresses,
Iterable<String> phones,
Iterable<String> emails,
String url,
Iterable<String> urls,
String note) {
StringBuilder newContents = new StringBuilder(100);
newContents.append("BEGIN:VCARD").append(TERMINATOR);
@ -59,7 +59,7 @@ final class VCardContactEncoder extends ContactEncoder {
}
});
appendUpToUnique(newContents, newDisplayContents, "EMAIL", emails, Integer.MAX_VALUE, null);
append(newContents, newDisplayContents, "URL", url);
appendUpToUnique(newContents, newDisplayContents, "URL", urls, Integer.MAX_VALUE, null);
append(newContents, newDisplayContents, "NOTE", note);
newContents.append("END:VCARD").append(TERMINATOR);
return new String[] { newContents.toString(), newDisplayContents.toString() };

View file

@ -135,7 +135,7 @@ public final class AddressBookResultHandler extends ResultHandler {
address1Type,
addressResult.getOrg(),
addressResult.getTitle(),
addressResult.getURL(),
addressResult.getURLs(),
addressResult.getBirthday(),
addressResult.getGeo());
break;
@ -191,7 +191,7 @@ public final class AddressBookResultHandler extends ResultHandler {
}
}
ParsedResult.maybeAppend(result.getEmails(), contents);
ParsedResult.maybeAppend(result.getURL(), contents);
ParsedResult.maybeAppend(result.getURLs(), contents);
String birthday = result.getBirthday();
if (birthday != null && birthday.length() > 0) {

View file

@ -225,7 +225,7 @@ public abstract class ResultHandler {
String addressType,
String org,
String title,
String url,
String[] urls,
String birthday,
String[] geo) {
@ -260,14 +260,23 @@ public abstract class ResultHandler {
// No field for URL, birthday; use notes
StringBuilder aggregatedNotes = new StringBuilder();
for (String aNote : new String[] { url, birthday, note }) {
if (urls != null) {
for (String url : urls) {
if (url != null && url.length() > 0) {
aggregatedNotes.append('\n').append(url);
}
}
}
for (String aNote : new String[] { birthday, note }) {
if (aNote != null) {
aggregatedNotes.append('\n').append(aNote);
}
}
if (nicknames != null) {
for (String nickname : nicknames) {
aggregatedNotes.append('\n').append(nickname);
if (nickname != null && nickname.length() > 0) {
aggregatedNotes.append('\n').append(nickname);
}
}
}
if (geo != null) {

View file

@ -56,7 +56,7 @@ public final class AddressBookDoCoMoResultParser extends AbstractDoCoMoResultPar
// No reason to throw out the whole card because the birthday is formatted wrong.
birthday = null;
}
String url = matchSingleDoCoMoPrefixedField("URL:", rawText, true);
String[] urls = matchDoCoMoPrefixedField("URL:", rawText, true);
// Although ORG may not be strictly legal in MECARD, it does exist in VCARD and we might as well
// honor it when found in the wild.
@ -76,7 +76,7 @@ public final class AddressBookDoCoMoResultParser extends AbstractDoCoMoResultPar
org,
birthday,
null,
url,
urls,
null);
}

View file

@ -35,7 +35,7 @@ public final class AddressBookParsedResult extends ParsedResult {
private final String org;
private final String birthday;
private final String title;
private final String url;
private final String[] urls;
private final String[] geo;
public AddressBookParsedResult(String[] names,
@ -77,7 +77,7 @@ public final class AddressBookParsedResult extends ParsedResult {
String org,
String birthday,
String title,
String url,
String[] urls,
String[] geo) {
super(ParsedResultType.ADDRESSBOOK);
this.names = names;
@ -94,7 +94,7 @@ public final class AddressBookParsedResult extends ParsedResult {
this.org = org;
this.birthday = birthday;
this.title = title;
this.url = url;
this.urls = urls;
this.geo = geo;
}
@ -168,8 +168,8 @@ public final class AddressBookParsedResult extends ParsedResult {
return org;
}
public String getURL() {
return url;
public String[] getURLs() {
return urls;
}
/**
@ -198,7 +198,7 @@ public final class AddressBookParsedResult extends ParsedResult {
maybeAppend(phoneNumbers, result);
maybeAppend(emails, result);
maybeAppend(instantMessenger, result);
maybeAppend(url, result);
maybeAppend(urls, result);
maybeAppend(birthday, result);
maybeAppend(geo, result);
maybeAppend(note, result);

View file

@ -56,15 +56,10 @@ public abstract class ParsedResult {
}
}
public static void maybeAppend(String[] value, StringBuilder result) {
if (value != null) {
for (String s : value) {
if (s != null && s.length() > 0) {
if (result.length() > 0) {
result.append('\n');
}
result.append(s);
}
public static void maybeAppend(String[] values, StringBuilder result) {
if (values != null) {
for (String value : values) {
maybeAppend(value, result);
}
}
}

View file

@ -230,7 +230,9 @@ public abstract class ResultParser {
if (trim) {
element = element.trim();
}
matches.add(element);
if (element.length() > 0) {
matches.add(element);
}
i++;
more = false;
}

View file

@ -73,7 +73,7 @@ public final class VCardResultParser extends ResultParser {
birthday = null;
}
List<String> title = matchSingleVCardPrefixedField("TITLE", rawText, true, false);
List<String> url = matchSingleVCardPrefixedField("URL", rawText, true, false);
List<List<String>> urls = matchVCardPrefixedField("URL", rawText, true, false);
List<String> instantMessenger = matchSingleVCardPrefixedField("IMPP", rawText, true, false);
List<String> geoString = matchSingleVCardPrefixedField("GEO", rawText, true, false);
String[] geo = geoString == null ? null : SEMICOLON_OR_COMMA.split(geoString.get(0));
@ -94,7 +94,7 @@ public final class VCardResultParser extends ResultParser {
toPrimaryValue(org),
toPrimaryValue(birthday),
toPrimaryValue(title),
toPrimaryValue(url),
toPrimaryValues(urls),
geo);
}
@ -277,7 +277,10 @@ public final class VCardResultParser extends ResultParser {
}
List<String> result = new ArrayList<String>(lists.size());
for (List<String> list : lists) {
result.add(list.get(0));
String value = list.get(0);
if (value != null && value.length() > 0) {
result.add(value);
}
}
return result.toArray(new String[lists.size()]);
}

View file

@ -21,8 +21,6 @@ import com.google.zxing.Result;
import org.junit.Assert;
import org.junit.Test;
import java.util.Arrays;
/**
* Tests {@link AddressBookParsedResult}.
*
@ -35,7 +33,7 @@ public final class AddressBookParsedResultTestCase extends Assert {
doTest("MECARD:N:Sean Owen;;", null, new String[] {"Sean Owen"}, null, null, null, null, null, null, null, null);
doTest("MECARD:NOTE:ZXing Team;N:Sean Owen;URL:google.com;EMAIL:srowen@example.org;;",
null, new String[] {"Sean Owen"}, null, null, new String[] {"srowen@example.org"}, null, null,
"google.com", null, "ZXing Team");
new String[] {"google.com"}, null, "ZXing Team");
}
@Test
@ -108,7 +106,7 @@ public final class AddressBookParsedResultTestCase extends Assert {
String[] emails,
String[] phoneNumbers,
String org,
String url,
String[] urls,
String birthday,
String note) {
Result fakeResult = new Result(contents, null, null, BarcodeFormat.QR_CODE);
@ -116,13 +114,13 @@ public final class AddressBookParsedResultTestCase extends Assert {
assertSame(ParsedResultType.ADDRESSBOOK, result.getType());
AddressBookParsedResult addressResult = (AddressBookParsedResult) result;
assertEquals(title, addressResult.getTitle());
assertTrue(Arrays.equals(names, addressResult.getNames()));
assertArrayEquals(names, addressResult.getNames());
assertEquals(pronunciation, addressResult.getPronunciation());
assertTrue(Arrays.equals(addresses, addressResult.getAddresses()));
assertTrue(Arrays.equals(emails, addressResult.getEmails()));
assertTrue(Arrays.equals(phoneNumbers, addressResult.getPhoneNumbers()));
assertArrayEquals(addresses, addressResult.getAddresses());
assertArrayEquals(emails, addressResult.getEmails());
assertArrayEquals(phoneNumbers, addressResult.getPhoneNumbers());
assertEquals(org, addressResult.getOrg());
assertEquals(url, addressResult.getURL());
assertArrayEquals(urls, addressResult.getURLs());
assertEquals(birthday, addressResult.getBirthday());
assertEquals(note, addressResult.getNote());
}

View file

@ -24,7 +24,6 @@ import org.junit.Test;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Locale;
import java.util.TimeZone;
@ -223,8 +222,7 @@ public final class CalendarParsedResultTestCase extends Assert {
assertEquals(startString, DATE_TIME_FORMAT.format(calResult.getStart()));
assertEquals(endString, calResult.getEnd() == null ? null : DATE_TIME_FORMAT.format(calResult.getEnd()));
assertEquals(organizer, calResult.getOrganizer());
assertTrue((attendees == null && calResult.getAttendees() == null) ||
Arrays.equals(attendees, calResult.getAttendees()));
assertArrayEquals(attendees, calResult.getAttendees());
assertEqualOrNaN(latitude, calResult.getLatitude());
assertEqualOrNaN(longitude, calResult.getLongitude());
}

View file

@ -21,8 +21,6 @@ import com.google.zxing.Result;
import org.junit.Assert;
import org.junit.Test;
import java.util.Arrays;
/**
* Tests {@link SMSParsedResult}.
*
@ -61,10 +59,10 @@ public final class SMSMMSParsedResultTestCase extends Assert {
ParsedResult result = ResultParser.parseResult(fakeResult);
assertSame(ParsedResultType.SMS, result.getType());
SMSParsedResult smsResult = (SMSParsedResult) result;
assertTrue(Arrays.equals(numbers, smsResult.getNumbers()));
assertArrayEquals(numbers, smsResult.getNumbers());
assertEquals(subject, smsResult.getSubject());
assertEquals(body, smsResult.getBody());
assertTrue(Arrays.equals(vias, smsResult.getVias()));
assertArrayEquals(vias, smsResult.getVias());
}
}

View file

@ -30,8 +30,8 @@ public final class WifiParsedResultTestCase extends Assert {
@Test
public void testNoPassword() {
doTest("WIFI:S:NoPassword;P:;T:;;", "NoPassword", "", "");
doTest("WIFI:S:No Password;P:;T:;;", "No Password", "", "");
doTest("WIFI:S:NoPassword;P:;T:;;", "NoPassword", null, "nopass");
doTest("WIFI:S:No Password;P:;T:;;", "No Password", null, "nopass");
}
@Test