diff --git a/src/gtask/remote/GTaskManager.java b/src/gtask/remote/GTaskManager.java index 9cebd81..ae39538 100644 --- a/src/gtask/remote/GTaskManager.java +++ b/src/gtask/remote/GTaskManager.java @@ -38,7 +38,6 @@ public class GTaskManager { /** * 包含关键字synchronized,语言级同步,指明该函数可能运行在多线程的环境下。 * 功能:类初始化函数 - * @author TTS * @return GtaskManger */ public static synchronized GTaskManager getInstance() { //可能运行在多线程环境下,使用语言级同步--synchronized @@ -50,7 +49,6 @@ public class GTaskManager { /** * 包含关键字synchronized,语言级同步,指明该函数可能运行在多线程的环境下。 - * @author TTS * @param activity */ public synchronized void setActivityContext(Activity activity) { @@ -61,7 +59,6 @@ public class GTaskManager { /** * 核心函数 * 功能:实现了本地同步操作和远端同步操作 - * @author TTS * @param context-----获取上下文 * @param asyncTask-------用于同步的异步操作类 * @return int @@ -126,7 +123,6 @@ public class GTaskManager { /** *功能:初始化GtaskList,获取Google上的JSONtasklist转为本地TaskList。 *获得的数据存储在mMetaList,mGTaskListHashMap,mGTaskHashMap - *@author TTS *@exception NetworkFailureException *@return void */ @@ -320,22 +316,20 @@ public class GTaskManager { } - /** - * 功能: - * @author TTS - * @throws NetworkFailureException + /* + * 同步文件夹的方法,抛出网络异常 */ private void syncFolder() throws NetworkFailureException { Cursor c = null; String gid; Node node; int syncType; - + if (mCancelled) { return; } - - // for root folder + + // 同步根目录 try { c = mContentResolver.query(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, Notes.ID_ROOT_FOLDER), SqlNote.PROJECTION_NOTE, null, null, null); @@ -347,7 +341,7 @@ public class GTaskManager { mGTaskHashMap.remove(gid); mGidToNid.put(gid, (long) Notes.ID_ROOT_FOLDER); mNidToGid.put((long) Notes.ID_ROOT_FOLDER, gid); - // for system folder, only update remote name if necessary + // 仅在必要时更新远程名称 if (!node.getName().equals( GTaskStringUtils.MIUI_FOLDER_PREFFIX + GTaskStringUtils.FOLDER_DEFAULT)) doContentSync(Node.SYNC_ACTION_UPDATE_REMOTE, node, c); @@ -363,12 +357,12 @@ public class GTaskManager { c = null; } } - - // for call-note folder + + // 同步通话记录文件夹 try { c = mContentResolver.query(Notes.CONTENT_NOTE_URI, SqlNote.PROJECTION_NOTE, "(_id=?)", new String[] { - String.valueOf(Notes.ID_CALL_RECORD_FOLDER) + String.valueOf(Notes.ID_CALL_RECORD_FOLDER) }, null); if (c != null) { if (c.moveToNext()) { @@ -378,8 +372,7 @@ public class GTaskManager { mGTaskHashMap.remove(gid); mGidToNid.put(gid, (long) Notes.ID_CALL_RECORD_FOLDER); mNidToGid.put((long) Notes.ID_CALL_RECORD_FOLDER, gid); - // for system folder, only update remote name if - // necessary + // 仅在必要时更新远程名称 if (!node.getName().equals( GTaskStringUtils.MIUI_FOLDER_PREFFIX + GTaskStringUtils.FOLDER_CALL_NOTE)) @@ -397,8 +390,8 @@ public class GTaskManager { c = null; } } - - // for local existing folders + + // 同步本地已存在的文件夹 try { c = mContentResolver.query(Notes.CONTENT_NOTE_URI, SqlNote.PROJECTION_NOTE, "(type=? AND parent_id<>?)", new String[] { @@ -415,10 +408,10 @@ public class GTaskManager { syncType = node.getSyncAction(c); } else { if (c.getString(SqlNote.GTASK_ID_COLUMN).trim().length() == 0) { - // local add + // 本地添加 syncType = Node.SYNC_ACTION_ADD_REMOTE; } else { - // remote delete + // 远程删除 syncType = Node.SYNC_ACTION_DEL_LOCAL; } } @@ -433,8 +426,8 @@ public class GTaskManager { c = null; } } - - // for remote add folders + + // 同步远程添加的文件夹 Iterator> iter = mGTaskListHashMap.entrySet().iterator(); while (iter.hasNext()) { Map.Entry entry = iter.next(); @@ -445,33 +438,38 @@ public class GTaskManager { doContentSync(Node.SYNC_ACTION_ADD_LOCAL, node, null); } } - + if (!mCancelled) GTaskClient.getInstance().commitUpdate(); } - + /** * 功能:syncType分类,addLocalNode,addRemoteNode,deleteNode,updateLocalNode,updateRemoteNode - * @author TTS * @param syncType * @param node * @param c * @throws NetworkFailureException */ + /* + * 执行内容同步操作 + */ private void doContentSync(int syncType, Node node, Cursor c) throws NetworkFailureException { if (mCancelled) { return; } - + MetaData meta; switch (syncType) { case Node.SYNC_ACTION_ADD_LOCAL: + // 添加本地节点 addLocalNode(node); break; case Node.SYNC_ACTION_ADD_REMOTE: + // 添加远程节点 addRemoteNode(node, c); break; case Node.SYNC_ACTION_DEL_LOCAL: + // 获取本地删除节点的元数据,然后删除 meta = mMetaHashMap.get(c.getString(SqlNote.GTASK_ID_COLUMN)); if (meta != null) { GTaskClient.getInstance().deleteNode(meta); @@ -479,6 +477,7 @@ public class GTaskManager { mLocalDeleteIdMap.add(c.getLong(SqlNote.ID_COLUMN)); break; case Node.SYNC_ACTION_DEL_REMOTE: + // 获取远程删除节点的元数据,然后删除节点 meta = mMetaHashMap.get(node.getGid()); if (meta != null) { GTaskClient.getInstance().deleteNode(meta); @@ -486,63 +485,77 @@ public class GTaskManager { GTaskClient.getInstance().deleteNode(node); break; case Node.SYNC_ACTION_UPDATE_LOCAL: + // 更新本地节点 updateLocalNode(node, c); break; case Node.SYNC_ACTION_UPDATE_REMOTE: + // 更新远程节点 updateRemoteNode(node, c); break; case Node.SYNC_ACTION_UPDATE_CONFLICT: - // merging both modifications maybe a good idea - // right now just use local update simply + // 合并两者的修改,目前仅简单使用本地更新 updateRemoteNode(node, c); break; case Node.SYNC_ACTION_NONE: + // 无动作 break; case Node.SYNC_ACTION_ERROR: default: - throw new ActionFailureException("unkown sync action type"); + // 未知的同步操作类型,抛出异常 + throw new ActionFailureException("unknown sync action type"); } } + - /** - * 功能:本地增加Node - * @author TTS - * @param node - * @throws NetworkFailureException + + /* + * 功能描述:添加本地节点 + * 参数:node - 节点对象 + * 返回:无 + * 异常:NetworkFailureException - 网络异常 */ private void addLocalNode(Node node) throws NetworkFailureException { if (mCancelled) { return; } - + SqlNote sqlNote; + + // 如果节点为任务列表 if (node instanceof TaskList) { if (node.getName().equals( GTaskStringUtils.MIUI_FOLDER_PREFFIX + GTaskStringUtils.FOLDER_DEFAULT)) { + // 根据任务列表的名称判断是否为默认文件夹,创建对应的 SqlNote 对象 sqlNote = new SqlNote(mContext, Notes.ID_ROOT_FOLDER); } else if (node.getName().equals( GTaskStringUtils.MIUI_FOLDER_PREFFIX + GTaskStringUtils.FOLDER_CALL_NOTE)) { + // 根据任务列表的名称判断是否为通话记录文件夹,创建对应的 SqlNote 对象 sqlNote = new SqlNote(mContext, Notes.ID_CALL_RECORD_FOLDER); } else { + // 其他情况创建普通任务列表对应的 SqlNote 对象 sqlNote = new SqlNote(mContext); sqlNote.setContent(node.getLocalJSONFromContent()); sqlNote.setParentId(Notes.ID_ROOT_FOLDER); } } else { + // 如果节点为任务 sqlNote = new SqlNote(mContext); JSONObject js = node.getLocalJSONFromContent(); + try { + // 处理 META_HEAD_NOTE 中的 ID,确保本地数据库中不存在该 ID if (js.has(GTaskStringUtils.META_HEAD_NOTE)) { JSONObject note = js.getJSONObject(GTaskStringUtils.META_HEAD_NOTE); if (note.has(NoteColumns.ID)) { long id = note.getLong(NoteColumns.ID); if (DataUtils.existInNoteDatabase(mContentResolver, id)) { - // the id is not available, have to create a new one + // 如果 ID 在本地数据库中存在,则移除该 ID,创建新的任务 ID note.remove(NoteColumns.ID); } } } - + + // 处理 META_HEAD_DATA 中的 ID,确保本地数据库中不存在该 ID if (js.has(GTaskStringUtils.META_HEAD_DATA)) { JSONArray dataArray = js.getJSONArray(GTaskStringUtils.META_HEAD_DATA); for (int i = 0; i < dataArray.length(); i++) { @@ -550,20 +563,21 @@ public class GTaskManager { if (data.has(DataColumns.ID)) { long dataId = data.getLong(DataColumns.ID); if (DataUtils.existInDataDatabase(mContentResolver, dataId)) { - // the data id is not available, have to create - // a new one + // 如果 ID 在本地数据库中存在,则移除该 ID,创建新的数据 ID data.remove(DataColumns.ID); } } } - } } catch (JSONException e) { Log.w(TAG, e.toString()); e.printStackTrace(); } + + // 设置 SqlNote 对象的内容为节点的本地 JSON 表示 sqlNote.setContent(js); - + + // 获取节点的父节点的本地 ID,用于设置 SqlNote 对象的父 ID Long parentId = mGidToNid.get(((Task) node).getParent().getGid()); if (parentId == null) { Log.e(TAG, "cannot find task's parent id locally"); @@ -571,22 +585,22 @@ public class GTaskManager { } sqlNote.setParentId(parentId.longValue()); } - - // create the local node + + // 设置 SqlNote 对象的 GTask ID,并提交到本地数据库 sqlNote.setGtaskId(node.getGid()); sqlNote.commit(false); - - // update gid-nid mapping + + // 更新 GTask ID 到本地 ID 的映射关系 mGidToNid.put(node.getGid(), sqlNote.getId()); mNidToGid.put(sqlNote.getId(), node.getGid()); - - // update meta + + // 更新远程 Meta 信息 updateRemoteMeta(node.getGid(), sqlNote); } + /** * 功能:update本地node - * @author TTS * @param node * ----同步操作的基础数据类型 * @param c @@ -619,7 +633,6 @@ public class GTaskManager { /** * 功能:远程增加Node * 需要updateRemoteMeta - * @author TTS * @param node * ----同步操作的基础数据类型 * @param c @@ -703,7 +716,6 @@ public class GTaskManager { /** * 功能:更新远端的Node,包含meta更新(updateRemoteMeta) - * @author TTS * @param node * ----同步操作的基础数据类型 * @param c @@ -755,7 +767,6 @@ public class GTaskManager { /** * 功能:升级远程meta。 meta---元数据----计算机文件系统管理数据---管理数据的数据。 - * @author TTS * @param gid * ---GoogleID为String类型 * @param sqlNote @@ -780,7 +791,6 @@ public class GTaskManager { /** * 功能:刷新本地,给sync的ID对应上最后更改过的对象 - * @author TTS * @return void * @throws NetworkFailureException */ @@ -830,7 +840,6 @@ public class GTaskManager { /** * 功能:获取同步账号,mAccount.name - * @author TTS * @return String */ public String getSyncAccount() { @@ -839,7 +848,6 @@ public class GTaskManager { /** * 功能:取消同步,置mCancelled为true - * @author TTS */ public void cancelSync() { mCancelled = true;