package com.andrewshu.android.reddit.reddits;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.apache.http.HttpEntity;
import org.apache.http.HttpException;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.protocol.HTTP;
import android.content.Context;
import android.os.AsyncTask;
import android.util.Log;
import android.widget.Toast;
import com.andrewshu.android.reddit.common.CacheInfo;
import com.andrewshu.android.reddit.common.Common;
import com.andrewshu.android.reddit.common.Constants;
import com.andrewshu.android.reddit.common.RedditIsFunHttpClientFactory;
import com.andrewshu.android.reddit.common.util.Util;
import com.andrewshu.android.reddit.settings.RedditSettings;
public class SubscribeTask extends AsyncTask<Void, Void, Boolean> {
private static final String TAG = "Subscribe To Subreddit";
private String mSubreddit;
private String mUserError = "Error Subscribing.";
private String mUrl;
private RedditSettings mSettings;
private Context mContext;
private final HttpClient mClient = RedditIsFunHttpClientFactory.getGzipHttpClient();
public SubscribeTask(String mSubreddit, Context context, RedditSettings mSettings) {
// TODO Auto-generated constructor stub
this.mUrl = Constants.REDDIT_BASE_URL + "/api/subscribe";
this.mContext = context;
this.mSettings = mSettings;
this.mSubreddit = mSubreddit;
}
@Override
public void onPreExecute() {
if (!mSettings.isLoggedIn()) {
Common.showErrorToast("You must be logged in to subscribe.", Toast.LENGTH_LONG, mContext);
cancel(true);
return;
}
Toast.makeText(mContext, "Subscribed!", Toast.LENGTH_SHORT).show();
}
@Override
protected Boolean doInBackground(Void... params) {
String status = "";
HttpEntity entity = null;
if (!mSettings.isLoggedIn()) {
mUserError = "You must be logged in to subscribe.";
return false;
}
updateModHash();
// Construct data
List<NameValuePair> nvps = new ArrayList<NameValuePair>();
nvps.add(new BasicNameValuePair("action", "sub"));
nvps.add(new BasicNameValuePair("sr", Common.getSubredditId(mSubreddit)));
nvps.add(new BasicNameValuePair("r", mSubreddit));
nvps.add(new BasicNameValuePair("uh", mSettings.getModhash().toString()));
try {
HttpPost request = new HttpPost(mUrl);
request.setEntity(new UrlEncodedFormEntity(nvps, HTTP.UTF_8));
HttpResponse response = mClient.execute(request);
status = response.getStatusLine().toString();
if (!status.contains("OK")) {
mUserError = mUrl;
throw new HttpException(mUrl);
}
ArrayList<String> mSubredditsList = CacheInfo.getCachedSubredditList(mContext);
mSubredditsList.add(mSubreddit.toLowerCase());
Collections.sort(mSubredditsList);
CacheInfo.setCachedSubredditList(mContext, mSubredditsList);
entity = response.getEntity();
BufferedReader in = new BufferedReader(new InputStreamReader(entity.getContent()));
String line = in.readLine();
in.close();
mUserError = Util.getResponseErrorMessage(line);
entity.consumeContent();
return true;
} catch (Exception e) {
if (entity != null) {
try {
entity.consumeContent();
} catch (Exception e2) {
if (Constants.LOGGING) Log.e(TAG, "entity.consumeContent()", e2);
}
}
if (Constants.LOGGING) Log.e(TAG, "SubscribeTask", e);
}
return false;
}
private boolean updateModHash(){
// Update the modhash if necessary
if (mSettings.getModhash() == null) {
String modhash = Common.doUpdateModhash(mClient);
if (modhash == null) {
// doUpdateModhash should have given an error about credentials
Common.doLogout(mSettings, mClient, mContext);
if (Constants.LOGGING) Log.e(TAG, "updating save status failed because doUpdateModhash() failed");
return false;
}
mSettings.setModhash(modhash);
}
return true;
}
}