summaryrefslogtreecommitdiffstats
path: root/src/com/android/mail/providers/SearchRecentSuggestionsProvider.java
diff options
context:
space:
mode:
authorJin Cao <jinyan@google.com>2014-08-12 18:16:57 -0700
committerJin Cao <jinyan@google.com>2014-08-21 15:23:39 -0700
commitc6801eb828627c37b8992584767c095dfe11df62 (patch)
treeef75cff9964c8cc8c4fbfce495dc5a684b348fef /src/com/android/mail/providers/SearchRecentSuggestionsProvider.java
parent28d44b2bec95381693b203f0515218aaf5418f04 (diff)
downloadandroid_packages_apps_UnifiedEmail-c6801eb828627c37b8992584767c095dfe11df62.tar.gz
android_packages_apps_UnifiedEmail-c6801eb828627c37b8992584767c095dfe11df62.tar.bz2
android_packages_apps_UnifiedEmail-c6801eb828627c37b8992584767c095dfe11df62.zip
Quantum search - version 1
I apologize in advance for this huge CL. - New icons (yay!) - Abandon framework search and handle in-app search functionality ourselves. This is made possible because we use Toolbar and can position any custom view on top. - Remove all previous search related attributes, including search providers, searchable, search authority, default search menu item layout, etc. - Cleaned up the recent history provider to contain only the functionalities we need - query, add, and delete. Instead of using the framework to add recent queries, we directly insert into our database. Since the provider no longer needs to extend ContentProvider, removed some unnecessary callbacks such as onCreate. - Custom quantum search views: - Top search bar, this is inserted in a FrameLayout on top of Toolbar. The search bar interacts with the suggestion list and AbstractActivityController via the QuantumSearchViewController interface. - Suggestions list, this is inserted in the FrameLayout that typically contains the main content pane for either one-pane or two-pane layouts. Again, this interacts with the action bar via the controller. - Voice search, this is simply an implicit intent that converts speech to text. b/16518233 Change-Id: I589c40e6c6e3d8c719856b735d0c53e8db986e65
Diffstat (limited to 'src/com/android/mail/providers/SearchRecentSuggestionsProvider.java')
-rw-r--r--src/com/android/mail/providers/SearchRecentSuggestionsProvider.java175
1 files changed, 34 insertions, 141 deletions
diff --git a/src/com/android/mail/providers/SearchRecentSuggestionsProvider.java b/src/com/android/mail/providers/SearchRecentSuggestionsProvider.java
index 99ac4dfa4..0581869ba 100644
--- a/src/com/android/mail/providers/SearchRecentSuggestionsProvider.java
+++ b/src/com/android/mail/providers/SearchRecentSuggestionsProvider.java
@@ -18,37 +18,30 @@
package com.android.mail.providers;
import android.app.SearchManager;
-import android.content.ContentProvider;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.Context;
-import android.content.UriMatcher;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
-import android.net.Uri;
+import android.os.SystemClock;
import android.text.TextUtils;
import com.android.mail.R;
import java.util.ArrayList;
-public class SearchRecentSuggestionsProvider extends ContentProvider {
+public class SearchRecentSuggestionsProvider {
/*
* String used to delimit different parts of a query.
*/
public static final String QUERY_TOKEN_SEPARATOR = " ";
- // client-provided configuration values
- private String mAuthority;
- private int mMode;
-
// general database configuration and tables
private SQLiteOpenHelper mOpenHelper;
private static final String sDatabaseName = "suggestions.db";
private static final String sSuggestions = "suggestions";
private static final String ORDER_BY = "date DESC";
- private static final String NULL_COLUMN = "query";
// Table of database versions. Don't forget to update!
// NOTE: These version values are shifted left 8 bits (x 256) in order to create space for
@@ -56,24 +49,28 @@ public class SearchRecentSuggestionsProvider extends ContentProvider {
//
// 1 original implementation with queries, and 1 or 2 display columns
// 1->2 added UNIQUE constraint to display1 column
- private static final int DATABASE_VERSION = 2 * 256;
+ private static final int DATABASE_VERSION = 3 * 256;
/**
* This mode bit configures the database to record recent queries. <i>required</i>
- *
- * @see #setupSuggestions(String, int)
+ * @see #setupSuggestions(int)
*/
public static final int DATABASE_MODE_QUERIES = 1;
- // Uri and query support
- private static final int URI_MATCH_SUGGEST = 1;
-
- private Uri mSuggestionsUri;
- private UriMatcher mUriMatcher;
-
private String mSuggestSuggestionClause;
private String[] mSuggestionProjection;
+ protected final Context mContext;
+
+ public SearchRecentSuggestionsProvider(Context context) {
+ mContext = context;
+ mOpenHelper = new DatabaseHelper(mContext, DATABASE_VERSION);
+ }
+
+ public void cleanup() {
+ mOpenHelper.close();
+ }
+
/**
* Builds the database. This version has extra support for using the version field
* as a mode flags field, and configures the database columns depending on the mode bits
@@ -110,31 +107,20 @@ public class SearchRecentSuggestionsProvider extends ContentProvider {
* constructor. In your application or activities, you must provide the same values when
* you create the {@link android.provider.SearchRecentSuggestions} helper.
*
- * @param authority This must match the authority that you've declared in your manifest.
* @param mode You can use mode flags here to determine certain functional aspects of your
* database. Note, this value should not change from run to run, because when it does change,
* your suggestions database may be wiped.
*
* @see #DATABASE_MODE_QUERIES
*/
- protected void setupSuggestions(String authority, int mode) {
- if (TextUtils.isEmpty(authority) ||
- ((mode & DATABASE_MODE_QUERIES) == 0)) {
+ protected void setupSuggestions(int mode) {
+ if ((mode & DATABASE_MODE_QUERIES) == 0) {
throw new IllegalArgumentException();
}
- // saved values
- mAuthority = new String(authority);
- mMode = mode;
-
- // derived values
- mSuggestionsUri = Uri.parse("content://" + mAuthority + "/suggestions");
- mUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
- mUriMatcher.addURI(mAuthority, SearchManager.SUGGEST_URI_PATH_QUERY, URI_MATCH_SUGGEST);
-
// The URI of the icon that we will include on every suggestion here.
final String historicalIcon = ContentResolver.SCHEME_ANDROID_RESOURCE + "://"
- + getContext().getPackageName() + "/" + R.drawable.ic_history_holo_light;
+ + mContext.getPackageName() + "/" + R.drawable.ic_history_24dp;
mSuggestSuggestionClause = "display1 LIKE ?";
mSuggestionProjection = new String [] {
@@ -145,99 +131,6 @@ public class SearchRecentSuggestionsProvider extends ContentProvider {
};
}
- /**
- * This method is provided for use by the ContentResolver. Do not override, or directly
- * call from your own code.
- */
- @Override
- public int delete(Uri uri, String selection, String[] selectionArgs) {
- SQLiteDatabase db = mOpenHelper.getWritableDatabase();
-
- final int length = uri.getPathSegments().size();
- if (length != 1) {
- throw new IllegalArgumentException("Unknown Uri");
- }
-
- final String base = uri.getPathSegments().get(0);
- int count = 0;
- if (base.equals(sSuggestions)) {
- count = db.delete(sSuggestions, selection, selectionArgs);
- } else {
- throw new IllegalArgumentException("Unknown Uri");
- }
- getContext().getContentResolver().notifyChange(uri, null);
- return count;
- }
-
- /**
- * This method is provided for use by the ContentResolver. Do not override, or directly
- * call from your own code.
- */
- @Override
- public String getType(Uri uri) {
- if (mUriMatcher.match(uri) == URI_MATCH_SUGGEST) {
- return SearchManager.SUGGEST_MIME_TYPE;
- }
- int length = uri.getPathSegments().size();
- if (length >= 1) {
- String base = uri.getPathSegments().get(0);
- if (base.equals(sSuggestions)) {
- if (length == 1) {
- return "vnd.android.cursor.dir/suggestion";
- } else if (length == 2) {
- return "vnd.android.cursor.item/suggestion";
- }
- }
- }
- throw new IllegalArgumentException("Unknown Uri");
- }
-
- /**
- * This method is provided for use by the ContentResolver. Do not override, or directly
- * call from your own code.
- */
- @Override
- public Uri insert(Uri uri, ContentValues values) {
- SQLiteDatabase db = mOpenHelper.getWritableDatabase();
-
- int length = uri.getPathSegments().size();
- if (length < 1) {
- throw new IllegalArgumentException("Unknown Uri");
- }
- // Note: This table has on-conflict-replace semantics, so insert() may actually replace()
- long rowID = -1;
- String base = uri.getPathSegments().get(0);
- Uri newUri = null;
- if (base.equals(sSuggestions)) {
- if (length == 1) {
- rowID = db.insert(sSuggestions, NULL_COLUMN, values);
- if (rowID > 0) {
- newUri = Uri.withAppendedPath(mSuggestionsUri, String.valueOf(rowID));
- }
- }
- }
- if (rowID < 0) {
- throw new IllegalArgumentException("Unknown Uri");
- }
- getContext().getContentResolver().notifyChange(newUri, null);
- return newUri;
- }
-
- /**
- * This method is provided for use by the ContentResolver. Do not override, or directly
- * call from your own code.
- */
- @Override
- public boolean onCreate() {
- if (mAuthority == null || mMode == 0) {
- throw new IllegalArgumentException("Provider not configured");
- }
- int mWorkingDbVersion = DATABASE_VERSION + mMode;
- mOpenHelper = new DatabaseHelper(getContext(), mWorkingDbVersion);
-
- return true;
- }
-
private ArrayList<String> mFullQueryTerms;
/**
@@ -278,13 +171,8 @@ public class SearchRecentSuggestionsProvider extends ContentProvider {
mFullQueryTerms = terms;
}
- /**
- * This method is provided for use by the ContentResolver. Do not override,
- * or directly call from your own code.
- */
// TODO: Confirm no injection attacks here, or rewrite.
- @Override
- public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
+ public Cursor query(String[] projection, String selection, String[] selectionArgs,
String sortOrder) {
SQLiteDatabase db = mOpenHelper.getReadableDatabase();
@@ -300,22 +188,27 @@ public class SearchRecentSuggestionsProvider extends ContentProvider {
suggestSelection = mSuggestSuggestionClause;
}
// Suggestions are always performed with the default sort order
- // Add this to the query:
- // "select 'real_query' as SearchManager.SUGGEST_COLUMN_QUERY.
- // rest of query
- // real query will then show up in the suggestion
Cursor c = db.query(sSuggestions, createProjection(selectionArgs), suggestSelection, myArgs,
null, null, ORDER_BY, null);
- c.setNotificationUri(getContext().getContentResolver(), uri);
return c;
}
/**
- * This method is provided for use by the ContentResolver. Do not override, or directly
- * call from your own code.
+ * We are going to keep track of recent suggestions ourselves and not depend on the framework.
+ * Note that this writes to disk. DO NOT CALL FROM MAIN THREAD.
*/
- @Override
- public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
- throw new UnsupportedOperationException("Not implemented");
+ public void saveRecentQuery(String query) {
+ SQLiteDatabase db = mOpenHelper.getWritableDatabase();
+ ContentValues values = new ContentValues(3);
+ values.put("display1", query);
+ values.put("query", query);
+ values.put("date", SystemClock.elapsedRealtime());
+ // Note: This table has on-conflict-replace semantics, so insert() may actually replace()
+ db.insert(sSuggestions, null, values);
+ }
+
+ public void clearHistory() {
+ SQLiteDatabase db = mOpenHelper.getReadableDatabase();
+ db.delete(sSuggestions, null, null);
}
} \ No newline at end of file