package eu.ttbox.androgister.domain.provider; import java.util.HashMap; import java.util.Map; import android.app.SearchManager; import android.content.ContentResolver; import android.content.UriMatcher; import android.database.Cursor; import android.net.Uri; import android.util.Log; import eu.ttbox.androgister.AndroGisterApplication; import eu.ttbox.androgister.domain.CatalogProductDao; import eu.ttbox.androgister.domain.Product; import eu.ttbox.androgister.domain.ProductDao; import eu.ttbox.androgister.domain.ProductDao.Properties; public class ProductProvider extends AbstractGreenContentProvider<Product> { private static final String TAG = "ProductProvider"; public static final int CATALOG_ENTITIES = 10; // MIME types used for searching words or looking up a single definition public static final String PRODUCTS_LIST_MIME_TYPE = ContentResolver.CURSOR_DIR_BASE_TYPE + "/vnd.ttbox.cursor.item/product"; public static final String PRODUCT_MIME_TYPE = ContentResolver.CURSOR_ITEM_BASE_TYPE + "/vnd.ttbox.cursor.item/product"; public static class Constants { public static String AUTHORITY = "eu.ttbox.androgister.product"; public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/product"); public static final Uri CONTENT_URI_GET_PRODUCT = Uri.parse("content://" + AUTHORITY + "/product/"); public static final Uri CONTENT_URI_CATALOG_PRODUCT = Uri.parse("content://" + AUTHORITY + "/catalog/"); public static Uri getEntityUri(long entityId) { return Uri.withAppendedPath(CONTENT_URI, String.valueOf(entityId)); } } // UriMatcher stuff private static final UriMatcher sURIMatcher = buildUriMatcher(); public static final String SELECT_BY_ENTITY_ID = String.format("%s = ?", Properties.Id.columnName); private HashMap<String, String> mEntityColumnMap; @Override public Map<String, String> getEntityColumnMap() { return mEntityColumnMap; } public ProductDao getEntityDao() { ProductDao dao = ((AndroGisterApplication) getContext().getApplicationContext()).getDaoSession().getProductDao(); mEntityColumnMap = buildEntityColumnMap(dao); return dao; } private HashMap<String, String> buildEntityColumnMap(ProductDao entityDao) { HashMap<String, String> map = new HashMap<String, String>(); // Add Identity Column for (String col : entityDao.getAllColumns()) { map.put(col, col); } // Add Suggest Aliases map.put(SearchManager.SUGGEST_COLUMN_TEXT_1, String.format("%s AS %s", Properties.Name, SearchManager.SUGGEST_COLUMN_TEXT_1)); map.put(SearchManager.SUGGEST_COLUMN_TEXT_2, String.format("%s AS %s", Properties.Description, SearchManager.SUGGEST_COLUMN_TEXT_2)); map.put(SearchManager.SUGGEST_COLUMN_INTENT_DATA_ID, "rowid AS " + SearchManager.SUGGEST_COLUMN_INTENT_DATA_ID); map.put(SearchManager.SUGGEST_COLUMN_SHORTCUT_ID, "rowid AS " + SearchManager.SUGGEST_COLUMN_SHORTCUT_ID); // Add Other Aliases return map; } @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { Log.d(TAG, "query for uri : " + uri); switch (matchUriMatcher(uri)) { case CATALOG_ENTITIES: String filterCatalog = String.format("%s in (select %s from %s)", Properties.Id.columnName, // CatalogProductDao.Properties.ProductId.columnName, CatalogProductDao.TABLENAME); String whereClause = selection == null ? filterCatalog : filterCatalog + " and (" + selection + ")"; return queryEntities(projection, whereClause, selectionArgs, sortOrder); } return super.query(uri, projection, selection, selectionArgs, sortOrder); } /** * Builds up a UriMatcher for search suggestion and shortcut refresh * queries. */ private static UriMatcher buildUriMatcher() { UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH); // to get definitions... matcher.addURI(Constants.AUTHORITY, "product", ENTITIES); matcher.addURI(Constants.AUTHORITY, "product/#", ENTITY); matcher.addURI(Constants.AUTHORITY, "catalog", CATALOG_ENTITIES); return matcher; } public int matchUriMatcher(Uri uri) { return sURIMatcher.match(uri); } public String getSelectClauseByEntityId() { return SELECT_BY_ENTITY_ID; } public Uri getEntityUri(long entityId) { return Constants.getEntityUri(entityId); } /** * 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 (matchUriMatcher(uri)) { case ENTITY: return PRODUCT_MIME_TYPE; case ENTITIES: return PRODUCTS_LIST_MIME_TYPE; case CATALOG_ENTITIES: return PRODUCTS_LIST_MIME_TYPE; default: throw new IllegalArgumentException("Unknown URL " + uri); } } }