/* * Copyright (C) 2011 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.email; import com.android.emailcommon.provider.EmailContent.MailboxColumns; import com.android.emailcommon.provider.EmailContent.Message; import com.android.emailcommon.provider.Mailbox; import com.google.common.base.Preconditions; import android.content.Context; import android.content.res.TypedArray; import android.database.Cursor; import android.graphics.drawable.Drawable; // TODO When the UI is settled, cache all strings/drawables /** * Stores names and icons for system folders. System folders are those with special * meaning, such as Inbox, Drafts, Trash, etc... Although these folders may or may * not exist on the server, we want to ensure they are displayed in a very specific * manner. * * Some methods probably should belong to {@link Mailbox}, but as this class uses resources, * we can't move them to emailcommon... */ public class FolderProperties { private static FolderProperties sInstance; private final Context mContext; // Caches for frequently accessed resources. private final String[] mSpecialMailbox; private final TypedArray mSpecialMailboxDrawable; private final Drawable mSummaryStarredMailboxDrawable; private final Drawable mSummaryCombinedInboxDrawable; private FolderProperties(Context context) { mContext = context.getApplicationContext(); mSpecialMailbox = context.getResources().getStringArray(R.array.mailbox_display_names); for (int i = 0; i < mSpecialMailbox.length; ++i) { if ("".equals(mSpecialMailbox[i])) { // there is no localized name, so use the display name from the server mSpecialMailbox[i] = null; } } mSpecialMailboxDrawable = context.getResources().obtainTypedArray(R.array.mailbox_display_icons); mSummaryStarredMailboxDrawable = context.getResources().getDrawable(R.drawable.ic_menu_star_holo_light); mSummaryCombinedInboxDrawable = context.getResources().getDrawable(R.drawable.ic_list_combined_inbox); } public static synchronized FolderProperties getInstance(Context context) { if (sInstance == null) { sInstance = new FolderProperties(context); } return sInstance; } public String getCombinedMailboxName(long mailboxId) { // Special combined mailboxes int resId = 0; // Can't use long for switch!? if (mailboxId == Mailbox.QUERY_ALL_INBOXES) { resId = R.string.account_folder_list_summary_inbox; } else if (mailboxId == Mailbox.QUERY_ALL_FAVORITES) { resId = R.string.account_folder_list_summary_starred; } else if (mailboxId == Mailbox.QUERY_ALL_DRAFTS) { resId = R.string.account_folder_list_summary_drafts; } else if (mailboxId == Mailbox.QUERY_ALL_OUTBOX) { resId = R.string.account_folder_list_summary_outbox; } if (resId != 0) { return mContext.getString(resId); } return null; } /** * Lookup names of localized special mailboxes */ private String getDisplayName(int type, long mailboxId) { String name = getCombinedMailboxName(mailboxId); if ((name == null) && (type < mSpecialMailbox.length)) { name = mSpecialMailbox[type]; } return name; } /** * Return the display name for a mailbox for UI. For normal mailboxes, it just returns * {@code originalDisplayName}, but for special mailboxes (such as combined mailboxes) it * returns a name obtained from the resource. * * @param mailboxType Such as {@link Mailbox#TYPE_INBOX} * @param mailboxId ID of a mailbox. * @param originalDisplayName Display name of the mailbox stored in the database. */ public String getDisplayName(int mailboxType, long mailboxId, String originalDisplayName) { String name = getDisplayName(mailboxType, mailboxId); if (name != null) { return name; } return originalDisplayName; } /** * Same as {@link #getDisplayName(int, long, String)}, but gets information form a mailbox * cursor. The cursor must contain the following columns: * {@link MailboxColumns#ID}, {@link MailboxColumns#TYPE} and * {@link MailboxColumns#DISPLAY_NAME}. */ public String getDisplayName(Cursor mailboxCursor) { final Cursor c = mailboxCursor; return getDisplayName( c.getInt(c.getColumnIndex(MailboxColumns.TYPE)), c.getLong(c.getColumnIndex(MailboxColumns.ID)), c.getString(c.getColumnIndex(MailboxColumns.DISPLAY_NAME)) ); } public String getDisplayName(Mailbox mailbox) { return getDisplayName(mailbox.mType, mailbox.mId, mailbox.mDisplayName); } /** * Return the message count which should be shown with a mailbox name. Depending on * the mailbox type, we change what to show. * * @param mailboxType Such as {@link Mailbox#TYPE_INBOX} * @param unreadCount Count obtained from {@link MailboxColumns#UNREAD_COUNT} * @param totalCount Count obtained from {@link MailboxColumns#MESSAGE_COUNT} */ public int getMessageCount(int mailboxType, int unreadCount, int totalCount) { switch (mailboxType) { case Mailbox.TYPE_DRAFTS: case Mailbox.TYPE_OUTBOX: return totalCount; case Mailbox.TYPE_SENT: case Mailbox.TYPE_TRASH: return 0; // We don't show a count for sent/trash. } return unreadCount; } /** * Same as {@link #getMessageCount(int, int, int)}, but gets information form a mailbox * cursor. The cursor must contain the following columns: * {@link MailboxColumns#TYPE}, {@link MailboxColumns#UNREAD_COUNT} and * {@link MailboxColumns#MESSAGE_COUNT}. */ public int getMessageCount(Cursor mailboxCursor) { final Cursor c = mailboxCursor; return getMessageCount( c.getInt(c.getColumnIndex(MailboxColumns.TYPE)), c.getInt(c.getColumnIndex(MailboxColumns.UNREAD_COUNT)), c.getInt(c.getColumnIndex(MailboxColumns.MESSAGE_COUNT)) ); } /** * @return message count to show for the UI for a combined inbox. * * Note this method doesn't use mContext so we can inject a mock context for provider * access. So it's static. */ public static int getMessageCountForCombinedMailbox(Context context, long mailboxId) { Preconditions.checkState(mailboxId < -1L); if ((mailboxId == Mailbox.QUERY_ALL_INBOXES) || (mailboxId == Mailbox.QUERY_ALL_UNREAD)) { return Mailbox.getUnreadCountByMailboxType(context, Mailbox.TYPE_INBOX); } else if (mailboxId == Mailbox.QUERY_ALL_FAVORITES) { return Message.getFavoriteMessageCount(context); } else if (mailboxId == Mailbox.QUERY_ALL_DRAFTS) { return Mailbox.getMessageCountByMailboxType(context, Mailbox.TYPE_DRAFTS); } else if (mailboxId == Mailbox.QUERY_ALL_OUTBOX) { return Mailbox.getMessageCountByMailboxType(context, Mailbox.TYPE_OUTBOX); } throw new IllegalStateException("Invalid mailbox ID"); } /** * Lookup icons of special mailboxes */ public Drawable getIcon(int type, long mailboxId, int mailboxFlags) { if (mailboxId == Mailbox.QUERY_ALL_INBOXES) { return mSummaryCombinedInboxDrawable; } else if (mailboxId == Mailbox.QUERY_ALL_FAVORITES) { return mSummaryStarredMailboxDrawable; } else if (mailboxId == Mailbox.QUERY_ALL_DRAFTS) { return mSpecialMailboxDrawable.getDrawable(Mailbox.TYPE_DRAFTS); } else if (mailboxId == Mailbox.QUERY_ALL_OUTBOX) { return mSpecialMailboxDrawable.getDrawable(Mailbox.TYPE_OUTBOX); } if (0 <= type && type < mSpecialMailboxDrawable.length()) { final int resId = mSpecialMailboxDrawable.getResourceId(type, -1); if (resId != -1) { return mContext.getResources().getDrawable(resId); } } return null; // No icon } }