package droidkit.sqlite;
import android.content.AsyncTaskLoader;
import android.content.Context;
import android.database.ContentObserver;
import android.support.annotation.NonNull;
import droidkit.concurrent.MainQueue;
import droidkit.io.IOUtils;
/**
* @author Daniel Serdyukov
*/
public class SQLiteLoader<D> extends AsyncTaskLoader<SQLiteResult<D>> {
private final ContentObserver mObserver =
new ContentObserver(MainQueue.getHandler()) {
@Override
public boolean deliverSelfNotifications() {
return true;
}
@Override
public void onChange(boolean selfChange) {
onContentChanged();
}
};
private final SQLiteQuery<D> mQuery;
private SQLiteResult<D> mResult;
public SQLiteLoader(@NonNull Context context, @NonNull Class<D> type) {
this(context, SQLite.with(context).where(type));
}
public SQLiteLoader(@NonNull Context context, @NonNull SQLiteQuery<D> query) {
super(context);
mQuery = query;
}
@Override
public SQLiteResult<D> loadInBackground() {
final SQLiteResult<D> result = mQuery.all();
getContext().getContentResolver().registerContentObserver(mQuery.getUri(), true, mObserver);
return result;
}
@Override
public void deliverResult(SQLiteResult<D> result) {
if (isReset()) {
if (result != null) {
IOUtils.closeQuietly(result);
}
return;
}
final SQLiteResult<D> oldResult = mResult;
mResult = result;
if (isStarted()) {
super.deliverResult(result);
}
if (oldResult != null && oldResult != result) {
IOUtils.closeQuietly(result);
}
}
@Override
protected void onStartLoading() {
if (mResult != null) {
deliverResult(mResult);
}
if (takeContentChanged() || mResult == null) {
forceLoad();
}
}
@Override
protected void onStopLoading() {
cancelLoad();
}
@Override
protected void onReset() {
onStopLoading();
getContext().getContentResolver().unregisterContentObserver(mObserver);
if (mResult != null) {
IOUtils.closeQuietly(mResult);
}
mResult = null;
}
}