package com.stanfy.enroscar.async.content; import android.content.ContentResolver; import android.database.Cursor; import java.util.concurrent.Callable; import java.util.concurrent.Executor; import static com.stanfy.enroscar.async.content.BaseCursorAsyncBuilder.Params; /** * @author Roman Mazur - Stanfy (http://stanfy.com) */ final class ConvertedCursorAsync<D> extends ContentObserverAsync<D, ConvertedCursorAsync.LoadTask<D>> { public ConvertedCursorAsync(final Params params, final CursorConverter<D> converter, final ContentResolver resolver, final Executor executor) { this(new LoadTask<>(params, converter, resolver), executor); } private ConvertedCursorAsync(final LoadTask<D> task, final Executor executor) { super(task, executor); } @Override public ConvertedCursorAsync<D> replicate() { return new ConvertedCursorAsync<>(getTask(), getExecutor()); } @Override protected ContentResolver getResolver() { return getTask().resolver; } @Override protected Params getParams() { return getTask().params; } /** Loads a cursor and creates an object. */ static class LoadTask<D> implements Callable<D> { final Params params; final CursorConverter<D> converter; final ContentResolver resolver; LoadTask(final Params params, final CursorConverter<D> converter, final ContentResolver resolver) { this.params = params; this.converter = converter; this.resolver = resolver; } @Override public D call() { Cursor cursor = new ContentProviderQuery(resolver, params).call(); if (cursor == null) { throw new IllegalStateException("Content resolver didn't respond to URI " + params.uri); } try { return converter.toObject(cursor); } finally { cursor.close(); } } } }