mirror of
https://github.com/moparisthebest/k-9
synced 2024-11-30 13:12:25 -05:00
Mark contacts as contacted when a mail is sent to them.
Fixes issue 2522
This commit is contained in:
parent
7db384fc08
commit
0add1f97c0
@ -17,7 +17,14 @@
|
|||||||
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
|
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
|
||||||
<uses-permission android:name="android.permission.READ_CONTACTS"/>
|
<uses-permission android:name="android.permission.READ_CONTACTS"/>
|
||||||
<uses-permission android:name="android.permission.READ_SYNC_SETTINGS"/>
|
<uses-permission android:name="android.permission.READ_SYNC_SETTINGS"/>
|
||||||
|
|
||||||
|
<!-- Needed to get the owner name which is used when the first mail account is created -->
|
||||||
<uses-permission android:name="android.permission.READ_OWNER_DATA"/>
|
<uses-permission android:name="android.permission.READ_OWNER_DATA"/>
|
||||||
|
<uses-permission android:name="android.permission.GET_ACCOUNTS"/>
|
||||||
|
|
||||||
|
<!-- Needed to mark a contact as contacted -->
|
||||||
|
<uses-permission android:name="android.permission.WRITE_CONTACTS"/>
|
||||||
|
|
||||||
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
|
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
|
||||||
<uses-permission android:name="android.permission.INTERNET"/>
|
<uses-permission android:name="android.permission.INTERNET"/>
|
||||||
<uses-permission android:name="android.permission.VIBRATE"/>
|
<uses-permission android:name="android.permission.VIBRATE"/>
|
||||||
|
@ -57,6 +57,7 @@ import com.fsck.k9.controller.MessagingController;
|
|||||||
import com.fsck.k9.controller.MessagingListener;
|
import com.fsck.k9.controller.MessagingListener;
|
||||||
import com.fsck.k9.crypto.CryptoProvider;
|
import com.fsck.k9.crypto.CryptoProvider;
|
||||||
import com.fsck.k9.crypto.PgpData;
|
import com.fsck.k9.crypto.PgpData;
|
||||||
|
import com.fsck.k9.helper.Contacts;
|
||||||
import com.fsck.k9.helper.Utility;
|
import com.fsck.k9.helper.Utility;
|
||||||
import com.fsck.k9.mail.Address;
|
import com.fsck.k9.mail.Address;
|
||||||
import com.fsck.k9.mail.Body;
|
import com.fsck.k9.mail.Body;
|
||||||
@ -2252,6 +2253,18 @@ public class MessageCompose extends K9Activity implements OnClickListener, OnFoc
|
|||||||
throw new RuntimeException("Failed to create a new message for send or save.", me);
|
throw new RuntimeException("Failed to create a new message for send or save.", me);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
final Contacts contacts = Contacts.getInstance(MessageCompose.this);
|
||||||
|
contacts.markAsContacted(message.getRecipients(RecipientType.TO));
|
||||||
|
contacts.markAsContacted(message.getRecipients(RecipientType.CC));
|
||||||
|
contacts.markAsContacted(message.getRecipients(RecipientType.BCC));
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
Log.e(K9.LOG_TAG, "Failed to mark contact as contacted.", e);
|
||||||
|
}
|
||||||
|
|
||||||
MessagingController.getInstance(getApplication()).sendMessage(mAccount, message, null);
|
MessagingController.getInstance(getApplication()).sendMessage(mAccount, message, null);
|
||||||
if (mDraftUid != null)
|
if (mDraftUid != null)
|
||||||
{
|
{
|
||||||
|
@ -174,4 +174,12 @@ public abstract class Contacts
|
|||||||
* row.
|
* row.
|
||||||
*/
|
*/
|
||||||
public abstract String getEmail(Cursor cursor);
|
public abstract String getEmail(Cursor cursor);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Mark contacts with the provided email addresses as contacted.
|
||||||
|
*
|
||||||
|
* @param addresses Array of {@link Address} objects describing the
|
||||||
|
* contacts to be marked as contacted.
|
||||||
|
*/
|
||||||
|
public abstract void markAsContacted(final Address[] addresses);
|
||||||
}
|
}
|
||||||
|
@ -21,8 +21,9 @@ public class ContactsSdk3_4 extends com.fsck.k9.helper.Contacts
|
|||||||
* {@link #searchContacts(CharSequence)}.
|
* {@link #searchContacts(CharSequence)}.
|
||||||
*/
|
*/
|
||||||
private static final String SORT_ORDER =
|
private static final String SORT_ORDER =
|
||||||
Contacts.People.TIMES_CONTACTED + " DESC, " +
|
Contacts.ContactMethods.TIMES_CONTACTED + " DESC, " +
|
||||||
Contacts.People.NAME;
|
Contacts.ContactMethods.DISPLAY_NAME + ", " +
|
||||||
|
Contacts.ContactMethods._ID;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Array of columns to load from the database.
|
* Array of columns to load from the database.
|
||||||
@ -33,9 +34,10 @@ public class ContactsSdk3_4 extends com.fsck.k9.helper.Contacts
|
|||||||
*/
|
*/
|
||||||
private static final String PROJECTION[] =
|
private static final String PROJECTION[] =
|
||||||
{
|
{
|
||||||
Contacts.People.ContactMethods._ID,
|
Contacts.ContactMethods._ID,
|
||||||
Contacts.People.ContactMethods.NAME,
|
Contacts.ContactMethods.DISPLAY_NAME,
|
||||||
Contacts.People.ContactMethods.DATA
|
Contacts.ContactMethods.DATA,
|
||||||
|
Contacts.ContactMethods.PERSON_ID
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -50,6 +52,12 @@ public class ContactsSdk3_4 extends com.fsck.k9.helper.Contacts
|
|||||||
*/
|
*/
|
||||||
private static final int EMAIL_INDEX = 2;
|
private static final int EMAIL_INDEX = 2;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Index of the contact id field in the projection. This must match the order in
|
||||||
|
* {@link #PROJECTION}.
|
||||||
|
*/
|
||||||
|
private static final int CONTACT_ID_INDEX = 3;
|
||||||
|
|
||||||
|
|
||||||
public ContactsSdk3_4(final Context context)
|
public ContactsSdk3_4(final Context context)
|
||||||
{
|
{
|
||||||
@ -94,7 +102,7 @@ public class ContactsSdk3_4 extends com.fsck.k9.helper.Contacts
|
|||||||
if (c.getCount() > 0)
|
if (c.getCount() > 0)
|
||||||
{
|
{
|
||||||
c.moveToFirst();
|
c.moveToFirst();
|
||||||
name = c.getString(NAME_INDEX);
|
name = getName(c);
|
||||||
}
|
}
|
||||||
c.close();
|
c.close();
|
||||||
}
|
}
|
||||||
@ -107,15 +115,7 @@ public class ContactsSdk3_4 extends com.fsck.k9.helper.Contacts
|
|||||||
{
|
{
|
||||||
boolean result = false;
|
boolean result = false;
|
||||||
|
|
||||||
final String where = Contacts.ContactMethods.DATA + "=?";
|
final Cursor c = getContactByAddress(emailAddress);
|
||||||
final String[] args = new String[] {emailAddress};
|
|
||||||
|
|
||||||
final Cursor c = mContentResolver.query(
|
|
||||||
Contacts.ContactMethods.CONTENT_EMAIL_URI,
|
|
||||||
PROJECTION,
|
|
||||||
where,
|
|
||||||
args,
|
|
||||||
null);
|
|
||||||
|
|
||||||
if (c != null)
|
if (c != null)
|
||||||
{
|
{
|
||||||
@ -141,7 +141,8 @@ public class ContactsSdk3_4 extends com.fsck.k9.helper.Contacts
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
where = "(" +
|
where = Contacts.ContactMethods.KIND + " = " + Contacts.KIND_EMAIL +
|
||||||
|
" AND" + "(" +
|
||||||
Contacts.People.NAME + " LIKE ?" +
|
Contacts.People.NAME + " LIKE ?" +
|
||||||
") OR (" +
|
") OR (" +
|
||||||
Contacts.ContactMethods.DATA + " LIKE ?" +
|
Contacts.ContactMethods.DATA + " LIKE ?" +
|
||||||
@ -151,7 +152,7 @@ public class ContactsSdk3_4 extends com.fsck.k9.helper.Contacts
|
|||||||
}
|
}
|
||||||
|
|
||||||
final Cursor c = mContentResolver.query(
|
final Cursor c = mContentResolver.query(
|
||||||
Contacts.ContactMethods.CONTENT_EMAIL_URI,
|
Contacts.ContactMethods.CONTENT_URI,
|
||||||
PROJECTION,
|
PROJECTION,
|
||||||
where,
|
where,
|
||||||
args,
|
args,
|
||||||
@ -181,15 +182,7 @@ public class ContactsSdk3_4 extends com.fsck.k9.helper.Contacts
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
final String where = Contacts.ContactMethods.DATA + " = ?";
|
final Cursor c = getContactByAddress(address);
|
||||||
final String[] args = new String[] {address};
|
|
||||||
|
|
||||||
final Cursor c = mContentResolver.query(
|
|
||||||
Contacts.ContactMethods.CONTENT_EMAIL_URI,
|
|
||||||
PROJECTION,
|
|
||||||
where,
|
|
||||||
args,
|
|
||||||
SORT_ORDER);
|
|
||||||
|
|
||||||
String name = null;
|
String name = null;
|
||||||
if (c != null)
|
if (c != null)
|
||||||
@ -216,4 +209,49 @@ public class ContactsSdk3_4 extends com.fsck.k9.helper.Contacts
|
|||||||
{
|
{
|
||||||
return c.getString(EMAIL_INDEX);
|
return c.getString(EMAIL_INDEX);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void markAsContacted(final Address[] addresses)
|
||||||
|
{
|
||||||
|
//TODO: Optimize! Potentially a lot of database queries
|
||||||
|
for (final Address address : addresses)
|
||||||
|
{
|
||||||
|
final Cursor c = getContactByAddress(address.getAddress());
|
||||||
|
|
||||||
|
if (c != null)
|
||||||
|
{
|
||||||
|
if (c.getCount() > 0)
|
||||||
|
{
|
||||||
|
c.moveToFirst();
|
||||||
|
final long personId = c.getLong(CONTACT_ID_INDEX);
|
||||||
|
Contacts.People.markAsContacted(mContentResolver, personId);
|
||||||
|
}
|
||||||
|
c.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return a {@link Cursor} instance that can be used to fetch information
|
||||||
|
* about the contact with the given email address.
|
||||||
|
*
|
||||||
|
* @param address The email address to search for.
|
||||||
|
* @return A {@link Cursor} instance that can be used to fetch information
|
||||||
|
* about the contact with the given email address
|
||||||
|
*/
|
||||||
|
private Cursor getContactByAddress(String address)
|
||||||
|
{
|
||||||
|
final String where = Contacts.ContactMethods.KIND + " = " + Contacts.KIND_EMAIL +
|
||||||
|
" AND " +
|
||||||
|
Contacts.ContactMethods.DATA + " = ?";
|
||||||
|
final String[] args = new String[] {address};
|
||||||
|
|
||||||
|
final Cursor c = mContentResolver.query(
|
||||||
|
Contacts.ContactMethods.CONTENT_URI,
|
||||||
|
PROJECTION,
|
||||||
|
where,
|
||||||
|
args,
|
||||||
|
SORT_ORDER);
|
||||||
|
return c;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -7,6 +7,7 @@ import android.content.Context;
|
|||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.database.Cursor;
|
import android.database.Cursor;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
|
import android.provider.ContactsContract;
|
||||||
import android.provider.ContactsContract.Contacts;
|
import android.provider.ContactsContract.Contacts;
|
||||||
import android.provider.ContactsContract.Intents;
|
import android.provider.ContactsContract.Intents;
|
||||||
import android.provider.ContactsContract.CommonDataKinds.Email;
|
import android.provider.ContactsContract.CommonDataKinds.Email;
|
||||||
@ -24,8 +25,9 @@ public class ContactsSdk5 extends com.fsck.k9.helper.Contacts
|
|||||||
* {@link #searchContacts(CharSequence)}.
|
* {@link #searchContacts(CharSequence)}.
|
||||||
*/
|
*/
|
||||||
private static final String SORT_ORDER =
|
private static final String SORT_ORDER =
|
||||||
Contacts.TIMES_CONTACTED + " DESC, " +
|
Email.TIMES_CONTACTED + " DESC, " +
|
||||||
Contacts.DISPLAY_NAME;
|
Contacts.DISPLAY_NAME + ", " +
|
||||||
|
Email._ID;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Array of columns to load from the database.
|
* Array of columns to load from the database.
|
||||||
@ -36,9 +38,10 @@ public class ContactsSdk5 extends com.fsck.k9.helper.Contacts
|
|||||||
*/
|
*/
|
||||||
private static final String PROJECTION[] =
|
private static final String PROJECTION[] =
|
||||||
{
|
{
|
||||||
Contacts._ID,
|
Email._ID,
|
||||||
Contacts.DISPLAY_NAME,
|
Contacts.DISPLAY_NAME,
|
||||||
Email.DATA
|
Email.DATA,
|
||||||
|
Email.CONTACT_ID
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -53,6 +56,12 @@ public class ContactsSdk5 extends com.fsck.k9.helper.Contacts
|
|||||||
*/
|
*/
|
||||||
private static final int EMAIL_INDEX = 2;
|
private static final int EMAIL_INDEX = 2;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Index of the contact id field in the projection. This must match the order in
|
||||||
|
* {@link #PROJECTION}.
|
||||||
|
*/
|
||||||
|
private static final int CONTACT_ID_INDEX = 3;
|
||||||
|
|
||||||
|
|
||||||
public ContactsSdk5(final Context context)
|
public ContactsSdk5(final Context context)
|
||||||
{
|
{
|
||||||
@ -105,9 +114,7 @@ public class ContactsSdk5 extends com.fsck.k9.helper.Contacts
|
|||||||
{
|
{
|
||||||
boolean result = false;
|
boolean result = false;
|
||||||
|
|
||||||
|
final Cursor c = getContactByAddress(emailAddress);
|
||||||
final Uri uri = Uri.withAppendedPath(Email.CONTENT_LOOKUP_URI, Uri.encode(emailAddress));
|
|
||||||
final Cursor c = mContentResolver.query(uri, PROJECTION, null, null, null);
|
|
||||||
|
|
||||||
if (c != null)
|
if (c != null)
|
||||||
{
|
{
|
||||||
@ -157,13 +164,7 @@ public class ContactsSdk5 extends com.fsck.k9.helper.Contacts
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
final Uri uri = Uri.withAppendedPath(Email.CONTENT_LOOKUP_URI, Uri.encode(address));
|
final Cursor c = getContactByAddress(address);
|
||||||
final Cursor c = mContentResolver.query(
|
|
||||||
uri,
|
|
||||||
PROJECTION,
|
|
||||||
null,
|
|
||||||
null,
|
|
||||||
SORT_ORDER);
|
|
||||||
|
|
||||||
String name = null;
|
String name = null;
|
||||||
if (c != null)
|
if (c != null)
|
||||||
@ -190,4 +191,45 @@ public class ContactsSdk5 extends com.fsck.k9.helper.Contacts
|
|||||||
{
|
{
|
||||||
return c.getString(EMAIL_INDEX);
|
return c.getString(EMAIL_INDEX);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void markAsContacted(final Address[] addresses)
|
||||||
|
{
|
||||||
|
//TODO: Optimize! Potentially a lot of database queries
|
||||||
|
for (final Address address : addresses)
|
||||||
|
{
|
||||||
|
final Cursor c = getContactByAddress(address.getAddress());
|
||||||
|
|
||||||
|
if (c != null)
|
||||||
|
{
|
||||||
|
if (c.getCount() > 0)
|
||||||
|
{
|
||||||
|
c.moveToFirst();
|
||||||
|
final long personId = c.getLong(CONTACT_ID_INDEX);
|
||||||
|
ContactsContract.Contacts.markAsContacted(mContentResolver, personId);
|
||||||
|
}
|
||||||
|
c.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return a {@link Cursor} instance that can be used to fetch information
|
||||||
|
* about the contact with the given email address.
|
||||||
|
*
|
||||||
|
* @param address The email address to search for.
|
||||||
|
* @return A {@link Cursor} instance that can be used to fetch information
|
||||||
|
* about the contact with the given email address
|
||||||
|
*/
|
||||||
|
private Cursor getContactByAddress(final String address)
|
||||||
|
{
|
||||||
|
final Uri uri = Uri.withAppendedPath(Email.CONTENT_LOOKUP_URI, Uri.encode(address));
|
||||||
|
final Cursor c = mContentResolver.query(
|
||||||
|
uri,
|
||||||
|
PROJECTION,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
SORT_ORDER);
|
||||||
|
return c;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user