package au.com.museumvictoria.fieldguide.bunurong.provider; import java.io.FileNotFoundException; import android.app.SearchManager; import android.content.ContentProvider; import android.content.ContentResolver; import android.content.ContentValues; import android.content.UriMatcher; import android.content.res.AssetFileDescriptor; import android.database.Cursor; import android.net.Uri; import android.provider.BaseColumns; import android.text.TextUtils; import android.util.Log; import au.com.museumvictoria.fieldguide.bunurong.db.FieldGuideDatabase; public class FieldGuideContentProvider extends ContentProvider { String TAG = "FieldGuideContentProvider"; public static String AUTHORITY = "au.com.museumvictoria.fieldguide.bunurong.FieldGuideContentProvider"; public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/fieldguide"); // MIME types used for searching words or looking up a single definition public static final String SPECIES_MIME_TYPE = ContentResolver.CURSOR_DIR_BASE_TYPE + "/vnd.museumvictoria.fieldguide"; public static final String DETAILS_MIME_TYPE = ContentResolver.CURSOR_ITEM_BASE_TYPE + "/vnd.museumvictoria.fieldguide"; public static final String SPECIES_ICON_TYPE = "content://au.com.museumvictoria.fieldguide.bunurong.FieldGuideAssestsProvider/data/images/species/thumbnails/400287.jpg"; private FieldGuideDatabase mDatabase; // UriMatcher stuff private static final int SEARCH_SPECIES = 0; private static final int GET_DETAILS = 1; private static final int SEARCH_SUGGEST = 2; private static final int REFRESH_SHORTCUT = 3; private static final int SPECIES_ICON = 4; private static final UriMatcher sURIMatcher = buildUriMatcher(); /** * Builds up a UriMatcher for search suggestion and shortcut refresh * queries. */ private static UriMatcher buildUriMatcher() { UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH); // to get details... matcher.addURI(AUTHORITY, "fieldguide", SEARCH_SPECIES); matcher.addURI(AUTHORITY, "fieldguide/#", GET_DETAILS); // 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); matcher.addURI(AUTHORITY, SearchManager.SUGGEST_COLUMN_ICON_1, 4); return matcher; } @Override public String getType(Uri uri) { Log.e(TAG, "Returning type for: " + uri); switch (sURIMatcher.match(uri)) { case SEARCH_SPECIES: return SPECIES_MIME_TYPE; case GET_DETAILS: return DETAILS_MIME_TYPE; case SEARCH_SUGGEST: return SearchManager.SUGGEST_MIME_TYPE; // case REFRESH_SHORTCUT: // return SearchManager.SHORTCUT_MIME_TYPE; case SPECIES_ICON: return DETAILS_MIME_TYPE; default: throw new IllegalArgumentException("Unknown URL " + uri); } } @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 Log.w(TAG, "Provider query: " + uri); switch (sURIMatcher.match(uri)) { case SEARCH_SUGGEST: if (selectionArgs == null) { throw new IllegalArgumentException("selectionArgs must be provided for the Uri: " + uri); } Log.w(TAG, "Provider query with SEARCH_SUGGEST"); Log.w(TAG, selectionArgs[0]); return getSuggestions(selectionArgs[0]); case SEARCH_SPECIES: if (selectionArgs == null) { throw new IllegalArgumentException("selectionArgs must be provided for the Uri: " + uri); } Log.w(TAG, "Provider query with SEARCH_SPECIES"); return search(selectionArgs[0]); case GET_DETAILS: Log.w(TAG, "Provider query with GET_DETAILS"); return getSpeciesDetails(uri); // case REFRESH_SHORTCUT: // return refreshShortcut(uri); default: Log.w(TAG, "Provider query with DEFAULT"); throw new IllegalArgumentException("Unknown Uri: " + uri); } } @Override public boolean onCreate() { //mDatabase = new FieldGuideDatabase(getContext()); mDatabase = FieldGuideDatabase.getInstance(getContext()); return true; } @Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { // TODO Auto-generated method stub return 0; } @Override public Uri insert(Uri uri, ContentValues values) { // TODO Auto-generated method stub return null; } @Override public int delete(Uri uri, String selection, String[] selectionArgs) { // TODO Auto-generated method stub return 0; } private Cursor getSuggestions(String query) { query = query.toLowerCase(); String[] columns = new String[] { BaseColumns._ID, FieldGuideDatabase.SPECIES_LABEL + " AS " + SearchManager.SUGGEST_COLUMN_TEXT_1, FieldGuideDatabase.SPECIES_SUBLABEL + " AS " + SearchManager.SUGGEST_COLUMN_TEXT_2, FieldGuideDatabase.SPECIES_SEARCHICON + " AS " + SearchManager.SUGGEST_COLUMN_ICON_1, BaseColumns._ID + " AS " + SearchManager.SUGGEST_COLUMN_INTENT_DATA_ID }; return mDatabase.getSpeciesMatches(query, columns); } private Cursor search(String query) { query = query.toLowerCase(); String[] columns = new String[] { BaseColumns._ID, FieldGuideDatabase.SPECIES_IDENTIFIER, FieldGuideDatabase.SPECIES_LABEL, FieldGuideDatabase.SPECIES_SUBLABEL, FieldGuideDatabase.SPECIES_THUMBNAIL }; return mDatabase.getSpeciesMatches(query); } private Cursor getSpeciesDetails(Uri uri) { String rowId = uri.getLastPathSegment(); String[] columns = new String[] { FieldGuideDatabase.SPECIES_IDENTIFIER, FieldGuideDatabase.SPECIES_LABEL, FieldGuideDatabase.SPECIES_SUBLABEL, FieldGuideDatabase.SPECIES_THUMBNAIL }; return mDatabase.getSpeciesDetails(rowId, columns); } @Override public AssetFileDescriptor openAssetFile(Uri uri, String mode) throws FileNotFoundException { Log.d(TAG, "in openAssetFile: uri: " + uri + " ==> mode: " + mode); return super.openAssetFile(uri, mode); } }