mirror of
https://github.com/zxing/zxing.git
synced 2025-02-02 05:41:08 -08:00
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:
parent
86671ab226
commit
33c5bd074b
|
@ -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');
|
||||
|
|
|
@ -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() };
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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() };
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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()]);
|
||||
}
|
||||
|
|
|
@ -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());
|
||||
}
|
||||
|
|
|
@ -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());
|
||||
}
|
||||
|
|
|
@ -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());
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue