am 1d3f98c5
: Merge "Store UI-friendly addresses in EmailProvider database"
* commit '1d3f98c5229d0cb9f270a1601b71b8d887cf5416': Store UI-friendly addresses in EmailProvider database
This commit is contained in:
commit
03542599ea
@ -352,14 +352,21 @@ public class Address {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Unpacks an address list previously packed with pack()
|
* Unpacks an address list that is either CSV of RFC822 addresses OR (for backward
|
||||||
* @param addressList String with packed addresses as returned by pack()
|
* compatibility) previously packed with pack()
|
||||||
|
* @param addressList string packed with pack() or CSV of RFC822 addresses
|
||||||
* @return array of addresses resulting from unpack
|
* @return array of addresses resulting from unpack
|
||||||
*/
|
*/
|
||||||
public static Address[] unpack(String addressList) {
|
public static Address[] unpack(String addressList) {
|
||||||
if (addressList == null || addressList.length() == 0) {
|
if (addressList == null || addressList.length() == 0) {
|
||||||
return EMPTY_ADDRESS_ARRAY;
|
return EMPTY_ADDRESS_ARRAY;
|
||||||
}
|
}
|
||||||
|
// IF we're CSV, just parse
|
||||||
|
if ((addressList.indexOf(LIST_DELIMITER_PERSONAL) == -1) &&
|
||||||
|
(addressList.indexOf(LIST_DELIMITER_EMAIL) == -1)) {
|
||||||
|
return Address.parse(addressList);
|
||||||
|
}
|
||||||
|
// Otherwise, do backward-compatibile unpack
|
||||||
ArrayList<Address> addresses = new ArrayList<Address>();
|
ArrayList<Address> addresses = new ArrayList<Address>();
|
||||||
int length = addressList.length();
|
int length = addressList.length();
|
||||||
int pairStartIndex = 0;
|
int pairStartIndex = 0;
|
||||||
@ -395,45 +402,11 @@ public class Address {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Packs an address list into a String that is very quick to read
|
* Generate a String containing RFC822 addresses separated by commas
|
||||||
* and parse. Packed lists can be unpacked with unpack().
|
* NOTE: We used to "pack" these addresses in an app-specific format, but no longer do so
|
||||||
* The format is a series of packed addresses separated by LIST_DELIMITER_EMAIL.
|
|
||||||
* Each address is packed as
|
|
||||||
* a pair of address and personal separated by LIST_DELIMITER_PERSONAL,
|
|
||||||
* where the personal and delimiter are optional.
|
|
||||||
* E.g. "foo@x.com\1joe@x.com\2Joe Doe"
|
|
||||||
* @param addresses Array of addresses
|
|
||||||
* @return a string containing the packed addresses.
|
|
||||||
*/
|
*/
|
||||||
public static String pack(Address[] addresses) {
|
public static String pack(Address[] addresses) {
|
||||||
// TODO: return same value for both null & empty list
|
return Address.toHeader(addresses);
|
||||||
if (addresses == null) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
final int nAddr = addresses.length;
|
|
||||||
if (nAddr == 0) {
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
// shortcut: one email with no displayName
|
|
||||||
if (nAddr == 1 && addresses[0].getPersonal() == null) {
|
|
||||||
return addresses[0].getAddress();
|
|
||||||
}
|
|
||||||
|
|
||||||
StringBuffer sb = new StringBuffer();
|
|
||||||
for (int i = 0; i < nAddr; i++) {
|
|
||||||
if (i != 0) {
|
|
||||||
sb.append(LIST_DELIMITER_EMAIL);
|
|
||||||
}
|
|
||||||
final Address address = addresses[i];
|
|
||||||
sb.append(address.getAddress());
|
|
||||||
final String displayName = address.getPersonal();
|
|
||||||
if (displayName != null) {
|
|
||||||
sb.append(LIST_DELIMITER_PERSONAL);
|
|
||||||
sb.append(displayName);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return sb.toString();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -35,6 +35,7 @@ import android.database.sqlite.SQLiteDatabase;
|
|||||||
import android.database.sqlite.SQLiteException;
|
import android.database.sqlite.SQLiteException;
|
||||||
import android.database.sqlite.SQLiteOpenHelper;
|
import android.database.sqlite.SQLiteOpenHelper;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
|
import android.os.Debug;
|
||||||
import android.provider.BaseColumns;
|
import android.provider.BaseColumns;
|
||||||
import android.provider.ContactsContract;
|
import android.provider.ContactsContract;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
@ -48,6 +49,7 @@ import com.android.email.service.AttachmentDownloadService;
|
|||||||
import com.android.emailcommon.AccountManagerTypes;
|
import com.android.emailcommon.AccountManagerTypes;
|
||||||
import com.android.emailcommon.CalendarProviderStub;
|
import com.android.emailcommon.CalendarProviderStub;
|
||||||
import com.android.emailcommon.Logging;
|
import com.android.emailcommon.Logging;
|
||||||
|
import com.android.emailcommon.mail.Address;
|
||||||
import com.android.emailcommon.provider.Account;
|
import com.android.emailcommon.provider.Account;
|
||||||
import com.android.emailcommon.provider.EmailContent;
|
import com.android.emailcommon.provider.EmailContent;
|
||||||
import com.android.emailcommon.provider.EmailContent.AccountColumns;
|
import com.android.emailcommon.provider.EmailContent.AccountColumns;
|
||||||
@ -175,8 +177,9 @@ public class EmailProvider extends ContentProvider {
|
|||||||
// Version 27: Add protocolSearchInfo to Message table
|
// Version 27: Add protocolSearchInfo to Message table
|
||||||
// Version 28: Add notifiedMessageId and notifiedMessageCount to Account
|
// Version 28: Add notifiedMessageId and notifiedMessageCount to Account
|
||||||
// Version 29: Add protocolPoliciesEnforced and protocolPoliciesUnsupported to Policy
|
// Version 29: Add protocolPoliciesEnforced and protocolPoliciesUnsupported to Policy
|
||||||
|
// Version 30: Use CSV of RFC822 addresses instead of "packed" values
|
||||||
|
|
||||||
public static final int DATABASE_VERSION = 29;
|
public static final int DATABASE_VERSION = 30;
|
||||||
|
|
||||||
// Any changes to the database format *must* include update-in-place code.
|
// Any changes to the database format *must* include update-in-place code.
|
||||||
// Original version: 2
|
// Original version: 2
|
||||||
@ -1388,6 +1391,10 @@ public class EmailProvider extends ContentProvider {
|
|||||||
}
|
}
|
||||||
oldVersion = 29;
|
oldVersion = 29;
|
||||||
}
|
}
|
||||||
|
if (oldVersion == 29) {
|
||||||
|
upgradeFromVersion29ToVersion30(db);
|
||||||
|
oldVersion = 30;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -2677,6 +2684,42 @@ outer:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Upgrades the database from v29 to v30 by updating all address fields in Message */
|
||||||
|
private static final int[] ADDRESS_COLUMN_INDICES = new int[] {
|
||||||
|
Message.CONTENT_BCC_LIST_COLUMN, Message.CONTENT_CC_LIST_COLUMN,
|
||||||
|
Message.CONTENT_FROM_LIST_COLUMN, Message.CONTENT_REPLY_TO_COLUMN,
|
||||||
|
Message.CONTENT_TO_LIST_COLUMN
|
||||||
|
};
|
||||||
|
private static final String[] ADDRESS_COLUMN_NAMES = new String[] {
|
||||||
|
Message.BCC_LIST, Message.CC_LIST, Message.FROM_LIST, Message.REPLY_TO_LIST, Message.TO_LIST
|
||||||
|
};
|
||||||
|
|
||||||
|
private static void upgradeFromVersion29ToVersion30(SQLiteDatabase db) {
|
||||||
|
try {
|
||||||
|
// Loop through all messages, updating address columns to new format (CSV, RFC822)
|
||||||
|
Cursor messageCursor = db.query(Message.TABLE_NAME, Message.CONTENT_PROJECTION, null,
|
||||||
|
null, null, null, null);
|
||||||
|
ContentValues cv = new ContentValues();
|
||||||
|
String[] whereArgs = new String[1];
|
||||||
|
try {
|
||||||
|
while (messageCursor.moveToNext()) {
|
||||||
|
for (int i = 0; i < ADDRESS_COLUMN_INDICES.length; i++) {
|
||||||
|
Address[] addrs =
|
||||||
|
Address.unpack(messageCursor.getString(ADDRESS_COLUMN_INDICES[i]));
|
||||||
|
cv.put(ADDRESS_COLUMN_NAMES[i], Address.pack(addrs));
|
||||||
|
}
|
||||||
|
whereArgs[0] = messageCursor.getString(Message.CONTENT_ID_COLUMN);
|
||||||
|
db.update(Message.TABLE_NAME, cv, WHERE_ID, whereArgs);
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
messageCursor.close();
|
||||||
|
}
|
||||||
|
} catch (SQLException e) {
|
||||||
|
// Shouldn't be needed unless we're debugging and interrupt the process
|
||||||
|
Log.w(TAG, "Exception upgrading EmailProvider.db from 29 to 30 " + e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* For testing purposes, check whether a given row is cached
|
* For testing purposes, check whether a given row is cached
|
||||||
* @param baseUri the base uri of the EmailContent
|
* @param baseUri the base uri of the EmailContent
|
||||||
|
Loading…
Reference in New Issue
Block a user