SDK SAMPLE CODE ONLY Before, the _id column in the search suggestions contained a string. This causes an exception when the suggestion provider is used for in-app search in Cupcake. Now the _id column contains a long instead. Fixes http://b/issue?id=2219970 Change-Id: I53c8228badbb0e3ff1799107490b44ff8ced7148
162 lines
6.0 KiB
Java
162 lines
6.0 KiB
Java
/*
|
|
* Copyright (C) 2009 The Android Open Source Project
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
package com.example.android.searchabledict;
|
|
|
|
import android.app.SearchManager;
|
|
import android.content.ContentProvider;
|
|
import android.content.ContentValues;
|
|
import android.content.UriMatcher;
|
|
import android.content.res.Resources;
|
|
import android.database.Cursor;
|
|
import android.database.MatrixCursor;
|
|
import android.net.Uri;
|
|
import android.text.TextUtils;
|
|
|
|
import java.util.List;
|
|
|
|
/**
|
|
* Provides search suggestions for a list of words and their definitions.
|
|
*/
|
|
public class DictionaryProvider extends ContentProvider {
|
|
|
|
public static String AUTHORITY = "dictionary";
|
|
|
|
private static final int SEARCH_SUGGEST = 0;
|
|
private static final int SHORTCUT_REFRESH = 1;
|
|
private static final UriMatcher sURIMatcher = buildUriMatcher();
|
|
|
|
/**
|
|
* The columns we'll include in our search suggestions. There are others that could be used
|
|
* to further customize the suggestions, see the docs in {@link SearchManager} for the details
|
|
* on additional columns that are supported.
|
|
*/
|
|
private static final String[] COLUMNS = {
|
|
"_id", // must include this column
|
|
SearchManager.SUGGEST_COLUMN_TEXT_1,
|
|
SearchManager.SUGGEST_COLUMN_TEXT_2,
|
|
SearchManager.SUGGEST_COLUMN_INTENT_DATA,
|
|
};
|
|
|
|
|
|
/**
|
|
* Sets up a uri matcher for search suggestion and shortcut refresh queries.
|
|
*/
|
|
private static UriMatcher buildUriMatcher() {
|
|
UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH);
|
|
matcher.addURI(AUTHORITY, SearchManager.SUGGEST_URI_PATH_QUERY, SEARCH_SUGGEST);
|
|
matcher.addURI(AUTHORITY, SearchManager.SUGGEST_URI_PATH_QUERY + "/*", SEARCH_SUGGEST);
|
|
matcher.addURI(AUTHORITY, SearchManager.SUGGEST_URI_PATH_SHORTCUT, SHORTCUT_REFRESH);
|
|
matcher.addURI(AUTHORITY, SearchManager.SUGGEST_URI_PATH_SHORTCUT + "/*", SHORTCUT_REFRESH);
|
|
return matcher;
|
|
}
|
|
|
|
@Override
|
|
public boolean onCreate() {
|
|
Resources resources = getContext().getResources();
|
|
Dictionary.getInstance().ensureLoaded(resources);
|
|
return true;
|
|
}
|
|
|
|
@Override
|
|
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
|
|
String sortOrder) {
|
|
if (!TextUtils.isEmpty(selection)) {
|
|
throw new IllegalArgumentException("selection not allowed for " + uri);
|
|
}
|
|
if (selectionArgs != null && selectionArgs.length != 0) {
|
|
throw new IllegalArgumentException("selectionArgs not allowed for " + uri);
|
|
}
|
|
if (!TextUtils.isEmpty(sortOrder)) {
|
|
throw new IllegalArgumentException("sortOrder not allowed for " + uri);
|
|
}
|
|
switch (sURIMatcher.match(uri)) {
|
|
case SEARCH_SUGGEST:
|
|
String query = null;
|
|
if (uri.getPathSegments().size() > 1) {
|
|
query = uri.getLastPathSegment().toLowerCase();
|
|
}
|
|
return getSuggestions(query, projection);
|
|
case SHORTCUT_REFRESH:
|
|
String shortcutId = null;
|
|
if (uri.getPathSegments().size() > 1) {
|
|
shortcutId = uri.getLastPathSegment();
|
|
}
|
|
return refreshShortcut(shortcutId, projection);
|
|
default:
|
|
throw new IllegalArgumentException("Unknown URL " + uri);
|
|
}
|
|
}
|
|
|
|
private Cursor getSuggestions(String query, String[] projection) {
|
|
String processedQuery = query == null ? "" : query.toLowerCase();
|
|
List<Dictionary.Word> words = Dictionary.getInstance().getMatches(processedQuery);
|
|
|
|
MatrixCursor cursor = new MatrixCursor(COLUMNS);
|
|
long id = 0;
|
|
for (Dictionary.Word word : words) {
|
|
cursor.addRow(columnValuesOfWord(id++, word));
|
|
}
|
|
|
|
return cursor;
|
|
}
|
|
|
|
private Object[] columnValuesOfWord(long id, Dictionary.Word word) {
|
|
return new Object[] {
|
|
id, // _id
|
|
word.word, // text1
|
|
word.definition, // text2
|
|
word.word, // intent_data (included when clicking on item)
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Note: this is unused as is, but if we included
|
|
* {@link SearchManager#SUGGEST_COLUMN_SHORTCUT_ID} as a column in our results, we
|
|
* could expect to receive refresh queries on this uri for the id provided, in which case we
|
|
* would return a cursor with a single item representing the refreshed suggestion data.
|
|
*/
|
|
private Cursor refreshShortcut(String shortcutId, String[] projection) {
|
|
return null;
|
|
}
|
|
|
|
/**
|
|
* All queries for this provider are for the search suggestion and shortcut refresh mime type.
|
|
*/
|
|
public String getType(Uri uri) {
|
|
switch (sURIMatcher.match(uri)) {
|
|
case SEARCH_SUGGEST:
|
|
return SearchManager.SUGGEST_MIME_TYPE;
|
|
case SHORTCUT_REFRESH:
|
|
return SearchManager.SHORTCUT_MIME_TYPE;
|
|
default:
|
|
throw new IllegalArgumentException("Unknown URL " + uri);
|
|
}
|
|
}
|
|
|
|
public Uri insert(Uri uri, ContentValues values) {
|
|
throw new UnsupportedOperationException();
|
|
}
|
|
|
|
public int delete(Uri uri, String selection, String[] selectionArgs) {
|
|
throw new UnsupportedOperationException();
|
|
}
|
|
|
|
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
|
|
throw new UnsupportedOperationException();
|
|
}
|
|
}
|