Always return correct folder capabilities

* This requires us to use a MatrixCursor based on individual
  Mailbox queries

Bug: 7059516
Change-Id: Ie9481a519d3d876464985924e5e7ad6d987c3945
This commit is contained in:
Marc Blank 2012-08-28 10:40:37 -07:00
parent a0ebe8adb9
commit 5ac8d38796
1 changed files with 58 additions and 24 deletions

View File

@ -2599,6 +2599,30 @@ outer:
return sb.toString();
}
private int getFolderCapabilities(EmailServiceInfo info, int flags, int type, long mailboxId) {
// All folders support delete
int caps = UIProvider.FolderCapabilities.DELETE;
if (info != null && info.offerLookback) {
// Protocols supporting lookback support settings
caps |= UIProvider.FolderCapabilities.SUPPORTS_SETTINGS;
if ((flags & Mailbox.FLAG_ACCEPTS_MOVED_MAIL) != 0) {
// If the mailbox can accept moved mail, report that as well
caps |= UIProvider.FolderCapabilities.CAN_ACCEPT_MOVED_MESSAGES;
}
}
// For trash, we don't allow undo
if (type == Mailbox.TYPE_TRASH) {
caps = UIProvider.FolderCapabilities.CAN_ACCEPT_MOVED_MESSAGES |
UIProvider.FolderCapabilities.CAN_HOLD_MAIL |
UIProvider.FolderCapabilities.DELETE |
UIProvider.FolderCapabilities.DELETE_ACTION_FINAL;
}
if (isVirtualMailbox(mailboxId)) {
caps |= UIProvider.FolderCapabilities.IS_VIRTUAL;
}
return caps;
}
/**
* Generate a "single mailbox" SQLite query, given a projection from UnifiedEmail
*
@ -2623,34 +2647,14 @@ outer:
String protocol = Account.getProtocol(context, mailbox.mAccountKey);
EmailServiceInfo info = EmailServiceUtils.getServiceInfo(context, protocol);
// All folders support delete
int caps = UIProvider.FolderCapabilities.DELETE;
if (info != null && !info.offerLookback) {
// "load more" is valid for protocols not supporting "lookback"
values.put(UIProvider.FolderColumns.LOAD_MORE_URI,
uiUriString("uiloadmore", mailboxId));
} else {
// Protocols supporting lookback support settings
caps |= UIProvider.FolderCapabilities.SUPPORTS_SETTINGS;
if ((mailbox.mFlags & Mailbox.FLAG_ACCEPTS_MOVED_MAIL) != 0) {
// If the mailbox can accept moved mail, report that as well
caps |= UIProvider.FolderCapabilities.CAN_ACCEPT_MOVED_MESSAGES;
}
}
values.put(UIProvider.FolderColumns.CAPABILITIES, caps);
// For trash, we don't allow undo
if (mailbox.mType == Mailbox.TYPE_TRASH) {
values.put(UIProvider.FolderColumns.CAPABILITIES,
UIProvider.FolderCapabilities.CAN_ACCEPT_MOVED_MESSAGES |
UIProvider.FolderCapabilities.CAN_HOLD_MAIL |
UIProvider.FolderCapabilities.DELETE |
UIProvider.FolderCapabilities.DELETE_ACTION_FINAL);
}
if (isVirtualMailbox(mailboxId)) {
int capa = values.getAsInteger(UIProvider.FolderColumns.CAPABILITIES);
values.put(UIProvider.FolderColumns.CAPABILITIES,
capa | UIProvider.FolderCapabilities.IS_VIRTUAL);
}
}
};
values.put(UIProvider.FolderColumns.CAPABILITIES,
getFolderCapabilities(info, mailbox.mFlags, mailbox.mType, mailboxId));
}
}
StringBuilder sb = genSelect(sFolderListMap, uiProjection, values);
sb.append(" FROM " + Mailbox.TABLE_NAME + " WHERE " + MailboxColumns.ID + "=?");
@ -3116,6 +3120,7 @@ outer:
return mc;
} else {
Cursor c = db.rawQuery(genQueryAccountMailboxes(uiProjection), new String[] {id});
c = getFolderListCursor(db, c, uiProjection);
int numStarred = EmailContent.count(context, Message.CONTENT_URI,
MessageColumns.ACCOUNT_KEY + "=? AND " + MessageColumns.FLAG_FAVORITE + "=1",
new String[] {id});
@ -3239,6 +3244,33 @@ outer:
}
}
/**
* We need to do individual queries for the mailboxes in order to get correct
* folder capabilities.
*/
Cursor getFolderListCursor(SQLiteDatabase db, Cursor c, String[] uiProjection) {
final MatrixCursor mc = new MatrixCursor(uiProjection);
Object[] values = new Object[uiProjection.length];
String[] args = new String[1];
try {
// Loop through mailboxes, building matrix cursor
while (c.moveToNext()) {
String id = c.getString(0);
args[0] = id;
Cursor mailboxCursor = db.rawQuery(genQueryMailbox(uiProjection, id), args);
if (mailboxCursor.moveToNext()) {
for (int i = 0; i < uiProjection.length; i++) {
values[i] = mailboxCursor.getString(i);
}
mc.addRow(values);
}
}
} finally {
c.close();
}
return mc;
}
/**
* Handle UnifiedEmail queries here (dispatched from query())
*
@ -3258,6 +3290,7 @@ outer:
switch(match) {
case UI_ALL_FOLDERS:
c = db.rawQuery(genQueryAccountAllMailboxes(uiProjection), new String[] {id});
c = getFolderListCursor(db, c, uiProjection);
break;
case UI_RECENT_FOLDERS:
c = db.rawQuery(genQueryRecentMailboxes(uiProjection), new String[] {id});
@ -3265,6 +3298,7 @@ outer:
break;
case UI_SUBFOLDERS:
c = db.rawQuery(genQuerySubfolders(uiProjection), new String[] {id});
c = getFolderListCursor(db, c, uiProjection);
break;
case UI_MESSAGES:
long mailboxId = Long.parseLong(id);