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:
parent
a0ebe8adb9
commit
5ac8d38796
|
@ -2599,6 +2599,30 @@ outer:
|
||||||
return sb.toString();
|
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
|
* Generate a "single mailbox" SQLite query, given a projection from UnifiedEmail
|
||||||
*
|
*
|
||||||
|
@ -2623,34 +2647,14 @@ outer:
|
||||||
String protocol = Account.getProtocol(context, mailbox.mAccountKey);
|
String protocol = Account.getProtocol(context, mailbox.mAccountKey);
|
||||||
EmailServiceInfo info = EmailServiceUtils.getServiceInfo(context, protocol);
|
EmailServiceInfo info = EmailServiceUtils.getServiceInfo(context, protocol);
|
||||||
// All folders support delete
|
// All folders support delete
|
||||||
int caps = UIProvider.FolderCapabilities.DELETE;
|
|
||||||
if (info != null && !info.offerLookback) {
|
if (info != null && !info.offerLookback) {
|
||||||
// "load more" is valid for protocols not supporting "lookback"
|
// "load more" is valid for protocols not supporting "lookback"
|
||||||
values.put(UIProvider.FolderColumns.LOAD_MORE_URI,
|
values.put(UIProvider.FolderColumns.LOAD_MORE_URI,
|
||||||
uiUriString("uiloadmore", mailboxId));
|
uiUriString("uiloadmore", mailboxId));
|
||||||
} else {
|
};
|
||||||
// Protocols supporting lookback support settings
|
values.put(UIProvider.FolderColumns.CAPABILITIES,
|
||||||
caps |= UIProvider.FolderCapabilities.SUPPORTS_SETTINGS;
|
getFolderCapabilities(info, mailbox.mFlags, mailbox.mType, mailboxId));
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
StringBuilder sb = genSelect(sFolderListMap, uiProjection, values);
|
StringBuilder sb = genSelect(sFolderListMap, uiProjection, values);
|
||||||
sb.append(" FROM " + Mailbox.TABLE_NAME + " WHERE " + MailboxColumns.ID + "=?");
|
sb.append(" FROM " + Mailbox.TABLE_NAME + " WHERE " + MailboxColumns.ID + "=?");
|
||||||
|
@ -3116,6 +3120,7 @@ outer:
|
||||||
return mc;
|
return mc;
|
||||||
} else {
|
} else {
|
||||||
Cursor c = db.rawQuery(genQueryAccountMailboxes(uiProjection), new String[] {id});
|
Cursor c = db.rawQuery(genQueryAccountMailboxes(uiProjection), new String[] {id});
|
||||||
|
c = getFolderListCursor(db, c, uiProjection);
|
||||||
int numStarred = EmailContent.count(context, Message.CONTENT_URI,
|
int numStarred = EmailContent.count(context, Message.CONTENT_URI,
|
||||||
MessageColumns.ACCOUNT_KEY + "=? AND " + MessageColumns.FLAG_FAVORITE + "=1",
|
MessageColumns.ACCOUNT_KEY + "=? AND " + MessageColumns.FLAG_FAVORITE + "=1",
|
||||||
new String[] {id});
|
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())
|
* Handle UnifiedEmail queries here (dispatched from query())
|
||||||
*
|
*
|
||||||
|
@ -3258,6 +3290,7 @@ outer:
|
||||||
switch(match) {
|
switch(match) {
|
||||||
case UI_ALL_FOLDERS:
|
case UI_ALL_FOLDERS:
|
||||||
c = db.rawQuery(genQueryAccountAllMailboxes(uiProjection), new String[] {id});
|
c = db.rawQuery(genQueryAccountAllMailboxes(uiProjection), new String[] {id});
|
||||||
|
c = getFolderListCursor(db, c, uiProjection);
|
||||||
break;
|
break;
|
||||||
case UI_RECENT_FOLDERS:
|
case UI_RECENT_FOLDERS:
|
||||||
c = db.rawQuery(genQueryRecentMailboxes(uiProjection), new String[] {id});
|
c = db.rawQuery(genQueryRecentMailboxes(uiProjection), new String[] {id});
|
||||||
|
@ -3265,6 +3298,7 @@ outer:
|
||||||
break;
|
break;
|
||||||
case UI_SUBFOLDERS:
|
case UI_SUBFOLDERS:
|
||||||
c = db.rawQuery(genQuerySubfolders(uiProjection), new String[] {id});
|
c = db.rawQuery(genQuerySubfolders(uiProjection), new String[] {id});
|
||||||
|
c = getFolderListCursor(db, c, uiProjection);
|
||||||
break;
|
break;
|
||||||
case UI_MESSAGES:
|
case UI_MESSAGES:
|
||||||
long mailboxId = Long.parseLong(id);
|
long mailboxId = Long.parseLong(id);
|
||||||
|
|
Loading…
Reference in New Issue