diff options
Diffstat (limited to 'src/net/cbaines/suma/MapContentProvider.java')
-rw-r--r-- | src/net/cbaines/suma/MapContentProvider.java | 194 |
1 files changed, 146 insertions, 48 deletions
diff --git a/src/net/cbaines/suma/MapContentProvider.java b/src/net/cbaines/suma/MapContentProvider.java index 46986ab..a2b42c3 100644 --- a/src/net/cbaines/suma/MapContentProvider.java +++ b/src/net/cbaines/suma/MapContentProvider.java @@ -16,7 +16,8 @@ package net.cbaines.suma; -import com.j256.ormlite.android.apptools.OpenHelperManager; +import java.sql.SQLException; +import java.util.List; import android.app.SearchManager; import android.content.ContentProvider; @@ -24,8 +25,17 @@ import android.content.ContentResolver; import android.content.ContentValues; import android.content.UriMatcher; import android.database.Cursor; +import android.database.MatrixCursor; import android.net.Uri; import android.provider.BaseColumns; +import android.util.Log; + +import com.j256.ormlite.android.AndroidCompiledStatement; +import com.j256.ormlite.android.apptools.OpenHelperManager; +import com.j256.ormlite.dao.Dao; +import com.j256.ormlite.stmt.PreparedQuery; +import com.j256.ormlite.stmt.QueryBuilder; +import com.j256.ormlite.stmt.StatementBuilder.StatementType; /** * Provides access to the dictionary database. @@ -34,21 +44,40 @@ public class MapContentProvider extends ContentProvider { String TAG = "MapContentProvider"; public static String AUTHORITY = "net.cbaines.suma.provider"; - public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/building"); + // public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + // + "/building"); // MIME types used for searching words or looking up a single definition - public static final String WORDS_MIME_TYPE = ContentResolver.CURSOR_DIR_BASE_TYPE - + "/vnd.example.android.searchabledict"; - public static final String DEFINITION_MIME_TYPE = ContentResolver.CURSOR_ITEM_BASE_TYPE - + "/vnd.example.android.searchabledict"; + public static final String BUILDINGS_MIME_TYPE = ContentResolver.CURSOR_DIR_BASE_TYPE + + "/vnd.net.cbaines.suma.provider.building"; + public static final String BUILDING_MIME_TYPE = ContentResolver.CURSOR_ITEM_BASE_TYPE + + "/vnd.net.cbaines.suma.provider.building"; + public static final String BUS_STOPS_MIME_TYPE = ContentResolver.CURSOR_DIR_BASE_TYPE + + "/vnd.net.cbaines.suma.provider.bus-stop"; + public static final String BUS_STOP_MIME_TYPE = ContentResolver.CURSOR_ITEM_BASE_TYPE + + "/vnd.net.cbaines.suma.provider.bus-stop"; + public static final String SITES_MIME_TYPE = ContentResolver.CURSOR_DIR_BASE_TYPE + + "/vnd.net.cbaines.suma.provider.site"; + public static final String SITE_MIME_TYPE = ContentResolver.CURSOR_ITEM_BASE_TYPE + + "/vnd.net.cbaines.suma.provider.site"; + public static final String BUSES_MIME_TYPE = ContentResolver.CURSOR_DIR_BASE_TYPE + + "/vnd.net.cbaines.suma.provider.bus"; + public static final String BUS_MIME_TYPE = ContentResolver.CURSOR_ITEM_BASE_TYPE + + "/vnd.net.cbaines.suma.provider.bus"; private DatabaseHelper helper; // UriMatcher stuff - private static final int SEARCH_WORDS = 0; - private static final int GET_WORD = 1; - private static final int SEARCH_SUGGEST = 2; - private static final int REFRESH_SHORTCUT = 3; + private static final int SEARCH_BUILDINGS = 0; + private static final int GET_BUILDING = 1; + private static final int SEARCH_BUS_STOPS = 2; + private static final int GET_BUS_STOP = 3; + private static final int SEARCH_SITES = 4; + private static final int GET_SITE = 5; + private static final int SEARCH_BUSES = 6; + private static final int GET_BUS = 7; + private static final int SEARCH_SUGGEST = 8; + private static final int REFRESH_SHORTCUT = 9; private static final UriMatcher sURIMatcher = buildUriMatcher(); /** @@ -58,8 +87,15 @@ public class MapContentProvider extends ContentProvider { private static UriMatcher buildUriMatcher() { UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH); // to get definitions... - matcher.addURI(AUTHORITY, "dictionary", SEARCH_WORDS); - matcher.addURI(AUTHORITY, "dictionary/#", GET_WORD); + matcher.addURI(AUTHORITY, "building", SEARCH_BUILDINGS); + matcher.addURI(AUTHORITY, "building/*", GET_BUILDING); + matcher.addURI(AUTHORITY, "bus-stop", SEARCH_BUS_STOPS); + matcher.addURI(AUTHORITY, "bus-stop/*", GET_BUS_STOP); + matcher.addURI(AUTHORITY, "site", SEARCH_SITES); + matcher.addURI(AUTHORITY, "site/*", GET_SITE); + matcher.addURI(AUTHORITY, "bus", SEARCH_BUSES); + matcher.addURI(AUTHORITY, "bus/*", GET_BUS); + // to get suggestions... matcher.addURI(AUTHORITY, SearchManager.SUGGEST_URI_PATH_QUERY, SEARCH_SUGGEST); matcher.addURI(AUTHORITY, SearchManager.SUGGEST_URI_PATH_QUERY + "/*", SEARCH_SUGGEST); @@ -100,50 +136,94 @@ public class MapContentProvider extends ContentProvider { if (selectionArgs == null) { throw new IllegalArgumentException("selectionArgs must be provided for the Uri: " + uri); } - return getSuggestions(selectionArgs[0]); - case SEARCH_WORDS: + try { + return getSuggestions(selectionArgs[0]); + } catch (SQLException e1) { + e1.printStackTrace(); + } + case SEARCH_BUILDINGS: if (selectionArgs == null) { throw new IllegalArgumentException("selectionArgs must be provided for the Uri: " + uri); } - return search(selectionArgs[0]); - case GET_WORD: - return getWord(uri); + try { + return searchBuildings(selectionArgs[0]); + } catch (SQLException e) { + e.printStackTrace(); + } + case GET_BUILDING: + try { + return getBuilding(uri); + } catch (SQLException e) { + e.printStackTrace(); + } case REFRESH_SHORTCUT: - return refreshShortcut(uri); + try { + return refreshShortcut(uri); + } catch (SQLException e) { + e.printStackTrace(); + } default: throw new IllegalArgumentException("Unknown Uri: " + uri); } } - private Cursor getSuggestions(String query) { - query = query.toLowerCase(); - String[] columns = new String[] { BaseColumns._ID, DictionaryDatabase.KEY_WORD, - DictionaryDatabase.KEY_DEFINITION, - /* - * SearchManager.SUGGEST_COLUMN_SHORTCUT_ID, (only if you want - * to refresh shortcuts) - */ - SearchManager.SUGGEST_COLUMN_INTENT_DATA_ID }; - - return mDictionary.getWordMatches(query, columns); + private Cursor getSuggestions(String query) throws SQLException { + Log.v(TAG, "Got query for " + query); + + Dao<Building, String> buildingDao = helper.getBuildingDao(); + + QueryBuilder<Building, String> qb = buildingDao.queryBuilder(); + qb.where().like(Building.ID_FIELD_NAME, "%" + query + "%").or() + .like(Building.NAME_FIELD_NAME, "%" + query + "%"); + PreparedQuery<Building> preparedQuery = qb.prepare(); + + List<Building> buildings = buildingDao.query(preparedQuery); + Log.v(TAG, "Returning " + buildings.size() + " buildings"); + + String[] columnNames = { BaseColumns._ID, SearchManager.SUGGEST_COLUMN_TEXT_1 }; + + MatrixCursor cursor = new MatrixCursor(columnNames, buildings.size()); + + int id = 0; + for (Building building : buildings) { + Log.v(TAG, "Building " + id + ", " + building.name); + Object[] values = { id++, building.name }; + cursor.addRow(values); + } + + return cursor; } - private Cursor search(String query) { - query = query.toLowerCase(); - String[] columns = new String[] { BaseColumns._ID, DictionaryDatabase.KEY_WORD, - DictionaryDatabase.KEY_DEFINITION }; + private Cursor searchBuildings(String query) throws SQLException { + Dao<Building, String> buildingDao = helper.getBuildingDao(); + + QueryBuilder<Building, String> qb = buildingDao.queryBuilder(); + qb.where().eq(Building.ID_FIELD_NAME, "%" + query + "%").or().eq(Building.NAME_FIELD_NAME, "%" + query + "%"); + PreparedQuery<Building> preparedQuery = qb.prepare(); - return mDictionary.getWordMatches(query, columns); + AndroidCompiledStatement compiledStatement = (AndroidCompiledStatement) preparedQuery.compile(helper + .getConnectionSource().getReadOnlyConnection(), StatementType.SELECT); + Cursor cursor = compiledStatement.getCursor(); + + return cursor; } - private Cursor getWord(Uri uri) { - String rowId = uri.getLastPathSegment(); - String[] columns = new String[] { DictionaryDatabase.KEY_WORD, DictionaryDatabase.KEY_DEFINITION }; + private Cursor getBuilding(Uri uri) throws SQLException { + String buildingID = uri.getLastPathSegment(); + Dao<Building, String> buildingDao = helper.getBuildingDao(); + + QueryBuilder<Building, String> qb = buildingDao.queryBuilder(); + qb.where().eq(Building.ID_FIELD_NAME, buildingID); + PreparedQuery<Building> preparedQuery = qb.prepare(); + + AndroidCompiledStatement compiledStatement = (AndroidCompiledStatement) preparedQuery.compile(helper + .getConnectionSource().getReadOnlyConnection(), StatementType.SELECT); + Cursor cursor = compiledStatement.getCursor(); - return mDictionary.getWord(rowId, columns); + return cursor; } - private Cursor refreshShortcut(Uri uri) { + private Cursor refreshShortcut(Uri uri) throws SQLException { /* * This won't be called with the current implementation, but if we * include {@link SearchManager#SUGGEST_COLUMN_SHORTCUT_ID} as a column @@ -153,12 +233,18 @@ public class MapContentProvider extends ContentProvider { * using the given item Uri and provide all the columns originally * provided with the suggestion query. */ - String rowId = uri.getLastPathSegment(); - String[] columns = new String[] { BaseColumns._ID, DictionaryDatabase.KEY_WORD, - DictionaryDatabase.KEY_DEFINITION, SearchManager.SUGGEST_COLUMN_SHORTCUT_ID, - SearchManager.SUGGEST_COLUMN_INTENT_DATA_ID }; + String buildingID = uri.getLastPathSegment(); + Dao<Building, String> buildingDao = helper.getBuildingDao(); + + QueryBuilder<Building, String> qb = buildingDao.queryBuilder(); + qb.where().eq(Building.ID_FIELD_NAME, buildingID); + PreparedQuery<Building> preparedQuery = qb.prepare(); + + AndroidCompiledStatement compiledStatement = (AndroidCompiledStatement) preparedQuery.compile(helper + .getConnectionSource().getReadOnlyConnection(), StatementType.SELECT); + Cursor cursor = compiledStatement.getCursor(); - return mDictionary.getWord(rowId, columns); + return cursor; } /** @@ -168,10 +254,22 @@ public class MapContentProvider extends ContentProvider { @Override public String getType(Uri uri) { switch (sURIMatcher.match(uri)) { - case SEARCH_WORDS: - return WORDS_MIME_TYPE; - case GET_WORD: - return DEFINITION_MIME_TYPE; + case SEARCH_BUILDINGS: + return BUILDINGS_MIME_TYPE; + case GET_BUILDING: + return BUILDING_MIME_TYPE; + case SEARCH_BUS_STOPS: + return BUS_STOPS_MIME_TYPE; + case GET_BUS_STOP: + return BUS_STOP_MIME_TYPE; + case SEARCH_SITES: + return SITES_MIME_TYPE; + case GET_SITE: + return SITE_MIME_TYPE; + case SEARCH_BUSES: + return BUSES_MIME_TYPE; + case GET_BUS: + return BUS_MIME_TYPE; case SEARCH_SUGGEST: return SearchManager.SUGGEST_MIME_TYPE; case REFRESH_SHORTCUT: |