Expect a folder when doing a search query.

Change-Id: Ia6d7b5a11e26af3eabbfc8fa94fc20a9ce5ba8de
diff --git a/src/com/android/mail/providers/Folder.java b/src/com/android/mail/providers/Folder.java
index 8adaf31..64d98e0 100644
--- a/src/com/android/mail/providers/Folder.java
+++ b/src/com/android/mail/providers/Folder.java
@@ -17,6 +17,7 @@
 
 package com.android.mail.providers;
 
+import android.content.Context;
 import android.database.Cursor;
 import android.net.Uri;
 import android.net.Uri.Builder;
@@ -147,8 +148,6 @@
 
     private static final String FOLDER_SEPARATOR = "^**^";
 
-    public static final Uri SEARCH_RESULTS_URI = Uri.parse("content://fakeSearchResults/");
-
     public Folder(Parcel in) {
         assert (in.dataSize() == NUMBER_MEMBERS);
         id = in.readString();
@@ -235,15 +234,22 @@
         return out.toString();
     }
 
-    public static Folder forSearchResults(Account account, String query) {
-        Folder searchFolder = new Folder();
+    /**
+     * Construct a folder that queries for search results. Do not call on the UI
+     * thread.
+     */
+    public static Folder forSearchResults(Account account, String query, Context context) {
+        Folder searchFolder = null;
         if (account.searchUri != null) {
             Builder searchBuilder = account.searchUri.buildUpon();
             searchBuilder.appendQueryParameter(UIProvider.SearchQueryParameters.QUERY, query);
             Uri searchUri = searchBuilder.build();
-            searchFolder.uri = SEARCH_RESULTS_URI;
-            searchFolder.conversationListUri = searchUri;
-            searchFolder.refreshUri = searchUri;
+            Cursor folderCursor = context.getContentResolver().query(searchUri,
+                    UIProvider.FOLDERS_PROJECTION, null, null, null);
+            if (folderCursor != null) {
+                folderCursor.moveToFirst();
+                searchFolder = new Folder(folderCursor);
+            }
         }
         return searchFolder;
     }
diff --git a/src/com/android/mail/ui/AbstractActivityController.java b/src/com/android/mail/ui/AbstractActivityController.java
index 03286a1..d1bdb6d 100644
--- a/src/com/android/mail/ui/AbstractActivityController.java
+++ b/src/com/android/mail/ui/AbstractActivityController.java
@@ -108,6 +108,7 @@
 
     private final Set<Uri> mCurrentAccountUris = Sets.newHashSet();
     protected Settings mCachedSettings;
+    private FetchSearchFolderTask mFetchSearchFolderTask;
 
     protected static final String LOG_TAG = new LogUtils().getLogTag();
     private static final int ACCOUNT_CURSOR_LOADER = 0;
@@ -231,7 +232,6 @@
         }
     }
 
-
     private void restartSettingsLoader() {
         if (mAccount.settingsQueryUri != null) {
             mActivity.getLoaderManager().restartLoader(ACCOUNT_SETTINGS_LOADER, null, this);
@@ -256,6 +256,15 @@
         mFetchAccountFolderTask.execute();
     }
 
+    private void fetchSearchFolder(Intent intent) {
+        if (mFetchSearchFolderTask != null) {
+            mFetchSearchFolderTask.cancel(true);
+        }
+        mFetchSearchFolderTask = new FetchSearchFolderTask(intent
+                .getStringExtra(ConversationListContext.EXTRA_SEARCH_QUERY));
+        mFetchSearchFolderTask.execute();
+    }
+
     @Override
     public void onFolderChanged(Folder folder) {
         if (folder != null && !folder.equals(mFolder)) {
@@ -523,13 +532,7 @@
                 mViewMode.enterSearchResultsListMode();
                 mAccount = ((Account) intent.getParcelableExtra(Utils.EXTRA_ACCOUNT));
                 mActionBarView.setAccount(mAccount);
-                Folder searchFolder = Folder.forSearchResults(mAccount, intent
-                        .getStringExtra(ConversationListContext.EXTRA_SEARCH_QUERY));
-                mConvListContext = ConversationListContext.forSearchQuery(mAccount, searchFolder,
-                        Utils.mailSearchQueryForIntent(intent));
-                setFolder(searchFolder);
-                showConversationList(mConvListContext);
-                mActivity.invalidateOptionsMenu();
+                fetchSearchFolder(intent);
             }
         }
         // Create the accounts loader; this loads the account switch spinner.
@@ -578,11 +581,8 @@
             return new CursorLoader(mContext, AccountCacheProvider.getAccountsUri(),
                     UIProvider.ACCOUNTS_PROJECTION, null, null, null);
         } else if (id == FOLDER_CURSOR_LOADER) {
-            // Don't bother running a cursor loader for the search results folder.
-            if (!mFolder.uri.equals(Folder.SEARCH_RESULTS_URI)) {
-                return new CursorLoader(mActivity.getActivityContext(), mFolder.uri,
-                        UIProvider.FOLDERS_PROJECTION, null, null, null);
-            }
+            return new CursorLoader(mActivity.getActivityContext(), mFolder.uri,
+                    UIProvider.FOLDERS_PROJECTION, null, null, null);
         } else if (id == ACCOUNT_SETTINGS_LOADER) {
             if (mAccount.settingsQueryUri != null) {
                 return new CursorLoader(mActivity.getActivityContext(), mAccount.settingsQueryUri,
@@ -741,4 +741,22 @@
             mFetchAccountFolderTask = null;
         }
     }
+
+    private class FetchSearchFolderTask extends AsyncTask<Void, Void, Folder> {
+        String mQuery;
+        public FetchSearchFolderTask(String query) {
+            mQuery = query;
+        }
+        public Folder doInBackground(Void... params) {
+            Folder searchFolder = Folder.forSearchResults(mAccount, mQuery,
+                    mActivity.getActivityContext());
+            return searchFolder;
+        }
+        public void onPostExecute(Folder folder) {
+            setFolder(folder);
+            mConvListContext = ConversationListContext.forSearchQuery(mAccount, mFolder, mQuery);
+            showConversationList(mConvListContext);
+            mActivity.invalidateOptionsMenu();
+        }
+    }
 }
diff --git a/src/com/android/mail/ui/RecentFolderList.java b/src/com/android/mail/ui/RecentFolderList.java
index 3dcddab..ed5aa0b 100644
--- a/src/com/android/mail/ui/RecentFolderList.java
+++ b/src/com/android/mail/ui/RecentFolderList.java
@@ -135,7 +135,10 @@
             values.put(id, now);
         }
         final ContentResolver mResolver = mContext.getContentResolver();
-        mResolver.update(mAccount.recentFolderListUri, values, null, null);
+        if (mAccount.recentFolderListUri != null
+                && !TextUtils.equals("null", mAccount.recentFolderListUri.toString())) {
+            mResolver.update(mAccount.recentFolderListUri, values, null, null);
+        }
     }
 
     /**