From 6b256f1fa10b858ae2bea827b65c8608592e4ba3 Mon Sep 17 00:00:00 2001 From: Ben Komalo Date: Tue, 28 Jun 2011 17:01:09 -0700 Subject: [PATCH] Wire through results count in search header. Change-Id: I817236d9c3294acb25b62724cc8c99d47df7f354 --- .../email/activity/MessageListFragment.java | 12 ++-- .../email/activity/MessagesAdapter.java | 62 +++++++++++++++---- .../email/activity/MessagesAdapterTests.java | 22 +++---- 3 files changed, 68 insertions(+), 28 deletions(-) diff --git a/src/com/android/email/activity/MessageListFragment.java b/src/com/android/email/activity/MessageListFragment.java index 18679232b..4544eb3fd 100644 --- a/src/com/android/email/activity/MessageListFragment.java +++ b/src/com/android/email/activity/MessageListFragment.java @@ -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(); diff --git a/src/com/android/email/activity/MessagesAdapter.java b/src/com/android/email/activity/MessagesAdapter.java index 5c9606b49..77195741f 100644 --- a/src/com/android/email/activity/MessagesAdapter.java +++ b/src/com/android/email/activity/MessagesAdapter.java @@ -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 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); + } } } diff --git a/tests/src/com/android/email/activity/MessagesAdapterTests.java b/tests/src/com/android/email/activity/MessagesAdapterTests.java index af870322a..c1a91d827 100644 --- a/tests/src/com/android/email/activity/MessagesAdapterTests.java +++ b/tests/src/com/android/email/activity/MessagesAdapterTests.java @@ -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);