Action bar: Use laoder to get current mailbox info

Before this CL, we had this crazy plumbing from MailboxListFragment
to ActionBarController to update the current mailbox name/message count.

This wouldn't work on 1-pane, so now ABC just gets the current mailbox id
from UIC and loads the name/count with its own loader.

Also...
- Fixed bug 4904450 and bug 4460470: Now we consistently use FolderProperties
to get proler display names and message counts.

- Renamed some confusing names in AccountSelectorAdapter

Change-Id: Ic7bea6da6d2859006fb8f9263024c7d5e62b1e7f
This commit is contained in:
Makoto Onuki 2011-06-23 14:04:53 -07:00
parent bf3e65b667
commit 80d3875d30
11 changed files with 432 additions and 281 deletions

View File

@ -16,21 +16,24 @@
package com.android.email;
import com.android.emailcommon.provider.EmailContent.MailboxColumns;
import com.android.emailcommon.provider.Mailbox;
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
// TODO When the UI is settled, write up tests
// TODO When the UI is settled, remove backward-compatibility methods
/**
* 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 {
@ -68,20 +71,10 @@ public class FolderProperties {
return sInstance;
}
// For backward compatibility.
public String getDisplayName(int type) {
return getDisplayName(type, -1);
}
// For backward compatibility.
public Drawable getSummaryMailboxIconIds(long id) {
return getIcon(-1, id, 0);
}
/**
* Lookup names of localized special mailboxes
*/
public String getDisplayName(int type, long mailboxId) {
private String getDisplayName(int type, long mailboxId) {
// Special combined mailboxes
int resId = 0;
@ -105,6 +98,73 @@ public class FolderProperties {
return null;
}
/**
* 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))
);
}
/**
* 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))
);
}
/**
* Lookup icons of special mailboxes
*/

View File

@ -18,10 +18,12 @@ package com.android.email.activity;
import com.google.common.annotations.VisibleForTesting;
import com.android.email.FolderProperties;
import com.android.email.R;
import com.android.email.data.ClosingMatrixCursor;
import com.android.email.data.ThrottlingCursorLoader;
import com.android.emailcommon.provider.Account;
import com.android.emailcommon.provider.EmailContent;
import com.android.emailcommon.provider.EmailContent.MailboxColumns;
import com.android.emailcommon.provider.Mailbox;
import com.android.emailcommon.utility.Utility;
@ -46,8 +48,8 @@ import android.widget.TextView;
* TODO Test it!
*/
public class AccountSelectorAdapter extends CursorAdapter {
/** meta data column for an account's unread count */
private static final String UNREAD_COUNT = "unreadCount";
/** meta data column for an message count (unread or total, depending on row) */
private static final String MESSAGE_COUNT = "unreadCount";
/** meta data column for the row type; used for display purposes */
private static final String ROW_TYPE = "rowType";
/** meta data position of the currently selected account in the drop-down list */
@ -60,7 +62,7 @@ public class AccountSelectorAdapter extends CursorAdapter {
static final int UNKNOWN_POSITION = -1;
/** Projection for account database query */
private static final String[] ACCOUNT_PROJECTION = new String[] {
Account.ID,
EmailContent.RECORD_ID,
Account.DISPLAY_NAME,
Account.EMAIL_ADDRESS,
};
@ -70,10 +72,10 @@ public class AccountSelectorAdapter extends CursorAdapter {
*/
private static final String[] ADAPTER_PROJECTION = new String[] {
ROW_TYPE,
Account.ID,
EmailContent.RECORD_ID,
Account.DISPLAY_NAME,
Account.EMAIL_ADDRESS,
UNREAD_COUNT,
MESSAGE_COUNT,
ACCOUNT_POSITION,
};
@ -140,7 +142,7 @@ public class AccountSelectorAdapter extends CursorAdapter {
if (c.getInt(c.getColumnIndex(ROW_TYPE)) == ROW_TYPE_HEADER) {
view = mInflater.inflate(R.layout.account_selector_dropdown_header, parent, false);
final TextView displayNameView = (TextView) view.findViewById(R.id.display_name);
final String displayName = getAccountDisplayName(c);
final String displayName = getDisplayName(c);
displayNameView.setText(displayName);
} else {
view = mInflater.inflate(R.layout.account_selector_dropdown, parent, false);
@ -148,7 +150,7 @@ public class AccountSelectorAdapter extends CursorAdapter {
final TextView emailAddressView = (TextView) view.findViewById(R.id.email_address);
final TextView unreadCountView = (TextView) view.findViewById(R.id.unread_count);
final String displayName = getAccountDisplayName(position);
final String displayName = getDisplayName(position);
final String emailAddress = getAccountEmailAddress(position);
displayNameView.setText(displayName);
@ -162,11 +164,11 @@ public class AccountSelectorAdapter extends CursorAdapter {
}
boolean isAccount = isAccountItem(position);
long id = getAccountId(c);
long id = getId(c);
if (isAccount || id != Mailbox.NO_MAILBOX) {
unreadCountView.setVisibility(View.VISIBLE);
unreadCountView.setText(UiUtilities.getMessageCountForUi(mContext,
getAccountUnreadCount(position), false));
getAccountUnreadCount(position), true));
} else {
unreadCountView.setVisibility(View.INVISIBLE);
}
@ -177,7 +179,7 @@ public class AccountSelectorAdapter extends CursorAdapter {
@Override
public void bindView(View view, Context context, Cursor cursor) {
TextView textView = (TextView) view.findViewById(R.id.display_name);
textView.setText(getAccountDisplayName(cursor));
textView.setText(getDisplayName(cursor));
}
@Override
@ -216,9 +218,9 @@ public class AccountSelectorAdapter extends CursorAdapter {
return (c.getLong(c.getColumnIndex(ROW_TYPE)) == ROW_TYPE_MAILBOX);
}
private String getAccountDisplayName(int position) {
private String getDisplayName(int position) {
final Cursor c = getCursor();
return c.moveToPosition(position) ? getAccountDisplayName(c) : null;
return c.moveToPosition(position) ? getDisplayName(c) : null;
}
private String getAccountEmailAddress(int position) {
@ -228,7 +230,7 @@ public class AccountSelectorAdapter extends CursorAdapter {
private int getAccountUnreadCount(int position) {
final Cursor c = getCursor();
return c.moveToPosition(position) ? getAccountUnreadCount(c) : 0;
return c.moveToPosition(position) ? getMessageCount(c) : 0;
}
int getAccountPosition(int position) {
@ -236,13 +238,15 @@ public class AccountSelectorAdapter extends CursorAdapter {
return c.moveToPosition(position) ? getAccountPosition(c) : UNKNOWN_POSITION;
}
/** Returns the account ID extracted from the given cursor. */
private static long getAccountId(Cursor c) {
return c.getLong(c.getColumnIndex(Account.ID));
/**
* Returns the account/mailbox ID extracted from the given cursor.
*/
private static long getId(Cursor c) {
return c.getLong(c.getColumnIndex(EmailContent.RECORD_ID));
}
/** Returns the account name extracted from the given cursor. */
static String getAccountDisplayName(Cursor cursor) {
static String getDisplayName(Cursor cursor) {
return cursor.getString(cursor.getColumnIndex(Account.DISPLAY_NAME));
}
@ -251,9 +255,12 @@ public class AccountSelectorAdapter extends CursorAdapter {
return cursor.getString(cursor.getColumnIndex(Account.EMAIL_ADDRESS));
}
/** Returns the unread count extracted from the given cursor. */
private static int getAccountUnreadCount(Cursor cursor) {
return cursor.getInt(cursor.getColumnIndex(UNREAD_COUNT));
/**
* Returns the message count (unread or total, depending on row) extracted from the given
* cursor.
*/
private static int getMessageCount(Cursor cursor) {
return cursor.getInt(cursor.getColumnIndex(MESSAGE_COUNT));
}
/** Returns the account position extracted from the given cursor. */
@ -272,6 +279,7 @@ public class AccountSelectorAdapter extends CursorAdapter {
private final Context mContext;
private final long mAccountId;
private final boolean mUseTwoPane; // Injectable for test
private final FolderProperties mFolderProperties;
@VisibleForTesting
AccountsLoader(Context context, long accountId, boolean useTwoPane) {
@ -280,6 +288,7 @@ public class AccountSelectorAdapter extends CursorAdapter {
ORDER_BY);
mContext = context;
mAccountId = accountId;
mFolderProperties = FolderProperties.getInstance(mContext);
mUseTwoPane = useTwoPane;
}
@ -311,7 +320,7 @@ public class AccountSelectorAdapter extends CursorAdapter {
final long accountId = accountCursor.getLong(0);
final int unread = Mailbox.getUnreadCountByAccountAndMailboxType(
mContext, accountId, Mailbox.TYPE_INBOX);
final String name = getAccountDisplayName(accountCursor);
final String name = getDisplayName(accountCursor);
final String emailAddress = getAccountEmailAddress(accountCursor);
addRow(matrixCursor, ROW_TYPE_ACCOUNT, accountId, name, emailAddress, unread,
UNKNOWN_POSITION);
@ -361,25 +370,22 @@ public class AccountSelectorAdapter extends CursorAdapter {
}
int recentCount = (recentMailboxes == null) ? 0 : recentMailboxes.size();
matrixCursor.mRecentCount = recentCount;
if (recentCount > 0) {
if (!mUseTwoPane) {
// "Recent mailboxes" header
String mailboxHeader = mContext.getString(
R.string.mailbox_list_account_selector_mailbox_header_fmt, emailAddress);
addRow(matrixCursor, ROW_TYPE_HEADER, 0L, mailboxHeader, null, 0, UNKNOWN_POSITION);
for (long mailboxId : recentMailboxes) {
final int unread = Utility.getFirstRowInt(mContext,
ContentUris.withAppendedId(Mailbox.CONTENT_URI, mailboxId),
new String[] { MailboxColumns.UNREAD_COUNT }, null, null, null, 0);
final Mailbox mailbox = Mailbox.restoreMailboxWithId(mContext, mailboxId);
addRow(matrixCursor, ROW_TYPE_MAILBOX, mailboxId, mailbox.mDisplayName, null,
unread, accountPosition);
}
} else if (!mUseTwoPane) {
// Add the header for 'show all folders'
String mailboxHeader = mContext.getString(
R.string.mailbox_list_account_selector_mailbox_header_fmt, emailAddress);
R.string.mailbox_list_account_selector_mailbox_header_fmt, emailAddress);
addRow(matrixCursor, ROW_TYPE_HEADER, 0L, mailboxHeader, null, 0, UNKNOWN_POSITION);
}
if (recentCount > 0) {
for (long mailboxId : recentMailboxes) {
addMailboxRow(matrixCursor, accountPosition, mailboxId);
}
}
if (!mUseTwoPane) {
// TODO We need this for combined view too.
String name = mContext.getString(
R.string.mailbox_list_account_selector_show_all_folders);
addRow(matrixCursor, ROW_TYPE_MAILBOX, Mailbox.NO_MAILBOX, name, null, 0,
@ -387,15 +393,33 @@ public class AccountSelectorAdapter extends CursorAdapter {
}
}
private static final String[] RECENT_MAILBOX_INFO_PROJECTION = new String[] {
MailboxColumns.ID, MailboxColumns.DISPLAY_NAME, MailboxColumns.TYPE,
MailboxColumns.UNREAD_COUNT, MailboxColumns.MESSAGE_COUNT
};
private void addMailboxRow(MatrixCursor matrixCursor, int accountPosition, long mailboxId) {
Cursor c = mContext.getContentResolver().query(
ContentUris.withAppendedId(Mailbox.CONTENT_URI, mailboxId),
RECENT_MAILBOX_INFO_PROJECTION, null, null, null);
if (!c.moveToFirst()) {
return;
}
addRow(matrixCursor, ROW_TYPE_MAILBOX, mailboxId,
mFolderProperties.getDisplayName(c), null,
mFolderProperties.getMessageCount(c), accountPosition);
}
/** Adds a row to the given cursor */
private void addRow(MatrixCursor cursor, int rowType, long id, String name,
String emailAddress, int unreadCount, int listPosition) {
String emailAddress, int messageCount, int listPosition) {
cursor.newRow()
.add(rowType)
.add(id)
.add(name)
.add(emailAddress)
.add(unreadCount)
.add(messageCount)
.add(listPosition);
}
}
@ -403,9 +427,9 @@ public class AccountSelectorAdapter extends CursorAdapter {
/** Cursor with some extra meta data. */
static class CursorWithExtras extends ClosingMatrixCursor {
/** Number of account elements, including the combined account row. */
int mAccountCount;
private int mAccountCount;
/** Number of recent mailbox elements */
int mRecentCount;
private int mRecentCount;
private CursorWithExtras(String[] columnNames, Cursor innerCursor) {
super(columnNames, innerCursor);
@ -418,11 +442,19 @@ public class AccountSelectorAdapter extends CursorAdapter {
int getPosition(long id) {
moveToPosition(-1);
while(moveToNext()) {
if (id == getAccountId(this)) {
if (id == getId(this)) {
return getPosition();
}
}
return UNKNOWN_POSITION;
}
public int getAccountCount() {
return mAccountCount;
}
public int getRecentMailboxCount() {
return mRecentCount;
}
}
}

View File

@ -19,6 +19,7 @@ package com.android.email.activity;
import android.app.ActionBar;
import android.app.LoaderManager;
import android.app.LoaderManager.LoaderCallbacks;
import android.content.ContentUris;
import android.content.Context;
import android.content.Loader;
import android.database.Cursor;
@ -30,9 +31,13 @@ import android.view.View;
import android.widget.SearchView;
import android.widget.TextView;
import com.android.email.FolderProperties;
import com.android.email.R;
import com.android.email.data.ThrottlingCursorLoader;
import com.android.emailcommon.Logging;
import com.android.emailcommon.provider.Account;
import com.android.emailcommon.provider.EmailContent;
import com.android.emailcommon.provider.EmailContent.MailboxColumns;
import com.android.emailcommon.provider.Mailbox;
/**
@ -63,6 +68,8 @@ public class ActionBarController {
private static final int LOADER_ID_ACCOUNT_LIST
= EmailActivity.ACTION_BAR_CONTROLLER_LOADER_ID_BASE + 0;
private static final int LOADER_ID_MAILBOX
= EmailActivity.ACTION_BAR_CONTROLLER_LOADER_ID_BASE + 1;
private final Context mContext;
private final LoaderManager mLoaderManager;
@ -83,6 +90,9 @@ public class ActionBarController {
/** The current account ID; used to determine if the account has changed. */
private long mLastAccountIdForDirtyCheck = Account.NO_ACCOUNT;
/** The current mailbox ID; used to determine if the mailbox has changed. */
private long mLastMailboxIdForDirtyCheck = Mailbox.NO_MAILBOX;
/** Either {@link #MODE_NORMAL} or {@link #MODE_SEARCH}. */
private int mSearchMode = MODE_NORMAL;
@ -102,17 +112,15 @@ public class ActionBarController {
*/
public long getUIAccountId();
/**
* @return currently selected mailbox ID, or {@link Mailbox#NO_MAILBOX} if no mailbox is
* selected.
*/
public long getMailboxId();
/** @return true if the current mailbox name should be shown. */
public boolean shouldShowMailboxName();
/** @return current mailbox name */
public String getCurrentMailboxName();
/**
* @return unread count for the current mailbox. (0 if the mailbox doesn't have the concept
* of "unread"; e.g. Drafts)
*/
public int getCurrentMailboxUnreadCount();
/** @return the "UP" arrow should be shown. */
public boolean shouldShowUp();
@ -278,14 +286,8 @@ public class ActionBarController {
} else {
mMailboxNameContainer.setVisibility(mCallback.shouldShowMailboxName()
? View.VISIBLE : View.GONE);
mMailboxNameView.setText(mCallback.getCurrentMailboxName());
}
// Note on action bar, we show only "unread count". Some mailboxes such as Outbox don't
// have the idea of "unread count", in which case we just omit the count.
mUnreadCountView.setText(UiUtilities.getMessageCountForUi(mContext,
mCallback.getCurrentMailboxUnreadCount(), true));
// Update the account list only when the account has changed.
if (mLastAccountIdForDirtyCheck != mCallback.getUIAccountId()) {
mLastAccountIdForDirtyCheck = mCallback.getUIAccountId();
@ -297,6 +299,17 @@ public class ActionBarController {
updateAccountList();
}
}
// Update current mailbox info
final long mailboxId = mCallback.getMailboxId();
if (mailboxId == Mailbox.NO_MAILBOX) {
clearMailboxInfo();
} else {
if (mLastMailboxIdForDirtyCheck != mailboxId) {
mLastMailboxIdForDirtyCheck = mailboxId;
loadMailboxInfo(mailboxId);
}
}
}
/**
@ -345,7 +358,7 @@ public class ActionBarController {
return;
}
final int count = mAccountCursor.mAccountCount + mAccountCursor.mRecentCount;
final int count = mAccountCursor.getAccountCount() + mAccountCursor.getRecentMailboxCount();
if (count == 0) {
mCallback.onNoAccountsFound();
return;
@ -359,7 +372,7 @@ public class ActionBarController {
ab.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
if (selectedPosition >= 0) {
mAccountCursor.moveToPosition(selectedPosition);
ab.setTitle(AccountSelectorAdapter.getAccountDisplayName(mAccountCursor));
ab.setTitle(AccountSelectorAdapter.getDisplayName(mAccountCursor));
}
return;
}
@ -398,6 +411,47 @@ public class ActionBarController {
}
}
private static final String[] MAILBOX_NAME_COUNT_PROJECTION = new String[] {
MailboxColumns.ID, MailboxColumns.DISPLAY_NAME, MailboxColumns.TYPE,
MailboxColumns.UNREAD_COUNT, MailboxColumns.MESSAGE_COUNT
};
private void loadMailboxInfo(final long mailboxId) {
clearMailboxInfo();
mLoaderManager.restartLoader(LOADER_ID_MAILBOX, null,
new LoaderCallbacks<Cursor>() {
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
return new ThrottlingCursorLoader(mContext,
ContentUris.withAppendedId(Mailbox.CONTENT_URI, mailboxId),
MAILBOX_NAME_COUNT_PROJECTION, null, null, null);
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
// Update action bar
FolderProperties fp = FolderProperties.getInstance(mContext);
updateMailboxInfo(
fp.getDisplayName(cursor),
fp.getMessageCount(cursor)
);
}
@Override
public void onLoaderReset(Loader<Cursor> loader) {
}
});
}
private void clearMailboxInfo() {
updateMailboxInfo("", 0);
}
private void updateMailboxInfo(String mailboxName, int count) {
mMailboxNameView.setText(mailboxName);
mUnreadCountView.setText(UiUtilities.getMessageCountForUi(mContext, count, true));
}
private final SearchView.OnQueryTextListener mOnQueryText
= new SearchView.OnQueryTextListener() {
@Override

View File

@ -16,8 +16,6 @@
package com.android.email.activity;
import com.google.common.annotations.VisibleForTesting;
import com.android.email.Email;
import com.android.email.FolderProperties;
import com.android.email.R;
@ -32,8 +30,7 @@ import com.android.emailcommon.provider.EmailContent.MailboxColumns;
import com.android.emailcommon.provider.EmailContent.Message;
import com.android.emailcommon.provider.Mailbox;
import com.android.emailcommon.utility.Utility;
import java.util.ArrayList;
import com.google.common.annotations.VisibleForTesting;
import android.content.ContentUris;
import android.content.Context;
@ -52,6 +49,8 @@ import android.widget.CursorAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import java.util.ArrayList;
/**
* Mailbox cursor adapter for the mailbox list fragment.
*
@ -233,45 +232,6 @@ class MailboxFragmentAdapter extends CursorAdapter {
return getRowType(cursor) == ROW_TYPE_ACCOUNT;
}
/**
* Returns the type of count to use for the given row.
*/
private int getCountType(Cursor cursor) {
if (isAccountRow(cursor)) {
return COUNT_TYPE_UNREAD;
}
// otherwise, look at mailbox type to determine the count
switch (cursor.getInt(cursor.getColumnIndex(MailboxColumns.TYPE))) {
case Mailbox.TYPE_DRAFTS:
case Mailbox.TYPE_OUTBOX:
return COUNT_TYPE_TOTAL;
case Mailbox.TYPE_SENT:
case Mailbox.TYPE_TRASH:
return COUNT_TYPE_NO_COUNT;
}
return COUNT_TYPE_UNREAD;
}
/**
* Returns the unread count for the given row if the count type is {@link #COUNT_TYPE_UNREAD}.
* Otherwise, {@code 0}.
*/
int getUnreadCount(int position) {
Cursor c = (Cursor) getItem(position);
if (getCountType(c) != COUNT_TYPE_UNREAD) {
return 0; // Don't have a unread count.
}
return c.getInt(c.getColumnIndex(MailboxColumns.UNREAD_COUNT));
}
/**
* Returns the display name for the given row.
*/
String getDisplayName(Context context, int position) {
Cursor c = (Cursor) getItem(position);
return getDisplayName(context, c);
}
/**
* Returns the ID of the given row. It may be a mailbox or account ID depending upon the
* result of {@link #isAccountRow}.
@ -301,18 +261,17 @@ class MailboxFragmentAdapter extends CursorAdapter {
}
private static String getDisplayName(Context context, Cursor cursor) {
String name = null;
if (getRowType(cursor) == ROW_TYPE_MAILBOX) {
// If it's a mailbox (as opposed to account row in combined view), and of certain types,
// we use the predefined names.
final int type = getType(cursor);
final long mailboxId = getId(cursor);
name = FolderProperties.getInstance(context).getDisplayName(type, mailboxId);
final String name = cursor.getString(cursor.getColumnIndex(MailboxColumns.DISPLAY_NAME));
if (isAccountRow(cursor)) {
// Always use actual name
return name;
} else {
// Use this method for two purposes:
// - Set combined mailbox names
// - Rewrite special mailbox names (e.g. trash)
FolderProperties fp = FolderProperties.getInstance(context);
return fp.getDisplayName(getType(cursor), getId(cursor), name);
}
if (name == null) {
name = cursor.getString(cursor.getColumnIndex(MailboxColumns.DISPLAY_NAME));
}
return name;
}
static long getId(Cursor cursor) {
@ -394,16 +353,11 @@ class MailboxFragmentAdapter extends CursorAdapter {
nameView.setText(getDisplayName(context, cursor));
// Set count
final int count;
switch (getCountType(cursor)) {
case COUNT_TYPE_UNREAD:
count = getUnreadCount(cursor);
break;
case COUNT_TYPE_TOTAL:
count = getMessageCount(cursor);
break;
default: // no count
count = 0;
break;
if (isAccountRow(cursor)) {
count = getUnreadCount(cursor);
} else {
FolderProperties fp = FolderProperties.getInstance(context);
count = fp.getMessageCount(type, getUnreadCount(cursor), getMessageCount(cursor));
}
final TextView countView = (TextView) view.findViewById(R.id.message_count);

View File

@ -239,24 +239,6 @@ public class MailboxListFragment extends ListFragment implements OnItemClickList
/** Called when an account is selected on the combined view. */
public void onAccountSelected(long accountId);
/**
* TODO Remove it. The behavior is not well-defined. (Won't get called when highlight is
* disabled.)
* It was added only to update the action bar with the current mailbox name and the
* message count. Remove it and make the action bar watch the mailbox by itself.
*
* Called when the list updates to propagate the current mailbox name and the unread count
* for it.
*
* Note the reason why it's separated from onMailboxSelected is because this needs to be
* reported when the unread count changes without changing the current mailbox.
*
* @param mailboxId ID for the selected mailbox. It'll never be of a combined mailbox,
* and the owner account ID is always the same as
* {@link MailboxListFragment#getAccountId()}.
*/
public void onCurrentMailboxUpdated(long mailboxId, String mailboxName, int unreadCount);
/**
* Called when the parent mailbox is changing.
*/
@ -268,8 +250,6 @@ public class MailboxListFragment extends ListFragment implements OnItemClickList
@Override public void onMailboxSelected(long accountId, long mailboxId,
boolean nestedNavigation) { }
@Override public void onAccountSelected(long accountId) { }
@Override public void onCurrentMailboxUpdated(long mailboxId, String mailboxName,
int unreadCount) { }
@Override
public void onParentMailboxChanged() { }
}
@ -882,8 +862,6 @@ public class MailboxListFragment extends ListFragment implements OnItemClickList
}
final ListView lv = getListView();
boolean found = false;
String mailboxName = "";
int unreadCount = 0;
if (mHighlightedMailboxId == Mailbox.NO_MAILBOX) {
// No mailbox selected
lv.clearChoices();
@ -900,14 +878,10 @@ public class MailboxListFragment extends ListFragment implements OnItemClickList
if (ensureSelectionVisible) {
Utility.listViewSmoothScrollToPosition(getActivity(), lv, i);
}
mailboxName = mListAdapter.getDisplayName(mActivity, i);
unreadCount = mListAdapter.getUnreadCount(i);
break;
}
}
if (found) {
mCallback.onCurrentMailboxUpdated(mHighlightedMailboxId, mailboxName, unreadCount);
} else {
if (!found) {
mHighlightedMailboxId = Mailbox.NO_MAILBOX;
}
return found;

View File

@ -130,11 +130,8 @@ class MailboxMoveToAdapter extends CursorAdapter {
private static String getDisplayText(Context context, Cursor cursor) {
final int type = cursor.getInt(COLUMN_TYPE);
final long mailboxId = cursor.getLong(COLUMN_ID);
String name = FolderProperties.getInstance(context).getDisplayName(type, mailboxId);
if (name == null) {
name = cursor.getString(COLUMN_MAILBOX_NAME);
}
return name;
return FolderProperties.getInstance(context).getDisplayName(type, mailboxId,
cursor.getString(COLUMN_MAILBOX_NAME));
}
/** Loader for the "move to mailbox" dialog. */

View File

@ -58,11 +58,6 @@ class UIControllerOnePane extends UIControllerBase {
switchAccount(accountId);
}
// MailboxListFragment.Callback
@Override
public void onCurrentMailboxUpdated(long mailboxId, String mailboxName, int unreadCount) {
}
// MailboxListFragment.Callback
@Override
public void onMailboxSelected(long accountId, long mailboxId, boolean nestedNavigation) {
@ -211,15 +206,6 @@ class UIControllerOnePane extends UIControllerBase {
return false; // no mailbox name/unread count.
}
@Override
public String getCurrentMailboxName() {
return null; // no mailbox name/unread count.
}
@Override
public int getCurrentMailboxUnreadCount() {
return 0; // no mailbox name/unread count.
}
@Override
public boolean shouldShowUp() {
@ -232,6 +218,11 @@ class UIControllerOnePane extends UIControllerBase {
return UIControllerOnePane.this.getUIAccountId();
}
@Override
public long getMailboxId() {
return UIControllerOnePane.this.getMailboxId();
}
@Override
public void onMailboxSelected(long mailboxId) {
if (mailboxId == Mailbox.NO_MAILBOX) {

View File

@ -63,20 +63,6 @@ class UIControllerTwoPane extends UIControllerBase implements
private final MessageOrderManagerCallback mMessageOrderManagerCallback =
new MessageOrderManagerCallback();
/**
* The mailbox name selected on the mailbox list.
* Passed via {@link #onCurrentMailboxUpdated}.
*/
private String mCurrentMailboxName;
/**
* The unread count for the mailbox selected on the mailbox list.
* Passed via {@link #onCurrentMailboxUpdated}.
*
* 0 if the mailbox doesn't have the concept of "unread". e.g. Drafts.
*/
private int mCurrentMailboxUnreadCount;
public UIControllerTwoPane(EmailActivity activity) {
super(activity);
}
@ -120,14 +106,6 @@ class UIControllerTwoPane extends UIControllerBase implements
switchAccount(accountId);
}
// MailboxListFragment$Callback
@Override
public void onCurrentMailboxUpdated(long mailboxId, String mailboxName, int unreadCount) {
mCurrentMailboxName = mailboxName;
mCurrentMailboxUnreadCount = unreadCount;
refreshActionBar();
}
// MailboxListFragment$Callback
@Override
public void onParentMailboxChanged() {
@ -822,21 +800,17 @@ class UIControllerTwoPane extends UIControllerBase implements
}
private class ActionBarControllerCallback implements ActionBarController.Callback {
@Override
public String getCurrentMailboxName() {
return mCurrentMailboxName;
}
@Override
public int getCurrentMailboxUnreadCount() {
return mCurrentMailboxUnreadCount;
}
@Override
public long getUIAccountId() {
return UIControllerTwoPane.this.getUIAccountId();
}
@Override
public long getMailboxId() {
return UIControllerTwoPane.this.getMessageListMailboxId();
}
@Override
public boolean isAccountSelected() {
return UIControllerTwoPane.this.isAccountSelected();

View File

@ -0,0 +1,181 @@
/*
* 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.Mailbox;
import android.content.Context;
import android.database.Cursor;
import android.database.MatrixCursor;
import android.graphics.drawable.Drawable;
import android.test.AndroidTestCase;
import java.util.HashSet;
import java.util.Set;
public class FolderPropertiesTests extends AndroidTestCase {
private static Cursor buildCursor(String[] columns, Object... values) {
MatrixCursor c = new MatrixCursor(columns, 1);
c.addRow(values);
c.moveToFirst();
return c;
}
/**
* Tests of the syncronization of array and types of the display folder names
*/
public void testGetDisplayName() {
Context context = getContext();
FolderProperties fp = FolderProperties.getInstance(context);
assertEquals(
context.getString(R.string.mailbox_name_display_inbox),
fp.getDisplayName(Mailbox.TYPE_INBOX, 0, "ignored"));
assertEquals(
"*name*",
fp.getDisplayName(Mailbox.TYPE_MAIL, 0, "*name*"));
assertEquals(
"*name2*",
fp.getDisplayName(Mailbox.TYPE_PARENT, 0, "*name2*"));
assertEquals(
context.getString(R.string.mailbox_name_display_drafts),
fp.getDisplayName(Mailbox.TYPE_DRAFTS, 0, "ignored"));
assertEquals(
context.getString(R.string.mailbox_name_display_outbox),
fp.getDisplayName(Mailbox.TYPE_OUTBOX, 0, "ignored"));
assertEquals(
context.getString(R.string.mailbox_name_display_sent),
fp.getDisplayName(Mailbox.TYPE_SENT, 0, "ignored"));
assertEquals(
context.getString(R.string.mailbox_name_display_trash),
fp.getDisplayName(Mailbox.TYPE_TRASH, 0, "ignored"));
assertEquals(
context.getString(R.string.mailbox_name_display_junk),
fp.getDisplayName(Mailbox.TYPE_JUNK, 0, "ignored"));
// Testing illegal index
assertEquals(
"some name",
fp.getDisplayName(8, 12345678890L, "some name"));
// Combined mailboxes
assertEquals(
context.getString(R.string.account_folder_list_summary_inbox),
fp.getDisplayName(0, Mailbox.QUERY_ALL_INBOXES, "ignored"));
assertEquals(
context.getString(R.string.account_folder_list_summary_starred),
fp.getDisplayName(0, Mailbox.QUERY_ALL_FAVORITES, "ignored"));
assertEquals(
context.getString(R.string.account_folder_list_summary_drafts),
fp.getDisplayName(0, Mailbox.QUERY_ALL_DRAFTS, "ignored"));
assertEquals(
context.getString(R.string.account_folder_list_summary_outbox),
fp.getDisplayName(0, Mailbox.QUERY_ALL_OUTBOX, "ignored"));
}
public void testGetDisplayNameWithCursor() {
Context context = getContext();
FolderProperties fp = FolderProperties.getInstance(context);
String[] columns = new String[] {MailboxColumns.ID, MailboxColumns.TYPE,
MailboxColumns.DISPLAY_NAME};
assertEquals(
context.getString(R.string.mailbox_name_display_inbox),
fp.getDisplayName(buildCursor(columns, 1, Mailbox.TYPE_INBOX, "ignored"))
);
assertEquals(
"name",
fp.getDisplayName(buildCursor(columns, 1, Mailbox.TYPE_MAIL, "name"))
);
}
/**
* Confirm that all of the special icons are available and unique
*/
public void testSpecialIcons() {
FolderProperties fp = FolderProperties.getInstance(mContext);
// Make sure they're available
Drawable inbox = fp.getIcon(Mailbox.TYPE_INBOX, -1, 0);
Drawable mail = fp.getIcon(Mailbox.TYPE_MAIL, -1, 0);
Drawable parent = fp.getIcon(Mailbox.TYPE_PARENT, -1, 0);
Drawable drafts = fp.getIcon(Mailbox.TYPE_DRAFTS, -1, 0);
Drawable outbox = fp.getIcon(Mailbox.TYPE_OUTBOX, -1, 0);
Drawable sent = fp.getIcon(Mailbox.TYPE_SENT, -1, 0);
Drawable trash = fp.getIcon(Mailbox.TYPE_TRASH, -1, 0);
Drawable junk = fp.getIcon(Mailbox.TYPE_JUNK, -1, 0);
// Make sure they're unique
Set<Drawable> set = new HashSet<Drawable>();
set.add(inbox);
set.add(parent);
set.add(drafts);
set.add(outbox);
set.add(sent);
set.add(trash);
set.add(junk);
assertEquals(7, set.size());
assertNull(mail);
}
public void testGetMessageCountWithCursor() {
Context context = getContext();
FolderProperties fp = FolderProperties.getInstance(context);
String[] columns = new String[] {MailboxColumns.TYPE, MailboxColumns.UNREAD_COUNT,
MailboxColumns.MESSAGE_COUNT};
assertEquals(
1,
fp.getMessageCount(buildCursor(columns, Mailbox.TYPE_INBOX, 1, 2))
);
assertEquals(
1,
fp.getMessageCount(buildCursor(columns, Mailbox.TYPE_MAIL, 1, 2))
);
assertEquals(
2,
fp.getMessageCount(buildCursor(columns, Mailbox.TYPE_DRAFTS, 1, 2))
);
assertEquals(
2,
fp.getMessageCount(buildCursor(columns, Mailbox.TYPE_OUTBOX, 1, 2))
);
assertEquals(
0,
fp.getMessageCount(buildCursor(columns, Mailbox.TYPE_TRASH, 1, 2))
);
assertEquals(
0,
fp.getMessageCount(buildCursor(columns, Mailbox.TYPE_SENT, 1, 2))
);
}
}

View File

@ -55,9 +55,9 @@ public class AccountSelectorAdapterAccountsLoaderTest extends LoaderTestCase {
true);
AccountSelectorAdapter.CursorWithExtras result =
(AccountSelectorAdapter.CursorWithExtras) getLoaderResultSynchronously(l);
assertEquals(1, result.mAccountCount);
assertEquals(1, result.getAccountCount());
assertEquals(2, result.getCount()); // +1 as the cursor has the header row
assertEquals(0, result.mRecentCount); // No recent in two-pane account spinner.
assertEquals(0, result.getRecentMailboxCount()); // No recent on two-pane.
}
final Account a2 = ProviderTestUtils.setupAccount("a2", true, mProviderContext);
@ -67,9 +67,9 @@ public class AccountSelectorAdapterAccountsLoaderTest extends LoaderTestCase {
true);
AccountSelectorAdapter.CursorWithExtras result =
(AccountSelectorAdapter.CursorWithExtras) getLoaderResultSynchronously(l);
assertEquals(3, result.mAccountCount);
assertEquals(3, result.getAccountCount());
assertEquals(4, result.getCount()); // +1 as the cursor has the header row
assertEquals(0, result.mRecentCount); // No recent in two-pane account spinner.
assertEquals(0, result.getRecentMailboxCount()); // No recent on two-pane.
}
}
}

View File

@ -17,7 +17,6 @@
package com.android.emailcommon.utility;
import com.android.email.DBTestHelper;
import com.android.email.FolderProperties;
import com.android.email.R;
import com.android.email.TestUtils;
import com.android.email.provider.ProviderTestUtils;
@ -61,71 +60,6 @@ import java.util.Set;
*/
@SmallTest
public class UtilityUnitTests extends AndroidTestCase {
/**
* Tests of the syncronization of array and types of the display folder names
*/
public void testGetDisplayName() {
Context context = getContext();
String expect, name;
expect = context.getString(R.string.mailbox_name_display_inbox);
name = FolderProperties.getInstance(context).getDisplayName(Mailbox.TYPE_INBOX);
assertEquals(expect, name);
expect = null;
name = FolderProperties.getInstance(context).getDisplayName(Mailbox.TYPE_MAIL);
assertEquals(expect, name);
expect = null;
name = FolderProperties.getInstance(context).getDisplayName(Mailbox.TYPE_PARENT);
assertEquals(expect, name);
expect = context.getString(R.string.mailbox_name_display_drafts);
name = FolderProperties.getInstance(context).getDisplayName(Mailbox.TYPE_DRAFTS);
assertEquals(expect, name);
expect = context.getString(R.string.mailbox_name_display_outbox);
name = FolderProperties.getInstance(context).getDisplayName(Mailbox.TYPE_OUTBOX);
assertEquals(expect, name);
expect = context.getString(R.string.mailbox_name_display_sent);
name = FolderProperties.getInstance(context).getDisplayName(Mailbox.TYPE_SENT);
assertEquals(expect, name);
expect = context.getString(R.string.mailbox_name_display_trash);
name = FolderProperties.getInstance(context).getDisplayName(Mailbox.TYPE_TRASH);
assertEquals(expect, name);
expect = context.getString(R.string.mailbox_name_display_junk);
name = FolderProperties.getInstance(context).getDisplayName(Mailbox.TYPE_JUNK);
assertEquals(expect, name);
// Testing illegal index
expect = null;
name = FolderProperties.getInstance(context).getDisplayName(8);
assertEquals(expect, name);
}
/**
* Confirm that all of the special icons are available and unique
*/
public void testSpecialIcons() {
FolderProperties fp = FolderProperties.getInstance(mContext);
// Make sure they're available
Drawable inbox = fp.getIcon(Mailbox.TYPE_INBOX, -1, 0);
Drawable mail = fp.getIcon(Mailbox.TYPE_MAIL, -1, 0);
Drawable parent = fp.getIcon(Mailbox.TYPE_PARENT, -1, 0);
Drawable drafts = fp.getIcon(Mailbox.TYPE_DRAFTS, -1, 0);
Drawable outbox = fp.getIcon(Mailbox.TYPE_OUTBOX, -1, 0);
Drawable sent = fp.getIcon(Mailbox.TYPE_SENT, -1, 0);
Drawable trash = fp.getIcon(Mailbox.TYPE_TRASH, -1, 0);
Drawable junk = fp.getIcon(Mailbox.TYPE_JUNK, -1, 0);
// Make sure they're unique
Set<Drawable> set = new HashSet<Drawable>();
set.add(inbox);
set.add(parent);
set.add(drafts);
set.add(outbox);
set.add(sent);
set.add(trash);
set.add(junk);
assertEquals(7, set.size());
assertNull(mail);
}
private static byte[] b(int... array) {
return TestUtils.b(array);