package com.airlocksoftware.hackernews.loader; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.support.v4.content.AsyncTaskLoader; import com.airlocksoftware.hackernews.cache.DbHelperSingleton; import com.airlocksoftware.hackernews.model.Request; import com.airlocksoftware.hackernews.model.Result; import com.airlocksoftware.hackernews.model.StoryTimestamp; import com.airlocksoftware.hackernews.parser.CommentsParser; import com.airlocksoftware.hackernews.parser.CommentsParser.ThreadsResponse; public class ThreadsLoader extends AsyncTaskLoader<ThreadsResponse> { String mUsername; Request mRequest; public ThreadsLoader(Context context, Request request, String username) { super(context); mUsername = username; mRequest = request; } @Override public ThreadsResponse loadInBackground() { SQLiteDatabase db = DbHelperSingleton.getInstance(getContext()) .getWritableDatabase(); ThreadsResponse response = null; // check for more StoryTimestamp storyTimestamp = StoryTimestamp.cachedByPrimaryId(db, CommentsParser.THREAD_TIMESTAMP_ID); if (mRequest == Request.MORE && storyTimestamp != null && storyTimestamp.secondaryId.equals(mUsername)) { response = CommentsParser.parseThreadsPage(getContext(), mUsername, storyTimestamp.fnid); } // either this is a new request or we have no moreFnid if (response == null || response.result == Result.FAILURE || response.result == Result.FNID_EXPIRED) { response = CommentsParser.parseThreadsPage(getContext(), mUsername); } // delete the old one if it exists if (storyTimestamp != null) storyTimestamp.delete(db); // need to cache new moreFnid if (response.timestamp != null) { response.timestamp.create(db); } return response; } /** * Handles a request to start the Loader. */ @Override protected void onStartLoading() { forceLoad(); } }