1 /* 2 * Copyright (C) 2011 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.email; 18 19 import com.android.emailcommon.provider.EmailContent.MailboxColumns; 20 import com.android.emailcommon.provider.EmailContent.Message; 21 import com.android.emailcommon.provider.Mailbox; 22 import com.google.common.base.Preconditions; 23 24 import android.content.Context; 25 import android.content.res.TypedArray; 26 import android.database.Cursor; 27 import android.graphics.drawable.Drawable; 28 29 30 // TODO When the UI is settled, cache all strings/drawables 31 /** 32 * Stores names and icons for system folders. System folders are those with special 33 * meaning, such as Inbox, Drafts, Trash, etc... Although these folders may or may 34 * not exist on the server, we want to ensure they are displayed in a very specific 35 * manner. 36 * 37 * Some methods probably should belong to {@link Mailbox}, but as this class uses resources, 38 * we can't move them to emailcommon... 39 */ 40 public class FolderProperties { 41 42 private static FolderProperties sInstance; 43 44 private final Context mContext; 45 46 // Caches for frequently accessed resources. 47 private final String[] mSpecialMailbox; 48 private final TypedArray mSpecialMailboxDrawable; 49 private final Drawable mSummaryStarredMailboxDrawable; 50 private final Drawable mSummaryCombinedInboxDrawable; 51 52 private FolderProperties(Context context) { 53 mContext = context.getApplicationContext(); 54 mSpecialMailbox = context.getResources().getStringArray(R.array.mailbox_display_names); 55 for (int i = 0; i < mSpecialMailbox.length; ++i) { 56 if ("".equals(mSpecialMailbox[i])) { 57 // there is no localized name, so use the display name from the server 58 mSpecialMailbox[i] = null; 59 } 60 } 61 mSpecialMailboxDrawable = 62 context.getResources().obtainTypedArray(R.array.mailbox_display_icons); 63 mSummaryStarredMailboxDrawable = 64 context.getResources().getDrawable(R.drawable.ic_menu_star_holo_light); 65 mSummaryCombinedInboxDrawable = 66 context.getResources().getDrawable(R.drawable.ic_list_combined_inbox); 67 } 68 69 public static synchronized FolderProperties getInstance(Context context) { 70 if (sInstance == null) { 71 sInstance = new FolderProperties(context); 72 } 73 return sInstance; 74 } 75 76 public String getCombinedMailboxName(long mailboxId) { 77 // Special combined mailboxes 78 int resId = 0; 79 80 // Can't use long for switch!? 81 if (mailboxId == Mailbox.QUERY_ALL_INBOXES) { 82 resId = R.string.account_folder_list_summary_inbox; 83 } else if (mailboxId == Mailbox.QUERY_ALL_FAVORITES) { 84 resId = R.string.account_folder_list_summary_starred; 85 } else if (mailboxId == Mailbox.QUERY_ALL_DRAFTS) { 86 resId = R.string.account_folder_list_summary_drafts; 87 } else if (mailboxId == Mailbox.QUERY_ALL_OUTBOX) { 88 resId = R.string.account_folder_list_summary_outbox; 89 } 90 if (resId != 0) { 91 return mContext.getString(resId); 92 } 93 return null; 94 } 95 96 /** 97 * Lookup names of localized special mailboxes 98 */ 99 private String getDisplayName(int type, long mailboxId) { 100 String name = getCombinedMailboxName(mailboxId); 101 102 if ((name == null) && (type < mSpecialMailbox.length)) { 103 name = mSpecialMailbox[type]; 104 } 105 return name; 106 } 107 108 /** 109 * Return the display name for a mailbox for UI. For normal mailboxes, it just returns 110 * {@code originalDisplayName}, but for special mailboxes (such as combined mailboxes) it 111 * returns a name obtained from the resource. 112 * 113 * @param mailboxType Such as {@link Mailbox#TYPE_INBOX} 114 * @param mailboxId ID of a mailbox. 115 * @param originalDisplayName Display name of the mailbox stored in the database. 116 */ 117 public String getDisplayName(int mailboxType, long mailboxId, String originalDisplayName) { 118 String name = getDisplayName(mailboxType, mailboxId); 119 if (name != null) { 120 return name; 121 } 122 return originalDisplayName; 123 } 124 125 /** 126 * Same as {@link #getDisplayName(int, long, String)}, but gets information form a mailbox 127 * cursor. The cursor must contain the following columns: 128 * {@link MailboxColumns#ID}, {@link MailboxColumns#TYPE} and 129 * {@link MailboxColumns#DISPLAY_NAME}. 130 */ 131 public String getDisplayName(Cursor mailboxCursor) { 132 final Cursor c = mailboxCursor; 133 return getDisplayName( 134 c.getInt(c.getColumnIndex(MailboxColumns.TYPE)), 135 c.getLong(c.getColumnIndex(MailboxColumns.ID)), 136 c.getString(c.getColumnIndex(MailboxColumns.DISPLAY_NAME)) 137 ); 138 } 139 140 public String getDisplayName(Mailbox mailbox) { 141 return getDisplayName(mailbox.mType, mailbox.mId, mailbox.mDisplayName); 142 } 143 144 /** 145 * Return the message count which should be shown with a mailbox name. Depending on 146 * the mailbox type, we change what to show. 147 * 148 * @param mailboxType Such as {@link Mailbox#TYPE_INBOX} 149 * @param unreadCount Count obtained from {@link MailboxColumns#UNREAD_COUNT} 150 * @param totalCount Count obtained from {@link MailboxColumns#MESSAGE_COUNT} 151 */ 152 public int getMessageCount(int mailboxType, int unreadCount, int totalCount) { 153 switch (mailboxType) { 154 case Mailbox.TYPE_DRAFTS: 155 case Mailbox.TYPE_OUTBOX: 156 return totalCount; 157 case Mailbox.TYPE_SENT: 158 case Mailbox.TYPE_TRASH: 159 return 0; // We don't show a count for sent/trash. 160 } 161 return unreadCount; 162 } 163 164 /** 165 * Same as {@link #getMessageCount(int, int, int)}, but gets information form a mailbox 166 * cursor. The cursor must contain the following columns: 167 * {@link MailboxColumns#TYPE}, {@link MailboxColumns#UNREAD_COUNT} and 168 * {@link MailboxColumns#MESSAGE_COUNT}. 169 */ 170 public int getMessageCount(Cursor mailboxCursor) { 171 final Cursor c = mailboxCursor; 172 return getMessageCount( 173 c.getInt(c.getColumnIndex(MailboxColumns.TYPE)), 174 c.getInt(c.getColumnIndex(MailboxColumns.UNREAD_COUNT)), 175 c.getInt(c.getColumnIndex(MailboxColumns.MESSAGE_COUNT)) 176 ); 177 } 178 179 /** 180 * @return message count to show for the UI for a combined inbox. 181 * 182 * Note this method doesn't use mContext so we can inject a mock context for provider 183 * access. So it's static. 184 */ 185 public static int getMessageCountForCombinedMailbox(Context context, long mailboxId) { 186 Preconditions.checkState(mailboxId < -1L); 187 if ((mailboxId == Mailbox.QUERY_ALL_INBOXES) 188 || (mailboxId == Mailbox.QUERY_ALL_UNREAD)) { 189 return Mailbox.getUnreadCountByMailboxType(context, Mailbox.TYPE_INBOX); 190 191 } else if (mailboxId == Mailbox.QUERY_ALL_FAVORITES) { 192 return Message.getFavoriteMessageCount(context); 193 194 } else if (mailboxId == Mailbox.QUERY_ALL_DRAFTS) { 195 return Mailbox.getMessageCountByMailboxType(context, Mailbox.TYPE_DRAFTS); 196 197 } else if (mailboxId == Mailbox.QUERY_ALL_OUTBOX) { 198 return Mailbox.getMessageCountByMailboxType(context, Mailbox.TYPE_OUTBOX); 199 } 200 throw new IllegalStateException("Invalid mailbox ID"); 201 } 202 203 /** 204 * Lookup icons of special mailboxes 205 */ 206 public Drawable getIcon(int type, long mailboxId, int mailboxFlags) { 207 if (mailboxId == Mailbox.QUERY_ALL_INBOXES) { 208 return mSummaryCombinedInboxDrawable; 209 } else if (mailboxId == Mailbox.QUERY_ALL_FAVORITES) { 210 return mSummaryStarredMailboxDrawable; 211 } else if (mailboxId == Mailbox.QUERY_ALL_DRAFTS) { 212 return mSpecialMailboxDrawable.getDrawable(Mailbox.TYPE_DRAFTS); 213 } else if (mailboxId == Mailbox.QUERY_ALL_OUTBOX) { 214 return mSpecialMailboxDrawable.getDrawable(Mailbox.TYPE_OUTBOX); 215 } 216 if (0 <= type && type < mSpecialMailboxDrawable.length()) { 217 final int resId = mSpecialMailboxDrawable.getResourceId(type, -1); 218 if (resId != -1) { 219 return mContext.getResources().getDrawable(resId); 220 } 221 } 222 return null; // No icon 223 } 224 } 225 226