package com.getbase.android.db.loaders;
import com.google.common.base.Preconditions;
import android.content.Context;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.LoaderManager;
import android.support.v4.app.LoaderManager.LoaderCallbacks;
import android.support.v4.content.Loader;
public abstract class LoaderHelper<T> {
final int mId;
public LoaderHelper(int id) {
mId = id;
}
public final void destroyLoader(Fragment fragment) {
fragment.getLoaderManager().destroyLoader(mId);
}
public final void destroyLoader(FragmentActivity activity) {
activity.getSupportLoaderManager().destroyLoader(mId);
}
public final Loader<T> restartLoader(Fragment fragment, Bundle args, LoaderDataCallbacks<T> callbacks) {
return restartLoader(fragment.getLoaderManager(), fragment.getActivity(), args, callbacks);
}
public final Loader<T> restartLoader(FragmentActivity activity, Bundle args, LoaderDataCallbacks<T> callbacks) {
return restartLoader(activity.getSupportLoaderManager(), activity, args, callbacks);
}
private Loader<T> restartLoader(LoaderManager loaderManager, Context context, Bundle args, LoaderDataCallbacks<T> callbacks) {
return loaderManager.restartLoader(mId, args, wrapCallbacks(context.getApplicationContext(), callbacks));
}
public final Loader<T> initLoader(Fragment fragment, Bundle args, LoaderDataCallbacks<T> callbacks) {
return initLoader(fragment.getLoaderManager(), fragment.getActivity(), args, callbacks);
}
public final Loader<T> initLoader(FragmentActivity activity, Bundle args, LoaderDataCallbacks<T> callbacks) {
return initLoader(activity.getSupportLoaderManager(), activity, args, callbacks);
}
private Loader<T> initLoader(LoaderManager loaderManager, Context context, Bundle args, LoaderDataCallbacks<T> callbacks) {
return loaderManager.initLoader(mId, args, wrapCallbacks(context.getApplicationContext(), callbacks));
}
private LoaderCallbacks<T> wrapCallbacks(final Context applicationContext, final LoaderDataCallbacks<T> callbacks) {
return new LoaderCallbacks<T>() {
@Override
public Loader<T> onCreateLoader(int id, Bundle args) {
Preconditions.checkArgument(id == mId);
return LoaderHelper.this.onCreateLoader(applicationContext, args);
}
@Override
public void onLoadFinished(Loader<T> loader, T data) {
callbacks.onLoadFinished(loader, data);
}
@Override
public void onLoaderReset(Loader<T> loader) {
callbacks.onLoaderReset(loader);
}
};
}
protected abstract Loader<T> onCreateLoader(Context context, Bundle args);
public interface LoaderDataCallbacks<T> {
public void onLoadFinished(Loader<T> loader, T data);
public void onLoaderReset(Loader<T> loader);
}
}