Added search methods to DBTasks

This commit is contained in:
daniel oeh 2013-05-26 03:53:10 +02:00
parent c6545a5643
commit b83656049d
1 changed files with 154 additions and 0 deletions

View File

@ -11,6 +11,8 @@ import java.util.concurrent.locks.ReentrantLock;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.os.Handler;
import android.util.Log;
import de.danoeh.antennapod.AppConfig;
import de.danoeh.antennapod.feed.EventDistributor;
@ -469,7 +471,159 @@ public final class DBTasks {
}.start();
return savedFeed;
}
}
/**
* Searches the descriptions of FeedItems of a specific feed for a given
* string.
*
* @param feed
* The feed whose items should be searched.
* @param query
* The search string
* @param callback
* A callback which will be used to return the search result
* */
public void searchFeedItemDescription(final Context context,
final Feed feed, final String query, QueryTaskCallback callback) {
new Thread((new QueryTask(context, new Handler(), callback) {
@Override
public void execute(PodDBAdapter adapter) {
Cursor searchResult = adapter.searchItemDescriptions(feed,
query);
setResult(searchResult);
}
})).start();
}
/**
* Searches the 'contentEncoded' field of FeedItems of a specific feed for a
* given string.
*
* @param feed
* The feed whose items should be searched.
* @param query
* The search string
* @param callback
* A callback which will be used to return the search result
* */
public void searchFeedItemContentEncoded(final Context context,
final Feed feed, final String query, QueryTaskCallback callback) {
new Thread((new QueryTask(context, new Handler(), callback) {
@Override
public void execute(PodDBAdapter adapter) {
Cursor searchResult = adapter.searchItemContentEncoded(feed,
query);
setResult(searchResult);
}
})).start();
}
/** Is called by a FeedManagerTask after completion. */
public interface TaskCallback<V> {
void onCompletion(V result);
}
/** Is called by a FeedManager.QueryTask after completion. */
public interface QueryTaskCallback {
void handleResult(Cursor result);
void onCompletion();
}
/** A runnable that can post a callback to a handler after completion. */
abstract class Task<V> implements Runnable {
private Handler handler;
private TaskCallback<V> callback;
private V result;
/**
* Standard contructor. No callbacks are going to be posted to a
* handler.
*/
public Task() {
super();
}
/**
* The Task will post a Runnable to 'handler' that will execute the
* 'callback' after completion.
*/
public Task(Handler handler, TaskCallback<V> callback) {
super();
this.handler = handler;
this.callback = callback;
}
@Override
public final void run() {
execute();
if (handler != null && callback != null) {
handler.post(new Runnable() {
@Override
public void run() {
callback.onCompletion(result);
}
});
}
}
/** This method will be executed in the same thread as the run() method. */
public abstract void execute();
public void setResult(V result) {
this.result = result;
}
}
/**
* A runnable which should be used for database queries. The onCompletion
* method is executed on the database executor to handle Cursors correctly.
* This class automatically creates a PodDBAdapter object and closes it when
* it is no longer in use.
*/
abstract class QueryTask implements Runnable {
private QueryTaskCallback callback;
private Cursor result;
private Context context;
private Handler handler;
public QueryTask(Context context, Handler handler,
QueryTaskCallback callback) {
this.callback = callback;
this.context = context;
this.handler = handler;
}
@Override
public final void run() {
PodDBAdapter adapter = new PodDBAdapter(context);
adapter.open();
execute(adapter);
callback.handleResult(result);
if (result != null && !result.isClosed()) {
result.close();
}
adapter.close();
if (handler != null && callback != null) {
handler.post(new Runnable() {
@Override
public void run() {
callback.onCompletion();
}
});
}
}
public abstract void execute(PodDBAdapter adapter);
protected void setResult(Cursor c) {
result = c;
}
}
}