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)); }