From 55d0e821eaecb5e454812a30c1137dbc95db98e2 Mon Sep 17 00:00:00 2001 From: Marc Blank Date: Fri, 9 Mar 2012 14:04:49 -0800 Subject: [PATCH] Report search result total to UI Change-Id: Ic88e7594b98548a96c8c6f96d2f8a585e539f520 --- .../emailcommon/service/SearchParams.java | 10 +++++ .../android/email/provider/EmailProvider.java | 41 ++++++++++++++----- 2 files changed, 40 insertions(+), 11 deletions(-) diff --git a/emailcommon/src/com/android/emailcommon/service/SearchParams.java b/emailcommon/src/com/android/emailcommon/service/SearchParams.java index 367cc89ab..eacf01df9 100644 --- a/emailcommon/src/com/android/emailcommon/service/SearchParams.java +++ b/emailcommon/src/com/android/emailcommon/service/SearchParams.java @@ -40,6 +40,10 @@ public class SearchParams implements Parcelable { // If zero, specifies a "new" search; otherwise, asks for a continuation of the previous // query(ies) starting with the mOffset'th match (0 based) public int mOffset = DEFAULT_OFFSET; + // The total number of results for this search + public int mTotalCount = 0; + // The id of the "search" mailbox being used + public long mSearchMailboxId; /** * Error codes returned by the searchMessages API @@ -54,6 +58,12 @@ public class SearchParams implements Parcelable { mFilter = filter; } + public SearchParams(long mailboxId, String filter, long searchMailboxId) { + mMailboxId = mailboxId; + mFilter = filter; + mSearchMailboxId = searchMailboxId; + } + @Override public boolean equals(Object o) { if (o == this) { diff --git a/src/com/android/email/provider/EmailProvider.java b/src/com/android/email/provider/EmailProvider.java index 3b915f79e..1a22851c5 100644 --- a/src/com/android/email/provider/EmailProvider.java +++ b/src/com/android/email/provider/EmailProvider.java @@ -2072,12 +2072,15 @@ outer: } else { sb.append(','); } - String val = map.get(column); - // If we don't have the column, be permissive, returning "0 AS ", and warn - if (val == null) { - if (values.containsKey(column)) { - val = "'" + values.getAsString(column) + "' AS " + column; - } else { + String val = null; + // First look at values; this is an override of default behavior + if (values.containsKey(column)) { + val = "'" + values.getAsString(column) + "' AS " + column; + } else { + // Now, get the standard value for the column from our projection map + val = map.get(column); + // If we don't have the column, return "NULL AS ", and warn + if (val == null) { Log.w(TAG, "UIProvider column not found, returning NULL: " + column); val = "NULL AS " + column; } @@ -2162,8 +2165,15 @@ outer: * @param uiProjection as passed from UnifiedEmail * @return the SQLite query to be executed on the EmailProvider database */ - private String genQueryMailbox(String[] uiProjection) { - StringBuilder sb = genSelect(sFolderListMap, uiProjection); + private String genQueryMailbox(String[] uiProjection, String id) { + long mailboxId = Long.parseLong(id); + ContentValues values = EMPTY_CONTENT_VALUES; + if (mSearchParams != null && mailboxId == mSearchParams.mSearchMailboxId) { + // This is the current search mailbox; use the total count + values = new ContentValues(); + values.put(UIProvider.FolderColumns.TOTAL_COUNT, mSearchParams.mTotalCount); + } + StringBuilder sb = genSelect(sFolderListMap, uiProjection, values); sb.append(" FROM " + Mailbox.TABLE_NAME + " WHERE " + MailboxColumns.ID + "=?"); return sb.toString(); } @@ -2367,7 +2377,7 @@ outer: notifyUri = UIPROVIDER_ATTACHMENT_NOTIFIER.buildUpon().appendPath(id).build(); break; case UI_FOLDER: - c = db.rawQuery(genQueryMailbox(uiProjection), new String[] {id}); + c = db.rawQuery(genQueryMailbox(uiProjection, id), new String[] {id}); notifyUri = UIPROVIDER_MAILBOX_NOTIFIER.buildUpon().appendPath(id).build(); break; case UI_ACCOUNT: @@ -2800,6 +2810,10 @@ outer: Log.d(TAG, "[Notify UI: " + notifyUri + "]"); } + private void notifyUI(Uri uri, long id) { + notifyUI(uri, Long.toString(id)); + } + /** * Support for services and service notifications */ @@ -2888,12 +2902,13 @@ outer: if (filter == null) { throw new IllegalArgumentException("No query parameter in search query"); } - mSearchParams = new SearchParams(inbox.mId, filter); // Find/create our search mailbox Mailbox searchMailbox = getSearchMailbox(accountId); final long searchMailboxId = searchMailbox.mId; + mSearchParams = new SearchParams(inbox.mId, filter, searchMailboxId); + final Context context = getContext(); if (mSearchParams.mOffset == 0) { // Delete existing contents of search mailbox @@ -2916,7 +2931,11 @@ outer: mServiceCallback, accountId); if (service != null) { try { - service.searchMessages(accountId, mSearchParams, searchMailboxId); + // Save away the total count + mSearchParams.mTotalCount = service.searchMessages(accountId, + mSearchParams, searchMailboxId); + Log.d(TAG, "TotalCount to UI: " + mSearchParams.mTotalCount); + notifyUI(UIPROVIDER_MAILBOX_NOTIFIER, searchMailboxId); } catch (RemoteException e) { Log.e("searchMessages", "RemoteException", e); }