package com.oreilly.demo.android.pa.searchdemo; 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; public class SearchDBProvider extends ContentProvider { public final static String AUTHORITY = "com.oreilly.demo.android.pa.searchdemo.SearchDBProvider"; public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/sonnets"); public final static int MODE = 1; public static final String MIME_TYPE = ContentResolver.CURSOR_DIR_BASE_TYPE + "/vnd.oreilly.demo.android.pa.searchdemo"; public static final String SONNET_MIME_TYPE = ContentResolver.CURSOR_ITEM_BASE_TYPE + "/vnd.oreilly.demo.android.pa.searchdemo"; private static final int SEARCH = 0; private static final int GET_SONNET = 1; private static final int SEARCH_SUGGEST = 2; private static final UriMatcher matcher = buildUriMatcher(); private static UriMatcher buildUriMatcher() { UriMatcher umatcher = new UriMatcher(UriMatcher.NO_MATCH); umatcher.addURI(AUTHORITY, "sonnets", SEARCH); umatcher.addURI(AUTHORITY, "sonnets/#", GET_SONNET); umatcher.addURI(AUTHORITY, SearchManager.SUGGEST_URI_PATH_QUERY, SEARCH_SUGGEST); umatcher.addURI(AUTHORITY, SearchManager.SUGGEST_URI_PATH_QUERY + "/*", SEARCH_SUGGEST); return umatcher; } @Override public boolean onCreate() { try { SearchActivity.initializeSearchLogic(getContext()); } catch (Exception e) { e.printStackTrace(); return false; } return true; } @Override public String getType(Uri uri) { switch (matcher.match(uri)) { case SEARCH: return MIME_TYPE; case GET_SONNET: return SONNET_MIME_TYPE; case SEARCH_SUGGEST: return SearchManager.SUGGEST_MIME_TYPE; default: throw new IllegalArgumentException("Unknown URL " + uri); } } @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { switch (matcher.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: if (selectionArgs == null) { throw new IllegalArgumentException( "selectionArgs must be provided for the Uri: " + uri); } return search(selectionArgs[0]); case GET_SONNET: return getSonnet(uri); default: throw new IllegalArgumentException("Unknown Uri: " + uri); } } @Override public int delete(Uri uri, String selection, String[] selectionArgs) { throw new UnsupportedOperationException(); } @Override public Uri insert(Uri uri, ContentValues values) { throw new UnsupportedOperationException(); } @Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { throw new UnsupportedOperationException(); } private Cursor getSuggestions(String query) { query = query.toLowerCase(); String[] columns = new String[] { BaseColumns._ID, SearchDBLogic.SONNETNUM, SearchDBLogic.LINETXT, SearchManager.SUGGEST_COLUMN_INTENT_DATA_ID }; return ((SearchDBLogic) SearchActivity.SEARCHLOGIC).searchDB(query, columns); } private Cursor search(String query) { return ((SearchDBLogic) SearchActivity.SEARCHLOGIC).searchDB(query); } private Cursor getSonnet(Uri uri) { String rowId = uri.getLastPathSegment(); return ((SearchDBLogic) SearchActivity.SEARCHLOGIC).getSonnetCursor(Integer.parseInt(rowId)); } }