package org.openintents.filemanager.search;
import java.util.ArrayList;
import android.app.SearchManager;
import android.content.ContentProvider;
import android.content.ContentUris;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.MatrixCursor;
import android.net.Uri;
import android.os.Environment;
import android.provider.BaseColumns;
/**
* Not that good, but it's a working implementation at least. We REALLY need asynchronous suggestion refreshing.
* @author George Venios
*
*/
public class SearchSuggestionsProvider extends ContentProvider {
public static final String SEARCH_SUGGEST_MIMETYPE = "vnd.android.cursor.item/vnd.openintents.search_suggestion";
public static final String PROVIDER_NAME = "org.openintents.filemanager.search.suggest";
public static final Uri CONTENT_URI = Uri.parse("content://" + PROVIDER_NAME);
private static final long MAX_NANOS = 2000000;
private static final int MAX_SUGGESTIONS = 7;
private ArrayList<ContentValues> mSuggestions = new ArrayList<>();
private SearchCore searcher;
@Override
/**
* Always clears all suggestions. Parameters other than uri are ignored.
*/
public int delete(Uri uri, String selection, String[] selectionArgs) {
int count = mSuggestions.size();
mSuggestions.clear();
getContext().getContentResolver().notifyChange(uri, null);
return count;
}
@Override
public String getType(Uri uri) {
return SEARCH_SUGGEST_MIMETYPE;
}
@Override
public Uri insert(Uri uri, ContentValues values) {
long id = mSuggestions.size()+1;
values.put(BaseColumns._ID, id);
mSuggestions.add(values);
Uri _uri = ContentUris.withAppendedId(CONTENT_URI, id);
getContext().getContentResolver().notifyChange(_uri, null);
return _uri;
}
@Override
public boolean onCreate() {
searcher = new SearchCore(getContext());
searcher.setMaxResults(MAX_SUGGESTIONS);
searcher.setURI(CONTENT_URI);
return true;
}
@Override
/**
* NOT a cheap call. Actual search happens here.
*/
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
searcher.setQuery(uri.getLastPathSegment().toLowerCase());
searcher.dropPreviousResults();
searcher.startClock(MAX_NANOS);
searcher.search(Environment.getExternalStorageDirectory());
MatrixCursor cursor = new MatrixCursor(new String[] {
SearchManager.SUGGEST_COLUMN_ICON_1,
SearchManager.SUGGEST_COLUMN_TEXT_1,
SearchManager.SUGGEST_COLUMN_TEXT_2,
SearchManager.SUGGEST_COLUMN_INTENT_DATA,
BaseColumns._ID});
for (ContentValues val : mSuggestions)
cursor.newRow().add(val.get(SearchManager.SUGGEST_COLUMN_ICON_1))
.add(val.get(SearchManager.SUGGEST_COLUMN_TEXT_1))
.add(val.get(SearchManager.SUGGEST_COLUMN_TEXT_2))
.add(val.get(SearchManager.SUGGEST_COLUMN_INTENT_DATA))
.add(val.get(BaseColumns._ID));
return cursor;
}
@Override
/**
* We don't care about updating. Unimplemented.
*/
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
return 0;
}
}