package io.pivotal.arca.dispatcher; import android.annotation.SuppressLint; import android.annotation.TargetApi; import android.content.AsyncTaskLoader; import android.content.Context; import android.os.Build; @TargetApi(Build.VERSION_CODES.HONEYCOMB) abstract class ModernLoader<T> extends AsyncTaskLoader<T> implements ErrorListener { private final ErrorReceiver mReceiver; private final RequestExecutor mExecutor; private final Request<?> mRequest; public ModernLoader(final Context context, final RequestExecutor executor, final Request<?> request) { super(context); mReceiver = new ErrorReceiver(this); mExecutor = executor; mRequest = request; register(request); } private void register(final Request<?> request) { if (request != null) { mReceiver.register(request.getUri()); } } @Override public abstract T loadInBackground(); protected abstract T getErrorResult(final Error error); protected abstract T getResult(); protected abstract void clearResult(); public RequestExecutor getRequestExecutor() { return mExecutor; } public Request<?> getContentRequest() { return mRequest; } @Override protected void onStartLoading() { forceLoad(); } @Override @SuppressLint("NewApi") protected void onStopLoading() { cancelLoad(); } @Override public void onRequestError(final Error error) { final T result = getErrorResult(error); deliverResult(result); } @Override protected void onReset() { super.onReset(); onStopLoading(); clearResult(); } @Override public void reset() { super.reset(); mReceiver.unregister(); } }