aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDmitri Plotnikov <dplotnikov@google.com>2009-09-27 21:02:04 -0700
committerDmitri Plotnikov <dplotnikov@google.com>2009-09-28 17:38:21 -0700
commit0a185cdcb65d1beb2a295fffbe2ae11a6a2c097f (patch)
tree62271cc472e353922ee9970d3cc12820ee55df01 /src
parentba965ceeb86dd9404d43f418daae357bc4afbdcd (diff)
downloadContactsProvider-0a185cdcb65d1beb2a295fffbe2ae11a6a2c097f.tar.gz
Adding support to ContactsProvider2 for status update attribution
Change-Id: Ib98a5fc203a9ce5efb4707b9ce015bd497b8ef10
Diffstat (limited to 'src')
-rw-r--r--src/com/android/providers/contacts/ContactsProvider2.java158
-rw-r--r--src/com/android/providers/contacts/LegacyApiSupport.java12
-rw-r--r--src/com/android/providers/contacts/OpenHelper.java9
3 files changed, 129 insertions, 50 deletions
diff --git a/src/com/android/providers/contacts/ContactsProvider2.java b/src/com/android/providers/contacts/ContactsProvider2.java
index 858d1449..0f34e5cd 100644
--- a/src/com/android/providers/contacts/ContactsProvider2.java
+++ b/src/com/android/providers/contacts/ContactsProvider2.java
@@ -378,6 +378,7 @@ public class ContactsProvider2 extends SQLiteContentProvider implements OnAccoun
private SQLiteStatement mStatusUpdateAutoTimestamp;
private SQLiteStatement mStatusUpdateInsert;
private SQLiteStatement mStatusUpdateReplace;
+ private SQLiteStatement mStatusAttributionUpdate;
private SQLiteStatement mStatusUpdateDelete;
static {
@@ -476,11 +477,20 @@ public class ContactsProvider2 extends SQLiteContentProvider implements OnAccoun
Tables.AGGREGATED_PRESENCE + "." + StatusUpdates.PRESENCE
+ " AS " + Contacts.CONTACT_PRESENCE);
sContactsProjectionMap.put(Contacts.CONTACT_STATUS,
- StatusUpdatesColumns.STATUS
+ StatusUpdates.STATUS
+ " AS " + Contacts.CONTACT_STATUS);
sContactsProjectionMap.put(Contacts.CONTACT_STATUS_TIMESTAMP,
- StatusUpdatesColumns.TIMESTAMP
+ StatusUpdates.STATUS_TIMESTAMP
+ " AS " + Contacts.CONTACT_STATUS_TIMESTAMP);
+ sContactsProjectionMap.put(Contacts.CONTACT_STATUS_RES_PACKAGE,
+ StatusUpdates.STATUS_RES_PACKAGE
+ + " AS " + Contacts.CONTACT_STATUS_RES_PACKAGE);
+ sContactsProjectionMap.put(Contacts.CONTACT_STATUS_LABEL,
+ StatusUpdates.STATUS_LABEL
+ + " AS " + Contacts.CONTACT_STATUS_LABEL);
+ sContactsProjectionMap.put(Contacts.CONTACT_STATUS_ICON,
+ StatusUpdates.STATUS_ICON
+ + " AS " + Contacts.CONTACT_STATUS_ICON);
sRawContactsProjectionMap = new HashMap<String, String>();
sRawContactsProjectionMap.put(RawContacts._ID, RawContacts._ID);
@@ -547,9 +557,9 @@ public class ContactsProvider2 extends SQLiteContentProvider implements OnAccoun
sDataProjectionMap.put(Contacts.CONTACT_PRESENCE,
StatusUpdates.PRESENCE + " AS " + Contacts.CONTACT_PRESENCE);
sDataProjectionMap.put(Contacts.CONTACT_STATUS,
- StatusUpdatesColumns.STATUS + " AS " + Contacts.CONTACT_STATUS);
+ StatusUpdates.STATUS + " AS " + Contacts.CONTACT_STATUS);
sDataProjectionMap.put(Contacts.CONTACT_STATUS_TIMESTAMP,
- StatusUpdatesColumns.TIMESTAMP + " AS " + Contacts.CONTACT_STATUS_TIMESTAMP);
+ StatusUpdates.STATUS_TIMESTAMP + " AS " + Contacts.CONTACT_STATUS_TIMESTAMP);
sDataProjectionMap.put(GroupMembership.GROUP_SOURCE_ID, GroupMembership.GROUP_SOURCE_ID);
// Projection map for data grouped by contact (not raw contact) and some data field(s)
@@ -592,9 +602,9 @@ public class ContactsProvider2 extends SQLiteContentProvider implements OnAccoun
sDistinctDataProjectionMap.put(Contacts.CONTACT_PRESENCE,
StatusUpdates.PRESENCE + " AS " + Contacts.CONTACT_PRESENCE);
sDistinctDataProjectionMap.put(Contacts.CONTACT_STATUS,
- StatusUpdatesColumns.STATUS + " AS " + Contacts.CONTACT_STATUS);
+ StatusUpdates.STATUS + " AS " + Contacts.CONTACT_STATUS);
sDistinctDataProjectionMap.put(Contacts.CONTACT_STATUS_TIMESTAMP,
- StatusUpdatesColumns.TIMESTAMP + " AS " + Contacts.CONTACT_STATUS_TIMESTAMP);
+ StatusUpdates.STATUS_TIMESTAMP + " AS " + Contacts.CONTACT_STATUS_TIMESTAMP);
sDistinctDataProjectionMap.put(GroupMembership.GROUP_SOURCE_ID,
GroupMembership.GROUP_SOURCE_ID);
@@ -702,7 +712,8 @@ public class ContactsProvider2 extends SQLiteContentProvider implements OnAccoun
columns = new HashMap<String, String>();
columns.put(PresenceColumns.RAW_CONTACT_ID, PresenceColumns.RAW_CONTACT_ID);
- columns.put(StatusUpdates.DATA_ID, StatusUpdates.DATA_ID);
+ columns.put(StatusUpdates.DATA_ID,
+ DataColumns.CONCRETE_ID + " AS " + StatusUpdates.DATA_ID);
columns.put(StatusUpdates.IM_ACCOUNT, StatusUpdates.IM_ACCOUNT);
columns.put(StatusUpdates.IM_HANDLE, StatusUpdates.IM_HANDLE);
columns.put(StatusUpdates.PROTOCOL, StatusUpdates.PROTOCOL);
@@ -712,10 +723,11 @@ public class ContactsProvider2 extends SQLiteContentProvider implements OnAccoun
+ "='' THEN NULL ELSE " + StatusUpdates.CUSTOM_PROTOCOL + " END) AS "
+ StatusUpdates.CUSTOM_PROTOCOL);
columns.put(StatusUpdates.PRESENCE, StatusUpdates.PRESENCE);
- columns.put(StatusUpdates.STATUS,
- StatusUpdatesColumns.STATUS + " AS " + StatusUpdates.STATUS);
- columns.put(StatusUpdates.STATUS_TIMESTAMP,
- StatusUpdatesColumns.TIMESTAMP + " AS " + StatusUpdates.STATUS_TIMESTAMP);
+ columns.put(StatusUpdates.STATUS, StatusUpdates.STATUS);
+ columns.put(StatusUpdates.STATUS_TIMESTAMP, StatusUpdates.STATUS_TIMESTAMP);
+ columns.put(StatusUpdates.STATUS_RES_PACKAGE, StatusUpdates.STATUS_RES_PACKAGE);
+ columns.put(StatusUpdates.STATUS_ICON, StatusUpdates.STATUS_ICON);
+ columns.put(StatusUpdates.STATUS_LABEL, StatusUpdates.STATUS_LABEL);
sStatusUpdatesProjectionMap = columns;
// Live folder projection
@@ -1574,7 +1586,8 @@ public class ContactsProvider2 extends SQLiteContentProvider implements OnAccoun
" ON (" + DataColumns.CONCRETE_RAW_CONTACT_ID + "="
+ RawContactsColumns.CONCRETE_ID + ")" +
" WHERE " + RawContacts.CONTACT_ID + "=?" +
- " ORDER BY " + StatusUpdatesColumns.TIMESTAMP + " DESC" +
+ " ORDER BY " + StatusUpdates.STATUS_TIMESTAMP + " DESC,"
+ + StatusUpdates.STATUS +
" LIMIT 1)"
+ " WHERE " + ContactsColumns.CONCRETE_ID + "=?");
@@ -1598,23 +1611,35 @@ public class ContactsProvider2 extends SQLiteContentProvider implements OnAccoun
mStatusUpdateInsert = db.compileStatement(
"INSERT INTO " + Tables.STATUS_UPDATES + "("
+ StatusUpdatesColumns.DATA_ID + ", "
- + StatusUpdatesColumns.TIMESTAMP + ","
- + StatusUpdatesColumns.STATUS + ")" +
- " VALUES (?,?,?)");
+ + StatusUpdates.STATUS + ","
+ + StatusUpdates.STATUS_RES_PACKAGE + ","
+ + StatusUpdates.STATUS_ICON + ","
+ + StatusUpdates.STATUS_LABEL + ")" +
+ " VALUES (?,?,?,?,?)");
mStatusUpdateReplace = db.compileStatement(
"INSERT OR REPLACE INTO " + Tables.STATUS_UPDATES + "("
+ StatusUpdatesColumns.DATA_ID + ", "
- + StatusUpdatesColumns.TIMESTAMP + ","
- + StatusUpdatesColumns.STATUS + ")" +
- " VALUES (?,?,?)");
+ + StatusUpdates.STATUS_TIMESTAMP + ","
+ + StatusUpdates.STATUS + ","
+ + StatusUpdates.STATUS_RES_PACKAGE + ","
+ + StatusUpdates.STATUS_ICON + ","
+ + StatusUpdates.STATUS_LABEL + ")" +
+ " VALUES (?,?,?,?,?,?)");
mStatusUpdateAutoTimestamp = db.compileStatement(
"UPDATE " + Tables.STATUS_UPDATES +
- " SET " + StatusUpdatesColumns.TIMESTAMP + "=?,"
- + StatusUpdatesColumns.STATUS + "=?" +
+ " SET " + StatusUpdates.STATUS_TIMESTAMP + "=?,"
+ + StatusUpdates.STATUS + "=?" +
" WHERE " + StatusUpdatesColumns.DATA_ID + "=?"
- + " AND " + StatusUpdatesColumns.STATUS + "!=?");
+ + " AND " + StatusUpdates.STATUS + "!=?");
+
+ mStatusAttributionUpdate = db.compileStatement(
+ "UPDATE " + Tables.STATUS_UPDATES +
+ " SET " + StatusUpdates.STATUS_RES_PACKAGE + "=?,"
+ + StatusUpdates.STATUS_ICON + "=?,"
+ + StatusUpdates.STATUS_LABEL + "=?" +
+ " WHERE " + StatusUpdatesColumns.DATA_ID + "=?");
mStatusUpdateDelete = db.compileStatement(
"DELETE FROM " + Tables.STATUS_UPDATES +
@@ -2269,14 +2294,10 @@ public class ContactsProvider2 extends SQLiteContentProvider implements OnAccoun
*/
public long insertStatusUpdate(ContentValues values) {
final String handle = values.getAsString(StatusUpdates.IM_HANDLE);
- if (TextUtils.isEmpty(handle) || !values.containsKey(StatusUpdates.PROTOCOL)) {
- throw new IllegalArgumentException("PROTOCOL and IM_HANDLE are required");
- }
-
- final long protocol = values.getAsLong(StatusUpdates.PROTOCOL);
+ final Integer protocol = values.getAsInteger(StatusUpdates.PROTOCOL);
String customProtocol = null;
- if (protocol == Im.PROTOCOL_CUSTOM) {
+ if (protocol != null && protocol == Im.PROTOCOL_CUSTOM) {
customProtocol = values.getAsString(StatusUpdates.CUSTOM_PROTOCOL);
if (TextUtils.isEmpty(customProtocol)) {
throw new IllegalArgumentException(
@@ -2299,6 +2320,10 @@ public class ContactsProvider2 extends SQLiteContentProvider implements OnAccoun
} else {
// Lookup the data row to attach this presence update to
+ if (TextUtils.isEmpty(handle) || protocol == null) {
+ throw new IllegalArgumentException("PROTOCOL and IM_HANDLE are required");
+ }
+
// TODO: generalize to allow other providers to match against email
boolean matchEmail = Im.PROTOCOL_GOOGLE_TALK == protocol;
@@ -2378,8 +2403,21 @@ public class ContactsProvider2 extends SQLiteContentProvider implements OnAccoun
mDb.replace(Tables.PRESENCE, null, mValues);
}
+
if (values.containsKey(StatusUpdates.STATUS)) {
String status = values.getAsString(StatusUpdates.STATUS);
+ String resPackage = values.getAsString(StatusUpdates.STATUS_RES_PACKAGE);
+ Integer labelResource = values.getAsInteger(StatusUpdates.STATUS_LABEL);
+
+ if (TextUtils.isEmpty(resPackage)
+ && (labelResource == null || labelResource == 0)
+ && protocol != null) {
+ labelResource = Im.getProtocolLabelResource(protocol);
+ }
+
+ Long iconResource = values.getAsLong(StatusUpdates.STATUS_ICON);
+ // TODO compute the default icon based on the protocol
+
if (TextUtils.isEmpty(status)) {
mStatusUpdateDelete.bindLong(1, dataId);
mStatusUpdateDelete.execute();
@@ -2387,23 +2425,34 @@ public class ContactsProvider2 extends SQLiteContentProvider implements OnAccoun
long timestamp = values.getAsLong(StatusUpdates.STATUS_TIMESTAMP);
mStatusUpdateReplace.bindLong(1, dataId);
mStatusUpdateReplace.bindLong(2, timestamp);
- mStatusUpdateReplace.bindString(3, status);
+ DatabaseUtils.bindObjectToProgram(mStatusUpdateReplace, 3, status);
+ DatabaseUtils.bindObjectToProgram(mStatusUpdateReplace, 4, resPackage);
+ DatabaseUtils.bindObjectToProgram(mStatusUpdateReplace, 5, iconResource);
+ DatabaseUtils.bindObjectToProgram(mStatusUpdateReplace, 6, labelResource);
mStatusUpdateReplace.execute();
} else {
- long timestamp = System.currentTimeMillis();
try {
mStatusUpdateInsert.bindLong(1, dataId);
- mStatusUpdateInsert.bindLong(2, timestamp);
- mStatusUpdateInsert.bindString(3, status);
+ DatabaseUtils.bindObjectToProgram(mStatusUpdateInsert, 2, status);
+ DatabaseUtils.bindObjectToProgram(mStatusUpdateInsert, 3, resPackage);
+ DatabaseUtils.bindObjectToProgram(mStatusUpdateInsert, 4, iconResource);
+ DatabaseUtils.bindObjectToProgram(mStatusUpdateInsert, 5, labelResource);
mStatusUpdateInsert.executeInsert();
} catch (SQLiteConstraintException e) {
// The row already exists - update it
+ long timestamp = System.currentTimeMillis();
mStatusUpdateAutoTimestamp.bindLong(1, timestamp);
- mStatusUpdateAutoTimestamp.bindString(2, status);
+ DatabaseUtils.bindObjectToProgram(mStatusUpdateAutoTimestamp, 2, status);
mStatusUpdateAutoTimestamp.bindLong(3, dataId);
- mStatusUpdateAutoTimestamp.bindString(4, status);
+ DatabaseUtils.bindObjectToProgram(mStatusUpdateAutoTimestamp, 4, status);
mStatusUpdateAutoTimestamp.execute();
+
+ DatabaseUtils.bindObjectToProgram(mStatusAttributionUpdate, 1, resPackage);
+ DatabaseUtils.bindObjectToProgram(mStatusAttributionUpdate, 2, iconResource);
+ DatabaseUtils.bindObjectToProgram(mStatusAttributionUpdate, 3, labelResource);
+ mStatusAttributionUpdate.bindLong(4, dataId);
+ mStatusAttributionUpdate.execute();
}
}
}
@@ -2521,7 +2570,7 @@ public class ContactsProvider2 extends SQLiteContentProvider implements OnAccoun
}
case STATUS_UPDATES: {
- return mDb.delete(Tables.PRESENCE, selection, selectionArgs);
+ return deleteStatusUpdates(selection, selectionArgs);
}
default: {
@@ -2590,6 +2639,11 @@ public class ContactsProvider2 extends SQLiteContentProvider implements OnAccoun
}
}
+ private int deleteStatusUpdates(String selection, String[] selectionArgs) {
+ // TODO delete from both tables: presence and status_updates
+ return mDb.delete(Tables.PRESENCE, selection, selectionArgs);
+ }
+
private int markRawContactAsDeleted(long rawContactId) {
mSyncToNetwork = true;
@@ -3436,17 +3490,13 @@ public class ContactsProvider2 extends SQLiteContentProvider implements OnAccoun
}
case STATUS_UPDATES: {
- qb.setTables(Tables.PRESENCE +
- " LEFT OUTER JOIN " + Tables.STATUS_UPDATES +
- " ON(" + StatusUpdates.DATA_ID + "=" + StatusUpdatesColumns.DATA_ID + ")");
- qb.setProjectionMap(sStatusUpdatesProjectionMap);
+ setTableAndProjectionMapForStatusUpdates(qb, projection);
break;
}
case STATUS_UPDATES_ID: {
- qb.setTables(Tables.PRESENCE);
- qb.setProjectionMap(sStatusUpdatesProjectionMap);
- qb.appendWhere(StatusUpdates.DATA_ID + "=" + ContentUris.parseId(uri));
+ setTableAndProjectionMapForStatusUpdates(qb, projection);
+ qb.appendWhere(DataColumns.CONCRETE_ID + "=" + ContentUris.parseId(uri));
break;
}
@@ -3742,6 +3792,32 @@ public class ContactsProvider2 extends SQLiteContentProvider implements OnAccoun
appendAccountFromParameter(qb, uri);
}
+ private void setTableAndProjectionMapForStatusUpdates(SQLiteQueryBuilder qb,
+ String[] projection) {
+ StringBuilder sb = new StringBuilder();
+ sb.append(mOpenHelper.getDataView());
+ sb.append(" data");
+
+ if (mOpenHelper.isInProjection(projection, StatusUpdates.PRESENCE)) {
+ sb.append(" LEFT OUTER JOIN " + Tables.PRESENCE +
+ " ON(" + Tables.PRESENCE + "." + StatusUpdates.DATA_ID
+ + "=" + DataColumns.CONCRETE_ID + ")");
+ }
+
+ if (mOpenHelper.isInProjection(projection,
+ StatusUpdates.STATUS,
+ StatusUpdates.STATUS_RES_PACKAGE,
+ StatusUpdates.STATUS_ICON,
+ StatusUpdates.STATUS_LABEL,
+ StatusUpdates.STATUS_TIMESTAMP)) {
+ sb.append(" LEFT OUTER JOIN " + Tables.STATUS_UPDATES +
+ " ON(" + Tables.STATUS_UPDATES + "." + StatusUpdatesColumns.DATA_ID
+ + "=" + DataColumns.CONCRETE_ID + ")");
+ }
+ qb.setTables(sb.toString());
+ qb.setProjectionMap(sStatusUpdatesProjectionMap);
+ }
+
private void appendAccountFromParameter(SQLiteQueryBuilder qb, Uri uri) {
final String accountName = uri.getQueryParameter(RawContacts.ACCOUNT_NAME);
final String accountType = uri.getQueryParameter(RawContacts.ACCOUNT_TYPE);
diff --git a/src/com/android/providers/contacts/LegacyApiSupport.java b/src/com/android/providers/contacts/LegacyApiSupport.java
index ec77309a..3bee37be 100644
--- a/src/com/android/providers/contacts/LegacyApiSupport.java
+++ b/src/com/android/providers/contacts/LegacyApiSupport.java
@@ -20,6 +20,7 @@ import com.android.providers.contacts.OpenHelper.ExtensionsColumns;
import com.android.providers.contacts.OpenHelper.GroupsColumns;
import com.android.providers.contacts.OpenHelper.MimetypesColumns;
import com.android.providers.contacts.OpenHelper.PhoneColumns;
+import com.android.providers.contacts.OpenHelper.PresenceColumns;
import com.android.providers.contacts.OpenHelper.RawContactsColumns;
import com.android.providers.contacts.OpenHelper.StatusUpdatesColumns;
import com.android.providers.contacts.OpenHelper.Tables;
@@ -131,11 +132,12 @@ public class LegacyApiSupport {
+ PEOPLE_JOINS;
public static final String PRESENCE_JOINS =
- " LEFT OUTER JOIN presence" +
- " ON (" + " presence." + StatusUpdates.DATA_ID
- + " = (SELECT max(" + StatusUpdates.DATA_ID + ")" +
- " FROM presence" +
- " WHERE people._id = presence_raw_contact_id))";
+ " LEFT OUTER JOIN " + Tables.PRESENCE +
+ " ON (" + Tables.PRESENCE + "." + StatusUpdates.DATA_ID + "=" +
+ "(SELECT MAX(" + StatusUpdates.DATA_ID + ")" +
+ " FROM " + Tables.PRESENCE +
+ " WHERE people._id = " + PresenceColumns.RAW_CONTACT_ID + ")" +
+ " )";
private static final String PHONETIC_NAME_SQL = "trim(trim("
+ "ifnull(name." + StructuredName.PHONETIC_GIVEN_NAME + ",' ')||' '||"
diff --git a/src/com/android/providers/contacts/OpenHelper.java b/src/com/android/providers/contacts/OpenHelper.java
index e8a4c4de..99b66c13 100644
--- a/src/com/android/providers/contacts/OpenHelper.java
+++ b/src/com/android/providers/contacts/OpenHelper.java
@@ -444,8 +444,6 @@ import java.util.HashMap;
public interface StatusUpdatesColumns {
String DATA_ID = "status_update_data_id";
- String TIMESTAMP = "status_timestamp";
- String STATUS = "status_update";
}
/** In-memory cache of previously found mimetype mappings */
@@ -959,8 +957,11 @@ import java.util.HashMap;
db.execSQL("CREATE TABLE " + Tables.STATUS_UPDATES + " (" +
StatusUpdatesColumns.DATA_ID + " INTEGER PRIMARY KEY REFERENCES data(_id)," +
- StatusUpdatesColumns.TIMESTAMP + " INTEGER," +
- StatusUpdatesColumns.STATUS + " TEXT" +
+ StatusUpdates.STATUS + " TEXT," +
+ StatusUpdates.STATUS_TIMESTAMP + " INTEGER," +
+ StatusUpdates.STATUS_RES_PACKAGE + " TEXT, " +
+ StatusUpdates.STATUS_LABEL + " INTEGER, " +
+ StatusUpdates.STATUS_ICON + " INTEGER" +
");");
String contactEntitiesSelect = "SELECT "