diff --git a/src/Notes-master/src/net/micode/notes/gtask/data/MetaData.java b/src/Notes-master/src/net/micode/notes/gtask/data/MetaData.java index 3a2050b..752d8e3 100644 --- a/src/Notes-master/src/net/micode/notes/gtask/data/MetaData.java +++ b/src/Notes-master/src/net/micode/notes/gtask/data/MetaData.java @@ -13,23 +13,24 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - + package net.micode.notes.gtask.data; - + import android.database.Cursor; import android.util.Log; - + import net.micode.notes.tool.GTaskStringUtils; - + import org.json.JSONException; import org.json.JSONObject; - - + +// MetaData类继承自Task类,用于表示与GTask相关的元数据信息 public class MetaData extends Task { private final static String TAG = MetaData.class.getSimpleName(); - + private String mRelatedGid = null; - + + // 设置元数据信息,包括GTask的ID和元数据信息对象 public void setMeta(String gid, JSONObject metaInfo) { try { metaInfo.put(GTaskStringUtils.META_HEAD_GTASK_ID, gid); @@ -39,16 +40,19 @@ public class MetaData extends Task { setNotes(metaInfo.toString()); setName(GTaskStringUtils.META_NOTE_NAME); } - + + // 获取与当前任务相关的GTask的ID public String getRelatedGid() { return mRelatedGid; } - + + // 判断当前元数据是否值得保存,即是否包含有效的元数据信息 @Override public boolean isWorthSaving() { return getNotes() != null; } - + + // 根据远程服务器返回的JSON对象设置任务内容,并提取相关的GTask ID @Override public void setContentByRemoteJSON(JSONObject js) { super.setContentByRemoteJSON(js); @@ -62,21 +66,24 @@ public class MetaData extends Task { } } } - + + // 此方法应不被调用,抛出异常 @Override public void setContentByLocalJSON(JSONObject js) { // this function should not be called throw new IllegalAccessError("MetaData:setContentByLocalJSON should not be called"); } - + + // 此方法应不被调用,抛出异常 @Override public JSONObject getLocalJSONFromContent() { throw new IllegalAccessError("MetaData:getLocalJSONFromContent should not be called"); } - + + // 此方法应不被调用,抛出异常 @Override public int getSyncAction(Cursor c) { throw new IllegalAccessError("MetaData:getSyncAction should not be called"); } - -} + +} \ No newline at end of file diff --git a/src/Notes-master/src/net/micode/notes/gtask/data/Node.java b/src/Notes-master/src/net/micode/notes/gtask/data/Node.java index 63950e0..32e8f5b 100644 --- a/src/Notes-master/src/net/micode/notes/gtask/data/Node.java +++ b/src/Notes-master/src/net/micode/notes/gtask/data/Node.java @@ -20,7 +20,9 @@ import android.database.Cursor; import org.json.JSONObject; +// 抽象类 Node 定义了与 Google 任务同步相关的操作 public abstract class Node { + // 同步操作类型常量定义 public static final int SYNC_ACTION_NONE = 0; public static final int SYNC_ACTION_ADD_REMOTE = 1; @@ -40,13 +42,11 @@ public abstract class Node { public static final int SYNC_ACTION_ERROR = 8; private String mGid; - private String mName; - private long mLastModified; - private boolean mDeleted; + // 构造函数,初始化节点属性 public Node() { mGid = null; mName = ""; @@ -54,48 +54,62 @@ public abstract class Node { mDeleted = false; } + // 获取创建操作的 JSON 对象 public abstract JSONObject getCreateAction(int actionId); + // 获取更新操作的 JSON 对象 public abstract JSONObject getUpdateAction(int actionId); + // 根据远程 JSON 对象设置节点内容 public abstract void setContentByRemoteJSON(JSONObject js); + // 根据本地 JSON 对象设置节点内容 public abstract void setContentByLocalJSON(JSONObject js); + // 从节点内容生成本地 JSON 对象 public abstract JSONObject getLocalJSONFromContent(); + // 根据游标信息判断同步操作类型 public abstract int getSyncAction(Cursor c); + // 设置节点的全局唯一标识符 public void setGid(String gid) { this.mGid = gid; } + // 设置节点的名称 public void setName(String name) { this.mName = name; } + // 设置节点的最后修改时间 public void setLastModified(long lastModified) { this.mLastModified = lastModified; } + // 设置节点的删除状态 public void setDeleted(boolean deleted) { this.mDeleted = deleted; } + // 获取节点的全局唯一标识符 public String getGid() { return this.mGid; } + // 获取节点的名称 public String getName() { return this.mName; } + // 获取节点的最后修改时间 public long getLastModified() { return this.mLastModified; } + // 获取节点的删除状态 public boolean getDeleted() { return this.mDeleted; } -} +} \ No newline at end of file diff --git a/src/Notes-master/src/net/micode/notes/gtask/data/SqlData.java b/src/Notes-master/src/net/micode/notes/gtask/data/SqlData.java index d3ec3be..42e0705 100644 --- a/src/Notes-master/src/net/micode/notes/gtask/data/SqlData.java +++ b/src/Notes-master/src/net/micode/notes/gtask/data/SqlData.java @@ -13,9 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - + package net.micode.notes.gtask.data; - + import android.content.ContentResolver; import android.content.ContentUris; import android.content.ContentValues; @@ -23,54 +23,46 @@ import android.content.Context; import android.database.Cursor; import android.net.Uri; import android.util.Log; - + import net.micode.notes.data.Notes; import net.micode.notes.data.Notes.DataColumns; import net.micode.notes.data.Notes.DataConstants; import net.micode.notes.data.Notes.NoteColumns; import net.micode.notes.data.NotesDatabaseHelper.TABLE; import net.micode.notes.gtask.exception.ActionFailureException; - + import org.json.JSONException; import org.json.JSONObject; - - + +// 该类用于处理数据库中的笔记数据,支持从JSON对象加载数据以及将数据提交到数据库 public class SqlData { private static final String TAG = SqlData.class.getSimpleName(); - + private static final int INVALID_ID = -99999; - + + // 数据库查询时使用的字段投影 public static final String[] PROJECTION_DATA = new String[] { DataColumns.ID, DataColumns.MIME_TYPE, DataColumns.CONTENT, DataColumns.DATA1, DataColumns.DATA3 }; - + + // 字段在查询结果中的索引位置 public static final int DATA_ID_COLUMN = 0; - public static final int DATA_MIME_TYPE_COLUMN = 1; - public static final int DATA_CONTENT_COLUMN = 2; - public static final int DATA_CONTENT_DATA_1_COLUMN = 3; - public static final int DATA_CONTENT_DATA_3_COLUMN = 4; - + private ContentResolver mContentResolver; - private boolean mIsCreate; - private long mDataId; - private String mDataMimeType; - private String mDataContent; - private long mDataContentData1; - private String mDataContentData3; - private ContentValues mDiffDataValues; - + + // 构造函数,用于创建新的SqlData对象 public SqlData(Context context) { mContentResolver = context.getContentResolver(); mIsCreate = true; @@ -81,14 +73,16 @@ public class SqlData { mDataContentData3 = ""; mDiffDataValues = new ContentValues(); } - + + // 构造函数,从Cursor加载现有数据 public SqlData(Context context, Cursor c) { mContentResolver = context.getContentResolver(); mIsCreate = false; loadFromCursor(c); mDiffDataValues = new ContentValues(); } - + + // 从Cursor加载数据到成员变量 private void loadFromCursor(Cursor c) { mDataId = c.getLong(DATA_ID_COLUMN); mDataMimeType = c.getString(DATA_MIME_TYPE_COLUMN); @@ -96,40 +90,42 @@ public class SqlData { mDataContentData1 = c.getLong(DATA_CONTENT_DATA_1_COLUMN); mDataContentData3 = c.getString(DATA_CONTENT_DATA_3_COLUMN); } - + + // 设置内容,从JSON对象中加载数据,并记录与现有数据的差异 public void setContent(JSONObject js) throws JSONException { long dataId = js.has(DataColumns.ID) ? js.getLong(DataColumns.ID) : INVALID_ID; if (mIsCreate || mDataId != dataId) { mDiffDataValues.put(DataColumns.ID, dataId); } mDataId = dataId; - + String dataMimeType = js.has(DataColumns.MIME_TYPE) ? js.getString(DataColumns.MIME_TYPE) : DataConstants.NOTE; if (mIsCreate || !mDataMimeType.equals(dataMimeType)) { mDiffDataValues.put(DataColumns.MIME_TYPE, dataMimeType); } mDataMimeType = dataMimeType; - + String dataContent = js.has(DataColumns.CONTENT) ? js.getString(DataColumns.CONTENT) : ""; if (mIsCreate || !mDataContent.equals(dataContent)) { mDiffDataValues.put(DataColumns.CONTENT, dataContent); } mDataContent = dataContent; - + long dataContentData1 = js.has(DataColumns.DATA1) ? js.getLong(DataColumns.DATA1) : 0; if (mIsCreate || mDataContentData1 != dataContentData1) { mDiffDataValues.put(DataColumns.DATA1, dataContentData1); } mDataContentData1 = dataContentData1; - + String dataContentData3 = js.has(DataColumns.DATA3) ? js.getString(DataColumns.DATA3) : ""; if (mIsCreate || !mDataContentData3.equals(dataContentData3)) { mDiffDataValues.put(DataColumns.DATA3, dataContentData3); } mDataContentData3 = dataContentData3; } - + + // 获取内容,将成员变量数据转换为JSON对象 public JSONObject getContent() throws JSONException { if (mIsCreate) { Log.e(TAG, "it seems that we haven't created this in database yet"); @@ -143,14 +139,15 @@ public class SqlData { js.put(DataColumns.DATA3, mDataContentData3); return js; } - + + // 提交数据到数据库,根据mIsCreate标志判断是插入还是更新操作 public void commit(long noteId, boolean validateVersion, long version) { - + if (mIsCreate) { if (mDataId == INVALID_ID && mDiffDataValues.containsKey(DataColumns.ID)) { mDiffDataValues.remove(DataColumns.ID); } - + mDiffDataValues.put(DataColumns.NOTE_ID, noteId); Uri uri = mContentResolver.insert(Notes.CONTENT_DATA_URI, mDiffDataValues); try { @@ -178,12 +175,13 @@ public class SqlData { } } } - + mDiffDataValues.clear(); mIsCreate = false; } - + + // 获取数据项的ID public long getId() { return mDataId; } -} +} \ No newline at end of file diff --git a/src/Notes-master/src/net/micode/notes/gtask/data/SqlNote.java b/src/Notes-master/src/net/micode/notes/gtask/data/SqlNote.java index 79a4095..e533509 100644 --- a/src/Notes-master/src/net/micode/notes/gtask/data/SqlNote.java +++ b/src/Notes-master/src/net/micode/notes/gtask/data/SqlNote.java @@ -37,7 +37,7 @@ import org.json.JSONObject; import java.util.ArrayList; - +// SqlNote 类用于处理笔记数据的创建、更新和查询操作 public class SqlNote { private static final String TAG = SqlNote.class.getSimpleName(); @@ -52,76 +52,45 @@ public class SqlNote { NoteColumns.VERSION }; + // 列索引常量,用于从 Cursor 中获取笔记数据 public static final int ID_COLUMN = 0; - public static final int ALERTED_DATE_COLUMN = 1; - public static final int BG_COLOR_ID_COLUMN = 2; - public static final int CREATED_DATE_COLUMN = 3; - public static final int HAS_ATTACHMENT_COLUMN = 4; - public static final int MODIFIED_DATE_COLUMN = 5; - public static final int NOTES_COUNT_COLUMN = 6; - public static final int PARENT_ID_COLUMN = 7; - public static final int SNIPPET_COLUMN = 8; - public static final int TYPE_COLUMN = 9; - public static final int WIDGET_ID_COLUMN = 10; - public static final int WIDGET_TYPE_COLUMN = 11; - public static final int SYNC_ID_COLUMN = 12; - public static final int LOCAL_MODIFIED_COLUMN = 13; - public static final int ORIGIN_PARENT_ID_COLUMN = 14; - public static final int GTASK_ID_COLUMN = 15; - public static final int VERSION_COLUMN = 16; private Context mContext; - private ContentResolver mContentResolver; - private boolean mIsCreate; - private long mId; - private long mAlertDate; - private int mBgColorId; - private long mCreatedDate; - private int mHasAttachment; - private long mModifiedDate; - private long mParentId; - private String mSnippet; - private int mType; - private int mWidgetId; - private int mWidgetType; - private long mOriginParent; - private long mVersion; - private ContentValues mDiffNoteValues; - private ArrayList mDataList; + // 构造函数,创建一个新的 SqlNote 对象 public SqlNote(Context context) { mContext = context; mContentResolver = context.getContentResolver(); @@ -143,6 +112,7 @@ public class SqlNote { mDataList = new ArrayList(); } + // 构造函数,从 Cursor 中加载数据来创建 SqlNote 对象 public SqlNote(Context context, Cursor c) { mContext = context; mContentResolver = context.getContentResolver(); @@ -154,6 +124,7 @@ public class SqlNote { mDiffNoteValues = new ContentValues(); } + // 构造函数,通过笔记 ID 从数据库中加载数据来创建 SqlNote 对象 public SqlNote(Context context, long id) { mContext = context; mContentResolver = context.getContentResolver(); @@ -163,9 +134,9 @@ public class SqlNote { if (mType == Notes.TYPE_NOTE) loadDataContent(); mDiffNoteValues = new ContentValues(); - } + // 通过笔记 ID 从数据库中加载笔记数据 private void loadFromCursor(long id) { Cursor c = null; try { @@ -185,6 +156,7 @@ public class SqlNote { } } + // 从 Cursor 中加载笔记数据到对象属性中 private void loadFromCursor(Cursor c) { mId = c.getLong(ID_COLUMN); mAlertDate = c.getLong(ALERTED_DATE_COLUMN); @@ -200,6 +172,7 @@ public class SqlNote { mVersion = c.getLong(VERSION_COLUMN); } + // 加载笔记的具体内容数据 private void loadDataContent() { Cursor c = null; mDataList.clear(); @@ -226,13 +199,14 @@ public class SqlNote { } } + // 根据 JSONObject 设置笔记内容 public boolean setContent(JSONObject js) { try { JSONObject note = js.getJSONObject(GTaskStringUtils.META_HEAD_NOTE); if (note.getInt(NoteColumns.TYPE) == Notes.TYPE_SYSTEM) { Log.w(TAG, "cannot set system folder"); } else if (note.getInt(NoteColumns.TYPE) == Notes.TYPE_FOLDER) { - // for folder we can only update the snnipet and type + // 更新文件夹的摘要和类型 String snippet = note.has(NoteColumns.SNIPPET) ? note .getString(NoteColumns.SNIPPET) : ""; if (mIsCreate || !mSnippet.equals(snippet)) { @@ -359,6 +333,7 @@ public class SqlNote { return true; } + // 获取笔记内容的 JSONObject 表示 public JSONObject getContent() { try { JSONObject js = new JSONObject(); @@ -407,39 +382,48 @@ public class SqlNote { return null; } + // 设置笔记的父笔记 ID public void setParentId(long id) { mParentId = id; mDiffNoteValues.put(NoteColumns.PARENT_ID, id); } + // 设置笔记的 GTASK ID public void setGtaskId(String gid) { mDiffNoteValues.put(NoteColumns.GTASK_ID, gid); } + // 设置笔记的同步 ID public void setSyncId(long syncId) { mDiffNoteValues.put(NoteColumns.SYNC_ID, syncId); } + // 重置本地修改标志 public void resetLocalModified() { mDiffNoteValues.put(NoteColumns.LOCAL_MODIFIED, 0); } + // 获取笔记 ID public long getId() { return mId; } + // 获取笔记的父笔记 ID public long getParentId() { return mParentId; } + // 获取笔记摘要 public String getSnippet() { return mSnippet; } + // 检查笔记类型是否为笔记类型 public boolean isNoteType() { return mType == Notes.TYPE_NOTE; } + // 提交笔记更改到数据库 public void commit(boolean validateVersion) { if (mIsCreate) { if (mId == INVALID_ID && mDiffNoteValues.containsKey(NoteColumns.ID)) { @@ -494,7 +478,7 @@ public class SqlNote { } } - // refresh local info + // 刷新本地笔记信息 loadFromCursor(mId); if (mType == Notes.TYPE_NOTE) loadDataContent(); @@ -502,4 +486,4 @@ public class SqlNote { mDiffNoteValues.clear(); mIsCreate = false; } -} +} \ No newline at end of file diff --git a/src/Notes-master/src/net/micode/notes/gtask/data/Task.java b/src/Notes-master/src/net/micode/notes/gtask/data/Task.java index 6a19454..6d51cc2 100644 --- a/src/Notes-master/src/net/micode/notes/gtask/data/Task.java +++ b/src/Notes-master/src/net/micode/notes/gtask/data/Task.java @@ -31,7 +31,7 @@ import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; - +// 任务类,继承自节点类,表示一个任务对象 public class Task extends Node { private static final String TAG = Task.class.getSimpleName(); @@ -45,6 +45,7 @@ public class Task extends Node { private TaskList mParent; + // 构造函数,初始化任务对象 public Task() { super(); mCompleted = false; @@ -54,46 +55,28 @@ public class Task extends Node { mMetaInfo = null; } + // 生成创建任务的动作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 + js.put(GTaskStringUtils.GTASK_JSON_ACTION_TYPE, GTaskStringUtils.GTASK_JSON_ACTION_TYPE_CREATE); 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_ENTITY_TYPE, - GTaskStringUtils.GTASK_JSON_TYPE_TASK); + entity.put(GTaskStringUtils.GTASK_JSON_ENTITY_TYPE, GTaskStringUtils.GTASK_JSON_TYPE_TASK); if (getNotes() != null) { entity.put(GTaskStringUtils.GTASK_JSON_NOTES, getNotes()); } js.put(GTaskStringUtils.GTASK_JSON_ENTITY_DELTA, entity); - - // parent_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 + js.put(GTaskStringUtils.GTASK_JSON_DEST_PARENT_TYPE, GTaskStringUtils.GTASK_JSON_TYPE_GROUP); js.put(GTaskStringUtils.GTASK_JSON_LIST_ID, mParent.getGid()); - - // prior_sibling_id if (mPriorSibling != null) { js.put(GTaskStringUtils.GTASK_JSON_PRIOR_SIBLING_ID, mPriorSibling.getGid()); } - } catch (JSONException e) { Log.e(TAG, e.toString()); e.printStackTrace(); @@ -103,21 +86,14 @@ public class Task extends Node { return js; } + // 生成更新任务的动作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 + js.put(GTaskStringUtils.GTASK_JSON_ACTION_TYPE, GTaskStringUtils.GTASK_JSON_ACTION_TYPE_UPDATE); js.put(GTaskStringUtils.GTASK_JSON_ACTION_ID, actionId); - - // id js.put(GTaskStringUtils.GTASK_JSON_ID, getGid()); - - // entity_delta JSONObject entity = new JSONObject(); entity.put(GTaskStringUtils.GTASK_JSON_NAME, getName()); if (getNotes() != null) { @@ -125,7 +101,6 @@ public class Task extends Node { } entity.put(GTaskStringUtils.GTASK_JSON_DELETED, getDeleted()); js.put(GTaskStringUtils.GTASK_JSON_ENTITY_DELTA, entity); - } catch (JSONException e) { Log.e(TAG, e.toString()); e.printStackTrace(); @@ -135,35 +110,25 @@ public class Task extends Node { return js; } + // 根据远程JSON对象设置任务内容 public void setContentByRemoteJSON(JSONObject js) { if (js != null) { try { - // 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,9 +140,9 @@ public class Task extends Node { } } + // 根据本地JSON对象设置任务内容 public void setContentByLocalJSON(JSONObject js) { - if (js == null || !js.has(GTaskStringUtils.META_HEAD_NOTE) - || !js.has(GTaskStringUtils.META_HEAD_DATA)) { + if (js == null || !js.has(GTaskStringUtils.META_HEAD_NOTE) || !js.has(GTaskStringUtils.META_HEAD_DATA)) { Log.w(TAG, "setContentByLocalJSON: nothing is avaiable"); } @@ -197,18 +162,17 @@ public class Task extends Node { break; } } - } catch (JSONException e) { Log.e(TAG, e.toString()); e.printStackTrace(); } } + // 从任务内容生成本地JSON对象 public JSONObject getLocalJSONFromContent() { String name = getName(); try { if (mMetaInfo == null) { - // new task created from web if (name == null) { Log.w(TAG, "the note seems to be an empty one"); return null; @@ -225,7 +189,6 @@ public class Task extends Node { 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); @@ -247,6 +210,7 @@ public class Task extends Node { } } + // 设置任务的元数据信息 public void setMetaInfo(MetaData metaData) { if (metaData != null && metaData.getNotes() != null) { try { @@ -258,6 +222,7 @@ public class Task extends Node { } } + // 根据本地数据库游标判断同步操作类型 public int getSyncAction(Cursor c) { try { JSONObject noteInfo = null; @@ -275,29 +240,23 @@ public class Task extends Node { return SYNC_ACTION_UPDATE_LOCAL; } - // validate the note id now if (c.getLong(SqlNote.ID_COLUMN) != noteInfo.getLong(NoteColumns.ID)) { Log.w(TAG, "note id doesn't match"); return SYNC_ACTION_UPDATE_LOCAL; } 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 if (!c.getString(SqlNote.GTASK_ID_COLUMN).equals(getGid())) { Log.e(TAG, "gtask id doesn't match"); return SYNC_ACTION_ERROR; } if (c.getLong(SqlNote.SYNC_ID_COLUMN) == getLastModified()) { - // local modification only return SYNC_ACTION_UPDATE_REMOTE; } else { return SYNC_ACTION_UPDATE_CONFLICT; @@ -311,41 +270,49 @@ public class Task extends Node { return SYNC_ACTION_ERROR; } + // 判断任务是否值得保存 public boolean isWorthSaving() { return mMetaInfo != null || (getName() != null && getName().trim().length() > 0) || (getNotes() != null && getNotes().trim().length() > 0); } + // 设置任务是否已完成 public void setCompleted(boolean completed) { this.mCompleted = completed; } + // 设置任务的备注信息 public void setNotes(String notes) { this.mNotes = notes; } + // 设置任务的前一个兄弟任务 public void setPriorSibling(Task priorSibling) { this.mPriorSibling = priorSibling; } + // 设置任务的父任务列表 public void setParent(TaskList parent) { this.mParent = parent; } + // 获取任务是否已完成 public boolean getCompleted() { return this.mCompleted; } + // 获取任务的备注信息 public String getNotes() { return this.mNotes; } + // 获取任务的前一个兄弟任务 public Task getPriorSibling() { return this.mPriorSibling; } + // 获取任务的父任务列表 public TaskList getParent() { return this.mParent; } - -} +} \ No newline at end of file diff --git a/src/Notes-master/src/net/micode/notes/gtask/data/TaskList.java b/src/Notes-master/src/net/micode/notes/gtask/data/TaskList.java index 4ea21c5..e123366 100644 --- a/src/Notes-master/src/net/micode/notes/gtask/data/TaskList.java +++ b/src/Notes-master/src/net/micode/notes/gtask/data/TaskList.java @@ -13,50 +13,52 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - + package net.micode.notes.gtask.data; - + import android.database.Cursor; import android.util.Log; - + import net.micode.notes.data.Notes; import net.micode.notes.data.Notes.NoteColumns; import net.micode.notes.gtask.exception.ActionFailureException; import net.micode.notes.tool.GTaskStringUtils; - + import org.json.JSONException; import org.json.JSONObject; - + import java.util.ArrayList; - - + +// 任务列表类,继承自Node类,用于表示和操作任务列表 public class TaskList extends Node { private static final String TAG = TaskList.class.getSimpleName(); - + private int mIndex; - + private ArrayList mChildren; - + + // 构造函数,初始化任务列表 public TaskList() { super(); mChildren = new ArrayList(); mIndex = 1; } - + + // 生成创建任务列表的操作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 js.put(GTaskStringUtils.GTASK_JSON_ACTION_ID, actionId); - + // index js.put(GTaskStringUtils.GTASK_JSON_INDEX, mIndex); - + // entity_delta JSONObject entity = new JSONObject(); entity.put(GTaskStringUtils.GTASK_JSON_NAME, getName()); @@ -64,45 +66,47 @@ public class TaskList extends Node { entity.put(GTaskStringUtils.GTASK_JSON_ENTITY_TYPE, GTaskStringUtils.GTASK_JSON_TYPE_GROUP); js.put(GTaskStringUtils.GTASK_JSON_ENTITY_DELTA, entity); - + } catch (JSONException e) { Log.e(TAG, e.toString()); e.printStackTrace(); throw new ActionFailureException("fail to generate tasklist-create jsonobject"); } - + return js; } - + + // 生成更新任务列表的操作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 js.put(GTaskStringUtils.GTASK_JSON_ACTION_ID, actionId); - + // 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_DELETED, getDeleted()); js.put(GTaskStringUtils.GTASK_JSON_ENTITY_DELTA, entity); - + } catch (JSONException e) { Log.e(TAG, e.toString()); e.printStackTrace(); throw new ActionFailureException("fail to generate tasklist-update jsonobject"); } - + return js; } - + + // 根据远程JSON对象设置任务列表的内容 public void setContentByRemoteJSON(JSONObject js) { if (js != null) { try { @@ -110,17 +114,17 @@ public class TaskList extends Node { 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)); } - + } catch (JSONException e) { Log.e(TAG, e.toString()); e.printStackTrace(); @@ -128,15 +132,16 @@ public class TaskList extends Node { } } } - + + // 根据本地JSON对象设置任务列表的内容 public void setContentByLocalJSON(JSONObject js) { if (js == null || !js.has(GTaskStringUtils.META_HEAD_NOTE)) { Log.w(TAG, "setContentByLocalJSON: nothing is avaiable"); } - + try { JSONObject folder = js.getJSONObject(GTaskStringUtils.META_HEAD_NOTE); - + if (folder.getInt(NoteColumns.TYPE) == Notes.TYPE_FOLDER) { String name = folder.getString(NoteColumns.SNIPPET); setName(GTaskStringUtils.MIUI_FOLDER_PREFFIX + name); @@ -156,12 +161,13 @@ public class TaskList extends Node { e.printStackTrace(); } } - + + // 根据任务列表的内容生成本地JSON对象 public JSONObject getLocalJSONFromContent() { try { JSONObject js = new JSONObject(); JSONObject folder = new JSONObject(); - + String folderName = getName(); if (getName().startsWith(GTaskStringUtils.MIUI_FOLDER_PREFFIX)) folderName = folderName.substring(GTaskStringUtils.MIUI_FOLDER_PREFFIX.length(), @@ -172,9 +178,9 @@ public class TaskList extends Node { folder.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM); else folder.put(NoteColumns.TYPE, Notes.TYPE_FOLDER); - + js.put(GTaskStringUtils.META_HEAD_NOTE, folder); - + return js; } catch (JSONException e) { Log.e(TAG, e.toString()); @@ -182,7 +188,8 @@ public class TaskList extends Node { return null; } } - + + // 根据游标中的数据返回同步操作类型 public int getSyncAction(Cursor c) { try { if (c.getInt(SqlNote.LOCAL_MODIFIED_COLUMN) == 0) { @@ -212,14 +219,16 @@ public class TaskList extends Node { Log.e(TAG, e.toString()); e.printStackTrace(); } - + return SYNC_ACTION_ERROR; } - + + // 获取子任务的数量 public int getChildTaskCount() { return mChildren.size(); } - + + // 添加子任务到任务列表 public boolean addChildTask(Task task) { boolean ret = false; if (task != null && !mChildren.contains(task)) { @@ -233,17 +242,18 @@ public class TaskList extends Node { } return ret; } - + + // 在指定位置添加子任务到任务列表 public boolean addChildTask(Task task, int index) { if (index < 0 || index > mChildren.size()) { Log.e(TAG, "add child task: invalid index"); return false; } - + int pos = mChildren.indexOf(task); if (task != null && pos == -1) { mChildren.add(index, task); - + // update the task list Task preTask = null; Task afterTask = null; @@ -251,26 +261,27 @@ public class TaskList extends Node { preTask = mChildren.get(index - 1); if (index != mChildren.size() - 1) afterTask = mChildren.get(index + 1); - + task.setPriorSibling(preTask); if (afterTask != null) afterTask.setPriorSibling(task); } - + return true; } - + + // 从任务列表中移除指定的子任务 public boolean removeChildTask(Task task) { boolean ret = false; int index = mChildren.indexOf(task); if (index != -1) { ret = mChildren.remove(task); - + if (ret) { // reset prior sibling and parent task.setPriorSibling(null); task.setParent(null); - + // update the task list if (index != mChildren.size()) { mChildren.get(index).setPriorSibling( @@ -280,25 +291,27 @@ public class TaskList extends Node { } return ret; } - + + // 移动任务到指定位置 public boolean moveChildTask(Task task, int index) { - + if (index < 0 || index >= mChildren.size()) { Log.e(TAG, "move child task: invalid index"); return false; } - + int pos = mChildren.indexOf(task); if (pos == -1) { Log.e(TAG, "move child task: the task should in the list"); return false; } - + if (pos == index) return true; return (removeChildTask(task) && addChildTask(task, index)); } - + + // 根据gid查找子任务 public Task findChildTaskByGid(String gid) { for (int i = 0; i < mChildren.size(); i++) { Task t = mChildren.get(i); @@ -308,11 +321,13 @@ public class TaskList extends Node { } return null; } - + + // 获取指定子任务的索引 public int getChildTaskIndex(Task task) { return mChildren.indexOf(task); } - + + // 根据索引获取子任务 public Task getChildTaskByIndex(int index) { if (index < 0 || index >= mChildren.size()) { Log.e(TAG, "getTaskByIndex: invalid index"); @@ -320,7 +335,8 @@ public class TaskList extends Node { } return mChildren.get(index); } - + + // 根据gid获取子任务 public Task getChilTaskByGid(String gid) { for (Task task : mChildren) { if (task.getGid().equals(gid)) @@ -328,16 +344,19 @@ public class TaskList extends Node { } return null; } - + + // 获取所有子任务的列表 public ArrayList getChildTaskList() { return this.mChildren; } - + + // 设置任务列表的索引 public void setIndex(int index) { this.mIndex = index; } - + + // 获取任务列表的索引 public int getIndex() { return this.mIndex; } -} +} \ No newline at end of file