package be.digitalia.fosdem.loaders;
import be.digitalia.fosdem.db.DatabaseManager;
import be.digitalia.fosdem.model.Event;
import be.digitalia.fosdem.utils.ArrayUtils;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.support.v4.content.AsyncTaskLoader;
import android.support.v4.content.LocalBroadcastManager;
/**
* This loader retrieves the bookmark status of an event from the database, then updates it in real time by listening to broadcasts.
*
* @author Christophe Beyls
*
*/
public class BookmarkStatusLoader extends AsyncTaskLoader<Boolean> {
final Event event;
private Boolean isBookmarked;
private final BroadcastReceiver addBookmarkReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (event.getId() == intent.getLongExtra(DatabaseManager.EXTRA_EVENT_ID, -1L)) {
updateBookmark(true);
}
}
};
private final BroadcastReceiver removeBookmarksReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
long[] eventIds = intent.getLongArrayExtra(DatabaseManager.EXTRA_EVENT_IDS);
if (ArrayUtils.indexOf(eventIds, event.getId()) != -1) {
updateBookmark(false);
}
}
};
public BookmarkStatusLoader(Context context, Event event) {
super(context);
this.event = event;
LocalBroadcastManager lbm = LocalBroadcastManager.getInstance(getContext());
lbm.registerReceiver(addBookmarkReceiver, new IntentFilter(DatabaseManager.ACTION_ADD_BOOKMARK));
lbm.registerReceiver(removeBookmarksReceiver, new IntentFilter(DatabaseManager.ACTION_REMOVE_BOOKMARKS));
}
void updateBookmark(Boolean result) {
if (isStarted()) {
cancelLoad();
}
deliverResult(result);
}
@Override
protected void onStartLoading() {
if (isBookmarked != null) {
// If we currently have a result available, deliver it
// immediately.
super.deliverResult(isBookmarked);
} else {
forceLoad();
}
}
@Override
protected void onStopLoading() {
// Attempt to cancel the current load task if possible.
cancelLoad();
}
@Override
protected void onReset() {
super.onReset();
onStopLoading();
isBookmarked = null;
LocalBroadcastManager lbm = LocalBroadcastManager.getInstance(getContext());
lbm.unregisterReceiver(addBookmarkReceiver);
lbm.unregisterReceiver(removeBookmarksReceiver);
}
@Override
public void deliverResult(Boolean data) {
isBookmarked = data;
if (isStarted()) {
// If the Loader is currently started, we can immediately
// deliver its results.
super.deliverResult(data);
}
}
@Override
public Boolean loadInBackground() {
return DatabaseManager.getInstance().isBookmarked(event);
}
}