/*
* 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.ushahidi.android.app.data;
import android.app.SearchManager;
import android.content.ContentProvider;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.net.Uri;
import android.provider.BaseColumns;
import android.util.Log;
import com.ushahidi.android.app.MainApplication;
/**
* Provides search suggestions for a list of deployments and their details.
*/
public class DeploymentProvider extends ContentProvider {
public static String AUTHORITY = "com.ushahidi.android.app.data.deploymentprovider";
public static Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY+ "/deployment");;
// MIME types used for searching words or looking up a single definition
public static final String DEPLOYMENT_MIME_TYPE = ContentResolver.CURSOR_DIR_BASE_TYPE
+ "/vnd.ushahidi.searchabledeployment";
public static final String DEPLOYMENT_DESC_MIME_TYPE = ContentResolver.CURSOR_ITEM_BASE_TYPE
+ "/vnd.ushahidi.searchabledeployment";
// UriMatcher stuff
private static final int SEARCH_DEPLOYMENTS = 0;
private static final int GET_DEPLOYMENT = 1;
private static final int SEARCH_SUGGEST = 2;
private static final int REFRESH_SHORTCUT = 3;
private final UriMatcher sURIMatcher = buildUriMatcher();
@Override
public boolean onCreate() {
return true;
}
/**
* Builds up a UriMatcher for search suggestion and shortcut refresh
* queries.
*/
private UriMatcher buildUriMatcher() {
UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH);
// to get deployments...
matcher.addURI(AUTHORITY, "deployment", SEARCH_DEPLOYMENTS);
matcher.addURI(AUTHORITY, "deployment/#", GET_DEPLOYMENT);
// to get suggestions...
matcher.addURI(AUTHORITY, SearchManager.SUGGEST_URI_PATH_QUERY, SEARCH_SUGGEST);
matcher.addURI(AUTHORITY, SearchManager.SUGGEST_URI_PATH_QUERY + "/*", SEARCH_SUGGEST);
/*
* The following are unused in this implementation, but if we include
* {@link SearchManager#SUGGEST_COLUMN_SHORTCUT_ID} as a column in our
* suggestions table, we could expect to receive refresh queries when a
* shortcutted suggestion is displayed in Quick Search Box, in which
* case, the following Uris would be provided and we would return a
* cursor with a single item representing the refreshed suggestion data.
*/
matcher.addURI(AUTHORITY, SearchManager.SUGGEST_URI_PATH_SHORTCUT, REFRESH_SHORTCUT);
matcher.addURI(AUTHORITY, SearchManager.SUGGEST_URI_PATH_SHORTCUT + "/*", REFRESH_SHORTCUT);
return matcher;
}
/**
* Handles all the dictionary searches and suggestion queries from the
* Search Manager. When requesting a specific word, the uri alone is
* required. When searching all of the dictionary for matches, the
* selectionArgs argument must carry the search query as the first element.
* All other arguments are ignored.
*/
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
String sortOrder) {
// Use the UriMatcher to see what kind of query we have and format the
// db query accordingly
switch (sURIMatcher.match(uri)) {
case SEARCH_SUGGEST:
if (selectionArgs == null) {
throw new IllegalArgumentException(
"selectionArgs must be provided for the Uri: " + uri);
}
return getSuggestions(selectionArgs[0]);
case SEARCH_DEPLOYMENTS:
if (selectionArgs == null) {
throw new IllegalArgumentException(
"selectionArgs must be provided for the Uri: " + uri);
}
return search(selectionArgs[0]);
case GET_DEPLOYMENT:
return getDeployment(uri);
case REFRESH_SHORTCUT:
return refreshShortcut(uri);
default:
throw new IllegalArgumentException("Unknown Uri: " + uri);
}
}
private Cursor getSuggestions(String query) {
query = query.toLowerCase();
String[] columns = new String[] {
BaseColumns._ID, Database.DEPLOYMENT_NAME, Database.DEPLOYMENT_DESC,
Database.DEPLOYMENT_URL, SearchManager.SUGGEST_COLUMN_INTENT_DATA_ID
};
return MainApplication.mDb.getDeploymentMatches(query, columns);
}
private Cursor search(String query) {
query = query.toLowerCase();
String[] columns = new String[] {
BaseColumns._ID, Database.DEPLOYMENT_NAME, Database.DEPLOYMENT_DESC,
Database.DEPLOYMENT_URL
};
Log.d("Search Query", "Query: " + query);
return MainApplication.mDb.getDeploymentMatches(query, columns);
}
private Cursor getDeployment(Uri uri) {
String rowId = uri.getLastPathSegment();
String[] columns = new String[] {
Database.DEPLOYMENT_NAME, Database.DEPLOYMENT_DESC, Database.DEPLOYMENT_URL
};
return MainApplication.mDb.getDeployment(rowId, columns);
}
private Cursor refreshShortcut(Uri uri) {
/*
* This won't be called with the current implementation, but if we
* include {@link SearchManager#SUGGEST_COLUMN_SHORTCUT_ID} as a column
* in our suggestions table, we could expect to receive refresh queries
* when a shortcutted suggestion is displayed in Quick Search Box. In
* which case, this method will query the table for the specific word,
* using the given item Uri and provide all the columns originally
* provided with the suggestion query.
*/
String rowId = uri.getLastPathSegment();
String[] columns = new String[] {
Database.DEPLOYMENT_NAME, Database.DEPLOYMENT_DESC, Database.DEPLOYMENT_URL,
SearchManager.SUGGEST_COLUMN_SHORTCUT_ID,
SearchManager.SUGGEST_COLUMN_INTENT_DATA_ID
};
return MainApplication.mDb.getDeployment(rowId, columns);
}
/**
* This method is required in order to query the supported types. It's also
* useful in our own query() method to determine the type of Uri received.
*/
@Override
public String getType(Uri uri) {
switch (sURIMatcher.match(uri)) {
case SEARCH_DEPLOYMENTS:
return DEPLOYMENT_MIME_TYPE;
case GET_DEPLOYMENT:
return DEPLOYMENT_DESC_MIME_TYPE;
case SEARCH_SUGGEST:
return SearchManager.SUGGEST_MIME_TYPE;
case REFRESH_SHORTCUT:
return SearchManager.SHORTCUT_MIME_TYPE;
default:
throw new IllegalArgumentException("Unknown URL " + uri);
}
}
// Other required implementations...
@Override
public Uri insert(Uri uri, ContentValues values) {
throw new UnsupportedOperationException();
}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
throw new UnsupportedOperationException();
}
@Override
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
throw new UnsupportedOperationException();
}
}