You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							586 lines
						
					
					
						
							21 KiB
						
					
					
				
			
		
		
	
	
							586 lines
						
					
					
						
							21 KiB
						
					
					
				| /*
 | |
|  * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
 | |
|  *
 | |
|  * Licensed under the Apache License, Version 2.0 (the "License");
 | |
|  * you may not use this file except in compliance with the License.
 | |
|  * You may obtain a copy of the License at
 | |
|  *
 | |
|  *        http://www.apache.org/licenses/LICENSE-2.0
 | |
|  *
 | |
|  * Unless required by applicable law or agreed to in writing, software
 | |
|  * distributed under the License is distributed on an "AS IS" BASIS,
 | |
|  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | |
|  * See the License for the specific language governing permissions and
 | |
|  * limitations under the License.
 | |
|  */
 | |
| 
 | |
| package net.micode.notes.gtask.remote;
 | |
| 
 | |
| import android.accounts.Account;
 | |
| import android.accounts.AccountManager;
 | |
| import android.accounts.AccountManagerFuture;
 | |
| import android.app.Activity;
 | |
| import android.os.Bundle;
 | |
| import android.text.TextUtils;
 | |
| import android.util.Log;
 | |
| 
 | |
| import net.micode.notes.gtask.data.Node;
 | |
| import net.micode.notes.gtask.data.Task;
 | |
| import net.micode.notes.gtask.data.TaskList;
 | |
| import net.micode.notes.gtask.exception.ActionFailureException;
 | |
| import net.micode.notes.gtask.exception.NetworkFailureException;
 | |
| import net.micode.notes.tool.GTaskStringUtils;
 | |
| import net.micode.notes.ui.NotesPreferenceActivity;
 | |
| 
 | |
| import org.apache.http.HttpEntity;
 | |
| import org.apache.http.HttpResponse;
 | |
| import org.apache.http.client.ClientProtocolException;
 | |
| import org.apache.http.client.entity.UrlEncodedFormEntity;
 | |
| import org.apache.http.client.methods.HttpGet;
 | |
| import org.apache.http.client.methods.HttpPost;
 | |
| import org.apache.http.cookie.Cookie;
 | |
| import org.apache.http.impl.client.BasicCookieStore;
 | |
| import org.apache.http.impl.client.DefaultHttpClient;
 | |
| import org.apache.http.message.BasicNameValuePair;
 | |
| import org.apache.http.params.BasicHttpParams;
 | |
| import org.apache.http.params.HttpConnectionParams;
 | |
| import org.apache.http.params.HttpParams;
 | |
| import org.apache.http.params.HttpProtocolParams;
 | |
| import org.json.JSONArray;
 | |
| import org.json.JSONException;
 | |
| import org.json.JSONObject;
 | |
| 
 | |
| import java.io.BufferedReader;
 | |
| import java.io.IOException;
 | |
| import java.io.InputStream;
 | |
| import java.io.InputStreamReader;
 | |
| import java.util.LinkedList;
 | |
| import java.util.List;
 | |
| import java.util.zip.GZIPInputStream;
 | |
| import java.util.zip.Inflater;
 | |
| import java.util.zip.InflaterInputStream;
 | |
| 
 | |
| 
 | |
| public class GTaskClient {
 | |
|     private static final String TAG = GTaskClient.class.getSimpleName();
 | |
| 
 | |
|     private static final String GTASK_URL = "https://mail.google.com/tasks/";
 | |
| 
 | |
|     private static final String GTASK_GET_URL = "https://mail.google.com/tasks/ig";
 | |
| 
 | |
|     private static final String GTASK_POST_URL = "https://mail.google.com/tasks/r/ig";
 | |
| 
 | |
|     private static GTaskClient mInstance = null;
 | |
| 
 | |
|     private DefaultHttpClient mHttpClient;
 | |
| 
 | |
|     private String mGetUrl;
 | |
| 
 | |
|     private String mPostUrl;
 | |
| 
 | |
|     private long mClientVersion;
 | |
| 
 | |
|     private boolean mLoggedin;
 | |
| 
 | |
|     private long mLastLoginTime;
 | |
| 
 | |
|     private int mActionId;
 | |
| 
 | |
|     private Account mAccount;
 | |
| 
 | |
|     private JSONArray mUpdateArray;
 | |
| 
 | |
|     private GTaskClient() {
 | |
|         mHttpClient = null;
 | |
|         mGetUrl = GTASK_GET_URL;
 | |
|         mPostUrl = GTASK_POST_URL;
 | |
|         mClientVersion = -1;
 | |
|         mLoggedin = false;
 | |
|         mLastLoginTime = 0;
 | |
|         mActionId = 1;
 | |
|         mAccount = null;
 | |
|         mUpdateArray = null;
 | |
|     }
 | |
| 
 | |
|     public static synchronized GTaskClient getInstance() {
 | |
|         if (mInstance == null) {
 | |
|             mInstance = new GTaskClient();
 | |
|         }
 | |
|         return mInstance;
 | |
|     }
 | |
| 
 | |
|     public boolean login(Activity activity) {
 | |
|         // we suppose that the cookie would expire after 5 minutes
 | |
|         // then we need to re-login
 | |
|         final long interval = 1000 * 60 * 5;
 | |
|         if (mLastLoginTime + interval < System.currentTimeMillis()) {
 | |
|             mLoggedin = false;
 | |
|         }
 | |
| 
 | |
|         // need to re-login after account switch
 | |
|         if (mLoggedin
 | |
|                 && !TextUtils.equals(getSyncAccount().name, NotesPreferenceActivity
 | |
|                         .getSyncAccountName(activity))) {
 | |
|             mLoggedin = false;
 | |
|         }
 | |
| 
 | |
|         if (mLoggedin) {
 | |
|             Log.d(TAG, "already logged in");
 | |
|             return true;
 | |
|         }
 | |
| 
 | |
|         mLastLoginTime = System.currentTimeMillis();
 | |
|         String authToken = loginGoogleAccount(activity, false);
 | |
|         if (authToken == null) {
 | |
|             Log.e(TAG, "login google account failed");
 | |
|             return false;
 | |
|         }
 | |
| 
 | |
|         // login with custom domain if necessary
 | |
|         if (!(mAccount.name.toLowerCase().endsWith("gmail.com") || mAccount.name.toLowerCase()
 | |
|                 .endsWith("googlemail.com"))) {
 | |
|             StringBuilder url = new StringBuilder(GTASK_URL).append("a/");
 | |
|             int index = mAccount.name.indexOf('@') + 1;
 | |
|             String suffix = mAccount.name.substring(index);
 | |
|             url.append(suffix + "/");
 | |
|             mGetUrl = url.toString() + "ig";
 | |
|             mPostUrl = url.toString() + "r/ig";
 | |
| 
 | |
|             if (tryToLoginGtask(activity, authToken)) {
 | |
|                 mLoggedin = true;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         // try to login with google official url
 | |
|         if (!mLoggedin) {
 | |
|             mGetUrl = GTASK_GET_URL;
 | |
|             mPostUrl = GTASK_POST_URL;
 | |
|             if (!tryToLoginGtask(activity, authToken)) {
 | |
|                 return false;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         mLoggedin = true;
 | |
|         return true;
 | |
|     }
 | |
| 
 | |
|     private String loginGoogleAccount(Activity activity, boolean invalidateToken) {
 | |
|         String authToken;
 | |
|         AccountManager accountManager = AccountManager.get(activity);
 | |
|         Account[] accounts = accountManager.getAccountsByType("com.google");
 | |
| 
 | |
|         if (accounts.length == 0) {
 | |
|             Log.e(TAG, "there is no available google account");
 | |
|             return null;
 | |
|         }
 | |
| 
 | |
|         String accountName = NotesPreferenceActivity.getSyncAccountName(activity);
 | |
|         Account account = null;
 | |
|         for (Account a : accounts) {
 | |
|             if (a.name.equals(accountName)) {
 | |
|                 account = a;
 | |
|                 break;
 | |
|             }
 | |
|         }
 | |
|         if (account != null) {
 | |
|             mAccount = account;
 | |
|         } else {
 | |
|             Log.e(TAG, "unable to get an account with the same name in the settings");
 | |
|             return null;
 | |
|         }
 | |
| 
 | |
|         // get the token now
 | |
|         AccountManagerFuture<Bundle> accountManagerFuture = accountManager.getAuthToken(account,
 | |
|                 "goanna_mobile", null, activity, null, null);
 | |
|         try {
 | |
|             Bundle authTokenBundle = accountManagerFuture.getResult();
 | |
|             authToken = authTokenBundle.getString(AccountManager.KEY_AUTHTOKEN);
 | |
|             if (invalidateToken) {
 | |
|                 accountManager.invalidateAuthToken("com.google", authToken);
 | |
|                 loginGoogleAccount(activity, false);
 | |
|             }
 | |
|         } catch (Exception e) {
 | |
|             Log.e(TAG, "get auth token failed");
 | |
|             authToken = null;
 | |
|         }
 | |
| 
 | |
|         return authToken;
 | |
|     }
 | |
| 
 | |
|     private boolean tryToLoginGtask(Activity activity, String authToken) {
 | |
|         if (!loginGtask(authToken)) {
 | |
|             // maybe the auth token is out of date, now let's invalidate the
 | |
|             // token and try again
 | |
|             authToken = loginGoogleAccount(activity, true);
 | |
|             if (authToken == null) {
 | |
|                 Log.e(TAG, "login google account failed");
 | |
|                 return false;
 | |
|             }
 | |
| 
 | |
|             if (!loginGtask(authToken)) {
 | |
|                 Log.e(TAG, "login gtask failed");
 | |
|                 return false;
 | |
|             }
 | |
|         }
 | |
|         return true;
 | |
|     }
 | |
| 
 | |
|     private boolean loginGtask(String authToken) {
 | |
|         int timeoutConnection = 10000;
 | |
|         int timeoutSocket = 15000;
 | |
|         HttpParams httpParameters = new BasicHttpParams();
 | |
|         HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection);
 | |
|         HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket);
 | |
|         mHttpClient = new DefaultHttpClient(httpParameters);
 | |
|         BasicCookieStore localBasicCookieStore = new BasicCookieStore();
 | |
|         mHttpClient.setCookieStore(localBasicCookieStore);
 | |
|         HttpProtocolParams.setUseExpectContinue(mHttpClient.getParams(), false);
 | |
| 
 | |
|         // login gtask
 | |
|         try {
 | |
|             String loginUrl = mGetUrl + "?auth=" + authToken;
 | |
|             HttpGet httpGet = new HttpGet(loginUrl);
 | |
|             HttpResponse response = null;
 | |
|             response = mHttpClient.execute(httpGet);
 | |
| 
 | |
|             // get the cookie now
 | |
|             List<Cookie> cookies = mHttpClient.getCookieStore().getCookies();
 | |
|             boolean hasAuthCookie = false;
 | |
|             for (Cookie cookie : cookies) {
 | |
|                 if (cookie.getName().contains("GTL")) {
 | |
|                     hasAuthCookie = true;
 | |
|                 }
 | |
|             }
 | |
|             if (!hasAuthCookie) {
 | |
|                 Log.w(TAG, "it seems that there is no auth cookie");
 | |
|             }
 | |
| 
 | |
|             // get the client version
 | |
|             String resString = getResponseContent(response.getEntity());
 | |
|             String jsBegin = "_setup(";
 | |
|             String jsEnd = ")}</script>";
 | |
|             int begin = resString.indexOf(jsBegin);
 | |
|             int end = resString.lastIndexOf(jsEnd);
 | |
|             String jsString = null;
 | |
|             if (begin != -1 && end != -1 && begin < end) {
 | |
|                 jsString = resString.substring(begin + jsBegin.length(), end);
 | |
|             }
 | |
|             JSONObject js = new JSONObject(jsString);
 | |
|             mClientVersion = js.getLong("v");
 | |
|         } catch (JSONException e) {
 | |
|             Log.e(TAG, e.toString());
 | |
|             e.printStackTrace();
 | |
|             return false;
 | |
|         } catch (Exception e) {
 | |
|             // simply catch all exceptions
 | |
|             Log.e(TAG, "httpget gtask_url failed");
 | |
|             return false;
 | |
|         }
 | |
| 
 | |
|         return true;
 | |
|     }
 | |
| 
 | |
|     private int getActionId() {
 | |
|         return mActionId++;
 | |
|     }
 | |
| 
 | |
|     private HttpPost createHttpPost() {
 | |
|         HttpPost httpPost = new HttpPost(mPostUrl);
 | |
|         httpPost.setHeader("Content-Type", "application/x-www-form-urlencoded;charset=utf-8");
 | |
|         httpPost.setHeader("AT", "1");
 | |
|         return httpPost;
 | |
|     }
 | |
| 
 | |
|     private String getResponseContent(HttpEntity entity) throws IOException {
 | |
|         String contentEncoding = null;
 | |
|         if (entity.getContentEncoding() != null) {
 | |
|             contentEncoding = entity.getContentEncoding().getValue();
 | |
|             Log.d(TAG, "encoding: " + contentEncoding);
 | |
|         }
 | |
| 
 | |
|         InputStream input = entity.getContent();
 | |
|         if (contentEncoding != null && contentEncoding.equalsIgnoreCase("gzip")) {
 | |
|             input = new GZIPInputStream(entity.getContent());
 | |
|         } else if (contentEncoding != null && contentEncoding.equalsIgnoreCase("deflate")) {
 | |
|             Inflater inflater = new Inflater(true);
 | |
|             input = new InflaterInputStream(entity.getContent(), inflater);
 | |
|         }
 | |
| 
 | |
|         try {
 | |
|             InputStreamReader isr = new InputStreamReader(input);
 | |
|             BufferedReader br = new BufferedReader(isr);
 | |
|             StringBuilder sb = new StringBuilder();
 | |
| 
 | |
|             while (true) {
 | |
|                 String buff = br.readLine();
 | |
|                 if (buff == null) {
 | |
|                     return sb.toString();
 | |
|                 }
 | |
|                 sb = sb.append(buff);
 | |
|             }
 | |
|         } finally {
 | |
|             input.close();
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     private JSONObject postRequest(JSONObject js) throws NetworkFailureException {
 | |
|         if (!mLoggedin) {
 | |
|             Log.e(TAG, "please login first");
 | |
|             throw new ActionFailureException("not logged in");
 | |
|         }
 | |
| 
 | |
|         HttpPost httpPost = createHttpPost();
 | |
|         try {
 | |
|             LinkedList<BasicNameValuePair> list = new LinkedList<BasicNameValuePair>();
 | |
|             list.add(new BasicNameValuePair("r", js.toString()));
 | |
|             UrlEncodedFormEntity entity = new UrlEncodedFormEntity(list, "UTF-8");
 | |
|             httpPost.setEntity(entity);
 | |
| 
 | |
|             // execute the post
 | |
|             HttpResponse response = mHttpClient.execute(httpPost);
 | |
|             String jsString = getResponseContent(response.getEntity());
 | |
|             return new JSONObject(jsString);
 | |
| 
 | |
|         } catch (ClientProtocolException e) {
 | |
|             Log.e(TAG, e.toString());
 | |
|             e.printStackTrace();
 | |
|             throw new NetworkFailureException("postRequest failed");
 | |
|         } catch (IOException e) {
 | |
|             Log.e(TAG, e.toString());
 | |
|             e.printStackTrace();
 | |
|             throw new NetworkFailureException("postRequest failed");
 | |
|         } catch (JSONException e) {
 | |
|             Log.e(TAG, e.toString());
 | |
|             e.printStackTrace();
 | |
|             throw new ActionFailureException("unable to convert response content to jsonobject");
 | |
|         } catch (Exception e) {
 | |
|             Log.e(TAG, e.toString());
 | |
|             e.printStackTrace();
 | |
|             throw new ActionFailureException("error occurs when posting request");
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     public void createTask(Task task) throws NetworkFailureException {
 | |
|         commitUpdate();
 | |
|         try {
 | |
|             JSONObject jsPost = new JSONObject();
 | |
|             JSONArray actionList = new JSONArray();
 | |
| 
 | |
|             // action_list
 | |
|             actionList.put(task.getCreateAction(getActionId()));
 | |
|             jsPost.put(GTaskStringUtils.GTASK_JSON_ACTION_LIST, actionList);
 | |
| 
 | |
|             // client_version
 | |
|             jsPost.put(GTaskStringUtils.GTASK_JSON_CLIENT_VERSION, mClientVersion);
 | |
| 
 | |
|             // post
 | |
|             JSONObject jsResponse = postRequest(jsPost);
 | |
|             JSONObject jsResult = (JSONObject) jsResponse.getJSONArray(
 | |
|                     GTaskStringUtils.GTASK_JSON_RESULTS).get(0);
 | |
|             task.setGid(jsResult.getString(GTaskStringUtils.GTASK_JSON_NEW_ID));
 | |
| 
 | |
|         } catch (JSONException e) {
 | |
|             Log.e(TAG, e.toString());
 | |
|             e.printStackTrace();
 | |
|             throw new ActionFailureException("create task: handing jsonobject failed");
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     public void createTaskList(TaskList tasklist) throws NetworkFailureException {
 | |
|         commitUpdate();
 | |
|         try {
 | |
|             JSONObject jsPost = new JSONObject();
 | |
|             JSONArray actionList = new JSONArray();
 | |
| 
 | |
|             // action_list
 | |
|             actionList.put(tasklist.getCreateAction(getActionId()));
 | |
|             jsPost.put(GTaskStringUtils.GTASK_JSON_ACTION_LIST, actionList);
 | |
| 
 | |
|             // client version
 | |
|             jsPost.put(GTaskStringUtils.GTASK_JSON_CLIENT_VERSION, mClientVersion);
 | |
| 
 | |
|             // post
 | |
|             JSONObject jsResponse = postRequest(jsPost);
 | |
|             JSONObject jsResult = (JSONObject) jsResponse.getJSONArray(
 | |
|                     GTaskStringUtils.GTASK_JSON_RESULTS).get(0);
 | |
|             tasklist.setGid(jsResult.getString(GTaskStringUtils.GTASK_JSON_NEW_ID));
 | |
| 
 | |
|         } catch (JSONException e) {
 | |
|             Log.e(TAG, e.toString());
 | |
|             e.printStackTrace();
 | |
|             throw new ActionFailureException("create tasklist: handing jsonobject failed");
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     public void commitUpdate() throws NetworkFailureException {
 | |
|         if (mUpdateArray != null) {
 | |
|             try {
 | |
|                 JSONObject jsPost = new JSONObject();
 | |
| 
 | |
|                 // action_list
 | |
|                 jsPost.put(GTaskStringUtils.GTASK_JSON_ACTION_LIST, mUpdateArray);
 | |
| 
 | |
|                 // client_version
 | |
|                 jsPost.put(GTaskStringUtils.GTASK_JSON_CLIENT_VERSION, mClientVersion);
 | |
| 
 | |
|                 postRequest(jsPost);
 | |
|                 mUpdateArray = null;
 | |
|             } catch (JSONException e) {
 | |
|                 Log.e(TAG, e.toString());
 | |
|                 e.printStackTrace();
 | |
|                 throw new ActionFailureException("commit update: handing jsonobject failed");
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     public void addUpdateNode(Node node) throws NetworkFailureException {
 | |
|         if (node != null) {
 | |
|             // too many update items may result in an error
 | |
|             // set max to 10 items
 | |
|             if (mUpdateArray != null && mUpdateArray.length() > 10) {
 | |
|                 commitUpdate();
 | |
|             }
 | |
| 
 | |
|             if (mUpdateArray == null)
 | |
|                 mUpdateArray = new JSONArray();
 | |
|             mUpdateArray.put(node.getUpdateAction(getActionId()));
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     public void moveTask(Task task, TaskList preParent, TaskList curParent)
 | |
|             throws NetworkFailureException {
 | |
|         commitUpdate();
 | |
|         try {
 | |
|             JSONObject jsPost = new JSONObject();
 | |
|             JSONArray actionList = new JSONArray();
 | |
|             JSONObject action = new JSONObject();
 | |
| 
 | |
|             // action_list
 | |
|             action.put(GTaskStringUtils.GTASK_JSON_ACTION_TYPE,
 | |
|                     GTaskStringUtils.GTASK_JSON_ACTION_TYPE_MOVE);
 | |
|             action.put(GTaskStringUtils.GTASK_JSON_ACTION_ID, getActionId());
 | |
|             action.put(GTaskStringUtils.GTASK_JSON_ID, task.getGid());
 | |
|             if (preParent == curParent && task.getPriorSibling() != null) {
 | |
|                 // put prioring_sibing_id only if moving within the tasklist and
 | |
|                 // it is not the first one
 | |
|                 action.put(GTaskStringUtils.GTASK_JSON_PRIOR_SIBLING_ID, task.getPriorSibling());
 | |
|             }
 | |
|             action.put(GTaskStringUtils.GTASK_JSON_SOURCE_LIST, preParent.getGid());
 | |
|             action.put(GTaskStringUtils.GTASK_JSON_DEST_PARENT, curParent.getGid());
 | |
|             if (preParent != curParent) {
 | |
|                 // put the dest_list only if moving between tasklists
 | |
|                 action.put(GTaskStringUtils.GTASK_JSON_DEST_LIST, curParent.getGid());
 | |
|             }
 | |
|             actionList.put(action);
 | |
|             jsPost.put(GTaskStringUtils.GTASK_JSON_ACTION_LIST, actionList);
 | |
| 
 | |
|             // client_version
 | |
|             jsPost.put(GTaskStringUtils.GTASK_JSON_CLIENT_VERSION, mClientVersion);
 | |
| 
 | |
|             postRequest(jsPost);
 | |
| 
 | |
|         } catch (JSONException e) {
 | |
|             Log.e(TAG, e.toString());
 | |
|             e.printStackTrace();
 | |
|             throw new ActionFailureException("move task: handing jsonobject failed");
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     public void deleteNode(Node node) throws NetworkFailureException {
 | |
|         commitUpdate();
 | |
|         try {
 | |
|             JSONObject jsPost = new JSONObject();
 | |
|             JSONArray actionList = new JSONArray();
 | |
| 
 | |
|             // action_list
 | |
|             node.setDeleted(true);
 | |
|             actionList.put(node.getUpdateAction(getActionId()));
 | |
|             jsPost.put(GTaskStringUtils.GTASK_JSON_ACTION_LIST, actionList);
 | |
| 
 | |
|             // client_version
 | |
|             jsPost.put(GTaskStringUtils.GTASK_JSON_CLIENT_VERSION, mClientVersion);
 | |
| 
 | |
|             postRequest(jsPost);
 | |
|             mUpdateArray = null;
 | |
|         } catch (JSONException e) {
 | |
|             Log.e(TAG, e.toString());
 | |
|             e.printStackTrace();
 | |
|             throw new ActionFailureException("delete node: handing jsonobject failed");
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     public JSONArray getTaskLists() throws NetworkFailureException {
 | |
|         if (!mLoggedin) {
 | |
|             Log.e(TAG, "please login first");
 | |
|             throw new ActionFailureException("not logged in");
 | |
|         }
 | |
| 
 | |
|         try {
 | |
|             HttpGet httpGet = new HttpGet(mGetUrl);
 | |
|             HttpResponse response = null;
 | |
|             response = mHttpClient.execute(httpGet);
 | |
| 
 | |
|             // get the task list
 | |
|             String resString = getResponseContent(response.getEntity());
 | |
|             String jsBegin = "_setup(";
 | |
|             String jsEnd = ")}</script>";
 | |
|             int begin = resString.indexOf(jsBegin);
 | |
|             int end = resString.lastIndexOf(jsEnd);
 | |
|             String jsString = null;
 | |
|             if (begin != -1 && end != -1 && begin < end) {
 | |
|                 jsString = resString.substring(begin + jsBegin.length(), end);
 | |
|             }
 | |
|             JSONObject js = new JSONObject(jsString);
 | |
|             return js.getJSONObject("t").getJSONArray(GTaskStringUtils.GTASK_JSON_LISTS);
 | |
|         } catch (ClientProtocolException e) {
 | |
|             Log.e(TAG, e.toString());
 | |
|             e.printStackTrace();
 | |
|             throw new NetworkFailureException("gettasklists: httpget failed");
 | |
|         } catch (IOException e) {
 | |
|             Log.e(TAG, e.toString());
 | |
|             e.printStackTrace();
 | |
|             throw new NetworkFailureException("gettasklists: httpget failed");
 | |
|         } catch (JSONException e) {
 | |
|             Log.e(TAG, e.toString());
 | |
|             e.printStackTrace();
 | |
|             throw new ActionFailureException("get task lists: handing jasonobject failed");
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     public JSONArray getTaskList(String listGid) throws NetworkFailureException {
 | |
|         commitUpdate();
 | |
|         try {
 | |
|             JSONObject jsPost = new JSONObject();
 | |
|             JSONArray actionList = new JSONArray();
 | |
|             JSONObject action = new JSONObject();
 | |
| 
 | |
|             // action_list
 | |
|             action.put(GTaskStringUtils.GTASK_JSON_ACTION_TYPE,
 | |
|                     GTaskStringUtils.GTASK_JSON_ACTION_TYPE_GETALL);
 | |
|             action.put(GTaskStringUtils.GTASK_JSON_ACTION_ID, getActionId());
 | |
|             action.put(GTaskStringUtils.GTASK_JSON_LIST_ID, listGid);
 | |
|             action.put(GTaskStringUtils.GTASK_JSON_GET_DELETED, false);
 | |
|             actionList.put(action);
 | |
|             jsPost.put(GTaskStringUtils.GTASK_JSON_ACTION_LIST, actionList);
 | |
| 
 | |
|             // client_version
 | |
|             jsPost.put(GTaskStringUtils.GTASK_JSON_CLIENT_VERSION, mClientVersion);
 | |
| 
 | |
|             JSONObject jsResponse = postRequest(jsPost);
 | |
|             return jsResponse.getJSONArray(GTaskStringUtils.GTASK_JSON_TASKS);
 | |
|         } catch (JSONException e) {
 | |
|             Log.e(TAG, e.toString());
 | |
|             e.printStackTrace();
 | |
|             throw new ActionFailureException("get task list: handing jsonobject failed");
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     public Account getSyncAccount() {
 | |
|         return mAccount;
 | |
|     }
 | |
| 
 | |
|     public void resetUpdateArray() {
 | |
|         mUpdateArray = null;
 | |
|     }
 | |
| }
 |