|
|
|
@ -0,0 +1,210 @@
|
|
|
|
|
package net.micode.notes.gtask.remote;
|
|
|
|
|
|
|
|
|
|
public class GTaskManager {
|
|
|
|
|
private static final String TAG = GTaskManager.class.getSimpleName();
|
|
|
|
|
public static final int STATE_SUCCESS = 0;
|
|
|
|
|
public static final int STATE_NETWORK_ERROR = 1;
|
|
|
|
|
public static final int STATE_INTERNAL_ERROR = 2;
|
|
|
|
|
public static final int STATE_SYNC_IN_PROGRESS = 3;
|
|
|
|
|
public static final int STATE_SYNC_CANCELLED = 4;
|
|
|
|
|
private static GTaskManager mInstance = null;
|
|
|
|
|
|
|
|
|
|
private Activity mActivity;
|
|
|
|
|
private Context mContext;
|
|
|
|
|
private ContentResolver mContentResolver;
|
|
|
|
|
private boolean mSyncing;
|
|
|
|
|
private boolean mCancelled;
|
|
|
|
|
private HashMap<String, TaskList> mGTaskListHashMap;
|
|
|
|
|
private HashMap<String, Node> mGTaskHashMap;
|
|
|
|
|
private HashMap<String, MetaData> mMetaHashMap;
|
|
|
|
|
private TaskList mMetaList;
|
|
|
|
|
private HashSet<Long> mLocalDeleteIdMap;
|
|
|
|
|
private HashMap<String, Long> mGidToNid;
|
|
|
|
|
private HashMap<Long, String> mNidToGid;
|
|
|
|
|
|
|
|
|
|
private GTaskManager() { //对象初始化函数
|
|
|
|
|
mSyncing = false; //正在同步,flase代表未执行
|
|
|
|
|
mCancelled = false; //全局标识,flase代表可以执行
|
|
|
|
|
mGTaskListHashMap = new HashMap<String, TaskList>(); //<>代表Java的泛型,就是创建一个用类型作为参数的类。
|
|
|
|
|
mGTaskHashMap = new HashMap<String, Node>();
|
|
|
|
|
mMetaHashMap = new HashMap<String, MetaData>();
|
|
|
|
|
mMetaList = null;
|
|
|
|
|
mLocalDeleteIdMap = new HashSet<Long>();
|
|
|
|
|
mGidToNid = new HashMap<String, Long>(); //GoogleID to NodeID??
|
|
|
|
|
mNidToGid = new HashMap<Long, String>(); //NodeID to GoogleID???通过hashmap散列表建立映射
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 包含关键字synchronized,语言级同步,指明该函数可能运行在多线程的环境下。
|
|
|
|
|
* 功能:类初始化函数
|
|
|
|
|
* @author TTS
|
|
|
|
|
* @return GtaskManger
|
|
|
|
|
*/
|
|
|
|
|
public static synchronized GTaskManager getInstance() { //可能运行在多线程环境下,使用语言级同步--synchronized
|
|
|
|
|
if (mInstance == null) {
|
|
|
|
|
mInstance = new GTaskManager();
|
|
|
|
|
}
|
|
|
|
|
return mInstance;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 包含关键字synchronized,语言级同步,指明该函数可能运行在多线程的环境下。
|
|
|
|
|
* @author TTS
|
|
|
|
|
* @param activity
|
|
|
|
|
*/
|
|
|
|
|
public synchronized void setActivityContext(Activity activity) {
|
|
|
|
|
// used for getting auth token
|
|
|
|
|
mActivity = activity;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 核心函数
|
|
|
|
|
* 功能:实现了本地同步操作和远端同步操作
|
|
|
|
|
* @author TTS
|
|
|
|
|
* @param context-----获取上下文
|
|
|
|
|
* @param asyncTask-------用于同步的异步操作类
|
|
|
|
|
* @return int
|
|
|
|
|
*/
|
|
|
|
|
public int sync(Context context, GTaskASyncTask asyncTask) { //核心函数
|
|
|
|
|
if (mSyncing) {
|
|
|
|
|
Log.d(TAG, "Sync is in progress"); //创建日志文件(调试信息),debug
|
|
|
|
|
return STATE_SYNC_IN_PROGRESS;
|
|
|
|
|
}
|
|
|
|
|
mContext = context;
|
|
|
|
|
mContentResolver = mContext.getContentResolver();
|
|
|
|
|
mSyncing = true;
|
|
|
|
|
mCancelled = false;
|
|
|
|
|
mGTaskListHashMap.clear();
|
|
|
|
|
mGTaskHashMap.clear();
|
|
|
|
|
mMetaHashMap.clear();
|
|
|
|
|
mLocalDeleteIdMap.clear();
|
|
|
|
|
mGidToNid.clear();
|
|
|
|
|
mNidToGid.clear();
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
GTaskClient client = GTaskClient.getInstance(); //getInstance即为创建一个实例,client--客户机
|
|
|
|
|
client.resetUpdateArray(); //JSONArray类型,reset即置为NULL
|
|
|
|
|
|
|
|
|
|
// login google task
|
|
|
|
|
if (!mCancelled) {
|
|
|
|
|
if (!client.login(mActivity)) {
|
|
|
|
|
throw new NetworkFailureException("login google task failed");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// get the task list from google
|
|
|
|
|
asyncTask.publishProgess(mContext.getString(R.string.sync_progress_init_list));
|
|
|
|
|
initGTaskList(); //获取Google上的JSONtasklist转为本地TaskList
|
|
|
|
|
|
|
|
|
|
// do content sync work
|
|
|
|
|
asyncTask.publishProgess(mContext.getString(R.string.sync_progress_syncing));
|
|
|
|
|
syncContent();
|
|
|
|
|
} catch (NetworkFailureException e) { //分为两种异常,此类异常为网络异常
|
|
|
|
|
Log.e(TAG, e.toString()); //创建日志文件(调试信息),error
|
|
|
|
|
return STATE_NETWORK_ERROR;
|
|
|
|
|
} catch (ActionFailureException e) { //此类异常为操作异常
|
|
|
|
|
Log.e(TAG, e.toString());
|
|
|
|
|
return STATE_INTERNAL_ERROR;
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
Log.e(TAG, e.toString());
|
|
|
|
|
e.printStackTrace();
|
|
|
|
|
return STATE_INTERNAL_ERROR;
|
|
|
|
|
} finally {
|
|
|
|
|
mGTaskListHashMap.clear();
|
|
|
|
|
mGTaskHashMap.clear();
|
|
|
|
|
mMetaHashMap.clear();
|
|
|
|
|
mLocalDeleteIdMap.clear();
|
|
|
|
|
mGidToNid.clear();
|
|
|
|
|
mNidToGid.clear();
|
|
|
|
|
mSyncing = false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return mCancelled ? STATE_SYNC_CANCELLED : STATE_SUCCESS;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
*功能:初始化GtaskList,获取Google上的JSONtasklist转为本地TaskList。
|
|
|
|
|
*获得的数据存储在mMetaList,mGTaskListHashMap,mGTaskHashMap
|
|
|
|
|
*@author TTS
|
|
|
|
|
*@exception NetworkFailureException
|
|
|
|
|
*@return void
|
|
|
|
|
*/
|
|
|
|
|
private void initGTaskList() throws NetworkFailureException {
|
|
|
|
|
if (mCancelled)
|
|
|
|
|
return;
|
|
|
|
|
GTaskClient client = GTaskClient.getInstance(); //getInstance即为创建一个实例,client应指远端客户机
|
|
|
|
|
try {
|
|
|
|
|
//Json对象是Name Value对(即子元素)的无序集合,相当于一个Map对象。JsonObject类是bantouyan-json库对Json对象的抽象,提供操纵Json对象的各种方法。
|
|
|
|
|
//其格式为{"key1":value1,"key2",value2....};key 必须是字符串。
|
|
|
|
|
//因为ajax请求不刷新页面,但配合js可以实现局部刷新,因此json常常被用来作为异步请求的返回对象使用。
|
|
|
|
|
JSONArray jsTaskLists = client.getTaskLists(); //原注释为get task list
|
|
|
|
|
|
|
|
|
|
// init meta list first初始化
|
|
|
|
|
mMetaList = null; //TaskList类型
|
|
|
|
|
for (int i = 0; i < jsTaskLists.length(); i++) {
|
|
|
|
|
JSONObject object = jsTaskLists.getJSONObject(i); //JSONObject与JSONArray一个为对象,一个为数组。此处取出单个JASONObject
|
|
|
|
|
String gid = object.getString(GTaskStringUtils.GTASK_JSON_ID);
|
|
|
|
|
String name = object.getString(GTaskStringUtils.GTASK_JSON_NAME);
|
|
|
|
|
|
|
|
|
|
if (name.equals(GTaskStringUtils.MIUI_FOLDER_PREFFIX + GTaskStringUtils.FOLDER_META)) {
|
|
|
|
|
mMetaList = new TaskList(); //MetaList意为元表,Tasklist类型,此处为初始化
|
|
|
|
|
mMetaList.setContentByRemoteJSON(object); //将JSON中部分数据复制到自己定义的对象中相对应的数据:name->mname...
|
|
|
|
|
|
|
|
|
|
// load meta data
|
|
|
|
|
JSONArray jsMetas = client.getTaskList(gid); //原注释为get action_list
|
|
|
|
|
for (int j = 0; j < jsMetas.length(); j++) {
|
|
|
|
|
object = (JSONObject) jsMetas.getJSONObject(j);
|
|
|
|
|
MetaData metaData = new MetaData(); //继承自Node
|
|
|
|
|
metaData.setContentByRemoteJSON(object);
|
|
|
|
|
if (metaData.isWorthSaving()) { //if not worth to save,metadata将不加入mMetaList 判断是否存入
|
|
|
|
|
mMetaList.addChildTask(metaData);
|
|
|
|
|
if (metaData.getGid() != null) {
|
|
|
|
|
mMetaHashMap.put(metaData.getRelatedGid(), metaData);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// create meta list if not existed
|
|
|
|
|
if (mMetaList == null) {
|
|
|
|
|
mMetaList = new TaskList();
|
|
|
|
|
mMetaList.setName(GTaskStringUtils.MIUI_FOLDER_PREFFIX
|
|
|
|
|
+ GTaskStringUtils.FOLDER_META);
|
|
|
|
|
GTaskClient.getInstance().createTaskList(mMetaList);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// init task list初始化
|
|
|
|
|
for (int i = 0; i < jsTaskLists.length(); i++) {
|
|
|
|
|
JSONObject object = jsTaskLists.getJSONObject(i);
|
|
|
|
|
String gid = object.getString(GTaskStringUtils.GTASK_JSON_ID); //通过getString函数传入本地某个标志数据的名称,获取其在远端的名称。
|
|
|
|
|
String name = object.getString(GTaskStringUtils.GTASK_JSON_NAME);
|
|
|
|
|
|
|
|
|
|
if (name.startsWith(GTaskStringUtils.MIUI_FOLDER_PREFFIX)
|
|
|
|
|
&& !name.equals(GTaskStringUtils.MIUI_FOLDER_PREFFIX
|
|
|
|
|
+ GTaskStringUtils.FOLDER_META)) {
|
|
|
|
|
TaskList tasklist = new TaskList(); //继承自Node
|
|
|
|
|
tasklist.setContentByRemoteJSON(object);
|
|
|
|
|
mGTaskListHashMap.put(gid, tasklist);
|
|
|
|
|
mGTaskHashMap.put(gid, tasklist);
|
|
|
|
|
// load tasks加载
|
|
|
|
|
JSONArray jsTasks = client.getTaskList(gid);
|
|
|
|
|
for (int j = 0; j < jsTasks.length(); j++) {
|
|
|
|
|
object = (JSONObject) jsTasks.getJSONObject(j);
|
|
|
|
|
gid = object.getString(GTaskStringUtils.GTASK_JSON_ID);
|
|
|
|
|
Task task = new Task();
|
|
|
|
|
task.setContentByRemoteJSON(object);
|
|
|
|
|
if (task.isWorthSaving()) {
|
|
|
|
|
task.setMetaInfo(mMetaHashMap.get(gid));
|
|
|
|
|
tasklist.addChildTask(task);
|
|
|
|
|
mGTaskHashMap.put(gid, task);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
} catch (JSONException e) {
|
|
|
|
|
Log.e(TAG, e.toString());
|
|
|
|
|
e.printStackTrace();
|
|
|
|
|
throw new ActionFailureException("initGTaskList: handing JSONObject failed");
|
|
|
|
|
}
|
|
|
|
|
|