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);
+ }
}
/**