Skip to content

Commit

Permalink
"From" and "To" email metadata with real phone number
Browse files Browse the repository at this point in the history
  Closes GH-19.
  • Loading branch information
jberkel committed Oct 5, 2010
1 parent df17804 commit dbd52cd
Show file tree
Hide file tree
Showing 5 changed files with 86 additions and 32 deletions.
12 changes: 12 additions & 0 deletions res/values/arrays.xml
Expand Up @@ -28,6 +28,18 @@
<item>-1</item>
</string-array>

<string-array name="email_address_style_entries">
<item>Name</item>
<item>Name (+00 123456)</item>
<item>+00 123456</item>
</string-array>

<string-array name="email_address_style_values">
<item>name</item>
<item>name_and_number</item>
<item>number</item>
</string-array>

<string-array name="auto_backup_schedule_entries">
<item>30 mins</item>
<item>1 h</item>
Expand Down
4 changes: 4 additions & 0 deletions res/values/strings.xml
Expand Up @@ -96,6 +96,10 @@
<string name="ui_mark_as_read_desc">Whether to mark messages in Gmail as read or not.</string>
<string name="ui_mark_as_read_restore_label">Mark as read (SMS)</string>
<string name="ui_mark_as_read_restore_desc">Whether to mark all restored SMS as read or not.</string>

<string name="ui_email_address_style_label">Email address style</string>
<string name="ui_email_address_style_desc">Format of email addresses</string>

<string name="ui_enable_auto_sync_label">Auto backup</string>
<string name="ui_enable_auto_sync_desc">Whether to automatically backup new SMS or not.</string>

Expand Down
8 changes: 8 additions & 0 deletions res/xml/main_screen.xml
Expand Up @@ -52,6 +52,14 @@
android:defaultValue="-1"
android:persistent="true"/>

<ListPreference android:key="email_address_style"
android:title="@string/ui_email_address_style_label"
android:summary="@string/ui_email_address_style_desc"
android:entries="@array/email_address_style_entries"
android:entryValues="@array/email_address_style_values"
android:defaultValue="name"
android:persistent="true"/>

<PreferenceCategory android:title="@string/auto_backup_settings"
android:dependency="enable_auto_sync"
android:persistent="false"
Expand Down
88 changes: 56 additions & 32 deletions src/com/zegoggles/smssync/CursorToMessage.java
Expand Up @@ -47,7 +47,7 @@
import static com.zegoggles.smssync.App.*;

public class CursorToMessage {
//ContactsContract.CommonDataKinds.Email.CONTENT_URI)
//ContactsContract.CommonDataKinds.Email.CONTENT_URI
public static final Uri ECLAIR_CONTENT_URI = Uri.parse("content://com.android.contacts/data/emails");

// PhoneLookup.CONTENT_FILTER_URI
Expand Down Expand Up @@ -78,6 +78,9 @@ public class CursorToMessage {
private String mReferenceValue;
private boolean mMarkAsRead = false;

private enum Style { NAME, NAME_AND_NUMBER, NUMBER };
private Style mStyle = Style.NAME;

public static interface Headers {
String ID = "X-smssync-id";
String ADDRESS = "X-smssync-address";
Expand Down Expand Up @@ -112,6 +115,10 @@ public boolean removeEldestEntry(Map.Entry eldest) {

mMarkAsRead = PrefStore.getMarkAsRead(ctx);

if (PrefStore.getEmailAddressStyle(ctx) != null) {
mStyle = Style.valueOf(PrefStore.getEmailAddressStyle(ctx).toUpperCase());
}

Log.d(Consts.TAG, String.format("using %s contacts API", NEW_CONTACT_API ? "new" : "old"));
}

Expand Down Expand Up @@ -149,18 +156,18 @@ private Message messageFromMap(Map<String, String> 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);
}

Expand All @@ -176,9 +183,10 @@ private Message messageFromMap(Map<String, String> 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));
Expand Down Expand Up @@ -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();
}
Expand Down Expand Up @@ -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) {
Expand All @@ -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<Message> 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);
}
}
}
6 changes: 6 additions & 0 deletions src/com/zegoggles/smssync/PrefStore.java
Expand Up @@ -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";
Expand Down Expand Up @@ -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));
}
Expand Down

0 comments on commit dbd52cd

Please sign in to comment.