diff --git a/src/com/fsck/k9/K9.java b/src/com/fsck/k9/K9.java index edc018349..cd86f617f 100644 --- a/src/com/fsck/k9/K9.java +++ b/src/com/fsck/k9/K9.java @@ -566,13 +566,15 @@ public class K9 extends Application { @Override public void folderStatusChanged(Account account, String folderName, int unreadMessageCount) { + updateUnreadWidget(); - } + + // let observers know a change occurred + Intent intent = new Intent(K9.Intents.EmailReceived.ACTION_REFRESH_OBSERVER, null); + intent.putExtra(K9.Intents.EmailReceived.EXTRA_ACCOUNT, account.getDescription()); + intent.putExtra(K9.Intents.EmailReceived.EXTRA_FOLDER, folderName); + K9.this.sendBroadcast(intent); - @Override - public void searchStats(final AccountStats stats) { - // let observers know a fetch occurred - K9.this.sendBroadcast(new Intent(K9.Intents.EmailReceived.ACTION_REFRESH_OBSERVER, null)); } }); diff --git a/src/com/fsck/k9/provider/MessageProvider.java b/src/com/fsck/k9/provider/MessageProvider.java index 0557575af..b8029c1d0 100644 --- a/src/com/fsck/k9/provider/MessageProvider.java +++ b/src/com/fsck/k9/provider/MessageProvider.java @@ -28,6 +28,7 @@ import com.fsck.k9.activity.MessageList; import com.fsck.k9.controller.MessagingController; import com.fsck.k9.controller.MessagingListener; import com.fsck.k9.helper.MessageHelper; +import com.fsck.k9.mail.Flag; import com.fsck.k9.mail.Folder; import com.fsck.k9.mail.Message; import com.fsck.k9.mail.MessagingException; @@ -81,7 +82,31 @@ public class MessageProvider extends ContentProvider { */ String UNREAD = "unread"; + /** + *

Type: TEXT

+ */ String ACCOUNT = "account"; + + /** + *

Type: INTEGER

+ */ + String ACCOUNT_NUMBER = "accountNumber"; + + /** + *

Type: BOOLEAN

+ */ + String HAS_ATTACHMENTS = "hasAttachments"; + + /** + *

Type: BOOLEAN

+ */ + String HAS_STAR = "hasStar"; + + /** + *

Type: INTEGER

+ */ + String ACCOUNT_COLOR = "accountColor"; + String URI = "uri"; String DELETE_URI = "delUri"; @@ -196,7 +221,35 @@ public class MessageProvider extends ContentProvider { return source.message.getFolder().getAccount().getDescription(); } } - + + public static class AccountColorExtractor implements FieldExtractor { + @Override + public Integer getField(final MessageInfoHolder source) { + return source.message.getFolder().getAccount().getChipColor(); + } + } + + public static class AccountNumberExtractor implements FieldExtractor { + @Override + public Integer getField(final MessageInfoHolder source) { + return source.message.getFolder().getAccount().getAccountNumber(); + } + } + + public static class HasAttachmentsExtractor implements FieldExtractor { + @Override + public Boolean getField(final MessageInfoHolder source) { + return source.message.hasAttachments(); + } + } + + public static class HasStarExtractor implements FieldExtractor { + @Override + public Boolean getField(final MessageInfoHolder source) { + return source.message.isSet(Flag.FLAGGED); + } + } + public static class UnreadExtractor implements FieldExtractor { @Override public Boolean getField(final MessageInfoHolder source) { @@ -311,10 +364,18 @@ public class MessageProvider extends ContentProvider { extractors.put(field, new UriExtractor()); } else if (MessageColumns.DELETE_URI.equals(field)) { extractors.put(field, new DeleteUriExtractor()); - } else if (MessageColumns.ACCOUNT.equals(field)) { - extractors.put(field, new AccountExtractor()); } else if (MessageColumns.UNREAD.equals(field)) { extractors.put(field, new UnreadExtractor()); + } else if (MessageColumns.ACCOUNT.equals(field)) { + extractors.put(field, new AccountExtractor()); + } else if (MessageColumns.ACCOUNT_COLOR.equals(field)) { + extractors.put(field, new AccountColorExtractor()); + } else if (MessageColumns.ACCOUNT_NUMBER.equals(field)) { + extractors.put(field, new AccountNumberExtractor()); + } else if (MessageColumns.HAS_ATTACHMENTS.equals(field)) { + extractors.put(field, new HasAttachmentsExtractor()); + } else if (MessageColumns.HAS_STAR.equals(field)) { + extractors.put(field, new HasStarExtractor()); } else if (MessageColumns.INCREMENT.equals(field)) { extractors.put(field, new IncrementExtractor()); } @@ -328,7 +389,11 @@ public class MessageProvider extends ContentProvider { * Retrieve the account list. */ protected class AccountsQueryHandler implements QueryHandler { - + private static final String FIELD_ACCOUNT_NUMBER = "accountNumber"; + private static final String FIELD_ACCOUNT_NAME = "accountName"; + private static final String FIELD_ACCOUNT_UUID = "accountUuid"; + private static final String FIELD_ACCOUNT_COLOR = "accountColor"; + @Override public String getPath() { return "accounts"; @@ -337,18 +402,39 @@ public class MessageProvider extends ContentProvider { @Override public Cursor query(final Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) throws Exception { - return getAllAccounts(); + return getAllAccounts(projection); } - public Cursor getAllAccounts() { - String[] projection = new String[] { "accountNumber", "accountName" }; + public Cursor getAllAccounts(String[] projection) { + // Default projection + if(projection == null) { + projection = new String[] { FIELD_ACCOUNT_NUMBER, FIELD_ACCOUNT_NAME }; + } + MatrixCursor ret = new MatrixCursor(projection); for (Account account : Preferences.getPreferences(getContext()).getAccounts()) { - Object[] values = new Object[2]; - values[0] = account.getAccountNumber(); - values[1] = account.getDescription(); + Object[] values = new Object[projection.length]; + + // Build account row + int fieldIndex = 0; + for(String field : projection) { + + if(FIELD_ACCOUNT_NUMBER.equals(field)) { + values[fieldIndex] = account.getAccountNumber(); + } else if(FIELD_ACCOUNT_NAME.equals(field)) { + values[fieldIndex] = account.getDescription(); + } else if(FIELD_ACCOUNT_UUID.equals(field)) { + values[fieldIndex] = account.getUuid(); + } else if(FIELD_ACCOUNT_COLOR.equals(field)) { + values[fieldIndex] = account.getChipColor(); + } else { + values[fieldIndex] = null; + } + ++fieldIndex; + } + ret.addRow(values); } @@ -879,7 +965,7 @@ public class MessageProvider extends ContentProvider { MessagingController.getInstance(application).addListener(new MessagingListener() { @Override - public void searchStats(final AccountStats stats) { + public void folderStatusChanged(Account account, String folderName, int unreadMessageCount) { application.getContentResolver().notifyChange(CONTENT_URI, null); } });