diff --git a/res/values/arrays.xml b/res/values/arrays.xml
index 5f178157d..114ed0919 100644
--- a/res/values/arrays.xml
+++ b/res/values/arrays.xml
@@ -28,6 +28,18 @@
- -1
+
+ - Name
+ - Name (+00 123456)
+ - +00 123456
+
+
+
+ - name
+ - name_and_number
+ - number
+
+
- 30 mins
- 1 h
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 8de062d03..984a0ac60 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -96,6 +96,10 @@
Whether to mark messages in Gmail as read or not.
Mark as read (SMS)
Whether to mark all restored SMS as read or not.
+
+ Email address style
+ Format of email addresses
+
Auto backup
Whether to automatically backup new SMS or not.
diff --git a/res/xml/main_screen.xml b/res/xml/main_screen.xml
index 4c14c5534..fd65a5482 100644
--- a/res/xml/main_screen.xml
+++ b/res/xml/main_screen.xml
@@ -52,6 +52,14 @@
android:defaultValue="-1"
android:persistent="true"/>
+
+
msgMap) throws MessagingExcep
}
PersonRecord record = lookupPerson(address);
- msg.setSubject("SMS with " + record.name);
+ msg.setSubject("SMS with " + record.getName());
TextBody body = new TextBody(msgMap.get(SmsConsts.BODY));
int messageType = Integer.valueOf(msgMap.get(SmsConsts.TYPE));
if (SmsConsts.MESSAGE_TYPE_INBOX == messageType) {
// Received message
- msg.setFrom(record.address);
+ msg.setFrom(record.getAddress());
msg.setRecipient(RecipientType.TO, mUserAddress);
} else {
// Sent message
- msg.setRecipient(RecipientType.TO, record.address);
+ msg.setRecipient(RecipientType.TO, record.getAddress());
msg.setFrom(mUserAddress);
}
@@ -176,9 +183,10 @@ private Message messageFromMap(Map msgMap) throws MessagingExcep
}
// Threading by person ID, not by thread ID. I think this value is more stable.
- msg.setHeader("References", String.format(REFERENCE_UID_TEMPLATE, mReferenceValue, record._id));
+ msg.setHeader("References",
+ String.format(REFERENCE_UID_TEMPLATE, mReferenceValue, sanitize(record._id)));
msg.setHeader(Headers.ID, msgMap.get(SmsConsts.ID));
- msg.setHeader(Headers.ADDRESS, address);
+ msg.setHeader(Headers.ADDRESS, sanitize(address));
msg.setHeader(Headers.TYPE, msgMap.get(SmsConsts.TYPE));
msg.setHeader(Headers.DATE, msgMap.get(SmsConsts.DATE));
msg.setHeader(Headers.THREAD_ID, msgMap.get(SmsConsts.THREAD_ID));
@@ -218,36 +226,28 @@ private String createMessageId(Date sent, String address, int type) {
}
/* Look up a person */
- private PersonRecord lookupPerson(String address) {
+ private PersonRecord lookupPerson(final String address) {
if (!mPeopleCache.containsKey(address)) {
Uri personUri = Uri.withAppendedPath(NEW_CONTACT_API ? ECLAIR_CONTENT_FILTER_URI :
PhoneLookup.CONTENT_FILTER_URI, Uri.encode(address));
Cursor c = mContext.getContentResolver().query(personUri, PHONE_PROJECTION, null, null, null);
-
+ final PersonRecord record = new PersonRecord();
if (c != null && c.moveToFirst()) {
- long personId = c.getLong(c.getColumnIndex(PHONE_PROJECTION[0]));
- String name = c.getString(c.getColumnIndex(PHONE_PROJECTION[1]));
- String number = NEW_CONTACT_API ? address : c.getString(c.getColumnIndex(PHONE_PROJECTION[2]));
- String primaryEmail = getPrimaryEmail(personId, number);
-
- PersonRecord record = new PersonRecord();
- record._id = String.valueOf(personId);
- record.name = name;
- record.address = new Address(primaryEmail, encodeDisplayName(name));
-
- mPeopleCache.put(address, record);
+ long id = c.getLong(c.getColumnIndex(PHONE_PROJECTION[0]));
+ record._id = String.valueOf(id);
+ record.name = sanitize(c.getString(c.getColumnIndex(PHONE_PROJECTION[1])));
+ record.email = getPrimaryEmail(id, record.number);
+ record.number = NEW_CONTACT_API ? address :
+ c.getString(c.getColumnIndex(PHONE_PROJECTION[2]));
} else {
if (LOCAL_LOGV) Log.v(Consts.TAG, "Looked up unknown address: " + address);
- PersonRecord record = new PersonRecord();
- record = new PersonRecord();
record._id = address;
- record.name = address;
- record.address = new Address(encodeLocal(address) + "@" + UNKNOWN_PERSON);
-
- mPeopleCache.put(address, record);
+ record.number = address;
+ record.email = encodeLocal(address) + "@" + UNKNOWN_PERSON;
}
+ mPeopleCache.put(address, record);
if (c != null) c.close();
}
@@ -302,12 +302,16 @@ private String getPrimaryEmail(final long personId, final String number) {
}
}
+ private static String sanitize(String s) {
+ return s != null ? s.replaceAll("\\p{Cntrl}", "") : null;
+ }
+
private static String encodeLocal(String s) {
- return (s != null ? EncoderUtil.encodeAddressLocalPart(s) : null);
+ return (s != null ? EncoderUtil.encodeAddressLocalPart(sanitize(s)) : null);
}
private static String encodeDisplayName(String s) {
- return (s != null ? EncoderUtil.encodeAddressDisplayName(s) : null);
+ return (s != null ? EncoderUtil.encodeAddressDisplayName(sanitize(s)) : null);
}
private static String getUnknownEmail(String number) {
@@ -328,14 +332,34 @@ private static String generateReferenceValue(String email) {
return sb.toString();
}
- public static class ConversionResult {
+ public class ConversionResult {
public long maxDate;
public List messageList;
}
- private static class PersonRecord {
- String _id;
- String name;
- Address address;
+ private class PersonRecord {
+ public String _id, name, email, number;
+ private Address mAddress;
+
+ public Address getAddress() {
+ if (mAddress == null) {
+ switch(mStyle) {
+ case NUMBER:
+ mAddress = new Address(email, number);
+ break;
+ case NAME_AND_NUMBER:
+ mAddress = new Address(email,
+ name == null ? number : String.format("%s (%s)", name, number));
+ break;
+ case NAME:
+ mAddress = new Address(email, name);
+ break;
+ }
+ }
+ return mAddress;
+ }
+ public String getName() {
+ return sanitize(name != null ? name : number);
+ }
}
}
diff --git a/src/com/zegoggles/smssync/PrefStore.java b/src/com/zegoggles/smssync/PrefStore.java
index 5ef6ada04..87ebdccb0 100644
--- a/src/com/zegoggles/smssync/PrefStore.java
+++ b/src/com/zegoggles/smssync/PrefStore.java
@@ -77,6 +77,8 @@ public class PrefStore {
/** Preference for storing whether restored messages should be marked as read. */
static final String PREF_MARK_AS_READ_ON_RESTORE = "mark_as_read_on_restore";
+ static final String PREF_EMAIL_ADDRESS_STYLE = "email_address_style";
+
static final String PREF_PREFILLED = "prefilled";
static final String PREF_CONNECTED = "connected";
static final String PREF_WIFI_ONLY = "wifi_only";
@@ -233,6 +235,10 @@ static int getMaxItemsPerRestore(Context ctx) {
return getStringAsInt(ctx, PREF_MAX_ITEMS_PER_RESTORE, DEFAULT_MAX_ITEMS_PER_RESTORE);
}
+ static String getEmailAddressStyle(Context ctx) {
+ return getSharedPreferences(ctx).getString(PREF_EMAIL_ADDRESS_STYLE, null);
+ }
+
static boolean isWifiOnly(Context ctx) {
return (getSharedPreferences(ctx).getBoolean(PREF_WIFI_ONLY, false));
}