package me.devsaki.hentoid.database; import android.content.Context; import android.os.AsyncTask; import java.util.ArrayList; import java.util.List; import me.devsaki.hentoid.database.domains.Content; import me.devsaki.hentoid.util.LogHelper; /** * Created by avluis on 04/12/2016. * Grabs content from db with provided query */ public class SearchContent { private static final String TAG = LogHelper.makeLogTag(SearchContent.class); private final HentoidDB db; private final String mQuery; private final int mPage; private final int mQty; private final boolean mOrder; private volatile State mCurrentState = State.NON_INIT; private List<Content> contentList = new ArrayList<>(); public SearchContent(final Context context, String query, int page, int qty, boolean order) { db = HentoidDB.getInstance(context); mQuery = query; mPage = page; mQty = qty; mOrder = order; } public List<Content> getContent() { return contentList; } public void retrieveResults(final ContentListener listener) { LogHelper.d(TAG, "Retrieving results."); if (mCurrentState == State.READY) { listener.onContentReady(true); listener.onContentFailed(false); return; } else if (mCurrentState == State.FAILED) { listener.onContentReady(false); listener.onContentFailed(true); return; } mCurrentState = State.INIT; new AsyncTask<Void, Void, State>() { @Override protected State doInBackground(Void... params) { retrieveContent(); return mCurrentState; } @Override protected void onPostExecute(State current) { if (listener != null) { listener.onContentReady(current == State.READY); listener.onContentFailed(current == State.FAILED); } } }.execute(); } private synchronized void retrieveContent() { LogHelper.d(TAG, "Retrieving content."); try { if (mCurrentState == State.INIT) { mCurrentState = State.DONE; contentList = db.selectContentByQuery(mQuery, mPage, mQty, mOrder); mCurrentState = State.READY; } } catch (Exception e) { LogHelper.e(TAG, e, "Could not load data from db"); } finally { if (mCurrentState != State.READY) { // Something bad happened! LogHelper.w(TAG, "Failed..."); mCurrentState = State.FAILED; } } } private enum State { NON_INIT, INIT, DONE, READY, FAILED } public interface ContentListener { void onContentReady(boolean success); void onContentFailed(boolean failure); } }