package org.ohmage.test.helper;
import android.content.ContentValues;
import android.database.Cursor;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.LoaderManager;
import android.support.v4.app.LoaderManager.LoaderCallbacks;
import android.support.v4.content.AsyncTaskLoader;
import android.support.v4.content.CursorLoader;
import android.test.InstrumentationTestCase;
public class LoaderHelper {
private final FragmentActivity mContext;
private final LoaderCallbacks<Cursor> mLoader;
private final InstrumentationTestCase mTester;
private final CursorLoader mCursorLoader;
public LoaderHelper(FragmentActivity context, LoaderManager.LoaderCallbacks<Cursor> loaderCallback, InstrumentationTestCase tester) {
mContext = context;
mLoader = loaderCallback;
mTester = tester;
mCursorLoader = (CursorLoader) mLoader.onCreateLoader(0, null);
}
public LoaderHelper(FragmentActivity context, InstrumentationTestCase tester) {
this(context, (LoaderCallbacks<Cursor>) context, tester);
}
public void setEntityContentValues(ContentValues values) {
setEntityContentValues(values, false);
}
/**
* Sets the contentvalues for an entity. Won't update the db if the values don't cause a change.
* @param values
* @param force
*/
public void setEntityContentValues(ContentValues values, boolean force) {
if(!force) {
Cursor entity = getEntity();
if(entity.moveToFirst()) {
for(int i=0;i<entity.getColumnCount();i++) {
String key = entity.getColumnName(i);
if(values.containsKey(key) && !values.getAsString(key).equals(entity.getString(entity.getColumnIndex(key)))) {
force = true;
break;
}
}
}
}
if(force) {
mContext.getContentResolver().update(mCursorLoader.getUri(), values, mCursorLoader.getSelection(), mCursorLoader.getSelectionArgs());
// Wait for the activity to be idle so we know its not processing other loader requests.
mTester.getInstrumentation().waitForIdleSync();
// Then wait for the loader
waitForLoader();
}
}
public Cursor getEntity() {
return mContext.getContentResolver().query(mCursorLoader.getUri(), null, mCursorLoader.getSelection(), mCursorLoader.getSelectionArgs(), mCursorLoader.getSortOrder());
}
public void restartLoader() {
mContext.getSupportLoaderManager().restartLoader(0, null, mLoader);
}
public AsyncTaskLoader<Object> getDataLoader() {
return (AsyncTaskLoader<Object>) mContext.getSupportLoaderManager().getLoader(0);
}
public void waitForLoader() {
startLoading();
getDataLoader().waitForLoader();
}
public void startLoading() {
getDataLoader().startLoading();
}
public void stopLoading() {
getDataLoader().stopLoading();
}
}