package com.airlocksoftware.hackernews.loader;
import java.io.IOException;
import org.apache.commons.lang3.StringUtils;
import org.jsoup.Connection.Method;
import org.jsoup.nodes.Element;
import android.content.Context;
import android.support.v4.content.AsyncTaskLoader;
import com.airlocksoftware.hackernews.data.ConnectionManager;
import com.airlocksoftware.hackernews.data.UserPrefs;
import com.airlocksoftware.hackernews.model.Result;
/** Handles sending replies to Comments and Stories. **/
public class ReplyLoader extends AsyncTaskLoader<Result> {
String mText;
long mId = -1;
private static final String REPLY_EXTENSION = "/r";
/** no data passed, not ready to send **/
public ReplyLoader(Context context) {
super(context);
}
public ReplyLoader(Context context, long id, String text) {
super(context);
mId = id;
mText = text;
}
@Override
public Result loadInBackground() {
// no data passed, not ready to send
if (mId == -1 || StringUtils.isBlank(mText)) return Result.EMPTY;
Result result = Result.FAILURE; // default
try {
UserPrefs data = new UserPrefs(getContext());
Element replyInput = getReplyInput(data);
String replyFnid = replyInput.attr("value");
String response = sendReply(data, replyFnid);
if (StringUtils.isNotBlank(response)) result = Result.SUCCESS;
} catch (Exception e) {
// any exception here probably means we have NO_CONNECTION or there's an error with the website.
e.printStackTrace();
}
return result;
}
/** POSTS the reply**/
private String sendReply(UserPrefs data, String replyFnid) throws IOException {
return ConnectionManager.authConnect(REPLY_EXTENSION, data.getUserCookie())
.data("fnid", replyFnid)
.data("text", mText)
.method(Method.POST)
.execute()
.parse()
.text();
}
private Element getReplyInput(UserPrefs data) throws IOException {
return ConnectionManager.authConnect(ConnectionManager.itemIdToUrlExtension(mId), data.getUserCookie())
.get()
.select("input[name=fnid]")
.first();
}
/**
* Handles a request to start the Loader.
*/
@Override
protected void onStartLoading() {
forceLoad();
}
}