package com.android.example.leanback.search;
import android.app.SearchManager;
import android.content.ContentProvider;
import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.DatabaseUtils;
import android.database.sqlite.SQLiteOpenHelper;
import android.net.Uri;
import android.provider.BaseColumns;
public class SearchContentProvider extends ContentProvider {
private final Matcher matcher;
private SQLiteOpenHelper database;
private ContentResolver resolver;
private static String as(String colum, String alias) {
return colum + " AS " + alias;
}
public SearchContentProvider() {
final Matcher.Builder builder = new Matcher.Builder(UniversalSearchContract.AUTHORITY);
for (final AbstractContract.Table table : AbstractContract.tables(UniversalSearchContract.class)) {
builder.table(table.name(), table);
builder.row(table.name(), table);
}
builder.add("search/search_suggest_query/*", new Matcher.CommonSegment(UniversalSearchContract.SearchView.NAME) {
@Override
public String[] projection(String... projection) {
return new String[] {
as(UniversalSearchContract.Video.ID, BaseColumns._ID),
as(UniversalSearchContract.Video.TITLE, SearchManager.SUGGEST_COLUMN_TEXT_1),
as(UniversalSearchContract.Video.DESCRIPTION, SearchManager.SUGGEST_COLUMN_TEXT_2),
as(UniversalSearchContract.Video.IMAGE, SearchManager.SUGGEST_COLUMN_RESULT_CARD_IMAGE),
as("'video/*'", SearchManager.SUGGEST_COLUMN_CONTENT_TYPE),
as(UniversalSearchContract.Video.YEAR, SearchManager.SUGGEST_COLUMN_PRODUCTION_YEAR),
as(UniversalSearchContract.Video.DURATION, SearchManager.SUGGEST_COLUMN_DURATION),
as(UniversalSearchContract.Video.PRICE_BUY, SearchManager.SUGGEST_COLUMN_PURCHASE_PRICE),
as(UniversalSearchContract.Video.PRICE_RENT, SearchManager.SUGGEST_COLUMN_RENTAL_PRICE),
};
}
@Override
public String selection(String selection) {
return DatabaseUtils.concatenateWhere(selection,
UniversalSearchContract.VideoFts.FTS_TITLE + " MATCH ?");
}
@Override
public String[] selectionArgs(Uri uri, String... selectionArgs) {
return DatabaseUtils.appendSelectionArgs(selectionArgs,
new String[] { uri.getLastPathSegment() });
}
});
this.matcher = builder.build();
}
@Override
public boolean onCreate() {
final Context context = getContext();
database = new SearchOpenHelper(context);
resolver = context.getContentResolver();
return true;
}
@Override
public String getType(Uri uri) {
return matcher.match(uri).type();
}
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
final Matcher.Segment segment = matcher.match(uri);
final Cursor cursor = database.getReadableDatabase().query(
segment.table(),
segment.projection(projection),
segment.selection(selection),
segment.selectionArgs(uri, selectionArgs),
null, null, null);
cursor.setNotificationUri(resolver, uri);
return cursor;
}
@Override
public Uri insert(Uri uri, ContentValues values) {
final Matcher.Segment segment = matcher.match(uri);
final long id = database.getWritableDatabase().insert(
segment.table(),
null,
values);
if ((-1L) != id) {
resolver.notifyChange(uri, null);
}
return ContentUris.withAppendedId(uri, id);
}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
final Matcher.Segment segment = matcher.match(uri);
final int rows = database.getWritableDatabase().delete(
segment.table(),
segment.selection(selection),
segment.selectionArgs(uri, selectionArgs));
if (rows > 0) {
resolver.notifyChange(uri, null);
}
return rows;
}
@Override
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
final Matcher.Segment segment = matcher.match(uri);
final int rows = database.getWritableDatabase().update(
segment.table(),
values,
segment.selection(selection),
segment.selectionArgs(uri, selectionArgs));
if (rows > 0) {
resolver.notifyChange(uri, null);
}
return rows;
}
}
// EOF