package com.manuelmaly.hn.task; import android.app.Activity; import android.util.Log; import com.manuelmaly.hn.App; import com.manuelmaly.hn.Settings; import com.manuelmaly.hn.parser.HNNewsLoginParser; import com.manuelmaly.hn.reuse.CancelableRunnable; import com.manuelmaly.hn.server.GetHNUserTokenHTTPCommand; import com.manuelmaly.hn.server.IAPICommand; import com.manuelmaly.hn.server.IAPICommand.RequestType; import com.manuelmaly.hn.server.StringDownloadCommand; import com.manuelmaly.hn.util.Const; import com.manuelmaly.hn.util.ExceptionUtil; import java.util.HashMap; public class HNLoginTask extends BaseTask<Boolean> { private static final String NEWSLOGIN_URL = "https://news.ycombinator.com/login"; private static final String GET_USERTOKEN_URL = "https://news.ycombinator.com/login"; public static final String BROADCAST_INTENT_ID = "HNLoginTask"; private static HNLoginTask instance; private String mUsername; private String mPassword; private String mFNID; private static HNLoginTask getInstance(int taskCode) { synchronized (HNLoginTask.class) { if (instance == null) instance = new HNLoginTask(taskCode); } return instance; } public HNLoginTask(int taskCode) { super(BROADCAST_INTENT_ID, taskCode); } @Override public CancelableRunnable getTask() { return new HNLoginTaskRunnable(); } public void setData(String username, String password) { mUsername = username; mPassword = password; } public static void start(String username, String password, Activity activity, ITaskFinishedHandler<Boolean> finishedHandler, int taskCode) { HNLoginTask task = getInstance(taskCode); task.setOnFinishedHandler(activity, finishedHandler, Boolean.class); task.setData(username, password); if (task.isRunning()) task.cancel(); task.startInBackground(); } class HNLoginTaskRunnable extends CancelableRunnable { StringDownloadCommand newsLoginDownload; GetHNUserTokenHTTPCommand getUserTokenCommand; @Override public void run() { // mFNID = getFNID(); // if (mFNID == null) // return; String userToken = getUserToken(); if (userToken != null && !userToken.equals("")) { mResult = true; Settings.setUserData(mUsername, userToken, App.getInstance()); } else mResult = false; } private String getFNID() { newsLoginDownload = new StringDownloadCommand(NEWSLOGIN_URL, new HashMap<String, String>(), RequestType.GET, false, null, App.getInstance(), null); newsLoginDownload.run(); if (mCancelled) mErrorCode = IAPICommand.ERROR_CANCELLED_BY_USER; else mErrorCode = newsLoginDownload.getErrorCode(); if (!mCancelled && mErrorCode == IAPICommand.ERROR_NONE) { HNNewsLoginParser loginParser = new HNNewsLoginParser(); try { return loginParser.parse(newsLoginDownload.getResponseContent()); } catch (Exception e) { Log.e("HNFeedTask", "Login Page Parser Error :(", e); ExceptionUtil.sendToGoogleAnalytics(e, Const.GAN_ACTION_PARSING); } } return null; } private String getUserToken() { HashMap<String, String> queryParams = new HashMap<String, String>(); queryParams.put("goto", "news"); HashMap<String, String> body = new HashMap<String, String>(); body.put("goto", "news"); body.put("acct", mUsername); body.put("pw", mPassword); getUserTokenCommand = new GetHNUserTokenHTTPCommand(GET_USERTOKEN_URL, queryParams, RequestType.POST, false, null, App.getInstance(), body); getUserTokenCommand.run(); if (mCancelled) mErrorCode = IAPICommand.ERROR_CANCELLED_BY_USER; else mErrorCode = getUserTokenCommand.getErrorCode(); if (!mCancelled && mErrorCode == IAPICommand.ERROR_NONE) { return getUserTokenCommand.getResponseContent(); } return null; } @Override public void onCancelled() { if (newsLoginDownload != null) newsLoginDownload.cancel(); if (getUserTokenCommand != null) getUserTokenCommand.cancel(); } } }