Wire through results count in search header.

Change-Id: I817236d9c3294acb25b62724cc8c99d47df7f354
This commit is contained in:
Ben Komalo 2011-06-28 17:01:09 -07:00
parent 06421df25d
commit 6b256f1fa1
3 changed files with 68 additions and 28 deletions

View File

@ -60,6 +60,7 @@ import com.android.email.MessageListContext;
import com.android.email.NotificationController;
import com.android.email.R;
import com.android.email.RefreshManager;
import com.android.email.activity.MessagesAdapter.SearchResultsCursor;
import com.android.email.provider.EmailProvider;
import com.android.emailcommon.Logging;
import com.android.emailcommon.provider.Account;
@ -1020,20 +1021,21 @@ public class MessageListFragment extends ListFragment
updateSelectionMode();
}
private void updateSearchHeader(Cursor searchResultsCursor) {
private void updateSearchHeader(Cursor cursor) {
MessageListContext listContext = getListContext();
if (!listContext.isSearch() || searchResultsCursor == null) {
if (!listContext.isSearch() || cursor == null) {
mSearchHeader.setVisibility(View.GONE);
return;
}
SearchResultsCursor searchCursor = (SearchResultsCursor) cursor;
mSearchHeader.setVisibility(View.VISIBLE);
String header = String.format(
mActivity.getString(R.string.search_header_text_fmt),
listContext.getSearchParams().mFilter);
mSearchHeaderText.setText(header);
// TODO: populate the count with the info from the cursor.
mSearchHeaderCount.setText(null);
mSearchHeaderCount.setText(UiUtilities.getMessageCountForUi(
mActivity, searchCursor.getResultsCount(), false /* replaceZeroWithBlank */));
}
private void determineFooterMode() {
@ -1175,7 +1177,7 @@ public class MessageListFragment extends ListFragment
Log.d(Logging.LOG_TAG, MessageListFragment.this
+ " onLoadFinished(messages) mailboxId=" + getMailboxId());
}
MessagesAdapter.CursorWithExtras cursor = (MessagesAdapter.CursorWithExtras) c;
MessagesAdapter.MessagesCursor cursor = (MessagesAdapter.MessagesCursor) c;
if (!cursor.mIsFound) {
mCallback.onMailboxNotFound();

View File

@ -102,7 +102,7 @@ import java.util.Set;
/**
* The actual return type from the loader.
*/
public static class CursorWithExtras extends CursorWrapper {
public static class MessagesCursor extends CursorWrapper {
/** Whether the mailbox is found. */
public final boolean mIsFound;
/** {@link Account} that owns the mailbox. Null for combined mailboxes. */
@ -116,7 +116,7 @@ import java.util.Set;
/** the number of accounts currently configured. */
public final int mCountTotalAccounts;
private CursorWithExtras(Cursor cursor,
private MessagesCursor(Cursor cursor,
boolean found, Account account, Mailbox mailbox, boolean isEasAccount,
boolean isRefreshable, int countTotalAccounts) {
super(cursor);
@ -261,7 +261,7 @@ import java.util.Set;
/**
* Creates the loader for {@link MessageListFragment}.
*
* @return always of {@link CursorWithExtras}.
* @return always of {@link MessagesCursor}.
*/
public static Loader<Cursor> createLoader(Context context, MessageListContext listContext) {
if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
@ -335,9 +335,41 @@ import java.util.Set;
}
}
final int countAccounts = EmailContent.count(mContext, Account.CONTENT_URI);
return new CursorWithExtras(baseCursor, found, account, mailbox, isEasAccount,
return wrapCursor(baseCursor, found, account, mailbox, isEasAccount,
isRefreshable, countAccounts);
}
/**
* Wraps a basic cursor containing raw messages with information about the context of
* the list that's being loaded, such as the account and the mailbox the messages
* are for.
* Subclasses may extend this to wrap with additional data.
*/
protected Cursor wrapCursor(Cursor cursor,
boolean found, Account account, Mailbox mailbox, boolean isEasAccount,
boolean isRefreshable, int countTotalAccounts) {
return new MessagesCursor(cursor, found, account, mailbox, isEasAccount,
isRefreshable, countTotalAccounts);
}
}
public static class SearchResultsCursor extends MessagesCursor {
private final int mResultsCount;
private SearchResultsCursor(Cursor cursor,
boolean found, Account account, Mailbox mailbox, boolean isEasAccount,
boolean isRefreshable, int countTotalAccounts, int resultsCount) {
super(cursor, found, account, mailbox, isEasAccount,
isRefreshable, countTotalAccounts);
mResultsCount = resultsCount;
}
public int getResultsCount() {
return mResultsCount;
}
public boolean hasResults() {
return getResultsCount() == 0;
}
}
/**
@ -345,7 +377,7 @@ import java.util.Set;
*/
private static class SearchCursorLoader extends MessagesCursorLoader {
private final MessageListContext mListContext;
private boolean mResultCountAvailable = false;
private int mResultsCount = -1;
public SearchCursorLoader(Context context, MessageListContext listContext) {
super(context, listContext.getMailboxId());
@ -355,7 +387,8 @@ import java.util.Set;
@Override
public Cursor loadInBackground() {
if (mResultCountAvailable) {
if (mResultsCount >= 0) {
// Result count known - the initial search meta data must have completed.
return super.loadInBackground();
}
@ -363,17 +396,22 @@ import java.util.Set;
// initialized the search mailbox properly. Kick off the search first.
Controller controller = Controller.getInstance(mContext);
try {
// TODO: wire through search count information and pad it into the cursor returned
// so that the caller knows how many is in the entire result set.
controller.searchMessages(mListContext.mAccountId, mListContext.getSearchParams());
mResultsCount = controller.searchMessages(
mListContext.mAccountId, mListContext.getSearchParams());
} catch (MessagingException e) {
// TODO: handle.
}
mResultCountAvailable = true;
// Return whatever the super would do, now that we know the results are ready.
// After this point, it should behave as a normal mailbox load for messages.
return super.loadInBackground();
}
@Override
protected Cursor wrapCursor(Cursor cursor,
boolean found, Account account, Mailbox mailbox, boolean isEasAccount,
boolean isRefreshable, int countTotalAccounts) {
return new SearchResultsCursor(cursor, found, account, mailbox, isEasAccount,
isRefreshable, countTotalAccounts, mResultsCount);
}
}
}

View File

@ -16,15 +16,15 @@
package com.android.email.activity;
import android.content.Context;
import android.test.LoaderTestCase;
import com.android.email.DBTestHelper;
import com.android.email.MessageListContext;
import com.android.email.provider.ProviderTestUtils;
import com.android.emailcommon.provider.Account;
import com.android.emailcommon.provider.Mailbox;
import android.content.Context;
import android.test.LoaderTestCase;
public class MessagesAdapterTests extends LoaderTestCase {
// Account ID that's probably not in the database.
private static final long NO_SUCH_ACCOUNT_ID = 1234567890123L;
@ -57,8 +57,8 @@ public class MessagesAdapterTests extends LoaderTestCase {
return box.mId;
}
private MessagesAdapter.CursorWithExtras getLoaderResult(long accountId, long mailboxId) {
return (MessagesAdapter.CursorWithExtras) getLoaderResultSynchronously(
private MessagesAdapter.MessagesCursor getLoaderResult(long accountId, long mailboxId) {
return (MessagesAdapter.MessagesCursor) getLoaderResultSynchronously(
MessagesAdapter.createLoader(
mProviderContext,
MessageListContext.forMailbox(accountId, mailboxId)));
@ -71,7 +71,7 @@ public class MessagesAdapterTests extends LoaderTestCase {
final long accountId = createAccount(false);
final long mailboxId = createMailbox(accountId, Mailbox.TYPE_MAIL);
MessagesAdapter.CursorWithExtras result = getLoaderResult(accountId, mailboxId);
MessagesAdapter.MessagesCursor result = getLoaderResult(accountId, mailboxId);
assertTrue(result.mIsFound);
assertEquals(accountId, result.mAccount.mId);
assertEquals(mailboxId, result.mMailbox.mId);
@ -86,7 +86,7 @@ public class MessagesAdapterTests extends LoaderTestCase {
final long accountId = createAccount(true);
final long mailboxId = createMailbox(accountId, Mailbox.TYPE_MAIL);
MessagesAdapter.CursorWithExtras result = getLoaderResult(accountId, mailboxId);
MessagesAdapter.MessagesCursor result = getLoaderResult(accountId, mailboxId);
assertTrue(result.mIsFound);
assertEquals(accountId, result.mAccount.mId);
assertEquals(mailboxId, result.mMailbox.mId);
@ -101,7 +101,7 @@ public class MessagesAdapterTests extends LoaderTestCase {
final long accountId = createAccount(false);
final long mailboxId = createMailbox(accountId, Mailbox.TYPE_DRAFTS);
MessagesAdapter.CursorWithExtras result = getLoaderResult(accountId, mailboxId);
MessagesAdapter.MessagesCursor result = getLoaderResult(accountId, mailboxId);
assertTrue(result.mIsFound);
assertEquals(accountId, result.mAccount.mId);
assertEquals(mailboxId, result.mMailbox.mId);
@ -113,7 +113,7 @@ public class MessagesAdapterTests extends LoaderTestCase {
* Mailbox not found.
*/
public void testMailboxNotFound() {
MessagesAdapter.CursorWithExtras result = getLoaderResult(
MessagesAdapter.MessagesCursor result = getLoaderResult(
createAccount(false), NO_SUCH_MAILBOX_ID);
assertFalse(result.mIsFound);
assertNull(result.mAccount);
@ -128,7 +128,7 @@ public class MessagesAdapterTests extends LoaderTestCase {
public void testAccountNotFound() {
final long mailboxId = createMailbox(NO_SUCH_ACCOUNT_ID, Mailbox.TYPE_MAIL);
MessagesAdapter.CursorWithExtras result = getLoaderResult(NO_SUCH_ACCOUNT_ID, mailboxId);
MessagesAdapter.MessagesCursor result = getLoaderResult(NO_SUCH_ACCOUNT_ID, mailboxId);
assertFalse(result.mIsFound);
assertNull(result.mAccount);
assertNull(result.mMailbox);
@ -140,7 +140,7 @@ public class MessagesAdapterTests extends LoaderTestCase {
* Magic mailbox. (always found)
*/
public void testMagicMailbox() {
MessagesAdapter.CursorWithExtras result = getLoaderResult(
MessagesAdapter.MessagesCursor result = getLoaderResult(
Account.ACCOUNT_ID_COMBINED_VIEW, Mailbox.QUERY_ALL_INBOXES);
assertTrue(result.mIsFound);
assertNull(result.mAccount);