From 4892c33aab74c949893736139df2f18222df868c Mon Sep 17 00:00:00 2001 From: zhangqing <1770666340@qq.com> Date: Tue, 23 Dec 2025 20:07:28 +0800 Subject: [PATCH] 1 --- .../src/net/micode/notes/gtask/data/Task.java | 181 ++++++++++++------ 1 file changed, 123 insertions(+), 58 deletions(-) diff --git a/src/小米标签代码/src/net/micode/notes/gtask/data/Task.java b/src/小米标签代码/src/net/micode/notes/gtask/data/Task.java index 6a19454..6a5a578 100644 --- a/src/小米标签代码/src/net/micode/notes/gtask/data/Task.java +++ b/src/小米标签代码/src/net/micode/notes/gtask/data/Task.java @@ -31,65 +31,81 @@ import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; - +/** + * Task类 + * 表示Google Task中的一个任务(对应笔记应用中的一个笔记) + * 继承自Node类,增加了任务特有的属性和方法 + */ public class Task extends Node { + // 日志标签 private static final String TAG = Task.class.getSimpleName(); + // 任务是否已完成 private boolean mCompleted; - + // 任务备注/笔记内容 private String mNotes; - + // 元信息JSON对象(包含本地数据库信息) private JSONObject mMetaInfo; - + // 前一个兄弟任务(用于保持任务顺序) private Task mPriorSibling; - + // 父任务列表 private TaskList mParent; + /** + * 构造函数 + * 初始化任务的默认值 + */ public Task() { super(); - mCompleted = false; - mNotes = null; - mPriorSibling = null; - mParent = null; - mMetaInfo = null; + mCompleted = false; // 默认未完成 + mNotes = null; // 默认无备注 + mPriorSibling = null; // 默认无前兄弟 + mParent = null; // 默认无父列表 + mMetaInfo = null; // 默认无元信息 } + /** + * 获取创建动作的JSON对象 + * 用于将任务创建到Google Tasks服务器 + * @param actionId 动作ID + * @return 创建动作的JSON对象 + */ public JSONObject getCreateAction(int actionId) { JSONObject js = new JSONObject(); try { - // action_type + // 动作类型:创建 js.put(GTaskStringUtils.GTASK_JSON_ACTION_TYPE, GTaskStringUtils.GTASK_JSON_ACTION_TYPE_CREATE); - // action_id + // 动作ID js.put(GTaskStringUtils.GTASK_JSON_ACTION_ID, actionId); - // index + // 索引位置(在父列表中的位置) js.put(GTaskStringUtils.GTASK_JSON_INDEX, mParent.getChildTaskIndex(this)); - // entity_delta + // 实体增量(包含任务信息) JSONObject entity = new JSONObject(); - entity.put(GTaskStringUtils.GTASK_JSON_NAME, getName()); - entity.put(GTaskStringUtils.GTASK_JSON_CREATOR_ID, "null"); + entity.put(GTaskStringUtils.GTASK_JSON_NAME, getName()); // 任务名称 + entity.put(GTaskStringUtils.GTASK_JSON_CREATOR_ID, "null"); // 创建者ID entity.put(GTaskStringUtils.GTASK_JSON_ENTITY_TYPE, - GTaskStringUtils.GTASK_JSON_TYPE_TASK); + GTaskStringUtils.GTASK_JSON_TYPE_TASK); // 实体类型:任务 if (getNotes() != null) { - entity.put(GTaskStringUtils.GTASK_JSON_NOTES, getNotes()); + entity.put(GTaskStringUtils.GTASK_JSON_NOTES, getNotes()); // 任务备注 } js.put(GTaskStringUtils.GTASK_JSON_ENTITY_DELTA, entity); - // parent_id + // 父节点ID js.put(GTaskStringUtils.GTASK_JSON_PARENT_ID, mParent.getGid()); - // dest_parent_type + // 目标父节点类型 js.put(GTaskStringUtils.GTASK_JSON_DEST_PARENT_TYPE, GTaskStringUtils.GTASK_JSON_TYPE_GROUP); - // list_id + // 列表ID js.put(GTaskStringUtils.GTASK_JSON_LIST_ID, mParent.getGid()); - // prior_sibling_id + // 前兄弟节点ID(用于确定插入位置) if (mPriorSibling != null) { js.put(GTaskStringUtils.GTASK_JSON_PRIOR_SIBLING_ID, mPriorSibling.getGid()); } @@ -103,27 +119,33 @@ public class Task extends Node { return js; } + /** + * 获取更新动作的JSON对象 + * 用于更新Google Tasks服务器上的任务 + * @param actionId 动作ID + * @return 更新动作的JSON对象 + */ public JSONObject getUpdateAction(int actionId) { JSONObject js = new JSONObject(); try { - // action_type + // 动作类型:更新 js.put(GTaskStringUtils.GTASK_JSON_ACTION_TYPE, GTaskStringUtils.GTASK_JSON_ACTION_TYPE_UPDATE); - // action_id + // 动作ID js.put(GTaskStringUtils.GTASK_JSON_ACTION_ID, actionId); - // id + // 任务ID js.put(GTaskStringUtils.GTASK_JSON_ID, getGid()); - // entity_delta + // 实体增量(包含更新的任务信息) JSONObject entity = new JSONObject(); - entity.put(GTaskStringUtils.GTASK_JSON_NAME, getName()); + entity.put(GTaskStringUtils.GTASK_JSON_NAME, getName()); // 任务名称 if (getNotes() != null) { - entity.put(GTaskStringUtils.GTASK_JSON_NOTES, getNotes()); + entity.put(GTaskStringUtils.GTASK_JSON_NOTES, getNotes()); // 任务备注 } - entity.put(GTaskStringUtils.GTASK_JSON_DELETED, getDeleted()); + entity.put(GTaskStringUtils.GTASK_JSON_DELETED, getDeleted()); // 删除标志 js.put(GTaskStringUtils.GTASK_JSON_ENTITY_DELTA, entity); } catch (JSONException e) { @@ -135,35 +157,40 @@ public class Task extends Node { return js; } + /** + * 从远程JSON设置内容 + * 将从Google Tasks服务器获取的JSON数据解析到任务对象中 + * @param js 远程JSON对象 + */ public void setContentByRemoteJSON(JSONObject js) { if (js != null) { try { - // id + // 任务ID if (js.has(GTaskStringUtils.GTASK_JSON_ID)) { setGid(js.getString(GTaskStringUtils.GTASK_JSON_ID)); } - // last_modified + // 最后修改时间 if (js.has(GTaskStringUtils.GTASK_JSON_LAST_MODIFIED)) { setLastModified(js.getLong(GTaskStringUtils.GTASK_JSON_LAST_MODIFIED)); } - // name + // 任务名称 if (js.has(GTaskStringUtils.GTASK_JSON_NAME)) { setName(js.getString(GTaskStringUtils.GTASK_JSON_NAME)); } - // notes + // 任务备注 if (js.has(GTaskStringUtils.GTASK_JSON_NOTES)) { setNotes(js.getString(GTaskStringUtils.GTASK_JSON_NOTES)); } - // deleted + // 删除标志 if (js.has(GTaskStringUtils.GTASK_JSON_DELETED)) { setDeleted(js.getBoolean(GTaskStringUtils.GTASK_JSON_DELETED)); } - // completed + // 完成状态 if (js.has(GTaskStringUtils.GTASK_JSON_COMPLETED)) { setCompleted(js.getBoolean(GTaskStringUtils.GTASK_JSON_COMPLETED)); } @@ -175,6 +202,11 @@ public class Task extends Node { } } + /** + * 从本地JSON设置内容 + * 将本地数据库中的JSON数据解析到任务对象中 + * @param js 本地JSON对象 + */ public void setContentByLocalJSON(JSONObject js) { if (js == null || !js.has(GTaskStringUtils.META_HEAD_NOTE) || !js.has(GTaskStringUtils.META_HEAD_DATA)) { @@ -182,17 +214,21 @@ public class Task extends Node { } try { + // 解析笔记信息 JSONObject note = js.getJSONObject(GTaskStringUtils.META_HEAD_NOTE); JSONArray dataArray = js.getJSONArray(GTaskStringUtils.META_HEAD_DATA); + // 验证笔记类型 if (note.getInt(NoteColumns.TYPE) != Notes.TYPE_NOTE) { Log.e(TAG, "invalid type"); return; } + // 遍历数据数组,查找笔记内容 for (int i = 0; i < dataArray.length(); i++) { JSONObject data = dataArray.getJSONObject(i); if (TextUtils.equals(data.getString(DataColumns.MIME_TYPE), DataConstants.NOTE)) { + // 将笔记内容设置为任务名称 setName(data.getString(DataColumns.CONTENT)); break; } @@ -204,41 +240,48 @@ public class Task extends Node { } } + /** + * 从内容获取本地JSON + * 将任务对象转换为本地数据库存储的JSON格式 + * @return 本地JSON对象 + */ public JSONObject getLocalJSONFromContent() { String name = getName(); try { if (mMetaInfo == null) { - // new task created from web + // 从Web创建的新任务(无元信息) if (name == null) { Log.w(TAG, "the note seems to be an empty one"); return null; } + // 创建新的JSON结构 JSONObject js = new JSONObject(); JSONObject note = new JSONObject(); JSONArray dataArray = new JSONArray(); JSONObject data = new JSONObject(); - data.put(DataColumns.CONTENT, name); + data.put(DataColumns.CONTENT, name); // 笔记内容 dataArray.put(data); - js.put(GTaskStringUtils.META_HEAD_DATA, dataArray); - note.put(NoteColumns.TYPE, Notes.TYPE_NOTE); - js.put(GTaskStringUtils.META_HEAD_NOTE, note); + js.put(GTaskStringUtils.META_HEAD_DATA, dataArray); // 数据部分 + note.put(NoteColumns.TYPE, Notes.TYPE_NOTE); // 笔记类型 + js.put(GTaskStringUtils.META_HEAD_NOTE, note); // 笔记信息 return js; } else { - // synced task + // 已同步的任务(有元信息) JSONObject note = mMetaInfo.getJSONObject(GTaskStringUtils.META_HEAD_NOTE); JSONArray dataArray = mMetaInfo.getJSONArray(GTaskStringUtils.META_HEAD_DATA); + // 更新笔记内容 for (int i = 0; i < dataArray.length(); i++) { JSONObject data = dataArray.getJSONObject(i); if (TextUtils.equals(data.getString(DataColumns.MIME_TYPE), DataConstants.NOTE)) { - data.put(DataColumns.CONTENT, getName()); + data.put(DataColumns.CONTENT, getName()); // 更新笔记内容 break; } } - note.put(NoteColumns.TYPE, Notes.TYPE_NOTE); - return mMetaInfo; + note.put(NoteColumns.TYPE, Notes.TYPE_NOTE); // 更新笔记类型 + return mMetaInfo; // 返回更新后的元信息 } } catch (JSONException e) { Log.e(TAG, e.toString()); @@ -247,59 +290,75 @@ public class Task extends Node { } } + /** + * 设置元信息 + * 从MetaData对象中提取并解析元信息 + * @param metaData MetaData对象 + */ public void setMetaInfo(MetaData metaData) { if (metaData != null && metaData.getNotes() != null) { try { + // 从备注中解析元信息JSON mMetaInfo = new JSONObject(metaData.getNotes()); } catch (JSONException e) { Log.w(TAG, e.toString()); - mMetaInfo = null; + mMetaInfo = null; // 解析失败时设置为null } } } + /** + * 获取同步动作 + * 根据本地数据库和远程状态确定需要的同步动作 + * @param c 数据库游标 + * @return 同步动作类型 + */ public int getSyncAction(Cursor c) { try { JSONObject noteInfo = null; if (mMetaInfo != null && mMetaInfo.has(GTaskStringUtils.META_HEAD_NOTE)) { + // 从元信息中获取笔记信息 noteInfo = mMetaInfo.getJSONObject(GTaskStringUtils.META_HEAD_NOTE); } if (noteInfo == null) { Log.w(TAG, "it seems that note meta has been deleted"); - return SYNC_ACTION_UPDATE_REMOTE; + return SYNC_ACTION_UPDATE_REMOTE; // 元信息被删除,需要更新远程 } if (!noteInfo.has(NoteColumns.ID)) { Log.w(TAG, "remote note id seems to be deleted"); - return SYNC_ACTION_UPDATE_LOCAL; + return SYNC_ACTION_UPDATE_LOCAL; // 远程笔记ID被删除,需要更新本地 } - // validate the note id now + // 验证笔记ID是否匹配 if (c.getLong(SqlNote.ID_COLUMN) != noteInfo.getLong(NoteColumns.ID)) { Log.w(TAG, "note id doesn't match"); - return SYNC_ACTION_UPDATE_LOCAL; + return SYNC_ACTION_UPDATE_LOCAL; // ID不匹配,需要更新本地 } + // 检查本地修改标志 if (c.getInt(SqlNote.LOCAL_MODIFIED_COLUMN) == 0) { - // there is no local update + // 无本地更新 if (c.getLong(SqlNote.SYNC_ID_COLUMN) == getLastModified()) { - // no update both side + // 两端均无更新 return SYNC_ACTION_NONE; } else { - // apply remote to local + // 将远程更新应用到本地 return SYNC_ACTION_UPDATE_LOCAL; } } else { - // validate gtask id + // 有本地更新 + // 验证Google Task ID是否匹配 if (!c.getString(SqlNote.GTASK_ID_COLUMN).equals(getGid())) { Log.e(TAG, "gtask id doesn't match"); - return SYNC_ACTION_ERROR; + return SYNC_ACTION_ERROR; // ID不匹配,返回错误 } if (c.getLong(SqlNote.SYNC_ID_COLUMN) == getLastModified()) { - // local modification only + // 只有本地有修改 return SYNC_ACTION_UPDATE_REMOTE; } else { + // 两端都有修改,发生冲突 return SYNC_ACTION_UPDATE_CONFLICT; } } @@ -308,14 +367,21 @@ public class Task extends Node { e.printStackTrace(); } - return SYNC_ACTION_ERROR; + return SYNC_ACTION_ERROR; // 发生异常,返回错误 } + /** + * 检查是否值得保存 + * 判断任务是否有足够的信息值得保存到本地数据库 + * @return 是否值得保存 + */ public boolean isWorthSaving() { return mMetaInfo != null || (getName() != null && getName().trim().length() > 0) || (getNotes() != null && getNotes().trim().length() > 0); } + // 以下为属性的getter和setter方法 + public void setCompleted(boolean completed) { this.mCompleted = completed; } @@ -347,5 +413,4 @@ public class Task extends Node { public TaskList getParent() { return this.mParent; } - -} +} \ No newline at end of file