aboutsummaryrefslogtreecommitdiff
path: root/src/net/cbaines/suma/MapContentProvider.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/net/cbaines/suma/MapContentProvider.java')
-rw-r--r--src/net/cbaines/suma/MapContentProvider.java194
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: